名称中包含DyMFoam的任何解算器都可以使用OpenFOAM中提供的任何动态网格。前提条件是dynamicMeshDict,它必须存在于模拟实例的常量文件夹中,并且进行正确地配置。
本节提供了两个示例,每个示例都与上一节中描述得网格运动类型相关:使用solidBodyMotionFvMesh的全局网格运动和基于dynamicMotionSolverFvMesh的网格变形。两个示例都使用相同的基本网格,即浸入更大立方体域中的单位立方体。在这两种情况下,内部立方体执行相同的运动,但每个示例计算网格运动的方式不同。这两个示例指定了线性平移运动,并分别使用了solidBodyMotionFvMesh与dynamicMotionSolverFvMesh动态网格类。示例基本案例位于chapter13/unitCubeBase_globalMotion和chapter13/unitCubeBase_patchMotion下的示例案例存储库中。
建立使用动态网格的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所示。