首页/文章/ 详情

Fluent 并行UDF丨04 数据遍历宏

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

本文摘要(由AI生成):

本文介绍了Fluent中用于遍历网格单元和面的宏。包括内部单元和外部单元(regular和extended)的遍历宏,以及内部和外部单元都遍历的宏。同时,也提及了内部网格面与外部网格面的概念,并介绍了用于遍历这些面的宏。此外,还指出了分区边界面在并行计算中可能被重复计算的问题,并提供了解决此问题的方法。这些宏为Fluent用户提供了强大的工具,用于在UDF(用户自定义函数)中执行各种复杂的网格操作。


数据遍历在UDF中使用颇为普遍,本文描述UDF并行代码中与众不同的遍历宏。

本文内容来自Fluent UDF手册。


并行UDF代码中存在一些与串行代码不同的遍历宏。

并行分区网格由内部网格(Interior Cell)与外部网格(Exterior Cell)组成。Fluent提供了一组单元循环宏,用户可以使用它们来循环内部单元、外部单元、内部单元面与外部单元面。

图1 分区网格

1 interior网格循环

宏 begin … end_c_loop_int可以在分区网格上遍历内部网格单元。它包含一个begin和end语句,在这些语句之间,可以依次对thread的每个内部单元格执行操作。宏被传递一个单元索引c和一个单元thread指针tc。

图2 内部网格

使用形式:

begin_c_loop_int(c,tc)
{
   ...
}
end_c_loop_int(c,tc)

例如以下的示例代码:

real total_volume = 0.0;
begin_c_loop_int(c,tc)
{
     total_volume += C_VOLUME(c,tc);
}
end_c_loop_int(c,tc)

2 Exterior网格遍历宏

Fluent提供了3个宏用于遍历外部网格:

  • begin,end_c_loop_rext遍历regular外部网格
  • begin,end_c_loop_eext遍历extended外部网格
  • begin,end_c_loop_ext遍历regular及extended外部网格

每个宏包含一个begin和end语句,在这些语句之间,可以依次对每个thread的外部单元执行操作。宏参数包括一个单元索引c和单元thread指针tc。

begin_c_loop_ext(c, tc)
{
   ...
}
end_c_loop_ext(c,tc)

注:通常情况下并不需要使用外部网格遍历宏。

图3 外部网格

3 内部及外部网格遍历宏

有两个宏可以用来遍历分区网格中的内部网格及部分或全部外部单元格:

  • begin,end_c_loop宏遍历所有内部网格与regular外部网格,如下图左侧网格
  • begin,end_c_loop_int_ext宏遍历所有内部网格与所有外部网格,如下图右侧网格

图4 两个宏对应的两类网格

每个宏包含一个begin和end语句,在这些语句之间,可以依次对每个thread的内部及外部单元执行操作。宏参数包括一个单元索引c和单元thread指针tc。

begin_c_loop(c,tc)
{
   ...
}
end_c_loop(c,tc)

示例代码:

real temp;
begin_c_loop(c,tc)
{
   temp = C_T(c,tc);
   C_UDMI(c,tc,0) = (temp - tmin) / (tmax - tmin);
}
end_c_loop(c,tc)

4 遍历所有网格面

并行Fluent中包含两种面:内部网格面(Interior Face)以及边界面(Boundary Zone Face)。

图5 内部网格面与外部网格面

利用宏begin,end_f_loop可以遍历计算节点上的内部面以及边界面。此宏包含begin以及end语句,宏形式为:

begin_c_loop(f,tf)
{
   ...
}
end_f_loop(f,tf)

注:UDF中还存在begin_f_loop_int和begin_f_loop_ext循环宏,它们分别遍历一个计算节点的内部面和外部面。_int形式等同于begin_c_loop_int。尽管这些宏存在,但它们在udf中没有实际应用,通常情况下不应该使用它们。

分区边界面(Partition boundary face)位于两个相邻计算节点之间的边界上,并且存在于两个计算节点上。因此,当执行一些计算时(如求和)分区边界面在一个面循环中会被计算两次。可以通过使用PRINCIPAL_FACE_P来测试当前节点是否是face循环宏中的face的主要计算节点来纠正。

begin_f_loop(f,tf)
if PRINCIPAL_FACE_P(f,tf)
{
   F_AREA(area,f,tf);
   total_area += NV_MAG(area);
   total_pres_a += NV_MAG(area)*F_P(f,tf);
}
end_f_loop(f,tf)
total_area = PRF_GRSUM1(total_area);
total_pres_a = PRF_GRSUM1(total_pres_a);


Fluent其他专业通用科普
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2020-08-11
最近编辑:4月前
CFD之道
博士 | 教师 探讨CFD职场生活,闲谈CFD里外
获赞 2565粉丝 11293文章 732课程 27
点赞
收藏
作者推荐
未登录
1条评论
夜观天象
签名征集中
4年前
大神,能出一期使用udf在模型中加入静电场的文章吗?
回复
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