snappyHexMeshと同様のメッシュ生成ソフトウェアであるcfMesh(by Creative Fields Ltd.)が1.0.1にバージョンアップされたので使ってみる。
もともと、cfSuiteというOF用統合GUIソフトウェアのメッシュ生成部分をオープンソースとして公開しているものらしい。
機能的には、cartesianMesh(2D/3D)、tetMesh(3D)で、featureEdgeや境界層メッシュなどはSHMよりも精度が良いらしい。OpenMP並列計算にも対応とのこと。
以下、User's Guideを流し読みして、まとめて見た。
ダウンロードおよびインストール
$ wget http://sourceforge.net/projects/cfmesh/files/latest/download -O cfMesh-v1.0.1.tgz
$ tar zxvf cfMesh-v1.0.1.tgz
$ cd cfMesh-v1.0.1
$ ls
Allwclean README meshLibrary tutorials utilities
Allwmake executables python userGuideOF23P
OF23 (OFのビルド・実行環境になって(@CentOS6.6))
./Allwmake
: (snip)
$ which cartesianMesh
~/OpenFOAM/USER/platforms/linux64GccDPOpt/bin/cartesianMesh
⇒ cartesianMesh/cartesian2DMesh/tetMeshの3つのメッシュ生成コマンドおよびライブラリ、ユーティリティコマンド(17+2(SALOMEデータ処理用pythonスクリプト))が上記のパスにインストールされる。cfMesh Utilities:
copySurfaceParts
extrudeEdgesInto2DSurface
FLMAToSurface
FMSToSurface
FMSToVTK
FPMAToMesh
importSurfaceAsSubset
improveSymmetryPlanes
mergeSurfacePatches
meshToFPMAposition
patchesToSubsets
preparePar
removeSurfaceFacets
subsetToPatch
surfaceFeatureEdges
surfaceGenerateBoundingBox
surfaceToFMS
Python utilities (for SALOME data):
extractFeatureEdges.py
salomeTriSurf.py
使い方
cfMeshは、サーフェスメッシュ(triangle mesh)のデータ(.fms, .ftr, .stl)を必要とする。これらはOF付属のsurfaceConvertコマンドで他のジオメトリのファイル形式からインポートも出来るとのことだが、パッチの区別をつけたい場合には、上記3つの形式に落とし込む必要がある。お勧めは、fmsフォーマットらしい。
さらにOFケースフォルダのsystemの中に、meshDictを作成する(snappyHexMeshDictと同様)。並列でメッシュ生成を行いたい場合は、decomposeParDictも必要(numberOfSubdomainsのみ利用する)。
以上をまとめると
- fms/ftr/stlファイル形式のサーフェスメッシュを用意(2Dの場合は、リボン状かつx-y平面でつくる)
- meshDictを用意
- meshコマンド実行(cartesian(2D)Mesh/tetmesh)
※ fms形式の中身は、User'sGuideにも掲載されているが、blockMeshDictっぽい感じで、OFに慣れている人は違和感はないと思われる。
※ 2Dメッシュは、三角メッシュをリボン上に生成させることと、x-y平面に生成させることが必要。
meshDictの設定構成
(必須)
- surfaceFile: ジオメトリファイルを指定
- maxCellSize: デフォルトのセルサイズ[m]もしくは最大のセルサイズ[m]
(メッシュRefinement関係)
- boundaryCellSize: 境界部分のメッシュサイズ[m]
- boundaryCellSizeRefinementThickness: 境界Rifinementを行う厚さ[m]
- minCellSize: 境界Refinementの最小メッシュサイズ[m]
- localRefinementブロック: パッチ名を指定して局所的なRefineを実施
- addtionalRefinementLevels: さらにどれくらいのRefineを施すかレベルを指定
- refinementThickness: localRefineするパッチからの層厚[m]
- objectRefinementsブロック: 基本的な領域形状(cone/box/sphere/line)をメッシュ内に指定してRefineする
- surfaceMeshRfinementブロック: サーフェスの特定領域を指定してRefineを実施
(メッシュKeeping/Removing関係)
- keepCellsIntersectingBoundary: 境界を横切るcellをキープするかどうか(1or0(default))
- removeGluedMesh(checkForGluedMesh): keepCellsIntersectingBoundary=1としたときにメッシュをくっ付けた状態にするかどうか
- keepCellsIntersectingPatchesブロック: keepCellsIntersectingBoundaryの効果を特定パッチ面に対して実施する機能
- removeCellsIntersectingPatchesブロック: keepCellsIntersectingBoundaryの効果とは逆に、特定パッチ面に対してremoveCellを実施する機能
(境界層関係)
- boundaryLayersブロック:指定したパッチ面のメッシュを押し出してboundary meshを生成する
- nLayers: レイヤー数
- thicknessRatio: レイヤーの厚さ変化の倍率
- maxFirstLayerThickness: 第1層の最大厚さ[m]
- patchBoundaryLayers: パッチ名を指定して、さらに個別にレイヤー数などを指定
- allowDiscontinuity: 他のBLの層数や厚さ変化に対して不連続(discontinuity)を許可するかどうか
(パッチのrename関係)
- renameBoundaryブロック: 複数のパッチ面をまとめて新たなパッチ面を作成・名前変更したり、typeを変えたりする場合(もとのジオメトリデータを編集しなくて良い)
- defaultName: とくに明示しない場合のデフォルトパッチ名
- defaultType: とくに明示しない場合のデフォルトパッチタイプ
- newPatchNames: パッチ名を指定し(正規表現可)、newName、typeを新たに指定
(ジオメトリの形状制限を強制するかどうか)
enforceGeometryConstraints: 1にしておくとジオメトリの特徴に合わせてメッシュ生成が出来ない場合に、ジオメトリデータの修正すべきポイントデータを出力して、メッシュ生成をストップする(1or0で指定)
※ 全体的に、SHMDictより項目数も少なくて分かりやすい。
※ ツールばっかり使い方の勉強をしていないで、研究しよう。