首页/文章/ 详情

OpenFOAM|10 并行计算

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

本文描述在OpenFOAM中使用并行计算的一些问题。

1 查看CPU信息

当要计算的问题规模较大时,通常需要采用多CPU并行计算以加快计算。在进行并行计算之前,可以利用命令lscpu查看本机的处理器信息。

如下图所示列出了本机的CPU信息。

其中比较重要的信息包括:

  • CPU(s):列出了本机的逻辑CPU总数,如上图所示本机CPU共有24核
  • Thread(s)per core:每核线程数。关闭超线程技术后,该参数为1;开启了超线程技术后,该参数通常大于1。
  • Core(s) per socket:每个CPU的核数。如上图所示单颗CPU为12核
  • Socket(s):CPU的数量。如上图所示本机上安装了2个CPU

在计算过程中,最重要的信息是可以调用的最大CPU数量。如上图所示的计算机,能调用的最大CPU数量为24。

在Windows操作系统下,可以在任务管理器中查看当前CPU信息。如下图所示。

CPU中的超线程技术(Hyper Threaded)并不能对OpenFOAM的求解计算产生帮助,该技术主要是为了提高CPU的多任务处理能力的,因此一般建议在进行计算之前,关闭CPU的超线程技术。使用超线程的虚拟内核有时会降低计算速度。

并行计算通常有两种形式:

  • 共享内存体系,常见于工作站和便携式计算机
  • 分布式内存体系,常见于计算集群和超级计算机

下面是共享内存体系示意图:

共享内存体系

下面为分布式内存体系示意图:

2 OpenFOAM中的并行计算

2.1 基本介绍

OpenFOAM中的并行计算具备以下特点:

  • 应用程序通常不需要并行特定的编码。并行编程实现对用户是隐藏的
  • 为了并行运行,您需要在系统中安装 MPI 库
  • 大多数应用程序和实用程序可以并行运行
  • 如果编写新的解算器,它将是并行的(大多数时候)
  • 已经能够在多达15000个处理器上并行运行
  • 现在可以使用单个或多个GPU运行OpenFOAM

在OpenFOAM中并行计算,需要做以下一些工作;

  • 分解计算区域。通常使用工具程序decomposePar对计算区域进行分解,该工具需要使用字典文件decomposeParDict
  • 在处理器或计算节点之间分配作业。OpenFOAM通过使用MPI实现这一功能,每个处理器在分配给其的计算区域中单独运行求解
  • 重建计算区域。计算完毕后通常需要使用工具reconstrucPar完成这一工作。该工具无需任何的字典文件

2.2 区域分解

计算区域分解需要使用工具decomposePar及配套字典文件decomposePartDict来完成。

在使用的过程中,可以在case目录中使用命令foamGet decomposeParDict得到一个字典文件,该文件自动被放置到system文件夹中,如下图所示操作。

该字典文件内容如下所示。

FoamFile
{
   version     2.0;
   format      ascii;
   class       dictionary;
   object      decomposeParDict;
}
// * * * * * * * * * * * * * * * * * * * //
// 指定参与计算的CPU数量,也是区域被分解的数量
numberOfSubdomains  8;

/* 可选的方法包括simple、hierarchincal、scotch、metis、
manulal、multiLevel、structured等, 这里推荐使用scotch方法,
该方法仅需要指定CPU数量即可。这里使用的是hierarchical方法,
需要指定各个方向分解的数量*/

method              hierarchical;

simpleCoeffs
{
   n               (4 2 1); // 数量乘积等于numberOfSubdomains
   delta           0.001;
}

hierarchicalCoeffs
{
   n               (4 2 1); // 数量乘积等于numberOfSubdomains
   delta           0.001;
   order           xyz;
}

更多关于区域分解方法的介绍,可以参阅源代码$WM_PROJECT_DIR/src/parallel/decompose/

decomposePar命令无需任何参数,直接输入命令即可:

decomposePar

利用decomposePar可以将计算区域分解成多个子区域,如下图所示。

在每个处理器目录内,都会存储网格信息、边界条件、初始条件以及该处理器计算结果数据。

2.3 并行运行

网格分解后,就可以使用MPI进行并行运行。运行命令形式为:

mpirun -np <NPROCS> <application/utility> -parallel

其中:

  • np:为CPU的数量,必须与decomposeParDict文件中指定的参数numberOfSubdomains保持一致
  • application/utility:应用程序或工具名称
  • -parallel:并行运行标识,注意使用中不要忘记添加此标识

2.4 区域组合

当并行计算完毕后,可以使用命令reconstructPar将分散在各处理器目录下的数据收集汇总在一起。

这个命令很简单,不需要任何的参数:

reconstructPar

区域数据组合完毕后,即可进行后处理。

注意:区域组合非常消耗计算资源,且该命令无法在并行模式下运行。

另一种替代方案为不使用reconstructPar,而在使用paraFoam时带上参数-builtin,即使用下面的命令:

paraFoam -builtin

启动后在paraView中选择Case Type为Decomposed Case

还有第三种处理方式。在每一个处理器文件夹中创建文件processorN.foam文件(这里的N为处理器编号),然后启动paraFoam并加载每一个processorN.foam文件。

注意:decomposeParreconstructPar无法在并行模式下运行,因此在进行此类操作时,确保操作主机有足够多的内存,否则对于大规模问题容易发生死机。

在OpenFOAM的求解器与工具程序中,有一些程序不支持并行计算,这可以使用下面的命令进行查找:

find $WM_PROJECT_DIR -type f | xargs grep -sl 'noParallel'

从返回的搜索结果中可以看到那些程序无法使用并行运行。

如最常用的工具decomposePar与reconstructPar无法使用并行,网格生成工具blockMesh也无法以并行模式运行。在使用这些程序时,确保计算机上有足够的计算资源。


网格处理仿真体系OpenFOAM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2020-11-01
最近编辑:4年前
CFD之道
博士 | 教师 探讨CFD职场生活,闲谈CFD里外
获赞 2566粉丝 11300文章 734课程 27
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