Skip to content
cfd-lab:~/ja/posts/2026-03-27-simpleFoam-pr…online
NOTE #014DAY FRI CFD기법DATE 2026.03.27READ 3 min readWORDS 1,561#CFD実務#QA#OpenFOAM#SIMPLE#収束

[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つの原因が重なっていました。

  1. リラクゼーション・ファクタが過度に高い
  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 3

200イテレーションほどで、圧力残差が 1e-4 レベルまで安定して下がりました。

一般的な教訓#

simpleFoam 収束チェックリスト — 以下の順序で確認すれば、ほとんどの問題は解決します。

  1. まずは初期条件: 0/ ディレクトリの p, U フィールドが意図した値になっているか確認します。以前の実験の残骸があれば必ず初期化してください。

  2. リラクゼーション・ファクタは控えめに: 初回実行は U=0.7, p=0.3 のデフォルト値から始めるのが安全です。p の緩和は特に低めに設定することで、SIMPLEループが安定します。

  3. 速度の収束と圧力の収束を分けて考える: 速度(U)の残差は低いのに圧力(p)だけが発散する場合、リラクゼーションの問題である可能性が高いです。両方が発散する場合は、まずメッシュや境界条件を確認してください。

  4. GAMG のイテレーション数に注目: 同一イテレーション内で圧力を解く際のインナー・イテレーション数が急増した場合、収束の方向性が間違っている可能性があります。

SIMPLEアルゴリズムは、圧力補正ループの特性上、リラクゼーションに対して非常に敏感です。初回実行は常に控えめに — 遅くても安定して収束することを確認してから加速させるのが、結局は近道です。


似たような問題でお困りの方は、コメント欄で環境(バージョン、形状、乱流モデルなど)を教えてください。ケースによって最適な対処法は異なります。

αp を 0.6 以上に上げると 30 反復付近で残差が再び跳ねるのが見える。

αp를 0.7 이상으로 올리면 30 iter 부근에서 잔차가 다시 튀어오른다 — simpleFoam이 발산하는 전형 패턴. 0.3 / 0.7 이 안정 기본값.

役に立ったらシェアしてください。