OpenFOAM

【OpenFOAM】snappyHexMeshを使ったメッシュ境界層がうまくいかない

こんにちは(@t_kun_kamakiri

OpenFOAMで流体解析をする際のメッシャーであるsnappyHexMeshを使ったメッシュ境界層の検討した内容について自身の理解を深めるためにまとめました。

特に形状が複雑である場合にデフォルトの設定でメッシュ生成を行うと、形状変化が激しい部分でメッシュが作れていなかった、メッシュが潰れてガタガタになったりします。
その中でも特に境界層メッシュがうまく作れないという問題に直面しました。

カマキリ

snappyHexMeshで境界層をいい感じに入れたいけどどうしたらいいのか?

snappyHexMeshの理解も少しずつ進んでおり、snappyHexMeshでのメッシュ再分割については前回の記事で書きました。

詳細の設定は公式サイトをご参考ください。

snappyHexMeshでの境界層設定について考えるため、本記事ではこのような形状の場合を考えます。
※形状に特に意味はありません。

後ほど面でのメッシュ再分割をしたいので、FreeCADで面に名前を付けておきました。

FreeCADを使ったモデル作成は動画を用意しましたので、再現したい方はこちらをどうぞ。

面に名前を付けた際にstlを掃き出す便利なマクロは以下の記事をご参考ください。

※動画内では本記事の面の名前の付け方と異なります。

ParaViewを起動してみましょう。

単純な形状ですが太い円柱と細い円柱など、強弱があるためメッシュ再分割境界層をどのように入れるかが肝になりそうです。

本記事の内容
  • snappyHexMeshでの境界層メッシュの設定方法
  • 境界層が上手くいかない場合の対処方法

OpenFOAM-v2012

結局cfMeshを使った方がきれいに境界層が入ったためcfMeshの利用を検討しています。

【事前準備】チュートリアルからケースファイルをコピー

snappyHexMeshを使っている適当なチュートリアルをコピーしてきます。

ファイル構成は以下のようになっています。

FreeCADで作成したモデルは数字だけしか意味を持たないため、解析で使用するの単位系がSI単位系(m-kg-sec)ならば、m(メートル)寸法になってしまいます。
これをmm(ミリメートル)に変換するために以下のコマンドを実行します。

このようにするとmodel_m.stlファイルがmm(ミリメートル)単位で扱われます。
以後、model_m.stlを使って行きます。

そして、model_m.stlをconstantフォルダにtriSurfaceがあるのでそちらにコピーします。

特徴線を抽出します。

特徴線をParaViewで確認したい場合はobj形式に変換することで読み込みが可能となります。

ベースメッシュ作成

snappyHexMeshはベースとなるメッシュを事前に生成しておく必要があります。OpenFOAMではblockMeshでベースメッシュ生成することが多く、system/blockMeshDict内に設定を書きます。

system/blockMeshDict

以下のコマンドでベースメッシュを作ります。

できたメッシュをParaViewで確認するとメッシュのサイズ感を確認できます。
今回はセルサイズが2.5mmとなるようにしています。

Case1:snappyHexMeshの設定

コピーしてきたチュートリアルから今回のモデルでも対応してメッシュ生成できるように修正しました。

system/snappyHexMeshDict

長いですが基本的な構成は以下のようになっています。

 

以下のコマンドでメッシュ生成を行います。

メッシュは2.5mmなのでΦ10の径に対してはギリギリ4点のセルが入れることができます。形状としてはガタガタです。

snappyHexMeshには指定した面のメッシュを再分割することができるため、後ほど修正します。それよりも、Φ40×500の太い円柱の端で境界層が上手く入っていないことの方が気になりますね。

Case2:境界層のサイズを指定する

addLayersControlsが境界層を設定する部分です。
relativeSizesはtureにしているとベースメッシュの大きさに対する割合となり、falseならminThicknessとfinalLayerThicknessの値は境界層の厚みの絶対値となります。

relativeSizesはtureにしているため、ベースメッシュの変化が大きい場合は境界層の割合によってメッシュサイズが変わってしまうため、上手くつなぐことができずにいるのかなと思います。

以下のように変えてみるとどうでしょうか。

  • relativeSizes false;
  • finalLayerThickness 0.001;
  • minThickness 0.001;

Φ40の端での境界層は相変わらず潰れています。
relativeSizesはfalseでの境界層の厚みの絶対値を指定する方法は思わぬところで失敗する可能性を含みます。
例えば、今回のような細い円柱の径がΦ10なので境界層の設定次第ではメッシュがうまく作れない場合があります。

  • finalLayerThickness 0.0025;
  • minThickness 0.0025;

全体の境界層厚みの絶対値を指定するのは形状をすべて把握している必要があります。設定忘れでメッシュが作れていなかったりと困難な場合が多いので、やはりベースメッシュの割合で境界層厚みを判断してくれる「relativeSizes true;」で進めようと思います。

Case3:featureAngleの変更

コーナー付近で境界層が崩れるのを防ぐために、境界層パラメータとしてfeatureAngleがあります。featureAngle値を大きくすることで端での境界層の崩れを防ぐことができます。
relativeSizesはtrueにしてベースメッシュに対する境界層設定の割合に戻しておきます。

  • featureAngle130;
  • relativeSizestrue;
  • finalLayerThickness0.3;
  • minThickness0.1;

Case4:特徴線で再分割する

境界の端でもう少し細かいメッシュサイズになっていれば良いのかと思って、特徴線を再分割してみます。

Φ40の方はメッシュサイズが細かくなったので何となく境界層が上手くいっているようにごまかされているですが、Φ10の細い円柱では境界層が両端で潰れてしまっています。
やはり境界層とメッシュの再分割は相性が良くないのかもしれません。

Case5:Φ10の細い円柱のメッシュ再分割

特徴線を使わずにΦ10の細い円柱のメッシュ再分割レベルを1にします。
こうすることでベースのメッシュより1段階細かいメッシュになります。

Case6:境界層は円柱の側面だけにする

円柱の端と円の面で境界を作ろう無理やりメッシュを変形させるから潰れてしまうのではないかと思い、境界層は円柱の側面だけにしました。

きれいに表面が入っているように見えますが、Φ10の細い円柱からΦ40の2つに分かれるつなぎ目でメッシュが潰れています。特に、Φ40の円柱からΦ10の円柱へのつなぎ目の面に境界層が無いので、流体流れの再現性が悪かったり、直交性が悪いと疑似的な数値拡散が起こり良くありません。

しかも境界条件でメッシュが層にならない可能性もあります。
やはり、再分割が行われている部分では2つの境界層のつなぎ目でメッシュが潰れてしまうようです。

最終的なsnappyHexMeshの設定

境界層がうまく入らない部分がありますが、境界面の全てに境界層を入れる設定にしました。

system/snappyHexMesh

ちなみにメッシュ品質は

により確認ができます。

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

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

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

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

以下のように出力されます。

primitiveMeshCheck.Cの中身を確認しましょう。

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

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

シミュレーションを行う場合、低品質なセルや面によって生じる数値誤差を低減できる数値スキームを選択します。

おまけ:OpenFOAM9(Foundation版)

OpenFOAM9(Foundation版)でも試しましたが「featureAngle 60;」でも、境界層は以下のようにESI版よりきれいな気がします。しかし、これ以上いまいちきれいになりませんでした。

featureAngle 60;


featureAngle 130;

まとめ

結局snappyHexMeshでは境界層がうまくできませんでした。
しかし、OpenFOAMのメッシュ作成としてはcfMeshもあるので検討を始めています。

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

cfMeshでの結果

これらsnappyHexMeshで作成したメッシュとcfMeshで作成したメッシュでどちらの方がメッシュ生成の時間が早いか、妥当性のある結果を示すかが気になるところですね。

次回はinlet部分に流速を与えて定常解析により流速分布を比較します。
φ40の円柱部分は長さ500mmと比較的長くとっているため、粘性係数と流速を調整しレイノルズ数による流れの分布を文献値(理論値)と比較することができます。

参考書

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

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

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

坪田 遥
3,950円(12/06 15:12時点)
Amazonの情報を掲載しています

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

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

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

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

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

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

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

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

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

OpenFOAMプログラミング

OpenFOAMプログラミング

Mari´c,Tomislav, H¨opken,Jens, Mooney,Kyle
8,250円(12/06 16:36時点)
Amazonの情報を掲載しています
関連記事もどうぞ

COMMENT

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