オーバーセットメッシュ

2018年3月24日

はじめに

オーバーセットメッシュを使ってみる

バージョン

OpenFOAM v1712

ファイル

とりあえず動かす

カルマン渦の計算 をしてみる。ソルバーは overPimpleDyMFoam を用いる。ケースは pimpleFoam のケース pitzDaily をベースとする。

$ cp -r $FOAM_TUTORIALS/incompressible/pimpleFoam/RAS/pitzDaily cylinder

ここではとりあえずケースが動くようにする。

メッシュの作成。

$ blockMesh

移動メッシュの設定。

constant/dynamicMeshDict

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

motionSolverLibs ( "libfvMotionSolvers.so" );

solver          displacementLaplacian;

displacementLaplacianCoeffs
{
    diffusivity     uniform 1;
}

dynamicFvMesh       dynamicOversetFvMesh;

dynamicOversetFvMeshCoeffs
{
//    layerRelax 0.3;
}

フィールドの設定。

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
{
    ".*"
    {
        type            uniformFixedValue;
        uniformValue    (0 0 0);
    }
}

0/zoneID

FoamFile
{
    version     2.0;
    format      ascii;
    class       volScalarField;
    location    "0";
    object      zoneID;
}

dimensions      [0 0 0 0 0 0 0];


internalField   uniform 0;

boundaryField
{
    ".*"
    {
        type            zeroGradient;
    }

    frontAndBack
    {
        type            empty;
    }
}

スキームの設定。

system/fvSchemes

oversetInterpolation
{
    method          inverseDistance;
}

ソルバーの設定。

system/fvSolution

solvers
{
    cellDisplacement
    {
        solver          PCG;
        preconditioner  DIC;

        tolerance       1e-06;
        relTol          0;
        maxIter         100;
    }

    p
    {
        solver          PBiCGStab;
        preconditioner  DILU;
        tolerance       1e-6;
        relTol          0;
    }
    ...
}

実行。

$ overPimpleDyMFoam

一応動く。

オーバーセットメッシュの設定

背景メッシュの作成

カルマン渦のケースを作っていく。メッシュは、矩形領域に円柱のメッシュを埋め込む形とする。まず、背景のメッシュを用意する。

system/blockMeshDict

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

convertToMeters 1;

vertices
(
    (0  0  -0.5)
    (50 0  -0.5)
    (50 20 -0.5)
    (0  20 -0.5)
    (0  0  0.5)
    (50 0  0.5)
    (50 20 0.5)
    (0  20 0.5)
);

blocks
(
    hex (0 1 2 3 4 5 6 7) (50 20 1) simpleGrading (1 1 1)
);

edges
(
);

boundary
(
    top
    {
        type wall;
        faces
        (
            (3 7 6 2)
        );
    }
    bottom
    {
        type wall;
        faces
        (
            (1 5 4 0)
        );
    }
    left
    {
        type patch;
        faces
        (
            (0 4 7 3)
        );
    }
    right
    {
        type patch;
        faces
        (
            (2 6 5 1)
        );
    }
    frontAndBack
    {
        type empty;
        faces
        (
            (0 3 2 1)
            (4 5 6 7)
        );
    }
);

mergePatchPairs
(
);

基本的な計算条件の設定

層流の条件とする。

$ rm 0/epsilon
$ rm 0/k
$ rm 0/nuTilda
$ rm 0/nut

constant/turbulenceProperties

simulationType laminar; //RAS;

境界条件。

0/U

internalField   uniform (1 0 0);

boundaryField
{
    left
    {
        type            fixedValue;
        value           uniform (1 0 0);
    }

    right
    {
        type            zeroGradient;
    }

    "(top|bottom)"
    {
        type            slip;
    }

    frontAndBack
    {
        type            empty;
    }
}

0/p

internalField   uniform 0;

boundaryField
{
    ".*"
    {

        type            zeroGradient;
    }

    right
    {
        type            fixedValue;
        value           uniform 0;
    }

    frontAndBack
    {
        type            empty;
    }
}

計算時間の設定。

system/controlDict

endTime         100;

deltaT          0.1;

writeControl    runTime;

adjustTimeStep  no;

とりあえず動くことを確認。

円柱メッシュの作成

