动网格算例 – 搅拌容器

本文将详细介绍 OpenFOAM mixerVesselAMI2D 这个算例。这算例有很多值得注意的地方,比如 AMI 边界条件、动网格配置方法、用宏生成网格和 topoSet 等等。

这个搅拌容器可能是一个化工反应容器,我对这个算例的研究背景不太了解,不过算例的几何跟边条都不复杂,很容易搞懂。圆筒容器中间有个转子,圆筒周围是固定的,圆筒里充满了流体,题图是转子转起来后的流速分布。

这个算例的位置是 $FOAM_TUTORIALS/incompressible/pimpleDyMFoam/mixerVesselAMI2D,算例目录里有 0/、constant/、system/ 三个文件夹和 Allrun、makeMesh 两个脚本。Allrun 脚本和其他算例相比,特别之处在于运行了一个 makeMesh 脚本,其他语句的含义都很直观,不再赘述。我们再来看 makeMesh 脚本做了些什么。

#!/bin/sh
cd ${0%/*} || exit 1    # Run from this directory
# Source tutorial run functions
. $WM_PROJECT_DIR/bin/tools/RunFunctions
m4 < system/blockMeshDict.m4 > system/blockMeshDict
runApplication blockMesh
runApplication topoSetCode language: HTML, XML (xml)

一个特别的命令是 m4,用 man m4 命令可以查阅命令手册,手册中的描述是这样的

NAME
       m4 - macro processor

SYNOPSIS
       m4 [OPTION]... [FILE]...

DESCRIPTION
       Process  macros in FILEs.  If no FILE or if FILE is `-', standard input
       is read.

这下我们就明白了,这个算例用 blockMeshDict.m4 这个宏生成了 blockMeshDict 字典,这个用法非常的原生态,非常 Unix,有关 m4 的更多内容,请参阅 GNU M4 – GNU Project。简单看下 blockMeshDict.m4 和 blockMeshDict,重点在这里。

boundary
(
    rotor
    {
        type            wall;
        faces
        (
            ...
        );
    }

    stator
    {
        type            wall;
        faces
        (
            ...
        );
    }

    AMI1
    {
        type            cyclicAMI;
        neighbourPatch  AMI2;
        transform       noOrdering;
        faces
        (
            ...
        );
    }

    AMI2
    {
        type            cyclicAMI;
        neighbourPatch  AMI1;
        transform       noOrdering;
        faces
        (
            ...
        );
    }

    ...
);

可见,容器的转子 rotor 和定子 stator 都是壁面,而 AMI1 和 AMI2 是什么呢?它们的类型是 cyclicAMI,具体介绍在这儿OpenFOAM 2.3.0: Arbitrary Mesh Interface,简而言之,它们是固定网格和动网格的分界面。我们可以运行 ./makeMesh 后用 paraFoam 查看这些边界和网格,如下图,红色的是 stator,蓝色的是 AIM1 和 AIM2,白色的是 rotor,半透明的线是网格。

好了,现在我们知道,这些炫酷的操作最终生成了如上图所示的网格。接下来我们抛开这些复杂的底层细节,看下动网格是怎么实现的。

constant/dynamicMeshDict 字典规定了“网格怎么动”,内容如下

dynamicFvMesh   solidBodyMotionFvMesh;

motionSolverLibs ( "libfvMotionSolvers.so" );

solidBodyMotionFvMeshCoeffs
{
    cellZone        rotor;
    solidBodyMotionFunction  rotatingMotion;
    rotatingMotionCoeffs
    {
        origin        (0 0 0);
        axis          (0 0 1);
        omega         6.2832; // rad/s
    }
}
Code language: JavaScript (javascript)

dynamicFvMesh 关键字还有以下几个值可选

dynamicInkJetFvMesh
dynamicMotionSolverFvMesh
dynamicRefineFvMesh
movingConeTopoFvMesh
multiSolidBodyMotionFvMesh
rawTopoChangerFvMesh
solidBodyMotionFvMesh
staticFvMesh

可见,动网格可以细分为很多不同的类型,选择哪种类型、怎么让网格动起来是个复杂的问题。在另一个动网格的算例 movingCone 中,这个关键字的值是 dynamicMotionSolverFvMesh。这一问题已经超出了本文讨论的范围,我们不再展开。

接下来我们看下边界条件和初始条件,这个边条一定要和 blockMesh 中的 type 对应,比如 type 为 patch 的边界可以是入口出口之类的,type 为 wall 的边界只能是 wall 或者 movingWall 之类的,AIM cycle 同理。以 0/U 为例

boundaryField
{
    rotor
    {
        type            movingWallVelocity;
        value           uniform (0 0 0);
    }

    stator
    {
        type            movingWallVelocity;
        value           uniform (0 0 0);
    }

    front
    {
        type            empty;
    }

    back
    {
        type            empty;
    }

    AMI1
    {
        type            cyclicAMI;
        value           $internalField;
    }

    AMI2
    {
        type            cyclicAMI;
        value           $internalField;
    }
}
Code language: PHP (php)

可以看到 stator 和 rotor 都用了 movingWallVelocity 边条,而不是简单的 wall,一个解释是这样的

Rotating walls that generally non-symmetric (though preferably at least periodic) and inside of the rotating zone need the boundary condition movingWallVelocity, which corrects fluxes for moving boundaries. If the boundary does not move, it behaves exactly asfixedValue. The value is zero, because it is the boundary velocity with respect to the moving frame.
https://www.cfdsupport.com/Turbomachinery-CFD-manual/node380.html

此外,topoSet、decomposePar 都很常规,没什么特别之处,不再讨论了。

这个算例的复杂之处不在动网格,而在炫酷的网格生成技巧。除了网格,也就是 AIM 比较有特点,是这个算例的亮点。在动网格配置上,和 movingCone 类似。

动网格在 OpenFOAM 上的实现方法十分简单,只是配置一个 constant/dynamicMeshDict 字典,并使用特别的边界条件就行。困难仍然在于“用什么方法让网格动起来”这个计算流体力学问题。

常恭

作者: 常恭

略懂 OpenFOAM

发表评论