Open14

blockMesh標準例題など(OpenFOAM v2212)

snaksnak

OpenFOAMによるOpenFOAMのためのメッシュ生成入門講習を検討している。

snappyHexMeshも良いのだが,そんなに複雑な形状でないのなら,blockMeshで丁寧に作成した方が良い場合もある。急がば回れ。

blockMeshも,昔に比べると使い易さや機能が向上しているのではないか。まずは標準例題の内容を確認して,何ができるのかを確認したい。

https://develop.openfoam.com/Development/openfoam/-/tree/master/tutorials/mesh/blockMesh

標準チュートリアルの中で mesh/blockMesh に分類されているのは,次の7つである。

  • mergePairs
  • sphere
  • sphere7
  • sphere7ProjectedEdges
  • spheroidProjected
  • spheroid7Projected
  • pipe
snaksnak

mergePairs例題

mergePairs mesh overview

目的

mergePatchPairsの使い方を学ぶ。

概要

シンプルな設定である。メッシュの大きさが異なる3つのブロックを作成して,その界面をmergePatchPairsで接続する。

あくまでも使い方の説明のための例題であり,大きさを大きく変えたセルが接続されている。

メモ

boundaryの指定方法が新しい?facesの書き方が簡潔であり,ブロック番号と面番号で指定しているらしい。

boundary
(
    mid6
    {
        type patch;
        faces
        (
            (0 0) // Block d
        );
    }

メモ補足

Jul 19, 2021 のコミットで新しい指示方法が採用されている。
https://develop.openfoam.com/Development/openfoam/-/commit/29acee5a504a1a746d55553e58bc3a70e921c98f

Jul 19, 2021 の関連コミット

https://develop.openfoam.com/Development/openfoam/-/commit/d31f351c15f9a6decfd350aa25e2b6e20e8d2b9e

snaksnak

sphere例題

sphere-overview_halfCut

目的

blockMeshで作成される立方体状のメッシュを球に貼り付ける方法を学ぶ。形状にフィットしたメッシュをblockMeshのproject機能を利用して生成する。blockは1つだけとシンプルな構成にして,メッシュ品質よりも理解しやすさを優先している。

概要

球はOpenFOAMの機能で作成する。

geometry
{
    sphere
    {
        type   sphere;
        origin (0 0 0);
        radius $outerRadius;
    }
}

作成した球に,blockMeshで作成した面 faces を project している。辺 edges は円弧を指定している。

edges
(
    arc 0 1 origin (0 0 0)
    ...

faces
(
    project (0 0) sphere  // x-min
    ...

基本的なパラメーターをblockMeshDictで指定し,必要な計算は設定ファイル内で計算させている。

球の半径 outerRadius = 1 m
ブロックの1辺 2 vo, vo = \sqrt{outeRadius/3}

簡単に球のメッシュが作れることがわかる。ただし,この例題のままだと,局所的に品質の悪いセルが生じる。これを改善するためには,blockを複数にする必要があり,この方法はsphere7例題で学ぶ。

snaksnak

sphere7例題

sphere7-overview_halfCut

目的

球に適合した格子のひずみを低減するために,7つのブロックを使用する。

概要

sphere例題と同じ球を使用する。中心部に1つのブロックを配置し,その周りに6つのブロックを置く。これによって外周部のひずみが低減されている。

中央部のブロックの大きさは球の直径の0.7倍としている。

snaksnak

sphere7ProjectedEdges例題

目的

節点 vertices と 辺 edges も project する。

要確認

内部の球に対してfacesはprojectされていない。このあたりの使い分けと,生成されたメッシュの状態の関連を明確にする必要がある。(内部は完全に球形にしないためと考えられる。)

snaksnak

pipe例題

概要

座標の変換,曲線に沿って円を押し出す,複数形状へのproject など,いろいろなテクニックを使って複雑な形状に適合したメッシュを生成している。

transform
{
    origin  (0 0 0);
    rotation axisAngle;
    axis    (1 0 0);
    angle   45;
}
geometry
{
    cylinder
    {
        type   cylinder;
        point1 (0 -4 0);
        point2 (0 4 0);
        radius 0.7;
    }
    cylinder2
    {
        type    extrudedCircle;
        file    "curve2.vtk";
        radius  0.5;
    }
    inletPlane
    {
        type    plate;
        origin  (-4 -50 -50);
        span    (0 100 100);
    }
}
vertices
(
    // Vertical cylinder
    name v0 project (-1 -0.1 -1) (cylinder cylinder2)
snaksnak

応用問題

標準例題で学んだテクニックを使って,少しだけ複雑な計算領域に対して,blcokMeshでメッシュを生成する。

同じ問題に対して,snappyHexMeshでメッシュを生成する。

両者のメッシュの品質と,手間について考える。

snaksnak

PDRblockMesh/box0 例題

比較的新しいblockMesh発展版ツールに PDRblockMeshがある。

コードに書かれた説明

        A block mesh generator for a rectilinear mesh in x-y-z.
          The ordering of vertex and face labels within a block as shown 
        below.
          For the local vertex numbering in the sequence 0 to 7:
            Faces 0, 1  ==  x-min, x-max.
            Faces 2, 3  ==  y-min, y-max.
            Faces 4, 5  ==  z-min, z-max.
        
                                7 ---- 6
                         f5     |\\     |\\     f3
                         |      | 4 ---- 5     \\
                         |      3 |--- 2 |      \\
                         |       \\|     \\|      f2
                         f4       0 ---- 1
            Y  Z
             \\ |                f0 ------ f1
              \\|
               O--- X

コミット

例題

メッシュ外観(右図は断面)

メッシュ(zMin面,ground)

面の指示方法

PDRblockMeshでは,節点を指示しない。そのため,旧来からのblockMeshDictで使われてきた4つの節点番号による面の指示は適さない。その代わりに,ブロックを構成する面番号を直接指定する。

補足説明

cavity例題

cavity例題では,blockMeshDictとPDRblockMeshDictが用意されている。まったく同じメッシュを作成するために,blockMeshとPDRblockMeshを使用することができる。

https://develop.openfoam.com/Development/openfoam/-/tree/master/tutorials/incompressible/icoFoam/cavity/cavity

blockMeshとPDRblockMesh

blockMeshDictでは,8つの節点座標と,それらから構成されるhexBlockを指示する必要がある。PDRblockMeshDictでは,x,y,zの3座標に対して,始点と終点の値・セル数・セルサイズ比の情報を与える。直線で構成された単純な六面体ブロックであれば,PDRblockMeshDictの方が簡潔でわかりやすい指示となる。

snaksnak

snappyHexMeshでは,既存のメッシュにレイヤーを追加することもできる。blockMeshでメッシュを生成し,レイヤー追加だけにsnappyHexMeshを使うことも可能である。

snaksnak

複雑なブロック構造のメッシュを作成したとき,OpenFOAM v2012以降では,blockMesh -write-vtkを実行するとよい。このオプションを付けることでtopologyがVTUファイルとして書き出される。ParaViewからこのVTUファイルを開いてWireframe表示すると,ブロックのトポロジーが確認しやすい。なお,blockMesh -write-vtkはメッシュを作成するのではなく,VTUファイルを書き出すだけである。