来自:IDAJ中国Ansys技术团队 徐淑君
更多资料/视频:产品专栏/Ansys
随着仿真工况的日益复杂,在数值模拟中经常会遇到一些无法在界面上直接赋值的边界条件,比如按一定空间位置排列,随时间变化,或和某个变量相关等等。越来越多的工程师希望对边界条件进行自定义设置。
Ansys Fluent中有以下几种自定义边界条件的方法:
- 利用profile文件赋值
- 采用Fluent Expressions定义
- 编写UDF
今天,我们来了解一下如何采用Fluent Expressions定义边界条件。
从2019版本开始,Fluent中加入了和CFX中的表达式功能类似的“Fluent Expression Language”(表达式语言)。它是一种基于Python的解释型的声明式语言,是由数值、变量、运算符、函数组成的可以返回一定值的字符串,例如,Vmax*(5.0*exp(-t-0.3 [s]/2.8 [s]))。
表达式可以指定与时间、迭代步、位置、求解变量相关的复杂的边界条件和源项,基于时间和迭代步指定不同的模型和求解器设置。同一个表达式对Windows和Linux都适用。
表达式可以取代部分UDF、Scheme、Journal的功能,虽然不能完全取代,但比UDF、scheme更加易学易用,是非常值得学习的一个功能。
表达式的值可以是实数,整数,布尔值或数量。数量是具有量纲的实数。数量格式为<number> [<unit>],例如2324.0 [Pa kg ^ -3 s]。
表达式的计算结果可以是实数,布尔值,实数场或布尔值场。例如,2 * StaticPressure在一个区域上计算时,会返回real field(实数场);而average(2 * StaticPressure,[“ inlet”])返回的是一个实数值。
表达式包含很多运算符和函数,如下表所示。
描述 | 函数 |
运算符 | +, -, *, /, ** (power), ^ (power), >, >=, <, <=, ==, != |
传统 | AND(<expr>, <expr>, …) IF(<cond>, <true_value>, <false_value>) NOT(<expr>) OR(<expr>, <expr>, …) XOR(<expr>) |
双曲线 | acosh(<expr>) asinh(<expr>) atanh(<expr>) cosh(<expr>) sinh(<expr>) tanh(<expr>) |
数学 | abs(<expr>) *besselJ(n**, <expr>) *besselY(n**, <expr>) ceil(<expr>) exp(<expr>) floor(<expr>) gradient(<expr>) log(<expr>) log10(<expr>) max(<expr>, <expr>, …) min(<expr>,<expr>, …) mod(<expr>, <expr>) normalize(<expr>,[<location>,…]) round(<expr>) sqrt(<expr>) step(<expr>) trunc(<expr>) *besselJ 是第一类贝塞尔函数,besselY 是第二类贝塞尔函数。 **n 必须是“double”类型的常量。 |
归约 | Area([<location>, <location>, …]) AreaAve(Field, ['location']) AreaInt(Field, ['location']) *Average(<expr>, [<location>, <location>, …], Weight= <None| 'Area'| 'Volume'| 'Mass'| 'MassFlowRate'| 'AbsMassFlowRate'>) Centroid(['location']) Count(['location']) CountIf(Boolean_Expr, ['location']) Force (['location'], …) MassAve(Field,['location']) MassFlow(['location']) MassFlowAve(Field, ['location']) MassFlowAveAbs(Field, ['location']) MassFlowInt(Field, ['inelt1'], ['inlet2']) MassInt(Field, ['location']) Maximum(<expr>, [<location>, <location>, …]) Minimum(<expr>, [<location>, <location>, …]) Moment(<point>, ['location']) PressureForce(['location'], …) *Sum(<expr>, [<location>, <location>, …], Weight= <None| 'Area'| 'Volume'| 'Mass'| 'MassFlowRate'| 'AbsMassFlowRate'>) SumIf( Field, Boolean_Expr, ['location'], Weight=[Weight]) ViscousForce([<location>, <location>, …]) Volume([<location>, <location>, …]) VolumeAve(Field, ['location']) VolumeInt(Field, ['location']) |
三角 | acos(<expr>) asin(<expr>) atan(<expr>) atan2(<expr>, <expr>) cos(<expr>) sin(<expr>) tan(<expr>) |
矢量 | cross(<expr>, <expr>) dot <vector1>, <vector2>) unitVector(<x>, <y>, <z>) <vector>.dir vector(<x>, <y>, <z>, ["unit"]) |
不要在单个表达式中使用多个比较运算符,因为该运算将无法 正常工作。 例如,400 [K]> StaticTemperature> 300 [K]将不起作用。要完成此表达式,请使用AND(StaticTemperature> 300 [K],StaticTemperature <400 [K])。
表达式的数据主要来源有场变量、求解变量、科学常数、别名(Aliases)、profiles。Fluent 后处理场变量的子集可用于表达式。求解变量有当前时间Time、当前时间步Timestep、当前时间步长DeltaTime 和全局迭代次数Iteration。
科学常数,如下表所示。
变量 | 描述 | 值 |
PI | 圆周率Pi | 3.14159265358979323846 |
e | 自然对数的底数e | 2.71828182845904523536 |
R | 气体常数 | 8.314472 [J K^-1 mol^-1] |
avogadro | 阿伏伽德罗常数 | 6.02214199e23 [mol^-1] |
boltzmann | 玻尔兹曼常数 | 1.3806503 [J K^-1] |
clight | 光速 | 2.99792458e8 [m s^-1] |
echarge | 电子电荷 | 1.60217653e-19 [A s] |
g | 重力加速度 | 9.8066502 [m s^-2] |
planck | 普朗克常数 | 6.62606876e-34 [J s] |
stephan | 斯蒂芬-玻尔兹曼常数 | 5.670400e-08 [W m^-2 K^-2] |
mupermo | 磁导率 | 4.0*PI*1.0e-7 [N A^-2] |
epspermo | 介电常数 | 1./(clight*clight*mupermo) |
利用别名可以引用一些常用的参数,如下表所示。
别名 | 变量 |
x | Position.x |
y | Position.y |
z | Position.z |
u | Velocity.x |
v | Velocity.y |
w | Velocity.z |
t | Time* *在稳态下,时间评估为 0,除非案例在瞬态中运行,然后切换到稳态,在这种情况下,它将评估为瞬态运行的最晚时间。 |
dt | DeltaTime* *在稳态下,增量时间评估为 0,除非案例在瞬态运行,然后切换到稳态,在这种情况下,它将评估为瞬态运行的最新增量时间。 |
iter | Global iteration count |
T | StaticTemperature |
P | StaticPressure |
mf | MassFraction |
Amag | FaceAreaMagnitude |
vol | CellVolume |
mass | CellVolume*Density |
可以在表达式中使用profile来指定边界和单元区域条件,用于后处理和归约操作。profile是可以导入到 Fluent 中的表格数据,除了一个或多个因变量列之外,通常还包含 X、Y 和 Z 列(对于空间profile)或时间(对于瞬态profile)。在表达式中使用profile之前,您必须加载一个或多个profile。
profile表达式需要以下输入:profile(‘<profile-name>’, ‘<field-name>’, frame=‘<reference-frame-name>’)(reference frame参数仅适用于空间profile)。定义profile表达式后,您可以为所需的边界条件或单元域条件字段选择它。
profile表达式示例如图1。
图1 profile表达式