CFD 求解器设计:有限体积、压力速度耦合与并行时间推进 / CFD Solver Design with Finite Volumes and Pressure-Velocity Coupling
📅 创建时间:2026-07-23
🏷️ 标签:#CFD #有限体积 #SIMPLE #PISO #HaloExchange
📚 前置知识:[[02-structural-solver-design]] [[../marine-cae/04-cfd-equations]]
📚 相关知识:[[../marine-cae/03-marine-fluid-physics]] [[../marine-cae/05-marineflow-workflow]]
1. CFD 求解器的核心循环
不可压缩流动没有一个独立、直接给出压力的演化方程。压力用于约束速度满足质量守恒,因此工业 CFD 求解器通常反复执行:
更新物性和模型系数
→ 组装/求解动量方程
→ 构造压力或压力修正方程
→ 修正面通量、速度和压力
→ 求解湍流、能量、组分和相分数
→ 更新边界与源项
→ 检查残差、守恒和工程监控量稳态问题重复外迭代,瞬态问题在每个物理时间步内执行若干校正。
2. 网格拓扑和字段
Cell-Centered 有限体积常用:
Cell
├─ volume
├─ center
├─ incident faces
└─ cell fields: p, U, T, k, omega, ...
Face
├─ owner cell
├─ neighbour cell 或 boundary patch
├─ area vector
├─ center
└─ face fields: flux, interpolated valuesowner/neighbour 数组决定绝大多数面循环的间接访问。边界面没有 neighbour,而是通过 BoundaryPatch 和边界条件对象提供外侧状态或系数贡献。
Ghost Cell
在 MPI 分区中,本 Rank 拥有内部 Cell,同时保存邻居 Rank 边界 Cell 的 Ghost 副本。每次依赖邻域数据的计算前,需要更新相应 Ghost 字段。
字段应声明更新需求,避免所有变量在每个阶段都无条件通信。
3. 几何预计算
静态网格可以预计算:
- Cell 体积、中心;
- Face 面积向量和中心;
- owner-neighbour 中心连线;
- 插值权重;
- 非正交修正系数;
- 边界局部坐标。
动网格或变形网格需要按时间步更新,并满足几何守恒律。缓存几何量能减少重复计算,但会增加内存流量,必须根据访问频率选择。
4. 有限体积离散
通用输运方程:
∂(ρφ)/∂t + ∇·(ρUφ) = ∇·(Γ∇φ) + Sφ对控制体积分后得到:
aP φP = Σ aN φN + b组装过程按面处理对流和扩散,再按 Cell 处理源项和时间项。
对流项
常见格式:
- 一阶迎风:稳定、耗散大;
- 中心:精度高,但高 Peclet 数时可能振荡;
- 二阶迎风、QUICK;
- TVD/NVD 限制器:在精度和有界性间折中。
高阶格式需要梯度和更多邻域数据,增加计算、通信和分支。
扩散项
正交网格上主要沿 Cell 中心连线计算。非正交网格需要修正项,可能采用显式延迟修正并进行额外非正交迭代。
源项
源项线性化影响稳定性:
Sφ ≈ Su + Sp φP合理的隐式部分可以增强对角占优;不合理的正 Sp 可能破坏稳定性。
5. 梯度计算
常用方法:
- Green-Gauss;
- Least Squares;
- 加权 Least Squares;
- 限制梯度。
梯度计算通常读取邻接 Cell,属于间接访存热点。优化方向包括按拓扑重编号、批量计算多个变量、复用几何系数和避免每次迭代重复分配临时 Field。
精度检查要使用制造解或已知梯度场,不能只测速度。
6. 边界条件架构
边界条件不只是“给一个值”,它要对矩阵、通量或外侧状态产生贡献:
| 边界 | 典型处理 |
|---|---|
| 固定值 Dirichlet | 修改边界面插值和方程源项 |
| 固定梯度 Neumann | 直接贡献扩散通量 |
| 入口 | 速度、湍流和组分的联合状态 |
| 出口 | 压力参考、回流处理 |
| 壁面 | 无滑移、壁面函数、热通量 |
| 对称 | 法向速度和法向梯度约束 |
| 周期 | 成对面映射,可能跨 Rank |
边界对象应明确它影响哪些方程以及需要哪些字段。把所有边界写成大段类型分支会阻碍插件扩展和 GPU 批处理。
7. SIMPLE
适合稳态不可压缩流:
1. 用当前压力组装并求解动量预测速度
2. 从动量离散系数构造压力修正方程
3. 求解压力修正
4. 修正压力、速度和面质量通量
5. 对压力、速度或其他变量欠松弛
6. 求解湍流、能量等标量
7. 检查收敛并重复欠松弛提高稳定性,但过小会显著增加迭代次数。优化不能只降低单次迭代时间,也要观察总迭代数。
8. PISO 与 PIMPLE
PISO
主要用于瞬态问题。一个时间步内进行多次压力校正,使速度和压力在较少外循环下满足耦合。
PIMPLE
将 SIMPLE 外循环和 PISO 内校正结合,常用于较大时间步、强耦合瞬态或动网格问题。
时间步成本可写成:
每步时间 =
外校正次数
×(动量求解 + 压力校正次数 × 压力求解 + 模型方程)选择算法时同时考虑稳定性、时间精度和每步计算量。
9. 分离式与耦合式
分离式 Segregated
逐个求解速度分量、压力和标量:
- 单个系统较小;
- 内存需求低;
- 易复用标量稀疏求解器;
- 强耦合或高速可压缩流可能需要更多迭代。
耦合式 Coupled
把多个变量组成块系统:
- 耦合更强,可能减少外迭代;
- BSR 和块预条件器更自然;
- 单步内存和实现复杂度更高;
- GPU 上块算子可能提高数据复用。
评价应比较达到同一收敛与精度所需的总时间,而不是只比较一次线性求解。
10. 湍流、能量和多相模型
湍流
RANS 模型通常增加 k、ε、ω 等输运方程,并修改有效黏度。壁面距离、壁面函数和变量有界性是重要工程细节。
能量与组分
能量、组分和反应源项可能带来强刚性。化学源项常适合 Cell 级并行,但每个 Cell 工作量差异可能很大。
VOF
相分数方程要求守恒和有界:
0 ≤ α ≤ 1界面压缩、几何重构和曲率计算会引入额外邻域访问与分支。表面张力误差可能产生寄生流,不能用残差下降掩盖。
11. 线性系统与预条件
不同方程性质不同:
- 压力方程接近 Poisson 型,AMG 通常关键;
- 动量和标量输运含对流,矩阵常非对称;
- Coupled 系统需要块预条件或 Schur Complement 思路;
- 网格质量差会恶化条件数。
监控至少包括:
每类方程调用次数
平均/最大迭代数
预条件建立时间
预条件应用时间
SpMV 和全局归约时间
失败与重启次数如果压力求解占大部分时间,优化湍流方程中的小 Kernel 不会显著改变端到端性能。
12. MPI 域分解
典型每次方程循环:
更新边界和局部系数
→ 启动 Ghost/Halo 交换
→ 计算不依赖远端数据的内部区域
→ 等待通信
→ 计算分区边界区域
→ Krylov SpMV 和全局归约主要成本:
- 分区面数量决定 Halo 数据量;
- 最慢 Rank 决定同步步长;
- CG/GMRES 中点积产生全局归约;
- AMG 粗网格并行度下降;
- 输出可能让所有 Rank 同时争用文件系统。
通信重叠只有在内部计算足够多、MPI 实现能够异步推进时才有效。
13. GPU 执行
适合 GPU 的阶段:
- 面通量、梯度、源项和残差;
- 稀疏矩阵向量乘;
- 向量更新与归约;
- 粒子、化学和局部模型。
常见障碍:
- owner/neighbour 间接访问;
- 对两个 Cell 的散射写冲突;
- 边界和模型类型导致分支;
- 多个小 Field Kernel 启动开销;
- CPU 端组装后频繁传输矩阵;
- AMG 粗层 GPU 利用率低。
优化原则是让主要场和矩阵长期驻留设备,合并小循环,并为面或 Cell 重新排序;不要每次迭代在 CPU/GPU 间往返。
14. 收敛判断
代数残差
表示离散线性方程未满足程度,但不同软件的归一化定义可能不同。
守恒误差
检查入口、出口、源项和累积量之间的质量、能量或组分平衡。
工程监控量
例如阻力、升力、压降、平均温度、自由液面高度。残差下降但工程量持续漂移,通常还不能停止。
瞬态统计
周期或湍流问题可能不趋向常数,需要检查时间序列、频谱、统计平均和采样长度。
15. 性能分解
稳态总时间:
外迭代数
×(通量与组装 + 各方程线性求解 + 模型更新 + 通信)
+ 初始化与 I/O瞬态总时间:
物理时间步数
× 每步校正次数
× 每次校正成本
+ Checkpoint 与结果输出必须同时记录迭代次数和单次迭代成本。网格、离散格式、CFL、松弛、AMG 参数和硬件实现都会影响最终时间。
16. 观察、解释与下一步
| 观察到什么 | 说明什么 | 下一步检查什么 |
|---|---|---|
| 连续性残差不降 | 压力通量耦合或模型设置可能不一致 | 压力参考、通量修正、边界和网格质量 |
| 工程量振荡 | 可能是数值耦合不足,也可能是真实非稳态 | 松弛、时间步、频谱和瞬态监控量 |
| 压力方程迭代多 | Poisson 系统或 AMG 层次质量较差 | 非正交、系数尺度、粗化和平滑器 |
| MPI 扩展停止 | Halo、全局归约、粗网格或不均衡占比上升 | Rank 时间分布、消息和 AMG 各层 |
| GPU 利用率低 | 任务粒度、往返或分支限制设备并行 | Kernel 时间线、拷贝和 Warp Stall |
| 输出占比高 | 写出策略而非求解计算成为瓶颈 | 频率、字段、请求大小和并行格式 |
| 不同 Rank 数结果漂移 | 归约顺序或非确定遍历改变数值路径 | 停止准则、守恒和关键工程量容差 |
17. 正确性检查
- 全局质量、能量和组分守恒;
- 网格收敛与离散格式敏感性;
- 时间步与 Courant 数敏感性;
- 压力、速度和通量边界一致;
- 层流基准、制造解或解析解;
- 湍流与多相结果对模型和参数的敏感性;
- 不同并行规模下工程量在规定容差内一致;
- 优化前后残差历史、守恒误差和关键监控量等价。
下一篇:[[04-solver-data-structures]]