こんにちは(@t_kun_kamakiri)
前回の記事ではsnappyHexMeshを使って境界層メッシュの検討を行いました。
しかし、結論から言うとsnappyHexMeshでは境界層がきれいに入らず、これ以上手の施しようがありませんでした。
そこで、今回はcfMeshを使って前回時の記事と同じモデルで境界層について検討したいと思います。
- cfMeshでの境界層メッシュの設定方法
- cfMeshでメッシュ作成の注意点
cfMeshでの基本的な設定方法は以下の記事に書きましたのでご参考ください。
cfMeshでの境界層設定について考えるため、本記事ではこのような形状の場合を考えます。
※形状に特に意味はありません。
後ほど面でのメッシュ再分割をしたいので、FreeCADで面に名前を付けておきました。
FreeCADを使ったモデル作成は動画を用意しましたので、再現したい方はこちらをどうぞ。
面に名前を付けた際にstlを掃き出す便利なマクロは以下の記事をご参考ください。
ParaViewを起動してみましょう。
単純な形状ですが太い円柱と細い円柱など、強弱があるためメッシュ再分割と境界層をどのように入れるかが肝になりそうです。
- OpenFOAMv2012(WSL2)
- cfMesh(OpenFOAMv2012にインストール済)
cfMeshでのチュートリアルをコピー
cfMeshで対応のメッシュ生成のコマンドは以下のものがあります。
チュートリアルごとにフォルダがわかれていますが、設定項目は同じでどのチュートリアルから持ってきて使用しても良いです。
設定項目が多いチュートリアルを持ってくるのが使いやすいでしょう。
cfMeshのチュートリアルをコピーします。
1 | cp -rp /opt/OpenFOAM/OpenFOAM-v2012/modules/cfmesh/tutorials/cartesianMesh/multipleOrifices cfMesh_v2012 |
フォルダ構成は以下のようになっています。
1 2 3 4 5 6 7 8 9 | . ├── Allclean ├── Allrun ├── multipleOrifices.stl └── system ├── controlDict ├── fvSchemes ├── fvSolution └── meshDict |
この中で使うのは「system/meshDict」だけです。
cfMeshの基本設定
「system/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; |
デフォルトでは以下のようになっています。
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 | surfaceFile "multipleOrifices.stl"; minCellSize 1.0; maxCellSize 5.0; boundaryCellSize 2.0; localRefinement { "orifice01.*" { cellSize 0.1; } "orifice02.*" { cellSize 0.2; } "orifice0[3-6].*" { cellSize 0.3; } } boundaryLayers { // nLayers 3; // thicknessRatio 1.2; // maxFirstLayerThickness 0.5; patchBoundaryLayers { "orifice.*" { nLayers 4; thicknessRatio 1.2; maxFirstLayerThickness 0.2; allowDiscontinuity 0; } "fixedWalls.*" { nLayers 4; thicknessRatio 1.2; maxFirstLayerThickness 1.0; allowDiscontinuity 0; } "tubes.*" { nLayers 4; thicknessRatio 1.2; maxFirstLayerThickness 1.0; allowDiscontinuity 0; } } optimiseLayer 1; } renameBoundary { defaultName fixedWalls; defaultType wall; newPatchNames { "inlet.*" { type patch; newName inlet; } "outlet.*" { type patch; newName outlet; } } } |
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 |
model_m.stlが追加されただけです。
Case1:最大メッシュサイズと境界面メッシュサイズだけ指定
もっとも基本的な設定だけでcfMeshでメッシュ生成を行います。
指定するのは最大のメッシュと境界面のメッシュサイズのみ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | surfaceFile "model_m.stl"; maxCellSize 0.01; boundaryCellSize 0.01; boundaryLayers { nLayers 3; thicknessRatio 1.2; maxFirstLayerThickness 0.001; optimiseLayer 1; } // ************************************************************************* // |
基本的にこれだけでメッシュ生成ができます。
ただし、maxCellSizeとboundaryCellSizeだけではΦ10の細い円柱の形状変化を表現できず、メッシュが生成されていません。
少し修正が必要ですね。
Case2:最大メッシュサイズの修正
最大のメッシュサイズを変えることで形状変化が大きい部分のメッシュも生成してくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | surfaceFile "model_m.stl"; maxCellSize 0.001; boundaryCellSize 0.01; boundaryLayers { nLayers 3; thicknessRatio 1.2; maxFirstLayerThickness 0.001; optimiseLayer 1; } // ************************************************************************* // |
メッシュは形状変化をとらえてメッシュ生成してくれています。
しかし、めちゃくちゃメッシュが細かくなってしまいました。でも、きれいに境界層メッシュが入っていますね。
今は、「maxFirstLayerThickness 0.001;」なので境界層の1層目が1mmなのでとても細かい設定です。
Case3:最小のメッシュサイズも決める
最大メッシュサイズだけの指定だと細かい形状変化の部分でメッシュが生成されません。
それを防ぐために最小のメッシュサイズのデフォルト値も決めておきます。
「minCellSize 0.001;」を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | surfaceFile "model_m.stl"; minCellSize 0.001; maxCellSize 0.001; boundaryCellSize 0.01; boundaryLayers { nLayers 3; thicknessRatio 1.2; maxFirstLayerThickness 0.001; optimiseLayer 1; } // ************************************************************************* // |
minCellSizeを指定すると最小のメッシュを判定してくれますが、所々ムラがあるメッシュになりました。
境界層も入っていますがかなりムラがある結果になりました。
Case4:特定の境界面のメッシュサイズを指定する
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 | surfaceFile "model_m.stl"; // minCellSize 0.001; maxCellSize 0.01; boundaryCellSize 0.01; localRefinement { "sideWall3" { cellSize 0.001; } "wallOutlet1" { cellSize 0.001; } "outletYmax" { cellSize 0.001; } "outletYmin" { cellSize 0.001; } "sideWall2" { cellSize 0.001; } "wall1" { cellSize 0.001; } "sideWall1" { cellSize 0.001; } "inlet" { cellSize 0.001; } // "orifice0[3-6].*" // { // cellSize 0.3; // } } boundaryLayers { nLayers 3; thicknessRatio 1.2; maxFirstLayerThickness 0.001; optimiseLayer 1; } |
もう少し境界面のメッシュサイズを調整します。
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 | surfaceFile "model_m.stl"; // minCellSize 0.001; maxCellSize 0.01; // boundaryCellSize 0.01; localRefinement { "sideWall3" { cellSize 0.005; } "wallOutlet1" { cellSize 0.005; } "outletYmax" { cellSize 0.005; } "outletYmin" { cellSize 0.005; } "sideWall2" { cellSize 0.001; } "wall1" { cellSize 0.005; } "sideWall1" { cellSize 0.005; } "inlet" { cellSize 0.005; } // "orifice0[3-6].*" // { // cellSize 0.3; // } } boundaryLayers { nLayers 3; thicknessRatio 1.2; maxFirstLayerThickness 0.001; optimiseLayer 1; } |
これでどうでしょうか。
表面のメッシュは良いのですが、境界層メッシュが大きすぎたりしますね。 形状変化が比較的大きいΦ40からΦ10のつなぎ目では境界層のメッシュサイズが極端に変わっているのがわかります。特定面のメッシュサイズはlocalRefinementのcellSizeでメッシュサイズの絶対値をしている方法もありますが、additionalRefinementLevelsとして分割数を指定する方法もあります。