PISO法

分类: 流体分析(CFD) | 综合版 2026-04-06
CAE visualization for piso algorithm theory - technical simulation diagram
PISO法 — 理论与非定常压力修正

PISO法的理论基础

PISO法的概述

🧑‍🎓

老师,PISO法和SIMPLE法有什么区别?


🎓

PISO(Pressure-Implicit with Splitting of Operators)是1986年由Issa提出的压力-速度耦合算法。SIMPLE法需要进行多次外部迭代(outer iteration)进行收敛,而PISO法在一个时间步内进行2次压力修正,无需外部迭代即可确保时间精度。


🧑‍🎓

无需外部迭代是否在非定常计算中更有利?


🎓

完全正确。在非定常流动(LESDNS、移动网格问题等)中,每个时间步都需要严格满足连续性方程。PISO法虽然每时间步的计算成本较高,但由于无需外部迭代,整体计算效率往往更高。


PISO算法的步骤

🧑‍🎓

请讲述具体步骤。


🎓

PISO法的步骤如下。


1步:动量预测子(Predictor)


使用前一时间步的压力 $p^n$ 求解动量方程,得到临时速度 $\mathbf{u}^*$:


$$ a_P \mathbf{u}_P^* = H(\mathbf{u}^*) - \nabla p^n $$

2步:第一压力修正子(First Corrector)


