メッシュファイルの書式

2017年11月21日

はじめに

OpenFOAM のメッシュファイルの書式について。

メッシュファイルの構成

OpenFOAM のメッシュは polyMesh ディレクトリにの中に複数のファイルの形で格納されている。

  • boundary : 境界情報
  • points : 点情報
  • faces : 面情報
  • owner : 面の所有セル情報
  • neighbour : 面の隣接セル情報

1セル

まず、blockMesh で 1 セルだけのメッシュを作ってみる。

blockMeshDict

convertToMeters 1;

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

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

edges
(
);

boundary
(
    movingWall
    {
        type wall;
        faces
        (
            (3 7 6 2)
        );
    }
    fixedWalls
    {
        type wall;
        faces
        (
            (0 4 7 3)
            (2 6 5 1)
            (1 5 4 0)
        );
    }
    frontAndBack
    {
        type empty;
        faces
        (
            (0 3 2 1)
            (4 5 6 7)
        );
    }
);

mergePatchPairs
(
);

boundary

boundary

3
(
    movingWall
    {
        type            wall;
        inGroups        1(wall);
        nFaces          1;
        startFace       0;
    }
    fixedWalls
    {
        type            wall;
        inGroups        1(wall);
        nFaces          3;
        startFace       1;
    }
    frontAndBack
    {
        type            empty;
        inGroups        1(empty);
        nFaces          2;
        startFace       4;
    }
)

最初の数字は項目数である。括弧はリストを表す。"movingWall" などは任意の境界名である。"{...}" の形で辞書形式になっている。"type" は境界のタイプで、主に "wall" か "patch" を設定する。壁は "wall" で、出入り口などは "patch" である。その他に "empty" や "symmetry"、"cyclic" など特殊な境界条件用のタイプがある。inGroups はポスト処理用のもので、同じグループ名の境界をひとまとめにする。nFaces は面の数、startFace は最初の面の番号である。面の番号は 0 からはじまる。最初の番号と面の数だけが指定してあるということは、面の番号は境界ごとに順番に並んでいるということである。

points

points

8((0 0 0) (1 0 0) (0 1 0) (1 1 0) (0 0 1) (1 0 1) (0 1 1) (1 1 1))

面を構成する点の座標である。

faces

faces

6
(
4(2 6 7 3)
4(0 4 6 2)
4(1 3 7 5)
4(0 1 5 4)
4(0 2 3 1)
4(4 5 7 6)
)

面を構成する点の番号である。

owner

6{0}

面の所有セルである。セルは 1 つしかないので、すべての面の所有セルは 0 番である。

neighbour

0()

面の隣接セルである。隣接セルを持ち得るのは内部面のみである。セルが 1 つしかないので内部面がなく、隣接セルをもつ面はない。

2セル

続いて、2 セル作ってみよう。

blockMeshDict (一部)

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

boundary

boundary

3
(
    movingWall
    {
        type            wall;
        inGroups        1(wall);
        nFaces          2;
        startFace       1;
    }
    fixedWalls
    {
        type            wall;
        inGroups        1(wall);
        nFaces          4;
        startFace       3;
    }
    frontAndBack
    {
        type            empty;
        inGroups        1(empty);
        nFaces          4;
        startFace       7;
    }
)

1 セルの場合と異なり、"movingWall" の startFace が 1 になっている。面 0 が内部面であることを意味する。面番号は最初に内部面が並び、続いて境界面が並んでいる。

points

points

12
(
(0 0 0)
(0.5 0 0)
(1 0 0)
(0 1 0)
(0.5 1 0)
(1 1 0)
(0 0 1)
(0.5 0 1)
(1 0 1)
(0 1 1)
(0.5 1 1)
(1 1 1)
)

faces

faces

11
(
4(1 4 10 7)
4(3 9 10 4)
4(4 10 11 5)
4(0 6 9 3)
4(2 5 11 8)
4(0 1 7 6)
4(1 2 8 7)
4(0 3 4 1)
4(1 4 5 2)
4(6 7 10 9)
4(7 8 11 10)
)

