参数设置
CFL 条件:$\mathrm{CFL} = u\,\Delta t/\Delta x \le \mathrm{CFL}_\mathrm{max}$。典型值为前进 Euler / Lax-Wendroff 时 $\mathrm{CFL}_\mathrm{max} = 1.0$,RK4 时约 2.06。
1D 网格与信号传播
蓝框=空间单元(宽度 $\Delta x$)/黄箭头=一个时间步内信号进行的距离 $u\,\Delta t$/绿色=CFL ≤ 1 的稳定区域/红色=CFL > 1 时跨越单元的不稳定区域。当箭头超过一个单元时,显式方法会破坏。
稳定性图(CFL vs 稳定性指标)
横轴=CFL [0, 3]/纵轴=稳定性指标 $\mathrm{CFL}_\mathrm{max} - \mathrm{CFL}$/绿带=稳定区域(CFL < 0.9·CFL_max)/黄带=边界区域/红带=不稳定区域(CFL > CFL_max)/黄●=当前 CFL。
理论与主要公式
Courant 数(CFL 数)的定义:
$$\mathrm{CFL} = \frac{u\,\Delta t}{\Delta x}$$
显式方案的稳定条件和最大许可 $\Delta t$ 和 $u$:
$$\mathrm{CFL} \le \mathrm{CFL}_\mathrm{max},\quad \Delta t_\mathrm{max} = \frac{\mathrm{CFL}_\mathrm{max}\,\Delta x}{u},\quad u_\mathrm{max} = \frac{\mathrm{CFL}_\mathrm{max}\,\Delta x}{\Delta t}$$
稳定性指标(负值表示不稳定):
$$\mathrm{margin} = \mathrm{CFL}_\mathrm{max} - \mathrm{CFL}$$
其中 $u$ 是移流速度 [m/s],$\Delta t$ 是时间步长 [s],$\Delta x$ 是空间步长 [m],$\mathrm{CFL}_\mathrm{max}$ 是方案固有的稳定限界(前进 Euler 和 Lax-Wendroff 为 1.0,RK4 约为 2.06)。在显式时间积分中,$\mathrm{CFL} \le \mathrm{CFL}_\mathrm{max}$ 是稳定的必要条件。
什么是 Courant 数
🙋
CFD 的书上写「CFL ≤ 1 否则会发散」,但 CFL 到底是什么意思呢?为什么要在 1 这个地方划线呢?
🎓
Courant 数 $\mathrm{CFL} = u\,\Delta t/\Delta x$ 表示「一个时间步内信号进行的距离 $u\,\Delta t$ 是网格宽度 $\Delta x$ 的几倍」。本工具的默认值($u=10$ m/s、$\Delta t=1.00$ ms、$\Delta x=10.0$ mm),$u\,\Delta t = 10 \cdot 10^{-3} = 10$ mm,正好是 1 个网格宽度。CFL = 10/10 = 1.000,这是「边界」状态,超过这个值显式方法就会破坏。
🙋
把 $\Delta t$ 改为 2 ms,CFL 变成 2.000 变成红色「不稳定」。实际计算时会怎样?
🎓
数值解会指数级发散,波的振幅变得无限大。你会看到「振荡不衰减」「出现 Inf 或 NaN」「数值完全不符合物理」这样的现象。原因是前进 Euler 的增幅因子 $|1 - \mathrm{CFL}| > 1$,每个时间步误差都会放大。这个是由 Courant、Friedrichs、Lewy 三人在 1928 年通过线性 von Neumann 稳定性分析严格证明的。
🙋
把 $\Delta x$ 从 10 mm 改成 20 mm,CFL 变成 0.500 变成绿色「稳定」。看来网格越细稳定性越差?
🎓
完全正确,这就是「CFL 的诅咒」。要提高精度(减小 $\Delta x$)就必须减小 $\Delta t$。比如 $\Delta x$ 减半,$\Delta t$ 也要减半,计算量就变成 4 倍。3D 的话就是 $2^4 = 16$ 倍!这就是为什么 DNS(直接数值模拟)需要超级计算机。大多数实际流体模拟用 LES 或 RANS 来减少计算量。
🙋
把 CFL_max 改成 2.06,CFL = 1.000 还是稳定(绿色)。这就是 RK4 吗?
🎓
完全对!RK4 是 4 步高阶方法,每步之间会相互抵消误差,稳定限界能扩展到约 2.06。在压缩流 DG-FEM 或谱元法中经常用。只是每步计算成本是前进 Euler 的 4 倍、Lax-Wendroff 的 2 倍。实务中要在「稳定限界」和「单步计算成本」之间平衡,MUSCL+RK4 或 TVD-RK3 这样的组合很常见。
常见问题
多维空间中,各方向的 CFL 的和(或对角项)受到限制。2D 移流方程有 $\mathrm{CFL}_x + \mathrm{CFL}_y = u\,\Delta t/\Delta x + v\,\Delta t/\Delta y \le 1$,3D 有 $\mathrm{CFL}_x + \mathrm{CFL}_y + \mathrm{CFL}_z \le 1$ 是一阶显式方法的典型条件。当网格各向同性且 $u = v = w$ 时,3D 的 $\Delta t$ 是 1D 的 1/3。使用 Strang 分裂可以按方向独立评估,但最严格的条件仍然会起作用。高阶方法(Lax-Wendroff、MacCormack、RK4)能稍微放宽 $\mathrm{CFL}_\mathrm{max}$,但本质上多维很难超过 1。
对流扩散方程 $\partial \phi/\partial t + u\,\partial \phi/\partial x = \nu\,\partial^2 \phi/\partial x^2$ 需要同时满足两个条件:$\mathrm{CFL} = u\,\Delta t/\Delta x \le 1$ 和扩散数 $d = \nu\,\Delta t/\Delta x^2 \le 0.5$(一阶显式精度)。以更严格的条件为准。还有组合条件如 $\mathrm{CFL}^2 \le 2d$,对流主导(高 Re)时 CFL 限制,扩散主导(低 Re)时 d 限制。实际 CFD 经常用半隐式方法,对扩散隐式处理、对对流显式处理,这样只需关心对流的 CFL。
压缩流 Euler/Navier-Stokes 用特征速度 $|u| + a$($a$ 是局部音速),得到 $\mathrm{CFL} = (|u| + a)\,\Delta t/\Delta x \le 1$。亚音速流($M = u/a \ll 1$)中音速主导,低 Mach 流的时间步特别小。比如空气中 $u = 10$ m/s、$a = 340$ m/s,特征速度是 350 m/s,若 $\Delta x = 10$ mm 则 $\Delta t \le 28.6$ μs,非常小。低 Mach 流需要预处理(Turkel、Choi-Merkle)或压缩/非压缩混合求解器。
每个时间步在全网格计算最大 CFL,根据目标 CFL_target(一般 0.5~0.8)调整下一步的 $\Delta t_\mathrm{new} = \mathrm{CFL}_\mathrm{target}/\mathrm{CFL}_\mathrm{current} \cdot \Delta t_\mathrm{current}$。OpenFOAM 的 adjustTimeStep、ANSYS Fluent 的 CFL 自适应、SU2 求解器都是这个思路。要注意 $\Delta t$ 每步不要变太大(一般限在 1.2 倍以内),否则二阶时间格式(BDF2 等)精度会下降。另外激波形成或边界条件剧变时 CFL 会急增,需要加上限制。
实际应用
商业 CFD 求解器的时间步设计:ANSYS Fluent、STAR-CCM+、OpenFOAM、SU2 等主流 CFD 软件内部都监控 CFL 条件。显式时间积分(压缩流、爆炸冲击分析)以 CFL = 0.3~0.7 为目标,隐式时间积分(非压缩流定常解)以 CFL = 5~100 为目标。本工具中 $u = 10$ m/s、$\Delta x = 10$ mm 时计出 $\Delta t_\mathrm{max} = 1$ ms,实际 LES 也常在 CFL_target = 0.5 时采用 $\Delta t \approx 0.5$ ms 这样的数量级。
气象和海洋模型的超级计算:WRF(美国气象预报模式)、MPAS、NICAM(日本全球非静力模式)等气象模型都是显式 CFD,CFL 条件决定了计算量。水平 $\Delta x = 1$ km 的天气预报中风速 $u = 50$ m/s 时,$\Delta t \le 20$ 秒被严格限制。即使用地球模拟器或「富岳」这样的超大型计算机,24 小时预报也要花数小时,正是因为 CFL 的约束。
地震波传播和 FDTD 电磁分析:FDTD(时域差分)法在电磁、地震、声学中广泛应用,其 CFL 条件为 Courant 数形式 $c\,\Delta t \le \Delta x/\sqrt{N}$($N$ 是维度,$c$ 是波速)。3D FDTD 中 $c\,\Delta t \le \Delta x/\sqrt{3} \approx 0.577\,\Delta x$,光速 $c \approx 3 \times 10^8$ m/s、$\Delta x = 1$ mm 时 $\Delta t \le 1.93$ ps 极端之小。RF 和天线设计无法使用太粗网格的原因之一就是这里。
冲击波和爆炸分析(ALE、SPH):水力码(LS-DYNA、AUTODYN、Abaqus/Explicit)在爆炸穿透分析中用音速+粒子速度作为特征速度,冲击面附近的局部 CFL 会急升。实务中以 CFL_target = 0.6~0.7 维持稳定,配合自适应网格细化(AMR)来平衡精度和成本。飞机鸟撞、汽车碰撞、防爆舱分析等都用这套标准方法。
常见误区和注意事项
最大误区是「CFL ≤ 1 就一定精度高」。CFL 条件只是稳定的必要条件,不保证精度。极端的 CFL = 0.001 时数值扩散反而很大,波形会变得迟钝。相反 CFL = 0.7~1.0 范围内,Lax-Wendroff 这样的二阶方法波形保存最好。稳定和精确是两回事,网格分辨率($\Delta x$)和时间步长($\Delta t$)要同时平衡设计。
其次常见误解是「用隐式方法就能随意增大 $\Delta t$」。Backward Euler 和 BDF2 虽然无条件稳定,但过大的 $\Delta t$ 会产生数值扩散,非定常流的涡结构消失。LES 要解析大尺度涡的话,$\Delta t$ 必须小于最小流动时间尺度(Kolmogorov 时间尺度)。定常解析可以 CFL = 100,但过渡解析要 CFL = 1~5,并且要做时间步收敛性检验(把 $\Delta t$ 减半验证结果不变)。
最后要纠正「CFL 是线性理论,非线性问题无关」的误解。Burgers 方程、Euler 方程等非线性对流问题,激波形成时局部特征速度急增,见观的 CFL 会跳跃。理论上 CFL = 1 在激波附近就会失稳,实务中要保守取 CFL = 0.3~0.5。压缩流还要用特征 CFL = $(|u|+a)\,\Delta t/\Delta x$ 代替简单的 $u\,\Delta t/\Delta x$。CFL 的定义因求解器而异,务必查阅文档确认。