この記事はオープンCAE Advent Calendar 2018 8日目の記事です。 qiita.com
はじめに
OpenFOAM始めたての頃にsnappyHecMeshで作ったメッシュが悪くて困っていたような記憶があります。 SALOMEを使って六面体メッシュを作れるようになると一気にやりやすくなると思いますので、その流れを実際にやっていきながら紹介していきたいと思います。
詳しい操作方法などについてはPENGUINITISさんのページで丁寧に紹介されています。
またSALOMEで出力したメッシュファイルをOpenFOAM形式に変換する方法は下の記事で詳しく紹介していただいています。
使用環境
- SALOME 8.4.0
- ダウンロード先
- Code_Aster : 構造解析ソフト"Code_Aster"の付属したもの。通常はこちらでOK。
- Salome Platform : 開発元である電力会社EDFのサイト。Code_Asterは入っていないが最新のSALOMEを入手可能。
- ダウンロード先
- OpenFOAM v1806
- Ubuntu 18.04
例題
今回は例として以下のような350mLアルミ缶のメッシュを作成します。
作業の流れ
SALOMEでは形状作成とメッシングを行うことができます。点→線→面→立体といった流れで作成していきますが、メッシングを前提として形状を作成することで綺麗なヘキサメッシュを切ることができます。大体以下のような流れになります。
Geometryパート
- 点→線→面を作成
- 線を作成し四角形の集合に分割
- 押し出して立体を作成
- 押し出し方によっては面を作成し六面体の集合に分割
- 線と面をグルーピング
Meshパート
- 全体メッシュ設定を決める。
- グルーピングした線毎に分割数を決める。
- Geometryパートで作成したグループを読み込む。
- メッシュ生成→.unvでエクスポート→ideasUnvToFoamでOpenFOAMケースに変換
それではやっていきましょう。
Geometryパート
点→線→面
点を書いてそれを繋いで線を書き、最後に面を囲う線を選択して面を作ります。
点は座標で指定することになりますので図面などを参考にしながら入力していきます。"Apply"押下で点を作成します。 その後に線を作成していきますが今回は連続線"Create a curve"を作成します。Shiftを押しながら点を選択していくことで連続した線を作成でき、また"Build a closed wire"で閉じた線集合にすることができます。
面を四角形で分割→押し出して立体に
今回最終的に立体を六面体(ヘキサ)で分割することが目標です。その場合には面をまず四角形で分割する必要があります。
分割の方法は何通りでもあります。紙に書いてみたりしながら考えてみましょう。参考までに多角形は以下のように分割できます。
押し出しの際には基準面と回転軸と角度を選択します。
立体の分割
先ほどと同様に今度はZ軸方向への分割を行います。立体の分割ですので今度は面で分割を行います。分割する面を作成するためには1方向押し出しを用います。
SALOMEでは円は1点を含む曲線です。この点がたまに期待通りの分割を妨げることがありますので注意してください。(下図)
このように辺の数が全て4であるように分割する必要があります。
微調整(必須ではない)
計算後に表示しやすいように回転させたり(Rotation)もう使わない項目を非表示にしたり(Unpublish)しています。
面のグループ
Crerate Groupで面に名前を付けます。これが最終的にOpenFOAMではboundaryもしくはfaceZoneになります。そのため内部面と最表面を同じグループにすることはできません。
Shiftなどを組み合わせることで慣れればある程度手早く選択していけます。
線のグループ
こちらも同様に分けていきます。(下図はZ方向の線のグルーピング)
線はメッシングのためにグループ化します。
例えば上図のような六角柱を六面体で分割するには同じ色の線をそれぞれ同じ数に分割する必要があります。
同様に下図のようにゴリゴリと残り部分の線のグループ化を行っていきます。
以上でGeometryパートでの作業は終了です。
Meshパート
全体メッシュの作成
メッシュモードに移行した後に全体の設定を入力します。 Create Mesh→立体を選択→3Dタブ:Algorithm="Hexahydron(i,j,k)"→2Dタブ:Algorithm="Mapping"→1Dタブ:Algorithm="Wire Discretisation→Number of Segments→Number of Segments=4"
メッシュの設定は3D〜0Dを個別に設定する必要があります。(たまに下位次元設定を含むパラメータも有ります。) 今回は完全にヘキサメッシュを作成するために以下のもののみを使用します。
線グループ毎に分割数を指定
Create Sub-Mesh→線グループを選択→1D→Algorithm→Wire Discretisation→Number of Segmentsで各線グループの分割数を指定します。 Max Lengthで分割する方法がありますが、Max Lengthの場合はそれぞれの辺の長さが異なる場合に分割数が変わってしまうため今回は使用しません。
面グループを読み込み→エクスポート
Geometryパートで作成した面グループを"メッシュを右クリック→Create Groups from Geometry"で読み込みます。Shiftを使うことで一括で選択できます。
最終的にはunvファイルでエクスポートすることでOpenFOAMで使用することができます。変換方法については以下のページで詳しくまとめていただいています。
できたもの
最終的にこんなのができました。
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でつなぐといった方法もあります。
- あまりメッシングに時間をかけるのは本質ではないのである程度で諦めること。