CAE

【OpenFOAM】snappyHexMesh によるメッシュ再分割の検討

こんにちは(@t_kun_kamakiri

OpenFOAMで流体解析をする際のメッシャーであるsnappyHexMeshを使ったメッシュ再分割について自身の理解を深めるためにまとめました。
特に形状が複雑である場合にデフォルトの設定でメッシュ生成を行うと、形状変化が激しい部分でメッシュが作れていなかった、メッシュが潰れてガタガタになったりします。

本記事では特にこのような形状の場合を考えます。
※形状に特に意味はありません。

太い円筒では粗いメッシュとし、細い円筒では細かいメッシュにしたいという場合を考えます。blockMeshやsnappyHexMeshは少し触ってみたけど、これからメッシュ再分割について検討していきたい方を対象としています。

このような方が対象
  1. blockMeshやsnappyHexMeshを使ったことがある方
  2. OpenFOAMのメッシュ再分割を行いたい方

FreeCAD:0.20
OpenFOAM ESI版:v2012

本記事のモデルはこちらから入手可能です。

snappyHexMeshの使い方

snappyHexMeshの使い方に関しては以下の資料を参考にしてください。

モデルの作成はXsim

基本的な設定はXsimを使って行いました。
XsimはGUI上で簡単にOpenFOAMの設定が行えるWebアプリです。設定のひな形を作る際にはよく利用させてもらっています。
注意としてはXsimがFoundationのOpenFOAMでの出力を前提としているためESI版のOpenFOAMを使う方はAllrunのスクリプトを実行してもエラーとなります。特に特徴線を抽出するファイルで、

  • Foundation版:surfaceFeaturesDict
  • ESI版:surfaceFeatureExtractDict

と、まずファイル名が違いますし、中身の記述も異なります。

そういった違いを認識していればXsimは強力なツールとなります。

blockMeshでのメッシュが粗い場合

では、まずblockMeshでのベースメッシュが粗い場合にどうなるかを見ていきます。

system/blockMeshDict

メッシュの分割数は以下で設定しています。

x方向のBoxサイズ100mmに対して15分割なので、ひとセルの一辺が6mm程度ということになります。

細い円筒の半径が5mmなので、メッシュのセルが1つ入るかどうかという際どいところです。よって、下の絵のようにメッシュを切ることができず、大きい円筒のみメッシュ作成されてしまい、中途半端なメッシュができています。

形状の変化をとらえるのであれば最低4点は必要なので、今よりさらに4分割は必要でしょう。

ちなみに、snappyHexMeshでの設定はどうなっているかというと・・・・

system/snappyHexMeshDict

メッシュの再分割などは行っていません。

現状では形状通りにメッシュ作成を行っておらず、改善が必要です。

改善方法は以下の通りです。

  1. blockMeshの分割数を上げる
  2. snappyHexMeshで再分割を行う
    特徴線まわりの再分割
    特定領域の再分割
    面全体で再分割
    特定の面で再分割

上記の考えをファイルの設定に反映させてどのようになるのかを見ていきます。

blockMeshの分割数を上げる

まずはblockMeshでの分割数を1つ上げてみます。
細い円筒の半径5mmなので最低でも5mmのメッシュサイズにする必要だろうという考えです(9mmでも良いかもしれませんが・・・)。
これでようやくギリギリメッシュが作成できるサイズです。

system/blockMeshDict(抜粋)

上記のように分割数を増やしメッシュのセルの1辺が5mmくらいになるようにします。

こちらの変更により形状通りにメッシュ作成ができるようになりました。
しかし、細い円筒部分のメッシュサイズが大きので円筒形状というより円柱の形状になっています。

まだまだ分割数が足りていません。やはり、形状の再現にはもうひと分割以上が必要ということで以下のように分割数を増やしていきます。

blockMeshでの分割数が80×80×206 = 1664000(160万)ともなるとさすがに手元のPCでもちょっと時間がかかる印象です。数分程度ですが・・・

全体のベースメッシュのサイズを細かくすることは不必要にメッシュ数を増やすことになるので、もし実務で大きいサイズのモデルを扱った場合にメッシュ生成に膨大な時間がかかることが予想されます。

全体のベースメッシュのサイズを変えずに、形状変化が大きい部分(太い円筒)は粗く、形状変化が小さい部分(細い円筒)は細かくするようにしたいですね。

snappyHexMeshで再分割を行う

snappyHexMeshでメッシュ再分割を行います。
再分割の方法は主に以下の設定があります。

  • 特徴線まわりの再分割
  • 特定領域の再分割
  • 面全体で再分割
  • 特定の面で再分割

特徴線まわりのメッシュ再分割

特徴線まわりでメッシュ再分割する場合は以下の部分で設定します。

system/snappyHexMeshDict(抜粋)

これは特徴線のまわりでメッシュの再分割を行う設定です。
特徴線は以下のようになっています。特徴線は「system/surfaceFeatureExtractDict」で.eMeshファイルを作成します。

system/surfaceFeatureExtractDict

ParaViewでは.eMeshファイルは直接読み込むことができないので.objファイルに変換する必要があります。
変換のコマンドは以下です。

※model_m.eMeshは今回の「model_m.stl」のファイル名に対応していますので、使っているstlファイルの名前に合わせて変更してください。

特徴線まわりでメッシュ再分割を行うと以下のような変化になります。
左が元の設定、右が特徴線まわりで再分割した場合です。

さらに再分割します。

太い円筒と細い円筒での繋ぎ目には特徴線があるためメッシュの再分割がされていますが、細い円筒に沿って特徴線があるわけではないので、細い円筒の真ん中あたりはメッシュが粗いままです。

特定領域の再分割

形状に合わせてというわけではなく、指定した領域のメッシュの再分割の設定を行います。

system/snappyHexMeshDict(抜粋)

geometryの中で「type searchableBox;」により最小と最大の座標を設定して再分割する直方体領域を設定します。

refinementRegionsで再分割するレベルを設定します。

これにより指定した領域のメッシュ再分割ができました。
しかし、形状が複雑になってくると細かくしたい領域が複数でてきて、全てに上記の設定をするのはとても面倒なので、何とか指定した面に対して再分割を行うようにしたいものです

面全体で再分割(1)

特定の面全体で再分割を行います。
CADソフトで形状を作成してstlファイルにするとソリッドに面が生成されて出力されます。面の再分割の簡単な設定としてはstlで生成された面全体に対してメッシュの再分割を行うことです。

system/snappyHexMeshDict(抜粋)

geometryでmodel_m.stlの全体の表面の名前を「name test;」でtestと名前を付けています。その面を「refinementSurfaces」で分割するという設定です。

表面全体が再分割されているので全体のメッシュが細かくなっているように見えますが、断面を見るとメッシュの表面だけ(nameで名前を付けた部分だけ)が再分割されています。

特定の面で再分割(2)

面で再分割(1)ではメッシュの表面全体の再分割でしたが、これも無駄にメッシュ数を多くする可能性があるので、特定の面だけを再分割したいですね。

今は以下のように面に名前がついています。

今回はwallsという面で再分割を行います。

system/snappyHexMeshDict(抜粋)

wallsという面でメッシュ再分割が行われています。
ちなみにstlファイルで面に名前を付けたとしてもgeometryのregionsで面に名前を定義しない場合は、左のようにgeometryで面に名前を付けた「test」にアンダーバーを付けて「test_walls」などという名前に付け変わります。
ここに注意しないと境界層を入れようとした際に面の名前が変わっているので、境界層が生成されずにハマります・・・

右のようにgeometryのregionsで面に名前を定義していれば、面の名前は「walls」のままです。

特定の面で再分割(2)–さらに面を分割

先ほどは太い円筒も細い円筒もwallsという面の名前でしたが、さらに面分割を行います。
具体的にはFreeCADで以下のようにwallsをさらに面分割してstlとして出力しなおします。

面分割のマクロは以下の記事に書いているように、自動化しているためそれほど手間な作業ではありません。

少し余談ですが、FreeCADでmmと書いていても出力された際には数値しか拾ってきていないの解析でm単位で行う場合に1000倍大きな形状で解析を行ってしまいます。

なので、以下のようなコマンドで1/1000倍に変換しておく必要があります。

今回は「thin_wall」(細い円筒)だけメッシュの再分割を行います。

system/snappyHexMeshDict(抜粋)

右のようにgeometryのregionsで面に名前を定義していれば、面の名前は「thin_wall」のままですね。

境界層を入れる

壁側は流れが0になり壁から少し離れると流速が壁と平行になっているため、メッシュを層にして入れると精度よく解析が行えるため境界層メッシュを入れる場合があります。

system/snappyHexMeshDict(抜粋)

addLayersControlsで「walls」という面に3層の境界層を入れるようにしています。

右で境界層がきれいに入っているのが確認できます。

しかし、snappyHexMeshはメッシュの再分割と境界層の相性がわるいのか端でメッシュが潰れてしまって上手く境界層が入らない場合があります。

このあたりの設定は追々検証して別途記事にしたいと思います。

snappyHexMeshDictファイルの全体

最終的なsnappyHexMeshDictの設定を載せておきますので、記事内のどの部分を触っているのか確認してみてください。

system/snappyHexMeshDict

ちなみにメッシュ品質は

により確認ができます。

以下の部分は最低確認するようにしましょう。

  • Max aspect ratio:アスペクト比(縦横の比率)→境界層で大きくなりやすいので大きすぎる場合は確認
  • non-orthogonality:直交性→70°以上であれば修正
  • Max skewness:歪度→4以上だと修正

メッシュ品質の基準は以下のファイルにも記載がありますで確認してみましょう。
$WM_PROJECT_DIR/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/

コマンドでファイルを探す場合は、

find $FOAM_SRC -name “primitiveMeshCheck*”

/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
と出てくるので、

vi /opt/OpenFOAM/OpenFOAM-v2012/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C
で確認します。

該当箇所は
/closedThreshold_
と打って「n(下へ)」「shift + n(上へ)」で探すことができます。

viを終了するには
ESCボタンを押して「:q」か「:q!」で終了することができます。

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;

シミュレーションを行う場合、低品質なセルや面によって生じる数値誤差を低減できる数値スキームを選択します。
もう少しメッシュは綺麗にすることができますが(そんなときもある・・・)、細かなこだわりはこの辺までにしておきます。再分割として本記事で紹介した方法があるというのを知っているとsnappyHexMeshでの設定で迷うことはないと思います。

まとめ

メッシュの再分割の色々な設定を見てきました。

  1. blockMeshの分割数を上げる
  2. snappyHexMeshで再分割を行う
    特徴線まわりの再分割
    特定領域の再分割
    面全体で再分割
    特定の面で再分割

特徴線まわりのメッシュ再分割と境界層を入れると、やはり境界層が上手くできません。

snappyHexMeshに関してはメッシュの分割と境界層との相性が良くないのかもしれません。

OpenFOAMのメッシュ作成としてはcfMeshもあるので別の記事で紹介します_(._.)_

cfmeshはテトラメッシュやポリヘドラルメッシュも可能でsnappyHexMeshより設定がずいぶんと簡単でした。

参考書

FreeCADは以下の書籍で勉強ができます。

基礎からのFreeCAD [三訂版] (I/O BOOKS)

基礎からのFreeCAD [三訂版] (I/O BOOKS)

坪田 遥
2,640円(12/09 04:47時点)
Amazonの情報を掲載しています

OpenFOAMの数少ない日本語の書籍としては以下のものがあります。

改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))

