插值和区分表值
使用表达式可以对导入的表值进行插值和区分来构建标量或矢量场。
注 | 从表达式访问表数据时,不要在列名称中包含任何单位指定。 |
将列值作为另一列的函数进行插值和区分
表通常包含列值,这些列值是另一列值的函数。使用 interpolateTable
表达式,可以将相关值作为独立值的函数进行插值来构建连续场。该表达式返回使用附加表达式定义的值处的插值字段。
differentiateTable
表达式将表的因数值作为独立值的函数进行插值,然后返回使用其他表达式定义的值处的插值场的导数。
如果表包含矢量的每个分量的值列,则可以同时对所有分量列进行插值和区分来构建矢量场。
一般语法为:
- 对于输出标量场:
interpolateTable(@Table("<tablename>"), "<x-column>", {LINEAR | STEP | SPLINE | CUBIC_AKIMA}, "<phi-column>", <scalar_expression>)
differentiateTable(@Table("<tablename>"), "<x-column>", {LINEAR | SPLINE | CUBIC_AKIMA}, "<phi-column>", <scalar_expression>)
interpolateTable
表达式通过将 <phi-column> 中的值作为 <x-column> 中值的函数进行插值来生成标量场,并在由 <scalar_expression> 指定的值处计算标量场。differentiateTable
表达式通过区分插值标量场生成标量场。返回值是由 <scalar_expression> 指定的值处的段的斜率。如果此值与一个表值完全对应,则会返回相邻段斜率的平均值。 - 同样,对于输出矢量场:
interpolateTable(@Table("<tablename>"), "<x-column>", {LINEAR | STEP}, "<phi_0-column>", "<phi_1-column>", "<phi_2-column>", <scalar_expression>)
differentiateTable(@Table("<tablename>"), "<x-column>", "<phi_0-column>", "<phi_1-column>", "<phi_2-column>", <scalar_expression>)
表达式返回矢量。
其中:
- <tablename> 是 节点下的表的名称。
- <x-column> 是表列的名称,用作供插值的自变量。在上述示例中,<x-column> 是 Time。
- <scalar_expression> 是给出 x 变量的表达式。在上述示例中,<scalar_expression> 将给出时间场函数 ${Time}。
- 对于标量:
- <phi-column> 是要作为 x 的函数进行插值的标量 y 值的列。
- 对于矢量值:
- <phi_0-column> 是要作为 x 的函数进行插值的分量 [0] 值的表列。
- <phi_1-column> 是要作为 x 的函数进行插值的分量 [1] 值的表列。
- <phi_2-column> 是要作为 x 的函数进行插值的分量 [2] 值的表列。
- 支持以下插值方法:
- LINEAR(线性) -- 在 y 表值之间使用分段线性插值。
- STEP(步) -- 使用小于 $scalar_expression 的值的最大 x 表值处的 y 表值。
differentiateTable
表达式不支持此方法。 -
SPLINE(样条曲线) -- 在 y 表值之间使用 B 样条曲线插值(仅限标量表达式)。
-
CUBIC_AKIMA -- 使用 Akima 三次法。请参见三次和样条插值方法。
示例:考虑一个名为 "RotationData" 的表具有 "Time" 列和 "RotationAngle" 列。以下表达式:
interpolateTable(@Table("RotationData"), "Time", LINEAR, "RotationAngle", $Time)
线性插值 "RotationAngle" 是 "Time" 的函数,用于返回由时间场函数 ($Time
) 给出的时间处的插值。
定期将列值作为另一列的函数进行插值和区分
对于包含某列的值是另一列值的函数的表,可以创建输出标量或矢量场,以定期重复已插值相关值一定期间。同样,可以创建定期重复某一时段的导数的输出标量或矢量场。
一般语法为:
- 对于周期长度比表格输入分布长的标量场:
interpolateTablePeriodic(@Table("<tablename>"), "<x-column>", {LINEAR | STEP | SPLINE | CUBIC_AKIMA}, "<phi-column>", <scalar_expression_1>,<scalar_expression_2>)
differentiateTablePeriodic(@Table("<tablename>"), "<x-column>", {LINEAR | SPLINE | CUBIC_AKIMA}, "<phi-column>", <scalar_expression_1>,<scalar_expression_2>)
- 对于周期长度比表格输入分布短的标量场:
interpolateTablePeriodic(@Table("<tablename>"), "<x-column>", {LINEAR | STEP | SPLINE | CUBIC_AKIMA}, "<phi-column>", <scalar_expression_1>,<scalar_expression_2>,<scalar_expression_3>)
differentiateTablePeriodic(@Table("<tablename>"), "<x-column>", {LINEAR | SPLINE | CUBIC_AKIMA}, "<phi-column>", <scalar_expression_1>,<scalar_expression_2>,<scalar_expression_3>)
其中:
- <scalar_expression_1> 是给出 x 变量(如 ${时间})的表达式。
- <scalar_expression_2> 为期间长度,如某个时间间隔的长度。
- <scalar_expression_3> 是期间的起点,如时间点。
还可以从表中周期性地插值矢量。一般情况下写入以下内容:
interpolateTablePeriodic(@Table("TableName"), "Independent Variable Column", VECTOR_INTERPOLATION_METHOD, "X Component Column", "Y Component Column", "Z Component Column", independentVariableValue, period, periodStart)
VECTOR_INTERPOLATION_METHOD
可以是步进插值的 STEP
,也可以是线性插值的 LINEAR
;这些方法的工作原理与标量完全相同。
为区分周期插值矢量,应写入以下内容:
differentiateTablePeriodic(@Table("TableName"), "Independent Variable Column", "X Component Column", "Y Component Column", "Z Component Column", independentVariableValue, period, periodStart)
不需要插值法,因为 Simcenter STAR-CCM+ 始终将线性插值与表中的矢量插值区分开来。
示例:例如,考虑一个名为 "MassFlowData" 的表,它包含 "Time" 和 "MassFlowRate" 列,可提供一分钟内每一秒的质量流率如下:
此外,考虑以下场函数:
interpolateTablePeriodic(@Table("MassFlowData"), "Time", LINEAR, "MassFlowRate", $Time, 15, 10)
此表达式将 "MassFlowRate" 作为 "Time" 的函数进行线性插补,并在 Time 场函数给定的时间内定期在 10s 和 25s 之间返回插值,如下所示:
插值位置值
可以使用表达式对位置表数据进行插值,从而生成位置相关场。用于生成标量场的函数为:
interpolatePositionTable(@Table("<tablename>"), "<phi-column>")
或者,使用坐标系:
interpolatePositionTable(@Table("<tablename>"), @CoordinateSystem("<coordinatesystem>"), "<phi-column>")
或者,使用嵌套坐标系:
interpolatePositionTable(@Table("<tablename>"), @CoordinateSystem("<coordinatesystem>.<coordinatesystem>.<coordinatesystem>"), "<phi-column>")
用于生成位置相关矢量场的函数为:
interpolatePositionTable(@Table("<tablename>"), "<phi_0-column>","<phi_1-column>","<phi_2-column>")
或者,使用坐标系:
interpolatePositionTable(@Table("<tablename>"), @CoordinateSystem("<coordinatesystem>"), "<phi_0-column>","<phi_1-column>","<phi_2-column>")
或者,使用嵌套坐标系:
interpolatePositionTable(@Table("<tablename>"), @CoordinateSystem("<coordinatesystem>.<coordinatesystem>.<coordinatesystem>"), "<phi_0-column>","<phi_1-column>","<phi_2-column>")
其中:
- <coordinatesystem> 是 节点中的坐标系的名称。此名称的多个实例(由点分隔)表示嵌套的层。如果未指定坐标系,则使用基准坐标系并假设为笛卡尔坐标系。
- <tablename> 是 节点中的表。表列包含指定 <coordinatesystem> 中的坐标值。列名称必须是坐标系规定的名称,即,笛卡尔坐标系 ("X", "Y", "Z"),圆柱坐标系 ("r", "theta", "z") 或者球坐标系 ("r", "theta", "phi")。
- 对于标量函数:
- <phi-column> 是使用最近邻进行空间插值的表列,对应于位置坐标列。
- 对于矢量函数:
- <phi_0-column>、<phi_1-column> 和 <phi_2-column> 表示 <coordinatesystem> 中的位置矢量的三个分量值的列名称。
使用最近邻(最近的点)插值,根据表的每行中的坐标值。表中的数据点无需遵循特定的空间排序(点数据被认为是分散的)。