最近在进行计算的时候,为了提高并行效率,我决定手动进行OpenFOAM并行网格的划分。一般来说,提高并行效率可以从两个方面着手:
- 使每个CPU负担的网格数量尽可能相等,避免出现限制计算的短板。
- 使每个CPU负担的网格之间的公用面尽可能少,减少CPU之间的信息交互。
一般来说,如果网格比较简单,可以轻易使用simple方法划分,如果网格比较复杂,可以用scotch方法划分(关于各划分方法可以查看这篇文章)。但是对于一个几何结构比较简单但是网格分布不均匀的网格,使用simple和scotch都不太好获得比较好的划分结果,因此我决定自己进行手动划分。
网上关于手动划分并行区域的教程有很多,主要可以参考:
CFD中国帖子1
CFD中国帖子2
xiaopingqiu的博客文章
CFDonline帖子
通过阅读以上资料我们可以获得手动分区的一般步骤,但这些资料在一些关键步骤上却说的不是很明白,按照这些教程在OF7环境下无法实现较大网格量的手动分解。经过一段时间的摸索,我找到一种行之有效的实现方法:
1. 手动划分基本原理
为了实现手动并行区域的划分,我们首先需要在/system/decomposeParDict中将划分方式修改为manual
,之后需要在manualCoeffs
中指定划分区域的数据文件。关于该数据文件,我们可以在OpenFOAM主文件夹中搜寻“manualDecomposition”,得到一个范例文件:
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 7
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class labelList;
location "constant";
object cellDecomposition;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
400
(
0
0
...
...
0
0
)
// ************************************************************************* //
这是一个labelList类型的文件,可以看到其中最主要的信息是中间按照网格ID排列的一些列labe值,0就代表我们将其划分到processor0号CPU中,以此类推。我们要做的最主要工作就是生成一个这样的文件。