ただし空気抵抗は無視しないものとする

流体解析の勉強の題材として日頃気になったことをまとめたり確かめたりしていく予定です。OSSしか使わないつもりです。

SALOMEでOpenFOAM用のwedgeメッシュを作る

はじめに

OpenFOAMでは軸対象のモデルを計算するwedgeというモードが備わっています。 このメッシュの作成にちょっとコツがいるためまとめてみました。

作業環境

  • OS : Ubuntu18.04 LTS
  • SALOME : 9.4.0
  • OpenFOAM : v1912

作成したメッシュ

以下のような350mLアルミ缶のモデルについて行いました。

f:id:inabower:20191230121338p:plain

途中までは以下の記事で作成したものを使用します。

inabower.hateblo.jp

このSHAPERモジュールで作成してGEOMETRYモジュールにExportしたShell_1を元に作成していきます。

wedge

wedgeモデルは軸対象のモデルに対して軸回転方向を無視したものです。 軸を上から見て10°以内の扇型のメッシュについて計算を行うことができます。 この角度が大きすぎるとセル中心の位置が面中心の位置とずれてしまい、小さすぎるとセル体積が小さくなり誤差の原因になります。 私はなんとなく5°(1/72)で使用することが多いです。

GEOMETRY

1. 中心部分をPartition

SHAPERなどで作成した四角形分割済みの面について、 Point→Lineで中心部分1メッシュ分の線を引き、この線でShellをPartitionします。

f:id:inabower:20191230035430p:plain

2. 扇形にする

Revolution:5°で扇形にし、その後にRotation:-2.5°で位置を中心に合わせます。

f:id:inabower:20191230035434p:plain

3. 中心部分だけグループ分け

必然的にプリズム型になる中心部分は他のヘキサメッシュとは異なるアルゴリズムを使用するため名前をつけておきます。 Extrusionというベース面のメッシュをそのまま押し出すようなアルゴリズムを使用するため、Extrusionする立体とそのベースとなる面をグループ化しておきます。

f:id:inabower:20191230035438p:plain

4. 線のグループ分け

同じ分割数の線をそれぞれグループ化します。 Operations → Blocks → Propagateを使うと便利です。

f:id:inabower:20191230040515p:plain

MESH

5. 線だけメッシュ

まずは線だけメッシングします。 そのために先程の扇形オブジェクトに対してCreate Meshを行い、3Dと2DのアルゴリズムはNoneにしておきます。 そしてCreate SubMeshで4で作成したグループ全てに対して分割数を指定します。 なお扇形の円周方向と中心部の外内方向のメッシュは分割数1(分割なし)にします。

f:id:inabower:20191230035442p:plain

6. base面を単一三角形としてメッシング

分割数1の辺×3の三角形であるbase面を単一の三角形にします。 ”メッシングしない”というオプションがあれば楽なのですが(見つけてないだけかも)、ここではNETGEN2Dアルゴリズムを使用します。 ここでAllow Quadrangleにチェックを入れるとなぜか単一三角形として生成してくれます。

f:id:inabower:20191230035446p:plain

7. 単一三角形を押し出し

3Dアルゴリズムの中の3D Extrusionを先程のextに適用します。 この状態でComputeを行うことで単一三角形を押し出したプリズムメッシュでext領域をメッシングできます。

f:id:inabower:20191230035449p:plain

8. その他の領域をヘキサメッシュ

他の部分についてはヘキサメッシュを行います。 最初にアルゴリズムを指定せずに作った大元のメッシュに対してEdit meshを行います。 2DアルゴリズムをQuadrangle Mapping、3DアルゴリズムをHexahidron(i,j,k)にすることで残りの部分をヘキサメッシュにできます。

f:id:inabower:20191230035453p:plain

9. GEOMETRYに戻って面のグループ分け

OpenFOAMでpatchになる面に名前をつけていきます。 私の場合はいつもwedge_Awedge_Bにしていますが、これらはそれぞれ別のグループになっているのであれば何でもOKです。

f:id:inabower:20191230114224p:plain
GEOMETRYモジュールでグループ分け

10. MESHモジュールに戻って読み込み→出力

メッシュを選択して右クリックメニューのCreate Groups from Geometryで先程のグループをメッシュに読み込ませます。

f:id:inabower:20191230120123p:plain

その後、右クリックメニューのExportUNV 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で確認したメッシュは以下のようになっていました。

f:id:inabower:20191230121338p:plain
完成したメッシュ

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にするとメッシュ数が格段に減るため軸回転方向以外の解像度を大幅に高めることができます。 ただし軸回転方向の影響を無視できない場合には結果が大きく変わるためご注意ください。