名称中包含DyMFoam的任何解算器都可以使用OpenFOAM中提供的任何动态网格。前提条件是dynamicMeshDict,它必须存在于模拟实例的常量文件夹中,并且进行正确地配置。

本节提供了两个示例,每个示例都与上一节中描述得网格运动类型相关:使用solidBodyMotionFvMesh的全局网格运动和基于dynamicMotionSolverFvMesh的网格变形。两个示例都使用相同的基本网格,即浸入更大立方体域中的单位立方体。在这两种情况下,内部立方体执行相同的运动,但每个示例计算网格运动的方式不同。这两个示例指定了线性平移运动,并分别使用了solidBodyMotionFvMesh与dynamicMotionSolverFvMesh动态网格类。示例基本案例位于chapter13/unitCubeBase_globalMotion和chapter13/unitCubeBase_patchMotion下的示例案例存储库中。

图13.6 x-z平面中的几何体草图,用于unitCubeBase案例

建立使用动态网格的OpenFOAM案例可能是一项繁琐的工作,尤其是当流动求解器在一个时间步长中占用大量的计算时间时。 工具moveDynamicMesh避免了长时间等待来检查案例是否配置正确:它执行求解者在使用动态网格时所做的所有步骤,而无需昂贵的流求解步骤。 因此,只有mesh.update()在时间循环中执行,该循环触发运行时选择的动态网格类执行的网格修改。 只要运动不依赖于流动模拟得到的任何数据,这种方法就能很好地工作。

使用moveDynamicMesh应用程序扩展具有动态网格操作的模拟实例的速度更快,因为它需要的执行时间比流动求解器短。

13.2.1 全局网格运动

如本节开头所述,可以通过将solidBodyMotionFvMesh与任何选择的solidBodyMotionFunction结合使用来实现全局网格运动。为了实现线性平移运动,在本例中使用linearMotion。与本书中描述的所有其他教程案例类似,第一步是将教程复制到可以安全编辑的位置。为此,请切换到示例案例存储库并找到chapter13目录:

ofprimer >  cp -r cases/chapter13/unitCubeBase_globalMotion $FOAM_RUN
ofprimer >  run

如果需要更改网格运动,dynamicMeshDict是唯一需要调整的配置文件。从以下摘录中可以看出,它采用solidBody运动解算器定义网格运动类,而linearMotion定义运动函数。

dynamicFvMesh                 dynamicMotionSolverFvMesh;
motionSolverLibs             ("libfvMotionSolvers.so");
solver                        solidBody;
solidBodyMotionFunction     linearMotion;
velocity     (1 0 0);

上述字典指示solidBody从linearMotion获取变换,并将其应用于所有网格点,而不是区域。在能够测试运动之前,需要生成网格。因此,请执行以下两个步骤,但请注意,第二个步骤将在案例文件夹中生成时间点目录:

?>  blockMesh
?>  moveDynamicMesh

第二个调用执行moveDynamicMesh,后者依次处理网格运动,并为每个时间步向屏幕提供多行输出。根据controlDict的配置,时间步长目录以各种频率生成。使用示例案例存储库中的当前案例配置,数据每0.05秒写入一次,并可使用paraView进行检查。第4章描述了如何使用paraView可视化OpenFOAM结果,整个网格仅沿x轴方向移动。

13.2.2 网格变形

与上一节中介绍的全局网格运动示例相比,网格变形在配置工作方面的要求更高。此示例案例的准备版本可在chapter 13/unitCubeBase_patchMotion中找到。添加的constant/dynamicMeshDict负责网格运动,一个新物理场添加到0目录,并且需要在system/fvSolution中插入一个附加的求解器条目。最后两个条目取决于网格运动解算器的类型,在第13.1节中已简要介绍了它们。对于该示例,选择基于位移的网格运动解算器。因此,添加的新物理场名为pointDisplacement,它是一个pointVectorField,需要为此物理场设置相应的边界条件:

dimensions [0 1 0 0 0 0 0];
internalField uniform (0 0 0);
boundaryField
{
    "(XMIN|XMAX|YMIN|YMAX|ZMIN|ZMAX)"
    {
        type    fixedValue;
        value    uniform (0 0 0);
    }
    HULL
    {
        type        solidBodyMotionDisplacement;
        solidBodyMotionFunction linearMotion;
        linearMotionCoeffs
        {
            velocity (1 0 0);
        }
    }
}

为了说明dynamicMotionSolverFvMesh的功能,不仅为长方体本身定义了运动,还为外部边界指定了速度。该长方体的速度与上一教程中的速度相同,但对于其余面片,速度降低为0.75。当然,这种设置实际上具有有限的执行时间,因为盒子将随着其运动而过多地压缩网格。不过,此设置可作为如何将各种运动指定给不同边界的示例。

前面示例的dynamicMeshdict也需要更改,应该如下所示:

dynamicFvMesh         dynamicMotionSolverFvMesh;
motionSolverLibs     ("libfvMotionSolvers.so");
solver                displacementLaplacian;
displacementLaplacianCoeffs
{
    diffusivity    inverseDistance (HULL);
}

如前所述,在System/fvSolution中需要一个新的求解器条目。 为此,选择了带有高斯赛德尔平滑器的GAMG型求解器。 必须将以下条目添加到FVSolution的Solvers子字典中:

cellDisplacement
{
    solver                    GAMG;
    tolerance                1e-5;
    relTol                    0;
    smoother                GaussSeidel;
    cacheAgglomeration         true;
    nCellsInCoarsestLevel     10;
    agglomerator             faceAreaPair;
    mergeLevels                1;
}

通过添加0/pointDisplacement边界文件、fvSolution中的上述条目以及对dynamicMeshDict的所述更改,可以再次执行unitCubeBase示例。

?>  rm -rf 0.* [1-9]*
?>  moveDynamicMesh

网格变形结果如图13.7所示。

图13.7 应用于网格边界的指定运动的网格变形