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

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

SALOMEでOpenFOAM用の六面体メッシュを作る

この記事はオープンCAE Advent Calendar 2018 8日目の記事です。 qiita.com

はじめに

 OpenFOAM始めたての頃にsnappyHecMeshで作ったメッシュが悪くて困っていたような記憶があります。 SALOMEを使って六面体メッシュを作れるようになると一気にやりやすくなると思いますので、その流れを実際にやっていきながら紹介していきたいと思います。

詳しい操作方法などについてはPENGUINITISさんのページで丁寧に紹介されています。

PENGUINITIS - Salome-Meca 入門

PENGUINITIS - 六面体メッシュ生成

またSALOMEで出力したメッシュファイルをOpenFOAM形式に変換する方法は下の記事で詳しく紹介していただいています。

qiita.com

使用環境

  • SALOME 8.4.0
    • ダウンロード先
      • Code_Aster : 構造解析ソフト"Code_Aster"の付属したもの。通常はこちらでOK。
      • Salome Platform : 開発元である電力会社EDFのサイト。Code_Asterは入っていないが最新のSALOMEを入手可能。
  • OpenFOAM v1806
  • Ubuntu 18.04

例題

 今回は例として以下のような350mLアルミ缶のメッシュを作成します。

f:id:inabower:20181206213704p:plain
完成メッシュ

作業の流れ

 SALOMEでは形状作成とメッシングを行うことができます。点→線→面→立体といった流れで作成していきますが、メッシングを前提として形状を作成することで綺麗なヘキサメッシュを切ることができます。大体以下のような流れになります。

  • Geometryパート

    • 点→線→面を作成
    • 線を作成し四角形の集合に分割
    • 押し出して立体を作成
    • 押し出し方によっては面を作成し六面体の集合に分割
    • 線と面をグルーピング
  • Meshパート

    • 全体メッシュ設定を決める。
    • グルーピングした線毎に分割数を決める。
    • Geometryパートで作成したグループを読み込む。
    • メッシュ生成→.unvでエクスポート→ideasUnvToFoamでOpenFOAMケースに変換

それではやっていきましょう。

Geometryパート

点→線→面

 点を書いてそれを繋いで線を書き、最後に面を囲う線を選択して面を作ります。

f:id:inabower:20181208171954p:plain f:id:inabower:20181208170445p:plain salome1

点は座標で指定することになりますので図面などを参考にしながら入力していきます。"Apply"押下で点を作成します。  その後に線を作成していきますが今回は連続線"Create a curve"を作成します。Shiftを押しながら点を選択していくことで連続した線を作成でき、また"Build a closed wire"で閉じた線集合にすることができます。 f:id:inabower:20181208172719p:plain

面を四角形で分割→押し出して立体に

 今回最終的に立体を六面体(ヘキサ)で分割することが目標です。その場合には面をまず四角形で分割する必要があります。 f:id:inabower:20181208181929p:plain f:id:inabower:20181208175951p:plain salome2

分割の方法は何通りでもあります。紙に書いてみたりしながら考えてみましょう。参考までに多角形は以下のように分割できます。 f:id:inabower:20181208180943p:plain

押し出しの際には基準面と回転軸と角度を選択します。 f:id:inabower:20181208182110p:plain

立体の分割

 先ほどと同様に今度はZ軸方向への分割を行います。立体の分割ですので今度は面で分割を行います。分割する面を作成するためには1方向押し出しを用います。

f:id:inabower:20181208185447p:plain f:id:inabower:20181208185206p:plain   salome3

 SALOMEでは円は1点を含む曲線です。この点がたまに期待通りの分割を妨げることがありますので注意してください。(下図)

f:id:inabower:20181208185545p:plain

このように辺の数が全て4であるように分割する必要があります。

微調整(必須ではない)

 計算後に表示しやすいように回転させたり(Rotation)もう使わない項目を非表示にしたり(Unpublish)しています。

salome4

面のグループ

 Crerate Groupで面に名前を付けます。これが最終的にOpenFOAMではboundaryもしくはfaceZoneになります。そのため内部面と最表面を同じグループにすることはできません。

salome5

Shiftなどを組み合わせることで慣れればある程度手早く選択していけます。 f:id:inabower:20181208191543p:plain

線のグループ

 こちらも同様に分けていきます。(下図はZ方向の線のグルーピング) salome6

 線はメッシングのためにグループ化します。

f:id:inabower:20181208192526p:plain

例えば上図のような六角柱を六面体で分割するには同じ色の線をそれぞれ同じ数に分割する必要があります。

