前面我们介绍了 OpenFOAM 的一些基本用法,主要涉及了
- 方程内各项表达式与其代码之间的联系
- 方程离散的格式
- 求解的算法
- 收敛的条件
- 边界条件的设置
现在,我们主要来看看网格在 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
...
);
Tips
- 如果你的网格很复杂,点很多,不太容易记得准,你可以采用有规律的方式,比如上面的栗子,在正面有 40 个点,避免以后修改网格还需要重新加点进去,可以预留 10 个,背面从 50 开始,这样的话,就会有一定的余度,避免以后的工作量。多余的点只计入点的编号,不会在网格生成上有影响。
- 不建议大家手动生成 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