*[[SnappyHexMesh]] [#d5674751] [[OpenFOAM:http://www.openfoam.org]]でメッシュを作成するツールの1つであるSnappyHexMeshについて説明します。 -3次元の(多面体要素からなる)ヘキサ-ドミナントメッシュを自動生成します。 -形状の特徴線を保存します。 -境界層を入れることができます。 -並列化されており、高速にメッシュを作成することが可能です。 ** 表面メッシュ [#lae95520] 形状データは三角形の表面メッシュ(STL, Nastran, OBJなど)です。constant/triSurfaceで設定します。 #ref(triSurface.png,center,nowrap,60%,triSurface); ** 初期メッシュ [#x7be5e08] blockMeshなどで、オクトツリーの根になる初期メッシュ(6面体)を作成します。 #ref(initial_mesh.png,center,nowrap,60%,initial_mesh); ** オクトツリーによる細分 [#e6ca1dce] -表面形状による細分(特徴性、曲率) -体積形状による細分(閉じた空間、幾何形状) を指定して、初期メッシュを細分します。 表面形状、体積形状の指定はsystem/snappyHexMeshDictのgeometryで行います。 #code(c){{ geometry { motorBike.obj { type triSurfaceMesh; name motorBike; } refinementBox { type searchableBox; min (-1.0 -0.7 0.0); max ( 8.0 0.7 2.5); } }; }} このgeometryで指定した表面メッシュは以下のために使用されます: - 表面メッシュと交差するセルを特定し、細分化する - 表面メッシュの内側/外側/近傍にあるセルを特定し、細分化する - 表面メッシュ上に境界メッシュをスナップする 下図は、refinementBoxによる細分化の例です。 #ref(refinement.png,center,nowrap,60%,refinement); また、細分化に使用するパラメータは、system/snappyHexMeshDictのcastellatedMeshControlsに記述します。 #code(c){{ castellatedMeshControls { // Refinement parameters // ~~~~~~~~~~~~~~~~~~~~~ maxLocalCells 100000; maxGlobalCells 2000000; minRefinementCells 10; maxLoadUnbalance 0.10; nCellsBetweenLevels 3; // Explicit feature edge refinement // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ features ( { file "motorBike.eMesh"; level 6; } ); // Surface based refinement // ~~~~~~~~~~~~~~~~~~~~~~~~ refinementSurfaces { motorBike { // Surface-wise min and max refinement level level (5 6); // Optional specification of patch type (default is wall). No // constraint types (cyclic, symmetry) etc. are allowed. patchInfo { type wall; inGroups (motorBikeGroup); } } } resolveFeatureAngle 30; // Region-wise refinement // ~~~~~~~~~~~~~~~~~~~~~~ refinementRegions { refinementBox { mode inside; levels ((1E15 4)); } } // Mesh selection // ~~~~~~~~~~~~~~ locationInMesh (3.0001 3.0001 0.43); allowFreeStandingZoneFaces true; } }} refinementSurfacesの level (5 6); levelは細分化のレベルを(最小レベル, 最大レベル)で指定します。 -最小レベル:面と交差するセルはこのレベルまで細分割します -最大レベル:セルは特徴線を解像する角度になるように、このレベルまで再分割します。 ** 使用しない領域のメッシュを削除 [#w187030d] keep pointで、残す領域を指定して、計算領域以外のボリュームメッシュを削除します。 #ref(removeUnusedCells.png,center,nowrap,60%,removeUnusedCells); #ref(castellatedMesh.png,center,nowrap,60%,castellatedMesh); ** スナッピング [#ud3f77ac] スナッピングではpatch面を表面形状上に射影します。 #ref(snappying.png,center,nowrap,60%,snappying); #ref(snnapedMesh.png,center,nowrap,60%,snnapedMesh); スナッピングの設定は、system/snappyHexMeshDictのsnapControlsで行います。 #code(c){{ snapControls { nSmoothPatch 3; tolerance 1.0; nSolveIter 300; nRelaxIter 5; nFeatureSnapIter 10; } }} nSmoothPatch 3; 面上に射影する前に、パッチ点をスムージングする回数 toleracne 1.0; 面に近づけるための最大辺長の倍率 nSolverIter 300; スナッピングした変形場に適用するスムージングの回数 nRelaxIter 5; 誤差を減らすための倍率を戻す再の繰り返し数 nFeatureSnapIter 10; 特徴線上にスナッピングするときの繰り返し数 nGrow 1; 押し出さない境界上の節点がある場合、その節点を使用する表面セルに含まれる節点も押し出さないようにする。 nGrowを大きくすると押し出さない節点が表面セルを介して増大する。 ** 境界層 [#p546c358] 境界層入れる手順は以下の通りです。 + 面に垂直な方向に、指定した厚さだけメッシュを縮めます。 + 内部メッシュにスムージングをかけます。 + メッシュが正当性基準を満たしているかチェックします。満たしていない場合は、縮める距離を減らし、2番に戻ります。どのように縮めても、基準を満たさない場合は、境界層を入れるのを断念します。 + メッシュが基準を満たす場合は、境界層を入れます。 + 最後にメッシュをチェックします。チェックに失敗した場合は、境界層を取り除き、2番に戻ります。 境界層の設定は、system/snappyHexMeshDictのaddLayersControlsで行います。 nLayerIter 境界層を追加するための最大繰り返し数