Math Expressions¶
The math expression parser allows to use simple mathematical expressions in combination with if statements inside of the xml files of openCFS. For this user-defined variables can be used
<domain>
<variableList>
<var name="A" value="1e6"/>
<var name="B" value="1500"/>
</variableList>
</domain>
The registered variables get defined in the global scope and can be used
in any expression, which gets parsed by the mathParser. Note however, that
for establishing user-defined variables computed variables such as t
can not be used.
Using user-defined variables for defining an additional user-defined variable however, works.
<domain>
<variableList>
<var name="C" value=A*B/>
</variableList>
</domain>
In addition, the following pre-defined variables can be found in openCFS:
t
- Current time value, only available for transient simulationsdt
- Time step size, only available for transient simulationsf
- Current frequency value, only available for harmonic simulationsstep
- Current time/frequency step, available for harmonic and transient simulationsx,y,z
- Coordinatesr,phi,z
- Cylindrical coordinates
Defining loads¶
Math expressions can be used to define a synthetic load. For the following example a transient acoustic simulation (Singlefield -> AcousticPDE) is considered. The load is impressed onto a certain node, and defined as a sinus function
<bcsAndLoads>
<pressure name="excite" value="2*sin(2*pi*100*t)"/>
</bcsAndLoads>
In this example a sinus load with 100 Hz and an amplitude of 2 is defined. t denotes the control variable. A different possibility for defining such a synthetic load is by using one of the custom functions of openCFS:
spike(duration, timeval)
- Generates a short spike signal of a given duration starting from 0.fadeIn(duration, mode, timeval)
- This function is used to perform a fadein of an excitation. The returned value is between zero and one and has to be used as envelope of the excitation signal (mode: see detailed explanation below)sinBurst(freq, nperiods, nfadein, nfadeout, timeval)
- Creates data for a sine burst signal. A sine burst signal denotes a sine that will be active during a certain amount of time until it will be deactivated. Additionally, a fade-in/out can be applied, according to the sin^2 method of the fadeIn to reduce the higher harmonics of the signal.squareBurst(freq, nperiods, bipolar, pwidth, rtime, timeval)
- Create data for a square burst signal, which can either be unipolar or bipolar.gauss(mue, sigma, normval, timeval)
- Generates a Gaussian curve, which is either normalized to a maximum value of 1 or to having an area of 1.locCoord2D(coordsysid, component, x, y)
- This function returns for a point in a 2D cartesian coordinate system one component of a local coordinate system, as defined in the < coordSysList >-section of the < domain >-element (for details, see 4.4). This can be used,e.g. to define loads / dirichlet boundary conditions depending on polar / cylindrical coordinates.locCoord3D(coordsysid, component, x, y,z)
- Similar to the function locCoord2D, this method can be used for local 3-dimensional coordinate systems (e.g. cylindrical or spherical).sampled1D(filename, interpolation, sampleval)
- This function can be used to read in and interpolate values of a 2-column formatted text file. This can be used e.g. to prescribe space/time/frequency-dependent boundary or load conditions.if(condition, trueval, elseval)
- if ... then ... else ...sin(2 * pi * frequency * timeStep)
cos(2 * pi * frequency * timeStep)
tan(2 * pi * frequency * timeStep)
asin(2 * pi * frequency * timeStep)
acos(2 * pi * frequency * timeStep)
atan(2 * pi * frequency * timeStep)
sinh(2 * pi * frequency * timeStep)
cosh(2 * pi * frequency * timeStep)
tanh(2 * pi * frequency * timeStep)
asinh(2 * pi * frequency * timeStep)
acosh(2 * pi * frequency * timeStep)
atanh(2 * pi * frequency * timeStep)
log2( X )
- logarithm to the base 2log10( X )
- logarithm to the base 10log( X )
- logarithm to the base 10ln( n )
- logarithm to base e (2.71828...)exp( X )
- e raised to the power of xsqrt( X )
- square root of a valuesign( X )
- sign function -1 if x < 0; 1 if x > 0rint( X )
- round to nearest integerabs( X )
- absolute valuemin( X )
- min of all argumentsmax( X )
- max of all argumentssum( X )
- sum of all argumentsavg( X )
- mean value of all arguemnts
Additionally, the following built-in operators and constants are available:
=
- Assigmentand
- logical andor
- logical orxor
- logical xor<= or le *
- less or equal>= or ge *
- greater or equal!=
- not equal==
- equal> or gt *
- greater than< ot lt *
- less then+
- addition-
- subtraction*
- multiplication/
- division^
- raise to the power ofpi or _pi
- 3.1415926.._e
- Eulerian number e = 2.7182818..
Defining fields¶
Math expressions can also be used for defining e.g flow, or temperature fields.
<flowList>
<flow name="backward_Z">
<comp dof="x" value="0"/>
<comp dof="y" value="120000/60*2*pi*z"/>
<comp dof="z" value="-120000/60*2*pi*y"/>
</flow>
</flowList>
This can also be used for defining blending functions, which e.g. necessary for the usage of non-conforming interfaces in combination with aeroacoustic source terms. For more details look into Singlefield -> AcousticPDE
Detailed explanations and examples¶
Following we will show two different examples for such custom functions:
Spike¶
spike(duration, timeval)
- duration -> Duration of spike in s.
- timeval -> Time parameter at which function gets evaluated. Usually the time variable t is used.
Example for spike signal: spike(1,t-2)
fadeIn¶
fadeIn(duration, mode, timeval)
- duration -> The amount of time for which the fade in operation is performed in s.
- mode -> Three different implementation exist for the envelope of the fade in process:
mode = 1 (using a sin^2 formulation) mode = 2 (using an exponential formulation exp) mode = 3 (using a squared exponential formulation exp^2)
- timeval -> Time parameter at which function gets evaluated. Usually the time variable t is used.
Comparison of 3 fadeIn signals: sin 2 -based (red), exp-based (green) and exp 2 -based (blue):
sinBurst¶
sinBurst(freq, nperiods, nfadein, nfadeout, timeval)
- freq -> Frequency of the sine pulse.
- nperiods -> Total number of periods of the pulse.
- nfadein -> Specifies the number of periods that will be used for the transient process. This will realize a kind of ”soft” transient process that will reduce the higher harmonics of the resulting signal.
- nfadeout -> Specifies the number of periods that will be used for the decay process. This will realize a kind of ”soft” decay process that will reduce the higher harmonics of the resulting signal.
- timeval -> Time parameter at which function gets evaluated. Usually the time variable t is used.
Sine burst without fade-In: sinBurst(1,6,0,0,t):
Sine burst with 2 periods of fade-in/out: sinBurst(1,6,2,2,t)
squareBurst¶
squareBurst(freq, nperdios, bipolar, pwidth, rtime, timeval)
- freq -> Frequency of the rectangular signal.
- nperiods -> Total number of periods of the pulse.
- bipolar -> Switch for generating bipolar / unipolar signal; 0: unipolar signal (0 ≤ y ≤ 1); 1: bipolar signal (−1 ≤ y ≤ 1)
- pwidth -> Pulse width of the signal in percent (0 ≤ pw ≤ 100).
- rtime -> Defines the rise time of the square burst. It denotes the time in seconds that the pulse will take to change from low to high level.
- timeval -> Time parameter at which function gets evaluated. Usually the time variable t is used.
gauss¶
gauss(mue, sigma, normval, timeval)
- mue -> Mean value of Gauss curve.
- sigma -> Variance of Gauss curve.
- normval -> Type of normalization: 0: Maximum of curve gets normalized to 1; 1: Area of curve gets normalized to 1
- timeval -> Time parameter at which function gets evaluated. Usually the time variable t is used.
locCoord2¶
locCoord2D(coordsysid, component, x, y)
- coordsysid Id -> string of the referred coordinate system.
- component -> Coordinate component of the local coordinate system, which can be either 1 or 2 in 2D. For a polar coordinate system, 1=r-direction and 2=phi-direction.
- x -> x-coordinate of the Cartesian point. For < load > and < dirichletInhom > boundary conditions, it can be literally replaced by x.
- y -> y-coordinate of the Cartesian point. For < load > and < dirichletInhom > boundary conditions, it can be literally replaced by y.
In the following example, a cylindrical coordinate system with id mid is defined. An inhomogeneous Dirichlet boundary condition for an electrostatic analysis is applied, with a value varying with the angle phi (second component in a polar coordinate system).
<domain>
<coordSysList>
<polar id="mid">
<origin x="0" y="0"/>
<rAxis x="1" y="0"/>
</polar>
</coordSysList>
</domain>
....
<potential name=".." value="locCoord(’mid’,2,x,y)"/>
locCoord3¶
locCoord3D(coordsysid, component, x, y,z)
- coordsysid Id -> string of the referred coordinate system.
- component -> Coordinate component of the local coordinate system, which can be either 1, 2 or in 3D. For a cylindrical coordinate system, 1=r-direction, 2=phi-direction and 3=z-direction.
- x -> x-coordinate of the Cartesian point. For < load > and < dirichletInhom > boundary conditions, it can be literally replaced by x.
- y -> y-coordinate of the Cartesian point. For < load > and < dirichletInhom > boundary conditions, it can be literally replaced by y.
- z -> z-coordinate of the Cartesian point. For < load > and < dirichletInhom > boundary conditions, it can be literally replaced by z.
sample1D¶
sampled1D(filename, interpolation, sampleval)
- filename -> Name of the file to be read (any path in the filename is taken relative to the location of the .xml-file). The file must consist of exactly 2 columns, which are separated by any whitespace (space, tab).
-
interpolation -> There are 3 different methods for interpolating the sampled values:
0: Nearest neighbor is taken (i.e. no interpolation at all) 1: Linear interpolation 2: Cubic spline interpolation
-
sampleval -> Denotes the sample value (value of the 1st column ), for which a value in the 2nd column is seeked. In most cases either the current time t or a coordinate component (x,y, z) may be used
We can subscribe boundary conditions with values read in from sample files. The notation is as follows:
<bcsAndLoads>
<potential name="transducer" value="sample1D(’x_amplitude.dat’,x,2)" phase="sample1D(’x_phase.dat’,x,2)"/>
</bcsAndLoads>
Sample data (2 nd column) is read in from the files x amplitude.dat and x phase.dat depending on the current x-coordinate and gets interpolated using cubic spline interpolation. Please note the type of quotes used!!!!
if statement:¶
<bcsAndLoads>
<pressure name="excite" value="(t lt 1)? (cos(2*pi*(t-0.5))+1)*sin(2*pi*t): 0")"/>
</bcsAndLoads>
Furthermore, it is possible to superpose multiple different custom functions, with e.g. if statements. In the following example we superpose a time depending if statement with a spatial if statement
<bcsAndLoads>
<pressure name="exciteSurface" value="((t lt 1)? (cos(2*pi*(t-0.5))+1)*sin(2*pi*t): 0"))*((x lt 1)? (1 : 0))"/>
</bcsAndLoads>
Hint: With multiple if statements it is especially important to look after the positioning of braces.