人気ブログランキング
人気ブログランキング
OPEN FOAMあれこれ指南 PR

Oversetメッシュを用いた攪拌槽内の流動シミュレーション(ボックスメッシュ領域編)

記事内に商品プロモーションを含む場合があります

~topoSetやsetFieldsの活用とSTLファイルの落とし穴!?~

攪拌槽内の流体挙動を高精度にシミュレーションするために、overset(重ね合わせ)メッシュの手法は非常に有効です。特に、回転体を含むような攪拌プロセスでは、背景メッシュと移動メッシュを動的に連携させられるoversetは、効率的かつ柔軟なCFD解析を可能にします。

今回は、OpenFOAMのoversetメッシュ機能を用いた攪拌槽の事例をもとに、境界条件、topoSet、setFieldsの使い方を整理しつつ、STLファイルからoversetを設定した際に起こりがちな問題にも触れていきます。失敗事例も載せておくので参考にしてもらえればと思います。個人的にoversetの考え方は初心者には難しく、なかなか理論が分かりずらいので、だれか詳しく教えてほしいです。

今回の計算条件は以下のcontrolDictで設定しています。

controlDict

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
libs            (overset fvMotionSolvers); 
application     overPimpleDyMFoam;
startFrom       startTime;
startTime       0;
stopAt          endTime;
endTime       5;
deltaT          0.001;
writeControl    timeStep;
writeInterval   1;
purgeWrite      100;  //古い出力データの削除
writeFormat     ascii;
writePrecision  10; //数値の精度(小数点以下の桁数)
writeCompression off;  //出力ファイルの圧縮設定
timeFormat      general;
timePrecision   8;  //時間データの精度
runTimeModifiable yes;
adjustTimeStep  no;//yes or no
maxCo          0.5;
maxDeltaT       0.01;
debugSwitches
{
    limitFieldValue 1;
    overset                 0;
    dynamicOversetFvMesh    0;
    cellVolumeWeight        0;
}

攪拌槽モデルにおけるoversetメッシュ構成

攪拌槽の解析においては、通常以下のようなメッシュ領域に分けます。

最初の段階では、撹拌容器(バックグラウンド)のモデルはblockMeshで単なる立方体にしておきました。

  • 背景メッシュ(background):槽全体や流体領域をカバーする固定メッシュ
  • 回転体メッシュ(overset):インペラなどの回転体を含む領域。動的に移動・回転させる

手法①:stlファイルでovermeshの領域を定義してみる

撹拌槽を立方体の容器とみなし、その内側のoversetメッシュをstlファイルで定義して計算を試みました。

内側の白い領域がoversetMesh、黄色い領域が計算するバックグラウンド領域(上面ピンク色は大気開放のpatch)である

計算領域(ベース領域)とoverset領域を分けてメッシュ化し、それをマージ(合体)することで計算領域を設定しています。※上の画像と下の画像でメッシュ色が違ってますが同じものを指しています(分かりにくくてすみません)

blockMeshDict(overmesh側)

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
scale   1;
vertices
(
    (-1.1 -1.1 -1.0)
    (1.1 -1.1 -1.0)
    (1.1 1.1 -1.0)
    (-1.1 1.1 -1.0)
    (-1.1 -1.1 5.0)
    (1.1 -1.1 5.0)
    (1.1 1.1 5.0)
    (-1.1 1.1 5.0)
);
blocks
(
    hex (0 1 2 3 4 5 6 7) (80 80 160) simpleGrading (1 1 1)
);
edges
(
);
boundary
(
    walls
    {
        type overset;
        faces
        (
            (3 7 6 2)
            (0 4 7 3)
            (2 6 5 1)
            (1 5 4 0)
            (0 3 2 1)
            (4 5 6 7)
        );
    }
);
mergePatchPairs
(
);