$$ \nabla \cdot \left(\frac{1}{a_P} \nabla p'\right) = \nabla \cdot \mathbf{u}^* $$

修正速度: $\mathbf{u}^{**} = \frac{H(\mathbf{u}^*)}{a_P} - \frac{1}{a_P}\nabla p'$


3步:第二压力修正子(Second Corrector)


$$ \nabla \cdot \left(\frac{1}{a_P} \nabla p''\right) = \nabla \cdot \mathbf{u}^{**} $$

最终速度: $\mathbf{u}^{n+1} = \frac{H(\mathbf{u}^{**})}{a_P} - \frac{1}{a_P}\nabla(p' + p'')$


🧑‍🎓

SIMPLE中压力修正只进行一次,需要进行外部迭代,而PISO进行两次修正后即完成。


🎓

确切地说,PISO的第二次修正能够反映相邻单元系数 $H$ 的更新,从而改善SIMPLE的近似。因此无需松弛因子,并能保持时间精度。


SIMPLE法的理论对比

🎓

让我们整理两者的本质区别。


特性SIMPLEPISO
压力修正次数1次/外部迭代2次(及以上)/时间步
外部迭代需要(10~数百次)不需要
松弛因子必需(0.2~0.8)不需要
主要用途定常计算非定常计算
时间精度伪时间演进真实时间精度
CFL限制无(隐式)推荐CFL < 1~5
🧑‍🎓

PISO也有CFL数的限制吗?不是隐式吗?


🎓

时间离散化本身是隐式的,但PISO的2次修正要充分降低分裂误差,需要控制CFL数在一定范围内。实际应用中CFL < 1较为安全,最大也建议CFL < 5左右。CFL数过大会导致精度下降。


Coffee Break 杂谈

PISO为何在非定常中比SIMPLE更强的"数学原因"

PISO法(Pressure Implicit with Splitting of Operators)与SIMPLE的决定性差异在于"在一个时间步内进行2次及以上的压力修正"。在非定常流中,1步的流动变化很大,1次压力修正无法完全满足连续方程(质量守恒)。PISO的第2次修正能将速度场的质量守恒误差降至近乎零——这是理论上的优势所在。心脏瓣膜启闭仿真、发动机缸内燃烧流动等"流场瞬时变化"的问题正是因此选用PISO。定常用SIMPLE、非定常用PISO的分工方案至今仍然有效。

PISO法的数值计算方法

PISO法的实现细节

🧑‍🎓

实现PISO法时,H算子是什么?


🎓

这是OpenFOAM中经常出现的记号。将动量方程离散化后:


$$ a_P \mathbf{u}_P = \sum_N a_N \mathbf{u}_N + \mathbf{b} - \nabla p $$

定义 $H(\mathbf{u}) = -\sum_N a_N \mathbf{u}_N + \mathbf{b}$,则:


$$ \mathbf{u}_P = \frac{H(\mathbf{u})}{a_P} - \frac{\nabla p}{a_P} $$

这样就能把速度表示为压力梯度的函数。将其代入连续方程可得到压力的Poisson方程。


nCorrectors 和 nNonOrthogonalCorrectors

🧑‍🎓

OpenFOAM的配置里有个nCorrectors参数,这是什么?


🎓

nCorrectors 是PISO压力修正步数。默认为2,若CFL数较大或需要提高精度,可设为3~4。


nNonOrthogonalCorrectors 是对网格非正交性的修正迭代。非正交网格中压力拉普拉斯算子会产生非正交贡献,需要反复修正。


```

PISO

{

nCorrectors 2;

nNonOrthogonalCorrectors 1;

}

```


PIMPLE法(PISO-SIMPLE混合)

🧑‍🎓

听说过PIMPLE法,它和PISO有什么区别?


🎓

PIMPLE法是在OpenFOAM中实现的PISO与SIMPLE混合算法。在时间步内进行外部迭代(SIMPLE风格的循环),同时以PISO修正作为最终调整。


```

PIMPLE

{

nOuterCorrectors 2; // SIMPLE风格的外部迭代

nCorrectors 1; // PISO修正

nNonOrthogonalCorrectors 1;

}

```


参数含义
nOuterCorrectors = 1纯PISO
nOuterCorrectors > 1PIMPLE(PISO+SIMPLE)
nOuterCorrectors大、nCorrectors=0纯SIMPLE

PIMPLE法的优势在于可大幅放宽CFL数限制。若nOuterCorrectors足够大,即使CFL >> 1也能稳定计算。


🧑‍🎓

也就是说PIMPLE法既能"用大时间步稳定计算",又能"保证时间精度",两者兼得?


🎓

不过增加nOuterCorrectors会增加每时间步的成本。若能保持CFL < 1,纯PISO(nOuterCorrectors=1)效率更高。


时间离散化方案的组合

🧑‍🎓

时间离散如何选择?


🎓

与PISO法配合的常见时间离散方案对比如下。


方案精度稳定性OpenFOAM名称
Euler隐式1阶无条件稳定Euler
2阶后向差分2阶无条件稳定backward
Crank-Nicolson2阶无条件稳定CrankNicolson

LES计算应使用2阶精度的backward或CrankNicolson。RANS定常的伪非定常(pseudo-transient)用Euler即可。


Coffee Break 杂谈

PIMPLE法——PISO与SIMPLE的"两全其美"实现

OpenFOAM用户肯定见过PIMPLE这个名字。它是PISO和SIMPLE的混合型混合算法。在一个时间步内既进行SIMPLE的外部迭代(PIMPLE循环),又进行PISO的内部压力修正。其最大优势是突破CFL < 1的束缚——即使CFL > 1也能稳定计算。也就是SIMPLE的"大时间步迅进"和PISO的"非定常精度"两大优点的融合。LES或复杂湍流的非定常解析中,当被CFL < 0.5~1的限制所困时,PIMPLE的价值就体现出来了。不过参数配置需要经验,当ΔtCFL达到设计值后,应该在计算的前几个周期反复调试nOuterCorrectors,找到"收敛足够、效率最高"的平衡点。

PISO法的实务应用

非定常CFD分析中的PISO实践

🧑‍🎓

用PISO法进行非定常分析时,配置步骤是什么?


🎓

以典型案例(Re=200圆柱绕流层流涡脱落)为例说明。


1步:时间步长的确定

从CFL条件确定时间步长:

$$ \Delta t = \frac{\text{CFL} \times \Delta x_{\min}}{|\mathbf{u}|_{\max}} $$

若CFL = 0.5、最小网格尺寸 0.001m、最大流速 2 m/s,则:

$\Delta t = 0.5 \times 0.001 / 2 = 0.00025$ s

2步:求解器配置

OpenFOAM情形:

```

PISO

{

nCorrectors 2;

nNonOrthogonalCorrectors 0;

}

```

Fluent情形:

  • Transient Formulation: Second Order Implicit
  • Pressure-Velocity Coupling: PISO
  • PISO Parameters: Skewness Correction = 1, Neighbor Correction = 1

3步:数据输出设置

🧑‍🎓

结果保存频率怎么定?


🎓

设涡脱落周期为 $T$,则每周期采样20~50个时刻即可。Strouhal数 $St \approx 0.2$ 时,$T = D / (St \times U)$ 可估算。


LES计算中的PISO设置

🧑‍🎓

LES(大涡模拟)计算时PISO配置要怎么改?


🎓

LES中空间与时间离散精度至关重要。


配置项推荐值理由
时间离散2阶(backward)保证时间精度
对流项2阶中心差分或混合减少数值耗散
CFL数< 1(理想≤0.5)控制分裂误差
nCorrectors2~3提高质量守恒精度
线性求解器残差$10^{-6}$高精度解
🧑‍🎓

LES中1阶风上不行吗?


🎓

1阶风上的数值粘性可能等于或超过LES的SGS(Sub-Grid Scale)粘性。这样就算解析了涡也会被数值耗散抹平。最低也要2阶,最好是中心差分类方案。不过中心差分无界,常用TVD限制器或混合方案(如linearUpwind)。


计算成本估算

🧑‍🎓

非定常计算要花多少机时?


🎓

大概这样。


分析类型网格规模时间步数典型CPU时间
2D涡脱落(层流)5万网格20,000数小时
3D RANS非定常500万网格10,000数天
3D LES2000万网格100,000数周
3D DNS数亿网格1,000,000+数月(需HPC)
🧑‍🎓

LES和DNS的成本差距好大。


🎓

DNS要解析到Kolmogorov尺度,网格数随 $Re^{9/4}$ 增长。工业应用一般用LES或DES(分离涡模拟)。


Coffee Break 杂谈

把时间步减小就精度高?——PISO的现实

"非定常CFD时间步越小越准确"这个想法很危险。PISO中Δt缩小10倍,计算成本也增加10倍,但精度不一定增加10倍。反而太小的Δt会导致舍入误差累积。实务中的黄金法则是"选择把CFL数控制在0.5~1范围内的Δt"。有个真实故事:某工程师用Δt = 1e-6秒来模拟1秒的管道压力瞬变,算出100万步要1个月。计算CFL后发现Δt = 1e-4就够了,结果改为1万步、1天完成。PISO的关键是"定好CFL,一步到位",过度精细化反而是浪费。

PISO法的软件比较

非定常求解器的实现对比

🧑‍🎓

各个CFD软件中PISO及其变种怎么实现?


🎓
求解器非定常算法时间精度自适应时间步
Ansys FluentPISO、SIMPLE系、耦合1阶/2阶有(全局CFL)
Ansys CFX耦合型+系数迭代2阶后向差分
STAR-CCM+SIMPLE系(含内部迭代)1阶/2阶
OpenFOAMPISO、PIMPLE1阶/2阶/C-N有(adjustTimeStep)

Ansys Fluent 的PISO

🎓

Fluent的PISO有"Skewness Correction"和"Neighbor Correction"两个参数。Skewness Correction修正网格歪斜,Neighbor Correction控制相邻单元值的更新循环。通常保持默认值(1)就够了。


Fluent 2020R2起推荐用Pressure-Based Coupled Algorithm的Transient版,比PISO收敛更稳健。


OpenFOAM 的PISO/PIMPLE

🎓

OpenFOAM按用途提供不同求解器:


求解器名用途算法
pisoFoam非压缩非定常纯PISO
pimpleFoam非压缩非定常(大CFL)PIMPLE
interFoamVOF两相流PIMPLE + VOF
buoyantPimpleFoam浮力驱动流PIMPLE + 能量方程

pimpleFoam 是最通用的,CFL限制宽松,实务中常作为首选。


STAR-CCM+ 的非定常设置

🎓

Star-CCM+选Implicit Unsteady模型后,用内部迭代次数(Inner Iterations)控制质量。时间离散可选1阶或2阶。内部迭代通常5~20次,LES时应确保各时间步残差充分下降。


移动网格的联动

🧑‍🎓

有转动或变形问题时怎么处理?


🎓

移动网格问题新增要求:GCL(几何守恒律)必须满足。PISO在时间步内的整合性好,与动网格兼容性优。


  • 滑动网格:旋转机械(风机、泵)的非定常分析
  • 动态网格/变形网格流体-结构耦合(FSI)
  • 重叠网格:大位移物体运动

OpenFOAM的dynamicMeshDict配合pimpleFoam最灵活。


Coffee Break 杂谈

Fluent的Transient SIMPLEC与OpenFOAM的pisoFoam——"非定常"实现哲学的差异

非定常求解器的选择因工具而异,名称与理念也不同。Fluent虽然用的是SIMPLE系(Transient SIMPLEC),内部也融入了PISO式补正,体现了混合思想。OpenFOAM则让用户明确选择pisoFoam或pimpleFoam,设计上更透明但也要求用户了解算法。Star-CCM+的"Segregated Solver"对非定常也适用,自适应时间步功能最完善。无论何种工具,理解"纯PISO"vs"PISO+SIMPLE混合"的本质区别会大大提升参数调试的效率。

PISO法的先进研究

PISO法在DNS/LES中的作用

🧑‍🎓

DNS和LES中PISO怎么应用?


🎓

有限体积法的DNS/LES中,PISO是压力-速度耦合的标准手段。特别是OpenFOAM的dnsFoam和pisoFoam在学术研究中广泛应用。


DNS中数值误差直接影响物理尺度,所以PISO各步的收敛准则极严(残差 $10^{-8}$ 以下)。


分数步长法的关系

🧑‍🎓

分数步长法(Fractional Step Method)和PISO是什么关系?


🎓

关系很密切。分数步长法(Chorin, 1968; Temam, 1969)分为:


1. 不含压力项的动量方程求仮速度

2. 求解压力Poisson方程

3. 修正速度达到无散


PISO可看作是该法在FVM上的实现。FEM体系(如Nek5000)叫分数步长法,FVM体系(OpenFOAM、Fluent)通常叫PISO。本质上是同一思想。


高阶精度FVM的组合

🧑‍🎓

怎样进一步提高空间精度?


🎓

标准FVM通常2阶精度,可用以下方法提高:


  • MUSCL重构:3阶梯度重构。OpenFOAM的linearUpwind接近
  • WENO(加权本质无振荡):3~5阶精度。可用于含激波的问题
  • 紧凑方案:高精度但并行困难

LES中滤波宽度由网格决定,高阶方案能扩大可解涡的范围。


谱元素法的比较

🧑‍🎓

除FVM的PISO外,还有其他非定常CFD方法?


🎓

谱元素法(SEM)在高精度DNS/LES中很重要。代表代码有Nek5000和NekRS。多项式次数N越高精度指数级增长(p-refinement)。


但SEM在复杂形状网格生成困难,工业应用仍以FVM的PISO/PIMPLE为主。最近GPU加速的NekRS(Argonne国家实验室)实现了10亿网格点级DNS。


PISO法的故障排查

PISO法的典型问题

🧑‍🎓

用PISO做非定常计算发散了,什么原因?


🎓

PISO发散的Top 5原因:


1. CFL数过大

🎓

症状:计算初期或流场展开后发散


对策

  • maxCo ≤ 0.5(OpenFOAM adjustTimeStep模式)
  • Fluent设Global Courant Number ≤ 1
  • 切换到PIMPLE,增加nOuterCorrectors

2. 初值条件不当

🎓

症状:最初几时间步即发散


对策

  • 先用SIMPLE求定常解作为初值
  • 速度不用零,用近似流场初始化
  • 湍流量(k, omega)从强度与长度尺度合理初始化

3. 出口逆流

🧑‍🎓

出口逆流会导致发散?


🎓

涡脱落等问题中出口常有局部逆流。


对策

  • 出口远离物体(物体宽度的20倍及以上)
  • OpenFOAM:用inletOutlet边界条件
  • Fluent:启用Backflow Direction Specification

4. 网格质量问题

🎓

PISO特别要注意的质量指标


指标许可范围PISO特别注意
非正交角度< 70°用nNonOrthogonalCorrectors修正
歪斜度< 0.85启用Skewness Correction
网格体积比< 10:1剧变易致压力振荡

5. 时间与空间离散的不协调

🎓

症状:计算稳定但结果非物理


原因:时间用2阶(backward),空间只用1阶风上 → 时间精度与空间精度脱节


对策:时间空间精度要对齐。时间2阶则空间也应2阶以上。


PISO vs PIMPLE 的选择判断

🧑‍🎓

什么时候该用PISO,什么时候用PIMPLE?


🎓
条件推荐理由
能维持CFL < 1PISO简洁高效
想要CFL > 1PIMPLE外部迭代稳定化
移动网格PIMPLE大位移时CFL常超限
LES/DNS(学术)PISOCFL控制下最高效
工业LESPIMPLE鲁棒性优先
🧑‍🎓

也就是说拿不准就用PIMPLE是稳的,要精度就用PISO?


🎓

没错。PIMPLE的nOuterCorrectors=1其实就是PISO,所以初期用PIMPLE开始,稳定后减少nOuterCorrectors也是一策。


Coffee Break 杂谈

"用PISO算非定常,压力还在振荡" ——常见陷阱

用PISO非定常计算时,压力场出现锯齿状振荡——这类问题不少见。多数原因是"nCorrectors(修正循环)设成1"。默认为1的求解器中,每步只修正压力一次,PISO的真正优势发挥不出来。改为2~3次,振荡往往就消失了。另一常见陷阱是"边界条件的时间非协调"——入口条件若随时间阶梯式变化,这种不连续会在PISO循环中被放大。诊断PISO问题的黄金法则是:先看"参数设置"(nCorrectors等),再看"边界时间协调性"。

相关模拟工具

通过本领域的交互式模拟器感受理论

模拟器列表

相关领域

热分析V&V·质量保证结构分析
文章评价
感谢反馈!
有参考
价值
希望更
详细
报告
错误
有参考价值
0
希望更详细
0
报告错误
0
由NovaSolver贡献者撰写
匿名工程师 & AI —— 网站地图
查看资料