自作のstlファイルをOPENFOAMで使用する際の手順に関して、説明します。
まずはstlファイルのファイル形式を確認
まずは作ったstlファイルが、ASCII形式で保存されているかを確認しましょう。
確認の方法は簡単で、stlファイルを指定して右クリックで「プログラムから開く」⇒「ワードパット」で開いてみてください。正しくファイル内の文字や数字が表示されていれば問題ありません。もしファイル内の文字が変になっていれば、バイナリー形式で保存されていますので、もう一度stlファイルを出力(stlを作ったソフト)したソフトでもう一度変換しなおしましょう。
stlファイルのファイル名と内容を書き換える
まずはstlファイルのファイル名を計算する境界名(パッチ名)と合わせておきましょう。この名前はその他の境界名と被らなければ、好きな名称で構いません。
次に、stlファイルの内容をファイル名と合わせるために書き換えをおこないます。
stlファイルをワードパットで開くと、最初に「solid ○○〇」出てきますので、
その○○〇の部分をファイル名(.stlを抜いてください)に書き換えましょう。
例:ABCABC.stlというstlファイルとすると、solidの後をABCABCに書き換えます。
solid ABCABC
facet normal 0.995472 0.095056 -0.000000
outer loop
vertex 104.150002 0.000000 0.000000
vertex 102.267876 19.710518 0.000000
vertex 104.150002 0.000000 1000.000000
endloop
endfacet
facet normal 0.995472 0.095056 0.000000
outer loop
vertex 104.150002 0.000000 1000.000000
vertex 102.267876 19.710518 0.000000
vertex 102.267876 19.710518 1000.000000
endloop
endfacet
facet normal 0.959493 0.281733 0.000000
outer loop
vertex 102.267876 19.710518 1000.000000
vertex 96.689522 38.708645 0.000000
vertex 96.689522 38.708645 1000.000000
endloop
endfacet
・
・
・以下省略↓
データスケールの変換(必要があれば行う)
stlファイルによっては、表示されている数値の単位がミリメートル単位になっている場合があります。stlファイル内の数値が1と表示されている場合、OPENFOAMでは1mと判断します。そのため、もしstlファイルの値がミリメートル単位で記載している場合は、全部の座標を1000分の1に変換しなければいけません。
変換機能はOPENFOAMにありますので、以下のコードで変換を行ってください。
例:ABCABC.stlのデータを1000分の1に変換して、ABCABCscaled.stlというデータに保存する。
surfaceTransformPoints "scale=(0.001 0.001 0.001)" constant/triSurface/ABCABC.stl constant/triSurface/ABCABCscaled.stl
stlデータのチェックを行う
stlのファイルがどのような状態になっているかチェックを行うことが出来る。
方法は簡単で、以下のコマンドを入力すればよいです。
(例:ABCABC.stlのデータをチェックする場合
surfaceCheck constant/triSurface/ABCABC.stl
結果について解説
順番に解説していきます。(数字は例なので気にしないでください)
メッシュの領域確認
Bounding Box : (-0.103678 -0.104032 0) (0.10415 0.104032 1)
すべての座標が (X,Y,Z)=(-0.103678 -0.104032 0) の点と(0.10415 0.104032 1)の点で構成された立方体の中にあることを示しています。
リスケールした場合もこれで確認すると良いです。
メッシュの品質確認
Surface has no illegal triangles.
このような文言があれば、変換後のメッシュに問題はなく、形状は保持されているこ戸を示しています。
エッジの長さ
min 0.0198 for edge 63 points (-0.103678 0.00990009 1)(-0.0999312 0.0293424 1)
max 1.0002 for edge 57 points (-0.0925722 0.0477243 1)(-0.0999312 0.0293424 0)
最小エッジ長さと最小エッジ長さが表示されます。
メッシュのエッジ長とは?
メッシュのエッジ長(edge length) とは、三角形や四面体のメッシュの各辺(エッジ)の長さ のことです。
STL や OpenFOAM のメッシュでは、エッジ長がメッシュ品質に大きく影響 します。CFD(流体解析)や FEM(有限要素法)では、物体の形状を 小さな要素(セル) に分割してシミュレーションを行います。メッシュを構成するのは主に三角形の集合で表面を作り、3Dである場合は、内部は四面体で構成 します。その各三角形の辺(エッジ) に「エッジ長」が定義される
エッジ長が重要な理由
① メッシュ品質の影響
- エッジ長が大きすぎると、、、
- ⇒ 解像度が低く、形状が粗くなる
- ⇒ 境界層の計算精度が悪化
- エッジ長が小さすぎると、、、
- ⇒ 計算負荷が増大し、メモリ使用量が増える
- ⇒ 不必要に細かい部分が増え、シミュレーションが遅くなる
② snappyHexMesh
での影響
- スナップ(snap)処理
⇒ STL 形状にメッシュを適合させる際、エッジ長が適切でないとスナップに失敗する - 細分化(refinement)
- ⇒
refinementSurfaces
やrefinementRegions
で指定する細分化レベルに影響
STL の閉鎖性
STL は完全に閉じていなければいけません。
STLファイルで囲まれた空間を計算範囲とするために、そのファイルが一部でも開いてはいけません。
Surface is closed. All edges connected to two faces.
このような文言があれば、STLファイルは完全に閉じており、問題が無いことが分かります。
メッシュの調整を行うには、、、
メッシュをもっと細分化し、小さなエッジを確保方法を紹介します。
メッシュ細分化を行う
snappyHexMeshDict
の refinementSurfaces
でメッシュ細分化レベルを増やしましょう。
以下例です。
refinementSurfaces
{
ABCABC
{
level (3 4); // 細分化レベルを (2 3) → (3 4) に変更
}
}
この level (3 4);
は、その表面(walls
)に対するメッシュの細分化レベルを指定する ものです。
- 最小細分化レベル
3
- 最大細分化レベル
4
つまり、この表面に接するセルは、必要に応じて 3~4 段階の細分化が適用される という意味です。
細分化レベルとは?
細分化レベル N
とは、元のメッシュを 2^N
の分割 で細分化することを意味します。
例えば:
- レベル 0 → 元のメッシュサイズ(細分化なし)
- レベル 1 → 各セルを
2×2×2 = 8
個に分割 - レベル 2 → 各セルを
4×4×4 = 64
個に分割 - レベル 3 → 各セルを
8×8×8 = 512
個に分割 - レベル 4 → 各セルを
16×16×16 = 4096
個に分割
level (3 4);
のように、最小値と最大値を指定すると、snappyHexMesh
は、メッシュの適用条件によってレベル 3 または 4 に細分化 します。
- スナップする STL 表面(縁取り)に近い領域 → レベル 4(より細かいメッシュ)
- STL から遠い領域 → レベル 3(やや粗いメッシュ)
エッジ長を調整する
また、エッジ長が極端に長い部分を修正したい場合は、snappyHexMesh
の featureEdges
設定を変更します。
以下例です。
features
(
{
file "ABCABC.eMesh";
level 2;
}
);
ちなみに、全体のメッシュ分割数を増やしたい場合は、blockMeshDict
の blocks
で 分割数を増やすと良いです。
※.eMeshのファイルは、STL のどの部分がシャープなエッジなのかの情報が格納されています。snappyHexMesh
は .eMesh
を参照し、重要なエッジを正しく保持するようにメッシュを作成します。