前述章节介绍了Fluent数据结构及常用的循环操作宏。UDF的核心在于数据的获取与处理,数据获取宏是UDF重要的组成部分,也是后续一系列DEFINE宏学习的基石。
本节开始逐步介绍各类ANSYS Fluent数据访问宏。
1 Node Macros
节点 (Node) 是Fluent最底层的数据结构,也是最基本的网格组件,网格 (Mesh) 实际上由一系列节点构成。
对于网格节点,主要关注两个参数:节点位置和节点数量。
1.1 获取节点位置
可利用下表所述节点宏获取节点位置坐标信息,该在头文件metric.h
中被定义。
宏 | 参数类型 | 返回值 |
---|---|---|
NODE_X(node) | Node *node | real x coordinate of node |
NODE_Y(node) | Node *node | real y coordinate of node |
NODE_Z(node) | Node *node | real z coordinate of node |
1.2 获取节点数量
可利用F_NNODES
宏获取网格面上节点数量,该宏在头文件mem.h
中定义。
宏 | 参数类型 | 返回值 |
---|---|---|
F_NNODES(f,t) | face_t f , Thread *t | int number of nodes in a face |
节点宏使用较少,具体用法比较简单,后续应用再给出具体用法。
2 Face Macros
Face Macros用于访问和操作 Ansys Fluent 中面(Face)变量。这些宏以 F_
为前缀,可以返回与面相关的各种物理和流动变量,采用以国际单位制(SI)。这些宏在 mem.h
和 metric.h
文件中定义。
2.1 面心坐标 (F_CENTROID
)
F_CENTROID(x,f,t)
宏用于获取网格面中心。F_CENTROID
查找面 f 的中心坐标位置,并将坐标存储在数组 x 中。数组 x 的维度取决于求解器是2D还是3D的,可使用 ND_ND
宏定义数组 x ,其根据求解问题自动返回相应的维数。
ND_ND为常数,在2D模型中其值为2,在3D模型中其值为3
宏 | 参数类型 | 返回值 |
---|---|---|
F_CENTROID(x,f,t) | real x[ND_ND] , face_t f , Thread *t | x (face centroid) |
示例:遍历指定面的质心坐标并打印输出
#include "udf.h"
// 定义 ADJUST 宏,每次迭代执行
DEFINE_ADJUST(face_centroid, domain)
{
real FC[ND_ND]; // 定义一个数组用于存储坐标
face_t face; // 定义一个 face_t 类型的变量,用于存储面索引
int FACE_ID = 16; // 定义面 ID,在 Fluent 中查看,可以用宏常量定义:#define FACE_ID 16
real fx, fy; // 定义变量存储坐标值
// 查找在domain中ID为FACE_ID的面线程face_thread
Thread *face_thread;
face_thread = Lookup_Thread(domain, FACE_ID);//后续数据获取宏介绍
// 检查face_thread是否为空
if (face_thread == NULL)
{
Message("Error: face_thread is NULL. Check FACE_ID.\n");
return;
}
// 遍历 face_thread 中的所有面face
begin_f_loop(face, face_thread)
{
F_CENTROID(FC, face, face_thread); // 获取面 face 的质心坐标,并存储在 FC 数组中
fx = FC[0]; // 获取 x 坐标
fy = FC[1]; // 获取 y 坐标
// 打印坐标信息
Message("Centroid Coordinates: x = %f, y = %f\n", fx, fy);
}
end_f_loop(face, face_thread) // 结束面循环
}
演示案例网格如下,几何尺寸
20
×
40
mm
20×40 \text{mm}
20×40mm ,为直观展现上述 UDF 功能,案例网格尺寸设置为
5
mm
5\text{mm}
5mm ,现演示如何使用面心坐标 (F_CENTROID
)宏获取入口面面心坐标。
本案例网格比较少,可以直接得出面网格面心坐标为 ( 0 , 2.5 ) , ( 0 , 7.5 ) , ( 0 , 12.5 ) , ( 0 , 17.5 ) (0,2.5),(0,7.5),(0,12.5),(0,17.5) (0,2.5),(0,7.5),(0,12.5),(0,17.5) 此处单位为mm
导入网格后,可在边界条件信息栏查看面ID :
将上述inlet ID=16 赋值给UDF中的FACE_ID
,并将UDF文件保存为centroid.c
,读入Fluent进行编译。
编译完成后,ADJUST宏需要挂载使用:
设置边界条件,inlet类型为速度入口,outlet为压力出口,其余默认。混合初始化完成后设置迭代次数为1
点击 Calculate 进行迭代计算,在控制台面板可查看输出结果与预想结果吻合。
2.2 面法向向量 (F_AREA
)
F_AREA
宏可以获取面线程中指定面的网格面法向向量,该功能主要用于求解通过某些面的物理量分量。
宏 | 参数类型 | 返回值 |
---|---|---|
F_AREA(A,f,t) | A[ND_ND] , face_t f , Thread *t | A (area vector) |
一个简单的片段:
{
real NV_VEC(A); /*定义向量A*/
F_AREA(A, f, t);
}
注意:F_AREA宏通过传址调用返回值,参数A可以是数组A[ND_ND],也可以是向量。如果定义为向量,后面可以很方便的利用向量运算(点积和叉积等)。
Fluent 规定,边界区域面法线方向朝外,内部区域面法线方向根据右手定则按节点数递增的顺序确定。
Fluent 根据约定将相邻单元分配到内部面(c0 和 c1
):面法线指向外部的单元称为单元 C0,面法线指向内部的单元称为单元 c1。换句话说,面法线方向总是从单元格 c0 指向单元格 c1。
2.3 边界面流动变量宏
Fluent提供了一系列用于访问边界面上的流动变量宏。
宏 | 参数类型 | 返回值 |
---|---|---|
F_U(f,t) | face_t f , Thread *t , | u 方向速度 |
F_V(f,t) | face_t f , Thread *t , | v 方向速度 |
F_W(f,t) | face_t f , Thread *t , | w 方向速度 |
F_T(f,t) | face_t f , Thread *t , | 温度 |
F_H(f,t) | face_t f , Thread *t , | 热焓 |
F_K(f t) | face_t f , Thread *t , | 湍动能 |
F_D(f,t) | face_t f , Thread *t , | 湍流动能耗散率 |
F_YI(f,t,i) | face_t f , Thread *t , int i | 组分质量分数 |
**注意:**使用密度基求解器,需要注意以下几点:
- 求解器不存储焓值
F_H(f,t)
- 边界类型为 wall, symmetry 和 axis 的壁面不分配速度数组 (
F_U(f,t)
,F_V(f,t)
, 和F_W(f,t)
)建议使用
NNULLP()
宏来避免读取未分配的内存,例如,可以通过以下方法检查x-velocity
变量的内存存储情况:/* check for x-velocity boundary storage */ if(NNULLP(THREAD_STORAGE(t, SV_U))) { … }
2.4 边界面/内部面流动变量宏
除了上述一系列边界面流体变量宏外,Fluent还提供了一些可以访问内部面和边界面的流量变量宏。
密度基求解器不能采用
F_P(f,t)
宏
宏 | 参数类型 | 返回值 |
---|---|---|
F_P(f,t) | face_t f , Thread *t , | 压力 |
F_FLUX(f,t) | face_t f , Thread *t | 质量流量 |
F_FLUX
可访问获取在面线程 t 中通过给定面 f 的实际质量流量。如果流动方向与面法线方向相同(由 F_AREA
确定 ),则 Ansys Fluent 求解器计算的 F_FLUX
符号为正;反之则相反。即流体流出为正,流入为负。
注意:求解器计算的流量符号与 Fluent GUI(例如流量报告对话框)中报告的流量符号相反。
本节介绍了用于网格节点和网格面数据访问宏,后续章节继续介绍其他数据获取宏。