第 6 章 · 不可压 N-S 方程的数值解:压力的麻烦
不可压 N-S 方程看起来只是"第 2 章方程 + 粘性项",数值上却有一个独特陷阱:压力没有自己的方程,它藏在连续方程里。这一节的任务就是解决"压力从哪来"。
压力的特殊地位
动量方程里有压力梯度,但连续方程 $\nabla\cdot\mathbf{V}=0$ 里没有压力。压力实际上扮演"约束力的角色":它的唯一使命是让速度场保持无散。数学上,对动量方程取散度可以推出压力满足泊松方程:
所以每一步都要解一个泊松方程——这是不可压流计算最贵的部分,也是所有投影类方法的核心。
交插网格:治好棋盘压力
把压力和速度存在同一批点上,会出现一个灾难:$p_{i-1}$ 和 $p_{i+1}$ 的锯齿形"棋盘"压力场对中心差分的 $\frac{p_{i+1}-p_{i-1}}{2\Delta x}$ 完全不可见——方程管不了它。交插网格(MAC/Staggered)把压力存格心、$u$ 存竖边、$v$ 存横边,压力梯度变成相邻两点的一阶差分,棋盘模式自然消失。这是不可压流动数值方法的奠基性技巧,今天 Simple 系列算法的网格安排仍源于此。
SIMPLE:压力修正的迭代循环
SIMPLE(半隐式压力关联方程)的每一轮迭代: 1. 猜一个压力场 $p^*$,解动量方程得速度 $u^*$; 2. $u^*$ 一般不满足连续方程,定义速度修正与压力修正的关系 $u' = -\frac{V}{a_P}\frac{\partial p'}{\partial x}$; 3. 代入连续方程,得压力修正泊松方程,解出 $p'$; 4. 用 $p'$ 修正压力和速度,回到第 1 步,直到残差足够小。
理解 SIMPLE 的关键:它不是一次解对,而是把"动量 + 连续"耦合拆成"猜-修"循环,每轮便宜、多跑几轮。
老师的提醒
- 方腔算例是你的"第一支烟":网格 $41\times41$、雷诺数 100,先复现出主涡,再谈别的。
- 压力修正类方法的松弛因子要调:动量方程 0.5-0.7、压力修正 1.0-1.3 是常见起点,发散先降松弛因子。
自检
- 为什么同位存储会出棋盘压力?交插网格怎么解决?
- 写出 SIMPLE 四步循环。
- 不可压计算为什么每步都要解泊松方程?
更深一层:压力在不可压流里的"裁判"角色
不可压流动最反直觉的一点:压力没有自己的演化方程。可压流里压力由状态方程从密度、内能算出(能量方程管它);不可压极限下密度、温度的波动被冻结,压力退化为纯粹的约束力——它不描述任何热力学状态,唯一职责是让速度场保持无散。数学上,对动量方程取散度(利用 $\nabla\cdot\mathbf{V} = 0$)得到压力泊松方程,其右端是速度场的非线性自耦合项。
这个"裁判"角色带来一个深远的计算后果:压力是全局量。某处速度想发散,压力在全场瞬间调整约束之——所以每步都要解一个椭圆方程,信息瞬时传遍全域(对比可压流里声波有限速传播)。不可压 CFD 的算力大头(70% 以上)都花在泊松方程上,多重网格是公认的解药——它正是"让椭圆方程的信息传播加速"的专用机器。
推导细读:棋盘压力的病理解剖
把压力与速度放在同一批节点(同位网格)上,中心差分 $p_{i+1} - p_{i-1}$ 对锯齿形压力场 $p_i = (-1)^i$ 完全失明(相邻差分为零、跨点差分非零——差分模板"看错"了波长)。这个棋盘解在离散方程的眼里与零压力场不可区分,于是迭代过程随时滑进去。三种解毒剂: 1. 交插网格(MAC):压力存格心、$u$ 存东西边、$v$ 存南北边——压力梯度变成相邻点的差分,棋盘模式被模板天然禁止; 2. 动量插值(Rhie-Chow):同位网格上用相邻节点速度线性组合压力梯度,恢复对棋盘的免疫力——现代非结构求解器的标配; 3. 交错滤波:每次迭代后手动滤除锯齿分量——治标不治本,仅作急救。
第 2、3 种的区别值得体会:Rhie-Chow 是把"模板与波长匹配"的物理直觉翻译成插值公式,而滤波只是事后补救。好的离散化让病态无法诞生,坏的离散化让病态需要治疗——这句评语适用于数值方法的几乎所有疾病。
在真实世界里:SIMPLE 家族统治着工程不可压计算
从 1972 年 Patankar 与 Spalding 的 SIMPLE 到今天的 SIMPLER、SIMPLEC、PISO(瞬态标准)、Coupled 算法,这条算法谱系撑起了 Fluent、Star-CCM+、OpenFOAM 的不可压求解内核。工程选择的实用经验:定常问题 SIMPLE/SIMPLEC 稳健省内存;瞬态问题 PISO 每步少迭代;强耦合流动(浮升、旋转腔)Coupled 收敛虽慢单步更稳。诊断口诀:发散先降松弛因子、振荡先查网格畸变、停滞先怀疑压力速度耦合设置——这三句能解决新手 80% 的"算不动"。
常见误区与辨析
- "压力结果直接可信":同位网格 + 差值格式得到的压力需要后处理校正;即便是正确解,压力的绝对值依赖参考点,比较时用压差而非绝对压力。
- "收敛 = 残差小于 10^-3":残差下降三个量级是起点不是终点;监测物理量(出口流量、监测点压力)的平台化才是收敛的实操判据。
- "方腔流算不好是网格问题":方腔高雷诺数的"角落涡"对网格与格式都敏感——先与文献基准(Ghia 的表格解)对比定位问题源。
专题深入:投影方法——不可压流计算的"另一家族"
SIMPLE 家族之外,不可压流还有一条重要的算法谱系:投影方法(Chorin 的 fractional-step)。思路直接劈开"动量推进"与"压力投影"两步:第一步(预测)不考虑压力,推进速度到中间态 $\mathbf{u}^*$(违反无散);第二步(投影)把 $\mathbf{u}^*$ 投影到无散空间——$\mathbf{u} = \mathbf{u}^* - \Delta t\nabla\phi$,$\phi$ 由泊松方程给出。投影 = 把速度场正交分解为无散部分 + 无旋部分,扔掉无旋部分——这是 Helmholtz 分解的数值实现。投影方法与 SIMPLE 的分工:投影法更"数学干净"(精度阶数清晰),SIMPLE 更"工程鲁棒"(稳态迭代天然松弛)。两个家族在现代求解器里融合(PISO 是两者的混血)。
数学细节展开:泊松方程的快速求解——多重网格与 FFT
不可压计算的瓶颈是每步的泊松方程。多重网格(第 2 节的 sim-2 已预演)是通用答案:细网格上的低频误差 = 粗网格上的高频误差,来回限制-延拓,收敛步数与网格尺寸无关——$O(n)$ 解椭圆问题。FFT 快速泊松求解器(周期/规则边界)是结构化网格上的特例:离散傅里叶把拉普拉斯算子对角化,一步解出——$O(n\log n)$。两个算法的分工:规则几何用 FFT、任意几何用多重网格;谱方法与粒子方法(涡方法)的泊松求解各有专用快速算法。
工程案例细节:方腔流的"基准对照"工作流
驱动方腔流是 CFD 的"标准考卷"(Ghia 的基准解是通行对照表)。工作流:先用 Ghia 表格核对中心线速度剖面($u$ 沿竖直中线、$v$ 沿水平中线)→ 再查主涡中心位置与强度 → 再加密网格看收敛 → 最后看角落次涡的出现顺序(随雷诺数增大)。这套"基准对照"的工作流是任何新求解器的第一课:不与基准对过照的求解器没有资格算工程问题。数值基准的意义在于它把"看起来对"变成"与公认参考解的定量偏差"——验证从定性变成定量。
常见误区与辨析(补充)
- "SIMPLE 的松弛因子有最优值":没有普适最优——按问题调(动量 0.5-0.7、压力 1.0-1.3 是起点);欠松弛是收敛与稳定的调节阀。
- "压力修正法只适用于定常":PISO 与投影方法把它扩展到瞬态——时间精度由时间离散格式保证。
例题
给定平面速度场 $u = 2x$,$v = -2y$。(1)验证它满足不可压连续方程;(2)求满足它的流函数 $\psi$($u = \partial\psi/\partial y$,$v = -\partial\psi/\partial x$)。
解答
(1) $\dfrac{\partial u}{\partial x} + \dfrac{\partial v}{\partial y} = 2 + (-2) = 0$ ✓ 无散。
(2) 由 $u = \partial\psi/\partial y = 2x$ 积分得 $\psi = 2xy + f(x)$;再由 $v = -\partial\psi/\partial x = -(2y + f'(x)) = -2y$,得 $f'(x) = 0$,取 $f = $ 常数。
- 要点:无散是流函数存在的充要条件;压力场再由伯努利/动量方程回代求得。