上一节介绍了网格节点和网格面数据获取宏,本节继续介绍网格单元数据获取宏。
网格单元 (cell) 存储着许多几何参数和物理参数(单元中心、温度、压力等变量),这些参数均可利用对应的单元数据获取宏进行数据访问和操作,单元宏以C_
前缀开头,获取的变量均以国际单位制 (SI) 返回,对于某些特定数据获取宏,只有启用对应模型状态下才能使用。
例如,当在 Fluent 的 "Species Model"选项卡中启用组分输运模型时,才能访问获取组分质量分数。
3.1 单元质心 (C_CENTROID)
与前述获取面心坐标宏F_CENTROID
类似,利用C_CENTROID(x,c,t)
宏可获取单元质心坐标,其定义如下:
宏 | 参数类型 | 返回值 |
---|---|---|
C_CENTROID(x,c,t) | real x[ND_ND] , cell_t c , Thread * t | x (cell centroid) |
C_CENTROID(x,c,t)
宏包含三个参数:
- x 用于存储获取质心的坐标信息,数组维度取决于求解问题;
- c 为单元标识符;
- t 是表示单元所属的单元线程的线程指针。
x、c、t 为自定义的变量名,可采用其他符合C语言命名规则的变量名。
例如:
real pos(ND_ND)
、cell_t cell
、Thread *ct
数据获取宏不能单独使用,一般得根据问题和其他DEFINE
宏和循环宏搭配使用,用法如下:
Domain *domain;
Thread *c_thread;
cell_t c;
real pos(ND_ND);//用于存储质心坐标的数组
thread_loop_c(c_thread,domain)
{
begin_c_loop(c,c_thread)
{
C_CENTROID(pos, c, t);
/*对质心坐标进行操作*/
}
end_c_loop(c,c_thread)
}
示例:下列 UDF 用于初始化单元的温度分布。如果单元质心坐标与点 ( 0.5 , 0.5 , 0.5 ) (0.5, 0.5, 0.5) (0.5,0.5,0.5) 的距离小于 0.25 0.25 0.25,则将该单元的温度设置为 400 K 400\text{K} 400K,否则设置为 300 K 300\text{K} 300K。
#include "udf.h"
// 定义一个初始化函数,名字为 my_init_func,应用于域 d
DEFINE_INIT(my_init_func, d)
{
cell_t c; // 定义一个变量 c,用于存储单元的索引
Thread *t; // 定义一个指针 t,用于指向单元线程
real xc[ND_ND]; // 定义一个数组 xc,用于存储单元质心的坐标
// 遍历域 d 中的所有单元线程
thread_loop_c(t, d)
{
// 遍历单元线程 t 中的所有单元
begin_c_loop(c, t)
{
// 获取单元 c 的质心坐标,并存储在 xc 数组中
C_CENTROID(xc, c, t);
// 计算质心与点 (0.5, 0.5, 0.5) 的距离
if (sqrt(ND_SUM(pow(xc[0] - 0.5, 2.0),
pow(xc[1] - 0.5, 2.0),
pow(xc[2] - 0.5, 2.0))) < 0.25)
// 如果距离小于 0.25,则将单元温度设置为 400
C_T(c, t) = 400.0;
else
// 否则,将单元温度设置为 300
C_T(c, t) = 300.0;
}
// 结束单元循环
end_c_loop(c, t)
}
}
注意:
ND_SUM
是一个宏,用于根据问题的维数(2D 或 3D)计算坐标的平方和。sqrt
函数用于计算质心与点 (0.5, 0.5, 0.5) 之间的欧几里得距离。C_T(c, t)
为单元温度获取宏,将在本文后续进行介绍。
该初始化函数可以在仿真开始时根据单元几何位置初始化单元的温度分布,从而实现特定的初始条件设置。
3.2 单元体积 (C_VOLUME)
C_VOLUME(c,t)
宏可用于访问获取二维、三维和轴对称问题中网格单元体积,该宏定义在头文件mem.h
中
宏 | 参数类型 | 返回值 |
---|---|---|
C_VOLUME(c,t) | cell_t c , Thread *t | real cell volume for 2D or 3D, real cell volume/2π for axisymmetric |
示例:
#include "udf.h"
/*每次时间步结束时执行的函数*/
DEFINE_EXECUTE_AT_END(print_cell_volumes)
{
Domain *domain;
Thread *t;
cell_t c;
real volume;
/* 获取域指针,1 表示默认的流体域 */
domain = Get_Domain(1);
/* 遍历域中所有单元线程 */
thread_loop_c(t, domain)
{
/* 遍历单元线程中的所有单元 */
begin_c_loop(c, t)
{
/* 获取单元体积 */
volume = C_VOLUME(c, t);
/* 执行与单元体积相关操作 */
}
end_c_loop(c, t)
}
}
3.3 单元面和节点数量 (C_NFACES
、C_NNODES
)
宏 C_NFACES
、C_NNODES
分别用于获取网格单元 (cell) 上网格面 (face) 和网格节点 (node) 数量,
宏 | 参数类型 | 返回值 |
---|---|---|
C_NNODES(c,t) | cell_t c , Thread *t | int number of nodes in a cell |
C_NFACES(c,t) | cell_t c , Thread *t | int number of faces in a cell |
用法:
int num_faces, num_nodes;
num_faces = C_NFACES(c, t);
num_nodes = C_NNODES(c, t);
该宏可用于在进行网格处理或分析时,获取单元的几何信息,以便进行进一步的计算或处理。
3.4 单元索引 (C_FACE
、C_FACE_THREAD
)
C_FACE
宏用于返回给定的 cell_t c
, Thread *t
, 和局部面索引号 i
的全局面索引 face_t f
。该宏在mem.h
中定义。
注意:如果并行运行,
C_FACE
返回计算节点的局部面索引。
C_FACE_THREAD
返回由 C_FACE
返回的 face_t f
的线程 *t
,可以通过整数索引 i
访问特定的面,也可以使用 c_face_loop
循环所有面,该宏在mem.h
中定义。
宏 | 参数类型 | 返回值 |
---|---|---|
C_FACE(c,t,i) | cell_t c , Thread *t , int i | global face index face_t f |
C_FACE_THREAD | cell_t c , Thread *t , int i | Thread *t of face_t f returned by C_FACE . |
3.5 单元流动变量
前述几节介绍了获取单元位置信息与几何信息相关的宏,对于CFD模拟,我们更关注物理信息的获取。Fluent 提供了一系列用于访问单元流动变量的宏,这些宏用于在 UDF 中访问和操作 CFD 模型中的单元格流动变量
宏 | 参数类型 | 返回值 |
---|---|---|
C_R(c,t) | cell_t c, Thread *t | 密度 (real) |
C_P(c,t) | cell_t c, Thread *t | 压力 (real) |
C_U(c,t) | cell_t c, Thread *t | x 方向速度 (real) |
C_V(c,t) | cell_t c, Thread *t | y 方向速度 (real) |
C_W(c,t) | cell_t c, Thread *t | z 方向速度 (real) |
C_T(c,t) | cell_t c, Thread *t | 温度 (real) |
C_H(c,t) | cell_t c, Thread *t | 焓 (real) |
C_K(c,t) | cell_t c, Thread *t | 湍流动能 (real) |
C_D(c,t) | cell_t c, Thread *t | 湍流耗散率 (real) |
C_YI(c,t,i) | cell_t c, Thread *t, int i | 组分质量分数 (real) |
C_MU_L(c,t) | cell_t c, Thread *t | 层流粘度 (real) |
C_MU_T(c,t) | cell_t c, Thread *t | 湍流粘度 (real) |
C_MU_EFF(c,t) | cell_t c, Thread *t | 有效粘度 (real) |
C_POR(c,t) | cell_t c , Thread *t | 孔隙率 |
示例一:遍历计算域中的所有单元,累加每个单元湍流耗散率与单元体积的乘积,最终计算出湍流耗散率的体积积分,并将结果打印到控制台。
#include "udf.h"
// 定义ADJUST宏,每次迭代运行,后续章节介绍
DEFINE_ADJUST(my_adjust, d)
{
Thread *t; // 定义一个指针 t,用于指向单元线程
real sum_diss = 0.0; // 初始化变量 sum_diss,用于累加湍流耗散率
cell_t c; // 定义变量 c,用于存储单元的索引
// 遍历域 d 中的所有单元线程
thread_loop_c(t, d)
{
// 遍历单元线程 t 中的所有单元
begin_c_loop(c, t)
{
// 计算当前单元的湍流耗散率乘以体积,并累加到 sum_diss
sum_diss += C_D(c, t) * C_VOLUME(c, t);
}
end_c_loop(c, t) // 结束单元循环
}
// 打印湍流耗散率的体积积分结果
printf("Volume integral of turbulent dissipation: %g\n", sum_diss);
}
示例二:初始化单元压力分布
如图所示二维流场,现需初始化流场压力分布,流场中心圆域内压力为
500
Pa
500 \text{Pa}
500Pa,圆域外压力为
300
Pa
300\text{Pa}
300Pa,圆心坐标
(
0
,
0
)
(0,0)
(0,0) ,半径
3
mm
3 \text{mm}
3mm。
编写UDF:
#include "udf.h"
// 定义一个初始化函数,名字为 initp,应用于域 d
DEFINE_INIT(initp, d)
{
cell_t c; // 定义一个变量 c,用于存储单元的索引
Thread *t; // 定义一个指针 t,用于指向单元线程
real xc[ND_ND]; // 定义一个数组 xc,用于存储单元质心的坐标
// 遍历域 d 中的所有单元线程
thread_loop_c(t, d)
{
// 遍历单元线程 t 中的所有单元
begin_c_loop(c, t)
{
// 获取单元 c 的质心坐标,并存储在 xc 数组中
C_CENTROID(xc, c, t);
/* 判断单元格是否在圆域内 */
if ((pow(xc[0], 2) + pow(xc[1], 2)) < pow(0.003, 2))
// 单元质心坐标在圆域内,则将单元压力设置为 500.0
C_P(c, t) = 500.0;
else
// 否则,将单元压力设置为 300
C_P(c, t) = 300;
}
// 结束单元循环
end_c_loop(c, t)
}
}
编译UDF:采用解释型编译Compiled
挂载UDF:DEFINE_INIT
宏需要挂载使用,点击Function Hooks
初始化:点击initialize进行流场初始化。
初始化完成后可在结果里面查看流场压力云图如下:
3.6 材料属性
Fluent 提供了一系列用于访问单元材料属性的宏,其可用于仿真过程中获取单元材料物性相关参数,以便进行各种物理计算和分析。
宏 | 参数类型 | 返回值 |
---|---|---|
C_MU_L(c,t) | cell_t c , Thread *t | 层流粘度 |
C_MU_T(c,t) | cell_t c , Thread *t | 湍流粘度 |
C_MU_EFF(c,t) | cell_t c , Thread *t | 有效粘度 |
C_K_L(c,t) | cell_t c , Thread *t | 导热系数 |
C_K_T(c,t,prt) | cell_t c , Thread *t , real prt | 湍流热导率 |
C_K_EFF(c,t,prt) | cell_t c , Thread *t , real prt | 有效导热系数 |
C_DIFF_L(c,t,i,j) | cell_t c , Thread *t , int i , int j | 层流组分扩散系数 |
C_DIFF_EFF(c,t,i) | cell_t c , Thread *t , int i | 有效组分扩散系数 |
C_CP(c,t) | cell_t c , Thread *t | 比热 |
C_RGAS(c,t) | cell_t c , Thread *t | 理想气体常数/分子量 |
C_NUT(c,t) | cell_t c , Thread *t | Spalart-Allmaras湍流粘度 |
C_SCAT_COEFF(c,t) | cell_t c, Thread *t | 发射系数 |
C_ABS_COEFF(c,t) | cell_t c, Thread *t | 吸收系数 |
本节介绍了一些采用的单元数据访问宏,并给出部分UDF示例,对于一些特殊的单元数据访问宏(如梯度宏、导数宏、多相流宏等)将在后续学习中穿插介绍。
标签:real,cell,Thread,0.5,Fluent,访问,UDF,loop,单元 From: https://blog.csdn.net/weixin_48358398/article/details/139816073文章部分内容整理翻译于《Ansys Fluent UDF Manual》,笔者学识有限,请批评指正。
欢迎大家评论区或者私信交流