SIMPLE法
SIMPLE法的理论基础
SIMPLE法的概要
老师,SIMPLE法这个名字我经常听到,但这是什么的缩写,是什么样的方法呢?
SIMPLE是Semi-Implicit Method for Pressure-Linked Equations的缩写,这是Patankar和Spalding在1972年发表的压力-速度耦合算法。用有限体积法求解不可压缩Navier-Stokes方程时,它解决了如何一致地求解压力场和速度场的问题。
为什么压力和速度的耦合这么麻烦?
在不可压缩流中,连续方程(质量守恒)不包含压力的独立方程。因为密度是常数,所以不能从状态方程中求压力。结果是需要找到同时满足动量方程和连续方程的压力场和速度场。这就是压力-速度耦合问题。
支配方程
请先教我基本方程。
不可压缩流的支配方程如下。
动量方程(Navier-Stokes方程):
其中 $\mathbf{u}$ 是速度矢量,$p$ 是压力,$\rho$ 是密度,$\nu$ 是动黏性系数。
未知数有4个(u, v, w, p),方程也有4个,原理上应该能解吧?
是的。但是直接导出压力的Poisson方程并同时求解计算成本很高。SIMPLE法采用"预测-修正"的方法,将这种耦合分离开来有效地求解。
SIMPLE法的算法
请教我具体的步骤。
SIMPLE法的一次迭代由以下4步组成。
步骤1:用临时压力 $p^*$ 求解动量方程
由此得到临时速度 $\mathbf{u}^*$。这个速度场一般不满足连续方程。
步骤2:求解压力修正方程
为消除连续方程的残差,求压力修正 $p'$:
步骤3:修正压力和速度
其中 $\alpha_p$ 是压力的松弛系数。
步骤4:求解其他标量方程,进行收敛判定
$a_P$ 是动量方程的对角系数吧。压力修正方程的右边是速度的散度,也就是在让连续方程的残差趋于零是吧。
完全正确。反复迭代后 $\nabla \cdot \mathbf{u}^* \to 0$,质量守恒得到满足。
松弛系数的作用
松弛系数 $\alpha_p$ 是什么意思?
在SIMPLE法中,压力修正方程中省略了相邻单元系数($a_N$项)的贡献,这是一种近似。因此一次修正会过度修正。所以通常对压力施加 $\alpha_p = 0.3$ 左右,对速度施加 $\alpha_u = 0.7$ 左右的欠松弛(under-relaxation)。也有一种惯例是 $\alpha_u + \alpha_p \approx 1$。
原来如此,近似的代价就需要松弛。这就是SIMPLE的"Semi-Implicit"的含义吧。
完全正确。完全隐式求解的话就成了耦合求解器,但SIMPLE法作为分离型(Segregated)求解器非常高效。
Patankar在1970年代用计算机运行SIMPLE法的故事
SIMPLE法的开发者S.V. Patankar在1972年开发了SIMPLE法,他在当时计算机内存仅为现代智能手机的万分之一的情况下挑战求解Navier-Stokes方程。他采取的策略就是"将压力和速度分离开来交替求解"的反复法——这就是SIMPLE的本质。不需要一口气完美地求解联立方程,这种"分离型反复"的思想转变,是在有限计算资源的制约下的智慧结晶。如今,数百万网格的CFD分析还在使用SIMPLE法,这正是这种"分离型反复"的简洁性和可靠性的证明。
SIMPLE法的数值计算方法
SIMPLE族算法的比较
除了SIMPLE以外,还有SIMPLEC和SIMPLER等,它们的区别是什么?
对SIMPLE法进行改进得到了几个变种。让我们比较主要的几个。
SIMPLEC(SIMPLE-Consistent)
Van Doormaal和Raithby于1984年提出。改进了压力修正方程中相邻单元系数的处理方式。
用 $a_P - \sum a_N$ 代替 $a_P$,可以让压力的松弛系数接近1.0。在很多情况下收敛会更快。
SIMPLER(SIMPLE-Revised)
Patankar在1980年提出的改进版本。在压力修正之前额外求解一次压力方程来获得更好的压力场初值。
SIMPLEC能让松弛系数更大,这很好。实务中一般用哪种?
| 算法 | 松弛系数(压力) | 收敛速度 | 稳定性 | 每次迭代的成本 |
|---|---|---|---|---|
| SIMPLE | 0.2〜0.5 | 慢 | 高 | 低 |
| SIMPLEC | 0.7〜1.0 | 中等 | 中等 | 低 |
| SIMPLER | 0.5〜0.8 | 快 | 中等 | 高(求解两次压力) |
定常计算中SIMPLEC是比较实用的选择。非定常计算中经常用PISO法。
Rhie-Chow补间
用有限体积法实现SIMPLE时,压力和速度的网格配置是怎样的?
这是非常重要的一点。如果用配置网格(压力和速度放在同一位置),会出现压力出现棋盘图案的问题。
Rhie-Chow补间(1983)是解决这个问题的方法,在计算单元面上的速度时加入压力的三阶导数项来抑制棋盘振动。
现在的大多数商用CFD代码采用配置网格+Rhie-Chow补间的方式。
在交错网格(速度和压力在不同位置)就不需要了吧?
交错网格中棋盘问题自然避免了。但是对非结构网格的扩展困难,所以现代CFD代码中配置网格是主流。
线性方程组的求解
每步都要求解线性方程组,通常用什么方法?
动量方程用Gauss-Seidel法或ILU前处理的BiCGSTAB法。压力修正方程是椭圆型,频谱很宽,所以AMG(代数多重网格)前处理很有效。
| 方程 | 推荐方法 | 内部迭代次数的目安 |
|---|---|---|
| 动量(u, v, w) | Gauss-Seidel / ILU-BiCGSTAB | 3〜10 |
| 压力修正 | AMG前处理CG / GAMG | 50〜200 |
| 标量(k, epsilon等) | Gauss-Seidel | 3〜5 |
压力修正的迭代次数更多呢。
压力修正方程是Laplacian型,信息传播很慢。所以多重网格很有效,也是瓶颈所在。整体计算时间的60〜80%有时候花在压力修正上。
SIMPLEC和SIMPLER——"C"和"R"分别代表什么
SIMPLE有几个派生版本。SIMPLEC是"Consistent"的首字母,改进了速度修正系数的计算来加快收敛。SIMPLER是"Revised",改进了压力初值估计。实际上哪个更快因情况而异。简单的管内流用SIMPLEC比SIMPLE快30%,但复杂的再循环流可能没有区别。现场通常的做法是"先用SIMPLE看看,收敛慢的话就换SIMPLEC"。重要的不是算法名字而是松弛系数的调优——这是CFD工程师的共识。
SIMPLE法的实务应用
实务设定步骤
老师,实际做CFD分析用SIMPLE法时,应该怎么进行?
定常分析中用SIMPLE/SIMPLEC的典型流程告诉你。
1. 网格生成和品质确认:非直交性 < 70度,斜度 < 0.85 为目标
2. 离散化方案的选择:先用一阶风上格式稳定收敛,再切换到二阶精度
3. 松弛系数的初始设定:压力0.3、速度0.7、湍流量0.5〜0.7
4. 残差监视:所有变量的残差 $10^{-4}$ 以下,且监视点物理量稳定
5. 网格独立性分析:3种以上网格密度确认结果的依存性
软件别的SIMPLE设定
各个软件的具体设定方法请教我。
ANSYS Fluent 的设定
Fluent中选择Pressure-Based Solver,在Pressure-Velocity Coupling选SIMPLE或SIMPLEC(不选Coupled)。
- Methods > Pressure-Velocity Coupling > SIMPLE or SIMPLEC
- 压力离散化:Standard, PRESTO!, Second Order
- 动量:Second Order Upwind(稳定后)
- Pseudo Transient选项可用伪时间推进稳定化
OpenFOAM 的设定
OpenFOAM的定常求解器simpleFoam在fvSolution的SIMPLE条目中设定。
```
SIMPLE
{
nNonOrthogonalCorrectors 1;
residualControl
{
p 1e-4;
U 1e-4;
}
}
relaxationFactors
{
fields { p 0.3; }
equations { U 0.7; k 0.5; epsilon 0.5; }
}
```
网格非直交性高的时候,增加 `nNonOrthogonalCorrectors` 很有用。
STAR-CCM+ 的设定
STAR-CCM+中选Segregated Flow模型就会用SIMPLE算法。在Under-Relaxation Factors标签中可以设定松弛系数。
松弛系数的调优指南
松弛系数最优设定有诀窍吗?
归纳几个实用的准则。
| 情况 | 压力松弛 | 速度松弛 | 备注 |
|---|---|---|---|
| 标准流动 | 0.3 | 0.7 | 默认 |
| 高Re数湍流 | 0.2 | 0.5 | 稳定性优先 |
| 自然对流 | 0.3〜0.5 | 0.5〜0.7 | 浮力项耦合 |
| 多孔质媒体 | 0.1〜0.2 | 0.3〜0.5 | 源项很大 |
| 收敛稳定后 | 0.5 | 0.8 | 加快最后冲刺 |
残差振动时减小松弛,收敛慢时逐步增大。有些求解器有自动松弛功能。
"先用安全设定稳定收敛,稳定后才加大"的战略啊。
完全正确。CFD中"欲速则不达"是铁律。
松弛系数0.7/0.3是怎么来的——SIMPLE实践的经验法则
用SIMPLE法时经常看到"速度的松弛系数是0.7、压力是0.3"的设定。这并不是基于确凿的理论,而是从Patankar的教科书和大量的基准测试积累起来的经验法则。设成0.9看起来初期会快,但复杂流动中间会摇摆最后发散。反过来0.5以下的话会慢得要命。某次汽车发动机舱冷却分析中0.7/0.3一直收敛不了,把速度改成0.5就顺利了——这种微调经历是CFD工程师的"标配经验"。松弛系数并不是"魔法常数",而是需要根据问题触觉调整的参数。
SIMPLE法的软件比较
主要CFD求解器中的SIMPLE实现
SIMPLE法的实现因软件而异吗?
基本原理相同,但各求解器都加入了自己的改进和扩展。
| 求解器 | 分离型算法 | 耦合型有无 | 特殊说明 |
|---|---|---|---|
| ANSYS Fluent | SIMPLE, SIMPLEC, PISO, Coupled | 有 | Pseudo Transient,High Order Term Relaxation |
| ANSYS CFX | 自有耦合型 | 标准 | 不搭载分离型。用耦合型AMG实现高效率 |
| STAR-CCM+ | SIMPLE系 | 有 | AMG前处理,自动松弛功能 |
| OpenFOAM | SIMPLE, SIMPLEC | 另购 | simpleFoam, rhoSimpleFoam, buoyantSimpleFoam |
ANSYS Fluent
Fluent的选择项最多呢。
Fluent有Pressure-Based Solver和Density-Based Solver两大系统,Pressure-Based中可选SIMPLE/SIMPLEC/Coupled Algorithm。Coupled Algorithm是分离型的反对,压力和速度同时求解,比SIMPLE收敛快,但内存用量是SIMPLE的1.5〜2倍。
ANSYS CFX
CFX原来是英国的AEA Technology开发的代码,从一开始就采用耦合型求解器设计。不搭载SIMPLE这样的分离型算法。一个矩阵同时求解所有变量,不需要像SIMPLE那样调松弛系数的麻烦。
OpenFOAM
OpenFOAM的话能看到算法的源代码吧?
完全可以。simpleFoam的源码(applications/solvers/incompressible/simpleFoam/)用约100行C++实现了SIMPLE算法。教学用途最完美。fvSolution中能细致控制线性求解器和前处理。压力默认用GAMG(几何-代数多重网格)。
许可证和成本
成本方面怎么样?
| 求解器 | 许可证 | 年成本目安 | 支持 |
|---|---|---|---|
| ANSYS Fluent | 商用 | 数百万日元〜 | 官方支持有 |
| ANSYS CFX | 商用 | Fluent捆绑套餐有 | 官方支持有 |
| STAR-CCM+ | 商用 | 数百万日元〜 | Siemens官方 |
| OpenFOAM | GPL v3 | 无偿 | 社区或有偿支持 |
OpenFOAM无偿但需要自备GUI或前端。HELYX、simFlow等GUI前端也有。商用软件虽然许可贵但工作流完整。
Fluent的SIMPLEOpenFOAM的simpleFoam——"同"大间違
SIMPLE是通用算法,但各工具的实现有特点。Fluent的SIMPLE自動的"Rhie-Chow補間"適用、OpenFOAM的simpleFoamfvSolution明示的制御。同流FluentOpenFOAM解圧力損失10%違——困的原因的多的補間方法的違松弛系数的値的差。Fluent的頻度内部調整、OpenFOAM毎忠実回。"的SIMPLE?"確認、基准测试比较必行作業。
SIMPLE法的前沿研究
分离型求解器的局限和耦合型的发展
SIMPLE法已经是50多年前的算法了。现在还在用吗?
不仅在用,而且是CFD的核心。但对强压力-速度耦合问题(高速旋转流、强浮力流)的分离型SIMPLE收敛会变慢。这时耦合型(Coupled)求解器受关注。
耦合型中运动量方程和压力方程同时以块矩阵形式求解:
与AMG前处理结合,有时能比SIMPLE快5〜10倍。
GPU对应和大规模并行化
GPU计算的相容性如何?
SIMPLE步骤是逐步的,所以GPU并行化的效果不如某些算法。但每步的线性求解器(特别是AMG)可以GPU加速。ANSYS Fluent 2023R1以后搭载了GPU原生求解器,数亿网格的计算能在GPU集群上进行。
OpenFOAM中通过AmgX或PETSc的GPU对应也在推进。
机械学习的融合
用AI加速SIMPLE法有研究吗?
有好几个方向。
- 初值估计:用神经网络预测好的初始压力场,减少SIMPLE反复次数
- 松弛系数自动调整:用强化学习逐步决定最优松弛系数
- 前处理学习:用ML近似线性求解器的前处理矩阵,加快AMG
- PINN(物理信息神经网络):把N-S方程的物理约束嵌入网络,无网格近似解
特别是PINN最近论文很多。
PINN在复杂产业问题中精度还不够,但对参数扫描的快速代理模型有前景。用PINN得到粗初值再用SIMPLE精化的混合方法也在研究。
多物理场的扩展
SIMPLE法已扩展到单相不可压缩流以外的领域:
- 与VOF法结合:自由表面流(interFoam等)
- 共役热传达:流体-固体温度耦合(chtMultiRegionFoam)
- 反应流:燃烧分析与化学种输送耦合
- 压缩性低马赫数流:rhoSimpleFoam的变密度SIMPLE
SIMPLE法在这么多领域用啊。基本算法理解很重要呢。
SIMPLE是"慢"消——Coupled Solver的競争
最近、大手商用CFD工具"Coupled Solver(連成求解器)"前面押出。圧力速度分離一気解理論上収束速——SIMPLE時代遅? 。Coupled Solver消費SIMPLE的4〜5倍。1000万的网格Coupled Solver使64GBRAM必要、HPC申請通——笑話聞。SIMPLE効率良、並列化的相性実績。"低負荷十分精度"求设计优化的大量案例分析、今SIMPLE現役。
SIMPLE法的故障对应
常见故障和对策
老师,SIMPLE法的计算收敛不了,怎么检查?
SIMPLE法的收敛问题大致分4种。一个一个看。
1. 残差振动收敛不了
现象:压力和速度的残差呈锯齿状振动
原因和对策:
- 松弛系数太大 → 压力降到0.2,速度降到0.5
- 网格非直交性高 → 增加 `nNonOrthogonalCorrectors` 到2〜3(OpenFOAM)
- 离散化格式阶数太高 → 先用一阶迎风稳定,后改二阶
2. 残差平缓不下降
现象:残差在 $10^{-2}$ 左右停滞
原因和对策:
- 网格品质差 → 检查网格斜度、纵横比
- 边界条件不匹配 → 检查入口/出口质量流量平衡
- 湍流模型初值不合适 → 从流速重新估计 $k$ 和 $\epsilon$ 初值
3. 残差发散
现象:几步后残差急增变NaN
原因和对策:
- CFL数太大(伪时间推进法) → 减小伪时间步长
- 边界条件引起反流 → 出口改Pressure Outlet,确认回流条件
- 网格有负体积单元 → 重新网格化
4. 连续方程残差单独不下降
速度残差下降但压力不下降?
是的。这是SIMPLE法特有的问题,常源于压力修正方程的求解。
- AMG前处理的循环数增加(V-cycle → W-cycle)
- 压力的线性求解器反复次数增加(50→200)
- 检查网格格点数比(coarsening ratio)
求解器别的典型错误
各软件容易出现的错误讯息教我。
- `Divergence detected in AMG solver: pressure correction` → 降低压力松弛,检查网格品质
- `Reversed flow in N faces` → 出口距流动远一些
- `GAMG: Solving for p, Initial residual = 1, Final residual = 1` → 压力方程求不了。检查边界条件类型(fixedValue vs zeroGradient)
- `Floating point exception` → 负体积单元、零除。运行 `checkMesh`
- `Diverging solution - Loss of fluid cells` → 检查单元品质,降低Time Step Factor
调试步骤
收敛不了时的系统调试步骤整理一下。
1. 检查网格品质:checkMesh(OpenFOAM)、Mesh Quality Report(Fluent)
2. 简化边界条件:先全用壁面测试
3. 一阶精度稳定计算:收敛后再切到二阶
4. 保守松弛系数设定:从压力0.2、速度0.5开始
5. 观察变量别残差推移:特定哪个变量有问题
6. 可视化物理量场:确认无非物理区域
"网格→边界条件→格式→松弛"的顺序检查啊。记住了。
9割的问题网格或边界条件引起的。怀疑求解器设定是最后的事。
SIMPLE收敛不了——"压力参照点未设定"的盲点
SIMPLE法中"残差一直在平台上不下降"的常见原因是"压力参照点(pressure reference point)的未设定"。SIMPLE法求的是压力相对值(梯度),不是绝对值,所以全墙面围住的闭系中压力水位不定。OpenFOAM"singular matrix"怒、Fluent残差振動続的。解決策圧力参照点的一点設定。出口開放不要"設定必要知"初心者的故障。
相关话题
更详细
错误