円柱のメッシュを用意する。まずは ParaView で円柱形状を作る。

  1. [Sources]-[Cylinder]
    • Resolution : 50
    • Height : 1.2
    • Radius : 0.5
    • Cneter : 0 0 0
  2. Filter "Transform"
    • Rotate : 90 0 0
  3. Filter "Transform"
    • Translate : 10 10 0
  4. Filter "Clip"
    • Origin : 10 10 -0.5
    • Normal : 0 0 1
  5. Filter "Clip"
    • Origin : 10 10 0.5
    • Normal : 0 0 1
    • Inside Out にチェック
  6. Filter "Extract Surface"
  7. Filter "Triangulate"
  8. [File]-[Save Data...]
    • STL で保存

cylinder ケースをコピーして、メッシュ作成用のケースディレクトリを用意。

$ cp -r cylinder cylinderMesh
$ mv cylinderMesh cylinder
$ cd cylinder/cylinderMesh

円柱形状のデータを設置。

$ mkdir constant/triSurface
$ mv cylinder.stl constant/triSurface

extrudeMesh で円柱の表面を延ばしてメッシュを作る。

system/extrudeMeshDict

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

constructFrom surface;

surface "constant/triSurface/cylinder.stl";

flipNormals false;

extrudeModel        linearNormal;

nLayers             10;

expansionRatio      1.02;

linearNormalCoeffs
{
    thickness       0.7;
}

mergeFaces false;

mergeTol 0;

メッシュを作成。

$ extrudeMesh

createPatch で境界を設定する。

system/createPatchDict

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

pointSync false;

patches
(
    {
        name oversetPatch;

        patchInfo
        {
            type overset;
        }

        constructFrom patches;

        patches (otherSide);
    }

    {
        name cylinderWall;

        patchInfo
        {
            type wall;
        }

        constructFrom patches;

        patches (originalPatch);
    }

    {
        name frontAndBack;

        patchInfo
        {
            type empty;
        }

        constructFrom patches;

        patches (sides);
    }

);

createPatch の実行。

$ createPatch -overwrite

円柱メッシュを背景メッシュにマージする。

$ cd ..
$ mergeMeshes . cylinderMesh -overwrite

オーバーセットメッシュの設定

zoneID 設定用にセルセットを topoSet で作成。

system/topoSetDict

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

actions
(
    {
        name    c0;
        type    cellSet;
        action  new;
        source  regionToCell;
        sourceInfo
        {
            insidePoints ((0 0 0));
        }
    }

    {
        name    c1;
        type    cellSet;
        action  new;
        source  cellToCell;
        sourceInfo
        {
            set c0;
        }
    }

    {
        name    c1;
        type    cellSet;
        action  invert;
    }
);

背景メッシュからセルセット c0 を作成し、c0 から c1 を作成してそれの補集合、すなわち円柱メッシュのセルセットを作っている。

topoSet を実行。

$ topoSet

境界条件の設定。

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
{
    oversetPatch
    {
        type            zeroGradient;
    }

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

0/zoneID

FoamFile
{
    version     2.0;
    format      ascii;
    class       volScalarField;
    location    "0";
    object      zoneID;
}

dimensions      [0 0 0 0 0 0 0];


internalField   uniform 0;

boundaryField
{
    ".*"
    {
        type            zeroGradient;
    }

    oversetPatch
    {
        type            overset;
        value           uniform 1;
    }

    frontAndBack
    {
        type            empty;
    }
}

0/U

    oversetPatch
    {
        type            overset;
    }

    cylinderWall
    {
        type            fixedValue;
        value           uniform (0 0 0);
    }

0/p

    oversetPatch
    {
        type            overset;
    }

オーバーセットパッチに overset タイプを設定する。

setFields で zoneID を設定する。

setFieldsDict

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

defaultFieldValues
(
    volScalarFieldValue zoneID 123
);

regions
(
    cellToCell
    {
        set c0;

        fieldValues
        (
            volScalarFieldValue zoneID 0
        );
    }

    cellToCell
    {
        set c1;

        fieldValues
        (
            volScalarFieldValue zoneID 1
        );
    }

);

背景メッシュに 0、円柱メッシュに 1 を設定する。

0 ディレクトリのオリジナルを保存しておく。

$ mv 0 0.org
$ cp -r 0.org 0

setFields を実行。

$ setFields

計算実行

粘性係数を設定 (ν = 1/Re)。

constant/transportProperties

nu              0.01;

スキームを変更。

system/fvSchemes

gradSchemes
{
    default         cellLimited Gauss cellLimited linear;
}

計算実行。

$ overPimpleDyMFoam