运算符和函数

表达式可以使用多种运算和函数。

算术运算符

运算符 函数
+ 加
- 减
* 乘
/ 除

逻辑运算符

逻辑运算符可用于编写条件表达式。请参见条件表达式。

运算符 函数
== 等于
!= 不等于
> 大于
< 小于
>= 大于或等于
<= 小于或等于
&& 且
|| 或

三角函数

三角函数接受标量表达式(即,计算为标量的表达式)作为输入,返回标量。输入标量表达式可以与空间或时间相关。如果输入取决于空间或时间,则返回的物理量也取决于空间或时间。

在下表中,x 和 y 表示输入标量表达式。输入标量表达式可以是常数值(例如 cos(3.14)、sin(6.28)),也可以是引用其他标量的表达式(例如 sin(2*${omega}*${Time}),其中 omega 为标量参数,Time 为时间场函数)。

运算符 返回值
acos(x) x 的反余弦
asin(x) x 的反正弦
atan(x) x 的反正切
atan2(y,x) y/x 的反正切
cos(x) x 的余弦
cosh(x) x 的双曲余弦
sin(x) x 的正弦
sinh(x) x 的双曲正弦
tan(x) x 的正切
tanh(x) x 的双曲正切

矢量函数

矢量函数接受矢量表达式(即,计算为矢量的表达式)作为输入,返回标量或矢量。输入矢量表达式可以与空间或时间相关。如果输入取决于空间或时间,则返回的物理量也取决于空间或时间。

在下表中,u 和 v 表示输入矢量表达式。输入标量表达式可以是常数矢量(例如 u = [0.5, 1, 2]),也可以是引用其他矢量的表达式(例如 u = ${coefficient}*$${Velocity},其中 coefficient 为标量参数,Velocity 为矢量场函数)。

应用点或交叉矢量函数时,提供相对于同一笛卡尔坐标系的两个矢量。

在矢量显示器中绘制矢量场时,矢量始终被视为是在基准笛卡尔坐标系中定义的。

运算符 返回值
mag(u) 矢量 u 的幅值,返回为标量
mag2(u) 矢量 u 幅值的平方,返回为标量
unit(u, x) 单位矢量,其中 x 为定义幅值容差的标量。

当某个矢量的幅值小于指定的容差时,显示中会省略该矢量。

dot(u,v) 矢量 u 和 v 的标量积(请参见 Eqn. (5338)),返回为标量
cross(u,v) U 和 v 的叉积(请参见 Eqn. (5340)),返回为矢量
curl(u) 矢量 u 的旋度(请参见 Eqn. (5346)),返回为矢量
div(u) 矢量 u 的发散(请参见 Eqn. (5345)),返回为标量

对称张量函数

张量函数接受张量作为输入,返回标量或矢量。在下表中,场函数 A 表示 3x3 对称张量 A :

运算符 返回值
$$$A.eigValue(<i>),

eigValue($$$A, <i>)

A 的特征值 λi ,其中 i=0, 1, 2(请参见 Eqn. (5355))。返回为标量。
$$$A.eigVector(<i>),

eigVector($$$A, <i>)

A 的特征矢量 vi ,其中 i=0, 1, 2(请参见 Eqn. (5355))。返回为矢量。
$$$A.trace(),

trace($$$A)

A 的迹(请参见 Eqn. (5361))。返回为标量。
$$$A.norm(“infinity”),

norm($$$A, “infinity”)

A 的无穷范数(请参见 Eqn. (5364))。返回为标量。
$$$A.norm(1),

norm($$$A, 1)

A 的 1-范数(请参见 Eqn. (5365))。返回为标量。
$$$A.norm(2),

norm($$$A, 2)

A 的 2-范数(请参见 Eqn. (5366))。返回为标量。
$$$A.norm(“frobenius”),

norm($$$A, “frobenius”)

A 的弗罗贝尼乌斯范数(请参见 Eqn. (5367))。返回为标量。
$$$A.mag(),

mag($$$A)

A 的幅值,等于弗罗贝尼乌斯范数 ‖ A ‖ F (请参见 Eqn. (5367))。返回为标量。
$$$A.mag2(),

mag2($$$A)

A 的幅值平方:

‖ A ‖ F 2 (请参见 Eqn. (5367))。返回为标量。

$$$A.dot($$$B), 
						
dot($$$A, $$$B)
张量 A 和 B 的双点(双内)积(请参见 Eqn. (5353))。返回为标量。
$$$A.dotVector($$v),
$$v.dotVector($$$A),
dotVector($$$A, $$v),
dotVector($$v, $$$A)
张量 A 和矢量 v 的矩阵积(请参见 Eqn. (5350))。返回为矢量。

其他函数

在下表中,x 和 y 表示输入标量表达式。

