移動メッシュ

2015年2月6日

はじめに

移動メッシュについて。

使用バージョン

OpenFOAM 2.3.1

ファイル

移動メッシュ

移動メッシュは、それに対応したソルバーで利用できる。標準ソルバーでは interDyMFoam など、"DyM" の文字が付いたものがそれに当たる。移動メッシュだけを扱いたければ、moveDynamicMesh というユーティリティが使える。

移動メッシュの設定は constant/dynamicMeshDict で行う。

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      dynamicMeshDict;
}

dynamicFvMesh dynamicMotionSolverFvMesh;

motionSolverLibs ("libfvMotionSolvers.so");

solver velocityComponentLaplacian;

velocityComponentLaplacianCoeffs
{
    component       x;
    diffusivity     inverseDistance (move);
}

dynamicFvMesh では以下のものを指定できる。

  • dynamicInkJetFvMesh
  • dynamicMotionSolverFvMesh
  • dynamicRefineFvMesh
  • multiSolidBodyMotionFvMesh
  • solidBodyMotionFvMesh
  • staticFvMesh

staticFvMesh は移動メッシュを用いないという意味である。dynamicRefineFvMesh はいわゆるアダプティブメッシュを用いるためのものである。ここでは dynamicMotionSolverFvMesh と solidBodyMotionFvMesh、multiSolidBodyMotionFvMesh についてだけ考える。

solver では以下のものを指定できる。

  • displacementComponentLaplacian
  • displacementInterpolation
  • displacementLaplacian
  • displacementLayeredMotion
  • displacementSBRStress
  • velocityComponentLaplacian
  • velocityLaplacian

それぞれ要求されるファイルが異なる。velocityComponentLaplacian は時刻フォルダに pointMotionUx などを要求し、velocityLaplacian は pointMotionU を、displacementLaplacian は pointDisplacement を要求する。

motionSolverLibs に "libsixDoFRigidBodyMotion.so" を指定しておけば、solver で sixDoFRigidBodyMotion を指定できる。

velocityComponentLaplacian

velocityComponentLaplacian は x、y、z いずれかの成分の移動速度を指定できるものである。設定は以下の通りである。

solver velocityComponentLaplacian;

velocityComponentLaplacianCoeffs
{
    component       x;
    diffusivity     inverseDistance (move);
}

速度の指定は 0/pointMotionUx などで行う。

FoamFile
{
    version     2.0;
    format      ascii;
    class       pointScalarField;
    object      pointMotionU;
}

dimensions      [0 1 -1 0 0 0 0];

internalField   uniform 0;

boundaryField
{
    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"

    ".*"
    {
        type            uniformFixedValue;
        uniformValue    constant 0;
    }

    move
    {
        type            uniformFixedValue;
        uniformValue    constant 0.3;
    }
}

velocityComponentLaplacianCoeffs の diffusivity はメッシュを変形させる方法の指定で、以下のようなものを指定できる。

  • uniform
  • directional
  • inverseDistance
  • inverseFaceDistance
  • inversePointDistance
  • inverseVolume
  • quadratic
  • exponential

quadratic と exponential は、それぞれの手法の前に付けるものである。

次のモデルを用いて、diffusivity の比較を行う。

uniform

    diffusivity     uniform;

メッシュがゆがんでいる。

directional

    diffusivity     directional ( 1 1 0 );

パラメタ調整可能。この場合 uniform と変わらない。

inverseDistance

    diffusivity     inverseDistance (move);

境界の指定が必要。

inverseFaceDistance

    diffusivity     inverseFaceDistance (move);

inverseDistance と変わらない。

inversePointDistance

    diffusivity     inversePointDistance (move);

inverseDistance と変わらない。

inverseVolume

    diffusivity     inverseVolume;

quadratic

    diffusivity     quadratic inverseDistance (move);

inverseDistance とあまり変わらない。

exponential

    diffusivity     exponential 10 inverseDistance (move);

パラメタ調整可能。ここでは inverseDistance とあまり変わらない。

上下面 slip

上下面を slip にした場合の inverseDistance の結果。上下の拘束が緩くなった分、全体的にゆがみが緩和されている。

velocityLaplacian

velocityLaplacian は、移動速度をベクトルで指定できる。設定は以下の通りである。

solver velocityLaplacian;

velocityLaplacianCoeffs
{
    diffusivity     inverseDistance (move);
}

速度の指定は 0/pointMotionU で行う。

FoamFile
{
    version     2.0;
    format      ascii;
    class       pointScalarField;
    object      pointMotionU;
}

dimensions      [0 1 -1 0 0 0 0];

internalField   uniform 0;

