本文描述在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 -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文件。
注意:decomposePar
与reconstructPar
无法在并行模式下运行,因此在进行此类操作时,确保操作主机有足够多的内存,否则对于大规模问题容易发生死机。
在OpenFOAM的求解器与工具程序中,有一些程序不支持并行计算,这可以使用下面的命令进行查找:
find $WM_PROJECT_DIR -type f | xargs grep -sl 'noParallel'
从返回的搜索结果中可以看到那些程序无法使用并行运行。
如最常用的工具decomposePar与reconstructPar
无法使用并行,网格生成工具blockMesh
也无法以并行模式运行。在使用这些程序时,确保计算机上有足够的计算资源。
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册