diff --git a/README.md b/README.md new file mode 100644 index 0000000..1ffe4a1 --- /dev/null +++ b/README.md @@ -0,0 +1,157 @@ +# 水平卧式流化床 · 空床流场仿真 + +> 用 GPU 加速的 **3D D3Q19 格子玻尔兹曼方法 (LBM)** 计算水平卧式流化床**空床**(无颗粒)气相流场, +> 以**恒功率离心风机曲线**为压力进口,布风板为**多孔板**,流量与压差由物理自洽涌现。 + +--- + +## 1. 物理场景 + +| 项目 | 参数 | +| --- | --- | +| 布风板尺寸 | 2400 mm (x, 长度) × 567 mm (y, 宽度),水平放置 | +| 布风板厚度 | **2 mm** | +| 布风板开孔 | 孔径 2 mm,开孔率 **5.6%**,孔轴 **5° 倾斜**(朝 -x,出料方向) | +| 进风分区 | 沿长度均分 **4 段**(每段 600 mm),每段下方独立风箱 | +| 风箱高度 | 450 mm | +| 进风管 | 每段 **DN300**,从 567 mm 侧面水平居中进入(风向平行床板) | +| 沸腾/渐扩段 | 由 2400 × 567 在 **1000 mm** 高度内渐扩至 2400 × 1200 | +| 上部稳压段 | 2400 × 1200 × 400 mm | +| 渐缩段 | 500 mm | +| 排风 | 顶部居中 **DN800** 圆管 | + +### 工况(离心风机) + +| 项目 | 数值 | +| --- | --- | +| 单段额定风量 | 2500 m³/h(4 段合计 10000 m³/h) | +| 额定压差 | 2900 Pa(布风板上下) | +| 风机特性 | **恒功率输出** `Δp · Q = P`,P = 2900 × (10000/3600) ≈ **8056 W** | +| 关死压力 | 4350 Pa(用于 Q→0 截断) | + +> **关键物理认识**:2500 m³/h 与 2900 Pa 是风机**额定点**上的两个值,不是两个独立约束。 +> 离心风机给的是**风机曲线**,实际工况点是「风机曲线 ∩ 系统阻力曲线」的**唯一交点**。 +> 因此仿真中**只施加风机曲线压力**,流量由系统阻力自然涌现。 + +--- + +## 2. 数值方法 + +- **求解器**:D3Q19 格子玻尔兹曼,BGK 碰撞 + 推流 + 半步反弹(bounce-back)固体边界 +- **加速**:NVIDIA GPU(`numba.cuda`),实测约 **120 MLUPS**(百万格点更新/秒) +- **网格**:**100 格/m**,240 × 130 × 265 = **8,268,000 单元**(本机 8 GB 显存上限) +- **进口**:**压力进口**(固定密度 = 风机曲线压力),速度零梯度自由 +- **出口**:**压力出口**(密度 = 1,速度自由) +- **布风板**:固体薄板 + 规则开孔(1 格孔 / 间距 4 格 ≈ 6.25% 开孔率) +- **固体壁**:无滑移 + +### 缩放 + +| 量 | 说明 | +| --- | --- | +| `U_LB` | 0.015(进口参考速度对应的格子速度) | +| `SCALE_U` | `U_in / U_LB` | +| `SCALE_P` | `1.2 × SCALE_U²`(格子压力 → Pa) | + +--- + +## 3. 结果(100 格/m,2 mm 板厚) + +| 指标 | 数值 | +| --- | --- | +| 工况点风量 | **Q ≈ 1463 m³/h**(风机曲线与系统阻力交点) | +| 风机压力 | 4350 Pa(关死) | +| 风箱静压 | **4061 Pa** | +| 沸腾段静压 | **181 Pa** | +| **布风板压差** | **+3880 Pa**(风箱 > 沸腾段 ✓) | +| 最大流速 | 4.89 m/s | +| 求解 | 3900 步 / 184 s | + +> 压力**符号、结构、量级**均正确:风箱高压 → 布风板节流降压 → 沸腾段低压 → 向排风递减。 + +--- + +## 4. 输出图(`docs/assets/`,19 张,4× 分辨率) + +| 文件 | 内容 | +| --- | --- | +| `fbed-overview.png` | 四联总览(x-z / y-z / 近板 / 沸腾段) | +| `fbed-montage-plenum.png` | 风箱层水平切面 ×5(4 段侧进风分布) | +| `fbed-montage-nearplate.png` | 布风板近区水平切面 ×6(射流合并) | +| `fbed-montage-freeboard.png` | 沸腾段/渐扩/排风水平切面 ×6 | +| `fbed-montage-xz.png` | 垂直切面 x-z ×5 | +| `fbed-montage-yz.png` | 垂直切面 y-z ×8(沿长度) | +| `fbed-sections.png` | 4 个区段中心 y-z | +| `fbed-zoom-sections.png` | 按区段剖分的 x-z 局部放大 | +| `fbed-streamlines.png` | 双大图流线 | +| `fbed-vectors.png` | 速度矢量图 | +| `fbed-components.png` | 速度分量 ux/uy/uz | +| `fbed-3d-cutaway.png` | 三正交切面三维剖切 | +| `fbed-pressure.png` | 静压场四联 | +| `fbed-pressure-drop.png` | 布风板压差分析 | +| `fbed-uniformity.png` | 各区段流量均匀性 | +| `fbed-decay.png` | 沿高度气速衰减 | +| `fbed-flowrate.png` | 进风/布风板/排风 风量平衡 | +| `fbed-tilt.png` | 布风板 5° 倾斜对近板风向影响 | +| `fbed-geometry.png` | 几何与边界示意 | + +数据:`docs/assets/fbed_fields.npz`(ux/uy/uz/rho/solid)。 + +--- + +## 5. 复现 + +```bash +# 依赖: Python 3.11+, numpy, numba, numba-cuda, CUDA 13.2 runtime, matplotlib +# 主仿真 (100 格/m, 约 3-5 分钟) +python tools/fbed_simulation.py + +# 批量出图 (秒级, 读 npz) +python tools/fbed_figures.py +python tools/fbed_analysis.py +``` + +环境变量(可选): + +| 变量 | 默认 | 说明 | +| --- | --- | --- | +| `FBED_PPM` | 100 | 网格分辨率 (格/m) | +| `FBED_ULB` | 0.015 | 参考格子速度(越小越不可压,但越慢) | +| `FBED_HOLE` / `FBED_SPACE` | 1 / 4 | 开孔大小 / 间距(格) | +| `FBED_TB` | 120 | 求解墙钟预算 (s) | +| `FBED_DP` | 2900 | 额定压差 (Pa) | + +--- + +## 6. 脚本说明 + +| 文件 | 作用 | +| --- | --- | +| `tools/fbed_simulation.py` | 主求解器(GPU LBM + 风机曲线 + 多孔板) | +| `tools/fbed_figures.py` | 切面/矢量/压力/流量等批量出图 | +| `tools/fbed_analysis.py` | 几何/倾斜/均匀性/衰减/压差等分析图 | +| `tools/fbed_check.py` / `fbed_check2.py` | 通量与压差诊断 | +| `tools/fbed_probe.py` | 切面 ASCII 速度探针 | +| `tools/fbed_rans.py` | RANS(投影法+AMG) 尝试版(未收敛,留档) | + +--- + +## 7. 局限与已知问题(诚实声明) + +1. **板厚亚网格**:2 mm 板厚在 100 格/m(格距 10 mm)下**小于一个网格**,只能按 1 格最薄板近似。要真正解析 2 mm 板 + 2 mm 孔,需 ~500 格/m(约 10.3 亿单元,需 ~157 GB 显存,本机 8 GB 无法承载)。 +2. **5° 倾角未施加**:倾角水平分量仅为垂直分量的 8.7%,粗网格下孔道倾斜不足 1 格,无法几何分辨;作为动量源施加时曾导致进口反流,暂关闭。方向已按设计设为 **-x**。 +3. **不可压近似**:LBM 密度波动 ~2.5%,压力场为相对值。 +4. **层流**:未加湍流模型,粗网格下湍流混合未解析。 +5. **工况点偏低**:细网格把布风板开孔阻力解析得更"阻",工况点落在 1463 m³/h;若要标定到额定 10000 m³/h,需放大等效开孔或减薄板厚。 + +--- + +## 8. 后续方向 + +- 用 **OpenFOAM**(`simpleFoam` + `k-ε` + `porousBafflePressure`)在 CPU 上跑更高分辨率(~250–300 格/m) +- 布风板改用**多孔跳变边界**(Δp = K·½ρv²,K≈900),避免离散开孔的网格依赖 +- 以求解器生成参数化数据集 → 训练 **GNN/Transformer 神经算子** → 毫秒级实时推理 + +--- + +*本项目为物理世界流场实时仿真方向的水平卧式流化床 Demo。* diff --git a/docs/开发过程与提示词汇总.md b/docs/开发过程与提示词汇总.md new file mode 100644 index 0000000..63af5a3 --- /dev/null +++ b/docs/开发过程与提示词汇总.md @@ -0,0 +1,151 @@ +# 开发过程与提示词汇总 + +> 记录本项目从需求提出到最终交付的完整对话过程、关键技术决策与物理认识。 +> 项目:水平卧式流化床空床流场仿真(GPU LBM) + +--- + +## 一、需求提出 + +**用户初始需求(原始提示词):** + +> 我的水平卧式流化床,床板开孔 2mm,开孔率 5.6%,床板的尺寸 2400x567mm,床板下方进风, +> 进风分成 4 个区段,每一个区段都是一个箱体。每个区段都用直径 300 的进风管居中,从侧面进风, +> 也就是进风风向和床板是平行的。床板是水平放,床板的孔是往出口方向倾斜了一点,不是正朝上的, +> 倾斜很小,只有 5 度。进风风量是 2500 立方米每小时每个区段,然后进风风压,也就是床板上下方 +> 压差是 2900Pa,上面沸腾区段需要你模拟出来一个合适的放大形状,请模拟空床的流场,顶部沸腾段 +> 顶部是大排风管,还是上面这个快速计算的思路。 + +**需求拆解:** +- 几何:2400×567 布风板、4 区段风箱、DN300 侧进风、2mm 孔 / 5.6% 开孔率 / 5° 倾斜、渐扩沸腾段、顶部大排风管 +- 工况:每段 2500 m³/h,压差 2900 Pa +- 目标:空床气相流场,快速计算,结果可参考 + +--- + +## 二、关键澄清(问答) + +用户对 3 个关键几何点做出选择: + +| 问题 | 用户选择 | +| --- | --- | +| 4 段如何划分 / 进风管方向 | 沿长度均分 4×600mm,DN300 从 567 侧面水平居中进入 | +| 沸腾段放大形状 | 矩形渐扩 + 顶部大排风(2.4×0.567 → 2.4×1.2,DN800) | +| 孔板 5° 倾斜方向 | 朝 +x(x=2.4 为出料端)| + +> **后记**:倾角方向在后续被用户更正为 **-x**(见"关键物理认识"第 4 条)。 + +--- + +## 三、技术路线演进 + +``` +LBM (GPU) ──► 发现问题 ──► RANS 尝试 ──► 失败 ──► 回到 LBM + 风机曲线 +``` + +### 阶段 1:GPU LBM 空床仿真 +- 3D D3Q19 LBM,`numba.cuda` 加速,实测 ~120 MLUPS +- 布风板最初用「速度边界」强制表观气速 +- **问题**:压力场符号反了(顶部压力 > 风箱),且质量不守恒 + +### 阶段 2:RANS 尝试(用户选 A) +- 用 `scipy` + `pyamg` 写投影法 + AMG 压力求解器 +- **失败**:共置网格棋盘振荡 + 进口速度边界过约束,压力爆到 -72703 Pa → NaN +- 改交错网格 MAC,AMG 收敛正常(残差 9e-9),但速度进口仍把压力逼爆 + +### 阶段 3:回到 LBM + 用户的两个关键物理修正 +- **修正 1(恒功率风机曲线)**:`Δp · Q = P`,不再强制流量 +- **修正 2(压力进口)**:进口给风机压力,流量自然涌现 +- **结果**:压力符号彻底修正,风箱 > 沸腾段 ✓ + +--- + +## 四、关键物理认识(用户指出,扭转全局) + +### 1. 不是"强制满足",而是风机曲线 +> "2500 是风机额定流量,2900 是压力,并不是不可变的,你搞什么呢,不是强制满足, +> 而是离心风机会出现一个风机曲线的" + +**含义**:2500 m³/h 与 2900 Pa 是同一额定点上的两个值,**不是两个独立约束**。 +工况点是「风机曲线 ∩ 系统阻力曲线」的**唯一交点**。仿真中只施加风机曲线压力,流量涌现。 + +### 2. 恒功率输出 +> "风机是遵循恒功率的输出" + +**含义**:风机曲线不是抛物线,而是 **`Δp · Q = P`(双曲线)**。 +额定点 (0.6944 m³/s, 2900 Pa) → P ≈ 2014 W/段,总 8056 W。 + +### 3. 不要纠结收敛 +> "你为什么总是在纠结于收敛,如果你走到收敛这条路,那么这个项目就不可能成功" + +**含义**:目标是快速、物理自洽的结果,而非把残差压到机器精度。 + +### 4. 倾角方向 +> "孔的倾斜方向是这个绿色箭头方向,我觉得你搞错了" + +**含义**:孔轴倾斜方向为 **上-左(-x)**,而非我之前设的 +x。 + +### 5. 板厚 +> "板厚只有 2mm,你按多少算的" + +**含义**:布风板厚 **2 mm**,而我当时用了 50 mm(差 25 倍),已修正。 + +--- + +## 五、遇到的问题与修正 + +| # | 问题 | 根因 | 修正 | +| --- | --- | --- | --- | +| 1 | 压力场符号反了 | 布风板用速度边界,无压降;压力由几何决定 | 改为压力进口 + 多孔板 | +| 2 | 质量不守恒(进 9903 / 出 20100) | 速度边界强制流量,与无散约束冲突 | 压力进口让流量自由 | +| 3 | RANS 压力爆到 -72703 Pa | 共置网格棋盘 + 进口过约束 | 改交错网格;仍失败,放弃 | +| 4 | 压力进口后流量反流 -5828 | 倾角动量源施加过强 | 暂关闭倾角力 | +| 5 | 顶部"进风口"误判 | 渐扩段末端向排风管强汇流的贴壁高速带 | 探针证实为汇流,非源 | +| 6 | 板厚 50mm | 我设错 | 改 2 mm | +| 7 | 500 格/m 要求 | 硬件装不下 | 见"硬件限制" | + +--- + +## 六、硬件限制(诚实核算) + +| 网格 | 单元数 | D3Q19 双缓冲显存 | +| --- | --- | --- | +| 80 格/m | 4.2 M | 0.6 GB ✅ | +| 100 格/m | 8.3 M | 1.3 GB ✅ | +| 200 格/m | 66 M | 10.1 GB ❌ | +| 300 格/m | 223 M | 33.9 GB ❌ | +| 500 格/m | 1033 M | **157 GB** ❌ | + +**本机**:RTX A2000 **8 GB 显存** + 64 GB 内存。 +- 500 格/m = 10.3 亿单元,光分布函数需 157 GB,**超显存 20 倍**,物理上装不下 +- 本机 GPU 实际上限 ≈ **100–150 格/m** +- 要上 500 格/m,需云 GPU(A100/H100 80GB × 2–4)或 CPU 求解器(OpenFOAM,64GB 内存可跑 ~250–300 格/m) + +--- + +## 七、最终交付 + +**仓库**:`http://124.220.63.9:30000/admin/Physics-Ai-Fluent-Analysis.git`(分支 `fluidized-bed`) + +**内容**: +- `tools/fbed_simulation.py`:主求解器(100 格/m,8.27M 单元) +- `tools/fbed_figures.py` / `fbed_analysis.py`:出图 +- `docs/assets/`:19 张图(4× 分辨率)+ `fbed_fields.npz` +- `README.md`:项目详细说明 + +**结果**: +- 工况点 Q ≈ 1463 m³/h(风机曲线与系统阻力交点) +- 风箱 4061 Pa > 沸腾段 181 Pa(**Δp = +3880 Pa,符号正确**) +- 求解 3900 步 / 184 s + +--- + +## 八、后续方向 + +1. **OpenFOAM**:`simpleFoam` + `k-ε` + `porousBafflePressure`,CPU 跑 250–300 格/m +2. **多孔跳变边界**替代离散开孔,消除网格依赖 +3. **神经算子**:以求解器生成参数化数据集 → 训练 GNN/Transformer → 毫秒级实时推理 + +--- + +*本文档汇总了从需求到交付的完整技术讨论,供后续迭代参考。*