@daidezhi
2016-05-23T17:19:09.000000Z
字数 3283
阅读 4753
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}; //下边界bottomLine(2) = {2, 3}; //右边界rightLine(3) = {3, 4}; //上边界topLine(4) = {4, 1}; //左边界left//定义正方形面,标签6Line 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};
在GmshGUI中打开$case.geo文件,生成的三维几何实体如下图所示:

生成的square.msh网格文件内容如下:
$MeshFormat2.2 0 8$EndMeshFormat$PhysicalNames72 2 "top"2 3 "bottom"2 4 "left"2 5 "right"2 6 "front"2 7 "back"3 1 "fluid"$EndPhysicalNames$Nodes10261 0 0 02 1 0 03 1 1 0...1024 0.1137459730184284 0.2238450025617717 0.51025 0.9346055322440794 0.6483585846695896 0.51026 0.06934220879300707 0.5534422329234058 0.5$EndNodes$Elements29121 2 2 7 6 573 164 4712 2 2 7 6 164 541 4713 2 2 7 6 168 554 467...2910 6 2 1 1 413 557 591 846 990 10242911 6 2 1 1 386 566 592 819 999 10252912 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 newcellSet c0 invertcellSet 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日