[关闭]
@daidezhi 2016-05-23T17:19:09.000000Z 字数 3283 阅读 3551

OpenFOAM二维多面体网格准备

CFD OpenFOAM


1. OpenFOAM中的二维算例

基于OpenFOAM的求解器不支持平面网格系统,对于二维算例,求解器将前后面边界条件设置为空(empty)来模拟二维流动,因此,用于模拟二维流动的网格单元类型应为棱柱体,且在z方向上只有一层网格。

关于OpenFOAM中的多面体网格数据结构,详见CFD多面体网格数据结构—OpenFOAM


2. 需要使用的软件和工具包

OpenFOAM准备二维算例网格需要使用到的软件和工具包及其使用顺序如下表所示:

使用顺序 软件或工具 用途
1 Gmsh 生成Z方向上的三角棱柱型非结构网格,z方向网格层数为1
2 gmshToFoam Gmsh生成的*.msh网格文件转化为OpenFOAM网格文件
3 polyDualMesh 生成多面体网格,Z方向网格层数将变为2,需要进一步处理
4 setSetsubsetMesh 删除不需要的第2个网格层
5 combinePatchFaces 修复去层后的网格

3. 步骤一:生成三角棱柱型非结构网格

3.1 Gmsh文件结构

Gmsh具有如下文件结构:

$case
├──$case.geo
└──$case.msh

其中,$case.geo文件存储物理几何信息,$case.msh文件存储生成的网格数据。此外,Gmsh支持脚本化,因此可以直接使用文本编辑器编辑$case.geo文件。

3.2 物理域描述

以边长为1的正方形物理区域为例,定义上下左右边界名为topbottomleftright

3.3 建立几何模型

指定$case = square,首先在square.geo文件中输入以下内容,在xy平面上定义一个正方形面:

  1. //参数设置
  2. square_length = 1.0; //设置正方形边长[m]
  3. mesh_size = 0.05; //设置1D网格尺寸[m]
  4. z_thickness = 0.5; //设置z方向拉升厚度[m]
  5. //从左下角开始逆时针定义四个顶点
  6. Point(1) = {0, 0, 0, mesh_size};
  7. Point(2) = {square_length, 0, 0, mesh_size};
  8. Point(3) = {square_length, square_length, 0, mesh_size};
  9. Point(4) = {0, square_length, 0, mesh_size};
  10. //按照 下->右->上->左 的顺序定义四个边界
  11. Line(1) = {1, 2}; //下边界bottom
  12. Line(2) = {2, 3}; //右边界right
  13. Line(3) = {3, 4}; //上边界top
  14. Line(4) = {4, 1}; //左边界left
  15. //定义正方形面,标签6
  16. Line Loop(5) = {1, 2, 3, 4};
  17. Plane Surface(6) = {5};

接着使用命令Extrude将面6沿方向{0, 0, z_thickness}拉伸成三维实体,在square.geo文件接着添加如下内容:

  1. //数组out[]用于返回拉伸后的三维实体和各表面标签
  2. //按照上述顶点和边界定义顺序,数组`out[]`内容为
  3. // out[0] ==> front 面标签(拉伸面6的对立面)
  4. // out[1] ==> 拉伸实体标签
  5. // out[2] ==> bottom 面标签(对应Line Loop(5)中第一条边)
  6. // out[3] ==> right 面标签(对应Line Loop(5)中第二条边)
  7. // out[4] ==> top 面标签(对应Line Loop(5)中第三条边)
  8. // out[5] ==> left 面标签(对应Line Loop(5)中第四条边)
  9. out[] = Extrude {0, 0, z_thickness} {
  10. Surface{6}; //拉伸对象
  11. Layers{1}; //拉伸方向网格层数(不可省略)
  12. Recombine; //合并拉伸方向的三角形网格为四边形网格(不可省略)
  13. };

