blockMesh によるメッシュの作成

2021年4月17日

はじめに

blockMesh によるメッシュの作成について。

使用バージョン

OpenFOAM v2006、v8

blockMesh によるメッシュの作成

blockMesh は、OpenFOAM の標準ユーティリティに含まれるもので、構造格子状に分割されるブロックによってメッシュを構成する。ケースディレクトリの system (バージョン 3.x 以前では constant/polyMesh) に、blockMeshDict というつぎのような内容のファイルを用意する。

blockMeshDict

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

convertToMeters 1;

vertices
(
    (0 0 0)
    (1 0 0)
    (1 1 0)
    (0 1 0)
    (0 0 0.1)
    (1 0 0.1)
    (1 1 0.1)
    (0 1 0.1)
);

blocks
(
    hex (0 1 2 3 4 5 6 7) (20 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 wall;
        faces
        (
            (0 4 7 3)
        );
    }
    right
    {
        type wall;
        faces
        (
            (2 6 5 1)
        );
    }
    frontAndBack
    {
        type empty;
        faces
        (
            (0 3 2 1)
            (4 5 6 7)
        );
    }
);

mergePatchPairs
(
);

convertToMeters/scale

convertToMeters はスケーリングの係数を指定する。

convertToMeters 1;

たとえばミリメートル単位で形状を定義したければ 0.001 を指定すればよい。OpenCFD 版だと代わりに scale が用いられる。

scale 1;

ただし、convertToMeters でも機能はする。

vertices

vertices では座標により点を定義する。上から 0, 1, 2, ... という番号で参照される。

vertices
(
    (0 0 0)
    (1 0 0)
    (1 1 0)
    (0 1 0)
    (0 0 0.1)
    (1 0 0.1)
    (1 1 0.1)
    (0 1 0.1)
);

blocks

点でブロックを構成する。

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

はじめの括弧内の数字の列は点の番号をしており、下図のように対応している。

2 つめの括弧内の数字の列は分割数を示している。図の点 0 に描かれている矢印は局所座標系を表しており、分割数は (x1 x2 x3) の順番で指定する。すなわち、図の丸で囲まれた数字は辺の番号でいえば、辺 0 の方向、辺 4 の方向、辺 8 の方向の順番で分割数を指定する。

最後の記述はメッシュ分割を片方に寄せるためのもので、つぎのようなものがある。

  • simpleGrading (g0 g1 g2)
  • edgeGrading (g0 g1 g2 g3 g4 g5 g6 g7 g8 g9 g10 g11)

g0, g1, g2, ... には、辺の既定の方向の最後の分割幅が最初の分割幅の何倍になるかという拡大率を指定する。たとえば、1.5 という数字を指定したならば、最後の分割幅が最初の分割幅の 1.5 倍になるので、分割幅がだんだん大きくなる。0.5 などと設定すると、逆に分割幅が小さくなっていく。辺の方向は図の矢印のように 0→1, 0→3, 0→4 となっており、この 3 辺と平行なものはそれぞれ同じ方向を向いている。simpleGrading は、分割数と同様に局所座標系 3 方向の拡大率をそれぞれ指定する。edgeGrading はすべての辺に対してそれぞれ拡大率を設定することができる。

辺の両端にメッシュを寄せたりしたい場合は、次のような方法が使える。

blocks
(
    hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (
        (
            (0.2 0.3 4)
            (0.6 0.4 1)
            (0.2 0.3 0.25)
        )
        1 1)
);

simpleGrading の g0 にリストを設定している。リストの項目内は、それぞれ辺の領域の割合、セル数の割合、拡大率である。1 行目は辺の 20% にセル数の 30% を含めて、4 倍で分割幅を大きくしていくことを意味している。2 行目は分割幅一定の領域で、3 行目は 1 行目と同じ割合で、今度は 0.25 倍、つまり分割幅 1/4 していくことを意味している。これにより両端に同じ割合でメッシュを寄せることができる。

edges

edges は上の例では使用していないが、辺の形状を定義するものである。つぎのような設定ができる。

  • line v1 v2
  • arc v1 v2 (x y z)
  • polyLine v1 v2 ((x1 y1 z1) (x2 y2 z2) ...)
  • spline v1 v2 ((x1 y1 z1) (x2 y2 z2) ...)
  • BSpline v1 v2 ((x1 y1 z1) (x2 y2 z2) ...)

v1, v2 は辺の端点の番号を指定する。line は直線の設定であり、ふつうはわざわざ設定する必要はない。arc は座標を指定して、端点と指定した座標を通る円弧を描く。polyLine は座標列を指定し、端点とその座標を直線で結んでいく。spline、BSpline は端点と指定座標列を通るスプライン曲線および B スプライン曲線を定義する。

boundary

boundary では境界を定義する。

boundary
(
    top
    {
        type wall;
        faces
        (
            (3 7 6 2)
        );
    }
    ...
)

"top" は定義する境界の名前である。type にはつぎのような境界のタイプを指定する。

  • patch (パッチ)
  • wall (壁)
  • symmetryPlane (対称面)
  • cyclic (周期境界)
  • cyclicAMI (不整合周期境界)
  • wedge (2 次元軸対称)
  • empty (2 次元)

パッチ (patch) というのは、入口や出口で使用されるタイプである。cyclic, cyclicAMI については "neighbourPatch" で対応する境界を指定する。計算しない方向の両面を empty に設定すると 2 次元問題と見なされる。

faces は境界として設定する面を構成する点の列を指定する。"(3 7 6 2)" は点 3, 7, 6, 2 で作る面 (上の図の上面) を意味する。

つぎのようにすると、ParaView で blockMeshDict の確認ができる。

$ touch case.blockMesh
$ paraview --data=case.blockMesh &

blockMeshDict の用意ができたら、ケースディレクトリ内で blockMesh を実行してメッシュを作成する。

$ blockMesh

メッシュを ParaView (paraFoam) で確認する場合、境界条件を適切に設定していないとメッシュを開くことができない。とりあえずメッシュの確認だけしたい場合は、0 ディレクトリの名前を一時的に変えてやればよい。

$ mv 0 0.org

ParaView 自身のリーダーを使えば、0 ディレクトリはそのままでもメッシュを確認することができる。

$ touch case.foam
$ paraview --data=case.foam

mergePatchPairs

mergePatchPairs は結合する境界の対を指定する。いくつかのブロックを点を共有しない形で作成して、それらを結合したい場合、たとえば共有面の境界名を patch1, patch2 とすると、つぎのように設定する。

mergePatchPairs
(
    (patch1 patch2)
);

patch1 と patch2 は分割のしかたが一致している必要がある。これにより patch1 と patch2 が結合され、その部分の面は生成されなくなる。

名前付け

頂点などには名前を付けることができる。たとえば、次のような具合である。

vertices
(
    name v0 (0 0 0)
    name v1 (1 0 0)
    ...
);

edges
(
    arc v0 v1 (0.5 0.1 0)
);