OpenFOAM 名称中的 FOAM 部分是 Field Operation and Manipulation 的首字母缩写。如前几章所述,FOAM 可能相当复杂,因为它们使用非结构化有限体积离散化技术,在几何形状复杂的求解域中以张量场的形式表示和操作物理特性。可以对离散张量场进行显式和隐式运算。场的变化受守恒定律的支配,被模拟为偏微分方程(PDE),PDE 的数值求解通常涉及组装和求解大型稀疏线性方程组。有时,PDE 是强耦合的,数值算法需要考虑这种耦合,例如动量方程和压力方程的耦合求解。由于矩阵尺寸通常较大,因此需要使用迭代求解算法来求解新场值的线性方程组[1, 3]。

只有当所选择的编程语言能够抽象出复杂的概念,并实现高效的计算和可移植性时,才有可能将上述 FVM 的所有方面转化为软件框架。在 OpenFOAM 中,这些概念包括:场、网格、离散方法、插值格式、状态方程、喷雾粒子系统、矩阵、矩阵存储格式、配置文件、并行编程等。即使是这份简短的清单,也能说明元素是如何占据不同的抽象层次的。例如,与字典数据结构相比,物理场和网格概念的抽象程度更高。通过抽象化,程序员可以有效地构建软件元素,对感兴趣领域中复杂概念的行为进行建模。这样,程序员就不必在脑海中浮现整个软件系统的图像,而是将注意力从一个相对孤立的概念转移到另一个概念上。建模良好的概念是那些内聚性强、相互耦合松散的概念。这样可以简化扩展,使软件更加模块化。例如,CFD 中的一个重要概念是有限体积网格,用于将流域离散化。

网格将保存各种几何和拓扑数据,如第1.3节和第2.1节所述。此外,需要使用不同(通常比较复杂)的功能来处理这些数据。以OpenFOAM和C++语言中的抽象为例,将有限体积网格的数据和相关功能封装到一个fvMesh类中。这使得程序员可以从网格的角度来思考,而不必考虑构建网格的数据结构和函数的所有细节。这种高度抽象的思维方式允许程序员编写将整个网格作为其参数之一的算法,这将使得算法接口更容易理解。否则,处理网格特定子元素的算法将有几十个参数,这在过程编程中经常出现。如果没有抽象,将会出现大量的全局变量,并且这些全局变量被各种算法访问,这将使得要想确定程序的流程变得非常困难。

注:本章的第一部分概述了OpenFOAM的软件设计,但是并不包括软件开发中的术语,这些应该独立学习。OpenFOAM是一个大型软件,学习软件开发是在OpenFOAM中开发新方法的必要条件。

C++编程语言支持更高抽象级别的编程,它是一种多范例语言,支持面向过程、面向对象、泛型及函数式编程范例。更高层次的抽象使得程序的实现更具可读性,但C++语言仍然具有非常高的计算效率,并且其是跨平台的。这些方面使得C++语言成为科学和计算软件开发的常见选择。

要了解OpenFOAM的不同部分是如何设计以及如何相互交互的,最好的方法是浏览源代码。

为了方便用户,OpenFOAM官方和扩展版本都支持通过Doxygen生成HTML文档,用户也可以在线获取为主开发版本生成的Doxygen文档。