同様に下図のようにゴリゴリと残り部分の線のグループ化を行っていきます。 salome7 salome9

以上でGeometryパートでの作業は終了です。

Meshパート

全体メッシュの作成

 メッシュモードに移行した後に全体の設定を入力します。  Create Mesh→立体を選択→3Dタブ:Algorithm="Hexahydron(i,j,k)"→2Dタブ:Algorithm="Mapping"→1Dタブ:Algorithm="Wire Discretisation→Number of Segments→Number of Segments=4" salome10

 メッシュの設定は3D〜0Dを個別に設定する必要があります。(たまに下位次元設定を含むパラメータも有ります。) 今回は完全にヘキサメッシュを作成するために以下のもののみを使用します。

f:id:inabower:20181208194132p:plain

線グループ毎に分割数を指定

 Create Sub-Mesh→線グループを選択→1D→Algorithm→Wire Discretisation→Number of Segmentsで各線グループの分割数を指定します。 Max Lengthで分割する方法がありますが、Max Lengthの場合はそれぞれの辺の長さが異なる場合に分割数が変わってしまうため今回は使用しません。

salome11

面グループを読み込み→エクスポート

 Geometryパートで作成した面グループを"メッシュを右クリック→Create Groups from Geometry"で読み込みます。Shiftを使うことで一括で選択できます。

salome12

 最終的にはunvファイルでエクスポートすることでOpenFOAMで使用することができます。変換方法については以下のページで詳しくまとめていただいています。

qiita.com

できたもの

最終的にこんなのができました。

f:id:inabower:20181206213704p:plain
完成メッシュ

checkMeshの結果も良好です。

Time = constant

Mesh stats
    points:           61459
    faces:            178624
    internal faces:   173120
    cells:            58624
    faces per cell:   6
    boundary patches: 3
    point zones:      0
    face zones:       0
    cell zones:       0

Overall number of cells of each type:
    hexahedra:     58624
    prisms:        0
    wedges:        0
    pyramids:      0
    tet wedges:    0
    tetrahedra:    0
    polyhedra:     0

Checking topology...
    Boundary definition OK.
    Cell to face addressing OK.
    Point usage OK.
    Upper triangular ordering OK.
    Face vertices OK.
    Number of regions: 1 (OK).

Checking patch topology for multiply connected surfaces...
    Patch               Faces    Points   Surface topology                  
    walls_top           1152     1185     ok (non-closed singly connected)  
    walls_out           3200     3264     ok (non-closed singly connected)  
    walls_btm           1152     1185     ok (non-closed singly connected)  

Checking faceZone topology for multiply connected surfaces...
    No faceZones found.

Checking basic cellZone addressing...
    No cellZones found.

Checking geometry...
    Overall domain bounding box (-0.033 -0.033 0) (0.033 0.033 0.115)
    Mesh has 3 geometric (non-empty/wedge) directions (1 1 1)
    Mesh has 3 solution (non-empty) directions (1 1 1)
    Boundary openness (-6.01322e-16 4.49165e-16 5.47892e-17) OK.
    Max cell openness = 2.63645e-16 OK.
    Max aspect ratio = 5.33108 OK.
    Minimum face area = 5.85937e-07. Maximum face area = 7.93424e-06.  Face area magnitudes OK.
    Min volume = 1.25593e-09. Max volume = 1.12037e-08.  Total volume = 0.000377225.  Cell volumes OK.
    Mesh non-orthogonality Max: 40.2205 average: 7.29301
    Non-orthogonality check OK.
    Face pyramids OK.
    Max skewness = 0.939408 OK.
    Coupled point location match (average 0) OK.

Mesh OK.

End

備考

  • SALOMEで作ったメッシュはセルの順番がぐちゃぐちゃな場合が多いのでrenumberMeshをしたほうが良いです。
  • solidがcompoundになっていないか確認すること。それをFuseなどで解消した時に内部面を再度ちゃんと作り直すこと。
  • 最表面と内部面が同じグループだった場合はunv出力まではできますがideasUnvToFoamができません。エラーログの中で面を作っていっている時にコアダンプしているときは大体これが原因です。
  • multiRegionの場合には3DグループからcellZoneを作成してsplitMeshRegions -cellZonesを行います。
  • mergeMeshやstitchMeshやcreatePatchなどを組み合わせるとSALOMEでの負荷が減ります。
  • 最終手段としてはメッシュを複数に分けて作ってmergeMeshした後その界面(異メッシュ)をcyclicAMIでつなぐといった方法もあります。
  • あまりメッシングに時間をかけるのは本質ではないのである程度で諦めること。