OpenFOAMメッシュ生成

カテゴリ: オープンソースCAE | 2026-10-02 改稿
CAE visualization for openfoam mesh theory - technical simulation diagram
OpenFOAMメッシュ生成

理論:メッシュ生成の道具と壁の扱い

概要

🙋

OpenFOAMにはGUIのメッシャーがありません。どうやってメッシュを作るのですか?

🎓

テキストの設定ファイルで指示して作る。基本はblockMeshで、頂点の座標とブロック(六面体)の分割数、格子の伸び率(grading)をsystem/blockMeshDictに書くと、構造格子ができる。複雑な形状では、blockMeshで箱型の背景格子を作り、snappyHexMeshにSTLの表面形状を渡して、(1) 表面や指定領域でセルを細かく分割(castellatedMesh)、(2) セルの節点を表面に合わせて動かす(snap)、(3) 壁に薄いセルの層を押し出す(addLayers)、の3段階で仕上げる。外部のメッシャーで作ったメッシュを変換して使うこともできる。どの方法でも最後にcheckMeshで、セルのゆがみ(非直交性・スキューネス)や負の体積がないかを確かめる。

格子比・第1セル・y+

$$ g = r^{1/(N-1)},\qquad \Delta y_1 = h\,\frac{g-1}{g^N - 1},\qquad u_\tau = U\sqrt{C_f/2},\quad C_f = 0.073\,Re^{-1/4},\qquad y^+ = \frac{(\Delta y_1/2)\,u_\tau}{\nu} $$

r はblockMeshのsimpleGradingで与える最後と最初のセルの比、N はセル数、h は壁から中心までの長さ、Δy₁ は第1セルの厚さ、u_τ は摩擦速度、C_f は流路の摩擦係数(Deanの式)、ν は動粘度。y+ は第1セル中心の値。

Coffee Break よもやま話

六面体へのこだわり

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+中心のセル判定
1625 µm10.80.62 mm緩衝層:どちらにも不適
10158 µm2.71.58 mmやや粗い
4058 µm1.02.3 mm壁面まで解く場合に適
20016 µm0.283.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)

レベル01234
セル寸法8 mm4 mm2 mm1 mm0.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. 流れの条件から摩擦速度を見積もり、使う壁の扱いに合わせた第1セル厚さを決める。
  2. blockMeshで背景格子(または全体の格子)を作り、格子比を計算した値に合わせる。
  3. snappyHexMeshで表面と重要な領域を細分化し、境界層の層数と厚さを決める。
  4. checkMeshで非直交性・スキューネス・負の体積を確かめ、問題のある場所を修正する。
  5. 解いた後に y+ の分布を確かめ、格子を2段階変えて結果が変わらないことを確認する。
Coffee Break よもやま話

「非直交性70度の1セル」

checkMeshの出力で、最大の非直交性が70度を超えるセルが数個だけある、ということはよくある。数個なら問題ないと思いがちだが、圧力の方程式の収束はこうした少数のセルに引きずられ、発散の起点になることが多い。fvSolutionのnNonOrthogonalCorrectorsを増やして補正する方法もあるが、根本的にはそのセルを直すのが確実だ。checkMesh -allGeometry -allTopology で問題のセルを集合(cellSet)として書き出し、ParaViewで位置を見れば、どの形状やどの設定が原因かがすぐ分かる。

よくある間違い

間違いと対策

間違い起きること対策
第1セルが緩衝層摩擦・熱伝達の誤差y+を1か30以上に
y+を確かめない壁の扱いと格子が不整合yPlusで分布を出す
境界層が一部で欠ける局所的に y+ が大きい層の設定と品質制約を調整
非直交セルを放置圧力が収束しないcellSetで特定し修正
STLの穴・重なり内部と外部が混ざるsurfaceCheckで確認
🙋

関連する内容も知りたいです。

🎓

よくある質問

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の出力で確認します。

参考資料・検算の位置づけ

掲載値は本文の仮定に基づく教育用の参考計算。資料は理論・設定の参照先であり、本記事の数値を各ソフトで再現した証明ではない。設計・製造の判断には対象条件での検証が必要。

関連する分野

構造解析流体解析熱解析
この記事の評価
ご回答ありがとうございます!
参考に
なった
もっと
詳しく
誤りを
報告
参考になった
0
もっと詳しく
0
誤りを報告
0