暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Fluent UDF中的循环遍历宏

CFD之道 2023-04-19
2268

本文介绍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之间的这种类型的通信非常耗时,这类操作应当在循环之外进行。

1 thread_loop_c

可以使用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);
}

2 thread_loop_f

可以使用thread_loop_f
在指定Domain的所有网格面thread上进行循环。

宏参数包括一个Thread指针及一个Domain指针。

调用形式如下:

Thread *f_thread;
Domain *domain;
thread_loop_f(f_thread, domain)
{
//遍历网格面
}

若想要获取网格面数据,通常需要定义一个face_t
变量,同时在循环体内嵌入begin_f_loop
循环。

3 begin_c_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
变量作为宏参数,该变量无需赋值。

4 begin_f_loop

可以利用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)

5 c_face_loop

利用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)
获取。

6 c_node_loop

利用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指针,之后便可以利用节点指针获取存储在节点上的变量。

7 f_node_loop

利用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宏类似。


(完)

文章转载自CFD之道,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论