最后添加三维实体及其表面的物理描述,以便之后设置边界条件,在square.geo文件继续添加如下内容:

  1. Physical Volume("fluid") = out[1];
  2. Physical Surface("top") = out[4];
  3. Physical Surface("bottom") = out[2];
  4. Physical Surface("left") = out[5];
  5. Physical Surface("right") = out[3];
  6. Physical Surface("front") = out[0];
  7. Physical Surface("back") = {6};

GmshGUI中打开$case.geo文件,生成的三维几何实体如下图所示:
gmsh_geo

3.4 建立几何模型

生成的square.msh网格文件内容如下:

  1. $MeshFormat
  2. 2.2 0 8
  3. $EndMeshFormat
  4. $PhysicalNames
  5. 7
  6. 2 2 "top"
  7. 2 3 "bottom"
  8. 2 4 "left"
  9. 2 5 "right"
  10. 2 6 "front"
  11. 2 7 "back"
  12. 3 1 "fluid"
  13. $EndPhysicalNames
  14. $Nodes
  15. 1026
  16. 1 0 0 0
  17. 2 1 0 0
  18. 3 1 1 0
  19. ...
  20. 1024 0.1137459730184284 0.2238450025617717 0.5
  21. 1025 0.9346055322440794 0.6483585846695896 0.5
  22. 1026 0.06934220879300707 0.5534422329234058 0.5
  23. $EndNodes
  24. $Elements
  25. 2912
  26. 1 2 2 7 6 573 164 471
  27. 2 2 2 7 6 164 541 471
  28. 3 2 2 7 6 168 554 467
  29. ...
  30. 2910 6 2 1 1 413 557 591 846 990 1024
  31. 2911 6 2 1 1 386 566 592 819 999 1025
  32. 2912 6 2 1 1 396 572 593 829 1005 1026
  33. $EndElements

生成的三维网格单元类型为三角棱柱,如下图所示:
gmsh_mesh

4. 步骤二:转换Gmsh网格到OpenFOAM格式

进入目录square,然后使用工具gmshToFoam转换Gmsh网格到OpenFOAM格式:

  1. $ gmshToFoam square.msh
  2. $ checkMesh

转换后的网格如下图所示:
square_OpenFOAM_tri_mesh

至此,转换后路径\constant\polyMesh下的网格文件已经可以用于OpenFoam求解器。

5. 步骤三:转换三角棱柱网格到多边形棱柱网格

5.1 合并三角棱柱单元为多边形棱柱单元

进入目录square,然后使用工具polyDualMesh合并三角棱柱单元为多边形棱柱单元:

  1. $ polyDualMesh -overwrite 70

转换后的网格如下图所示:
square_OpenFOAM_dual_step_1

由上图我们可以看出,转换后的多面体网格在z方向上有两层网格,且边界处的网格具有不规则的杂边需要修复。

5.2 删除多余网格层

使用工具setSetsubsetMesh执行网格层的删除操作,首先实用工具setSet将网格分解:

  1. $ setSet -batch splitMesh.setSet

其中,splitMesh.setSet为输入文件,其内容如下

  1. cellSet c0 new
  2. cellSet c0 invert
  3. 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将其重新定义到更新后的网格上:

  1. $ subsetMesh c0 -overwrite -patch front

删层后的网格如下图所示:
square_OpenFOAM_dual_step_2_front front 面

square_OpenFOAM_dual_step_2_back back 面

5.3 修复back面上的杂边

由上图我们可以看出,back面上还有杂边需要修复,使用工具combinePatchFaces修复网格:

  1. $ combinePatchFaces 180 -overwrite

修复后的网格back面如下图所示:
square_OpenFOAM_dual_step_3_back 修复后的back 面

最后得到的多边形棱柱体网格如下图所示:
square_OpenFOAM_dual_mesh

5.4 检查网格

使用工具checkMesh检查网格:

  1. $ checkMesh

输出如下信息,表示网格检查通过:
check_Mesh


感谢您的阅读,欢迎讨论和批评指正。

作者:戴得志
2016年5月23日

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注