网格组成
大多数 UDF 需对求解器数据进行访问。由于 Fluent 求解器数据是根据网格组件定义的,因此在编写UDF之前,需要学习一些基本的网格术语。
有限体积法 (FVM) 网格由一系列控制体 (control volume,CV) 即网格单元 cell 组成,每个网格单元由一组网格节点、单元中心和单元边界面组成。Fluent 内部数据结构定义网格域;为网格中的单元、单元面和节点分配顺序;以及建立相邻网格单元之间的连接关系。Fluent导入网格时,将网格拓扑信息存储在求解器中。
注:通量 F l u x Flux Flux 等数据储存在网格面上,一般的物理量如压力、温度、速度等储存在网格单元中心,与网格索引相关的数据储存在网格节点上。
网格由以下部分组成:
- 2D:node(节点)、face(面)、cell(单元)
- 3D:node(节点)、edge(边)、face(面)、cell(单元)
数据类型
Fluent数据结构根据网格信息进行定义:
- 域 (Domains) :网格节点、网格面和网格单元线程 (Threads) 的集合。
- 线程 (Threads) :一系列网格节点 (Nodes)、 网格单元 (Cells) 和网格面 (Faces) 的集合
- 网格单元(Cells) 和面 (Faces) 由节点 (Nodes) 组成。
UDF基于C/C++编程语言编写,其支持标准的C/C++数据类型 (如real、int等),此外,Fluent 还有与网格结构相关联的特定数据类型。
常用的Fluent数据类型如下:
-
Node:结构体变量,用于存储与网格节点相关的数据。
-
face_t:整型变量,用于标识face Thread中的特定网格面。
-
cell_t:整型变量,用于标识cell Thread中的特定网格单元。
-
Thread:结构体变量,存储其所代表的网格单元或网格面的数据。
-
Domain:结构体变量。用于存储与网格节点、网格面和网格单元线程Thread集合相关的数据。
数据类型定义举例:
数据类型 | 变量名 | 描述 |
---|---|---|
Domain | *d | 域指针 |
Thread | *t | 线程指针 |
cell_t | c | 单元索引 |
face_t | f | 面索引 |
Node | *node | 网格节点索引 |
使用上述数据类型定义的变量通常作为参数提供给DEFINE
宏与其他数据访问函数。
UDF可以访问流体域和边界区中网格单元或单元面的求解变量,访问数据首先需确定所访问的数据存储位置,面ID或单元ID本身并不能唯一标识面或单元,需要与线程指针一起使用,才能标识面或单元所属的线程。一些UDF会将单元索引 c 作为参数传递(例如 DEFINE_PROPERTY(my_function,c,t)
),或者将面索引变量 f 作为参数传递(例如 DEFINE_UDS_FLUX(my_function,f,t,i)
)。如果UDF没有将单元或面索引变量作为参数传递,但需要使用这些变量,可以在函数中局部声明后使用。
如果 UDF 循环遍历 Domain 中的所有单元线程或面线程(使用 thread_c_loop(c,t)
或 thread_f_loop(f,t)
),且DEFINE
宏没有传递相应的指针,只需在调用循环前局部声明线程指针(以及单元或面ID),不需要使用 Lookup_Thread
来获取线程指针。
数据访问有关的循环宏和变量获取宏将在后续章节叙述。