[CFD Q&A] simpleFoamで圧力残差が収束しない時の対処法
実務で直面したSIMPLEアルゴリズムの発散解決記 — リラクゼーション・ファクタ(緩和係数)の設定が鍵でした
先週、かなり時間を費やしてしまった問題がありました。simpleFoamを実行していたところ、圧力残差(pressure residual)が 1e-3 以下に下がらず、むしろ上昇し始めてしまったのです。最初はメッシュの問題かと思いましたが、結論から言うと、原因はリラクゼーション・ファクタ(relaxation factor)にありました。
問題の状況#
- ソフトウェア: OpenFOAM v2312
- 形状: 2D長方形チャネル、inlet–outlet境界
- 乱流モデル: k-ε (standard)
- ソルバー: simpleFoam (定常)
最初の20〜30イテレーション(iteration)は順調に下がっていましたが、突然圧力残差が跳ね上がり始めました。
Time = 50
smoothSolver: Solving for Ux, Initial residual = 0.0023, Final residual = 1.2e-5, No Iterations 3
smoothSolver: Solving for Uy, Initial residual = 0.0019, Final residual = 9.8e-6, No Iterations 3
GAMG: Solving for p, Initial residual = 0.412, Final residual = 0.038, No Iterations 8
time step continuity errors : sum local = 4.2e-5, global = 1.1e-5, cumulative = 3.4e-4
...
Time = 80
GAMG: Solving for p, Initial residual = 0.891, Final residual = 0.21, No Iterations 20速度(velocity)はうまく収束しているのに、圧力だけが不安定なままです。これは典型的な圧力-速度カップリングの不安定パターンです。
原因分析のプロセス#
ステップ1:メッシュ品質の確認#
まずは checkMesh を実行しました。
checkMesh -case .最大非直交性(non-orthogonality)は32度、最大スキューネス(max skewness)は0.8で、それほど悪くありません。メッシュの問題ではなさそうです。
ステップ2:境界条件の点検#
inlet(流入境界)の圧力を zeroGradient、outlet(流出境界)を fixedValue 0 に設定しました。これは標準的な設定なので問題ありません。
しかし、初期の p フィールドを確認したところ、inlet側に異常に大きな値が入っていました。以前 funkySetFields で実験した際の残骸が残っていたことが原因でした。
ステップ3:fvSolution の確認#
// fvSolution (元の設定)
relaxationFactors
{
fields
{
p 0.7;
}
equations
{
U 0.9;
k 0.7;
epsilon 0.7;
}
}U=0.9 はかなり強気な設定です。SIMPLE法において、速度の緩和を強めると収束速度は上がりますが、圧力の更新が追いつかないと発散してしまいます。
以下の2つの原因が重なっていました。
- リラクゼーション・ファクタが過度に高い
- 初期の p フィールドに誤った値が残っている
解決策#
リラクゼーション・ファクタを下げる#
// fvSolution (修正後)
relaxationFactors
{
fields
{
p 0.3;
}
equations
{
U 0.7;
k 0.5;
epsilon 0.5;
}
}初めて実行するケースでは、控えめな値から始めるのが鉄則です。収束が確認できたら、徐々に上げていきます。
初期 p フィールドの初期化#
# 0ディレクトリのpファイルをきれいに初期化
cp 0.orig/p 0/pまたは、直接 0/p ファイルを開いて internalField uniform 0; に設定します。
// 0/p
dimensions [0 2 -2 0 0 0 0];
internalField uniform 0;
boundaryField
{
inlet
{
type zeroGradient;
}
outlet
{
type fixedValue;
value uniform 0;
}
walls
{
type zeroGradient;
}
}検証#
修正後に再実行すると、以下のようになりました。
Time = 50
smoothSolver: Solving for Ux, Initial residual = 0.0018, Final residual = 8.3e-6, No Iterations 3
GAMG: Solving for p, Initial residual = 0.089, Final residual = 0.0041, No Iterations 5
time step continuity errors : sum local = 2.1e-6, global = 4.3e-7, cumulative = 8.9e-6
Time = 200
GAMG: Solving for p, Initial residual = 3.2e-4, Final residual = 1.1e-5, No Iterations 3200イテレーションほどで、圧力残差が 1e-4 レベルまで安定して下がりました。
一般的な教訓#
simpleFoam 収束チェックリスト — 以下の順序で確認すれば、ほとんどの問題は解決します。
-
まずは初期条件:
0/ディレクトリの p, U フィールドが意図した値になっているか確認します。以前の実験の残骸があれば必ず初期化してください。 -
リラクゼーション・ファクタは控えめに: 初回実行は
U=0.7, p=0.3のデフォルト値から始めるのが安全です。pの緩和は特に低めに設定することで、SIMPLEループが安定します。 -
速度の収束と圧力の収束を分けて考える: 速度(U)の残差は低いのに圧力(p)だけが発散する場合、リラクゼーションの問題である可能性が高いです。両方が発散する場合は、まずメッシュや境界条件を確認してください。
-
GAMG のイテレーション数に注目: 同一イテレーション内で圧力を解く際のインナー・イテレーション数が急増した場合、収束の方向性が間違っている可能性があります。
SIMPLEアルゴリズムは、圧力補正ループの特性上、リラクゼーションに対して非常に敏感です。初回実行は常に控えめに — 遅くても安定して収束することを確認してから加速させるのが、結局は近道です。
似たような問題でお困りの方は、コメント欄で環境(バージョン、形状、乱流モデルなど)を教えてください。ケースによって最適な対処法は異なります。
αp を 0.6 以上に上げると 30 反復付近で残差が再び跳ねるのが見える。
αp를 0.7 이상으로 올리면 30 iter 부근에서 잔차가 다시 튀어오른다 — simpleFoam이 발산하는 전형 패턴. 0.3 / 0.7 이 안정 기본값.
役に立ったらシェアしてください。