首页/文章/ 详情

Fluent UDF中的循环遍历宏

精品
作者优秀平台推荐
详细信息
文章亮点
作者优秀
优秀教师/意见领袖/博士学历/特邀专家
平台推荐
内容稀缺
1年前浏览4378

本文介绍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: %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之道
Fluent多相流UDF通用通信UM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-04-20
最近编辑:1年前
CFD之道
博士 | 教师 探讨CFD职场生活,闲谈CFD里外
获赞 2566粉丝 11298文章 734课程 27
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