本文介绍Fluent UDF中的循环遍历宏。
许多UDF中需要对计算区域中的网格节点、网格单元、网格面及Thread等进行遍历,为了方便程序编写,Fluent提供了一系列预定义的宏来完成这种循环遍历操作。如要定义一个自定义的边界分布函数,需要使用begin...end_f_loop
宏对一个face thread中的所有网格面进行遍历。如果想要在一个domain的所有网格面或网格单元上执行遍历操作,可以在thread_loop_f
或thread_loop_c
中分别嵌套一个begin...end_f_loop
或begin...end_c_loop
。
以下的通用循环遍历宏可以用于Fluent的单相流或多相流模型,这些宏定义在mem.h头文件中。
注:任何时候都不要在单元循环宏或面循环宏(c_loop或f_loop)中利用RP_GET_…函数访问Scheme变量。求解器与cortex之间的这种类型的通信非常耗时,这类操作应当在循环之外进行。
”
可以使用thread_loop_c
在指定Domain的所有网格单元thread上进行循环。
调用形式如下:
Domain *domain;
Thread *thread;
thread_loop_c(thread,domain)
{
//遍历网格单元
}
宏参数分别为Thread指针及Domain指针。其中domain指针可以利用Get_Domain
获取,Thread指针不需要获取,声明之后可以直接使用。若需要在循环宏内获取网格体心上存储的物理量数据,可以在循环外部声明一个cell_t
变量。
如下面的示例代码片段:
#include "udf.h"
DEFINE_ADJUST(my_adjust,d)
{
Thread *t;
real sum_diss=0.;
cell_t c;
thread_loop_c(t,d)
{
begin_c_loop(c,t)
{
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);
}
可以使用thread_loop_f
在指定Domain的所有网格面thread上进行循环。
宏参数包括一个Thread指针及一个Domain指针。
调用形式如下:
Thread *f_thread;
Domain *domain;
thread_loop_f(f_thread, domain)
{
//遍历网格面
}
若想要获取网格面数据,通常需要定义一个face_t
变量,同时在循环体内嵌入begin_f_loop
循环。
可以利用begin_c_loop
宏对指定thread上的所有网格单元进行循环遍历。
此宏的基本调用形式:
cell_t c;
Thread *c_thread;
begin_c_loop(c, c_thread)
{
//遍历网格单元
}
end_c_loop(c, c_thread)
在宏外部声明cell_t
变量作为宏参数,该变量无需赋值。
可以利用begin_f_loop
宏对指定的thread上的所有网格面进行循环遍历。此宏与begin_c_loop的使用方式类似,只不过遍历的是网格面。
基本调用形式为:
face_t f;
Thread *f_thread;
begin_f_loop(f,f_thread)
{
//遍历网格面
}
end_f_loop(f,f_thread)
利用c_face_loop
宏可以在指定的网格单元thread上遍历网格面。
基本调用形式为:
cell_t c;
Thread *t;
face_t f;
Thread *tf;
int n;
c_face_loop(c, t, n)
{
.
.
.
f = C_FACE(c,t,n);
tf = C_FACE_THREAD(c,t,n);
.
.
.
}
参数n
为局部网格面索引,其用于C_FACE
宏中以获取网格面索引,如示例代码中的f=C_FACE(c,t,n)
。网格面thread可以通过C_FACE_THREAD(c,t,n)
获取。
利用c_node_loop
可以在指定的网格单元上遍历网格节点。
基本调用形式为:
cell_t c;
Thread *t;
int n;
Node *node;
c_node_loop(c,t,n)
{
.
.
node = C_NODE(c,t,n);
.
.
}
利用宏C_NODE(c,t,n)
获取网格节点的Node指针,之后便可以利用节点指针获取存储在节点上的变量。
利用f_node_loop
可以在指定网格面上遍历网格节点。
face_t f;
Thread *t;
int n;
Node *node;
f_node_loop(f,t,n)
{
.
.
.
node = F_NODE(f,t,n);
.
.
.
}
基本形式与c_node_loop宏类似。
(完)