blockMesh標準例題など(OpenFOAM v2212)
OpenFOAMによるOpenFOAMのためのメッシュ生成入門講習を検討している。
snappyHexMeshも良いのだが,そんなに複雑な形状でないのなら,blockMeshで丁寧に作成した方が良い場合もある。急がば回れ。
blockMeshも,昔に比べると使い易さや機能が向上しているのではないか。まずは標準例題の内容を確認して,何ができるのかを確認したい。
標準チュートリアルの中で mesh/blockMesh に分類されているのは,次の7つである。
- mergePairs
- sphere
- sphere7
- sphere7ProjectedEdges
- spheroidProjected
- spheroid7Projected
- pipe
mergePairs例題
目的
mergePatchPairsの使い方を学ぶ。
概要
シンプルな設定である。メッシュの大きさが異なる3つのブロックを作成して,その界面をmergePatchPairsで接続する。
あくまでも使い方の説明のための例題であり,大きさを大きく変えたセルが接続されている。
メモ
boundaryの指定方法が新しい?facesの書き方が簡潔であり,ブロック番号と面番号で指定しているらしい。
boundary
(
mid6
{
type patch;
faces
(
(0 0) // Block d
);
}
メモ補足
Jul 19, 2021 のコミットで新しい指示方法が採用されている。
Jul 19, 2021 の関連コミット
sphere例題
目的
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 =
簡単に球のメッシュが作れることがわかる。ただし,この例題のままだと,局所的に品質の悪いセルが生じる。これを改善するためには,blockを複数にする必要があり,この方法はsphere7例題で学ぶ。
sphere7例題
目的
球に適合した格子のひずみを低減するために,7つのブロックを使用する。
概要
sphere例題と同じ球を使用する。中心部に1つのブロックを配置し,その周りに6つのブロックを置く。これによって外周部のひずみが低減されている。
中央部のブロックの大きさは球の直径の0.7倍としている。
sphere7ProjectedEdges例題
目的
節点 vertices と 辺 edges も project する。
要確認
内部の球に対してfacesはprojectされていない。このあたりの使い分けと,生成されたメッシュの状態の関連を明確にする必要がある。(内部は完全に球形にしないためと考えられる。)
spheroid7Projected例題
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)
応用問題
標準例題で学んだテクニックを使って,少しだけ複雑な計算領域に対して,blcokMeshでメッシュを生成する。
同じ問題に対して,snappyHexMeshでメッシュを生成する。
両者のメッシュの品質と,手間について考える。
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を使用することができる。
blockMeshDictでは,8つの節点座標と,それらから構成されるhexBlockを指示する必要がある。PDRblockMeshDictでは,x,y,zの3座標に対して,始点と終点の値・セル数・セルサイズ比の情報を与える。直線で構成された単純な六面体ブロックであれば,PDRblockMeshDictの方が簡潔でわかりやすい指示となる。
関連情報
参考になる情報
blockMeshの変化
v2012
blockMesh
Extended -write-vtk option
Defining curved edges
arc specification for edges: origin を指定できるようになった。
PDRblockMesh
外部へメッシュを拡張することが可能になった。
いろいろなメッシュの一覧
snappyHexMeshでは,既存のメッシュにレイヤーを追加することもできる。blockMeshでメッシュを生成し,レイヤー追加だけにsnappyHexMeshを使うことも可能である。
複雑なブロック構造のメッシュを作成したとき,OpenFOAM v2012以降では,blockMesh -write-vtk
を実行するとよい。このオプションを付けることでtopologyがVTUファイルとして書き出される。ParaViewからこのVTUファイルを開いてWireframe表示すると,ブロックのトポロジーが確認しやすい。なお,blockMesh -write-vtk
はメッシュを作成するのではなく,VTUファイルを書き出すだけである。