运算符 函数
ceil(x) 不小于 x 的最小整数,作为一个实数
exp(x) 指数函数,e 的 x 次幂
abs(x) x 的绝对值
floor(x) 不大于 x 的最大整数,作为一个实数
log(x) 底数为 e 的 x 对数,自然对数
log10(x) 底数为 10 的 x 对数
sqrt(x) x 的平方根
pow(x,y) x 的 y 次幂
fmod(x,y) x 对 y 的模,x/y 的浮点余数
mod(x,y) 等同于 fmod($x,$y)
min(x,y) x 和 y 中的最小值
max(x,y) x 和 y 中的最大值
clamp(x, xMin, xMax) 等于 min($xMax, max($x, $xMin))
grad(phi) 标量 phi 的梯度,返回为矢量(请参见 Eqn. (5343))

使用此方法计算得出的值不一定与从求解器返回的梯度相同。这是因为计算梯度时使用了不同的方法。在求解器中,使用的是两遍高斯算法,而此处提供的函数使用的是最小二乘法。此外,求解器中有关边界值的信息比此函数的可用信息多。

条件表达式

三元运算符 "?:" 定义条件运算 if-then-else,与 C 语言类似。例如:

(a > b) ? a : b

相当于

z = max(a, b)

也可以使用圆括号来嵌套条件表达式。

通过嵌套条件表达式,可以按不同的时间间隔为用户场函数指定不同的值:

($Time <= t_1) ? Value 1 : 
( 
($Time > t_1 && $Time <= t_2) ? Value 2 : Value 3
)
)

例如,考虑这样一种情况:值以 5 秒的间隔在 125 和 0 之间交替变化,15 秒后保持为 0:

($Time <= 5) ? 125 : 
( 
($Time > 5 && $Time <= 10) ? 0 : 
( 
($Time > 10 && $Time <= 15) ? 125 : 0
)
)

三元运算符 "?:" 要求所有场在部件上可用(如边界或体积)。如果某个场在部件上不可用,则涉及 "?:" 运算符的整个用户自定义表达式视为无效,Simcenter STAR-CCM+ 将无法填充场函数。在这种情况下,将在场景中看到灰色,而不是预期结果。

替代值函数

如果部件上的标量或矢量表达式的值不可用或不可计算,可以为该表达式提供一个替代值。

通常,Simcenter STAR-CCM+ 要求表达式中的所有项都存在,表达式才可计算。例如,在以下表达式中:

$Pressure * $Volume

如果某个部件的 Pressure、Volume 或两者不存在,则此表达式在该部件上不可计算。

要提供替代值,可使用 alternateValue() 运算符:

alternateValue($Pressure, 0) * $Volume

在此示例中,如果 Pressure 不可用,则 Simcenter STAR-CCM+ 会用零替代 Pressure。

替代值运算符不限于常数,它也可用于其他表达式。该运算符的这种用法的语法为 alternateValue(<标量/矢量表达式 1>, <标量/矢量表达式 2>),例如:

alternateValue($Pressure1, $Pressure2) * $Volume

在此示例中,如果 Pressure1 和 Pressure2 都不可计算,则 alternateValue 表达式不可计算。

涉及 alternateValue 表达式中的报告的典型工作流程可能是用户场函数,定义如下:

alternateValue(${Sum Case_1} * mag($$Position), 50.0)

其中 Sum Case_1 是报告。它还可以在标量物理量或矢量物理量中用作空间不变量表达式:

alternateValue(${Sum Case_1}, 10.0)
注不建议也不支持使用初始变量为空间不变量且替代变量为空间变量的替代值表达式。

从部件的插值方向

interpolateDirection 函数基于部件曲线、表面或指定的过滤器生成方向矢量场。对材料的各向异性行为进行建模时,拥有方向矢量场会很有帮助。

该函数返回方向矢量场,从输入曲线或表面插值到每个网格单元。此函数使用部件曲线或表面,语法为:
interpolateDirection(@Part("<partname>"), @Representation("<representation>"), @CoordinateSystem("<coordinatesystem>"), <direction>) 
或者使用过滤器:
interpolateDirection(@Filter("<filter>"), @Representation("<representation>"), @CoordinateSystem("<coordinatesystem>"), <direction>)

其中:

  • <coordinatesystem> 是对象树中工具 > 坐标系节点中坐标系的名称。根据此坐标系返回方向矢量。如果不指定坐标系,该函数将使用默认的基准坐标系。
  • <partname> 是表面或曲线。对于表面,使用该部分的法向给定方向场。对于部件曲线,方向场是使用线段方向确定的。如果使用部件的表面或部件曲线名称,则语法为 <partname.surface/curve name>。
  • <representation> 为用于抽取部件的表示。它在对象树的表示节点中设置。
  • <direction> 根据输入表面的法向方向或输入线的线段方向来定义矢量的方向。使用 FORWARD 可遵循方向矢量,或使用 BACKWARD 可反转方向矢量。
  • <filter> 是在模拟树结构中自动化 > 过滤器节点下定义的过滤器。过滤器可用于定义任何兼容对象,包括多条部件曲线或多个表面。
