PISO法
理论与物理
PISO法概述
老师,PISO法和SIMPLE法有什么区别?
PISO(Pressure-Implicit with Splitting of Operators)是Issa于1986年提出的压力-速度耦合算法。与SIMPLE法需要通过多次外部迭代来收敛不同,PISO法在一个时间步内进行两次压力修正,无需外部迭代即可确保时间精度。
不需要外部迭代,是不是在非稳态计算中更有优势?
PISO算法步骤
请告诉我具体步骤。
PISO法按以下步骤进行。
Step 1: 动量预测步(Predictor)
使用前一时间步的压力 $p^n$ 求解动量方程,得到中间速度 $\mathbf{u}^*$:
Step 2: 第一压力修正步(First Corrector)
修正速度: $\mathbf{u}^{**} = \frac{H(\mathbf{u}^*)}{a_P} - \frac{1}{a_P}\nabla p'$
Step 3: 第二压力修正步(Second Corrector)
最终速度: $\mathbf{u}^{n+1} = \frac{H(\mathbf{u}^{**})}{a_P} - \frac{1}{a_P}\nabla(p' + p'')$
与SIMPLE法只有一次压力修正并需要外部迭代不同,PISO法通过两次修正就完成了呢。
准确地说,PISO的第二次修正反映了相邻单元系数 $H$ 的更新,从而改善了SIMPLE的省略近似。结果是不再需要松弛系数,并且保持了时间精度。
与SIMPLE法的理论比较
我们来整理一下两者的本质区别。
| 特性 | SIMPLE | PISO |
|---|---|---|
| 压力修正次数 | 1次/外部迭代 | 2次(或以上)/时间步 |
| 外部迭代 | 需要(10~数百次) | 不需要 |
| 松弛系数 | 需要(0.2~0.8) | 不需要 |
| 主要用途 | 稳态计算 | 非稳态计算 |
| 时间精度 | 伪时间推进 | 真实时间精度 |
| CFL限制 | 无(隐式) | 推荐CFL < 1~5 |
PISO法也有CFL数的限制吗?它不是隐式的吗?
时间离散本身是隐式的,但为了通过PISO的两次修正充分减少分裂误差,需要将CFL数控制在一定的范围内。实用上CFL < 1是安全的,最大推荐CFL < 5左右。CFL数过大会导致精度下降。
PISO在非稳态计算中强于SIMPLE的“数学原因”
PISO法(Pressure Implicit with Splitting of Operators)与SIMPLE法的决定性区别在于“在一个时间步内进行两次或以上的压力修正”。在非稳态流动中,由于一个时间步内流动变化很大,仅靠一次压力修正无法完全满足连续性方程(质量守恒)。PISO通过第二次修正,几乎可以将速度场的质量守恒误差降至零——这就是其理论上的优势。心脏瓣膜开闭模拟、发动机气缸内燃烧流等“流动瞬时变化”的问题之所以选择PISO,原因就在于此。稳态分析用SIMPLE,非稳态用PISO,这种区分使用至今仍是有效的基本策略。
各项的物理意义
- 时间项 $\partial(\rho\phi)/\partial t$:想象一下打开水龙头的瞬间。最初水流会不稳定地喷溅,过一会儿才会变成稳定的水流,对吧?描述这个“变化过程中”的就是时间项。心脏搏动导致血流脉动,发动机阀门每次开闭引起流动变化,这些都是非稳态现象。那么稳态分析是什么?就是只看“经过足够长时间流动稳定之后”——也就是将此项设为零。由于计算成本大幅降低,先用稳态求解是CFD的基本策略。
- 对流项 $\nabla \cdot (\rho \mathbf{u} \phi)$:把落叶扔进河里会怎样?会被水流带着往下游漂,对吧?这就是“对流”——流体运动搬运物质的效果。暖风的暖气能到达房间的另一端,也是因为空气这个“搬运工”通过对流输送热量。这里有趣的是——这项包含“速度×速度”,因此是非线性的。也就是说,流速变快时此项会急剧增强,变得难以控制。这就是湍流的根本原因。常见的误解:“对流和传导差不多吧?”→ 完全不一样!对流是流动搬运,传导是分子传递。效率有天壤之别。
- 扩散项 $\nabla \cdot (\Gamma \nabla \phi)$:有过在咖啡里倒入牛奶后放置的经历吗?即使不搅拌,过一会儿也会自然混合。那就是分子扩散。那么下一个问题——蜂蜜和水,哪个更容易流动?当然是水。因为蜂蜜的粘度($\mu$)高,所以不易流动。粘度越大,扩散项越强,流体的运动就越“粘稠”。雷诺数小的流动(缓慢、粘稠)中扩散占主导。相反,Re数大的流动中,对流占压倒性优势,扩散则成为配角。
- 压力项 $-\nabla p$:按压注射器的活塞,液体就会从针头有力地射出,对吧?为什么呢?因为活塞侧压力高,针头侧压力低——这个压力差产生了推动流体的力。大坝放水也是同样的原理。天气图上等压线密集的地方会怎样?没错,会刮强风。“有压力差的地方就会产生流动”——这就是纳维-斯托克斯方程压力项的物理意义。这里容易误解的点是:CFD中的“压力”通常指表压而非绝对压力。切换到可压缩分析时结果突然出错,原因可能就是混淆了绝对压力/表压。
- 源项 $S_\phi$:受热的空气会上升——为什么呢?因为比周围空气轻(密度低),被浮力推上去了。这个浮力作为源项添加到方程中。此外,燃气灶火焰产生化学反应热、工厂电磁泵对金属熔液施加洛伦兹力……这些都是“从外部向流体注入能量或力”的作用,都用源项表示。忘记源项会怎样?自然对流分析中忘记加入浮力,流体就完全不动——就像冬天在房间里开了暖气,暖空气却不上浮,得到这种物理上不可能的结果。
假设条件与适用范围
- 连续介质假设:克努森数 Kn < 0.01(分子平均自由程 ≪ 特征长度)时成立
- 牛顿流体假设:剪切应力与应变速率呈线性关系(非牛顿流体需要粘度模型)
- 不可压缩假设(Ma < 0.3时):将密度视为常数。马赫数0.3以上需考虑可压缩性效应
- Boussinesq近似(自然对流):仅在浮力项中考虑密度变化,其他项使用恒定密度
- 不适用情况:稀薄气体(Kn > 0.1)、超音速/高超音速流动(需要激波捕捉)、自由表面流动(需要VOF/Level Set等)
量纲分析与单位制
| 变量 | SI单位 | 注意事项·换算备忘 |
|---|---|---|
| 速度 $u$ | m/s | 入口条件从体积流量换算时,注意截面积单位 |
| 压力 $p$ | Pa | 区分表压与绝对压力。可压缩分析使用绝对压力 |
| 密度 $\rho$ | kg/m³ | 空气: 约1.225 kg/m³@20°C、水: 约998 kg/m³@20°C |
| 粘性系数 $\mu$ | Pa·s | 注意与运动粘性系数 $\nu = \mu/\rho$ [m²/s] 混淆 |
| 雷诺数 $Re$ | 无量纲 | $Re = \rho u L / \mu$。层流/湍流转换的判定指标 |
| CFL数 | 无量纲 | $CFL = u \Delta t / \Delta x$。直接关系到时间步长的稳定性 |
数值解法与实现
PISO法实现细节
实现PISO法时,H算子是什么?
这是在OpenFOAM语境中常见的表述。将动量方程离散化得到:
这里定义 $H(\mathbf{u}) = -\sum_N a_N \mathbf{u}_N + \mathbf{b}$。于是:
写成这种形式后,速度就可以表示为压力梯度的函数。将其代入连续性方程,就能得到压力的泊松方程。
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 > 1 | PIMPLE(PISO+SIMPLE) |
| nOuterCorrectors大、nCorrectors=0 | 纯SIMPLE |
PIMPLE法的优点是可以大幅放宽CFL数限制。只要nOuterCorrectors足够大,即使CFL >> 1 也能稳定计算。
也就是说PIMPLE法“即使时间步长较大也稳定”且“能确保时间精度”,是取两者之长呢。
不过增加nOuterCorrectors会增加每个时间步的成本。如果CFL < 1,纯PISO(nOuterCorrectors=1)效率更高。
时间离散格式的组合
时间离散化应该怎么做?
我们来比较一下与PISO法组合的常用时间离散格式。
| 格式 | 精度 | 稳定性 | OpenFOAM名称 |
|---|---|---|---|
| 隐式欧拉 | 1阶 | 无条件稳定 | Euler |
| 二阶向后差分 | 2阶 | 无条件稳定 | backward |
| Crank-Nicolson | 2阶 | 无条件稳定 | CrankNicolson |
LES计算应使用二阶精度的 backward 或 CrankNicolson。RANS稳态计算的伪非稳态(pseudo-transient)用 Euler 就足够了。
PIMPLE法——融合PISO与SIMPLE优点的“取长补短”实现
用过OpenFOAM的人应该都见过PIMPLE这个名字。这是结合了PISO和SIMPLE的混合算法。其结构是在一个时间步内进行SIMPLE式的外部迭代(称为PIMPLE循环),同时在该循环内进行PISO的内部压力修正。其最大的优势是即使CFL数超过1也能稳定推进计算——也就是说,它兼具了SIMPLE“用大时间步长推进”的优点和PISO的“非稳态精度”。在LES或湍流的非稳态分析中,如果受限于CFL=0.5~1而感到困扰……这种场合下,这个实用的实现就非常宝贵。
迎风格式(Upwind)
一阶迎风:数值扩散大但稳定。二阶迎风:精度提高但有振荡风险。高雷诺数流动中必备。
中心差分(Central Differencing)
二阶精度,但Pe数 > 2时会产生数值振荡。适用于低雷诺数的扩散主导流动。
TVD格式(MUSCL、QUICK等)
通过限制器函数抑制数值振荡同时保持高精度。对捕捉激波或陡峭梯度有效。
有限体积法 vs 有限元法
FVM:自然满足守恒定律。CFD的主流。FEM:对复杂形状·多物理场有利。SPH等无网格法也在发展中。
CFL条件(库朗数)
相关主题
なった
詳しく
報告