Skip to content
cfd-lab:~/zh/posts/2026-03-27-simpleFoam-pr…● online

本文译自作者的韩语原文。 阅读原文(한국어)

NOTE #012DAY FRI CFD기법DATE 2026.03.27UPDATED 2026.10.19READ 3 min read#CFD-Practice#QA#OpenFOAM#SIMPLE#Convergence

[CFD Q&A] 当 simpleFoam 压力残差无法收敛时

只看速度残差就去加松弛,压力修正的内迭代会从8次涨到20次。

上周 simpleFoam 吃掉了半天。压力残差下不到 1e-3。它往上走。先怀疑的是网格。真正动手的地方是 relaxation factor。

把 αp 滑条推过 0.6,压力残差曲线会在 30 iter 附近重新向上折。

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

停在 0.3 附近,同一条曲线会一直降到 200 iter。下面日志里 Time=80、初始残差 0.891,就落在这段折返里。

问题现象

OpenFOAM v2312。二维矩形通道,从 inlet 到 outlet。湍流模型是 standard k-ε。求解器是稳态 simpleFoam。

前 20 到 30 iter 残差在降。随后只有压力在跳。

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

速度稳住了,压力不稳。这是压力-速度耦合在晃的样子。

原因分析过程

第一步:检查网格质量

先跑了 checkMesh。

checkMesh -case .

最大 non-orthogonality 32 度,max skewness 0.8。要把网格当成原因,这两个数太安静。

第二步:检查边界条件

inlet 压力是 zeroGradient,outlet 是 fixedValue 0。通道里常见的一对。到这里没有异常。

打开初始 p,inlet 一侧还留着一个大数。那是用 funkySetFields 试过、以为已经清掉的场。

第三步:检查 fvSolution#

// fvSolution (原始设置)
relaxationFactors
{
    fields
    {
        p               0.7;
    }
    equations
    {
        U               0.9;
        k               0.7;
        epsilon         0.7;
    }
}

U=0.9 是偏快的设置。速度松弛一抬,表面收敛会变快。压力更新跟不上,循环就晃。

叠在一起的原因有两个。松弛太高。初始 p 里留着垃圾。压力修正怎么和速度场绑在一起,写在 压力出现棋盘振荡时的SIMPLE 里。

解决方案

降低松弛因子

// 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 iter 时,压力残差降到 1e-4 这一档。内迭代也回到个位数。

日志里的倍率

改之前的 Time=50,Ux 从 0.0023 降到 1.2e-5。三次内迭代,大约 192 倍。Uy 从 0.0019 到 9.8e-6,大约 194 倍。同一时刻的压力只从 0.412 到 0.038,八次大约 11 倍。速度将近降了 200 倍,压力只走了大约 11 倍。

Time=80 是三十步之后。压力初始残差从 0.412 升到 0.891,大约 2.2 倍。内迭代从 8 增到 20,是 2.5 倍。可下降倍率是 0.891 除以 0.21,大约 4.2,反而变小。迭代加了,降下的却更少。

改完以后,Time=50 的压力从 0.089 到 0.0041,五次大约 22 倍。Time=200 从 3.2e-4 到 1.1e-5,三次大约 29 倍。累积 continuity 从 3.4e-4 到 8.9e-6,大约小了 38 倍。p 松弛 0.3 是原先 0.7 的大约 43%。U 从 0.9 到 0.7,k 和 epsilon 从 0.7 到 0.5。压力修正砍到一半以下,换来压力内迭代从 20 降到个位数。

把 Time=200 的最终残差 1.1e-5,和改之前 Time=80 的最终值 0.21 放在一起。0.21 除以 1.1e-5 大约是 19100。同一个通道,同一套网格,变的只有压力松弛和初始场。重新拆网格之前要看的,就是这个倍率。

速度的内迭代,改前改后都停在 3。变的只是压力一侧的迭代次数和下降倍率。Ux 的最终残差也从 1.2e-5 到 8.3e-6,同是三次迭代,只是多降了一点。日志指向的故障不是速度求解器。continuity 的 sum local 也从 4.2e-5 降到 2.1e-6。4.2e-5 除以 2.1e-6 正好是 20。这和累积值的 38 倍同一方向,倍率却不同。所以先动压力,网格先放着。

打开网格之前先降的那个数

non-orthogonality 32 度和 skewness 0.8,不是先重建网格的理由。先降的是 p 松弛。0.7 是压力修正赶不上速度 0.9 的设置。第一次用 p 0.3、U 0.7。Time=200 的残差坐到 1e-4 附近,再往上抬。

初始 p 里留下的 funkySetFields 数值也毁了同一次计算。不把 internalField uniform 0 清掉,松弛降了,入口的垃圾梯度还在。松弛变低,不自动等于同一份物理。只改一个松弛、收敛解就变了的Rhie–Chow 用来看,0.7 改成 0.3 究竟只留在残差曲线上,还是会漏进最终的场。

如果对您有帮助,请分享。