第15章 流体计算:不可压缩流(Fluid Flow Computation: Incompressible Flows)
作者
本章由 F. Moukalled、L. Mangani 和 M. Darwish 合著。本章是全书 Algorithms 模块(Ch 15-16)的开篇,专门处理不可压缩 N-S 方程的数值求解。N-S 方程是流体动力学的"圣杯",不可压缩情形下"无压力方程" + "压力-速度强耦合"两大难题,使 SIMPLE 系列算法成为工业 CFD 的事实标准。
内容概述
本章 145+ 页篇幅是全书 20 章中最长的章节,覆盖了不可压缩 N-S 方程求解的完整算法体系:SIMPLE、SIMPLEC、PRIME、PISO,以及 Rhie-Chow 插值、动量插值、压力边界条件等关键技术。
§15.1 主要困难 —— 不可压缩 N-S 方程的两大核心难题:
- 压力-速度强耦合 —— 动量方程中的 \(\nabla p\) 项使速度依赖压力;但压力不显式出现在连续性方程 \(\nabla \cdot \mathbf{v} = 0\) 中。
- 无压力方程 —— 没有直接可解的"压力 PDE"。
在数学上表现为"鞍点问题"(saddle point problem):线性化后
其中 0 在右下角,使得该系统无法用标准的迭代方法(Jacobi、Gauss-Seidel)直接求解。Schur 补 \(-B A^{-1} B^T\) 的存在使得必须"分块求解",这就是 SIMPLE 算法的数学基础。
§15.2 预备推导 —— 在 1D 均匀网格上演示 SIMPLE 算法的推导。
- 1D 连续性 + 动量方程 (Eq. 15.7-15.8)
$\(\frac{\partial (\rho u)}{\partial x} = 0 \tag{15.7}\)$
$\(\frac{\partial (\rho u u)}{\partial x} = \frac{\partial}{\partial x} \left( \mu \frac{\partial u}{\partial x} \right) - \frac{\partial p}{\partial x} \tag{15.8}\)$
- 1D 离散动量方程 —— 形成 \(a_C u_C + \sum_F a_F u_F = b_C - (\partial p / \partial x)_C V_C\)
- 1D 压力修正方程推导 —— 通过"先动量、后连续性"两步迭代
§15.3 SIMPLE 算法 (Semi-Implicit Method for Pressure Linked Equations) —— Patankar-Spalding 1972 提出的经典算法。
- 算法步骤 (Algorithm 15.1):
- 设定初始压力场 \(p^* = p^n\)
- 求解动量方程得到 \(u^*, v^*, w^*\)
- 求解压力修正方程 (Pressure Correction Equation) 得到 \(p'\)
- 修正压力 \(p^{n+1} = p^* + p'\)
- 修正速度 \(u^{n+1} = u^* + u'\),其中 \(u' = -\frac{V_C}{a_C} \nabla p'\)
- 求解其他标量(湍流量、温度、组分)
-
返回步骤 2 直到收敛
-
压力修正方程推导 —— 在 collocated 网格上,\(u' = -\frac{1}{a_C} \frac{\partial p'}{\partial x}\)(沿面需要 \(\mathbf{d}\) 与 \(\mathbf{S}_f\) 的几何因子修正)。
-
完整压力修正方程 (Eq. 15.20)
$\(\sum_f \frac{\rho V_P}{a_P} (\nabla p')_f \cdot \mathbf{S}_f = -\sum_f \rho \mathbf{v}_f^* \cdot \mathbf{S}_f\)$
右侧是"质量流量残差",左侧是"压力修正扩散项"。
- SIMPLE 的不足 —— 压力修正采用"完全隐式",导致压力更新过于保守,需要较小的亚松弛因子(\(\alpha_p = 0.3\))。这带来收敛慢的问题。
§15.4 SIMPLEC 算法 (SIMPLE Consistent) —— van Doormaal-Raithby 1984 改进。
- 核心改进 —— 在推导 \(u'\) 时"精确"计算动量系数 \(a_C\),避免 SIMPLE 中的"完全隐式"近似。
- 结果 —— 压力更新更准确,可以用更大的亚松弛因子(\(\alpha_p = 0.7\)),收敛速度提升 2-3 倍。
- OpenFOAM 默认算法 ——
simpleFoam默认使用 SIMPLEC。
§15.5 PRIME 算法 (Pressure Implicit with Momentum Explicit) —— Raithby-Schneider 1979 提出。
- 核心思想 —— 显式处理动量项、隐式处理压力项
- 优势 —— 收敛速度比 SIMPLE 更快
- 局限 —— 稳定性差(动量显式处理),需要更小的 \(\Delta t\)
- 应用 —— 较少用于现代工业 CFD,OpenFOAM 也无内置支持
§15.6 PISO 算法 (Pressure-Implicit with Splitting of Operators) —— Issa 1986 提出。
- 核心思想 —— 把 SIMPLE 的"压力修正 - 速度修正"循环执行 1-2 次额外迭代
- 优势 —— 对瞬态 N-S 方程特别有效,是 OpenFOAM
pimpleFoam的核心 - 算法步骤 (Algorithm 15.4):
- 动量预测 \(u^*\)
- 压力修正 1(SIMPLE 步骤)
- 速度修正 1
- 压力修正 2(额外一次)
- 速度修正 2
-
(可选)压力修正 3
-
PISO 的优势 —— 对每个物理时间步 \(\Delta t\),通过 1-2 次额外的压力修正使解更准确,因此整体时间步长可以更大。
§15.7 Rhie-Chow 插值 —— Ch 7 提到的 collocated 网格"棋盘压力场"问题解。
- 问题 —— 在 collocated 网格上,\(p, u, v\) 都存于 cell 形心,压力梯度 \(\nabla p\) 的中心差分会产生"棋盘状"解(checkerboard pressure field)。
- 解决 —— Rhie-Chow 1983 提出的"动量加权插值"(Momentum Weighted Interpolation):
$\((\mathbf{v}_f)^* = \overline{(\mathbf{v})}_f - \overline{\left( \frac{V}{a} \right)}_f (\nabla p)_f\)$
其中 \(\overline{(\cdot)}_f\) 是面 \(f\) 上的简单线性插值,\((\nabla p)_f\) 是用 Ch 9 的方法计算的面梯度。关键是 \(\overline{(V/a)}_f\) 是基于动量系数的"加权"插值,而不是简单的几何插值。
- 效果 —— 通过动量加权项,抑制了"棋盘压力场"模式,使 collocated 网格 + SIMPLE 算法稳定收敛。
§15.8 动量插值 (Momentum Interpolation) —— 进一步推广 Rhie-Chow 思想。
- 普通线性插值 (Eq. 15.60)
$\((\nabla p)_f = g_P (\nabla p)_P + (1 - g_P) (\nabla p)_{NB}\)$
- 动量插值 (Eq. 15.61)
$\((\nabla p)_f = \left( \frac{V}{a} \right)_f^{-1} \left[ \overline{ \left( \frac{V}{a} \right) } (\nabla p)_P + \overline{ \left( \frac{V}{a} \right) } (\nabla p)_{NB} \right] \cdot (\mathbf{S}_f / S_f)\)$
在边界处需要特别处理(边界 \(\partial p / \partial n\) 已知 vs 未知)。
§15.9 边界条件 —— 不可压缩 N-S 方程的常见边界条件: - 入口 (Inlet) —— 给定 \(u, v\) (Dirichlet),压力外推 (zeroGradient) - 出口 (Outlet) —— 给定 \(p\) (Dirichlet),速度外推 (zeroGradient) - 壁面 (Wall) —— 速度无滑移 \(u = 0\)(Dirichlet),压力 zeroGradient - 对称面 (Symmetry) —— 法向速度 0、切向速度外推
§15.10 Rhie-Chow 扩展 —— 把 Rhie-Chow 插值推广到瞬态、亚松弛、体积力项。
§15.11 计算指针 —— uFVM 与 OpenFOAM 的实现:
- OpenFOAM simpleFoam(稳态不可压):SIMPLEC + Rhie-Chow
- OpenFOAM pimpleFoam(瞬态不可压):PISO + Rhie-Chow
- uFVM cfdSolveSimple(...) / cfdSolvePiso(...) 调用
§15.12 闭包 —— 总结 SIMPLE 算法家族的核心思想。
核心方程与概念
- 不可压缩 N-S 方程 (Eq. 15.1-15.2)
$\(\frac{\partial \rho}{\partial t} + \nabla \cdot (\rho \mathbf{v}) = 0 \tag{15.1}\)$
$\(\frac{\partial (\rho \mathbf{v})}{\partial t} + \nabla \cdot (\rho \mathbf{v} \mathbf{v}) = -\nabla p + \nabla \cdot (\mu \nabla \mathbf{v}) + \rho \mathbf{g} \tag{15.2}\)$
对不可压牛顿流体,\(\rho = \text{const}\),故 \(\nabla \cdot \mathbf{v} = 0\)。
- 鞍点问题 (Eq. 15.3)
$\(\begin{pmatrix} A & B^T \\ B & 0 \end{pmatrix} \begin{pmatrix} v \\ p \end{pmatrix} = \begin{pmatrix} f_b \\ 0 \end{pmatrix} \tag{15.3}\)$
\(A\) 是动量方程离散矩阵,\(B\) 是连续性方程离散矩阵,\(B^T\) 是压力梯度算子。
- Schur 补 (Eq. 15.4)
$\(A = \begin{pmatrix} F & B^T \\ B & 0 \end{pmatrix} = \begin{pmatrix} F & 0 \\ B & -BF^{-1}B^T \end{pmatrix} \begin{pmatrix} I & F^{-1}B^T \\ 0 & I \end{pmatrix} = LU \tag{15.4}\)$
其中 \(-BF^{-1}B^T\) 是 Schur 补矩阵。
- SIMPLE 算法的矩阵分裂 (Eq. 15.5-15.6)
$\(\begin{pmatrix} I & D^{-1}B^T \\ 0 & I \end{pmatrix} \begin{pmatrix} v^* \\ p^* \end{pmatrix} = \begin{pmatrix} v^n \\ p^n \end{pmatrix} \tag{15.5}\)$
$\(\begin{pmatrix} F & 0 \\ B & -BD^{-1}B^T \end{pmatrix} \begin{pmatrix} v^* \\ p^* \end{pmatrix} = \begin{pmatrix} f_b \\ 0 \end{pmatrix} \tag{15.6}\)$
其中 \(D^{-1}\) 是 \(F^{-1}\) 的对角近似。
- 压力修正方程 (Eq. 15.20)
$\(\sum_f \frac{\rho V_P}{a_P} (\nabla p')_f \cdot \mathbf{S}_f = -\sum_f \rho \mathbf{v}_f^* \cdot \mathbf{S}_f \tag{15.20}\)$
左侧是压力修正的二阶导数,右侧是"质量流量残差"。
- 速度修正 (Eq. 15.22)
$\(u'_P = -\frac{V_P}{a_P} (\nabla p')_P \tag{15.22}\)$
即"用压力梯度修正速度"。
- Rhie-Chow 插值 (Eq. 15.58)
$\(\mathbf{v}_f^* = \overline{\mathbf{v}}_f - \overline{\left( \frac{V}{a} \right)}_f (\nabla p^*)_f \tag{15.58}\)$
其中 \(\overline{\mathbf{v}}_f\) 是简单线性插值,\(\overline{(V/a)}_f\) 是动量系数加权的插值。
- 动量插值 (Momentum Interpolation) (Eq. 15.61)
$\((\nabla p)_f = \overline{(\nabla p)}_f - \left( \overline{ \left( \frac{V}{a} \right) }_f - \frac{V_P}{a_P} g_P - \frac{V_{NB}}{a_{NB}} g_{NB} \right) (\nabla p)_\text{face linear}\)$
该式在 Rhie-Chow 基础上进一步修正面梯度,确保压力-速度解耦的彻底抑制。
关键结论
- SIMPLE 算法家族是工业不可压缩 N-S 求解的"事实标准":SIMPLE、SIMPLEC、PRIME、PISO 各有优势,工业 CFD 代码(OpenFOAM、ANSYS Fluent、STAR-CD)都基于这些算法。
- Rhie-Chow 插值是 collocated 网格 + SIMPLE 算法的"必备配套":没有 Rhie-Chow,collocated 网格会产生"棋盘压力场"使解物理无效。
- 压力修正方程是 SIMPLE 算法的"核心":把"无压力方程"问题转化为"通过连续性残差构造压力修正"问题。
- SIMPLEC 比 SIMPLE 收敛快 2-3 倍:因为压力更新更准确,可以用更大的亚松弛因子。OpenFOAM
simpleFoam默认采用 SIMPLEC。 - PISO 是瞬态不可压缩 N-S 的"工业标配":通过每个时间步的 1-2 次额外压力修正,使解更准确、整体时间步长可以更大。OpenFOAM
pimpleFoam默认采用 PISO。 - 压力亚松弛 \(\alpha_p = 0.3\) 是工业典型:压力更新要慢,否则容易发散。SIMPLEC 可以用 \(\alpha_p = 0.5-0.7\)。
挑战和开放性问题
- 全耦合求解 (Fully Coupled Solver) —— 相比 SIMPLE 的"分块迭代",全耦合方法(如 block-coupled、Newton-Krylov)在大规模问题上收敛更快,但实现复杂。OpenFOAM 6+ 引入
preconditioner+multiField求解器。 - Schur 补预条件子的工程实现 —— SIMPLE 的数学基础是 Schur 补,但工业实现中很少显式使用 Schur 补预条件子。Block preconditioner 是更工程化的选择。
- 高 \(Re\) 流动的 SIMPLE 收敛 —— 当 \(Re > 10^5\) 时,SIMPLE 收敛极慢,需要特殊处理(低 \(Re\) 初始化、多重网格、Vanka smoother)。
- Vanka smoother for SIMPLE —— Vanka smoother 是基于 SIMPLE 矩阵结构的 block smoother,在多重网格加速 SIMPLE 中常用。本书未展开。
- 多物理场耦合的 SIMPLE 扩展 —— 流-热-化-力多场耦合时,SIMPLE 算法需要扩展(如 SIMPLE-T for 热、SIMPLE-Chem for 化学)。
- GPU 加速的 SIMPLE —— 工业级 CFD 的 GPU 加速是 2016 年后的研究热点,AMG-based pressure solver 的 GPU 实现是关键。
- 机器学习辅助的 SIMPLE 加速 —— 现代研究用 NN 加速压力修正方程的求解,本书未涉及。
个人反思与批判性分析
本章是全书最长(145+ 页)、最难、最重要的章节,是工业 CFD 求解器设计的"圣经"。
从写作特点看:
- 从 1D 推导到 3D 非结构 —— 严格遵守"由简到繁"的工程递进:1D staggered 网格(§15.2)→ 1D collocated 网格(§15.3)→ 多维 collocated 非结构网格(§15.7)。读者可以在每一步都看到"前一步如何推广到下一步"。
- SIMPLE 算法的"分块迭代"本质 —— 作者明确指出 SIMPLE = "动量预测 + 压力修正 + 速度修正 + 标量更新"4 步循环。这种"分块"结构是工业 CFD 求解器的核心架构。
- 4 大算法 (SIMPLE / SIMPLEC / PRIME / PISO) 的并列展开 —— 每种算法的"动量 - 压力 - 速度"循环步骤都详细给出,使读者能够直接对照实现。
- Rhie-Chow 插值的"动量加权"思想 —— 作者清晰解释了为什么普通线性插值会产生"棋盘压力场",而动量加权插值能抑制它。这一节是 Ch 7 "collocated 网格"承诺的兑现。
- OpenFOAM
simpleFoam/pimpleFoam的对应 —— 把抽象的算法映射到具体的 OpenFOAM 求解器,是工程实用性的体现。
但本章也存在以下不足:
- 多重网格加速 SIMPLE 在工业大规模算例中是核心,本书未深入。OpenFOAM 的
GAMG是 SIMPLE 压力求解的工业实现,但 Ch 10 仅给出 AMG 算法,本章未详细说明 AMG 与 SIMPLE 的结合。 - Block-coupled / 全耦合求解 是 2010 年代后的研究热点,本书未涉及。
- 动量插值(Momentum Interpolation)的推导较为简略,读者需要参考 Rhie-Chow 1983 原始文献。
- 多物理场耦合的 SIMPLE 扩展 (如 SIMPLE-T for 共轭传热、SIMPLE-Chem for 化学反应)未展开。
- 非牛顿流体的 SIMPLE —— 黏度 \(\mu(\nabla \mathbf{v})\) 依赖速度梯度,导致动量方程高度非线性。工业上需要专门的"非牛顿 SIMPLE"(如 SIMPLER-NN)。
- 机器学习加速 是 2020 年代后的研究热点,本书出版年代限制未涉及。
总体而言,本章是 FVM 不可压缩 N-S 求解的"权威教材式"参考章节,与 Patankar 1980、Ferziger-Peric、Issa 1986 的对应章节形成对标。Moukalled 的优势在于"理论(鞍点问题 + Schur 补) + 工程(4 大 SIMPLE 算法 + Rhie-Chow) + 实现(OpenFOAM simpleFoam/pimpleFoam)"三位一体的连贯叙述。本章是工业 CFD 求解器开发者的"必读圣经"。
重要参考文献
- [X1] Patankar S.V., Spalding D.B. (1972) A calculation procedure for heat, mass and momentum transfer in three-dimensional parabolic flows. International Journal of Heat and Mass Transfer, 15(10): 1787-1806. (SIMPLE 算法原始文献)
- [X2] van Doormaal J.P., Raithby G.D. (1984) Enhancements of the SIMPLE method for predicting incompressible fluid flows. Numerical Heat Transfer, 7(2): 147-163. (SIMPLEC 原始文献)
- [X3] Issa R.I. (1986) Solution of the implicitly discretised fluid flow equations by operator-splitting. Journal of Computational Physics, 62(1): 40-65. (PISO 算法原始文献)
- [X4] Rhie C.M., Chow W.L. (1983) Numerical study of the turbulent flow past an airfoil with trailing edge separation. AIAA Journal, 21(11): 1525-1532. (Rhie-Chow 插值原始文献)
- [X5] Raithby G.D., Schneider G.E. (1979) Elliptic systems: finite-difference method II. Handbook of Numerical Heat Transfer (Minkowycz et al. eds.). Wiley. (PRIME 算法)
- [X6] Ferziger J.H., Perić M. (2002) Computational Methods for Fluid Dynamics, 3rd Edition. Springer. (SIMPLE 算法深入参考)
- [X7] Versteeg H.K., Malalasekera W. (2007) An Introduction to Computational Fluid Dynamics: The Finite Volume Method, 2nd Edition. Pearson.
- [X8] Moukalled F., Darwish M. (2001) A unified formulation of the segregated class of algorithms for the incompressible Navier-Stokes equations. Computers & Fluids, 30(5): 561-588. (SIMPLE 系列算法的统一矩阵推导)
- [X9] Jasak H. (1996) Error Analysis and Estimation for the Finite Volume Method with Applications to Fluid Flows. PhD Thesis, Imperial College. (OpenFOAM 早期开发者的博士论文,Rhie-Chow 实现的原始设计)
- [X10] Weller H.G., Tabor G., Jasak H., Fureby C. (1998) A tensorial approach to computational continuum mechanics using object-oriented techniques. Computers in Physics, 12(6): 620-631. (OpenFOAM 早期论文)
- [X11] OpenFOAM Foundation (2014) The Open Source CFD Toolbox — User Guide. (OpenFOAM simpleFoam / pimpleFoam 实现)
- [X12] Vanka S.P. (1986) Block-implicit multigrid solution of Navier-Stokes equations in primitive variables. Journal of Computational Physics, 65(1): 138-158. (Vanka smoother 原始文献)
- [X13] Hutchinson B.R., Raithby G.D. (1986) A multigrid method based on the additive correction strategy. Numerical Heat Transfer, Part A, 9(5): 511-537. (多重网格加速 SIMPLE)