こんにちは(@t_kun_kamakiri)
本記事ではOpenFOAMのメッシュ生成で使われるcfMeshを使って円柱内部のメッシュ生成を行いたいと思います。
最終的には以下のようになります。
cfMeshを使って円筒内部のメッシュ生成を行う
以前の記事でも解説したようにsnappyHexMeshでの境界層はなかなかきれいに生成することができません。
そんな時には今回紹介するcfMeshを試してみるのも良いです。ただ、cfMeshよりsnappyHexMeshの方が設定項目が多く融通が利きますが慣れが必要です。未だに使うかは悩ましいところですね。
cfMeshの基本的な使い方や境界層の設定のコツなどは以下の記事で解説していますのでご参考ください。
円筒内部の流れは理論的にもよく理解されている基本的な流れです。
- レイノルズ数の大きさによる層流・乱流遷移
- 層流と乱流の助走区間の違い
- 層流と乱流の速度分布の違い
これらの内容は流体力学の参考書にもある話です。
流体のシミュレーションをしていると何となく結果はでるけども「あってるのどうなの?」と思うこともしばしばあります。
実験とシミュレーションの結果を比較するというのもひとつの手ではありますし、流体力学の中でも条件を限定すると解析解を導くことができ、シミュレーションとの比較を行うことができます。
近似的に解析解が出せるなら、シミュレーションの結果と比較して妥当性を検証することは重要なことです。
今回はシミュレーションが正しく行えているのかを確認するために、円筒のモデルを作成して流体解析を行い、解析解とシミュレーションとの比較を行うことにします。
今回はメッシュだけを作ります。
【使用環境】
OpenFOAM-v2012(WSL2)
GPL版のcfMeshはソースコードが公開されています。
ESI版のOpenFOAMであれば、OpenFOAMをインストールすると「$WM_PROJECT_DIR/modules/cfmesh」(「/opt/OpenFOAM/OpenFOAM-v2012/modules/cfmesh/」)にcfMeshがインストールされているので、追加でインストールすることなく使うことができます。
FreeCADで円柱モデルを作成
FreeCAD(0.20)でΦ10mm×1200mmの円柱モデルを作成します。
snappyHexMeshでの形状の認識のために形状stlファイルが必要であるためです。
また、FreeCADにはソリッドを面分割して面に名前を付ける機能があります。
ここで面に名前を付けておくことと便利です。面に名前を付けることで、境界条件の設定やsnappyHexMeshでの面まわりのメッシュの再分割などにも使えます。
面に名前をつけたstlファイルを結合してひとつのファイルにまとめるFreeCADのマクロは以下の記事をご参考ください。
出力したstlファイルは「constant/triSurface」に保存します。
FreeCADでの「mm単位」の表記は実は数値しか拾っていないので、実際流体解析で使用する単位系がm単位であればスケール変換する必要があります。
スケール変換は以下のコマンドで簡単に行うことができます。
1 | surfaceConvert -scale 0.001 constant/triSurface/model.stl constant/triSurface/model_m.stl |
今回使用するのはm単位系になった「model_m.stl」です。
cfMeshのチュートリアルをコピーする
cfMeshはESI版のOpenFOAMを使っている場合は「$WM_PROJECT_DIR/modules/cfmesh」に保存されているので、適当なチュートリアルからコピーして編集して使います。
cfMeshは以下のメッシュの種類を選択することができます。
チュートリアルはメッシュの種類で分かれていますが設定ファイルは共通しているのでどれを使っても良いです。今回は設定項目がデフォルトで多く記述されている以下のチュートリアルをコピーします。
1 | cp -r /opt/OpenFOAM/OpenFOAM-v2012/modules/cfmesh/tutorials/cartesianMesh/multipleOrifices Cylinder_cfMesh |
フォルダを移動します。
1 | cd Cylinder_cfMesh |
フォルダ構成を確認しておきましょう。
同じフォルダに形状のstlファイルを置く必要があるので、円柱形状の「model_m.stl」ファイルを保存しておきます
1 2 3 4 5 6 7 8 9 10 | . ├── Allclean ├── Allrun ├── model_m.stl ├── multipleOrifices.stl └── system ├── controlDict ├── fvSchemes ├── fvSolution └── meshDict |
※「multipleOrifices.stl」は使わないので消しても構いません。
特徴線の抽出
特徴線の抽出には以下のコマンドを行う必要があります。
1 | surfaceFeatureEdges model_m.stl model_m.fms |
また、隣り合った面での法線ベクトルがなす角度を指定して出力することもできます。
以下の例は角度30°以下の角度の線は特徴線とみなされます。
指定なしの場合は角度は45°。
ここまででファイル構成は以下となります。
1 2 3 4 5 6 7 8 9 10 | . ├── Allclean ├── Allrun ├── model_m.fms ├── model_m.stl ├── multipleOrifices.stl └── system ├── controlDict ├── fvSchemes ├── fvSolutio |
- model_m.stl:m単位の形状ファイル
- model_m.fms:特徴線を持った形状ファイル
fmsの方が精度よくメッシュ生成を行うことができるため、基本的にはfmsを使うことをお勧めします。
※といってもfmsファイルを直接ParaViewで確認することができないので、今回はstlファイルを形状ファイルとして使います。
ちなみにfmsファイルからstlファイルには以下のコマンドで変換可能です。stlファイルにするとParaViewで可視化ができます。
1 | FMSToSurface model_m.fms model_m.stl |
メッシュ生成
メッシュの設定は「system/meshDict」ファイルで行います。
meshDictの設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | surfaceFile “mesh.fms”; // 形状ファイル(stl, fms形式) maxCellSize 10.0; // 最大セルサイズ(絶対値指定) boundaryCellSize 1.0; // 境界層セルサイズ(option) boundaryCellSizeRefinementThickness 1.0; // 境界層厚さ(option) minCellSize 1.0; // 最小セルサイズ(option) boundaryLayers { } // 境界層の設定ブロック localRefinement { } // パッチ名によるリファイン設定 surfaceMeshRefinement { } // サーフェスのリファイン設定 edgeMeshRefinement { } // エッジベースのリファイン設定 objectRefinements { } // オブジェクトによるリファイン設定 anisotropicSources { } // 異方性メッシュの設定 renameBoundary { } // パッチ名の変更 workflowControls { } // メッシュ生成のコントロール keepCellsIntersectingBoundary 1; checkGluedMesh 0; enforceGeometryConstraints 1; |
cfMeshに最低限必要なのが、
1 2 | surfaceFile "model000_m.stl"; maxCellSize 0.01; |
の2つです。
- surfaceFile:stlファイルかfmsファイル
- maxCellSize:ベースのメッシュサイズ
特定の面でのメッシュサイズや、特定の面での境界層を設定したい場合などをオプションで色々と設定することができます。
system/meshDict
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | cfMesh: A library for mesh generation | | \\ / O peration | | | \\ / A nd | Author: Franjo Juretic | | \\/ M anipulation | E-mail: franjo.juretic@c-fields.com | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; location "system"; object meshDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // surfaceFile "model_m.fms"; //minCellSize 1.0; maxCellSize 0.01; //boundaryCellSize 0.01; localRefinement { "inlet" { cellSize 0.0025; } "outlet" { cellSize 0.0025; } "sideWall" { cellSize 0.0025; } } boundaryLayers { // nLayers 3; // thicknessRatio 1.2; // maxFirstLayerThickness 0.5; patchBoundaryLayers { "(inlet|outlet|sideWall).*" { nLayers 5; thicknessRatio 1.2; maxFirstLayerThickness 0.002; allowDiscontinuity 0; } } optimiseLayer 1; } // ************************************************************************* // |
cfMeshはデフォルトで面のメッシュサイズや境界層を設定できますが、できれば特定の面に対して個別で設定する方が良いでしょう。なぜなら、想定外にメッシュサイズが多くなったり、設定が二重になってどちらが効いているのかがわからなくなるからです。
メッシュの設定は終わりです。
snappyHexMeshと比べると設定項目が非常に少なく、簡単な形状ならばcfMeshを使う方が良いでしょう。円柱くらいならblockMeshでもできるかもしれませんが、cfMeshはstlファイル形状に沿ってメッシュを簡単に生成することができるので使いやすいです。
メッシュ生成(cartesianMesh)
cfMeshの設定は終わりましたのでメッシュ生成コマンドを実行します。
六面体ベースのメッシュの場合は「cartesianMesh」を使います。
1 | cartesianMesh |
できたのをParaViewで確認するとこんな感じになっています。
断面を切っても境界層がきれいに入っています。
テトラメッシュのメッシュの場合は「tetMesh」を使います。
1 | tetMesh |
テトラメッシュだと今回の設定では境界層を作ってくれませんでした。
テトラメッシュの場合形状が複雑になると直交性が悪いメッシュになり、流体解析では収束性が悪く発散する原因にもなりうるのでよっぽどの事情がない限り使わない方が良いでしょう。tetMeshを使うくらいならcartesianMeshで十分です。
ポリヘドラルメッシュの場合は「pMesh 」を使います。
1 | pMesh |
今回はエラーが出てメッシュを作ってくれなかったので割愛します。
たぶん設定の問題です。
メッシュ品質の確認
結局メッシュはcartesianMeshの結果を使うことにします。
以下のコマンドでメッシュ品質も確認しておきましょう。
1 | checkMesh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | Mesh stats points: 92815 faces: 265192 internal faces: 253064 cells: 86432 faces per cell: 5.99611 boundary patches: 3 point zones: 0 face zones: 0 cell zones: 0 Overall number of cells of each type: hexahedra: 86128 prisms: 192 wedges: 0 pyramids: 80 tet wedges: 0 tetrahedra: 32 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 inlet 184 189 ok (non-closed singly connected) outlet 184 189 ok (non-closed singly connected) sideWall 11760 11784 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.010001 -0.0100008 0) (0.010001 0.0100016 1.2) Mesh has 3 geometric (non-empty/wedge) directions (1 1 1) Mesh has 3 solution (non-empty) directions (1 1 1) Boundary openness (1.31633e-15 -2.64743e-15 -2.30507e-18) OK. Max cell openness = 4.33305e-16 OK. Max aspect ratio = 12.6226 OK. Minimum face area = 4.6115e-08. Maximum face area = 6.79725e-06. Face area magnitudes OK. Min volume = 1.17928e-10. Max volume = 1.40821e-08. Total volume = 0.00037252. Cell volumes OK. Mesh non-orthogonality Max: 31.3466 average: 2.76428 Non-orthogonality check OK. Face pyramids OK. Max skewness = 0.708934 OK. Coupled point location match (average 0) OK. Mesh OK |
以下の部分は最低確認するようにしましょう。
- Max aspect ratio:アスペクト比(縦横の比率)→境界層で大きくなりやすいので大きすぎる場合は確認
- non-orthogonality:直交性→70°以上であれば修正
- Max skewness:歪度→4以上だと修正
メッシュ品質の基準は以下のファイルにも記載がありますで確認してみましょう。
1 | $WM_PROJECT_DIR/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/ |
コマンドでファイルを探す場合は、
1 | find $FOAM_SRC -name "primitiveMeshCheck*" |
以下のように出力されます。
1 2 3 4 5 6 7 | /opt/OpenFOAM/OpenFOAM-v2012/src/OpenFOAM/lnInclude/primitiveMeshCheckEdgeLength.C /opt/OpenFOAM/OpenFOAM-v2012/src/OpenFOAM/lnInclude/primitiveMeshCheckPointNearness.C /opt/OpenFOAM/OpenFOAM-v2012/src/OpenFOAM/lnInclude/primitiveMeshCheck.C /opt/OpenFOAM/OpenFOAM-v2012/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck /opt/OpenFOAM/OpenFOAM-v2012/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheckEdgeLength.C /opt/OpenFOAM/OpenFOAM-v2012/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheckPointNearness.C /opt/OpenFOAM/OpenFOAM-v2012/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C |
primitiveMeshCheck.Cの中身を確認しましょう。
1 | vi $FOAM_SRC/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C |
該当箇所は「/primitiveMesh」と打って「n(下へ)」「shift + n(上へ)」で探すことができます。
viを終了するには
ESCボタンを押して「:q」か「:q!」で終了することができます。
1 2 3 4 5 | Foam::scalar Foam::primitiveMesh::closedThreshold_ = 1.0e-6; Foam::scalar Foam::primitiveMesh::aspectThreshold_ = 1000; Foam::scalar Foam::primitiveMesh::nonOrthThreshold_ = 70; // deg Foam::scalar Foam::primitiveMesh::skewThreshold_ = 4; Foam::scalar Foam::primitiveMesh::planarCosAngle_ = 1.0e-6; |
シミュレーションを行う場合、低品質なセルや面によって生じる数値誤差を低減できる数値スキームを選択します。
おすすめ参考図書
☟こちらは、OpenFOAMの日本語書籍が無い中唯一わかりやすい参考書だと思います。
☟こちらもOpenFOMの古いバージョンでの和訳になります。さすがにこちらはバージョンに対する日本語でのケアはしていないので、OpenFOAMに慣れている方は購入しても良いかと思います。僕は「日本語でまとまっている内容」なので少し重宝しています。
☟以下に、もっと初心者向けの同人誌を紹介しておきます。
初心者は「ってか、まずどうやってOpenFOAMをインストールするの?」というところからつまずきがちです。
そんな時は、以下の書籍をおすすめします。
改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))
インストール方法とチュートリアルで流体解析を体験・・・ちょっと高度な解析まで解説があります。著者曰くOpenFOAMのバージョンの追跡を行いながら、書籍をアップデートするようなので安心ですね。
cfMeshに関しては↓こちらのオープンCAE学会から技術書典にOpenFOAMでメッシュ作成【PDF版】が出ています。難しい内容ではありますが、OpenFOAMのメッシュに関する内容が1000円で学べます。