计算流体动力学 (CFD), 用还是不用?
全球各地机器上消耗大量计算周期的一个领域是 CFD。什么是 CFD?CFD 是计算流体动力学的缩写。其基本思想是模拟气体和液体(或流体)在与固体表面相互作用时的流动。这种建模类型用于设计飞机、汽车、潜艇和风扇叶片——基本上,任何在水或空气中运动的物体。随着表面复杂性的增加,或流动复杂性的增加(例如从亚音速到超音速),建模所需的计算机时间也会增加。用于 CFD 的大型软件包之一是 Ansys 公司制作的程序套件。我所在大学的几个小组都在使用它。但是,有一个可用的开源选项,OpenFOAM。在本文中,我将描述您可以使用 OpenFOAM 完成的工作。OpenFOAM 项目包括二进制软件包,格式为 deb 文件或 RPM 文件。您还可以下载源代码包文件,甚至直接从 Git 仓库下载。
OpenFOAM (开源场运算和操控) 基本上是一组 C++ 库,用于各种处理步骤中。OpenFOAM,就像大多数其他 CFD 软件包一样,将要完成的工作分解为三个独立的步骤。第一步称为预处理。在预处理中,您定义您尝试建模的问题。这包括定义模型中固体对象给出的边界条件。您还需要描述您尝试建模的流体的特性,包括粘度、密度以及对您的模型重要的任何其他属性。下一步称为求解器步骤。这是您实际求解描述您模型的方程的地方。第三步称为后处理。在这里,您可以查看结果并将其可视化,以便您可以了解模型中发生的情况。这种分解的明显结果是,大部分计算工作发生在求解器阶段。预处理和后处理步骤通常可以在桌面上完成,而求解器步骤很容易占用 50 或 100 个处理器。OpenFOAM 包括几个预处理和后处理实用程序,以及几个求解器。但真正的力量来自于这样一个事实,即由于 OpenFOAM 是基于库的,您可以使用 OpenFOAM 作为基础构建自己的实用程序或求解器。这在研究环境中非常有用,您可能正在尝试一些以前没有人尝试过的事情。
OpenFOAM 中的模型称为 case (案例)。Cases (案例) 存储为案例目录中的一组文件。许多其他 CFD 软件包使用单个文件代替。目录允许您将数据与控制参数和属性分开。Case (案例) 文件可以使用任何文本编辑器进行编辑,例如 emacs 或 vi。预处理涉及创建您正在研究的 case (案例) 所需的所有文件。
第一步是网格生成。您的流体(无论是液体还是气体)被分解为离散单元的集合,称为网格。OpenFOAM 包括许多实用程序,这些实用程序将根据您的流体几何形状的描述生成网格。例如,blockMesh
实用程序生成简单的块网格,而 snappyHexMesh
实用程序生成复杂的六面体或分裂六面体单元网格。如果您想生成基本的块网格,您需要在字典文件 `blockMeshDict` 中布局详细信息,该文件位于您的案例子目录中的 `constant/polyMesh` 子目录中。该文件以开头
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
一般来说,Case (案例) 文件以这种格式的标头开头,描述每个案例文件包含的内容。在此特定文件中,您可以定义包含顶点、块、边或面片的部分。创建此文件后,您可以运行 blockMesh
实用程序来处理此字典文件并生成将在计算中使用的实际网格数据。
下一步是设置您的初始条件。这是通过创建一个名为 `0` 的子目录并将相关的 case (案例) 文件放在此处完成的。这些 case (案例) 文件将包含感兴趣场的初始值和边界条件。例如,如果您正在查看流体流过空腔,您可能对压力和速度感兴趣。因此,您将在 `0` 子目录中有两个文件描述这两个场。您还需要在存储在 `Dictionaries` 子目录中的文件中设置任何重要的物理属性。这些文件以 `Properties` 结尾。您可以在此处定义粘度之类的项目。预处理的最后一步是设置控制文件。此文件名为 `controlDict`,位于 `system` 子目录中。例如,假设您想从 t=0 开始,运行 10 秒,时间步长为 0.1 秒。控制文件的这一部分看起来像这样
startFrom startTime;
startTime 0;
stopAt stopTime;
stopTime 10;
deltaT 0.1;
您还可以在此控制文件中设置输出参数。您可以使用 `writeControl` 关键字设置 OpenFOAM 写入输出的频率。因此,假设您想每 10 个时间步长写出结果。控制文件的那一部分看起来像这样
writeControl timeStep;
writeInterval 10
这告诉 OpenFOAM 每 10 个时间步长将结果写入到每个写入操作的单独子目录中。这些子目录将用时间步长标记。
您还可以设置文件格式、结果精度和文件压缩等许多其他选项。
在您实际开始求解器步骤之前,最好检查网格以确保它看起来正确。有一个名为 `paraFoam` 的后处理工具可供您使用。如果您在您的案例目录中,调用 `paraFoam` 将加载它。或者,您可以使用命令行参数 `-case xxx` 指定另一个目录位置,其中 xxx 是您感兴趣的案例目录。
下一步是在您的模型上运行求解器,看看您得到什么。求解器往往是专门化的,以便有效地解决某一特定类的问题。因此,OpenFOAM 开箱即用地提供了一套相当大的标准求解器。如果您有兴趣解决不可压缩流体的层流问题,您可能会使用 icoFoam
。或者,如果您有兴趣研究空化现象,您可以使用 cavitatingFoam
。或者,您可能需要用于内燃机的求解器 (`engineFoam`)。查看文档以了解有哪些可用的求解器。一旦您知道要使用哪个求解器,您可以通过从您的案例目录中执行相关的二进制文件来运行它,或者您可以使用 `-case` 命令行参数指向另一个案例目录。
最后一步是后处理步骤,您可以在其中实际查看结果并查看模型内部发生的情况。在这里,您可以使用提供的实用程序 paraFoam
。它可以接受 `-case` 命令行参数,就像我讨论的所有其他实用程序一样。然后,您可以操作数据并查看各种时间切片。您可以生成等值面图和等高线图、矢量图或流线图。您甚至可以创建动画,尽管不是直接创建。您可以让 `paraFoam` 输出表示电影帧的图像文件。因此,它们将以以下形式的文件名保存
fileroot_imagenum.fileext
然后,您可以获取此图像序列,并通过 ImageMagick 中的 `convert` 实用程序之类的工具将它们捆绑到一个电影文件中。
最后,在预处理和后处理步骤中,都有实用程序允许您在其他 CFD 软件包(包括 fluent、CFX 和 gambit,仅举几例)使用的文件格式之间进行转换。如果您与碰巧使用这些其他软件包之一的其他人合作,这将非常方便。如果您与使用 fluent 的人合作,您将在预处理步骤中使用 `fluentMeshToFoam`,在后处理步骤中使用 `foamMeshToFluent`。
这篇简短的文章仅提供了 OpenFOAM 的一点点介绍。如果您对流体动力学感兴趣,您绝对应该了解一下 OpenFOAM。主页包含指向优秀文档和多个教程的链接。安装包还包括几个示例案例,因此您可以了解如何处理标准问题集。您通常可以使用其中一个示例作为您自己问题的起点。看看它,看看它是否可以帮助您的工作。