FVM — CAE用語解説
FVM(有限体積法 / Finite Volume Method)
先生、CFDの教科書でFVMってよく出てくるんですけど、FEMとは何が違うんですか?
理論と物理
FVMの基本概念
FVM(有限体積法)って、FEM(有限要素法)と何が根本的に違うんですか?どっちもメッシュを使う方法に見えますけど。
根本的な違いは、支配方程式を積分形で扱うか、微分形で扱うかです。FVMは、小さな「制御体積」という箱を考え、その箱に対して物理量の保存則(質量、運動量、エネルギーの出入り)を積分形で適用します。例えば、連続の式は
「保存性が厳密」というのは、具体的にどういうメリットがあるんですか?数値的にズレにくいってことですか?
その通りです。特に、衝撃波やせん断層、化学反応を含むような急峻な変化がある流れでは、局所的な保存性の破れが解全体に大きな誤差を生みます。FVMは、制御体積の界面を流れるフラックス(流量)のバランスを計算するので、たとえ粗いメッシュでも、計算領域全体の質量や運動量の合計は(数値誤差の範囲内で)保存されます。これが、ANSYS FluentやOpenFOAMといったCFDソルバーの多くがFVMを採用する主な理由です。
制御体積の「界面」でフラックスを計算するということは、変数はどこに定義されるんですか?要素の中心?
代表的な方法として、「カラーマン配置」と「スタガード配置」があります。カラーマン配置では、圧力や温度などのスカラー量は制御体積の中心(セルセンター)に定義します。一方、スタガード配置では、速度ベクトルの各成分は、それに垂直なセル面の位置に定義します。これにより、圧力と速度の連成計算で生じる非物理的な振動(チェッカーボード圧力)を防ぎます。多くの実用コード、例えばFluentのデフォルトはカラーマン配置ですが、スタガード配置の考え方を取り入れた改良手法(Rhie-Chow補間)を使っています。
数値解法と実装
離散化とソルバー
FVMで離散化するとき、「発散項」や「勾配項」は具体的にどう計算するんですか?教科書に「中心差分」や「風上差分」と書いてありますが。
界面でのフラックスを、隣接セルの中心値から補間して求めます。例えば、セルiとjの界面でのスカラー値φを求める場合、中心差分なら単純な平均
離散化すると大きな連立方程式になりますよね。それをどう解くんですか?直接法?
非圧縮性流れのNavier-Stokes方程式では、圧力と速度の連成が問題です。ここで「SIMPLEアルゴリズム」や「PISOアルゴリズム」といった反復解法が使われます。SIMPLEは大まかに言うと、仮の速度場から圧力修正方程式を解き、速度と圧力を逐次修正していく方法です。一方、PISOは予測子・修正子を2回行い、より速い収束を目指します。定常計算にはSIMPLE、非定常計算にはPISOが向いていると言われます。これらのアルゴリズムは、OpenFOAMの`simpleFoam`や`pisoFoam`ソルバー名にもそのまま反映されています。
圧力修正方程式自体は、どんなソルバーで解くんですか?これも反復法?
はい。圧力修正方程式は、離散化すると係数行列が対角優位な(しかし非対称なこともある)大規模な線形連立方程式になります。これを解くには、反復法の一種である「共役勾配法(CG)」や「幾何的多重格子法(GMG)」が多用されます。特に、異なる粗さのメッシュで計算を繰り返す多重格子法は、低周波の誤差を効率的に減らすため、収束を劇的に加速します。ANSYS Fluentでは、圧力のソルバーに「Multigrid (FMG)」を選択し、サイクルタイプを「V-Cycle」に設定するのが一般的です。
実践ガイド
メッシュと設定の勘所
FVMで解析するとき、メッシュの品質で特に気をつける点は何ですか?FEMみたいにアスペクト比や歪み角ですか?
FEMと共通する部分もありますが、FVMでは「セル面の直交性」が非常に重要です。先ほど話した界面フラックスの計算で、勾配を求める際にセル中心と界面を結ぶベクトルと面法線ベクトルが平行でないと、補正項(非直交補正)が必要になり、精度が落ちたり不安定になったりします。また、急激な変化が予想される領域、例えば翼の後縁や壁面近くでは、メッシュを細かくするだけでなく、勾配を捉えるために「メッシュ伸長比」を1.2以下に抑えるのが目安です。ANSYS Meshingでは「Skewness」が0.9以下、「Orthogonal Quality」が0.1以上を目標にします。
壁面処理で「壁関数」と「低レイノルズ数モデル」って聞きますが、メッシュの作り方はどう変えるんですか?
これは実務で最も重要な判断の一つです。壁関数を使う場合、最初のメッシュ点を無次元壁面距離
計算を始める前の初期条件や残差の設定で、失敗しないためのコツはありますか?
まず、定常計算を始める際は、すべての物理量を一様な「穏やかな」値からスタートさせます。例えば、内部流れ解析でいきなり入口速度を10m/sに設定するのではなく、最初は1m/sなど小さな値から始め、数ステップ計算して流れ場が形成されてから、徐々に目標値に引き上げる「ランプ設定」が有効です。残差の収束判定は、デフォルトの1e-3より厳しく1e-4〜1e-5を目標にします。また、残差のモニターだけでなく、出口の質量流量や代表点の圧力・速度値が定常値に収束しているかも必ず確認します。Fluentの「Report Definitions」でモニタリングポイントを設定する癖をつけましょう。
ソフトウェア比較
主要ソルバーの特徴
FVMを使う代表的な商用ソフトとしてANSYS FluentとSTAR-CCM+がありますが、コアの解法で違いはあるんですか?
両者ともFVMがコアですが、セル形状の扱いと圧力-速度連成解法に特徴があります。Fluentは「セルセンター」ベースのソルバーが主流で、多面体メッシュやpolyhedralメッシュに強く、SIMPLE系のアルゴリズムが中心です。一方、STAR-CCM+は「頂点ベース」のソルバーも選択可能で、特に複雑な形状へのメッシュ適応性が高いとされます。また、STAR-CCM+は「SIMPLE」と「PISO」を融合した「Segregated Flow」ソルバーをデフォルトとし、非定常計算も比較的安定と言われます。ユーザーインターフェースでは、STAR-CCM+がすべての前処理・求解・後処理を単一環境で行う「統合環境」を売りにしています。
オープンソースのOpenFOAMはどうですか?商用ソフトと比べて解法の選択肢が多いと聞きますが。
その通りで、OpenFOAMの最大の強みは解法と離散化スキームの選択肢の豊富さ、そしてソースコードが直接見られることです。圧力-速度連成だけでみても、`simpleFoam`, `pisoFoam`, `pimpleFoam`(SIMPLEとPISOのハイブリッド)など、問題に応じて選べます。離散化スキームも、`Gauss linear`(中心差分)から`Gauss upwind`、`Gauss limitedLinear 1.0`(TVDスキーム)まで細かく設定可能です。ただし、GUIが弱く、設定ファイル(`fvSchemes`, `fvSolution`)を直接編集する必要があるため、習得ハードルは高いです。産業界では研究開発やカスタム物理モデルの実装に、学界では教育や基礎研究に広く使われています。
Autodesk CFDやSiemens Simcenter FLOEFDのようにCADに密結合したソフトもありますが、これらもFVMですか?
はい、両者ともFVMがベースです。特にSimcenter FLOEFD(旧Flomerics)は「直角デカルトメッシュ」を基調とし、CAD形状に自動でフィットする「適応メッシュ」が特徴です。これにより、複雑なCADデータからのメッシュ作成が非常に速く、設計初期段階のパラメータスタディに適しています。Autodesk CFDも同様のアプローチを取ります。ただし、これらのソルバーは、境界層や複雑な剥離流れのような高度な乱流現象を捉える精度という点では、FluentやSTAR-CCM+のような本格的なCFDソルバーに一歩譲ると言われることがあります。用途に応じて使い分けることが重要です。
トラブルシューティング
よくあるエラーと対策
計算中に「残差が発散する」というエラーが出ました。最初に疑うべき原因と対策は何ですか?
まずは「メッシュ品質」と「初期・境界条件」を疑います。具体的には、(1) メッシュの歪みが大きすぎないか(Skewness > 0.95)、(2) メッシュが極端に細長くないか(Aspect Ratio > 100)、(3) 壁面の最初のメッシュ高さが適切か(y+値)、をチェックします。次に、境界条件、特に圧力出口条件が適切か確認します。内部流れで全ての出口が「圧力出口」の場合、質量保存が破綻しやすいです。対策として、一時的にすべての離散化スキームを1次風上差分に落とし、緩和係数を小さく(例えば0.2)して計算を再開し、流れ場が形成されてから高次精度に戻す「アンダーリラクゼーション」が有効です。
「浮動小数点例外」や「NaN (Not a Number)」エラーが出た場合は?
これは、ゼロ除算や負の平方根、変数が異常値(例えば密度や温度が負)になったときに発生します。原因は、(1) 極端に悪いメッシュ(体積がゼロまたは負のセル)、(2) 不適切な物性値(例えば理想気体で負の絶対温度)、(3) 過大な時間刻み(クーラン数 > 数百)がほとんどです。OpenFOAMでよく見られます。対策は、まず`checkMesh`でメッシュを徹底検査し、`potentialFoam`などで穏やかな初期場を作成します。それでもダメなら、時間刻みを極端に小さくするか、`fvSolution`の`solvers`セクションでソルバーの許容誤差を緩めます。
計算は収束したように見えるのに、物理的に明らかにおかしい結果(例えば、流れが逆方向になる)が出ました。原因は?
「偽の収束」または「局所解」に陥っている可能性が高いです。原因の一つは、境界条件の設定ミスです。例えば、流入境界と流出境界が逆になっていないか、壁面条件が「すべり」になっていないか確認します。もう一つの原因は、離散化スキームとメッシュの不整合です。例えば、強い流れの方向に対して中心差分を使うと数値振動が起き、非物理的な結果を生むことがあります。対策は、まず1次風上差分で計算して大まかな流れ場を正しく得た後、その結果を初期値として高次精度スキームで再計算することです。また、残差の収束基準を1e-6などより厳しく設定して再計算してみてください。
非定常計算で、時間刻みを小さくしすぎると計算が全然進まなくなります。適切な時間刻みの決め方は?
非定常計算の時間刻みは、「クーラン数」または「フーリエ数」に基づいて決めます。特に移流が支配的な場合はクーラン数
関連トピック
なった
詳しく
報告