OpenFOAMメッシュ生成
理論:メッシュ生成の道具と壁の扱い
概要
OpenFOAMにはGUIのメッシャーがありません。どうやってメッシュを作るのですか?
テキストの設定ファイルで指示して作る。基本はblockMeshで、頂点の座標とブロック(六面体)の分割数、格子の伸び率(grading)をsystem/blockMeshDictに書くと、構造格子ができる。複雑な形状では、blockMeshで箱型の背景格子を作り、snappyHexMeshにSTLの表面形状を渡して、(1) 表面や指定領域でセルを細かく分割(castellatedMesh)、(2) セルの節点を表面に合わせて動かす(snap)、(3) 壁に薄いセルの層を押し出す(addLayers)、の3段階で仕上げる。外部のメッシャーで作ったメッシュを変換して使うこともできる。どの方法でも最後にcheckMeshで、セルのゆがみ(非直交性・スキューネス)や負の体積がないかを確かめる。
格子比・第1セル・y+
r はblockMeshのsimpleGradingで与える最後と最初のセルの比、N はセル数、h は壁から中心までの長さ、Δy₁ は第1セルの厚さ、u_τ は摩擦速度、C_f は流路の摩擦係数(Deanの式)、ν は動粘度。y+ は第1セル中心の値。
六面体へのこだわり
snappyHexMeshの名前のとおり、OpenFOAMのメッシュ生成は六面体を中心に作られている。OpenFOAMは任意の多面体セルを扱える有限体積法だが、六面体は同じ精度に必要なセル数が少なく、流れの方向にそろえると数値拡散も小さい。snappyHexMeshは「六面体の背景格子を削って形に合わせる」という方法で、複雑な形でもほとんどを六面体のまま保つ。形に沿う部分だけが多面体になり、その品質がメッシュ全体の品質を決めることが多い。
計算例
空気のν = 1.5×10⁻⁵ m²/s、Dean式のReは全流路高さ50 mmで定義(この例では水力直径ではない)。r = 1ではΔy₁ = h/N。y+の判定は壁関数の種類によって異なり、全y+対応の壁処理まで「不適」と断定しない。版によって後処理コマンドも異なる。
例1:高さ50 mmの流路、空気10 m/s(半分の高さを40セル)
レイノルズ数33,333、摩擦係数0.0054、摩擦速度0.52 m/s、粘性の長さ ν/u_τ は約29 µm。
| 格子比 r | 第1セル | y+ | 中心のセル | 判定 |
|---|---|---|---|---|
| 1 | 625 µm | 10.8 | 0.62 mm | 緩衝層:どちらにも不適 |
| 10 | 158 µm | 2.7 | 1.58 mm | やや粗い |
| 40 | 58 µm | 1.0 | 2.3 mm | 壁面まで解く場合に適 |
| 200 | 16 µm | 0.28 | 3.19 mm | 細かすぎ・中心が粗い |
壁関数を使う場合は y+ ≈ 30 が目安で、第1セルは約1.7 mm、半分の高さを等分なら約14セルになる。
40セルの等分割は細かくて安全そうに見えます。なぜ「どちらにも不適」なのですか?
y+ ≈ 11 は、壁の近くで粘性が支配する層(y+ < 5)と、対数則が成り立つ層(y+ > 30)の間の緩衝層にあたるからだ。壁関数は第1セルが対数則の層にあることを前提に壁のせん断応力を決めるので、緩衝層に置くと摩擦や熱伝達を誤る。一方、壁面まで解く低レイノルズ数型のモデルには、第1セルが y+ ≈ 1 以下にあって粘性の層を数セルで解像することが必要で、y+ ≈ 11 では粗すぎる。OpenFOAMのkOmegaSSTは、nutUSpaldingWallFunctionのように y+ の全域で使える壁の扱いと組み合わせられるが、それでも緩衝層が最も誤差が大きい。計算後に yPlus ユーティリティ(postProcess -func yPlus)で壁の y+ の分布を出し、狙った範囲にあるかを必ず確かめよう。
例2:snappyHexMeshの細分化レベルと境界層(背景格子8 mm)
| レベル | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| セル寸法 | 8 mm | 4 mm | 2 mm | 1 mm | 0.5 mm |
レベル3(1 mm)の壁に、5層・expansionRatio 1.2・finalLayerThickness 0.5(相対値)で層を追加すると、外側から0.50・0.42・0.35・0.29・0.24 mmで、合計1.79 mm、第1層0.24 mm(例1の流れなら y+ ≈ 4)になる。y+ ≈ 1 にしたい場合は、層数を増やすか、壁のレベルを上げる必要がある。
実務での進め方
- 流れの条件から摩擦速度を見積もり、使う壁の扱いに合わせた第1セル厚さを決める。
- blockMeshで背景格子(または全体の格子)を作り、格子比を計算した値に合わせる。
- snappyHexMeshで表面と重要な領域を細分化し、境界層の層数と厚さを決める。
- checkMeshで非直交性・スキューネス・負の体積を確かめ、問題のある場所を修正する。
- 解いた後に y+ の分布を確かめ、格子を2段階変えて結果が変わらないことを確認する。
「非直交性70度の1セル」
checkMeshの出力で、最大の非直交性が70度を超えるセルが数個だけある、ということはよくある。数個なら問題ないと思いがちだが、圧力の方程式の収束はこうした少数のセルに引きずられ、発散の起点になることが多い。fvSolutionのnNonOrthogonalCorrectorsを増やして補正する方法もあるが、根本的にはそのセルを直すのが確実だ。checkMesh -allGeometry -allTopology で問題のセルを集合(cellSet)として書き出し、ParaViewで位置を見れば、どの形状やどの設定が原因かがすぐ分かる。
よくある間違い
間違いと対策
| 間違い | 起きること | 対策 |
|---|---|---|
| 第1セルが緩衝層 | 摩擦・熱伝達の誤差 | y+を1か30以上に |
| y+を確かめない | 壁の扱いと格子が不整合 | yPlusで分布を出す |
| 境界層が一部で欠ける | 局所的に y+ が大きい | 層の設定と品質制約を調整 |
| 非直交セルを放置 | 圧力が収束しない | cellSetで特定し修正 |
| STLの穴・重なり | 内部と外部が混ざる | surfaceCheckで確認 |
関連する内容も知りたいです。
関連するページはOpenFOAM入門、OpenFOAM乱流モデル、OpenFOAM並列計算、構造格子、y+ — CAE用語解説が参考になる。
よくある質問
OpenFOAMのメッシュはどう作りますか?
単純な形はblockMeshで六面体のブロックを並べて作り、複雑な形はblockMeshで作った背景格子をsnappyHexMeshでSTLの形状に合わせて削り、細分化し、壁に境界層を追加します。外部のメッシャー(GmshやANSYS Meshingなど)で作ったメッシュをgmshToFoamやfluentMeshToFoamで変換することもできます。仕上げにcheckMeshで品質を確かめます。
壁の第1セルの大きさはどう決めますか?
使う乱流モデルの壁の扱いに合わせてy+(壁からの距離を粘性の長さで割った値)を決めます。壁面まで解くならy+≈1、壁関数を使うならy+が30〜300が目安です。高さ50 mmの流路、空気10 m/sの例では粘性の長さが約29 µmなので、y+≈1には第1セルを約58 µm(セル中心で約29 µm)にします。
snappyHexMeshで境界層がうまく入りません。
境界層の追加は、形状に沿って押し出す余地がないと部分的に省かれます。layersの設定(層数、expansionRatio、finalLayerThickness)と、品質の制約(meshQualityControls)を見直し、まず層数を減らして全面に入るかを確かめます。最終的にどの面に何層入ったかは、ログやcheckMeshの出力で確認します。
参考資料・検算の位置づけ
掲載値は本文の仮定に基づく教育用の参考計算。資料は理論・設定の参照先であり、本記事の数値を各ソフトで再現した証明ではない。設計・製造の判断には対象条件での検証が必要。
関連トピック
なった
詳しく
報告