fluent 命令流_【笔记】使用UDF进行Fluent并行计算时主机与节点之间的数据传递...

导言:在使用Fluent进行大规模并行计算时,难免会遇到主机与节点之间的需要数据传输的情况。FluentUDF使用手册中虽然提供了关于并行计算中的数据传输宏的定义与格式表述,但并没有给出相应的示例与详解。此外,在各平台也难以找到较为明晰的用法解释。本文将对Fluent应用UDF进行并行计算时的数据传输方式以及传输宏的使用方法进行详解。

1. Fluent 的并行计算架构简介

5637bfea46cc46c63f26c7acf1b473ca.png
图1. Fluent 并行计算架构示意图

在进行使用方法讲解前,有必要先了解 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中,提供了两种判断语句来表示代码的执行单元。

/**********************************************************************/
                       /* Compiler Directives */
/**********************************************************************/

#if RP_HOST
/* only host process is involved */
/* 这里写你想要运行在主机上的内容 */
#endif

#if RP_NODE
/* only compute nodes are involved */
/* 这里写你想要运行在节点上的内容 */
#endif

#if PARALLEL
/* both host and compute nodes are involved, but not serial */ 
/* equivalent to #if RP_HOST || RP_NODE */
/* 这里的内容会执行在主机和节点上,效果等同于 #if RP_HOST || RP_NODE */
#endif

或者也可以写成相反的形式如下(更常用)

/*********************************************************************/
             /* Negated forms that are more commonly used */
/*********************************************************************/
#if !RP_HOST
/* either serial or compute node process is involved */
/* 这里写你 不想 要运行在主机上的内容 */
#endif

#if !RP_NODE
/* either serial or host process is involved */
/* 这里写你 不想 要运行在节点上的内容 */
#endif

#if !PARALLEL
/* only serial process is involved */
/* 只在串行运算部分使用该部分代码 */
#endif

通过使用以上的区分形式,就能够让不同的代码在不同的主机上运行。在需要对全局变量进行控制,以及需要区分迭代计算部分与串行计算部分时,这一方法尤为重要。

但要注意的是,当采用这样的方法时,需要使用特定的宏才能实现数据在 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 表示需要传输的变量数目。需要注意的是,以这样的形式传输的变量不能是数组与字符串

若要传递数组和字符串则应该使用以下的形式:

/* 从节点传递数组或字符串到主机 */
/* string and array variables passed from compute node-0 to host */
char *string;
int string_length;
real vel[ND_ND];
node_to_host_string(string,string_length);
node_to_host_real(vel,ND_ND)

/* 从主机传递数组或字符串到节点 */
/* string and array variables passed from host to nodes */
char wall_name[]="wall-17";
int thread_ids[10] = {1,29,5,32,18,2,55,21,72,14};
host_to_node_string(wall_name,8); /* remember terminating NUL character */
host_to_node_int(thread_ids,10);

要注意的是,该方法需要定义数组或者字符串长度,且一次只能传递一个数据。

使用该方法实现数据传递时还需要注意一个语法上容易出错的地方。由于官方的 UDF Manual中并未展示该宏在其他宏内的完整使用方法,这一点笔者试错了很久才终于理解清楚。这里以以下示例来进行讲解。

#include <stdio.h>
#include <math.h>
#include "udf.h"
real v_mean;
real inflow_v;

DEFINE_SOURCE(Source, c, t, dS, eqn)
{
real v[ND_ND];

#if !RP_HOST
/* 这里写你 不想 要运行在主机上的内容 */
/* 例如:计算平均风速 */
v_mean = Calculate_mean_wind_speed(ND_ND);
# endif  /*!RP_HOST*/

/* 在运行机器判定外执行传输宏!!!!!!! */
node_to_host_real_1(v_mean);

}

DEFINE_EXECUTE_AT_END(execute_at_end)
{
real inflow_v;
#if RP_HOST

/* 这里写你 想要运行在主机上的内容 */
/* 控制器执行计算 */
inflow_v = inflow_controller(v_mean);

# endif  /*RP_HOST*/

/* 在运行机器判定外执行传输宏!!!!!!! */
host_to_node_double_1(inflow_v);

}

这里的示例中有两点需要特别注意:

  1. 数据传输宏一定要在执行单元的判定结束后使用[2]
  2. 需要在不同宏之间传输的变量一定要设置为全局变量;

至此,对于节点与主机之间的数据传递问题就介绍完了。只要掌握以上概念,就能很轻松地实现数据在主机与节点之间的传递。


注:本文仅为个人研究笔记,难免会遇到错误。有任何问题请在评论中提出,不胜感激。

参考

  1. ^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
  2. ^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
  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值