本文描述在OpenFOAM中使用并行计算的一些问题。
当要计算的问题规模较大时,通常需要采用多CPU并行计算以加快计算。在进行并行计算之前,可以利用命令lscpu
查看本机的处理器信息。
如下图所示列出了本机的CPU信息。
其中比较重要的信息包括:
在计算过程中,最重要的信息是可以调用的最大CPU数量。如上图所示的计算机,能调用的最大CPU数量为24。
在Windows操作系统下,可以在任务管理器中查看当前CPU信息。如下图所示。
CPU中的超线程技术(Hyper Threaded)并不能对OpenFOAM的求解计算产生帮助,该技术主要是为了提高CPU的多任务处理能力的,因此一般建议在进行计算之前,关闭CPU的超线程技术。使用超线程的虚拟内核有时会降低计算速度。
并行计算通常有两种形式:
下面是共享内存体系示意图:
共享内存体系
下面为分布式内存体系示意图:
OpenFOAM中的并行计算具备以下特点:
在OpenFOAM中并行计算,需要做以下一些工作;
decomposePar
对计算区域进行分解,该工具需要使用字典文件decomposeParDict
reconstrucPar
完成这一工作。该工具无需任何的字典文件计算区域分解需要使用工具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
可以将计算区域分解成多个子区域,如下图所示。
在每个处理器目录内,都会存储网格信息、边界条件、初始条件以及该处理器计算结果数据。
网格分解后,就可以使用MPI进行并行运行。运行命令形式为:
mpirun -np <NPROCS> <application/utility> -parallel
其中:
np
:为CPU的数量,必须与decomposeParDict文件中指定的参数numberOfSubdomains
保持一致application/utility
:应用程序或工具名称-parallel
:并行运行标识,注意使用中不要忘记添加此标识当并行计算完毕后,可以使用命令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
也无法以并行模式运行。在使用这些程序时,确保计算机上有足够的计算资源。