OpenFoam之顶盖驱动流模拟

OpenFoam之顶盖驱动流模拟的图1

对一个绝热二维方腔的不可压缩流算例进行前处理、运行、以及后处理。几何如图所示,方腔所有的边界都是壁面,顶部壁面以 1m/s 的速度在 x 方向移动,其它壁面均为固定壁面。

开始,我们假定流体为层流,并使用 icoFoam 在一个均匀网格上求解绝热不可压层流。接下来将研究网格非均匀化以及壁面网格非均匀化对计算结果的影响。最后,增加雷诺数,使用另一个求解器 pisoFoam 来求解绝热不可压湍流。

第一步:生成网格

OpenFOAM 采用网格都是三维的 。默认情况下, OpenFOAM 在三个维度上进行求解,但是如果指定某些面的边界(例如垂直于第三个方向的平面)条件为 empty,那么它就可以用来求解二维算例。

几何由一个 xy 平面上边长为 0.1 米的正方形组成,这里几何体我们称为cavity。最开始将使用均一的 20*20 网格。block 结构参见图2-2. 我们采用 OpenFOAM 提供的 blockMesh 来生成网格,它通过读取指定的字典文件来生成网格,这个字典文件位于算例文件夹下的 system/ployMesh 9 文件夹下。

2021-08-26 08-39-12 的屏幕截图.png

blockMeshDict 文件信息如下所示:

2021-08-26 08-58-52 的屏幕截图.png

2021-08-26 09-00-48 的屏幕截图.png
2021-08-26 09-01-27 的屏幕截图.png

文件的第一行到第七行是文件头信息,然后具体的字典信息通过的 FoamFile 后的 (...) 来指定 10 。这个文件首先指定各个 block 顶点(vertices)的坐标;然后通过顶点编号来定义 block,最后定义边界面。用户可以查阅5.3节来详细了解 blockMeshDict 的具体意义。网格通过在这个算例目录下运行 blockMesh 命令来生成。在算例目录下,通过在终端简单地键入:

blockMesh

来 完 成,blockMesh 命 令 会 把 运 行 的 情 况 输 出 到 终 端。blockMeshDict 中 的 任 何 错 误blockMesh 都会检测到并在终端输出错误,并告诉用户第几行错了。目前我们运行这个算例的时候,不会有错误。

第二步 边界和初始条件

一旦网格生成完毕,用户可以查看这个算例的初始场信息。在这个算例中,我们从 0 秒开始计算,因此初始的场信息存储在 cavity 目录下的 0 文件夹下。0 文件夹下又包含两个文件, p 和 U,它们是压力场和速度场,它们的初值和边界条件必须指定。下面我们来看一下 p 文件:

2021-08-26 09-05-34 的屏幕截图.png
2021-08-26 09-06-24 的屏幕截图.png

场文件中有 3 个主要信息:
dimensions 指定场的单位,此处为运动压力 11 ,单位为 m 2 s −2 .
internalField 内 部 场 可 以 uniform, 即 均 一 场; 或 者 每 个 网 格 的 数 据 都 需 要 指 定 的nonuniform;
boundaryField 指定边界场信息,包括边界条件以及所有边界面所需的信息。
对于这个 cavity 算例,边界场由 walls 组成,并分为两个 patches:(1) fixedWalls,其用来指定固定边界,即 cavity 几何的底部和侧面。(2) movingWall,cavity 几何的上部。作为壁面,压力边界条件均为 zeroGradient,意味着压力的法向梯度为 0。frontAndBack 面即为 2D 算例的前后面,因此必须指定为empty。

在这个算例中初始场我们都设置为 uniform。这里的压力为运动压力,作为不可压缩流,它的绝对值是没有意义的。因此我们设置其为 uniform 0。这样比较简单 。用户可以采用同样的方法来查看 0/U 文件。dimensions 是速度的单位。内部场初始化为 0,对于速度来说,这个值必须是一个矢量,即:uniform (0 0 0)。速度场和压力场的 frontAndBack 都为 empty, 其它的 patchs 均为 fixedWalls,且指定为无滑移边界条件,因此为 fixedValue,其值为 value uniform (0 0 0)。我们假设顶部的壁面以每秒 1 米的速度在 x 方向移动,这是一个固定速度即 fixedValue,其具体的值为uniform (1 0 0)。

