LBM流体仿真
基于LBM方法实现二维流体仿真。
格子Boltzmann方法(Lattice Boltzmann Method, LBM)是一种基于介观(mesoscopic)模拟尺度的计算流体力学(Computational Fluid Dynamics, CFD)方法。和传统CFD方法相比,LBM具有介于微观分子动力学模型和宏观连续模型的介观模型特点,因此具备流体相互作用描述简单、复杂边界易于设置、易于并行计算等优势。在这篇博客中,我们将从零开始一步步构建一个LBM二维仿真器,并利用NVIDIA Warp库实现流体实时仿真。
LBM Theory
Discretization
LBM是基于网格的计算方法。在宏观层面,我们首先需要将流场空间离散成网格,每个网格记录下流体在该位置上的密度
而在微观层面上,每个格子还包含了一组粒子分布函数(distribution function),它们描述了粒子在各个微观方向上流动的概率。以二维LBM最常用的D2Q9模型为例,流体在每个格子上的密度与流速可以由9个微观方向上的分布函数来描述:
其中每个格子在微观上9个方向的分布函数为

Collide and Stream
LBM在进行流体仿真时,核心操作包括两个步骤:碰撞(collide)和流动(stream)。这里”碰撞”是指在每个格子上的粒子实现均衡(equilibrium)。在D2Q9模型中,均衡分布的计算公式为:
其中,
上式中
计算出新的分布函数
LBM Implementation
LBM进行流体仿真的基本步骤可以概括为:
- 初始化流场
- 循环迭代:
- 计算碰撞
- 计算迁移
- 更新流场
除了上述基本步骤外,进行流体仿真时还需要计算相关的物理量并施加边界条件等操作。这些步骤需要根据具体的仿真问题进行处理,相关细节将在后续的实例中进一步说明。整体代码可以参考git仓库。
Lid-Driven Cavity Flow
顶盖驱动流(lid-driven cavity flow)是流体动力学中常用的基准问题,用于验证计算方法。我们可以设想一个方形舱体,舱内充满流体,并在顶部施加一个恒定的水平方向速度。此时,流体将在水平流速的驱动下流动,直到达到稳定状态。
顶盖驱动流的雷诺数计算公式为:
其中流体的特征速度为
运行CavityFlow.py
可以得到仿真结果如下。

Kármán Vortex Street
卡门涡街(Kármán vortex street)是自然界中常见的流体现象,通常出现在流体经过钝体时,会产生周期性的漩涡脱落。要模拟卡门涡街,最直观的方法是求解圆柱绕流问题。我们可以在矩形流场中放置一个圆柱,当流体流经圆柱时,可能会形成卡门涡街现象。实际上,卡门涡街的产生与流体的雷诺数密切相关,只有当雷诺数足够大时,才会观察到这一现象。对于圆柱绕流问题,雷诺数的计算公式为:
其中
和顶盖驱动流相比,圆柱绕流的边界条件设置要稍微复杂一些。对于矩形流场的边界,我们需要设置上下边界上的流速为0表示无滑移边界;在左边入口边界上设置流场的来流速度为固定值
运行KarmanVortexStreet.py
可以得到仿真结果如下。
