4.1 后处理

CFD 分析的后处理步骤是从计算的 CFD 结果中提取有用信息的任务。提取的数据可以采用图像、动画、绘图、统计等形式。值得庆幸的是,OpenFOAM 配备了大量的后处理工具,可以满足大多数用户的需求。这些工具以所谓的函数对象的形式出现,可以在模拟完成后调用,或者在模拟作为一种辅助计算在运行时调用。例如,如果需要涡量场但默认情况下不由求解器计算,则可以将涡量函数对象添加到模拟中,以便将其与预期的压力和速度场一起计算和写入。函数对象和设计将在第 12 章进行深入回顾。库存后处理工具(也称为函数对象)的源代码存储在$FOAM_SRC/functionObjects目录下的各种分类子目录中:

ls $FOAM_SRC/functionObjects

field graphics    lagrangian    solvers
forces initialisation randomProcesses utilities

虽然某些后处理计算可能无法使用现有实用程序直接计算,但使用库存实用程序的计算组合可能会完成工作。与其他 OpenFOAM 实用程序类似,后处理应用程序默认在模拟案例中的所有现有时间目录上运行。可以通过传递 -time 参数显式选择时间和时间范围,并且可以通过-latestTime参数选择上次时间。在详细介绍示例工作流场景之前,下面将介绍一些现有的后处理工具。虽然描述所有这些超出了本书的范围,但涵盖了一些对许多用户应该有价值的选定应用程序。

4.1.1 postProcess

第一个选择的工具是通用的 -postProcess 求解器选项,其可用于对现有流场执行各种计算。所有计算结果都存储为相应时间目录中的新的未来城。此求解器选项增强了求解器的行为,其不执行流动计算,而仅执行命令行中包含的函数对象或在 controlDict 中设置的函数对象。此选项附加到求解器,以确保在后处理之前加载与特定求解器关联的物理场和模型。一般语法是:

solverName -postProcess -field <field name>  -func <function name> 

其中 solverName 是最初用于计算现有流动数据的求解器的名称。

在上面的语法中,<function name> 定义要执行的计算类型,<field name> 表示要操作的物理场,<arguments> 提供操作特定的控件。请注意,并非所有函数对象都需要输入物理场名称。大多数 OpenFOAM 实用程序中常见的附加参数,例如 -latestTime -case 也可以与该实用程序一起使用。对流场结果本身进行的所有现有计算都可以在这里找到:

$FOAM_SRC/functionObjects/field

下面概述了一些更常用的算术或场微积分运算:

  • components。将矢量或张量场的分量分离为单独的体积标量场。例如,可以使用以下语法将速度场 U 分成三个 volScalarField(Ux、Uy 和 Uz):
simpleFoam -postProcess -func 'components(U)'
  • div。计算向量场或张量场的散度,并将结果分别写入新的标量场或向量场。 fvSchemes 字典中必须存在散度运算符的数值格式(例如 div(U))才能执行。如速度场 U 的散度可以通过下式计算
simpleFoam -postProcess -func 'div(U)'

将计算结果存储为一个名为 divU 的新 volScalarField,存放在特定的时间步长目录中。

  • mag。用于计算物理场场的大小。对于标量值,计算其绝对值,对于矢量值,计算其幅值。结果存储在一个新的物理场中,该物理场由带有前置 mag 的旧字段名称组成。例如,计算速度场 U 的速度大小可以通过执行以下操作来实现:
simpleFoam -postProcess -func 'mag(U)'
  • magSqr。分别计算场的幅值平方。将计算结果写入一个新的标量场中,该标量场根据模式“magSqr”命名,后跟原始场的名称。
simpleFoam -postProcess -func 'magSqr(U)'

4.1.2 yPlus

对于采用湍流建模的模拟,y+ 值是一个重要值,用于验证近壁流是否得到充分解析,以及该分辨率是否在该湍流模型的正确范围内。更多关于这个值的含义和计算方法的信息可以从第 7 章查看。y+ 后处理工具的源代码位于此处:

ls $FOAM_SRC/functionObjects/field/yPlus

y+ 值是在模拟完成后使用 yPlus 函数对象计算的。以前版本的代码需要调用不同的实用程序,具体取决于仿真是采用 LES 还是 RANS 类型的模型,但最近已将这两种仿真类型统一到单个进程中。 y+ 值存储在一个名为 yPlus 的新 volScalarField 中:

simpleFoam -postProcess -func yPlus

在上面的示例中,simpleFoam 被称为基础求解器。在一般情况下,任何用于计算流场的流动求解器都可以替换,例如用于瞬态流动的 pisoFoam。 y+ 场仅在边界面上计算,边界面为壁面类型,剩余的以单元为中心的值为零。除了新写的物理场外,这两个 yPlus 工具都会在屏幕上打印一些有价值的信息。此信息包含用于特定湍流模型的系数以及所有壁边界补丁的最小、最大和平均 y+ 值。

4.1.3 边界平均与边界积分

这些后处理工具可用于分别计算边界的平均值和积分。这两个工具的源代码都位于 postProcessing 实用程序的 patch 子目录中。

ls $FOAM_UTILITIES/postProcessing/patch
  • patchAverage。计算由面法向向量的大小进行加权的标量的算数平均值:

  • patchIntegrate。计算边界上物理场的积分值。对于该计算,采用了两种不同的方法: 使用面积法向量 及其幅值。两个结果都输出到控制台,分别产生一个矢量和一个标量结果。

patchAverage 只能处理 volScalarField,而 patchIntegrate 还将处理 surfaceScalarField 作为输入。从命令行调用时,这两个命令都需要相同的参数集:

postProcess -func 'patchAverage(<fieldName> ,name=<patch> )'
postProcess -func 'patchIntegrate(<fieldName> ,name=<patch> '

在上面的代码片段中,<field> <patch> 分别代表要操作的物理场和边界。结果不会存储在案例目录中的任何位置,而只会输出到终端。不过可以通过将特定实用程序的输出通过管道传输到日志文件来存储它们。下面显示的是在现有物理场和管道到存储的文本文件的案例上进行这些计算的示例。

postProcess -func 'patchAverage(<fieldName> ,name=<patch> )' >  patchAveResults.txt
postProcess -func 'patchIntegrate(<fieldName> ,name=<patch> )' >  patchIntegrateResult.txt

4.1.4 vorticity

vorticity 实用程序使用速度场 U 计算涡量场 ω,并将结果写入名为 vorticity 的 volVectorField。速度场的涡度表示流动中的局部大小和旋转方向,并在方程 4.2 中定义。执行此操作也称为获取物理场的旋度。该实用程序的最终输出是写入每个时间目录的计算涡度场。 此后处理实用程序的源代码可以在 $FOAM_UTILITIES/postProcessing/velocityField/vorticity 中找到,可以采用下面的命令执行:

postProcess -func vorticity

4.1.5 probeLocation

如果在后处理期间需要在某些位置探测现场数据,则 probeLocations 是首选工具。此工具需要输入字典,可以在 system/probesDict 中设置,也可以作为 system/controlDict 中的函数对象调用。它围绕两个列表进行操作,一个包含要探测的字段的名称,另一个包含要从中探测字段值的空间位置。一般来说,如果计算后只需要探测解,使用probesDict是合适的。如果需要在模拟运行时(例如在瞬态模拟的实例中)写入瞬态探测数据,请将探测过程作为函数对象添加到 controlDict。要在 [0, 0, 0] 和 [1, 1, 1] 两个点处对压力场 p 和速度场 U 进行采样,probesDict 的配置如下所示:

fields(P U);
probeLocations
(
    (0 0 0)
    (1 1 1)
);

如果没有另外说明,则在所有现有时间对物理场进行探测,输出文件位于案例目录内的嵌套子目录中。第一个文件夹被命名为probes,子文件夹表示数据采样的第一个时间步。例如,探测收集的所有压力数据都可以在文件 probes/0/p 中找到。数据以表格方式排列,时间存储在第一列,然后是提取的物理场的值。然后可以使用 gnuplot 或 python/matplotlib 等绘图实用程序处理此格式。下面显示了压力场探测结果的示例。

# x 0 1
# y 0 1
# z 0 1
# Time
0    0        0
10    3.2323     2.2242

4.1.6 案例示例

作为展示后处理工具可能应用的示例,我们选择了二维 NACA0012 水翼。水翼被深度淹没并放置在具有均匀流入的区域中。得到的雷诺数为 Re = 1e6。NACA 剖面的弦长为 c = 1m,运动粘度为 ν = 1e−6 m2 s,这给出了自由流速度为 v = 1m/s。

该案例可以在chapter4/naca下的存储库中找到,并且应该复制到用户目录中:

run
cp -r chapter4/naca .
cd naca

要生成结果,必须执行教程随附的 Allrun 脚本。模拟完成后,检查 NACA 表面上的 y+ 分布。为此,必须在案例目录中执行 yPlus 后处理函数对象,并且必须使用 paraView 在表面上可视化生成的 yPlus场。

尽管 yPlus 将最小、最大和平均 y+ 值打印到屏幕上,但可以根据 yPlus 场以不同的方式重新计算平均值。在计算了初始 yPlus 场之后,使用 patchAverage 正是这样做的:

./Allrun
simpleFoam -postProcess -func yPlus
postProcess -func 'patchAverage(yPlus,name=FOIL)'

输出的结果不利于图形绘制,因为存在一些输出开销和多余的文本元素。通过使用 grep 仅查找行尾的浮点数,可以从 patchAverage 函数输出中过滤掉平均值。对于以后的处理,可以将它们通过管道传输到文本文件 yPlusAverage。这可以通过运行如下所示的命令来执行:

postProcess -func 'patchAverage(yPlus,name=FOIL)' | grep -o -E '[0-9]*\.[0-9]+$' >  yPlusAverage.dat

另一个实际的后处理任务是计算 x 方向上的积分和平均壁面剪应力。剪应力本身可以通过 wallShearStress 计算,它将一个新的 volVectorField 写入每个时间步目录。通过简单地链接各个命令,可以计算平均 wallShearStress,而不需要使用 paraView:

simpleFoam -postProcess -func wallShearStress
postProcess -func 'component(wallShearStress)'
postProcess -func 'patchAverage(wallShearStressx,name=FOIL)' | grep -o -E '(-|+)?[0-9]*\.[0-9]+$' >  stressXAverage.dat