第三步 物理特性

算例的物理特性存储在以 Properties 为后缀的文件中,对于 cavity 算例,唯一需要给 定 的 参 数 为 运 动 粘 度, 它 存 储 在 transportProperties 字 典 文 件 中。 用 户 可 以 打 开transportProperties 文件来查看运动粘度是否设置正确。运动粘度的关键词为 nu,类似于希腊字母 ν 的发音。我们的算例雷诺数为 10,雷诺数如下定义:Re =d |U|/ϑ。d 和 |U| 分别是特征长度和速度, ϑ 为运动粘度。此处 d 为 0.1m,|U| 为 1m/s,运动粘度为 0.01m 2 /s。所以雷诺数为 10。正确地指定运动粘度场应该如下所示 :

2021-08-26 09-13-21 的屏幕截图.png

第四步 控制

在 controlDict 字典内可以对时间步、输入输出时间、场数据的读取和写入来进行控制。用户应该查阅这个文件,作为一个算例的控制文件,它位于 system 文件夹下。
起始时间、终止时间以及求解时间步必须要进行设定。OpenFOAM 提供了灵活的时间步控制。在这个教程里我们打算在 t = 0 的时候开始进行计算,这意味着 OpenFOAM 需要读取 0 文件夹下的场数据,请查阅4.1节来获取更多有关算例文件结构的相关信息。因此我们设定startFrom 关键字信息为 startTime,然后指定 startTime 为 0。
运算结束的时候,我们希望能达到稳定的状态,即流体在空腔内循环。一个通用准则是,层流下流体应该穿过(循环)计算域 10 次。在这个算例中,我们没有进口和出口,因此流体没有穿过计算域。因此结束时间应该设置为在空腔内循环 10 次的时间。例如 1s。实际上,我们发现 0.5s 就可以了,故我们设置结束时间为 0.5s。我们通过把 stopAt 关键字指定为 endTime 然后把 endTime指定为 0.5 来完成。

现在我们需要设定时间步,即 deltaT。当运行 icoFoam 的时候,为了达到数值稳定以及时间计算精度,库郎数 14 应该小于 1。每个网格的库郎数这样定义:Co =δ t |U|/δ x。δ t 为时间步,|U| 为某个网格单元内的速度矢量的模, δ x 为速度方向的网格长度。由于流体域内速度并不均一,为了保证库郎数在各处都小于 1,我们依据最大速度和最小网格尺寸来计算库郎数,在保证其小于 1 的前提下指定时间步。在这个算例中网格大小是固定的,因此在顶盖附近,速度接近1m/s 的地方库郎数最大,网格大小为:δ x =d/n=0.1/20=0.005m。为了使库郎数在整个流体域都小于或等于 1。时间步必须小于或等于:δ t =Co δ x /|U|=1 ∗ 0.005/1=0.005s。

随着计算的进行,我们希望在某个固定的时间间隔下写入数据。以便我们可以在后处理中进行查看。对于如何对写入时间步进行设定有很多选择,它可以通过 writeControl 关键字来控制。我们决定在 0.1s, 0.2s, …, 0.5s 写入我们的结果。由于计算时间步为 0.005s,因此我们需要每 20 个时间步输出一次结果,这样我们设定 writeInterval 为 20。
OpenFOAM 会在每一个时间步内创建一个文件夹,例如 0.1 文件夹。正如4.1节所说,每个时间步下都有一系列数据。对于 icoFoam 求解器,它把速度 U 和压力 p 写入在每个时间步对应的文件夹中。对于这个算例,controlDict 设置如下:

2021-08-26 09-22-06 的屏幕截图.png
2021-08-26 09-22-49 的屏幕截图.png

第五步 离散方法和矩阵求解器设置

用户在 system 下的 fvScheme 文件中指定有限体积法的离散格式。在 system 下的fvSolution 文件下指定方程组矩阵求解器、残差以及其它算法控制。用户可以查看这些字典文件,目前我们不讨论这些内容,但是有必要提及 fvSolution 里面的 PISO 子字典中的 pRefCell以及 pRefValue。在一个封闭的不可压体系中,例如这个空腔,压力是相对的。跟绝对压力值来说,压力的相对范围比较重要。在类似的这种例子中,求解器通过 pRefCell 以及 pRefValue来设置参考值。这个例子中我们都设置为 0。改变其中任何一个值都会改变绝对压力场。但是不会改变相对压力场和速度场。

