ofsp2024-04 网格类初步

ofsp2024-04 网格类初步
Created time
Jul 10, 2025 11:03 AM
type
status
date
slug
summary
tags
category
icon
password
Last edited time
Jul 10, 2025 11:03 AM
😀
前言: Preface:
 
参考:
感谢原作者们的无私引路和宝贵工作。
前置: OpenFOAM开发编程基础03 时间类初步 | 𝓐𝓮𝓻𝓸𝓼𝓪𝓷𝓭 (aerosand.cn)
建立本文的项目文件夹并进入

网格类方法

应用准备

脚本和说明

使用上一篇讨论相同脚本内容即可,略

mesh 是什么

我们先不看 createMesh.H 的源代码,先从应用的需求切入,也就是,我们需要基于具体的 case 建立的计算用的 mesh ,这个 mesh 当然也有自己的数据(包括 point, face 等等),也要有自己的方法(包括返回点列,返回面心等等)。

primitiveMesh

OpenFOAM 提供纯粹基于几何元素构造的 primitiveMesh 类。
通过 Doxygen 查找可以看到 primitiveMesh 不继承自任何其他类,它就是最基础的基类。
找到 primitiveMesh.H 并打开,我们看一下它提供的构造方法
可以看到 primitiveMesh 类从基本的点、面、单元构造对象。
点、面、单元由 blockMesh 生成,或者由第三方网格软件生成再转换成 OpenFOAM 格式。无论如何,点、面、单元被生成在 case/constant/polyMesh/ 文件夹下。注意,这里的几何数据只是数据而已,不具备任何的方法。
我们需要将这些离散数据封装到信息流中,以方便后续使用。
OpenFOAM 提供 IOobject 类来封装接入这些数据。
摘取 IOobject.H 中的一部分如下

polyMesh

primitiveMesh 类的基础上,OpenFOAM 又提供派生的 polyMesh 类。polyMesh 类基本上还是几何拓扑的,具有一些几何拓扑的方法。
摘取 polyMesh.H 的一部分如下
使用 polyMesh 类,我们可以构造 mesh 对象,并进行一些网格操作
例如 04_01_mesh.C 中写入
有读者可能会疑问 mesh 的构造为什么基于 time 文件夹而不是 polyMesh 子文件夹,毕竟网格的几何信息并不在 time 文件夹下(其实 time 类的相关定义有向后搜寻,是包括 mesh 信息的)。这里涉及到类的实现源代码,不用深究也不建议深究。
编译运行,结果如下

fvMesh

OpenFOAM 在 polyMesh 类的基础上,添加了有限体积的方法,进而派生出了 fvMesh 类。
看一下 fvMesh.H 中的代码片段
使用 fvMesh 类,我们可以构造 mesh 对象,并进行一些操作,包括网格的操作。
例如 04_01_mesh.C 中重新写入
编译运行,结果如下
读者可以把 max 函数去掉重新编译查看结果。基于这三个子类和父类的讨论,我们可以想见 createMesh.H 主要是什么代码语句。

createMesh.H

看一下和网格相关的头文件 createMesh.H
代码的主要内容简要摘抄如下
如果不使用指针,也可以像前文一样使用 fvMesh 直接创建 mesh

主源码

主源码正式内容如下
为了方便结果显示,修改调试算例 debug_case/system/blockMeshDict 中设置的网格划分数量

编译运行

结果如下

网格类使用示例

让我们尝试使用更多的网格类方法(成员函数)。

应用准备

脚本和说明

使用上节相同脚本内容即可,略

主源码

主源码如下

编译运行

结果如下

计算网格体积比

我们基于前面网格方法的讨论来尝试一个计算网格参数的应用,也许以后会用在求解器开发上。
代码来自 Tom Smith 讲义《programming with OpenFOAM》(见文首参考链接)

应用准备

脚本和说明

以后非特别说明,不再赘述。

主源码

主源码如下
编译运行,结果为

代码改进

List 类的 append 方法虽然方便,但是效率很低,因为每一次向 List 添加数据的时候,都要创建一个 n+1 大小的新 List ,将老数据拷贝过去,再加入新数据。在数据量很大的时候,每次添加新数据都有新建再复制的过程,效率非常低。
我们考虑到对于要处理的网格,因为网格确定,所以要计算的体积比总量也是确定的。可以提前声明一个固定大小的 List,分配好内存,后续只需要向其添加数据就行。
改进后主源码如下
编译运行结果如下
可以很明显看到运行时间从 0.13s 减少到了 0.06s,效率大大提高。

代码再改进

如果我们只是要获得最大体积比,那么其实我们不需要保存所有的体积比,保存体积比的最大值就够了。
主源码如下
编译运行结果如下
可以看到运行时间进一步减少,效率又提高了。

代码最终版

仅获得体积比还不够,我们可能希望知道测试算例的网格有多少超过了指定的体积比准则。
我们通过 OpenFOAM 的字典来接入体积比准测这一参数。
为测试算例提供字典 /userApp/debug_case/system/volumeRatioDict ,内容如下
我们约定
  • Properties 文件放在 /userApp/constant 文件夹下
  • Dict 文件放在 /userApp/system 文件夹下
主源码如下
编译运行,结果如下

小结

通过前面的几篇文章,OpenFOAM 应用的常见头文件 setRootCase.HcreateTime.HcreateMesh.H 已经尽可能在不过度深入的情况下进行了讨论。此外,我们也尝试讨论了一个基于离散网格的完整应用,不断改进的过程对我们以后开发自己的求解器也有一些启发。
除了主函参数、时间和离散网格,我们怎么创建以及计算控制方程方程中的物理量呢?
 
 
 
💡
欢迎留言讨论,反馈建议和意见,赞助打赏。 Feel free to leave comments, feedback, suggestions, opinions, and donations..
Alipay
Alipay
 
 
上一篇
ofsp2024-05 场初步
下一篇
ofsp2024-03 时间类初步
Loading...