改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))

川畑 真一
2,640円(12/08 23:47時点)
発売日: 2022/04/15
Amazonの情報を掲載しています
OpenFOAMによる熱移動と流れの数値解析(第2版)

OpenFOAMによる熱移動と流れの数値解析(第2版)

3,520円(12/08 23:45時点)
Amazonの情報を掲載しています
OpenFOAMライブラリリファレンス

OpenFOAMライブラリリファレンス

株式会社テラバイト, 人見 大輔
16,500円(12/08 23:47時点)
Amazonの情報を掲載しています

バージョンが古いですがOpenFOAMのプログラミング(C++)を学ぶには以下の書籍がわかりやすいです。

OpenFOAMプログラミング

OpenFOAMプログラミング

Mari´c,Tomislav, H¨opken,Jens, Mooney,Kyle
8,250円(12/08 17:25時点)
Amazonの情報を掲載しています

【プロフィール】

カマキリ
(^^)

大学の専攻は物性理論で、Fortranを使って数値計算をしていました。
CAEを用いた流体解析は興味がありOpenFOAMを使って勉強しています。

プロフィール記事はこちら

 

大学学部レベルの物理の解説をします 大学初学者で物理にお困りの方にわかりやすく解説します。

このブログでは主に大学以上の物理を勉強して記事にわかりやすくまとめていきます。

  • ・解析力学
  • ・流体力学
  • ・熱力学
  • ・量子統計
  • ・CAE解析(流体解析)
  • note
    noteで内容は主に「プログラミング言語」の勉強の進捗を日々書いています。また、「現在勉強中の内容」「日々思ったこと」も日記代わりに書き記しています。
  • youtube
    youtubeではオープンソースの流体解析、構造解析、1DCAEの操作方法などを動画にしています。
    (音声はありません_(._.)_)
  • Qiita
    Qiitaではプログラミング言語の基本的な内容をまとめています。
関連記事もどうぞ

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です