2021-08-26 09-32-20 的屏幕截图.png
2021-08-26 09-32-56 的屏幕截图.png
2021-08-26 09-34-39 的屏幕截图.png
2021-08-26 09-35-23 的屏幕截图.png

第六步 查看网格

在运行之前,我们最好检查一下网格以查看是否有错误。用户可以通过 ParaView 软件来查看网格, ParaView 是 OpenFOAM 推荐采用的后处理软件。针对 OpenFOAM 的数据, OpenFOAM中的 paraFoam 程序可以自动加载 OpenFOAM 数据并在当前文件位置运行 ParaView  。

UNIX/Linux 的任何可执行程序都可以采用两种方式来运行。如果用户以前置的方式来运行程序,则下一个命令需要在前一个命令运行结束后才能运行。如果用户以后台的方式运行程序,则可以同时运行其他程序。因为我们可能需要在运行 ParaView 的同时并使用其他命令,因此我们可以通过后台的方式来运行,用户需切换到算例文件夹下并键入:

paraFoam &
它也可以在非算例目录下的终端运行,但应该使用-case 命令参数,例如:
paraFoam -case $FOAM_RUN/cavity &

这会启动 ParaView 窗口,在 Pipeline Browser 下,用户可以看出 ParaView 已经打开了这个算例模块并称之为 cavity.OpenFOAM,在应用 apply 按钮之前,用户需要在 MeshParts 里面选择要显示的几何。因为这个算例文件很小,最简单的是在 Mesh Parts 旁的窗口里选择全部几何数据,这会自动的检查所有几何单元。然后用户点击 Apply,网格文件就会被ParaView 加载。

Display 面板控制所选模块的视觉效果。用户在 Display 面板下用户应该参照下图所示来进行操作:

1.在 Coloring 内选择 Solid Color;
2. 然后点击 Edit 并选择合适的颜色,例如黑色(如果是白色的背景色);
3. 在 Representation 菜单下,选择 Wireframe。背景色可以通过 Properties 窗口中Display 面板下的 View Render 面板来设置。

由于这个算例是一个二维算例,建议在 Edit 下的 ViewSetting 中的 General 面板中勾选 Use ParallelProjection。在Annotation 面板下我们也可以选择打开或者关闭 Orientation Axes。

2021-08-26 09-43-02 的屏幕截图.png  

第七步 运行算例

正如其它任何 UNIX/Linux 可执行程序一样,OpenFOAM 程序可以通过前置进程和后台进程的方式来运行我们以前置进程的方法运行 icoFoam,一种方法是直接算例目录下的终端键入:
icoFoam
来运行,另一种方法是可以通过-case 命令参数来指定算例目录:
icoFoam -case $FOAM_RUN/cavity
在终端的窗口里,我们会看到命令的输出信息,它告诉用户当前的时间步以及最大库郎数,所有场的初始残差和最终残差。

第八步 后处理

在把结果写入时间步文件之后,我们可以使用 paraFoam 来进行后处理,回到 paraFoam 窗口,选择 cavity.OpenFOAM 模块。如果当前没有显示算例的网格,请确保 cavity.OpenFOAM处于高亮绿色。并且在左边高亮显示一个眼睛的图标,这样就会显示当前的算例。为了让 paraFoam 展示所需要的数据信息,首先要确保加载 0.5s 时间步的数据。如果运行算例的时候 ParaView 已经打开,新的时间步数据不会自动加载。为了加载新的时间步数据,应该在Properties 中点击 Refresh Times。这会自动加载新的时间步数据文件。为了查看 0.5s 的数据,用户可以使用 VCR Controls 或者 Current Time Controls 将当前时间步设置为 0.5。他们位于 ParaView 窗口的工具栏,详见图。

cavity.png  

默认 最新
当前暂无评论,小编等你评论哦!
点赞 3 评论 收藏
关注