Skip to content

N1ceSky/lbm-gpu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

lbm-gpu

基于 Vulkan 计算着色器的 GPU 加速格子玻尔兹曼方法 (LBM) 流体动力学模拟器,支持实时可视化。

使用 D2Q9 格子模型模拟二维不可压缩流体绕圆柱阵列的流动,在现代 GPU 上实现交互式帧率。

Language Build 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 个速度方向各一个)。每个模拟步骤包含:

  1. 流动 (Streaming):将分布函数传播到相邻格点
  2. 碰撞 (Collision):使用 BGK 近似将分布函数松弛至平衡态

松弛参数 omega 由雷诺数导出:

omega = 1.0 / (3.0 * nu + 0.5)
nu = u_max * diameter / Re

许可证

MIT 许可证,详见 LICENSE

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors