后处理方法示例提供了一种易于使用且功能强大的方法来提取模拟数据。虽然有许多可视化应用程序可以产生有吸引力的图像,但样本更适合视觉上不那么吸引人但可以说更重要的定量分析角色。例如,不是从速度赋值表示中直观地估计边界层厚度,而是可以从原始或插值速度数据中提取它并放入数据表中。

通常,采样用于提取和生成模拟结果的数据子集的 1D、2D 或 3D 表示,例如点值、线图或等值面。支持不同的输出格式,以及不同的几何采样实体。

在以前的 OpenFOAM 版本中,sample 是一个独立的实用程序,但后来被弃用,现在其分布在各种后处理函数对象之间。这种较新的配置允许在模拟运行期间以及模拟完成后执行所有采样操作。这些函数现在通常在默认情况下通过函数子字典中的 controlDict 定义。或者,只要用户在调用后处理实用程序时指向适当的文件,就可以在单独的字典中定义函数。后一种方法倾向于帮助案件和后处理程序保持条理,将在下面概述。此处的示例案例字典中概述了各种点探针、图形或表面提取功能配置的示例:

?>  ls $FOAM_ETC/caseDicts/postProcessing/probes
boundaryCloud cloud.cfg internalCloud.cfg probes.cfg
boundaryCloud.cfg internalCloud probes
?>  ls $FOAM_ETC/caseDicts/postProcessing/graphs
graph.cfg sampleDict.cfg singleGraph
?>  ls $FOAM_ETC/caseDicts/postProcessing/visulaization
runTimePostPro.cfg streamlines streamlines.cfg surfaces surfaces.cfg

在文本编辑器中从etc打开上面所示的示例,将显示示例后处理实用程序的所有可用配置选项。 有大量可用的选项,并且提供的采样文档非常详细。 这些选项以清晰的方式进行了描述。 sample可以处理大量的采样参数:字段名、输出格式、网格集合、插值方案和曲面。

无论采样参数如何变化,sample 始终以相同的方式处理数据采样过程,而不管用户选择的参数子集如何。通过在物理场单词列表中提供场名称来选择要采样的字段。网格的子集(集合子字典)或几何实体(表面子字典)用于定位数据采样点。如果数据采样点与保存现场数据的网格点(例如像元中心或面中心)不一致,则使用不同的插值方案(interpolationScheme 参数)对数据进行插值。然后将插值数据以指定的输出格式(setFormat 参数)存储在案例中。

一维数据提取的一个例子是定义一条与流动域相交的线,并沿这条线对速度场进行采样。这可用于采样,例如速度分布。然后可以使用任何首选的绘图实用程序将此提取的配置文件与其他数据集进行比较。

sample 的另一个示例应用是在大型模拟案例中提取边界场值。无需尝试在 paraView 中打开整个模拟案例,可以使用 sample 仅提取相关边界上的值。这种使用样本进行后处理的本地化方法可以大大减少所需的计算资源,具体取决于数据集的大小。

任何模拟案例都可用于展示如何使用示例实用程序对模拟数据进行采样。为此,选择了二维上升气泡测试用例,可在示例用例存储库的 chapter4/risingBubble2D 子目录中找到。为了在这种情况下成功使用样本,必须执行模拟:

blockMesh
setField
interFoam

接下来的部分涵盖了使用示例的示例,它们都涉及操作函数子字典。虽然此子字典可以在 controlDict 中定义,但它也可以在单独的自定义字典文件中定义,这是我们将在本示例中使用的方法。

注:在继续执行示例之前,请在选择的文本编辑器中打开随示例源代码提供的 sampleDict,以查看所有可能的采样配置选项。

4.2.1 沿直线采样

在此示例中(上升气泡),在 2D 气泡位于模拟域的顶部壁面后检查其宽度。采样线将在时间 t = 7.0 s 沿穿过气泡的线对 alpha.liquid 场进线采样。配置为沿线采样的函数子字典如下所示:

setFormat raw;
interpolationScheme cellPoint;
fields
(
     alpha.liquid
     p_rgh
     U
);

sets
(
     alphaWaterLine
     {
         type    uniform;
         axis    distance;
         start    (-0.001 1.88 0.005);
         end        (2.01    1.88 0.005);
         nPoints    250;
     }
);

setFormat选项更改写入文件的数据的格式,interpolationScheme选项指定在将数据映射到示例线之前发生的值插值类型(如果有)。 所有要采样的字段都需要在字段列表中列出-在本例中是alpha.water字段。 sets子字典包含提取的所有示例线的列表。

alphaWaterline子字典的类型条目定义了采样数据如何沿直线分布--在本例中,使用均匀点分布。 Axis参数确定如何写入点坐标-距离导致参数化输出,因为坐标是从第一个直线点开始的沿直线的距离。 Axis参数还有其他可用的选项,例如XYZ,其中采样点的绝对位置向量将被写入数据文件的第一列。 接下来,对于线条样本,需要提供三维起点和终点。 在此设置中,npoints指定采样点的数量。

注意:将取样线稍微调整到远离边界的位置。通常,取样线不与网格面共面,因为这样无法确定与采样线相交的网格。

一旦配置了sampledict.set,就可以执行以下命令对t=7 s执行postprocess:

interFoam -postProcess -dict ./system/sampleDict.set -time 0.7

