CFL 数模拟器 返回
CFD 基础模拟器

CFL 数模拟器 — 显式时间积分的稳定性

交互式 Courant 数 $\mathrm{CFL} = u\,\Delta t/\Delta x$ 计算器。调节移流速度 $u$、时间步长 $\Delta t$、空间步长 $\Delta x$ 与格式上限 $\mathrm{CFL}_\mathrm{max}$,可同时查看稳定 / 临界 / 不稳定状态、最大允许 $\Delta t$、最大允许 $u$,以及 1D 网格中的信号传播示意图。

参数设置
移流速度 u
m/s
时间步长 Δt
ms
空间步长 Δx
mm
格式上限 CFL_max

CFL 条件:$\mathrm{CFL} = u\,\Delta t/\Delta x \le \mathrm{CFL}_\mathrm{max}$。典型上限:Forward Euler / Lax-Wendroff 为 $\mathrm{CFL}_\mathrm{max} = 1.0$,RK4 约为 2.06。

计算结果
CFL 数
稳定性
最大允许 Δt
最大允许 u
1D 网格与信号传播

蓝色方框=宽度为 $\Delta x$ 的空间网格/黄箭头=一个步长内信号移动的距离 $u\,\Delta t$/绿=CFL ≤ 1 稳定/红=CFL > 1 跨越网格的不稳定。箭头超过一个网格时显式格式破坏。

稳定性图(CFL 与裕度)

横轴 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}$ 是格式专属的稳定上限(Forward Euler 与 Lax-Wendroff 为 1.0,RK4 约 2.06)。显式时间积分要求 $\mathrm{CFL} \le \mathrm{CFL}_\mathrm{max}$ 才能保证稳定。

什么是 CFL 数

🙋
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,恰好一个网格,CFL = 10/10 = 1.000,这是「临界点」。再大一点,显式格式就会发散。
🙋
把 $\Delta t$ 调到 2 ms 后 CFL = 2.000,指示器变红「不稳定」。实际求解器里会怎样?
🎓
数值解会指数发散——波幅在几步内增长几个数量级,振荡停不下来,很快出现 Inf 或 NaN。原因是 Forward Euler 的放大因子 $|1 - \mathrm{CFL}| > 1$,每步都会放大误差。这是 von Neumann 稳定性分析的结论,源头就是 1928 年 Courant-Friedrichs-Lewy 的原始论文。
🙋
把 $\Delta x$ 加倍到 20 mm,CFL 降为 0.500、指示器变绿。也就是网格越细,时间步也必须越小?
🎓
没错,这就是「CFL 陷阱」。$\Delta x$ 减半的同时 $\Delta t$ 也要减半,1D 计算量按 $\Delta x^{-2}$ 增长,3D 按 $\Delta x^{-4}$。这就是 DNS(直接数值模拟)成本极高的根本原因,也是 LES、RANS 等湍流模型受欢迎的理由——它们放宽了分辨率要求。
🙋
把 CFL_max 加到 2.06 后,CFL = 1.000 也变成绿色「稳定」。这就是 RK4 吗?
🎓
是的。RK4 是四阶段高阶格式,对移流的有效稳定区域延伸到约 CFL = 2.06。可压 DG-FEM、谱元法等常用 RK4 或 TVD-RK3。代价是每步要算 4 次函数值,约为 Lax-Wendroff 的 2 倍。工程实践就是在稳定区域大小与单步成本之间权衡选择。

常见问题

多维情形要求各方向 CFL 之和受约束。2D 移流为 $\mathrm{CFL}_x + \mathrm{CFL}_y = u\,\Delta t/\Delta x + v\,\Delta t/\Delta y \le 1$,3D 为三方向之和 ≤ 1。等距网格上 $u = v = w$ 时 3D 的 $\Delta t$ 只有 1D 的 1/3。Strang 分裂(维度分裂)能恢复各方向独立的 CFL,但最严苛的方向仍主导 $\Delta t$。高阶格式(Lax-Wendroff、MacCormack、RK4)能略微放宽 $\mathrm{CFL}_\mathrm{max}$,但方向求和约束是显式多维积分的本质属性。
对流扩散方程 $\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 决定。IMEX(隐显混合)格式将扩散项隐式处理、对流项显式处理,只剩对流的 CFL 约束。
可压缩 Euler / Navier-Stokes 用 $|u| + a$($a$ 为当地声速)作为特征速度,$\mathrm{CFL} = (|u| + a)\,\Delta t/\Delta x \le 1$。亚音速流场($M = u/a \ll 1$)中声速主导,导致 $\Delta t$ 大幅缩小——这是低马赫可压缩 CFD 的难点之一。例:空气 $u = 10$ m/s、$a = 340$ m/s 时,特征速度为 350 m/s,$\Delta x = 10$ mm 对应 $\Delta t \le 28.6$ μs。常用预处理(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-based time step、SU2 均采用此思路。为保持 BDF2 的二阶精度,单步变化通常限制在 1.2 倍以内,并对 $\Delta t$ 设置上下限,以应对激波形成或边界条件突变带来的 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 = 1$ ms,可推导出 LES 计算中 CFL_target = 0.5 时常用 $\Delta t \approx 0.5$ ms。

气象与海洋模型的超算运行:WRF(美国数值天气预报)、MPAS、NICAM(日本全球非静水力学模型)等都是典型的显式 CFD,其计算成本基本由 CFL 决定。水平 $\Delta x = 1$ km、风速 50 m/s 时 $\Delta t$ 限制为 20 秒,即使在「地球模拟器」或「富岳」上,24 小时预报也需要数小时墙钟时间。

地震波传播与 FDTD 电磁分析:FDTD(时域有限差分)法广泛用于电磁、地震波与声学分析,其 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)与 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 会带来很大的数值耗散,抹平尖锐波形。事实上,Lax-Wendroff 等二阶格式的波形保留性在 CFL = 0.7〜1.0 附近最好。务必将网格分辨率($\Delta x$)与时间步长($\Delta t$)综合权衡——稳定 ≠ 精度。

其次是 「隐式格式可以随便加大 $\Delta t$」 的误解。Backward Euler 与 BDF2 是无条件稳定的,但过大的 $\Delta t$ 会让数值耗散占主导,抹除非定常涡结构。LES 计算中 $\Delta t$ 必须小于关心的最小时间尺度(Kolmogorov 尺度),通常 CFL = 1〜5;定常求解可放宽到 100。在采用隐式格式前务必做时间步收敛验证($\Delta t$ 减半看结果是否变化)。

第三是 「CFL 是线性理论,对非线性问题无关紧要」 的误解。Burgers 方程或 Euler 方程等非线性对流问题,会在激波附近导致特征速度局部剧增,从而抬高有效 CFL。工业代码常保守地取 CFL = 0.3〜0.5,并使用 $(|u| + a)\,\Delta t/\Delta x$ 而非线性 $u\,\Delta t/\Delta x$。本工具的线性定义足够教学,但用于工业计算前请务必查阅求解器内部的具体 CFL 定义。