流れ関数 — トラブルシューティングガイド
渦度-流れ関数法の典型的トラブル
渦度-流れ関数法のコードを書いているんですが、なかなかうまくいきません。よくあるトラブルを教えてください。
代表的な問題と対策をまとめよう。
1. Poisson方程式が収束しない
SOR法でPoisson方程式を解いているんですが、何万回反復しても収束しません。
以下を順にチェックしてくれ。
- 緩和係数の確認: SORの最適緩和係数は $\omega_{SOR} = \frac{2}{1 + \sin(\pi h / L)}$ で近似できる。$N=100$ のとき $\omega_{SOR} \approx 1.94$ だ。$\omega > 2$ だと発散する
- 境界条件の一貫性: 全境界で $\psi$ の値を合計したとき、質量保存と矛盾しないか確認
- 残差の定義: 相対残差 $\|r\|/\|b\| < 10^{-6}$ で判定。絶対残差だとスケーリングの影響を受ける
- 初期推定: 前のタイムステップの解を初期推定に使う(warm start)ことで反復回数を大幅に削減できる
2. 壁面渦度で振動が発生する
Thomの公式で壁面渦度を計算すると、値がステップごとに振動するんです。
壁面渦度の更新とPoisson方程式の解が相互依存しているため、不安定になることがある。対策は
- 副反復(sub-iteration): 各タイムステップ内でPoisson方程式と壁面渦度の更新を3〜5回繰り返す
- under-relaxation: 壁面渦度の更新に緩和を適用。$\omega_{wall}^{new} = \alpha \omega_{wall}^{calc} + (1-\alpha) \omega_{wall}^{old}$、$\alpha = 0.5$ 程度
- 陰的処理: 壁面渦度をPoisson方程式に陰的に組み込む(Napolitano et al., 1999)
3. 高Reynolds数で発散する
Re=1000以上にすると計算が発散してしまいます。
高Re数では移流項が支配的になり、以下の問題が発生する。
| 症状 | 原因 | 対策 |
|---|---|---|
| 渦度にウィグル(波状振動) | 中心差分 + 高$Re_h$ | 風上差分 or QUICK に切替 |
| 全体が発散 | CFL条件違反 | $\Delta t$ を CFL < 0.5 に調整 |
| 壁面近傍で不安定 | メッシュ不足 | 壁面近傍のメッシュを2倍に細分化 |
| 定常解に収束しない | 流れが本質的に非定常 | 非定常計算に切替(Re>10000で典型的) |
商用ツールでの流線可視化トラブル
Fluentで流線を描いたら、壁面を突き抜けたり途中で消えたりします。
これは流線の積分が数値誤差で不正確になるケースだ。
- Maximum Steps: デフォルト値(500)が小さすぎる場合がある。2000〜5000 に増やす
- Step Size: デフォルトのままだと粗い。0.001〜0.01 に減らす
- 壁面突き抜け: メッシュ品質が悪い領域で発生。セルのnon-orthogonality > 70度のセルがないか確認
- Pathlines vs Streamlines: 非定常流れでは Streamlines(瞬間の流れ場)と Pathlines(粒子の軌跡)は一致しない。目的に応じて使い分けること
OpenFOAMの streamFunction postProcess で「Stream function is not available for 3D cases」というエラーが出ました。
OpenFOAMのstreamFunction は2Dメッシュ(1セル厚、empty パッチ使用)でのみ動作する。3D問題では使えない。代わりにParaViewの Stream Tracer フィルタを使って流線を可視化しよう。
よくある物理的な間違い
物理的な設定ミスでおかしな結果になることもありますよね?
流れ関数に関連する典型的な物理的ミスを挙げよう。
- 境界条件の過不足: Poisson方程式は楕円型なので全境界にDirichlet条件を課す必要がある。流出境界に$\psi$の値を指定し忘れると解が不定になる
- 流入流量と壁面条件の矛盾: 流入 $\psi$ の値が壁面の $\psi$ と矛盾すると質量が保存されない
- Reynolds数の定義: $Re = UL/\nu$ の特性長さ $L$ と特性速度 $U$ の定義を問題設定と一致させること。Lid-driven cavityでは $L$ = キャビティ辺長、$U$ = 蓋の速度
- 無次元化の不整合: コードを無次元化して実装する場合、全ての変数が同じ基準で無次元化されているか確認
基本的なところでミスしやすいんですね。
特に単位系と無次元化は初心者が最もミスしやすいポイントだ。まず無次元化された方程式を紙に書き下し、コードの各行がどの項に対応するか確認することを強くおすすめする。
レイノルズの実験(1883年)——乱流発見の瞬間
オズボーン・レイノルズは、管内の水にインクを流す実験で「層流から乱流への遷移」を発見しました。流速を上げていくと、インクの線がある瞬間にグチャグチャに乱れる。この劇的な瞬間を、レイノルズは数学的に $Re = \rho uD/\mu$ という無次元数で表現した。100年以上経った今も、CFDエンジニアが最初に確認するのはこのレイノルズ数です。
トラブル解決の考え方
デバッグのイメージ
CFDのデバッグは「水道管の詰まり修理」に似ている。まず「どこで詰まっているか」(どの残差が下がらないか)を特定し、次に「何が詰まっているか」(メッシュ品質?境界条件?乱流モデル?)を調べ、最後に「どう直すか」(メッシュ修正?緩和係数?)を判断する。
「解析が合わない」と思ったら
- まず深呼吸——焦って設定をランダムに変えると、問題がさらに複雑になる
- 最小再現ケースを作る——流れ関数の問題を最も単純な形で再現する。「引き算のデバッグ」が最も効率的
- 1つだけ変えて再実行——複数の変更を同時に行うと、何が効いたか分からなくなる。科学実験と同じ「対照実験」の原則
- 物理に立ち返る——計算結果が「重力に逆らって物が浮く」ような非物理的な結果なら、入力データの根本的な間違いを疑う
CFDメッシュの品質管理や乱流モデルの選定に悩む時間を、もっと創造的な設計作業に使えたら。 — Project NovaSolverはそんな実務者の声から生まれました。
流れ関数の実務で感じる課題を教えてください
Project NovaSolverは、CAEエンジニアが日々直面する課題——セットアップの煩雑さ、計算コスト、結果の解釈——の解決を目指しています。あなたの実務経験が、より良いツール開発の原動力になります。
実務課題アンケートに回答する →