可以使用 :: 分隔符指定多个部件。例如:
interpolateDirection(@Part("<partname1>::<partname2>::<partname3>"), @Representation("<representation>"), @CoordinateSystem("<coordinatesystem>"),FORWARD) 
以下为使用此函数的示例。左图是使用部件曲线输入的切向场函数。中图显示将表面输入用于给定几何的径向场函数。右图显示将过滤器输入用于给定几何的径向场函数。

insidePart 场函数

insidePart 函数提供值为 0 或 1 的场,标明点位于几何部件所描述的空间位置外(值为 0)或空间位置内(值为 1)。例如,该函数可用于定义网格部分上的初始条件。

insidePart 函数的值始终会返回 0 或 1;0 表示点在指定的部件外,而 1 表示点在指定的部件内。insidePart 函数可接受以下两种参数:@GeometryPart 和 @Filter。

insidePart 函数的语法是:
insidePart(selectorParam, tolerance)
其中 selectorParam 可以是 @GeometryPart("<geometrypart>") 或 @Filter("<filtername>"),容差是可选参数。容差参数可扩展目标部件内考虑的边界。即,如果点在部件的容差距离范围内,函数返回 1。
按名称标明相关部件的语法为:
insidePart(@GeometryPart("<geometrypart>"))

其中:

  • <geometrypart> 是模拟树中几何 > 部件节点内的部件名称。
如果部件属于复合部件,则必须在 @GeometryPart 参数中包含垂直条,用来区分各部件名称。例如,下图显示属于复合部件的圆柱部件:

按名称标明圆柱部件的语法为:
insidePart(@GeometryPart("Composite|Cylinder"))
使用过滤器标明相关部件的语法为:
insidePart(@Filter("<filter>"))

其中:

  • <filter> 是模拟树结构中自动化 > 过滤器节点中过滤器的名称。可以创建带有一系列条件的过滤器,然后使用 insidePart 函数和 @Filter 参数来查找相关的部件。
注
  • 如果点位于过滤器返回的任意部件中,则函数会返回值 1。
  • 过滤器返回的其他对象(非几何部件)会被忽略。
  • 根描述(几何表示)始终用于参考部件。
  • 对于内部/外部检查的精确计算,参考部件必须为闭合和流行。不满足该要求的部件会被忽略。
下图显示了该函数在表达式中的使用示例。块上的蓝色(值 0)标明网格在球体外的部分,而红色(值 1)标明网格在球体内的部分。

DistanceToPart 和 DistanceToSurface 场函数

distanceToPart 和 distanceToSurface 函数提供值字段,用于指示到给定部件或部件表面的距离。

distanceToPart 函数返回到部件或部件集的距离。提供给函数的部件必须是闭合的流形部件。

distanceToPart 函数的语法是:
distanceToPart(selectorParam, maxSearchDistance)
其中:
  • selectorParam 可以是 @GeometryPart("<partname>"),其中 partname 是几何中部件的名称;或者是 @Filter("<filtername>"),其中 filtername 是自动化 > 过滤器节点中过滤器的名称。
  • maxSearchDistance(可选)对从目标表面测量的最大距离施加一个限制。当您对远离目标表面的距离不感兴趣时,使用此参数可提高性能。
下图显示了 distanceToPart 表达式与 @Filter 参数一同使用的示例,其中过滤器返回三个部件(圆柱体、圆锥体和球体)。标识到部件距离的语法为:
distanceToPart(@Filter("Parts"))


distanceToSurface 函数返回到部件表面的距离。此函数可用于包含非闭合或流形的部件。

distanceToSurface 的语法为:
distanceToSurface(selectorParam, maxSearchDistance)
其中:
  • selectorParam 可以是以下项之一:
    • @PartSurface("<partsurfacename>"),其中 partsurfacename 是部件表面(包括任何复合部件)的完整路径
    • @GeometryPart("<partname>"),其中 partname 是几何树中部件的名称。distanceToSurface 自动将部件分解为其构成部件表面。
    • @Filter("<filtername>"),其中距离表达式计算为到过滤器返回的任何表面的最小距离。
  • maxSearchDistance(可选)对从目标表面测量的最大距离施加一个限制。当您对远离目标表面的距离不感兴趣时,使用此参数可提高性能。
distanceToSurface 表达式与 distanceToPart 表达式不同,表现在两方面:
  • 它作用于部件表面,而不是部件。
  • 它计算部件内外

distanceToSurface 场函数始终使用几何的根描述,因此不考虑任何压印表面(仅影响以后的描述)。

下图显示了 distanceToPart 表达式与名为表面的 @Filter 参数一起使用的示例,其返回圆柱体和圆锥体的侧面。标识到表面距离的语法为:
distanceToSurface(@Filter("Surfaces"))