boundaryField
{
    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"

    ".*"
    {
        type            uniformFixedValue;
        uniformValue    constant (0 0 0);
    }

    move
    {
        type            uniformFixedValue;
        uniformValue    constant (0.3 0.3 0);
    }
}

velocityLaplacianCoeffs の diffusivity は、以下のようなものを指定できる。

  • uniform
  • directional
  • motionDirectional
  • inverseDistance
  • inverseFaceDistance
  • inversePointDistance
  • inverseVolume
  • quadratic
  • exponential

quadratic と exponential は、それぞれの手法の前に付けるものである。

上述のモデルで、diffusivity の比較を行う。

uniform

    diffusivity     uniform;

メッシュがゆがんで境界に重なってしまっている。

directional

    diffusivity     directional ( 1 1 0 );

uniform と変わらない。

motionDirectional

    diffusivity     motionDirectional ( 1 1 0 );

motionDirectional と変わらない。

inverseDistance

    diffusivity     inverseDistance (move);

inverseFaceDistance

    diffusivity     inverseFaceDistance (move);

inverseDistance と変わらない。

inversePointDistance

    diffusivity     inversePointDistance (move);

inverseDistance と変わらない。

inverseVolume

    diffusivity     inverseVolume;

メッシュが破綻してしまった。

quadratic

    diffusivity     quadratic inverseDistance (move);

inverseDistance とあまり変わらない。

exponential

    diffusivity     exponential 10 inverseDistance (move);

inverseDistance とあまり変わらない。

diffusivity のまとめ

以上で示した例では、inverseDistance が無難そうである。

displacementLaplacian

displacementLaplacian は、移動変位を指定できる。設定は以下のとおりである。

solver displacementLaplacian;

displacementLaplacianCoeffs
{
    diffusivity     inverseDistance (move);
}

移動変位は 0/pointDisplacement で指定する。

FoamFile
{
    version     2.0;
    format      ascii;
    class       pointVectorField;
    object      pointDisplacement;
}

dimensions      [0 1 0 0 0 0 0];

internalField   uniform (0 0 0);

boundaryField
{
    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"

    ".*"
    {
        type            uniformFixedValue;
        uniformValue    constant (0 0 0);
    }

    move
    {
        type            oscillatingDisplacement;
        amplitude       (0.1 0 0);
        omega           6.25;
        value           uniform (0 0 0);
    }
}

移動変位指定の type では、以下のようなものを指定できる。

oscillatingDisplacement

    move
    {
        type            oscillatingDisplacement;
        amplitude       (0.1 0 0);
        omega           6.25; // 2*pi/T [rad/s]
        value           uniform (0 0 0);
    }

振動変位を与える。

angularOscillatingDisplacement

    move
    {
        type            angularOscillatingDisplacement;
        axis            (0 0 1);
        origin          (0.5 0.5 0);
        angle0          0; [rad]
        amplitude       0.785;  [rad]
        omega           6.25;  2*pi/T [rad/s]
        value           uniform (0 0 0);
    }

回転の振動変位を与える。

solidBodyMotionDisplacement

solidBodyMotionDisplacement は、solidBodyMotionFunction により様々な変位の与え方ができる。

linearMotion

    move
    {
        type            solidBodyMotionDisplacement;
        solidBodyMotionFunction linearMotion;
        linearMotionCoeffs
        {
            velocity (0.3 0 0);
        }
    }

線形の変位を与える。

rotatingMotion

    move
    {
        type            solidBodyMotionDisplacement;
        solidBodyMotionFunction rotatingMotion;
        rotatingMotionCoeffs
        {
            origin (0.5 0.5 0);
            axis (0 0 1);
            omega 0.785;  [rad/s]
        }
    }

回転を与える。

axisRotationMotion

    move
    {
        type            solidBodyMotionDisplacement;
        solidBodyMotionFunction axisRotationMotion;
        axisRotationMotionCoeffs
        {
            origin (0.5 0.5 0);
            radialVelocity (0 0 45);  [deg/s]
        }
    }

回転を与える。

oscillatingLinearMotion

    move
    {
        type            solidBodyMotionDisplacement;
        solidBodyMotionFunction oscillatingLinearMotion;
        oscillatingLinearMotionCoeffs
        {
            amplitude (0.1 0 0);
            omega 6.25;  [rad/s]
        }
    }

振動変位を与える。

oscillatingRotatingMotion

    move
    {
        type            solidBodyMotionDisplacement;
        solidBodyMotionFunction oscillatingRotatingMotion;
        oscillatingRotatingMotionCoeffs
        {
            origin (0.5 0.5 0);
            amplitude (0 0 45);  [deg]
            omega 6.25;  [rad/s]
        }
    }

