Skip to content
📚 系列流体仿真系列第 2 篇

流体仿真入门

前言:什么是流体仿真

流体仿真(CFD - Computational Fluid Dynamics,计算流体动力学)是利用数值方法求解流体运动方程的学科。它广泛应用于航空航天、汽车设计、气象预报、生物医学等领域。

简单来说,CFD 让我们能够在计算机中模拟流体的行为——无论是空气流过机翼、水流经过管道,还是血液在血管中的流动。通过仿真,我们可以在不进行昂贵物理实验的情况下,预测和分析流体现象。

流体仿真的基本概念

Navier-Stokes 方程是流体运动的核心方程,描述了流体的动量守恒:

其中:

  • - 流体密度
  • - 速度向量
  • - 压力
  • - 动力粘度
  • - 外力(如重力)

这个方程看起来复杂,但它本质上就是牛顿第二定律在流体中的应用:质量 × 加速度 = 力。

连续性方程

连续性方程描述了质量守恒:

对于不可压缩流体(如水、低速空气),密度恒定,方程简化为:

这意味着流体的"流入量"等于"流出量"。

边界条件

边界条件定义了流体在边界上的行为:

  1. 无滑移条件:流体在固体壁面的速度为零
  2. 入口边界:指定入口处的速度或压力
  3. 出口边界:通常指定压力或零梯度条件
  4. 对称边界:法向速度为零,切向速度梯度为零

简单的数值方法

有限差分法(FDM)

有限差分法是最直观的数值方法,用差分近似导数:

优点:简单易懂,易于实现 缺点:对复杂几何形状适应性差

有限体积法(FVM)

有限体积法基于积分形式的守恒方程,将计算域划分为控制体积:

优点:守恒性好,适合复杂几何 缺点:实现相对复杂

Python 流体仿真工具介绍

基础科学计算库

  • NumPy:高效的数组运算,是所有数值计算的基础
  • SciPy:提供稀疏矩阵求解、优化算法等高级功能
  • Matplotlib:可视化仿真结果

专业 CFD 工具

  • FEniCS:基于有限元方法的开源计算平台,支持自动求解偏微分方程
  • OpenFOAM:工业级开源 CFD 软件,功能强大但学习曲线陡峭
  • PyFR:高精度通量重构方法求解器
  • Su2:斯坦福大学开发的求解器,适合气动优化

对于初学者,建议从 NumPy + Matplotlib 开始,逐步过渡到专业工具。

一个简单的 Python 流体仿真示例

下面我们用有限差分法求解 2D 热传导方程,这是流体仿真中最基础的例子之一。

热传导方程:

python
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation

# 参数设置
nx, ny = 50, 50  # 网格点数
Lx, Ly = 1.0, 1.0  # 计算域大小
dx, dy = Lx / (nx - 1), Ly / (ny - 1)  # 网格间距
alpha = 0.01  # 热扩散系数
dt = 0.0005  # 时间步长
nt = 500  # 时间步数

# 稳定性检查 (CFL条件)
stability = alpha * dt * (1/dx**2 + 1/dy**2)
print(f"稳定性参数: {stability:.4f} (需要 < 0.5)")

# 初始化温度场
T = np.zeros((ny, nx))

# 设置初始条件:中心热源
T[ny//2-5:ny//2+5, nx//2-5:nx//2+5] = 100.0

# 边界条件:四边固定温度
T[0, :] = 0.0   # 下边界
T[-1, :] = 0.0  # 上边界
T[:, 0] = 0.0   # 左边界
T[:, -1] = 0.0  # 右边界

# 时间推进
def solve_heat_equation(T, nt, alpha, dt, dx, dy):
    T_new = T.copy()
    for n in range(nt):
        # 二阶中心差分
        T_new[1:-1, 1:-1] = T[1:-1, 1:-1] + alpha * dt * (
            (T[1:-1, 2:] - 2*T[1:-1, 1:-1] + T[1:-1, :-2]) / dx**2 +
            (T[2:, 1:-1] - 2*T[1:-1, 1:-1] + T[:-2, 1:-1]) / dy**2
        )
        T = T_new.copy()
    return T

# 求解
T_final = solve_heat_equation(T, nt, alpha, dt, dx, dy)

# 可视化
fig, axes = plt.subplots(1, 2, figsize=(12, 5))

# 初始温度场
T_initial = np.zeros((ny, nx))
T_initial[ny//2-5:ny//2+5, nx//2-5:nx//2+5] = 100.0
im1 = axes[0].imshow(T_initial, cmap='hot', origin='lower',
                      extent=[0, Lx, 0, Ly], vmin=0, vmax=100)
axes[0].set_title('初始温度场')
axes[0].set_xlabel('x')
axes[0].set_ylabel('y')
plt.colorbar(im1, ax=axes[0], label='温度')

# 最终温度场
im2 = axes[1].imshow(T_final, cmap='hot', origin='lower',
                      extent=[0, Lx, 0, Ly], vmin=0, vmax=100)
axes[1].set_title(f'最终温度场 (t = {nt*dt:.2f}s)')
axes[1].set_xlabel('x')
axes[1].set_ylabel('y')
plt.colorbar(im2, ax=axes[1], label='温度')

plt.tight_layout()
plt.savefig('heat_diffusion.png', dpi=150)
plt.show()

运行这段代码,你会看到热量从中心逐渐扩散到整个区域,最终达到均匀分布。这个简单的例子展示了数值仿真的基本流程:离散化、时间推进、边界处理。

使用 Claude Code 辅助理解和编写仿真代码

学习流体仿真时,Claude Code 可以成为你的得力助手:

代码解释

遇到不理解的代码片段,可以直接询问:

请解释这段代码中 Laplacian 算子的离散化方法

算法实现

描述你的需求,让 Claude 帮你实现:

用 Python 实现一个 2D 不可压缩流动的投影法求解器

调试帮助

仿真结果不正确时,可以请 Claude 帮忙分析:

我的仿真结果出现了数值振荡,可能是什么原因?

文献解读

对于复杂的理论问题,Claude 可以帮助解释:

解释 SIMPLE 算法中压力修正方程的推导过程

下一步学习方向

  1. 进阶数值方法:学习高阶格式(WENO、DG)、时间推进方法(Runge-Kutta)
  2. 不可压缩流动:学习投影法、SIMPLE 算法
  3. 可压缩流动:理解激波捕捉、Riemann 求解器
  4. 湍流模拟:RANS、LES、DNS 方法
  5. 网格生成:结构化网格、非结构化网格
  6. 并行计算:MPI、GPU 加速

推荐资源:

  • 《Computational Fluid Dynamics: The Basics with Applications》- John D. Anderson
  • 《Numerical Heat Transfer and Fluid Flow》- Suhas V. Patankar
  • YouTube: CFD Ninja、Fluid Mechanics 101 频道

总结

流体仿真是一个理论与实践紧密结合的领域。从简单的热传导方程开始,逐步掌握 Navier-Stokes 方程的数值求解方法,你将能够模拟越来越复杂的流体现象。

记住:先跑通简单算例,再挑战复杂问题。每一个成功的仿真背后,都是对基础概念的深刻理解和大量调试经验的积累。

在下一篇文章中,我们将使用 AI 辅助编写更复杂的流体仿真代码,敬请期待!