15_mesh
Important
访问 https://aerosand.cn 以获取最近更新。
0. 前言
除了 setRootCase.H 和 createTime.H,还有一个必然会出现的头文件 createMesh.H。
本文主要讨论
- 了解和网格相关的类
- 理解 createMesh.H 头文件
- 练习网格相关的方法
- 编译运行 mesh 项目
1. 项目准备
终端输入命令,建立项目
ofsp
foamNewApp ofsp_15_mesh
cd ofsp_15_mesh
cp -r $FOAM_TUTORIALS/incompressible/icoFoam/cavity/cavity debug_case
code .测试初始求解器,提供脚本和说明。
2. mesh
我们先不看 createMesh.H 的源代码,先从应用的需求切入,也就是,我们需要基于具体的 case 建立的计算用的 mesh ,这个 mesh 当然也有自己的数据(包括 point, face 等等),也要有自己的方法(包括返回点列,返回面心等等)。
2.1. primitiveMesh
API 页面 https://api.openfoam.com/2506/classFoam_1_1primitiveMesh.html
OpenFOAM 提供了基于几何要素的 primitiveMesh 类。
终端输入命令,查阅 primitiveMesh 类的声明
find $FOAM_SRC -iname primitiveMesh.H可以看到该 primitiveMesh 类并不继承其他类
我们大概挑几处代码作为切入点简单了解一下 primitiveMesh 类。
| |
通过这个构造汉书可以看到 primitiveMesh 类从基本的几何要素,点、面、单元构造对象。
几何要素,点、面、单元由 blockMesh 生成,或者由第三方网格软件生成再转换成 OpenFOAM 格式。无论如何,点、面、单元被生成在 case/constant/polyMesh/ 文件夹下。这里的几何数据只是数据而已,不具备任何的方法。
注意此类是纯虚类(抽象类),无法直接实体化。
2.2. polyMesh
在 primitiveMesh 纯虚类(抽象类)的基础上,OpenFOAM 又提供派生的 polyMesh 类。polyMesh 类基本上还是几何拓扑的,此外提供有一些几何拓扑的方法。
API 页面 https://api.openfoam.com/2506/classFoam_1_1polyMesh.html
终端输入命令,查阅 polyMesh 的声明
find $FOAM_SRC -iname polyMesh.H我们大概挑几处代码作为切入点简单了解一下 polyMesh 类。
| |
使用 polyMesh 类,我们可以构造 mesh 对象,并进行一些网格操作。
对于几何要素,可以封装起来方便后续使用。
OpenFOAM 提供 IOobject 类来封装接入这些数据。
API 页面 https://api.openfoam.com/2506/classFoam_1_1IOobject.html
终端输入命令,查找 IOobject.H
find $FOAM_SRC -iname IOobject.H大概挑几处代码作为切入点简单了解一下 IOobject 类。
| |
修改主源码如下
| |
有读者可能会注意到 IOobject 的构造是基于 runTime 的,而不是直接基于 constant/polyMesh 的。回忆上篇讨论中 Time 类的查找机制,可以知道 Time 类具有复杂的查找机制。
Tip
这里涉及到源代码的实现细节,目前阶段不用深究也不建议过渡深究。
编译运行
终端输出信息如下
Create time
Max cell centre: (0.0975 0.0975 0.005)
Max cell volumes: 2.5e-07
Max cell face cetres: (0.1 0.1 0.01)
ExecutionTime = 0 s ClockTime = 0 s
End2.3. fvMesh
OpenFOAM 在 polyMesh 类的基础上,添加了有限体积的方法,进而派生出了 fvMesh 类。
API 页面 https://api.openfoam.com/2506/classFoam_1_1fvMesh.html
终端输入命令,查阅 fvMesh 类的声明
find $FOAM_SRC -iname fvMesh.H大概挑几处代码作为切入点简单了解一下 fvMesh 类。
| |
使用 fvMesh 类,我们可以构造 mesh 对象,并进行一些操作,包括网格的操作。
主源码修改为
| |
编译运行
终端输出信息如下
Create time
Max cell centre: max(C) [0 1 0 0 0 0 0] (0.1 0.1 0.005)
Max cell volumes: max(V) [0 3 0 0 0 0 0] 2.5e-07
Max cell face cetres: max(Cf) [0 1 0 0 0 0 0] (0.1 0.1 0.005)
ExecutionTime = 0 s ClockTime = 0 s
End读者也可以把 max 函数去掉重新编译查看结果。基于这三个子类和父类的讨论,我们可以想见 createMesh.H 主要是什么代码语句。
3. createMesh.H
API 页面 https://api.openfoam.com/2506/createMesh_8H.html
终端输入命令,查阅此头文件
find $FOAM_SRC -iname createMesh.H为了方便理解,我们查阅一下 OpenFOAM 2.0x 版本的代码,
Github 仓库文件链接如下 https://github.com/OpenFOAM/OpenFOAM-2.0.x/blob/master/src/OpenFOAM/include/createMesh.H
代码内容如下
| |
可以看到,这和我们在钱文写的代码一样。
现代版本的代码如下
| |
两个版本的代码对比来看,我们大概可以理解该文件的主要内容是什么,以及现代版本增加了哪些机制。
4. 网格信息
我们可以综合上述讨论,在项目中使用网格信息。
主源码修改如下
| |
为了方便结果显示,修改调试算例 debug_case/system/blockMeshDict 中设置的网格划分数量
| |
编译运行
终端输出信息如下
Create time
Create mesh for time = 0
Mesh directory: "polyMesh"
Number of points: 18
( 0.000000e+00, 0.000000e+00, 0.000000e+00)
( 5.000000e-02, 0.000000e+00, 0.000000e+00)
( 1.000000e-01, 0.000000e+00, 0.000000e+00)
Number of faces: 20
( 1 4 13 10)
( 3 12 13 4)
( 4 13 14 5)
( 4 7 16 13)
( 6 15 16 7)
( 7 16 17 8)
( 0 9 12 3)
( 3 12 15 6)
( 2 5 14 11)
( 5 8 17 14)
( 0 1 10 9)
( 1 2 11 10)
( 0 3 4 1)
( 3 6 7 4)
( 1 4 5 2)
( 4 7 8 5)
( 9 10 13 12)
( 12 13 16 15)
( 10 11 14 13)
( 13 14 17 16)
Number of face owner: 20
0
0
1
2
2
3
0
2
1
3
0
1
0
2
1
3
0
2
1
3
Number of face neighbour: 4
1
2
3
3
Number of boundary mesh: 3
Boundary name: movingWall Boundary type: wall
Boundary name: fixedWalls Boundary type: wall
Boundary name: frontAndBack Boundary type: empty
Bounding box: (0.000000e+00 0.000000e+00 0.000000e+00) (1.000000e-01 1.000000e-01 1.000000e-02)
Mesh volume: 1.000000e-04
ExecutionTime = 0.000000e+00 s ClockTime = 0.000000e+00 s
End5. 网格方法
我们来练习使用更多的网格方法(成员方法)
主源码修改为
| |
编译运行
终端输出信息如下
Create time
Create mesh for time = 0
Time : 0
Number of mesh cells : 4
Number of internal faces: 4
Cell 0 with center at (0.025 0.025 0.005)
Internal face 0 with center at (0.05 0.025 0.005) with owner cell 0 and neighbour cell 1
Patch 0 is movingWall with 2 faces. Start from face 4
Patch 1 is fixedWalls with 6 faces. Start from face 6
Patch 2 is frontAndBack with 0 faces. Start from face 12
Patch 0
its face 0 adjacent to cell 2
its normal vector (0 0.0005 0)
its surface area 0.0005
Patch 1
its face 0 adjacent to cell 0
its normal vector (-0.0005 0 0)
its surface area 0.0005
Patch 2
its face 0 adjacent to cell 0
its normal vector (0 0 -0.0025)
its surface area 0.0025
Internal face 0 with centre at (0.05 0.025 0.005) has 4 vertices: (0.05 0 0) (0.05 0.05 0) (0.05 0.05 0.01) (0.05 0 0.01)
Patch 2: frontAndBack is empty.
Retrived patch movingWall at index 0 using its name only.
ExecutionTime = 0.01 s ClockTime = 0 s
End6. 小结
通过讨论,我们简单认识了和网格相关的类,以及 createMesh.H 到底是什么。
到此为止,必备头文件 setRootCase.H,createTime.H,createMesh.H 全部已经讨论清楚。
本文完成讨论
- 了解和网格相关的类
- 理解 createMesh.H 头文件
- 练习网格相关的方法
- 编译运行 mesh 项目
支持我们
Tip
希望这里的分享可以对坚持、热爱又勇敢的您有所帮助。
如果这里的分享对您有帮助,您的评论、转发和赞助将对本系列以及后续其他系列的更新、勘误、迭代和完善都有很大的意义,这些行动也会为后来的新同学的学习有很大的助益。
赞助打赏时的信息和留言将用于展示和感谢。
