做CFD的兄弟应该都有过这种纠结:同样是处理压力-速度耦合,为什么有的算例用PISO一切正常,换个工况就振荡到飞起?为什么隔壁组说SIMPLEC收敛快,你换上之后反而残差卡住不动了?这俩算法看着差不多,实际用起来却经常一个天一个地。
这篇就专门掰扯PISO和SIMPLEC。我会从算法最底层的迭代结构讲起,区分它们的适用边界,然后落到OpenFOAM里具体怎么配、怎么调、怎么排查发散。内容会偏工程向,适合正在跑算例、被收敛性搞得头疼的CFDer,也适合刚接触压力-速度耦合算法、想系统搞懂原理的研究生。
先说个结论放在前面:PISO更擅长瞬态计算中保持时间精度,SIMPLEC则在稳态问题里能用更大的松弛因子实现更快的收敛。但这只是粗略印象,具体为什么、什么时候选谁、怎么调参数,下面详细展开。
1. 两种算法的设计初衷与核心差异
1.1 从SIMPLE说起:压力修正的基本逻辑
要理解PISO和SIMPLEC,必须先搞清楚SIMPLE(Semi-Implicit Method for Pressure Linked Equations)算法到底做了什么。SIMPLE算法的核心思路是预测-修正两步走:
- 先用当前压力场求解动量方程,得到一个不满足连续方程的预测速度场;
- 然后构造压力修正方程,通过修正压力来修正速度,使得修正后的速度尽量满足连续方程。
这个过程听起来很顺,但里面有一个关键假设:在修正压力的时候,忽略了邻近单元速度修正对压力修正方程的影响。换句话说,SIMPLE默认“邻居单元的速度修正量之和为零”。这个假设在稳态计算中是可以接受的,因为反正要迭代很多次,误差会在外迭代中被慢慢磨掉。但在瞬态计算里,每个时间步只推进一次,误差没法充分消除,就会导致压力场和速度场不匹配,时间精度明显下降。
这一点特别重要,后面理解PISO为什么要分成两三次修正就会容易很多。SIMPLE的创始人Patankar和Spalding当年设计它的时候,本来就是冲着稳态问题去的,所以这个假设在那个场景下完全合理。但后来大家发现它不适合瞬态,才慢慢衍生出PISO和SIMPLEC这两种改进版本。
1.2 PISO的两次修正到底在修什么
PISO(Pressure Implicit with Splitting of Operators)是Issa在1986年提出的,它的核心思想是在SIMPLE的基础上多做一次或多次压力修正。具体流程是这样的:
- 第一步和SIMPLE一样,用预测的压力场求解动量方程,得到预测速度;
- 第二步求解第一个压力修正方程,得到压力修正量,更新压力和速度;
- 第三步再次求解压力修正方程,但这次方程右侧的源项不再包含邻居速度修正的近似,而是直接用上一步修正后的速度场重新计算质量通量残差。
关键在于第二次修正。第一次修正之后,压力场和速度场其实已经基本满足连续方程了,但压力方程推导时省略的邻居速度修正项造成了压力场本身的误差。PISO通过第二次修正把这个误差显式地补偿回来,所以它的压力场更准确、速度场更自洽,而且不需要像SIMPLE那样反复外迭代。
PISO这个名字里的“Splitting of Operators”指的就是这种算子分裂的思路:把压力修正方程和动量方程解耦,各自独立求解,而不是耦合在一起迭代。这种分裂方式在瞬态计算中很有效,因为它让每个时间步内的变量更新都保持一致的精度,不会因为多次外迭代而引入额外的时间误差。
1.3 SIMPLEC修正了什么
SIMPLEC(SIMPLE-Consistent)是Van Doormaal和Raithby在1984年提出的,比PISO还早两年。它的出发点很简单:SIMPLE在压力修正方程中忽略邻居速度修正的时候,这个忽略并不总是合适。尤其是在网格长宽比很大的边界层区域,邻居修正的影响往往不能忽略,导致压力修正方程被低估,收敛速度变慢。
SIMPLEC的做法是:在压力修正方程的推导中,不再完全忽略邻居速度修正,而是用一个近似方式把它的一部分贡献纳入主对角系数中。具体来说,SIMPLEC把“邻居速度修正量的和”近似表示为“修正压力的加权和”,这样得到的压力修正方程比SIMPLE的更接近完整形式,因此压力修正量更准确,修正之后的速度场更接近真实解。
这意味着什么?意味着在同样的松弛因子设置下,SIMPLEC可以承受比SIMPLE更大的压力松弛因子,甚至可以不松弛压力(pressure relaxation factor设为1)也能稳定迭代。这一点在稳态计算中非常有用,因为SIMPLE每轮迭代的压力修正量是保守的,SIMPLEC每轮能走更大的一步,收敛自然更快。
不过SIMPLEC也有它的代价:它本质上还是迭代法,需要在每个迭代步中逐步逼近解,所以不适合做瞬态计算的时间推进。如果非要用它来跑瞬态,每个时间步内就需要多次外循环来达到收敛,计算量会显著增加。
2. 选型判断:什么场景用什么算法
2.1 瞬态vs稳态:最核心的决策维度
选PISO还是SIMPLEC,第一个要问的问题是:你的算例是瞬态还是稳态?
瞬态算例首选PISO。原因我前面提到了,PISO通过每个时间步内的多次修正,让压力场和速度场在当前时刻保持自洽,避免时间精度被破坏。在LES、DES这类涡分辨模拟中,时间步长通常取得很小,每个时间步内的非线性变化不大,PISO的两三次修正足够把压力-速度耦合处理到位。如果在这个场景下用SIMPLEC,为了保证每个时间步的压力-速度耦合精度,就必须在每个时间步内套多个外迭代循环,而且每步的迭代次数还不容易预先估计,整体计算效率会明显下降。
稳态算例就反过来。稳态计算的目的只有一个:尽快收敛到最终解,中间过程怎么走的不重要。SIMPLEC因为可以用更大的松弛因子,每轮迭代推进更多,所以在稳态计算中通常比SIMPLE收敛更快。如果你用的是基于SIMPLE家族的稳态求解器,比如simpleFoam,把松弛因子调大一点,配合SIMPLEC,稳态收敛速度的提升会比较明显。
2.2 网格质量与压力修正的敏感度
除了瞬态和稳态,网格质量也是一个重要的判断维度。PISO的压力修正方程对网格质量比较敏感,尤其是高度倾斜或拉伸的非正交网格,PISO在压力修正步骤中容易出现压力场振荡。这不是PISO本身的问题,而是任何基于投影法的压力修正算法都会遇到的共性——压力方程离散时对非正交项的显式处理会引入误差源。
我的经验是:在四面体网格或质量较差的非结构网格上,如果算瞬态,PISO往往是唯一的实用选择(SIMPLEC在瞬态上本来就不合适),但对非正交修正(nonOrthogonalCorrectors)要特别上心,不能直接沿用正交网格的参数。这部分的处理细节后面在OpenFOAM配置部分专门讲。
在结构化的高质量六面体网格上跑稳态问题,SIMPLEC的优势会更突出。因为网格正交性好,压力修正方程离散误差小,SIMPLEC大步长修正的优势能充分发挥,收敛曲线会很光滑。
2.3 计算开销的理性比较
很多资料会说PISO比SIMPLEC贵,但其实这种说法太笼统。PISO每个时间步内要解多次压力泊松方程(通常2到3次),但这只是瞬态计算一个时间步的开销。如果你的瞬态算例时间步数很大,比如LES跑了数十万步,那PISO多出来的压力修正开销是可控的,因为每步只需要3次压力修正,不会随计算进程增长。
SIMPLEC在稳态计算中每轮迭代只需要解一次压力方程,但每轮之外还要多做一些邻居修正相关的系数计算。在OpenFOAM的实现里,SIMPLEC实际上会修改动量方程的离散系数(具体是调整主对角元和源项),这部分额外操作在每轮迭代中都有固定开销。总体来看,SIMPLEC单轮迭代的计算量比SIMPLE稍大,但因为它需要的迭代轮数更少,总计算量通常反而更低。
真正要小心的是用SIMPLEC跑瞬态。如果非要在瞬态中用SIMPLEC,每个时间步内可能需要5到10次甚至更多外循环才能让压力-速度耦合充分收敛,每次外循环都要重算动量方程和压力方程,这个开销比PISO的固定3次修正大得多,而且很难提前设置正确的循环次数。
下面用一张表把这几个关键对比维度理清楚:
| 对比维度 | PISO | SIMPLEC |
|---|---|---|
| 适用场景 | 瞬态计算为主 | 稳态计算为主 |
| 每步/每轮压力方程求解次数 | 2~3次修正 | 1次修正+系数调整 |
| 邻居速度修正处理 | 通过多次修正显式补偿 | 纳入压力修正方程推导 |
| 压力松弛因子要求 | 通常需要0.3~0.7 | 可以设得很大甚至不松弛 |
| 对非正交网格的敏感度 | 较敏感,需配合非正交修正 | 相对不敏感 |
| 时间精度 | 高,适合LES/DES/URANS | 低,主要用于收敛终值 |
| 迭代法本质 | 非迭代型,每步推进 | 迭代型,需逐步逼近 |
3. 在OpenFOAM里配置PISO与SIMPLEC
3.1 fvSolution文件中的关键参数
不管是PISO还是SIMPLEC,在OpenFOAM里都通过fvSolution文件控制。很多刚上手的人会在system目录下的fvSolution里看到一堆参数,不知道怎么对应到算法。这里逐个讲清楚,先看一个典型的瞬态PISO配置:
solvers { p { solver PCG; preconditioner DIC; tolerance 1e-06; relTol 0.01; } pFinal { solver PCG; preconditioner DIC; tolerance 1e-06; relTol 0; } U { solver PBiCGStab; preconditioner DILU; tolerance 1e-06; relTol 0.01; } } PISO { momentumPredictor yes; nOuterCorrectors 1; nCorrectors 2; nNonOrthogonalCorrectors 0; }这里的重点在PISO子字典的四个参数:
- momentumPredictor:控制每个时间步开始前是否先用已知压力场求解一次动量方程。建议设为yes,尤其是在高雷诺数流动中,因为这个预测步给后面压力修正一个合理的速度初值,能显著提高稳定性。
- nCorrectors:压力修正次数。瞬态计算的常用值是2,即做两次压力修正。如果算例比较简单、网格质量好,1次也能勉强跑,但压力场时间精度会下降;如果流场很复杂或者时间步长偏大,可以设到3。
- nOuterCorrectors:外循环次数。PISO在标准形式下这个值应该为1,因为在每个时间步内PISO不依赖外循环迭代收敛,而是靠内修正保证耦合。如果设大于1,实际上就变成了PIMPLE算法。
- nNonOrthogonalCorrectors:每次压力修正时对非正交项的显式修正次数。网格正交性好的时候设0,非正交网格上需要设1到2。
再看一个典型的稳态SIMPLEC配置:
SIMPLEC { momentumPredictor yes; nNonOrthogonalCorrectors 1; rhoMin 0.01; rhoMax 1.0; consistent yes; }注意这里用的是SIMPLEC关键字而不是SIMPLE。consistent yes就是告诉求解器采用SIMPLEC的一致性近似,这会让代码在离散动量方程的时候调整系数矩阵,容忍更大的松弛因子。
3.2 fvSolution里松弛因子的设置逻辑
很多人对relaxationFactors的设置比较随意,但这其实直接影响算法成败。先看PISO场景:
relaxationFactors { equations { U 0.5; UFinal 0.5; k 0.5; kFinal 0.5; epsilon 0.5; epsilonFinal 0.5; } }PISO作为瞬态算法,理论上不需要松弛。但在实际URANS计算中,尤其是k-epsilon这类双方程湍流模型,如果不加一点松弛,湍流量的时间推进很容易出现负值或振荡。我的习惯是对湍流量方程加0.5左右的线性松弛,而U和p不加松弛。压力方程在OpenFOAM中没有显式松弛一说,它是通过nCorrectors和nNonOrthogonalCorrectors隐式控制的。
稳态SIMPLEC的松弛因子设置跟PISO差别很大。典型的设置是:
relaxationFactors { fields { p 0.7; U 0.7; k 0.7; epsilon 0.7; } equations { U 0.7; k 0.7; epsilon 0.7; } }在SIMPLEC中,压力场p的松弛因子可以设得比较大,甚至可以设成1.0。这是因为SIMPLEC的一致性修正已经补偿了压力修正方程中被忽略的邻居项,所以压力修正量本身已经足够准确,不需要再用松弛来限制步长。如果你在SIMPLEC中把p的松弛因子设得很小(比如0.3),反而会抵消SIMPLEC的收敛加速优势,让迭代变慢。
U的松弛因子在SIMPLEC中也可以比SIMPLE设得更大。SIMPLE中U的松弛通常只有0.5到0.7,SIMPLEC可以放到0.8甚至0.9。但这里有个度的问题:如果算例里有强分离流或者激波等强非线性现象,U松弛因子太大照样会发散,该保守的时候还是要保守。
3.3 时间步长选择与库朗数的配合
PISO在瞬态计算中能不能稳定运行,很大程度上取决于时间步长是否合适。很多人对库朗数(Courant number)没有概念,直接拍脑袋给时间步长,结果一跑就不稳定,还以为是算法有问题。其实PISO对库朗数的容忍度是有限度的,这一点要讲清楚。
标准PISO算法在小库朗数下表现良好,建议最大库朗数控制在1以下,最好在0.5左右。库朗数的定义是:
Co = |U| * dt / dx也就是一个时间步内流体穿越的网格数。Co小于1意味着流体在一个时间步内最多走一个网格,这样压力信息传播的时间尺度不会超过网格尺度,压力修正才能在每个时间步内有效。如果你的算例平均流速是10 m/s,最小网格尺寸是1 mm,那么库朗数0.5对应的最大时间步长大约就是0.00005秒(5e-5 s),也就是:
dt = Co * dx / |U| = 0.5 * 0.001 / 10 = 5e-5 s这个公式很简单,但很多人就是不愿意算这一步。我见过大量PISO发散案例,归根结底就是时间步长太大,库朗数跑到5以上,PISO的两次压力修正根本不足以让压力波在步内传播完毕,压力场自然就炸了。
如果你确实需要大时间步长,应该考虑PIMPLE而不是PISO。PIMPLE允许在每个时间步内做多个外循环,本质上就是PISO加上SIMPLE式的外迭代,通过增大nOuterCorrectors来让每个时间步内的求解完全收敛,从而突破库朗数限制。这是另一个话题,这里就不展开了。
4. 实操中常见的收敛性问题与排查方法
4.1 压力场振荡:从参数到网格的系统排查
压力场振荡可以说是PISO用户遇到最多的问题。现象很典型:速度残差一路下降,看起来一切正常,但压力残差在某个数量级上卡住不动,或者压力场在局部出现棋盘式的正负交替分布。这种情况我在实际算例中遇到过很多次,排查路径基本是固定的。
先查nNonOrthogonalCorrectors。如果你用的是四面体网格或者高度非正交的六面体网格,而nNonOrthogonalCorrectors却设成0,那压力方程离散时非正交项没有被显式修正,产生的误差就会表现为压力场振荡。把nNonOrthogonalCorrectors改成1或2通常能立刻看到压力残差下降。但要注意,这个参数每增加1,每一步就要多解一次压力方程,计算开销直接增加,所以不能盲目加大,够用就行。
第二个要查的是压力方程的求解精度。OpenFOAM中pFinal的tolerance一般要设得比p更严格。如果pFinal的relTol设成0.01,意味着压力残差只需要降到初始残差的1%就算收敛,这个精度在PISO的第二次修正中可能不够。我的习惯是pFinal的relTol设0,用绝对tolerance控制在1e-6,这样每个时间步内最后一步压力求解是真正收敛的,对后面速度场的连续性有很大帮助。
第三查网格质量。如果你划分的网格中存在大量非正交角超过70度的单元,光靠nNonOrthogonalCorrectors可能压不住振荡。这时候要么重新做网格,要么使用更高精度的离散格式(比如在压力方程中用修正后的面通量插值格式)。网格质量差的问题不能靠算法参数完全弥补,这句话在CFD里是真理。
4.2 SIMPLEC收敛停滞与发散原因
SIMPLEC稳态计算常见的问题是:算了几百步之后,残差就卡在一个平台上,不再下降。很多人这个时候会去调松弛因子,但效果不大,因为问题往往不在松弛因子,而在速度-压力耦合之外的环节。
最常见的原因是动量方程的对流项离散格式太耗散。如果你用的是first-order upwind格式,数值粘性会非常大,流场中的细小结构被抹平,表现为残差台阶。解决方法是换成second-order的线性迎风格式(linearUpwind)或者Gamma格式。但注意,二阶格式在高分辨率网格上没问题,在粗网格上却可能因为过冲引起振荡,需要配合限制器使用。
另一个容易被忽略的原因是计算域出口边界条件设置不当。SIMPLEC在稳态计算中,出口的压力和速度边界条件必须协调。如果出口用固定压力而入口用固定速度,那么质量和动量必须通过整个计算域收敛来匹配,收敛过程会非常慢。这种情况下,即使算法和离散都没有问题,残差也会长时间停留在某个水平。我处理这类问题的方法是把入口边界条件改成totalPressure,或者检查出口的质量流量是否与入口匹配。
还有一个比较少见的陷阱:在SIMPLEC中同时启用了consistent yes,但场松弛因子仍然按照SIMPLE的惯例来设置,尤其是p的松弛因子设成0.3。前面说过,SIMPLEC的优势就是能吃大松弛因子,你把它当成SIMPLE用,等于主动放弃了优势,收敛自然快不起来。这种情况,如果你发现残差降得特别慢,不妨试试把p的松弛因子直接设成1.0,U设成0.8,看残差曲线有什么变化。
4.3 发散时的应急处理步骤
如果计算已经在跑了,突然看到残差爆涨,或者在某个时间步上NaN了,第一反应先别急着改算法或松弛因子,按照下面的顺序来查:
- 先看最后一个成功时间步的流场输出,定位发散是从哪个区域开始的。如果发散点集中在某个局部区域,优先检查那个区域的网格质量和边界条件;
- 检查是否发生了库朗数过大。在瞬态计算中,这几乎是发散的最常见原因。把时间步长缩小一半重新跑,如果残差稳定下来,说明问题就出在时间步长上;
- 检查湍流量的边界是否出现了负值或非物理值。如果epsilon或k出现了负值,尝试降低湍流量方程的松弛因子,或者开启limitTemperature/limitVelocity这类辅助限制;
- 如果以上都查过还是发散,考虑是不是压力修正次数不够,增加nCorrectors到3试试;
- 最后再考虑调整离散格式,把动量方程从二阶格式降为一阶格式看看是否稳定。如果降格式后稳定,说明问题在于网格不足以支持二阶格式,需要对网格加密或者调整网格质量。
这几个步骤按顺序排查,基本能覆盖绝大多数发散场景。切忌一上来就大刀阔斧地同时改多个参数,那样即使算定了也不知道是哪个修改起的作用。
5. OpenFOAM中的算法代码路径与补充配置
5.1 pimpleFoam与simpleFoam的内部逻辑
如果要对这两个算法有更深的理解,最好对求解器内部代码有一定了解。OpenFOAM中PISO和SIMPLEC的主要实现藏在pimpleFoam和simpleFoam的源码里。两者共享一套压力修正框架,但循环结构不同。
pimpleFoam中的核心循环可以理解为:
while (runTime.run()) { runTime++; // --- Pressure-velocity PIMPLE corrector loop for (int oCorr = 0; oCorr < nOuterCorrectors; oCorr++) { // --- Momentum predictor if (momentumPredictor) { solve(UEqn == -fvc::grad(p)); } // --- Pressure corrector loop for (int corr = 0; corr < nCorr; corr++) { // 更新压力方程源项并求解 } } }注意这里的nOuterCorrectors如果等于1,那这个循环就是纯PISO(或PIMPLE的简化形式);如果大于1,就有多个外循环,每个外循环内还会做若干次压力修正,这种形式可以理解为PISO与SIMPLE外迭代的结合,来自OpenFOAM官方文档的标准说法是PIMPLE算法。
simpleFoam中的核心逻辑如下:
while (simple.loop(runTime)) { // --- Pressure-velocity SIMPLE corrector { // 动量预测 if (momentumPredictor) { solve(UEqn == -fvc::grad(p)); } // 压力方程求解 // 速度修正 // 通量修正 } // 湍流方程求解 runTime.write(); }这个循环的每次迭代对应一个SIMPLE或SIMPLEC迭代步。如果你在fvSolution里写的是SIMPLEC并且consistent yes,那UEqn的系数矩阵在求解前会经过一次一致性处理,算法就会走SIMPLEC的路径。
5.2 湍流模型与算法的适配问题
压力-速度耦合算法的选择还会跟湍流模型产生交互作用,这一点常被忽略。以k-omega SST模型为例,这个模型在近壁面区域有较强的非线性源项,对速度和压力场的瞬态变化非常敏感。在PISO的瞬态计算中,如果湍流量的松弛因子设得太大(比如0.9),SST模型的压力应变项很容易产生数值振荡,反过来污染主流动的收敛性。我的经验是,k和omega的松弛因子在PISO中保持在0.4到0.6之间比较稳。
在SIMPLEC稳态计算中,湍流模型的迭代与主流动迭代之间的耦合方式也很关键。simpleFoam中这个顺序是先更新流场、再解湍流方程,每个外迭代走一遍。如果你把湍流方程的求解精度设得过高(relTol太低),代价很大但收敛加速并不明显。反而是在湍流模型迭代还不充分的时候,盲目减小主流动的残差控制阈值意义不大。
另外提一个实际的建议:无论是PISO还是SIMPLEC,在刚开始计算的前几百步(或前几十个时间步),可以先把动量方程的对流项用一阶迎风跑起来,等流场初值建立之后再切换为二阶格式。这种策略能显著提高初始阶段的稳定性。在OpenFOAM中可以用potentialInitialization或设置分段式的fvSchemes来控制,虽然麻烦一点,但对于复杂外形的算例非常值得做。
6. 工程实战中的选型建议与经验速查
6.1 一个实际选型决策表
前前后后讲了这么多,最终还是要落到选型这个动作上。如果你现在拿到一个新算例,不知道怎么选,可以参考下面这个决策流程:
- 如果算例是瞬态的,直接选PISO(或PIMPLE),不用犹豫;
- 如果算例是稳态的,网格质量较好,优先选SIMPLEC;
- 如果算例是稳态的但网格质量一般,先尝试SIMPLEC,如果出现压力振荡或收敛停滞,再回到SIMPLE;
- 如果算例是稳态的而且有强分离流、强旋流等复杂流动结构,SIMPLE配合适度的松弛因子可能比SIMPLEC更稳;
- 如果是动网格或流固耦合问题,优先PIMPLE,因为它有更灵活的外循环控制。
这个决策表不是死规则,但它覆盖了大部分实际工程场景的初始选择。真正跑起来之后,还是要盯着残差曲线和关键监测点(比如某个位置的升力系数、监测点的速度)灵活调整。
6.2 我踩过的一些坑
最后分享几个我个人的实操经验,都是拿代价换来的。
第一,PISO的nCorrectors不是越大越好。有人觉得压力修正多做几次肯定更准,于是设了5次。但实际上,当压力修正超过3次后,继续增加修正次数带来的精度提升微乎其微,计算开销却线性增长,而且在高库朗数下还可能因为每次都基于同一个预测速度场而引入伪振荡。我在自己的算例中通常用2次,复杂工况最多3次。
第二,SIMPLEC的consistent yes不是所有情况都该开。在低雷诺数、层流、旋转机械这类流动较温和的算例中,开consistent能明显加速收敛。但在高雷诺数、强激波、强分离这类非线性很强的算例中,consistent修正反而可能让压力修正量过大,导致稳定性下降。遇到这类算例,如果SIMPLEC发散,先把consistent改成no试试。
第三,不要迷信残差曲线的绝对值。OpenFOAM的残差定义是归一化的,不同算例之间没有可比性。我见过有人死磕把残差压到1e-8,跑了上万个迭代步,其实算出来的结果跟1e-4时几乎一样。稳态计算的经验是,关注点应该放在关键物理量(气动系数、监测点压力等)是否稳定,而不仅是残差数量级。瞬态计算则应该关注每个时间步内的压力修正收敛情况,而不是只看全局残差。
第四,备份每个能稳定运行的配置。我自己的习惯是,每次调参算出一个稳定、收敛良好的配置,就把fvSolution、fvSchemes和边界条件文件打包备份,备注好工况参数。这比任何文档都管用。换网格、换流速、换介质之后,前一个稳定配置往往是新算例最好的起点。CFD调参赛场里,一个好的初始参数组合能省下大量试错时间。
另外想强调的是,算法选型和参数调试只是CFD工作的一部分。网格质量、边界条件设定、物理模型选择,这些共同决定了最终仿真结果的可信度。算法选得再对,网格拉胯、湍流模型不合适,结果一样没法看。所以在纠结PISO还是SIMPLEC之前,先确认你的网格和物理模型没有硬伤,这样调算法才有意义。
根据我自己的经验,把基础的算法原理彻底搞明白,比记一堆"经验参数"要有用得多。理解了PISO为什么需要两次修正、SIMPLEC为什么能吃大松弛因子,你在新算例面前就能自主判断怎么调参数,而不是翻旧算例照着抄,也不知道为什么那样设置能work。这才是写这篇长文真正的出发点。