@daidezhi
2016-05-24T01:19:09.000000Z
字数 3283
阅读 3724
CFD
OpenFOAM
基于OpenFOAM
的求解器不支持平面网格系统,对于二维算例,求解器将前后面边界条件设置为空(empty
)来模拟二维流动,因此,用于模拟二维流动的网格单元类型应为棱柱体,且在z
方向上只有一层网格。
关于OpenFOAM
中的多面体网格数据结构,详见CFD多面体网格数据结构—OpenFOAM。
为OpenFOAM
准备二维算例网格需要使用到的软件和工具包及其使用顺序如下表所示:
使用顺序 | 软件或工具 | 用途 |
---|---|---|
1 | Gmsh | 生成Z 方向上的三角棱柱型非结构网格,z 方向网格层数为1 |
2 | gmshToFoam | 将Gmsh 生成的*.msh 网格文件转化为OpenFOAM 网格文件 |
3 | polyDualMesh | 生成多面体网格,Z 方向网格层数将变为2 ,需要进一步处理 |
4 | setSet和subsetMesh | 删除不需要的第2 个网格层 |
5 | combinePatchFaces | 修复去层后的网格 |
Gmsh
具有如下文件结构:
$case
├──
$case.geo
└──
$case.msh
其中,$case.geo
文件存储物理几何信息,$case.msh
文件存储生成的网格数据。此外,Gmsh
支持脚本化,因此可以直接使用文本编辑器编辑$case.geo
文件。
以边长为1的正方形物理区域为例,定义上下左右边界名为top
,bottom
,left
和right
。
指定$case = square
,首先在square.geo
文件中输入以下内容,在xy
平面上定义一个正方形面:
//参数设置
square_length = 1.0; //设置正方形边长[m]
mesh_size = 0.05; //设置1D网格尺寸[m]
z_thickness = 0.5; //设置z方向拉升厚度[m]
//从左下角开始逆时针定义四个顶点
Point(1) = {0, 0, 0, mesh_size};
Point(2) = {square_length, 0, 0, mesh_size};
Point(3) = {square_length, square_length, 0, mesh_size};
Point(4) = {0, square_length, 0, mesh_size};
//按照 下->右->上->左 的顺序定义四个边界
Line(1) = {1, 2}; //下边界bottom
Line(2) = {2, 3}; //右边界right
Line(3) = {3, 4}; //上边界top
Line(4) = {4, 1}; //左边界left
//定义正方形面,标签6
Line Loop(5) = {1, 2, 3, 4};
Plane Surface(6) = {5};
接着使用命令Extrude
将面6
沿方向{0, 0, z_thickness}
拉伸成三维实体,在square.geo
文件接着添加如下内容:
//数组out[]用于返回拉伸后的三维实体和各表面标签
//按照上述顶点和边界定义顺序,数组`out[]`内容为
// out[0] ==> front 面标签(拉伸面6的对立面)
// out[1] ==> 拉伸实体标签
// out[2] ==> bottom 面标签(对应Line Loop(5)中第一条边)
// out[3] ==> right 面标签(对应Line Loop(5)中第二条边)
// out[4] ==> top 面标签(对应Line Loop(5)中第三条边)
// out[5] ==> left 面标签(对应Line Loop(5)中第四条边)
out[] = Extrude {0, 0, z_thickness} {
Surface{6}; //拉伸对象
Layers{1}; //拉伸方向网格层数(不可省略)
Recombine; //合并拉伸方向的三角形网格为四边形网格(不可省略)
};
最后添加三维实体及其表面的物理描述,以便之后设置边界条件,在square.geo
文件继续添加如下内容:
Physical Volume("fluid") = out[1];
Physical Surface("top") = out[4];
Physical Surface("bottom") = out[2];
Physical Surface("left") = out[5];
Physical Surface("right") = out[3];
Physical Surface("front") = out[0];
Physical Surface("back") = {6};
在Gmsh
GUI中打开$case.geo
文件,生成的三维几何实体如下图所示:
生成的square.msh
网格文件内容如下:
$MeshFormat
2.2 0 8
$EndMeshFormat
$PhysicalNames
7
2 2 "top"
2 3 "bottom"
2 4 "left"
2 5 "right"
2 6 "front"
2 7 "back"
3 1 "fluid"
$EndPhysicalNames
$Nodes
1026
1 0 0 0
2 1 0 0
3 1 1 0
...
1024 0.1137459730184284 0.2238450025617717 0.5
1025 0.9346055322440794 0.6483585846695896 0.5
1026 0.06934220879300707 0.5534422329234058 0.5
$EndNodes
$Elements
2912
1 2 2 7 6 573 164 471
2 2 2 7 6 164 541 471
3 2 2 7 6 168 554 467
...
2910 6 2 1 1 413 557 591 846 990 1024
2911 6 2 1 1 386 566 592 819 999 1025
2912 6 2 1 1 396 572 593 829 1005 1026
$EndElements
生成的三维网格单元类型为三角棱柱,如下图所示:
进入目录square
,然后使用工具gmshToFoam
转换Gmsh
网格到OpenFOAM
格式:
$ gmshToFoam square.msh
$ checkMesh
转换后的网格如下图所示:
至此,转换后路径\constant\polyMesh
下的网格文件已经可以用于OpenFoam
求解器。
进入目录square
,然后使用工具polyDualMesh
合并三角棱柱单元为多边形棱柱单元:
$ polyDualMesh -overwrite 70
转换后的网格如下图所示:
由上图我们可以看出,转换后的多面体网格在z
方向上有两层网格,且边界处的网格具有不规则的杂边需要修复。
使用工具setSet
和subsetMesh
执行网格层的删除操作,首先实用工具setSet
将网格分解:
$ setSet -batch splitMesh.setSet
其中,splitMesh.setSet
为输入文件,其内容如下
cellSet c0 new
cellSet c0 invert
cellSet c0 delete boxToCell (0.0 0.0 0.25) (1.0 1.0 0.5)
最后的boxToCell (0.0 0.0 0.25) (1.0 1.0 0.5)
用于标记删除网格的空间区域。
由于front
面在执行上述操作时已经删除,因此需要使用工具subsetMesh
将其重新定义到更新后的网格上:
$ subsetMesh c0 -overwrite -patch front
删层后的网格如下图所示:
front 面
back 面
由上图我们可以看出,back
面上还有杂边需要修复,使用工具combinePatchFaces
修复网格:
$ combinePatchFaces 180 -overwrite
修复后的网格back
面如下图所示:
修复后的back 面
最后得到的多边形棱柱体网格如下图所示:
使用工具checkMesh
检查网格:
$ checkMesh
输出如下信息,表示网格检查通过:
感谢您的阅读,欢迎讨论和批评指正。
作者:戴得志
2016年5月23日