基于 Vulkan 计算着色器的 GPU 加速格子玻尔兹曼方法 (LBM) 流体动力学模拟器,支持实时可视化。
使用 D2Q9 格子模型模拟二维不可压缩流体绕圆柱阵列的流动,在现代 GPU 上实现交互式帧率。
- D2Q9 格子玻尔兹曼方法,采用 BGK 单松弛时间碰撞模型
- Vulkan 计算着色器实现大规模 GPU 并行模拟
- 实时可视化,冷暖双色发散色图
- 4 种可视化模式:速度幅值、密度、x 方向速度、y 方向速度
- 边界条件:Zou-He 速度入口(抛物线分布)、零梯度出口、反弹壁面
- 交互控制:暂停、调整色标范围、改变模拟速度
- 性能指标:窗口标题实时显示 FPS 和 MLUPS(每秒百万格点更新数)
默认配置在 2048 x 512 网格上模拟流体绕过 26 个圆柱 的流动,圆柱呈 3 列交错排列,雷诺数 Re = 60。
| 参数 | 默认值 |
|---|---|
| 网格尺寸 | 2048 x 512 |
| 入口最大速度 (u_max) | 0.02 |
| 雷诺数 | 60 |
| 圆柱数量 | 26(3 列交错排列) |
| 每帧步数 | 60 |
| 窗口尺寸 | 1024 x 256 |
| 依赖 | 版本 | 说明 |
|---|---|---|
| Vulkan SDK | 1.2+ | 包含 glslc 着色器编译器 |
| GLFW | 3.3+ | 窗口管理和输入处理 |
| CMake | 3.20+ | 构建系统 |
| C++ 编译器 | 支持 C++20 | MSVC 2019+, GCC 10+, Clang 12+ |
# 克隆仓库
git clone https://github.com/<your-username>/lbm-gpu.git
cd lbm-gpu
# 配置并构建
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release可执行文件位于 build/Release/lbm.exe(Windows)或 build/lbm(Linux/macOS)。
GLSL 着色器会在构建过程中自动编译为 SPIR-V。
cd build
./lbm # Linux/macOS
.\Release\lbm.exe # Windows| 按键 | 功能 |
|---|---|
空格 |
暂停 / 继续 |
1 |
可视化速度幅值 |
2 |
可视化密度 |
3 |
可视化 x 方向速度 |
4 |
可视化 y 方向速度 |
↑ / ↓ |
调整色标范围 |
← / → |
减少 / 增加每帧步数 |
H |
显示 / 隐藏帮助信息 |
Esc |
退出 |
lbm-gpu/
├── CMakeLists.txt # 构建系统,含着色器编译
├── src/
│ ├── main.cpp # 程序入口、窗口、主循环
│ ├── lbm.h / lbm.cpp # LBM 求解器:缓冲区、计算管线、调度
│ ├── vulkan_context.h/cpp # Vulkan 实例、设备、交换链、工具函数
│ └── renderer.h/cpp # 图形管线,色图可视化
└── shaders/
├── lbm.comp # 计算着色器:碰撞 + 流动
├── visualize.vert # 顶点着色器:全屏三角形
└── visualize.frag # 片段着色器:冷暖色图映射
┌─────────────────────────────────────────────────────┐
│ GPU (Vulkan) │
│ │
│ ┌───────────┐ barrier ┌───────────┐ │
│ │ LBM Step 1│ ───────────> │ LBM Step 2│ ──> ... │
│ │ (compute) │ │ (compute) │ │
│ └───────────┘ └───────────┘ │
│ │ ping-pong 双缓冲 │
│ ▼ │
│ ┌─────────────┐ barrier ┌───────────┐ │
│ │ Macro Data │ ──────────> │ Renderer │ │
│ │ (SSBO) │ │ (graphics)│ │
│ └─────────────┘ └─────┬─────┘ │
│ │ │
│ ┌─────▼─────┐ │
│ │ Display │ │
│ └───────────┘ │
└─────────────────────────────────────────────────────┘
每帧执行 stepsPerFrame 次 LBM 计算调度(各步骤间插入管线屏障),随后执行一次图形渲染。分布函数采用 ping-pong 双缓冲 避免读写冲突。
格子玻尔兹曼方法将流体建模为离散格子上的粒子分布函数。每个格点存储 9 个分布函数(D2Q9 的 9 个速度方向各一个)。每个模拟步骤包含:
- 流动 (Streaming):将分布函数传播到相邻格点
- 碰撞 (Collision):使用 BGK 近似将分布函数松弛至平衡态
松弛参数 omega 由雷诺数导出:
omega = 1.0 / (3.0 * nu + 0.5)
nu = u_max * diameter / Re
MIT 许可证,详见 LICENSE。