ユーザーガイド 1.5系 - 5.4 snappyHexMeshユーティリティを使ったメッシュ生成
出典: OFWikiJa
[編集] 5.4 snappyHexMeshユーティリティを使ったメッシュ生成
OpenFOAMのメッシュ生成ユーティリティsnappyHexMeshについて解説します。snappyHexMeshはSTL形式の三角の表面形状から六面体と分割六面体の3次元メッシュを自動的に生成します。はじめのメッシュの細分化と、後に現れる分割の六進法のメッシュの表面形状への変形を繰り返して表面形状に近づいていきます。オプションとして、現れたメッシュを縮小させ、レイヤーセルを挿入することができます。メッシュの細分化のレベルは非常に柔軟性が高く、表面の処理は予め定義したメッシュの水準に適合します。snappyHexMeshは毎回負荷を平均化して並列動作をします。
図5.9 snappyHexMeshにおける2次元メッシュ問題の概略図
[編集] 5.4.1 snappyHexMeshによるメッシュ生成の過程
図5.9に示す概略図を用いてメッシュをsnappyHexMeshによって生成する流れを説明します。STL形式の表面形状で描かれた対象を囲む長方形の部分(図中のグレーの部分)にメッシュを作成することを目的とします。これは外部の空気力学のシミュレーションにおいて典型的な手法です。あくまでもsnappyHexMeshは3次元メッシュの生成ツールですが、簡単のためここでは2次元の図を使用しています。
snappyHexMeshを実行するには以下の準備が必要です。
- 2進法またはASCIIで表されたSTL形式による表面形状データをケースディレクトリのtriSurfaceサブディレクトリに置く。
- セクション5.4.2で述べるblockMeshを使用して、解析領域の範囲とメッシュ密度の基準を決めるために六角形の基礎メッシュを作成しておく。
- ケースのSystemディレクトリにあるsnappyHexMeshDict辞書に、適切な内容を入力する。
snappyHexMeshDict辞書には、メッシュの生成の様々な段階を管理する最上位での変更や、各過程における個々のサブディレクトリがあります。入力例を表5.7に示します。
| キーワード | 意味 | 例 |
|---|---|---|
| castellatedMesh | ギザギザのメッシュを作成するかどうか | true |
| snap | 表面のスナップの有無 | true |
| doLayers | レイヤーの追加の有無 | true |
| mergeTolerance | 初期メッシュの有界ボックスの比として許容値をまとめる | 1e-06 |
| debug | 中間メッシュと画面プリントの記述の制御 | |
| 最終メッシュのみ記述 | 0 | |
| 中間メッシュの記述 | 1 | |
| 後処理のためcellLevelを付けたvolScalarFieldを記述 | 2 | |
| .objファイルとして現在の交点を記述 | 4 | |
| geometry | 表面に使用した全ての幾何学のサブ辞書 | |
| castellatedMeshControls | 城壁メッシュ制御のサブ辞書 | |
| snapControls | 表面スナップ制御のサブ辞書 | |
| addLayersControls | レイヤ追加制御のサブ辞書 | |
| meshQualityControls | メッシュ特性制御のサブ辞書 |
表5.6 snappyHexMeshDictの最上位のキーワード
snappyHexMeshで読み込む形状はsnappyHexMeshDict内のgeometoryの部分に記述します。形状はSTL形状またはOpenFOAMにおける幾何実体によって指定されます。以下に例を示します。
geometry
{
sphere.stl // STL filename
{
type triSurfaceMesh;
regions
{
secondSolid // Named region in the STL file
{
name mySecondPatch; // User-defined patch name
} // otherwise given sphere.stl_secondSolid
}
}
box1x1x1 // User defined region name
{
type searchableBox; // region defined by bounding box
min (1.5 1 -0.5);
max (3.5 2 0.5);
}
sphere2 // User defined region name
{
type searchableSphere; // region defined by bounding sphere
centre (1.5 1.5 1.5);
radius 1.03;
}
};
[編集] 5.4.2 六面体基礎メッシュの作成
snappyHexMeshを実行する前にblockMeshを使用して図5.10が示すように、解析領域をカバーする六面体セルのメッシュを作成します。 基礎メッシュの生成時は以下の点に注意しなければなりません。
- メッシュは六面体のみで構成されていること
- セルのアスペクト比がほぼ1であること。少なくとも連続したスナップが行われる表面近傍でそうでなければスナップの収束に時間がかかり、不良の原因となる。
- STLの表面とセルのエッジが最低でも一箇所は交差すること。つまり、1つのセルだけのメッシュでは機能しない。
図5.11 snappyHexMesh実行前の基礎メッシュの生成
[編集] 5.4.3 面と輪郭に合わせたセルの分割
セルの分割は、snappyHexMeshDictのcastellatedMeshControlsサブ辞書において設定して実行します。castellatedMeshControlsの入力の例を表5.8に示します。
| Keyword | Description | Example |
|---|---|---|
| locationInMesh | メッシュが作成される領域内の位置ベクトル | (5 0 0) |
| ベクトルが細分化の前または最中にセルの面と一致してはいけない | ||
| maxLocalCells | 細分化中におけるプロセッサあたりのセルの数の最大値 | 1e+06 |
| maxGlobalCells | 細分化中におけるセルの数の総数 (i.e. 除去の前) | 2e+06 |
| minRefinementCells | 細分化すべきセルの数の最低値。この値以下だと停止 | 0 |
| nCellsBetweenLevels | 異なる細分化レベル間のセルの緩衝レイヤーの数 | 1 |
| resolveFeatureAngle | 角度がこの値を超えている交点をもつセルに最高レベルの細分化を行う | 30 |
| features | 細分化に対する機能リスト | |
| refinementSurfaces | 細分化に対する表面辞書 | |
| refinementRegions | 細分化に対する領域辞書 |
図5.11で示されたように、最初に領域内で指定された輪郭に従って選択されたセルで分割が開始します。
図5.11 snappyHexMeshDictの輪郭によるセルの分割
castellatedMeshControlsサブ辞書の輪郭のリストにおいてedgeMeshファイルの名前と細分化のレベルを記述します。
features
(
{
file "someLine.eMesh"; // file containing edge mesh
level 2; // level of refinement
}
);
輪郭の細分化に続き、図5.12に示すように、指定された表面における分割のためにセルが選択されます。
図5.12 snappyHexMeshDictの表面によるセルの分割
castellatedMeshControlsのrefinementSurface辞書で、各STL表面の辞書入力と、型の最小、最大細分化のデフォルトレベルの指定を行います。(<min> <max>)
最小レベルは表面のいたるところに適用され、最大レベルはresolveFeatureAngleに規定される角度を超過する交点を持つセルに適用されます。
細分化はSTL表面の特定領域に対して複数回行うことができます。領域の入力はregionsサブ辞書に収められています。各領域の入力に対するキーワードは領域の名前そのものであり、細分化のレベルはさらにサブの辞書に含まれます。以下の入力例を参考にしてください。
refinementSurfaces
{
sphere.stl
{
level (2 2); // default (min max) refinement for whole surface
regions
{
secondSolid
{
level (3 3); // optional refinement for secondSolid region
}
}
}
}
[編集] 5.4.4 セルの除去
輪郭と表面の分割が完了するとセルの除去が始まります。セルの除去には領域内の有界表面によって完全に囲まれる1つ以上の範囲が必要です。セルが保持される領域は、castellatedMeshControlsのlocationInMeshキーワードに指定される領域内の位置ベクトルによって特定されます。セルの体積のほぼ50%以上が領域内に存在する場合保持されます。残りのセルは図5.13に示すように除去されます。
図5.13 snappyHexMeshにおけるメッシュの除去
[編集] 5.4.5 特定領域内のセルの分割
特定領域に含まれるセルはさらに細分化されます。図5.14では長方形の濃いグレーの領域が該当します。 castellatedMeshControls内のrefinementRegionsサブ辞書では、geometryサブ辞書において指定された領域の細分化の入力を行います。細分化のモードと対象領域は以下の通りです。
・inside 領域の内部を細分化します。
・outside 領域の外部を細分化します。
・distance 表面からの距離にしたがって細分化します。レベルキーワードを用いることで複数の距離にある異なるレベルにも適用できます。
refinementRegionsでは、細分化のレベルをレベル入力リストによって(<レベル><距離>)のように記述します。insideとoutsideの細分化の場合、<distance>は不要で無視されますが、指定する必要があります。以下に入力例を示します。
refinementRegions
{
box1x1x1
{
mode inside;
levels ((1.0 4)); // refinement level 4 (1.0 entry ignored)
}
sphere.stl
{ // refinement level 5 within 1.0 m
mode distance; // refinement level 3 within 2.0 m
levels ((1.0 5) (2.0 3)); // levels must be ordered nearest first
}
}
図5.14 snappyHexMeshの領域によるセルの分割
[編集] 5.4.6 面へのスナップ
メッシュを生成する次の段階として、メッシュを平滑化するためにセルの頂点を表面に移動します。その手順は以下の通りです。
- ギザギザの境界面の頂点をSTL表面上に移動する
- 最後に移動した境界の頂点を用いて内部メッシュの緩和を求める
- メッシュの水準に影響をもたらす頂点を探す
- 最初の数値(1)での頂点の移動を減らし、2からメッシュの質が満足できるレベルに達するまで繰り返す。
表5.9に示すsnappyHexMeshDictのsnapControlsサブ辞書において設定をします。
| キーワード | 意味 | 例 |
|---|---|---|
| nSmoothPatch | 表面との一致に至る前に行うパッチの平滑化の回数 | 3 |
| tolerance | 局所的な輪郭の最大長さに対する点と表面の距離の比の許容範囲 | 4.0 |
| nSolveIter | メッシュの置き換え時の緩和計算の回数 | 30 |
| nRelaxIter | メッシュのスナップ時の緩和計算の最大回数 | 5 |
図5.15に概略図に例を示します。(メッシュの動きは多少現実と異なるように見えています。)
図5.15 snappyHexMeshにおける表面のスナップ
[編集] 5.4.7 レイヤーメッシュ
境界面に沿った不規則なセルを作りもしますが、スナップによるメッシュの生成は目的に合致するでしょう。メッシュをかける過程にはさらにオプションがあり、図5.16の暗く影のついた部分が示すように、境界面に沿って並べられた六面体のセルのレイヤを追加します。
図5.16 レイヤーの挿入
メッシュのレイヤの追加は、以下の手順のように既存のメッシュを境界から縮小させ、レイヤを挿入することで行われます。
- 表面に対して法線方向の厚み分だけメッシュを投影させる
- 最後に移動した境界面の頂点をもとに内部メッシュの緩和を計算する
- 有効性を確認し、満足されていない場合は投影された厚みを減らし、2からやり直す。いかなる厚みでも有効性が満足できない場合はレイヤを挿入しない。
- 有効性が確認できたらレイヤメッシュを挿入する。
- メッシュを再度チェックし、不良箇所が見られる場合はレイヤを除去し2に戻る。
レイヤの追加の手順はsnappyHexMeshDict のaddLayersControls サブ辞書の設定によって行われます。入力されるものは表5.10に示す通りです。
| キーワード | 意味 | 例 |
|---|---|---|
| layers | レイヤーの辞書 | |
| expansionRatio | レイヤーメッシュの拡大比率 | 1.0 |
| finalLayerRatio | レイヤの外側の歪められていないセルの大きさに比例した壁から最も遠い層の厚さ | 0.3 |
| minThickness | レイヤの外側の歪められていないセルの大きさに比例したセルのレイヤーの最小の厚さ | 0.25 |
| nGrow | 点がなければ生成されない面に結合されたレイヤの数。輪郭に近いレイヤ追加の収束に役立つ。 | 1 |
| featureAngle | この角度以上では表面は押し出されない | 60 |
| nRelaxIter | 緩和反復のスナップ最大数 | 5 |
| nSmoothSurfaceNormals | 表面法線のスムージング反復数 | 1 |
| nSmoothNormals | 内部メッシュの運動方向のスムージング反復数 | 3 |
| nSmoothThickness | 表面パッチ上の滑らかなレイヤの厚さ | 10 |
| maxFaceThicknessRatio | 極端にゆがんでいるセルでレイヤの生成を止める | 0.5 |
| maxThicknessToMedialRatio | 中間の距離と厚さの比が大きくなるとレイヤの生成を減少する | 0.3 |
| minMedianAxisAngle | 中間の軸点選択に使う角度 | 130 |
| nBufferCellsNoExtrude | 新しいレイヤの末端のためのバッファ領域を作成 | 0 |
レイヤのサブ辞書はレイヤが適用される各パッチと必要な表面レイヤの数の入力を含んでいます。パッチ名は、レイヤ追加が表面幾何形状ではなく既存メッシュに関連付けられるので使われ、したがって、表面領域ではなく、パッチに適用されます。 レイヤの入力例は以下の通りです。
layers
{
sphere.stl_firstSolid
{
nSurfaceLayers 1;
}
maxY
{
nSurfaceLayers 1;
}
}
| キーワード | 意味 | 例 |
|---|---|---|
| maxNonOrtho | 非直交性上限角;180は不可 | 65 |
| maxBoundarySkewness | 境界面ひずみ上限値;<0は不可 | 20 |
| maxInternalSkewness | 内部面ひずみ上限値;<0は不可 | 4 |
| maxConcave | 凹み上限角;180は不可 | 80 |
| minFlatness | 実際の領域に対する最小の投影面積比率;-1は不可 | 0.5 |
| minVol | 最小のピラミッドボリューム;大きな負の数(例 -1e30)は不可 | 1e-13 |
| minArea | 最小面領域;<0は不可 | |
| minTwist | 最小面ねじれ;<-1は不可 | 0.05 |
| minDeterminant | 最小正常セルの行列式;1=hex;<=0は不法なセル | 0.001 |
| minFaceWeight | 0→0.5 | 0.05 |
| minVolRatio | 0→1.0 | 0.01 |
| minTriangleTwist | Fluent計算可能性では >0 | |
| nSmoothScale | エラー分布反復数 | 4 |
| errorReduction | エラー点の置換のための減少量 |
[編集] 5.4.8 メッシュの水準
メッシュの水準はsnappyHexMeshDict のmeshQualityControls サブ辞書へ入力することで制御できます。入力は表5.11に示します。








