はじめに
OpenFOAMでは軸対象のモデルを計算するwedgeというモードが備わっています。 このメッシュの作成にちょっとコツがいるためまとめてみました。
作業環境
- OS : Ubuntu18.04 LTS
- SALOME : 9.4.0
- OpenFOAM : v1912
作成したメッシュ
以下のような350mLアルミ缶のモデルについて行いました。
途中までは以下の記事で作成したものを使用します。
このSHAPERモジュールで作成してGEOMETRYモジュールにExportしたShell_1
を元に作成していきます。
wedge
wedgeモデルは軸対象のモデルに対して軸回転方向を無視したものです。 軸を上から見て10°以内の扇型のメッシュについて計算を行うことができます。 この角度が大きすぎるとセル中心の位置が面中心の位置とずれてしまい、小さすぎるとセル体積が小さくなり誤差の原因になります。 私はなんとなく5°(1/72)で使用することが多いです。
GEOMETRY
1. 中心部分をPartition
SHAPERなどで作成した四角形分割済みの面について、 Point→Lineで中心部分1メッシュ分の線を引き、この線でShellをPartitionします。
2. 扇形にする
Revolution:5°で扇形にし、その後にRotation:-2.5°で位置を中心に合わせます。
3. 中心部分だけグループ分け
必然的にプリズム型になる中心部分は他のヘキサメッシュとは異なるアルゴリズムを使用するため名前をつけておきます。 Extrusionというベース面のメッシュをそのまま押し出すようなアルゴリズムを使用するため、Extrusionする立体とそのベースとなる面をグループ化しておきます。
4. 線のグループ分け
同じ分割数の線をそれぞれグループ化します。 Operations → Blocks → Propagateを使うと便利です。
MESH
5. 線だけメッシュ
まずは線だけメッシングします。 そのために先程の扇形オブジェクトに対してCreate Meshを行い、3Dと2DのアルゴリズムはNoneにしておきます。 そしてCreate SubMeshで4で作成したグループ全てに対して分割数を指定します。 なお扇形の円周方向と中心部の外内方向のメッシュは分割数1(分割なし)にします。
6. base
面を単一三角形としてメッシング
分割数1の辺×3の三角形であるbase
面を単一の三角形にします。
”メッシングしない”というオプションがあれば楽なのですが(見つけてないだけかも)、ここではNETGEN2Dアルゴリズムを使用します。
ここでAllow Quadrangle
にチェックを入れるとなぜか単一三角形として生成してくれます。
7. 単一三角形を押し出し
3Dアルゴリズムの中の3D Extrusion
を先程のext
に適用します。
この状態でCompute
を行うことで単一三角形を押し出したプリズムメッシュでext
領域をメッシングできます。
8. その他の領域をヘキサメッシュ
他の部分についてはヘキサメッシュを行います。
最初にアルゴリズムを指定せずに作った大元のメッシュに対してEdit mesh
を行います。
2DアルゴリズムをQuadrangle Mapping
、3DアルゴリズムをHexahidron(i,j,k)
にすることで残りの部分をヘキサメッシュにできます。
9. GEOMETRYに戻って面のグループ分け
OpenFOAMでpatchになる面に名前をつけていきます。
私の場合はいつもwedge_A
とwedge_B
にしていますが、これらはそれぞれ別のグループになっているのであれば何でもOKです。
10. MESHモジュールに戻って読み込み→出力
メッシュを選択して右クリックメニューのCreate Groups from Geometry
で先程のグループをメッシュに読み込ませます。
その後、右クリックメニューのExport
→UNV file
でUNV形式にエクスポートします。
今回はwedge.unv
というファイルを出力しました。
11. OpenFOAM形式に変換
OpenFOAMの適当なチュートリアルをコピーしてきてその中に先程のwedge.unv
をコピーし、以下の操作を行います。
ideasUnvToFoam wedge.unv
renumberMesh -overwrite
ideasUnvToFoam
はUNV形式のメッシュをOpenFOAM形式に変換するユーティリティです。
renumberMesh
はメッシュの順番を整えるユーティリティで、SALOMEで出力されるメッシュはメッシュの順番がバラバラな場合が多いためこれを行うことで計算速度が早くなったりします。
また、constant/polyMesh/boundary
の中身を以下のように編集します。
/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: v1912 | | \\ / A nd | Website: www.openfoam.com | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class polyBoundaryMesh; location "constant/polyMesh"; object boundary; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 6 ( wedge_A { type wedge; nFaces 1571; startFace 3055; } wedge_B { type wedge; nFaces 1571; startFace 4626; } ...
これでwedge面として指定できました。
12. メッシュの確認
ParaViewとcheckMeshで確認したメッシュは以下のようになっていました。
Checking geometry... Overall domain bounding box (-1.113691e-18 -0.0014394398 -2.0157582e-12) (0.032968591 0.0014394398 0.117) Mesh has 2 geometric (non-empty/wedge) directions (1 0 1) Mesh has 3 solution (non-empty) directions (1 1 1) Wedge wedge_A with angle 2.5 degrees Wedge wedge_B with angle 2.5 degrees All edges aligned with or perpendicular to non-empty directions. Boundary openness (1.1379343e-16 1.9791924e-16 5.5112448e-19) OK. Max cell openness = 2.3610339e-16 OK. Max aspect ratio = 4.4778269 OK. Minimum face area = 4.3577871e-08. Maximum face area = 6.6817001e-06. Face area magnitudes OK. Min volume = 2.9051911e-11. Max volume = 7.2329335e-09. Total volume = 5.2055678e-06. Cell volumes OK. Mesh non-orthogonality Max: 56.766778 average: 23.621304 Non-orthogonality check OK. Face pyramids OK. Max skewness = 1.3492111 OK. Coupled point location match (average 0) OK.
いい感じですね。
最後に
wedgeにするとメッシュ数が格段に減るため軸回転方向以外の解像度を大幅に高めることができます。 ただし軸回転方向の影響を無視できない場合には結果が大きく変わるためご注意ください。