回転の振動変位を与える。

multiMotion

    move
    {
        type            solidBodyMotionDisplacement;
        solidBodyMotionFunction multiMotion;
        multiMotionCoeffs
        {
            linear
            {
                solidBodyMotionFunction oscillatingLinearMotion;
                oscillatingLinearMotionCoeffs
                {
                    amplitude (0.1 0 0);
                    omega 6.25;  [rad/s]
                }
            }

            rotating
            {
                solidBodyMotionFunction oscillatingRotatingMotion;
                oscillatingRotatingMotionCoeffs
                {
                    origin (0.5 0.5 0);
                    amplitude (0 0 45);  [deg]
                    omega 6.25;  [rad/s]
                }
            }
        }
    }

solidBodyMotionFunction を組み合わせることができる。上記の例では oscillatingLinearMotion と oscillatingRotatingMotion で回転させながら左右に移動させている。波括弧の頭についている "linear"、"rotating" は任意の名前。

tabulated6DoFMotion

    move
    {
        type            solidBodyMotionDisplacement;
        solidBodyMotionFunction tabulated6DoFMotion;
        tabulated6DoFMotionCoeffs
        {
            timeDataFileName "$FOAM_CASE/constant/6DoF.dat";
            CofG (0.5 0.5 0);
        }
    }

constant/6DoF.dat

// x = 0.1*sin(2*pi*t)
// rz = 45*sin(2*pi*t)
(
(0.0 (( 0.000 0 0) (0 0  0.00)))
(0.1 (( 0.059 0 0) (0 0  26.45)))
(0.2 (( 0.095 0 0) (0 0  42.80)))
(0.3 (( 0.095 0 0) (0 0  42.80)))
(0.4 (( 0.059 0 0) (0 0  26.45)))
(0.5 (( 0.000 0 0) (0 0  00.00)))
(0.6 ((-0.059 0 0) (0 0 -26.45)))
(0.7 ((-0.095 0 0) (0 0 -42.80)))
(0.8 ((-0.095 0 0) (0 0 -42.80)))
(0.9 ((-0.059 0 0) (0 0 -26.45)))
(1.0 (( 0.000 0 0) (0 0  0.00)))
)

テーブルで時刻に応じた並進 3 方向、回転 3 方向を与える。上記の例は、multiMotion の例を再現したものである。

displacementSBRStress

displacementSBRStress は、displacementLaplacian と使い方は同じだが、メッシュの変形の仕方が異なるようである。

solver displacementSBRStress;

displacementSBRStressCoeffs
{
    diffusivity     inverseDistance (move);
}

solidBodyMotion

solidBodyMotionFvMesh、multiSolidBodyMotionFvMesh は、セルの剛体移動を行うためのものである。上述の dynamicMotionSolverFvMesh はパッチの移動を扱うが、こちらはセルの移動を扱う。

solidBodyMotionFvMesh の設定は以下の通りである。

constant/dynamicMeshDict

dynamicFvMesh solidBodyMotionFvMesh;

solidBodyMotionFvMeshCoeffs
{
    cellZone        move;

    solidBodyMotionFunction rotatingMotion;

    rotatingMotionCoeffs
    {
        origin (0 0 0);
        axis (0 0 1);
        omega 0.785; // [rad/s]
    }
}

cellZone で移動させるセルゾーンを指定する。使い方は dynamicMotionSolverFvMesh の solver である displacementLaplacian の solidBodyMotionDisplacement 同様である。

multiSolidBodyMotionFvMesh は、移動させるセルゾーンが複数ある場合に使用する。

dynamicFvMesh multiSolidBodyMotionFvMesh;

multiSolidBodyMotionFvMeshCoeffs
{
    move
    {
        solidBodyMotionFunction rotatingMotion;

        rotatingMotionCoeffs
        {
            origin (0 0 0);
            axis (0 0 1);
            omega 0.785;  [rad/s]
        }
    }
}

波括弧の上の "move" の部分は、セルゾーンの名前を指定する必要がある。

cyclicAMI と組み合わせて物体の回転運動を表現することができる。

pimpleDyMFoam で左から右に向かう流れを作っている。中央の四角の穴を含む丸い領域が移動するセルゾーンで、界面が cyclicAMI になっている。アニメーションのコンターは速度である。

中央の四角の壁の速度の境界条件は、movingWallVelocity にしている。

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

dynamicMotionSolverFvMesh と大きく異なるのは、セルゾーンを移動させても周りのメッシュは変形してくれないことである。したがって solidBodyMotionFvMesh の場合、スライディングインターフェイス (cyclicAMI や cyclicACMI) と組み合わせる必要がある。