了解OpenFOAM的道友都知道,OpenFOAM的文档写的是真的太过于简洁,以至于想要通过文档了解OpenFOAM变得非常困难。好在当前AI技术先进,从全局代码出发,对整个代码架构进行解读及总结变成了可能。
本系列文档利用AI对OpenFOAM 12的github仓库代码进行全局扫描并总结,希望对于OpenFOAM的学习能够提供一些帮助。
注意,文档内容为AI自动生成,虽然经过了简单的人工审核,但内容中依然可能会存在一些错误,请仔细甄别。添加原创标记仅为方便创建合集。
OpenFOAM(Open-source Field Operation And Manipulation)是一个用于开发定制数值求解器和前后处理工具的C++工具箱,主要用于求解连续介质力学问题,最常见的是计算流体力学(CFD)。本文档介绍了OpenFOAM-12、其架构以及主要组件之间的关系。
1 OpenFOAM是什么?
OpenFOAM以一系列协同工作的库组成,用于构建可执行应用程序。这些应用程序分为两大类:
-
Solvers:专门求解连续介质力学领域特定问题的应用程序 -
Utilities:执行前处理、后处理以及支持仿真流程其他任务的辅助程序
该框架具备高度可扩展性,支持用户通过复用现有组件或开发新模块,创建定制化的求解器和工具程序。
2 核心架构
OpenFOAM的核心由几个关键系统构成:
-
时间管理系统(
foam::Time
):控制模拟的时间维度,触发函数对象,并作为顶级对象注册表。它负责时间步进、按指定间隔输出数据,以及确定模拟的开始和结束时间。 -
有限体积网格系统(
fvMesh
):将离散化的域表示为单元、面和点的集合。它处理网格拓扑、几何结构及连接性,并通过网格缝合器处理非共形接口。 -
字典系统(
dictionary
):提供一种分层配置机制,贯穿于OpenFOAM中。工具如foamDictionary
可用于操作这些字典。 -
物理场系统(
GeometricField
):存储并管理与网格元素相关的物理变量(如速度、压力、温度等)。 -
函数对象系统(
functionObjectList
):提供框架,用于在模拟过程中执行操作,如计算派生量、输出特定数据或修改模拟状态。

3 环境及配置
OPENFOAM的环境配置通过以下方式实现:
-
环境设置脚本(
etc/bashrc
、etc/cshrc
):设置环境变量、路径以及OPENFOAM的默认配置。 -
案例结构:每个OPENFOAM模拟都组织为一个案例目录,包含以下内容:
-
system/
:包含控制模拟参数的字典(如controlDict
)、离散格式(如fvSchemes
)以及求解器设置(如fvSolution
)。 -
constant/
:包含物理属性和网格定义。 -
Time
目录:存储不同模拟时间点的场数据。 -
Control字典(
controlDict
):位于system/
目录中,是模拟的主要配置文件,定义时间步长、写入间隔以及要执行的函数对象等参数。

4 仿真及数据流
OPENFOAM的模拟流程通常遵循以下步骤:
-
前处理:
-
使用工具如 blockMesh
或snappyHexMesh
生成网格 -
指定边界条件 -
定义物理属性 -
模拟设置:
-
使用 decomposePar
进行并行计算时的计算域分解 -
在字典中配置模拟参数 -
求解器执行:
-
由 Time
类控制时间步进 -
使用有限体积离散进行矩阵组装和求解 -
按指定间隔执行函数对象 -
后处理:
-
使用 reconstructPar
进行域重建(针对并行计算) -
使用 paraFoam
(ParaView的封装)进行可视化 -
使用 postProcess
和其他工具进行数据分析

5 网格和场表示
OpenFOAM 通过以下方式表示计算域及其相关数据:
-
网格表示:
-
polyMesh
:基础网格类,提供拓扑信息(单元、面、点)。 -
fvMesh
:有限体积网格类,扩展了polyMesh
,为有限体积离散化提供额外功能。 -
边界网格和Patch,表示具有不同条件的域边界。 -
场表示:
-
volField
:单元中心场(例如压力、温度)。 -
surfaceField
:面中心场(例如通量)。 -
pointField
:点中心场。 -
GeometricField
:模板类,用于表示与网格实体相关的场。 -
根据数据存储位置的不同,场类型包括: -
边界条件:
-
通过专门的patch场( fvPatchField
的派生类)应用。 -
提供多种类型:固定值、固定梯度、混合等。

6 字典系统
字典系统提供了一种用于整个OpenFOAM的分层键值配置机制。
字典系统的关键要素:
-
字典类:
-
dictionary
:用于存储层次化键值对的基类 -
IOdictionary
:为字典添加输入输出功能 -
controlIOdictionary
:专为控制字典设计 -
条目:
-
entry
:字典条目的基类 -
primitiveEntry
:用于简单值(如数字、字符串等) -
dictionaryEntry
:用于嵌套字典 -
特殊功能:
-
用于高级功能的函数条目(如 #include
、#calc
) -
使用正则表达式模式匹配进行键查找 -
通过 foamDictionary
工具进行操作

7 功能对象系统
功能对象提供了在模拟过程中执行操作的框架:
-
核心类: -
functionObject
:定义接口的抽象基类 -
functionObjectList
:管理所有活动功能对象的容器 -
timeControl
:控制功能对象何时执行 -
与时间系统的集成: -
功能对象由 Time
类在时间步进期间触发 -
它们可以在模拟开始、每个时间步进期间或模拟结束时执行 -
典型的功能对象: -
力和力矩计算 -
场平均值和操作 -
数据采样和导出 -
运行时可视化和后处理

8 总结
OpenFOAM-12为计算流体动力学及其他连续介质力学问题提供了一个全面的框架。其面向对象的架构允许灵活定制与扩展,而核心组件为创建、求解及分析复杂物理模拟奠定了坚实基础。该框架的主要优势包括:
-
稳健的网格表示系统,支持复杂几何结构 -
灵活的场操作,用于表示物理量 -
针对多种物理现象的广泛求解器能力 -
强大的字典系统,便于配置 -
对并行计算的强力支持 -
通过功能对象系统实现可扩展架构
这些特性的结合,使OpenFOAM-12成为适用于标准CFD应用及需要定制求解器与工具的专门模拟的强大工具。
(未完待续)

本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册