此命令将创建一个新目录,其中包含以下文件:

?>  ls postProcessing/sets/7
alphaWaterLine_alphaWater_p.xy alphaWaterLine_U.xy

标量场alpha.water和p存储在同一个文件中,而采样的矢量速度场存储在单独的文件中。 alpha.water场值可以从存储的数据中可视化,使用绘图工具,应该会导致类似于图4.2的图。

图4.2:沿定义的线的alpha.water

注:如果在执行sample时省略-time7选项,则会对每个timeStep进行采样,从而对相应的XY数据进行插值和保存。

4.2.2 在平面上采样

沿平面采样对于大型3D案例特别有用,这些案例可能非常大,需要很长时间才能通过网络连接传输模拟数据。为平面设置采样的过程与设置线采样非常相似。需要配置surfaceFormat条目,并且需要在surfaces子字典内部提供样本平面列表。与线采样类似,应避免使采样平面与网格面共面。

先前的interpolationScheme集合再次用于将以单元为中心的流动数据插值到平面上。这种设置的示例sampleDict如下所示:

functions
{
    surfaces
    {
        type surfaces;
        surfaceFormat vtk;
        writeControl writeTime;
        interpolationScheme cellPoint;
        fields (U p_rgh alpha.water);
        surfaces
        (
            constantPlane
            (
                type cuttingPlane;
                planeType pointAndNormal;
                pointAndNormalDict
                {
                    point (1.0 1.0 0.005);
                    normal (0.0 0.0 1.0);
                }
            )
        );
    };
}

为面选择VTK输出格式,并且在constantPlane子目录中将曲面类型设置为Plane。 使用点位置向量(point)和平面法向量(normal)定义平面。

为了生成visualization toolkit(visualization toolkit,VTK)平面曲面并提取alpha.water数据,-postprocess在Chapter4/RisingBubble2D案例的特定显式时间目录上执行:

interFoam -postProcess -dict ./system/sample.surface -time 7

在PostProcessing文件夹中创建了一个surfaces/7子目录,其中包含采样数据:

>  ls postProcessing/surfaces/7
constantPlane.vtp

显然,随着物理场的采样,存储了尽可能多的VTK面。可以直接在paraView中打开以VTK格式存储的面来可视化。在图4.3中,用采样的alpha.water场示出采样的平面。由于risingBubble2D情况是二维的,因此该采样示例的结果与在paraView中使用剪切过滤器时的结果相同。

图4.3: 平面上的alpha.water场样本

4.2.3 等值面生成与插值

除了提取数据外,-postprocess实用程序还可以从现有的流动数据中生成等值面。 在这个例子中,它被用来生成一个表示气液界面的等值面,并在其上插值压力场。 等值面类型配置在sampleDict的Surfaces子字典中:

functions
{
    // Surfaces sample function object
    surfaces
    {
        type surfaces;
        surfaceFormat vtk;
        writeControl writeTime;
        interpolationScheme cellPoint;
        fields (U p_rgh alpha.water);
        surfaces
        (
            fluidInterface
            (
                type
                isoSurface;
                isoField alpha.water;
                isoValue    0.5;
                interpolate true;
                pointAndNormalDict
                {
                    point  (1.0 1.0 0.005);
                    normal (0.0 0.0 1.0);
                }
            )
        );
    };
}

为了生成等值面,-postprocess将在t=7s输出求解上执行:

interFoam -postProcess -dict ./system/sample.isoSurface -time 7

在图4.4中显示了 alpha.water = 0.5的等表面,其中相互作用的压力作用在气泡上。

图4.4: 通过压力p着色的 alpha.water = 0.5的等表面

4.2.4 边界采样

-postprocess的功能并不局限于创建样本平面和样本线。 可以提取整个patch,并将任何所需的边界流场值映射到patch上。 尽管使用了一个相当小的二维模拟案例来说明这一过程,但补丁采样更适合于大的情况,在大的情况下,加载整个流域效率不高,或者由于RAM限制,可能太大而无法在后处理器中打开。 在此示例中,提取了RisingBubble2D示例案例的顶部壁面,并可视化了作用在其上的压力场。 使用适当配置的sampledict:

functions
{
    // Surfaces sample function object
    surfaces
    {
        type surfaces;
        surfaceFormat vtk;
        writeControl writeTime;
        interpolationScheme cellPoint;
        fields (U p_rgh alpha.water);
        surfaces
        (
            walls_constant
            (
                type patch;
                patches ( top );
            )
        );
    };
}

在risingBubble2D示例模拟案例的最后时间步上执行采样:

interFoam -postProcess -dict ./system/sample.patch -time 7

示例实用程序在模拟案例目录中生成postProcessing/surfaces/7子目录,内容如下:

?>  ls postProcessing/surfaces/7/
walls_constant.vtp

创建一个patchVTK文件,在边界单元处写入三个物理场集。

4.2.5 多集合及曲面采样

sample实用程序允许对不同的sets和surfaces进行采样,因此sampledict存储这些元素的列表。 在RisingBubble2D/System Simulation case目录中准备了一个工作Sampledict配置文件。 它存储了本节中描述的所有示例的配置。 当需要来自sample的其他功能时,应用程序源代码提供的sampleDict字典应该是第一个查看的地方。