cumulative error 持续增大的排查
simpleFoam 中连续性误差(cumulative)持续增大、最终发散的常见原因与对策
在 simpleFoam 的迭代日志里,像下面这行来自压力校正(p-equation)与通量校正(phi)的连续性检查:
1 | time step continuity errors : sum local = 2.44316043779e-09, global = -4.34080109975e-12, cumulative = -4.34080109975e-12 |
sum local:各个控制体的局部质量不平衡的绝对值总和(只反映量级)。global:整个域的净质量不平衡(有符号),理想应接近 0。cumulative:全局误差的累积和(随迭代更新),如果持续偏离 0 并增大,通常预示压力-速度耦合或边界流量不匹配的问题,可能走向发散。
下面按“成因分类 → 现象 → 快速检查 → 解决策略”的方式总结。
1) 边界条件不一致或不物理
典型症状
global带固定符号并逐步累积(cumulative单调漂移)。- 入口/出口设置导致总质量通量不平衡(如多个入口
fixedValue U,出口也用fixedValue U)。
快速检查
- 用
checkMesh -constant看是否有网格面法向/体积问题(虽不直接对应,但先排除)。 - 检查 0 文件夹中的
U、p、nut、k/epsilon/omega边界条件:- 入口常用:
U: fixedValue、p: zeroGradient - 出口常用:
U: zeroGradient、p: fixedValue(或totalPressure) - 固壁:
U: noSlip/slip、p: zeroGradient
- 入口常用:
- 多个出口时尽量选用压力型出口(
fixedValue p或outletInlet等)。
- 用
解决策略
- 确保流量唯一由入口速度或出口压力来“决定”,避免同一方向上过度“刚性”的双定常量(入口速度 + 出口速度)。
- 对非定常方向/多出口,采用压力出口(
fixedValue p、inletOutlet、pressureInletOutletVelocity)。
2) 压力方程奇异/近奇异(参考压力设置不当)
症状
p的线性系统难以收敛,global/cumulative漂移大。- 封闭域或近封闭域未设定参考压力,或参考面设置不合理。
快速检查
fvSolution中SIMPLE/PISO的nNonOrthogonalCorrectors、pRefCell/pRefValue是否设置。- 闭合域(无明确出口)场景是否设置了
pRefCell/pRefValue。
解决策略
在
system/fvSolution的SIMPLE块设置参考压力,例如:1
SIMPLE{ nNonOrthogonalCorrectors 2; pRefCell 0; pRefValue 0;}
或在某一合适位置(接近出口)设置一个小面或小区域的
fixedValue p。
3) 离散化与数值设置过于激进(导致非物理振荡)
症状
- 迭代初期还稳定,随迭代出现振荡,
cumulative加速漂移。 - 残差难以下降或出现锯齿型变化。
- 迭代初期还稳定,随迭代出现振荡,
快速检查
system/fvSchemes中的对流项是否使用高阶且无界限格式(如linearUpwind、QUICK)但未配合限幅。fvSolution的relaxationFactors是否过大(尤其是p)。
解决策略
对流项改为更稳健的有界格式:
- 标量(k/epsilon/omega/nut):
bounded Gauss upwind或linearUpwindV limited 0.5 - 速度:
bounded Gauss upwind或linearUpwindV limited 0.5
- 标量(k/epsilon/omega/nut):
增大压力校正次数、非正交修正:
1
2
3
4SIMPLE{
nNonOrthogonalCorrectors 2; // 甚至 3–5(高非正交网格)
pRefCell 0;
pRefValue 0;}放松因子更保守:
1
2
3
4
5
6
7relaxationFactors{
fields {
p 0.3; // 0.2–0.4
} equations {
U 0.7; // 0.3–0.7
k 0.7;
epsilon 0.7; // 或 omega 0.5–0.7 nut 0.7; }}
4) 网格质量问题(非正交/歪斜/小面/负体积)
症状
checkMesh报告高非正交(> 70–80°)、高 skewness 或极小/退化单元。- 即使保守数值设置仍难以稳定。
快速检查
checkMesh重点看:Max skewness,Max non-orthogonality,Face pyramids,Cell determinant
snappyHexMesh后是否做了合理的snap/layer参数调优。
解决策略
- 改善网格:
- 降低最大非正交,控制最小面角,提高近壁质量。
- 在
snappyHexMeshDict中放宽层铺展、降低过强的细化跳跃;或对几何做surfaceCheck/surfaceClean。
- 数值上增加
nNonOrthogonalCorrectors,对高非正交网格很重要。
- 改善网格:
5) 初始场或入口剖面与壁面粗糙/湍流模型不一致
症状
- 刚开始迭代
U/p/k/epsilon(omega)残差跳变,连续性误差陡增。 - 入口剖面与墙函数粗糙参数(
z0、nutURoughWallFunction等)不匹配,产生强发展段。
- 刚开始迭代
快速检查
- 入口
U剖面、湍流量k/epsilon/omega是否与预期边界层一致。 - 壁面粗糙参数是否与入口剖面的粗糙度一致;y+ 是否落在墙函数适用范围。
- 入口
解决策略
- 用对数律/幂律一致的 ABL 入口;匹配
k-ε或k-ω初值。 - 在复杂地形/城市算例中,尽量采用足够高的顶边界和发展段长度。
- 用对数律/幂律一致的 ABL 入口;匹配
6) 物性或源项设置问题
症状
- 非常小的黏度(高雷诺)+ 粗网格 + 激进格式 → 不稳定。
- 体力/源项(如
fvOptions)设置不当,质量源或动量源不守恒。
快速检查
constant/transportProperties物性是否合理。system/fvOptions是否添加了体积流量源(massFlowRate、pressureGradientExplicitSource)而未闭合。
解决策略
- 在高 Re 粗网格场景,先用更保守格式与更强放松,逐步放开。
- 审核源项的守恒性与方向符号。
7) 线性求解器/预条件器设置不合适
- 症状
p方程迭代次数很高、残差不下去,连续性误差跟着漂移。
- 快速检查
fvSolution中solvers设置是否与网格性质匹配(对称/非对称、稀疏性)。
- 解决策略
压力使用 GAMG 并合理配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17solvers{
p {
solver GAMG;
tolerance 1e-7;
relTolerance 0.1;
smoother DICGaussSeidel;
nCellsInCoarsestLevel 200;
agglomerator faceAreaPair;
mergeLevels 1;
}
U {
solver smoothSolver;
smoother symGaussSeidel; // 或 DILU
tolerance 1e-8;
relTolerance 0.1;
}
}对高度非正交网格,可尝试
DIC/DILU平滑器。
建议的诊断步骤(按优先级)
- 运行
checkMesh,确认网格质量门槛(非正交、skewness)。 - 核对 0 文件夹边界条件组合是否物理、是否存在“速度+压力同时刚性定值”的出口/入口。
- 在
fvSolution中添加/确认pRefCell/pRefValue(封闭域)与合理的nNonOrthogonalCorrectors。 - 采用更稳健的对流格式(bounded upwind/limited linearUpwind)和保守放松因子。
- 检查/匹配入口边界层剖面与墙函数粗糙参数;确保 y+ 合理。
- 审核
fvOptions源项与物性;必要时先去掉源项测试。 - 查看
log.simpleFoam中p求解器的迭代与残差变化,调整GAMG参数。
小结
cumulative连续性误差持续增大,通常由边界条件不匹配、压力参考/非正交修正不足、离散化过激进或网格质量问题引起。- 优先保证:物理一致的边界条件 + 合理网格 + 稳健数值设置(对流格式、放松、非正交修正),再逐步“解锁”精度和速度。
如果你愿意贴出你的 fvSchemes、fvSolution、关键边界条件(0/U, 0/p)以及 checkMesh 摘要,我可以针对你的案例给出更具体的修改建议。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
