吾生有涯 学海无涯
析模有界 知识无界

Fluent UDF中的循环遍历宏

本文介绍Fluent UDF中的循环遍历宏。

许多UDF中需要对计算区域中的网格节点、网格单元、网格面及Thread等进行遍历,为了方便程序编写,Fluent提供了一系列预定义的宏来完成这种循环遍历操作。如要定义一个自定义的边界分布函数,需要使用begin...end_f_loop宏对一个face thread中的所有网格面进行遍历。如果想要在一个domain的所有网格面或网格单元上执行遍历操作,可以在thread_loop_fthread_loop_c中分别嵌套一个begin...end_f_loopbegin...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: %gn", 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之道

赞(2) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《Fluent UDF中的循环遍历宏》
文章链接:https://www.topcfd.cn/34805/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册