blockMesh 的新功能:multi/sectional grading in a block

从 OpenFOAM-2.3.x 的 “commit cf370883644ec59782be375041b2434eb3e2c4ed“ 开始,blockMesh 有了一项新功能:multi/sectional grading in a block。这项功能说起来很简单即可以在同一个block里面设置多个方向的大小渐变网格。举个例子,假设你想画一个简单的二维槽道流网格,你希望两边靠近壁面处的网格更密一点,而中心的网格稀疏一点。以前版本的 blockMesh 由于只支持让网格大小在某一个方向上渐变(通过设置 simpleGrading),要实现上述网格,你需要将整个槽道分成两个block,然后分别设置 simpleGrading。现在有了 “multi/sectional grading”以后,只需要一个block,并设置好simpleGrading便可实现了。下面解释一下新版 blockMesh 具体设置,并以一个二维方腔流例子来说明。

先来解释一下参数的含义,下面是我设置的一个二维方腔流算例的 blockMeshDict 文件的部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
vertices
(
(0 0 0)
(1 0 0)
(1 1 0)
(0 1 0)
(0 0 0.1)
(1 0 0.1)
(1 1 0.1)
(0 1 0.1)
);


blocks
(
hex (0 1 2 3 4 5 6 7) (100 100 1)
simpleGrading
(
((0.5 0.5 2) (0.5 0.5 0.5))
((0.5 0.5 2) (0.5 0.5 0.5))
1
)

);

跟前面版本的差别在于 simpleGrading 部分的参数更多了。下面解释一下多出来的参数的含义。首先,注意 simpleGrading 的参数仍然是分成三段,分别代表x,y,z方向的网格渐变设置。其中,x方向的渐变设置参数又分作两段:”(0.5 0.5 2)”和”(0.5 0.5 0.5)”,每一段均代表一个子 block,这个子 block 的网格参数由三个数字来确定。以”(0.5 0.5 2)” 为例,第一个”0.5” 表示该子 block 的尺度是总 block 的尺度的0.5倍;第二个”0.5”表示在这个子block里划分的网格总数占整个block的网格总数的一半;”2” 代表着网格渐变因子,这个跟以前的 blockMesh 的 simpleGrading 参数的含义一样。

了解了参数的含义,便可以推知上述 blockMeshDict 文件对应的网格了:二维方腔,x和y方向上各分为两个子 block,子 block 的尺度都是整个 block 的一半,且子 block 的网格渐变因子分别为 “2” 和 “0.5”。得到的网格如下:

整体

右上角局部放大图如下:
右上角局部放大

上述描述中有一个不是很严谨的地方,用下面这个例子来说明一下:

1
2
3
4
5
6
7
8
9
10
blocks
(
hex (0 1 2 3 4 5 6 7) (20 60 20)
simpleGrading
(
1
((2 3 4) (6 4 1) (2 3 0.25))
1
)

);

按照上文的描述,这个网格将在y方向上划分成3个子 block,其中第一个子 block 的尺度是整个 block 的2倍…等等,2倍?这怎么可能?实际情况是,blockMesh 会自动对参数进行归一化,第一个子 block 的尺度将是整个 block 的 2/(2+6+2)=0.2 倍,其余的依此类推。