snappyhexmesh/cfmesh コマンドを用いたメッシュ生成 若嶋振一郎 (NIT, Ichinoseki College) swaka@ichinoseki.ac.jp 初出 : 2017/01/05 更新 : 2017/05/20 2017/5/21 1
Outline 1. snappyhexmeshコマンドについて 1. snappyhexmeshコマンドの概要と準備 2. snappyhexmeshコマンドの実行 2. cfmeshについて 1. cfmeshパッケージの導入 2. cfmeshに含まれるコマンド 3. 準備 4. cfmeshコマンドの実行 2017/5/21 2
snappyhexmesh コマンド OpenFOAM に付属する非構造格子生成コマンド blockmesh は構造格子を生成 blockmesh と組み合わせて利用する しばしば shm と省略形で引用 基本的な流れ 1 blockmeshdict でベースメッシュ作成 2 constant/trisurface 以下に置いた形状ファイル (.stl,.obj,.vtk など ) から特徴線を抽出 3 形状ファイル 特徴線データを用いて system/snappyhexmeshdict に記述した設定に従い メッシュを生成 2017/5/21 3
shm のしくみ CAD ソフトウェア等で STL などの形状ファイルを出力する ( 形状のどちら側にメッシュを張るかを確認しておく ) blockmesh でベースメッシュを作成する ( 手動 ) snappyhexmesh の機能により 形状近傍のベースメッシュを細分化する (8 分木法 ) 領域外になる部分のセルを取り除く ( ここまでで castellate の状態 ) 領域外に飛び出ているメッシュを形状に合わせる ( snap ) 必要があれば境界層メッシュを挿入する ( addlayers ) 2017/5/21 4
Tutorial: $FOAM_TUTORIALS/incompressible/simpleFoam/motorBike 1 形状データは三角形の表面メッシュ (STL, OBJ, VTK 形式 ) ファイルを用意し constant/trisurface/ に置きます $ cp $FOAM_TUTORIALS/resources/geometry/motorBike.obj.gz constant/trisurface $ gunzip constant/trisurface/motorbike.obj.gz (gzip 形式を解凍 ) $ paraview constant/trisurface/motorbike.obj STL ファイルなどで 形状のある部分をパッチとして境界条件の指定に使いたい場合は 個別の stl ファイルとして出力して個別にしていするか それらを 1 つの stl にまとめておく (solid ~endsolid の組を複数作る ) 2017/5/21 5
Tutorial: $FOAM_TUTORIALS/incompressible/simpleFoam/motorBike 2 surfacefeatureextract コマンドによる特徴線の抽出を実施 ( 設定ファイル system/surfacefeatureextractdict) $ surfacefeatureextract constant/extendedfeatureedgemesh 以下に obj 形式の形で特徴線形状データが生成 さらに extendedfeatureedgemesh ファイルも生成 more motorbike.extendedfeatureedgemesh を用いて constant/trisurface の下に.eMesh 形式の特徴線データを出力 この.eMesh 形式ファイルを snappyhexmeshdict 内で記述し 特徴線のデータをメッシュ生成に利用 2017/5/21 6
system/surfacefeatureextract motorbike.obj { // How to obtain raw features (extractfromfile extractfromsurface) extractionmethod extractfromsurface; extractfromsurfacecoeffs { // Mark edges whose adjacent surface normals are at an angle less // than includedangle as features // - 0 : selects no edges } // - 180: selects all edges includedangle 150; 形状ファイル名を指定 ( 複数の場合は 並べて記述 ) subsetfeatures { // Keep nonmanifold edges (edges with >2 connected faces) nonmanifoldedges no; 面と面が作る角度が includedangle(deg.) 以下であれば その辺を特徴線とする } // Keep open edges (edges with 1 connected face) openedges yes; // Write options } // Write features to obj format for postprocessing writeobj yes; // ************************************************************************* // 2017/5/21 7
Tutorial: $FOAM_TUTORIALS/incompressible/simpleFoam/motorBike 3 blockmeshコマンドによるベースメッシュ生成 $ blockmesh 手動でベースメッシュを生成 2017/5/21 8
Tutorial: $FOAM_TUTORIALS/incompressible/simpleFoam/motorBike 4 snappyhexmeshコマンドの実行 system/snappyhexmeshdictで制御 内部的なステップ 1. castellatedmesh ベースメッシュの細分化 + 必要部分の切り出し 2. snap メッシュの形状へのスナップ 3. addlayers 境界層メッシュの生成 snappyhexmesh コマンド実行時に -overwrite オプションをつけない場合は これらの 3 つのステップでのメッシュの状態が 3 つの時間レベルのデータフォルダに個別にメッシュが保存されます 2017/5/21 9
Tutorial: $FOAM_TUTORIALS/incompressible/simpleFoam/motorBike $ snappyhexmesh かなり時間がかかる $ ls 0.orig 1 2 3 Allclean Allrun constant system $ parafoam & 各時間のメッシュを確認してみる ( バイクカウル部の垂直断面図 ) 1:castlletedMesh 2:snap 3:addLayers 2017/5/21 10
snappyhexmeshdict https://cfd.direct/openfoam/user-guide/snappyhexmesh/ に詳述 snappyhexmeshdict(300 行!) の構造を順に確認してみる 1 3 つのステップのスイッチ // Which of the steps to run castellatedmesh true; snap true; addlayers true; 2017/5/21 11
2 形状の記述 // Geometry. Definition of all surfaces. All surfaces are of class // searchablesurface. // Surfaces are used // - to specify refinement for any mesh cell intersecting it // - to specify refinement for any mesh cell inside/outside/near // - to 'snap' the mesh boundary to the surface geometry { }; motorbike.obj { type trisurfacemesh; name motorbike; } refinementbox { type searchablebox; min (-1.0-0.7 0.0); max ( 8.0 0.7 2.5); } obj や stl ファイルを記述し ここではその surface に motorbike というパッチ名をつける 特定の領域 (BOX や CYRINDER など ) でメッシュをリファインする領域も指定できる 2017/5/21 12
3 castellatedmesh/snap/addlyers の設定 // Settings for the castellatedmesh generation. castellatedmeshcontrols { ( 別紙で説明 ) } // Settings for the snapping. snapcontrols { ( 別紙で説明 ) } // Settings for the layer addition. addlayerscontrols { ( 別紙で説明 ) } 2017/5/21 13
4 MeshQualityControl の設定 meshqualitycontrols { #include "meshqualitydict" // Advanced } //- Number of error distribution iterations nsmoothscale 4; //- Amount to scale back displacement at error points errorreduction 0.75; // Include defaults parameters from master dictionary #includeetc "casedicts/meshqualitydict //- minfaceweight (0 -> 0.5) minfaceweight 0.02; OpenFOAM-4.x/etc/caseDicts/meshQualityDict ( システム共通 ) 2017/5/21 14
5 Advanced 部分の設定 ( 経験的にあまり弄ることはない ) // Advanced // Write flags writeflags ( scalarlevels layersets layerfields ); // write volscalarfield for layer coverage // Merge tolerance. Is fraction of overall bounding box of initial mesh. // Note: the write tolerance needs to be higher than this. mergetolerance 1e-6; 2017/5/21 15
shm の実行のまとめ $ blockmesh $ surfacefeatureextract $ snappyhexmesh 3 つの実行ステップごとに ステップで生成したメッシュが時刻ディレクトリに保存される 問題が無ければ 0 以外のディレクトリを削除して $ snappyhexmesh overwrite として 上書きでメッシュ生成を行う # すべてまっさらな状態から行うには $ foamcleanpolymesh メッシュのチェック $ checkmesh 2017/5/21 16
shm 関連のトピックス ( 後日追記予定 ) 2D メッシュの生成方法 stl,obj 形式について 2017/5/21 17
cfmesh(a library for polyhedral mesh generation ) Creative Fields(http://cfMesh.com) で開発中 商用版の cfmeshpro(1.4.1@2017.4) と無償版 cfmesh(1.1.2) の 2 つがある ( 機能的には当然 Pro 版が最新実装 ) 無償版 cfmesh は sourceforge でソースが公開 (GPL) https://sourceforge.net/p/cfmesh/code/ci/v1.1.2/tree/ shm と同様の機能を有するが コマンドツール群という位置づけ 2017/5/21 18
cfmesh の機能 八分木法によるメッシュ生成 (shmと似ている) stlや基本的形状から細分化領域を指定できる 自動境界適合メッシュ生成 テトラ ヘキサ ポリヘドラルメッシュ 境界層メッシュ生成 並列計算によるメッシュ生成 2017/5/21 19
download & install $ cd of-4.x ( ユーザーフォルダ ) $ git clone https://git.code.sf.net/p/cfmesh/code cfmesh-devel $ cd cfmesh-devel $./Allwmake (OF4.xの導入済みであること) インストール後の更新 $ cd cfmesh-devel $ git pull $./Allwmake 2017/5/21 20
cfmesh により導入されるコマンド (24 個 ) FLMAToSurface FMSToSurface FMSToVTK cartesian2dmesh cartesianmesh checksurfacemesh copysurfaceparts generateboundarylayers importsurfaceassubset improvemeshquality improvesymmetryplanes mergesurfacepatches meshtofpma pmesh patchestosubsets preparepar removesurfacefacets scalemesh scalesurfacemesh subsettopatch surfacefeatureedges surfacegenerateboundingbox surfacetofms tetmesh 2017/5/21 21
cfmesh に含まれる tutorial $ tree -L 2.. cartesian2dmesh hatoctree cartesianmesh asmooctree bunnyoctree elbow_90degree intakeportoctree multipleorifices sbendoctree sawoctree ship5415octree singleorifice pmesh bunnypoly multipleorifices tetmesh cutcubeoctree socketoctree 配布のものそのままでは エラーになるものもあるようです 2017/5/21 22
cfmesh によるメッシュ生成の流れ (cartesianmesh) 1 stl ファイルの準備 cfmesh は単独の stl ファイルが必要 ただし stl ファイルの中に パッチ毎の solid が含まれている状態 面毎に名前がついており パッチ名に対応する例 tutorials/cartesianmesh/sawoctree/sav1.stl 2017/5/21 23
stl ファイルの構造 solid パッチ名 solid patch000 facet normal 0.811072-0.468654 0.350037 outer loop vertex 4.76676 10.8144 51.1671 vertex 4.64955 10.8767 51.5221 vertex 4.59512 10.6202 51.3048 endloop endfacet endsolid patch000 solid patch001 facet... endsolid patch001 : 三角形 (facet) のデータ 2017/5/21 24
cfmesh によるメッシュ生成の流れ (cartesianmesh) 2 特徴線の抽出 (.fms ファイルの作成 ) shm と同様に特徴線を抽出し メッシュ生成に利用する ( 無くてもよい ) もとの形状データ + 特徴線データを 1 つのファイルに出力する 特徴線を含んだ形に変更するためには, 下記のコマンドを実行する ( 引数は入力ファイル名と出力ファイル名 ) $ surfacefeatureedges sav1.stl sav1withfeature.stl 出力ファイルの拡張子を fms にすることで,cfMesh のファイル形式で出力される (fms 形式のほうが精度が良い ) angle オプションをつけるべし $ surfacefeatureedges sav1.stl sav1withfeature.fms angle 0 2017/5/21 25
surfacefeatureedges all.stl all.fms surfacefeatureedges all.stl all.fms angle 0 2017/5/21 26
cfmesh によるメッシュ生成の流れ (cartesianmesh) 3 cartesianmesh の実行 system/meshdict を設定 特徴線を含んだ形に変更するためには, 下記のコマンドを実行する ( 引数は入力ファイル名と出力ファイル名 ) $ surfacefeatureedges sav1.stl sav1feature.stl 出力ファイルの拡張子を fms にすることで,cfMesh のファイル形式で出力される (fms 形式のほうが精度が良い ) angle オプションをつけるべし $ surfacefeatureedges sav1.stl sav1feature.fms angle 0 2017/5/21 27
system/meshdict 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; 別紙で説明 2017/5/21 28
cfmesh 利用時の注意点 cfmesh の ベースメッシュ は セルサイズを指定することで x-y-z 方向に直交格子が作られる このため 対称性を考えた周期境界などを考えたい場合は 問題よっては 完全に対称性を加味できない場合がある この場合は ベースメッシュを blockmesh で作成する shm のほうが有利な時がある 2017/5/21 29
以上で snappyhexmesh/cfmesh に関するハンズオンセミナーは終了です お疲れ様でした! 2017/5/21 30