Code of the Week #11: blockMeshDict

前面我们介绍了 OpenFOAM 的一些基本用法,主要涉及了

  1. 方程内各项表达式与其代码之间的联系
  2. 方程离散的格式
  3. 求解的算法
  4. 收敛的条件
  5. 边界条件的设置

现在,我们主要来看看网格在 OpenFOAM 中如何处理,有没有什么好的方法。在 OpenFOAM 中,自带的网格生成工具有两个,一个是 blockMesh,另一个是 snappyHexMesh。本期节目我们主要讲讲 blockMesh 的使用。

blockMesh 从字面意思上看就是根据划分的块来生成网格。其定义的文件位于 case 文件夹下的 constant/polyMesh/blockMeshDict,新的版本如 5.x 以上则位于 system/blockMeshDict。基本形式如下:

convertToMeters 1e-6; // micrometer 单位转换

vertices // 关键字,指以下()中的为顶点
(
    (0.0 0.0 0.0)// 顶点坐标,(x y z),编号遵从 C++ 规则,从 0 开始
);

blocks // 指以下 () 中定义的是块
(
    hex (0 51 53 2 0 1 3 2) ref (8 50 1) simpleGrading (0.5 1 1) // 以顶点某一顺序定义的 block 及其网格
);

edges // 指以下 () 中定义的是边
(
);

boundary // 指以下 () 中定义的是边界面
(
    back // 边界名为 back
    {
        type wedge; // 边界类型
        faces // 面
        (
            ( 0 2 53 51 ) // 面的顶点
            ( 2 5 56 53 )
        );
    }
);

Vertex 指定

以下为 vertices() 部分的示例:

vertices // 关键字,指以下 () 中的为顶点
(
    (0.0 0.0 0.0)// 顶点坐标,(x y z),编号遵从 C++ 规则,从 0 开始
    (124.88 0.0 5.4524)// vertex 1
    (0.0 1000.0 0.0)// vertex 2
    (124.88 1000.0 5.4524)// vertex 3
    (174.83 1000.0 7.6334)// vertex 4
    (0.0 1200.0 0.0)// vertex 5
    (124.88 1200.0 5.4524)// vertex 6
    (249.76 1200.0 10.905)// vertex 7
    ...
    (0 0 0)
    (124.88 0.0 -5.4524)// vertex 51,这一个顶点与 #1 点是相对应的,只是 z 不同
    (0.0 1000.0 -0.0)// vertex 52, 这一个与 #2 的 z 相反,以下以此类推
    (124.88 1000.0 -5.4524)// vertex 53
    (174.83 1000.0 -7.6334)// vertex 54
    (0.0 1200.0 -0.0)// vertex 55
    (124.88 1200.0 -5.4524)// vertex 56
    (249.76 1200.0 -10.905)// vertex 57
    ...
);

:bell: Tips

  1. 如果你的网格很复杂,点很多,不太容易记得准,你可以采用有规律的方式,比如上面的栗子,在正面有 40 个点,避免以后修改网格还需要重新加点进去,可以预留 10 个,背面从 50 开始,这样的话,就会有一定的余度,避免以后的工作量。多余的点只计入点的编号,不会在网格生成上有影响。
  2. 不建议大家手动生成 block 顶点,容易出错,也不利于参数化。可以利用 python 或 excel 等工具来做。

blocks 部分

blocks
(
    hex (0 51 53 2 0 1 3 2) ref (8 50 1) simpleGrading (0.5 1 1)
    // 以 () 内的顶点为 block ,从 (0, 51) 两个顶点间的网格数为 8,
    // (51,53) 间的网格数为 50,(51, 1) 两个顶点间的网格数为 1,
    // 三个方向上,最终一个网格的大小与最前一个网格的大小比例分别是 0.5, 1, 1.
    // simpleGrading () 规定了网格的疏密比例。
    // ref 是生成网格后,这个 block 的 cellZone 名称为 ref,
    // 可以多个 blocks 指定为同一 cellZone.
    // 可以看到,我们用了两个重复的点,分别是 0 和 2,
    hex (2 53 56 5 2 3 6 5) noCon (8 8 1) simpleGrading (0.5 2 1)
);

edges (); 用于定义圆弧或样条曲线或其他,比如,定义 某两点间的连线为圆弧

edges
(
    arc 19 20 (62.4405 1290.016 2.726)
    // arc 表示圆弧,19 20 分别表示两个顶点的编号,定义在 vertices 里面的,
    // (62.4405 1290.016 2.726) 是 19 20 两个点之间的圆弧上的任一点的坐标,(x y z)
    arc 16 23 (1386.18 2218.76 60.5219)
    ...
);

如果有多个 blocks ,每个 blocks 之间的连接:当各个方向上的网格都相同,这样最好,会自动形成内部网格 (面)。如果不同的话,就涉及到 mergePatchPairs,这个将另外讲解。

网格转换

OpenFOAM 还提供了其他可转换到 OpenFOAM 网格的转换工具:
– ansysToFoam
– chemkinToFoam
– fluentDataToFoam
– gambitToFoam
– ideasUnvToFoam
– mshToFoam
– plot3dToFoam
– smapToFoam
– starToFoam
– cfx4ToFoam
– fluent3DMeshToFoam
– fluentMeshToFoam
– gmshToFoam
– kivaToFoam
– netgenNeutralToFoam
– sammToFoam
– star4ToFoam
– tetgenToFoam