最初の (1 4 10 7) は内部面である (図を参照)

owner

owner

11
(
0
0
1
0
1
0
1
0
1
0
1
)

セルが 2 つあるので、所有セルは 0 か 1 である。

neighbour

neighbour

1(1)

内部面が 1 つあるので、隣接セル情報がある。owner で面 0 の所有セルが 0 になっているので、隣接セルは 1 である。

3セル

今度は 3 セル。

blockMeshDict (一部)

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

boundary

boundary

3
(
    movingWall
    {
        type            wall;
        inGroups        1(wall);
        nFaces          3;
        startFace       2;
    }
    fixedWalls
    {
        type            wall;
        inGroups        1(wall);
        nFaces          5;
        startFace       5;
    }
    frontAndBack
    {
        type            empty;
        inGroups        1(empty);
        nFaces          6;
        startFace       10;
    }
)

内部面が 2 つあるので、"movingWall" の startFace は 2 になっている。

points

points

16
(
(0 0 0)
(0.3333333333 0 0)
(0.6666666667 0 0)
(1 0 0)
(0 1 0)
(0.3333333333 1 0)
(0.6666666667 1 0)
(1 1 0)
(0 0 1)
(0.3333333333 0 1)
(0.6666666667 0 1)
(1 0 1)
(0 1 1)
(0.3333333333 1 1)
(0.6666666667 1 1)
(1 1 1)
)

faces

faces

16
(
4(1 5 13 9)
4(2 6 14 10)
4(4 12 13 5)
4(5 13 14 6)
4(6 14 15 7)
4(0 8 12 4)
4(3 7 15 11)
4(0 1 9 8)
4(1 2 10 9)
4(2 3 11 10)
4(0 4 5 1)
4(1 5 6 2)
4(2 6 7 3)
4(8 9 13 12)
4(9 10 14 13)
4(10 11 15 14)
)

最初の 2 つが内部面である。

owner

owner

16
(
0
1
0
1
2
0
2
0
1
2
0
1
2
0
1
2
)

内部面の所有セルは 0 と 1 である。

neighbour

neighbour

2(1 2)

内部面の所有セルが 0 と 1 なので、隣接セルは 1 と 2 である。

4セル

最後に 4 セル。

blockMeshDict (一部)

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

boundary

boundary

3
(
    movingWall
    {
        type            wall;
        inGroups        1(wall);
        nFaces          2;
        startFace       4;
    }
    fixedWalls
    {
        type            wall;
        inGroups        1(wall);
        nFaces          6;
        startFace       6;
    }
    frontAndBack
    {
        type            empty;
        inGroups        1(empty);
        nFaces          8;
        startFace       12;
    }
)

points

points

18
(
(0 0 0)
(0.5 0 0)
(1 0 0)
(0 0.5 0)
(0.5 0.5 0)
(1 0.5 0)
(0 1 0)
(0.5 1 0)
(1 1 0)
(0 0 1)
(0.5 0 1)
(1 0 1)
(0 0.5 1)
(0.5 0.5 1)
(1 0.5 1)
(0 1 1)
(0.5 1 1)
(1 1 1)
)

faces

faces

20
(
4(1 4 13 10)
4(3 12 13 4)
4(4 13 14 5)
4(4 7 16 13)
4(6 15 16 7)
4(7 16 17 8)
4(0 9 12 3)
4(3 12 15 6)
4(2 5 14 11)
4(5 8 17 14)
4(0 1 10 9)
4(1 2 11 10)
4(0 3 4 1)
4(3 6 7 4)
4(1 4 5 2)
4(4 7 8 5)
4(9 10 13 12)
4(12 13 16 15)
4(10 11 14 13)
4(13 14 17 16)
)

owner

owner

20
(
0
0
1
2
2
3
0
2
1
3
0
1
0
2
1
3
0
2
1
3
)

neighbour

neighbour

4(1 2 3 3)