surfaceFeatureExtractDict(overmesh側)

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      surfaceFeatureExtractDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
overmesh.stl //オーバーメッシュ
{
    extractionMethod    extractFromSurface;
    extractFromSurfaceCoeffs
    {
        includedAngle   95;
    }
    writeObj            yes;
}
bottommixer.stl //撹拌機の羽根No.1:stlファイル名
{
    extractionMethod    extractFromSurface;
    extractFromSurfaceCoeffs
    {
        includedAngle   120;
    }
    writeObj            yes;
}
middlemixer.stl  //撹拌機の羽根No.2:stlファイル名
{
    extractionMethod    extractFromSurface;
    extractFromSurfaceCoeffs
    {
        includedAngle   120;
    }
    writeObj            yes;
}
topmixer.stl  //撹拌機の羽根No.3:stlファイル名
{
    extractionMethod    extractFromSurface;
    extractFromSurfaceCoeffs
    {
        includedAngle   120;
    }
    writeObj            yes;
}

topoSetDict

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      topoSetDict;
}
//constant\polyMesh\setsの中をクリアにしておく。
actions
(
Info << "=== c0:バックグラウンドのセル===" << endl;
    {
        name    c0;
        type    cellSet;
        action  new;
        source  regionsToCell;
        sourceInfo
        {
            insidePoints ((1.1 1.1 0.4));
        }
    }
Info << "=== c1:バックグラウンドのセルをc1に複製===" << endl;
    {
        name    c1;
        type    cellSet;
        action  new;
        source  cellToCell;
        set     c0;
    }
Info << "=== c1:反転してoversetメッシュをc1に設定===" << endl;
    {
        name    c1;
        type    cellSet;
        action  invert;
    }
Info << "=== movingZone:movingZoneのセルセットをc1より作成===" << endl;
      {
          name    movingZone;
          type    cellZoneSet;
          action  new;
          source  setToCellZone;
          set     c1;
      }
);

手法①の結果

結果はうまくいきませんでした。stl領域でoversetメッシュを区画し、toposetでsellcetの設定をしてるのですが、計算実行すると、本来バックグラウンドとしてみなされるべき領域がholeとみなされて計算されない状態になってしまいます。

んーーーー、、、理由が分かりませんが、いろいろsnappyhexmeshで設定をいじってみましたが、oversetmeshの領域の内側でしか計算がされない状態となっています。

続いて次に、

overset領域をstlファイルで作成するのは難易度が高いと思い、シンプルに立方体のメッシュをoversetで作成することにしました。

手法②:blockMeshでovermeshの領域を定義してみる

oversetMeshの領域設定でstlファイルを読み込むのが原因であると考え、blockMeshでシンプルな直方体の領域をoverset領域として設定してみた。

overset領域を立方体の領域として計算しなおしてみる

計算中に以下のコードが出てくるのですが、その値を見てうまくいっているかどうかを判断できます。失敗すると、よくholeが計算領域に比べて大きくなってしまいます。
calculated ・・・・計算領域(主にベース領域)
interpolated ・・・・オーバーメッシュ領域
hole ・・・・計算しない領域

この領域はOpenFoam内で自動認識されるため、topoセットのセルセット設定と違う箇所をholeの領域として誤解してしまうことがあります。(原因はわかりませんが、私の経験です)

Overset analysis : nCells : 1877924
    calculated   : 1814444
    interpolated : 63182 (from local:63182  mixed local/remote:0  remote:0)
    hole         : 298

手法②の結果

うまくoversetが機能しており、問題なくoversetメッシュがとホール領域と分離されることが確認できました。撹拌機で流体を動かしたいる状態の流線(白線)を描いてみたところ、きれいに上下旋回流が起きているのが分かりますね。

ABOUT ME
den
完全独学でWEBデザインやpythonアプリ製作や流体解析を無謀にも挑戦している中年男。生成AIのおかげで独学が出来る世の中に感謝。 工場勤務の会社員で3児の父。 チャレンジを忘れず、妻に怒られても心はおれず。 有益な情報を発信し、これを見ている人の為になればと思っています。
関連記事一覧