[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)收敛良好,但压力(pressure)始终不稳定。这是典型的压力-速度耦合不稳定性表现。
原因分析过程#
第一步:检查网格质量#
首先运行 checkMesh。
checkMesh -case .最大非正交性(non-orthogonality)为 32 度,最大扭曲度(max skewness)为 0.8 —— 表现尚可。看来网格不是主要问题。
第二步:检查边界条件#
入口(inlet)压力设为 zeroGradient,出口(outlet)设为 fixedValue 0。这是标准设置,没有问题。
但在检查初始 p 场时,发现入口处存在异常大的数值。这是之前使用 funkySetFields 进行实验后留下的残留值。
第三步:检查 fvSolution#
// fvSolution (原始设置)
relaxationFactors
{
fields
{
p 0.7;
}
equations
{
U 0.9;
k 0.7;
epsilon 0.7;
}
}U=0.9 是一个相当激进的数值。在 SIMPLE 算法中,提高速度松弛可以加快收敛,但如果压力更新跟不上,就会导致发散。
两个原因叠加导致了发散:
- 松弛因子设置过高
- 初始 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 收敛检查清单 —— 按此顺序检查可解决大部分问题:
-
首查初始条件:确认
0/目录下的 p、U 场是否符合预期。如果存在旧实验残留,务必初始化。 -
松弛因子要保守:首次运行建议使用
U=0.7, p=0.3的默认值。安全确认收敛后再提速。尤其是p的松弛因子应保持较低,以稳定 SIMPLE 循环。 -
区分速度与压力收敛:如果 U 残差低而 p 发散,通常是松弛因子的问题。如果两者都发散,应先检查网格或边界条件。
-
观察 GAMG 迭代次数:如果在同一次外迭代中,求解 p 所需的内迭代次数突然增加,说明收敛方向可能出现了偏差。
由于压力修正循环的特性,SIMPLE 算法对松弛因子非常敏感。初次运行应始终保持保守 —— 虽然起步慢,但确保稳定收敛后再加速,最终效率反而更高。
如果你也遇到了类似的问题,欢迎在评论区分享你的环境(版本、几何、湍流模型)。具体案例可能需要不同的处理方式。
把 αp 推过 0.6,看 30 次迭代附近残差反弹。
αp를 0.7 이상으로 올리면 30 iter 부근에서 잔차가 다시 튀어오른다 — simpleFoam이 발산하는 전형 패턴. 0.3 / 0.7 이 안정 기본값.
如果对您有帮助,请分享。