商业CFD软件把大部分数值细节封装在了黑箱里——点几个按钮,设定边界条件,求解器就开始跑。这个方法在常规工况下是有效的,但一旦碰到不收敛、结果异常、或者审稿人追问”你用了什么离散格式、为什么”——黑箱就变成了软肋。
流体力学数值模拟计算的根基不在软件操作,而在纳维-斯托克斯方程(N-S方程)到底是怎么从偏微分方程变成代数方程组的。这个从连续到离散的跳跃,决定了你的结果的精度天花板。

不可压缩牛顿流体的N-S方程长这样:∂u/∂t + (u·∇)u = −(1/ρ)∇p + ν∇²u + f,再加上连续性方程∇·u=0。这个方程组同时包含一阶导(对流项、压力梯度)和二阶导(扩散项),而且压力和速度耦合在一起——这是所有困难的根源。
把它变成计算机能处理的代数形式,有三条主流路线:
有限差分法(FDM)。 最直观的方法——用相邻格点的差商近似偏导数。∂u/∂x在一个均匀网格上就是(u_{i+1} − u_{i-1})/2Δx(中心差分)。FDM的优势是数学推导简单、代码实现快,适合教科书式的问题(方腔流、平板边界层)。致命弱点是:它只适应结构化网格,当几何形状不是矩形或圆柱时,FDM就力不从心了——而工程问题里几乎没有矩形的几何体。
有限体积法(FVM)。 当前CFD工业软件的绝对主流(Fluent、OpenFOAM、STAR-CCM+都用它)。FVM的处理逻辑和FDM不同:不直接在微分方程上做差分近似,而是把计算域切成一个个控制体,在每个控制体上做积分。高斯定理把体积分转成面积分——于是通量(flu×面积)代替了导数,天然保证了守恒性:从一个控制体流出的质量一定等于相邻控制体流入的质量。这个守恒性是FVM物理正确性的根基——FDM不天然保证它。
FVM对网格的适应性也远超FDM:非结构化网格(三角形、四面体、多面体)都可以——只要能确定每个面的通量方向,FVM就能算。
有限元法(FEM)。 结构力学的基本工具,在流体领域不如FVM主流,但有自己的阵地。FEM用加权残量法(Galerkin Method)把微分方程转为弱形式,在每个单元上用形函数插值。它的几何适应性是所有方法中最好的(能处理极其复杂的曲面),但N-S方程的对流项在标准Galerkin FEM中容易产生数值振荡——这个问题的本质是:FEM天然适合椭圆型方程(扩散主导),而N-S方程在Re数高的地方是对流主导的(双曲型特征),Galerkin方法不擅长。
对流的振荡问题有解法——Streamline Upwind Petrov-Galerkin(SUPG)或变分多尺度(VMS)稳定化——但这些技术增加了代码复杂度。COMSOL的CFD模块和FEniCS这类通用FEM代码都用了这些稳定化方法。选FEM做流体的典型场景是:多物理场耦合(流-固-热-电磁一起算)或者几何极其复杂(比如血管网络)。
N-S方程的非线性来自对流项(u·∇)u。它决定了:在一个控制体里,速度信息是从上游传过来的——纯下游的网格点对上游没有影响(超音速流的物理特征)。离散格式的核心任务就是恰当地表达这种方向性。
一阶迎风格式(First-Order Upwind)。 控制面上的值直接用上游节点的值。数学上简单、永远不出振荡、收敛性最好。代价是数值扩散——物理上该很锐利的激波或剪切层被”抹糊”了,像是过度平滑的图像。在工业仿真中,一阶迎风是用来做初始迭代的——跑200步让流场大致建立起来,然后切换到二阶格式。
二阶迎风格式(Second-Order Upwind)。 控制面上的值用上游节点和再上游一个节点做线性外推。精度显著提升(截断误差从O(Δx)降到O(Δx²)),边界层和尾迹区的解析能力大幅提升。但收敛性比一阶差——高雷诺数下的分离区可能出现非物理振荡。实践中需要把亚松弛因子往下调(压力0.7→0.5,动量0.3→0.2)来配合二阶。
QUICK格式(Quadratic Upstream Interpolation for Convective Kinematics)。 用三个上游节点做二次插值,对结构化六面体网格特别有效,扩散误差比二阶迎风更小。不适合非结构化网格(QUICK假设网格排列规则),所以在Fluent中它是”二阶迎风+梯度限制器”的补充而不是替代。
选择逻辑:
| 工况 | 推荐格式 |
|---|---|
| 初始迭代 | 一阶迎风(稳) |
| 稳态收敛 | 二阶迎风(精) |
| 强旋转/大涡 | 二阶迎风 + 梯度限制器 |
| LES/DES | 中心差分(无额外耗散) |
不可压缩流的求解有一个”鸡生蛋蛋生鸡”的问题:动量方程需要压力梯度才能算速度,但压力场本身由连续性方程约束——而连续性方程里没有压力。这就是压力-速度耦合问题的本质。
SIMPLE(Semi-Implicit Method for Pressure-Linked Equations)。 Patankar和Spalding在1972年提出,至今仍是Fluent的默认算法。核心思想:猜一个压力场 → 解动量方程拿到速度 → 用连续性方程构造压力修正方程 → 修正压力和速度 → 重复。每一步迭代只做一次压力修正,所以叫”Semi-Implicit”——压力修正不完全。
SIMPLE收敛慢,但极其稳健。对于大多数稳态问题,慢不是问题——Fluent在32核上跑1000步可能只要几分钟。
SIMPLEC(SIMPLE-Consistent)。 对SIMPLE的速度修正项做了一处简化近似,使得修正更”一致”。在层流和低Re数的湍流中,SIMPLEC通常比SIMPLE快20-30%。但高Re数分离流中,这种加速可能被收敛振荡消耗掉。
PISO(Pressure-Implicit with Splitting of Operators)。 在SIMPLE的基础上多加了一次压力修正和一次速度修正(两次修正循环),让压力和速度更快地相互满足。PISO原本是为瞬态问题设计的,但它对稳态大时间步长也表现出色——因为它每步多做了两次内循环,相当于在同一个时间步里提前消解了压力和速度的不匹配。对于含浮力驱动的自然对流和瞬态涡脱落问题,PISO比SIMPLE稳健得多——每步的时间成本高了约30%,但可以用更大的时间步长(CFL从<1放宽到>10)。
选择路线:稳态层流/低Re湍流→SIMPLEC;稳态高Re复杂流→SIMPLE+低亚松驰因子;瞬态→PISO。
流体力学数值模拟计算中最危险的操作,是把残差收敛当成结果正确。
Fluent的默认收敛判据是各方程残差降到10⁻³——但残差是被归一化的(除以最大残差的初始值),这个数值和物理精度的关系很间接。正确的步骤:
第一步:残差+全局守恒。 进口和出口的质量流量差必须小于总流量的1%。如果质量不守恒,流场结构没有物理意义——无论残差降到多少。
第二步:监测关键物理量。 选一个对结果最敏感的量——比如翼型的升力系数Cl、换热器的Nu数、管道压降ΔP——在求解历史曲线里观察它是否趋于稳定。如果Cl在最后200步还在单调爬升,残差10⁻⁶也没用。
第三步:网格独立性。 用三套网格(粗/中/细,每维度网格数比约1:1.5:2)算同一工况。如果中等网格和细网格的Cl差异<1%,中等网格就是独立的。三套都要用相同的离散格式和边界条件,避免混淆变量。
科研学术网(https://www.keyanxueshu.com)等多个求解器的参数优化和异常收敛诊断。
做流体力学数值模拟计算久了,会发现一个规律:最容易出错的地方往往是看起来最简单的。一个边界条件类型设错,一个离散格式选偏,一个亚松弛因子调得太大——任何一处疏忽都能让结果从”大致正确”变成”完全不可用”。反过来,当你在每一个选择节点上都能说清”为什么选这个而不是那个”,CFD就从黑箱变成了工具箱。