计算流体动力学(CFD)开源软件OpenFOAM被广泛应用于工业界和学术界。相较于使用专有CFD软件,使用OpenFOAM的优势在于开源通用公共许可证(GPL),其允许用户自由使用和修改现代高端CFD代码。开源许可消除了产品优化周期中的许可成本,实现了参数变化的直接自动化,并加速了新的数值方法和模型的开发。加快了新方法的开发和实现,因为它们是从OpenFOAM中的现有功能开始的,而不是从头开始的。

除了上面提到的所有优点之外,使用OpenFOAM还有一个缺点。OpenFOAM使用了C++编程语言和现代软件设计模式,因此学习如何以模块化和可持续的方式在OpenFOAM中编写新方法需要付出大量的努力。使用OpenFOAM需要结合不同背景的知识,包括应用数学、物理、软件开发、C++编程语言和高性能计算(并行编程和性能测量)等。

这本书致力于在一个地方描述OpenFOAM的不同方面,帮助初学OpenFOAM的用户发展成为中级OpenFOAM程序员。为了实现这一目标,强烈建议读者通读所涵盖的例子。本书没有介绍OpenFOAM的一些核心部分所必须的C++编程语言的更高级部分。但是这些知识可以在有关C++编程语言和软件设计模式方面的书籍中找到。

本书涵盖了使用OpenFOAM的两个主要方面:使用应用程序以及开发和扩展OpenFOAM应用程序和库。本书第一部分使用几个OpenFOAM实用程序和应用程序描述OpenFOAM工作流程,第二部分介绍了OpenFOAM新求解器和库的开发。

1 目标读者

本书面向对开源计算流体动力学(CFD)感兴趣的任何人。

但是不可能在一本书中提供有效开发OpenFOAM所需的C++编程语言、软件设计、计算流体动力学(CFD)和高性能计算(HPC)的所有背景信息,本书将重点放在OpenFOAM解算器和库的使用、设计和开发上,并引导读者了解那些没有详细介绍的主题所涉及的其他深入信息来源。

因此,假设C++编程语言中的一些面向对象编程知识,涉及类(封装、继承和组合)、虚函数(动态多态性)和运算符重载,这些主题的背景信息在书的第二部分提供。然而,读者也应该使用每章末尾所引用的文献独立地了解这些主题。本书所提供的示例故意避开了验证和确认,因为这会让读者偏离学习OpenFOAM的轨道。然而如果没有计算流体动力学的知识,以及非结构有限体积法(FVM)的知识,就不可能学习和理解OpenFOAM,这本书中简要介绍了该方法,在其他地方也有更详细的介绍。

2 本书涵盖的内容

  • 第1章 概述了CFD模拟的工作流程,以及OpenFOAM中的非结构有限体积法(FVM)。
  • 第2章介绍了区域离散化(网格生成和转换)及区域分解。
  • 第3章描述了仿真实例的结构和设置:设置初始条件与边界条件,配置模拟控制参数及数值参数。
  • 第4章概述了前后处理实用程序和数据可视化。
  • 第5章对OpenFOAM库进行了深入的概述。
  • 第6章描述了如何以高效且可持续的方式编程OpenFOAM:开发和使用库、使用git版本控制系统、调试和分析
  • 第7章简要概述了湍流建模:将湍流引入模拟案例并配置湍流模型。
  • 第8章介绍了OpenFOAM预处理和后处理应用程序的编程。
  • 第9章介绍了OpenFOAM中解算器设计的背景,并展示了如何使用新功能扩展现有求解器。
  • 第10章介绍了OpenFOAM中边界条件的数值背景和软件设计。提供了一个自定义边界条件的实现示例,该示例使用了第6章中描述的原则。
  • 第11章以温度相关粘度模型为例,介绍了OpenFOAM中输运模型的数值背景、设计和实现。
  • 第12章介绍了OpenFOAM中的函数对象的设计与实现,并与C++函数对象进行了比较。
  • 第13章介绍OpenFOAM中的动态网格处理。介绍OpenFOAM中动态网格引擎的设计和使用,以及使用动态网格处理扩展解算器。
  • 第14章对本书进行了总结。

3 如何阅读此书

对于刚开始使用OpenFOAM的用户,建议从头到尾阅读这本书,并对示例进行独立的研究。有经验的OpenFOAM用户可以从第二部分中选择一章,其中有关于如何对OpenFOAM的某个特定部分进行编程的相关信息。

4 OpenFOAM版本

OpenFOAM有不同的版本可供选择,例如OpenFOAM Foundation、Foam Extended和OpenFOAM。本书没有介绍这些forks之间的区别和相似之处。书中的内容和实例库与OpenFOAM-v2012相匹配,并且该书将只遵循此OpenFOAM版本。

有关如何安装此版本OpenFOAM的信息,请访问其官方网站。可以选择将OpenFOAM作为Linux包安装,编译源代码的快照,或者编译克隆的git存储库。由于本书的目标是解决OpenFOAM编程问题,因此建议编译源代码快照或OpenFOAM git存储库的克隆。

5 命名和排版约定

命令行使用带有前缀?> 的输入。下面是一个示例:

?>  ls $FOAM_TUTORIALS
Allclean basic electromagnetics lagrangian
Allrun combustion financial mesh
Alltest compressible heatTransfer multiphase
DNS discreteMethods incompressible stressAnalysis

C++代码排版形式如下所示:

template<class GeoMesh> 
tmp<DimensionedField<scalar, GeoMesh>  >  stabilise
(
    const DimensionedField<scalar, GeoMesh> &,
    const dimensioned<scalar> &
);

OpenFOAM模拟的配置依赖于所谓的字典文件。字典文件是一种文本文件,以OpenFOAM特有的格式存储键值对的列表:

ddtSchemes
{
    default Euler;
}

在方程式中,标量(如通量)的排版没有强调;矢量的排版使用粗体(例如,速度);张量使用粗体和下划线(如单位矩阵)。

6 随书示例

书中包含的示例可以在GitLab上找到: https://gitlab.com/ofbook-/ofprimer。

最新版本合并到主分支中,所有版本都与OpenFOAM git标签版本相匹配,如OpenFOAM-v2012。

7 贡献

错误报告和主题建议使用GitLab服务台处理,并且可以投票表决。支持率最高的话题将有更大的机会在下一版中得到解决。

在提交错误报告或功能请求之前,请搜索existing issues以确保该问题尚未被报告。