导言:在使用Fluent进行大规模并行计算时,难免会遇到主机与节点之间的需要数据传输的情况。Fluent在UDF使用手册中虽然提供了关于并行计算中的数据传输宏的定义与格式表述,但并没有给出相应的示例与详解。此外,在各平台也难以找到较为明晰的用法解释。本文将对Fluent应用UDF进行并行计算时的数据传输方式以及传输宏的使用方法进行详解。
1. Fluent 的并行计算架构简介
![a5c2eebe38f16b385ef353ec056014f6.png](https://img-blog.csdnimg.cn/img_convert/a5c2eebe38f16b385ef353ec056014f6.png)
在进行使用方法讲解前,有必要先了解 Fluent 的并行计算架构。在 UDF Manual 中,对Fluent的并行计算层级有这样一句介绍,可以清晰地描述命令与数据在各个节点之间的传输:
The host receives commands from Cortex and passes commands to compute node-0. Compute node-0, in turn, sends commands to the other compute nodes. [1] 主机 从 Cortex 接收命令,并将命令传递给 计算节点0。 计算节点0依次将命令发送到 其他计算节点。
再结合图1,可以很容易地理解Fluent的计算层级关系。Cotex作为内核直接与Host节点通信,Host节点则通过 Socket 协议与Node 0节点通信。之后 Node 0 通过Multiport,将命令与数据与其余节点共享。也就是说,Host与其余各节点的通信其实可以简化为Host 与Node 0 之间的通信。
2. 命令执行单元的选择
在知道了 Fluent 的计算架构后,我们可以发现,命令的执行是可以选择执行的单元的(节点执行 / 主机执行)。但为了让 Fluent 理解代码的执行位置,就必须引入一段识别语句来对其进行区分。在UDF中,提供了两种判断语句来表示代码的执行单元。
/**********************************************************************/
或者也可以写成相反的形式如下(更常用)
/*********************************************************************/
通过使用以上的区分形式,就能够让不同的代码在不同的主机上运行。在需要对全局变量进行控制,以及需要区分迭代计算部分与串行计算部分时,这一方法尤为重要。
但要注意的是,当采用这样的方法时,需要使用特定的宏才能实现数据在 Host 主机与节点 Nodes 之间的传递。接下来将对这一宏的使用进行解释。
3. 节点与主机之间的数据传递
为方便解释如何在UDF中使用数据传递宏来在节点与主机之间传输数据,这里假设一个十分简单的流场参数反馈控制的场景。
(案例场景:每个时间步从流场获取信息<流速,湍流度......>,传递给控制器进行控制信号的计算,输出的控制信号再传回流场,改变流场内的某一参数。)
在这一场景中,由于控制器部分是在主机Host中进行计算。所以整个过程中需要在节点与主机和主机与节点之间各传输一次数据。
对于这样的需求,Fluent 给出了两个十分易于使用的宏
host_to_node_type_num(val_1,val_2,...,val_num); 主机 到 节点;
node_to_host_type_num(val_1,val_2,...,val_num); 节点 到 主机;
在这里,type 表示需要传输的数据类型(int,real,double......),num 表示需要传输的变量数目。需要注意的是,以这样的形式传输的变量不能是数组与字符串。
若要传递数组和字符串则应该使用以下的形式:
/* 从节点传递数组或字符串到主机 */
要注意的是,该方法需要定义数组或者字符串长度,且一次只能传递一个数据。
使用该方法实现数据传递时还需要注意一个语法上容易出错的地方。由于官方的 UDF Manual中并未展示该宏在其他宏内的完整使用方法,这一点笔者试错了很久才终于理解清楚。这里以以下示例来进行讲解。
#include
这里的示例中有两点需要特别注意:
- 数据传输宏一定要在执行单元的判定结束后使用[2];
- 需要在不同宏之间传输的变量一定要设置为全局变量;
至此,对于节点与主机之间的数据传递问题就介绍完了。只要掌握以上概念,就能很轻松地实现数据在主机与节点之间的传递。
注:本文仅为个人研究笔记,难免会遇到错误。有任何问题请在评论中提出,不胜感激。
参考
- ^Fluent, A. N. S. Y. S. "15.0 ansys fluent udf manual." ANSYS, Inc. Canonsburg, PA, USA (2013). http://www.pmt.usp.br/academic/martoran/notasmodelosgrad/ANSYS%20Fluent%20UDF%20Manual.pdf
- ^How to use data tranfer marco in UDF https://www.cfd-online.com/Forums/fluent-udf/224502-make-new-data-external-txt-data-save-udm-2.html