OpenFOAM初探(二)


blockMesh命令

blockMesh 是OpenFOAM中最基本的网格生成器之一,依赖于字典文件blockMeshDict。该程序以块(block)的思想来构造六面体(hexahedron)网格,类似于ICEM的结构化网格功能。blockMesh的主函数代码位于 /applications/utilities/mesh/generation/blockMesh/blockMesh.C 。关于该功能的详细介绍可以查阅Mesh generation with blockMesh

用法(Usage):

blockMesh [OPTION]

选项(Options):

-case <dir> 指定案例所在目录,若缺省,则为当前路径。

-dict <filename> 从指定路径读取blockMeshDict。

-region <name> 只生成指定区域的网格。

-blockTopology 将块的边缘和中心输出为.obj文件,以便进行可视化。

-noFunctionObjects 跳过functionObjects的执行

字典文件的书写

blockMesh 指令依赖于字典文件blockMeshDict,该字典文件可位于

  • system/blockMeshDict
  • system/<region>/blockMeshDict
  • constant/polyMesh/blockMeshDict
  • constant/<region>/polyMesh/blockMeshDict

字典文件的内容包括:

文件头(File Header)

文件头用于申明字典类型。


FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      blockMeshDict;
}

尺度缩放

关键词 convertToMeters 用于定义几何缩放尺度,一般均转换为国际单位-米。

convertToMeters 1.0;

顶点定义

顶点关键词用于指定block顶点坐标,顶点编号从0开始。

vertices
(
    (0. 0. 0.)
    (1. 0. 0.)
);

块定义

block是用八个顶点定义的六面体。第一个括号内书写八个顶点编号;第二个括号内书写x,y,z三个方向上的网格节点总数;simpleGrading后的括号可简单地定义节点分布律,表示x,y,z三个方向上的梯度率(Grading Ratio, 第一个网格尺寸/最后一个网格尺寸)(Fig. 1)。


blocks
(
    hex (0 1 2 3 4 5 6 7) (10 10 10) simpleGrading (2 2 1)
);

blockMesh 同样也可以定义比较复杂的节点分布律。以下展示的脚本中,对block的y方向定义了3个子block,对每个子block施加不同的节点分布律。每个子括号的第一个数字代表子block在该方向上的几何尺寸权重,第二个数字代表子block在该方向上的节点数量权重,第三个数字代表梯度率。


blocks
(
    hex (0 1 2 3 4 5 6 7) (10 10 10) 
    simpleGrading ( 1
                    ((2 2 0.5)(3 6 0.2)(1 2 0.6))
                    1
                  )
);

曲边

此部分用于定义block中的曲线边缘,如几何中没有曲线可以将括号中内容缺省。Mesh generation with blockMesh中有比较详细的介绍,此处不表。

edges
(
    arc 1 5 (1.0 0.0 0.5)
);

边界定义

边界的定义是CFD分析的重要步骤。其结构包括:

  • 说明边界名称 —— inlet, outlet, any_name_u_like…
  • 边界类型 —— patch表示后续需要赋予明确数值的边界,比如出入口;wall当然就是壁面;symmetry就是对称边界;其余定义尚在探索。
  • 几何面 —— 表示该边界包含的block面。

对于未定义的所有外露面,blockMesh 在执行过程中会有警告,并将这些面合并成一个集合。

boundary               // keyword
    (
        inlet              // patch name
        {
            type patch;    // patch type for patch 0
            faces
            (
                (0 4 7 3)  // block face in this patch
            );
        }                  // end of 0th patch definition
        outlet             // patch name
        {
            type patch;    // patch type for patch 1
            faces
            (
                (1 2 6 5)
            );
        }
        walls
        {
            type wall;
            faces
            (
                (0 1 5 4)
                (0 3 2 1)
                (3 7 6 2)
                (4 5 6 7)
            );
        }
    );

合并表面对

用于把两个不完全共节点的面熔接,反正对我而言没啥用,缺省。具体操作依然可见Mesh generation with blockMesh(没错我就是这么懒:-))。

mergePatchPairs
(
);

宏语法和动态编译(参数化)

对于超过1个blcok的字典文件,顶点数超过了10个,后期修改简直要了懒人们的命。万幸的是,OpenFOAM的字典文件提供宏语法,比如在开头申明 para 1.; ,那在后续定义数字类参数时就可以用 $para 来表示。而对于需要进行数学计算的部分,可以采用 #calc 植入简单的计算语句:

Y        5;
Y_left   #calc "-0.5*$Y";

对于更复杂的需求,当然也可以直接植入C++代码片段。当然放这写显得杀鸡焉用牛刀,先给个链接

总结

blockMesh 从本质上讲就是一个脚本化的结构化网格生成器,对于一些简单模型,免去了在GUI上点来点去的麻烦,参数化的支持也能一定程度上改善几何参数化分析时的前处理效率。同时, blockMesh 在很多算例中都用于生成一个大流域,以进行下一步 sanppyHexMesh 的精细化非结构网格处理。


文章作者: xiaoxiao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 xiaoxiao !
  目录