Skip to content
Gains Summary
Main Navigation 首页 / Home
C++ 编程 / C++ Programming
系统与高性能 / Systems & Performance
Web 开发 / Web Development
人工智能 / Artificial Intelligence
工业软件 / Industrial Software
其他内容 / Other Topics
C++ 编程 / C++系统与性能 / SystemsWeb 开发 / Web人工智能 / AI工业软件 / Industrial

外观

Sidebar Navigation

← 工业软件 / Industrial Software

求解器工程 / Solver Engineering

1. 工业求解器工程:从物理方程到体系结构优化 / Industrial Solver Engineering from Physical Equations to Architecture Optimization

2. 生产级求解器架构:模块边界、执行管线与可观测性 / Production Solver Architecture with Module Boundaries, Pipelines, and Observability

3. 结构求解器设计:从单元积分到非线性、动力与接触 / Structural Solver Design from Element Integration to Contact and Dynamics

4. CFD 求解器设计:有限体积、压力速度耦合与并行时间推进 / CFD Solver Design with Finite Volumes and Pressure-Velocity Coupling

5. 求解器数据结构:稀疏矩阵、场布局、Cache、NUMA 与 Ghost 数据 / Solver Data Structures for Sparse Matrices, Fields, NUMA, and Ghost Data

6. CAE 性能分析:CPU、GPU、NUMA、MPI 与 I/O 工具链 / CAE Performance Analysis Across CPUs, GPUs, NUMA, MPI, and I/O

7. 体系结构驱动优化:从性能证据到算法、数据与并行处理 / Architecture-Driven Optimization from Evidence to Algorithms and Parallelism

8. 求解器优化案例:结构算子、CFD 通量与 MPI 强扩展 / Solver Optimization Cases for Structural Kernels, CFD Fluxes, and MPI Scaling

本页目录

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 求解器通常反复执行:

text
更新物性和模型系数
→ 组装/求解动量方程
→ 构造压力或压力修正方程
→ 修正面通量、速度和压力
→ 求解湍流、能量、组分和相分数
→ 更新边界与源项
→ 检查残差、守恒和工程监控量
1
2
3
4
5
6
7

稳态问题重复外迭代,瞬态问题在每个物理时间步内执行若干校正。

2. 网格拓扑和字段 ​

Cell-Centered 有限体积常用:

text
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 values
1
2
3
4
5
6
7
8
9
10
11
12

owner/neighbour 数组决定绝大多数面循环的间接访问。边界面没有 neighbour,而是通过 BoundaryPatch 和边界条件对象提供外侧状态或系数贡献。

Ghost Cell ​

在 MPI 分区中,本 Rank 拥有内部 Cell,同时保存邻居 Rank 边界 Cell 的 Ghost 副本。每次依赖邻域数据的计算前,需要更新相应 Ghost 字段。

字段应声明更新需求,避免所有变量在每个阶段都无条件通信。

3. 几何预计算 ​

静态网格可以预计算:

  • Cell 体积、中心;
  • Face 面积向量和中心;
  • owner-neighbour 中心连线;
  • 插值权重;
  • 非正交修正系数;
  • 边界局部坐标。

动网格或变形网格需要按时间步更新,并满足几何守恒律。缓存几何量能减少重复计算,但会增加内存流量,必须根据访问频率选择。

4. 有限体积离散 ​

通用输运方程:

text
∂(ρφ)/∂t + ∇·(ρUφ) = ∇·(Γ∇φ) + Sφ
1

对控制体积分后得到:

text
aP φP = Σ aN φN + b
1

组装过程按面处理对流和扩散,再按 Cell 处理源项和时间项。

对流项 ​

常见格式:

  • 一阶迎风:稳定、耗散大;
  • 中心:精度高,但高 Peclet 数时可能振荡;
  • 二阶迎风、QUICK;
  • TVD/NVD 限制器:在精度和有界性间折中。

高阶格式需要梯度和更多邻域数据,增加计算、通信和分支。

扩散项 ​

正交网格上主要沿 Cell 中心连线计算。非正交网格需要修正项,可能采用显式延迟修正并进行额外非正交迭代。

源项 ​

源项线性化影响稳定性:

text
Sφ ≈ Su + Sp φP
1

合理的隐式部分可以增强对角占优;不合理的正 Sp 可能破坏稳定性。

5. 梯度计算 ​

常用方法:

  • Green-Gauss;
  • Least Squares;
  • 加权 Least Squares;
  • 限制梯度。

梯度计算通常读取邻接 Cell,属于间接访存热点。优化方向包括按拓扑重编号、批量计算多个变量、复用几何系数和避免每次迭代重复分配临时 Field。

精度检查要使用制造解或已知梯度场,不能只测速度。

6. 边界条件架构 ​

边界条件不只是“给一个值”,它要对矩阵、通量或外侧状态产生贡献:

边界典型处理
固定值 Dirichlet修改边界面插值和方程源项
固定梯度 Neumann直接贡献扩散通量
入口速度、湍流和组分的联合状态
出口压力参考、回流处理
壁面无滑移、壁面函数、热通量
对称法向速度和法向梯度约束
周期成对面映射,可能跨 Rank

边界对象应明确它影响哪些方程以及需要哪些字段。把所有边界写成大段类型分支会阻碍插件扩展和 GPU 批处理。

7. SIMPLE ​

适合稳态不可压缩流:

text
1. 用当前压力组装并求解动量预测速度
2. 从动量离散系数构造压力修正方程
3. 求解压力修正
4. 修正压力、速度和面质量通量
5. 对压力、速度或其他变量欠松弛
6. 求解湍流、能量等标量
7. 检查收敛并重复
1
2
3
4
5
6
7

欠松弛提高稳定性,但过小会显著增加迭代次数。优化不能只降低单次迭代时间,也要观察总迭代数。

8. PISO 与 PIMPLE ​

PISO ​

主要用于瞬态问题。一个时间步内进行多次压力校正,使速度和压力在较少外循环下满足耦合。

PIMPLE ​

将 SIMPLE 外循环和 PISO 内校正结合,常用于较大时间步、强耦合瞬态或动网格问题。

时间步成本可写成:

text
每步时间 =
外校正次数
×(动量求解 + 压力校正次数 × 压力求解 + 模型方程)
1
2
3

选择算法时同时考虑稳定性、时间精度和每步计算量。

9. 分离式与耦合式 ​

分离式 Segregated ​

逐个求解速度分量、压力和标量:

  • 单个系统较小;
  • 内存需求低;
  • 易复用标量稀疏求解器;
  • 强耦合或高速可压缩流可能需要更多迭代。

耦合式 Coupled ​

把多个变量组成块系统:

  • 耦合更强,可能减少外迭代;
  • BSR 和块预条件器更自然;
  • 单步内存和实现复杂度更高;
  • GPU 上块算子可能提高数据复用。

评价应比较达到同一收敛与精度所需的总时间,而不是只比较一次线性求解。

10. 湍流、能量和多相模型 ​

湍流 ​

RANS 模型通常增加 k、ε、ω 等输运方程,并修改有效黏度。壁面距离、壁面函数和变量有界性是重要工程细节。

能量与组分 ​

能量、组分和反应源项可能带来强刚性。化学源项常适合 Cell 级并行,但每个 Cell 工作量差异可能很大。

VOF ​

相分数方程要求守恒和有界:

text
0 ≤ α ≤ 1
1

界面压缩、几何重构和曲率计算会引入额外邻域访问与分支。表面张力误差可能产生寄生流,不能用残差下降掩盖。

11. 线性系统与预条件 ​

不同方程性质不同:

  • 压力方程接近 Poisson 型,AMG 通常关键;
  • 动量和标量输运含对流,矩阵常非对称;
  • Coupled 系统需要块预条件或 Schur Complement 思路;
  • 网格质量差会恶化条件数。

监控至少包括:

text
每类方程调用次数
平均/最大迭代数
预条件建立时间
预条件应用时间
SpMV 和全局归约时间
失败与重启次数
1
2
3
4
5
6

如果压力求解占大部分时间,优化湍流方程中的小 Kernel 不会显著改变端到端性能。

12. MPI 域分解 ​

典型每次方程循环:

text
更新边界和局部系数
→ 启动 Ghost/Halo 交换
→ 计算不依赖远端数据的内部区域
→ 等待通信
→ 计算分区边界区域
→ Krylov SpMV 和全局归约
1
2
3
4
5
6

主要成本:

  • 分区面数量决定 Halo 数据量;
  • 最慢 Rank 决定同步步长;
  • CG/GMRES 中点积产生全局归约;
  • AMG 粗网格并行度下降;
  • 输出可能让所有 Rank 同时争用文件系统。

通信重叠只有在内部计算足够多、MPI 实现能够异步推进时才有效。

13. GPU 执行 ​

适合 GPU 的阶段:

  • 面通量、梯度、源项和残差;
  • 稀疏矩阵向量乘;
  • 向量更新与归约;
  • 粒子、化学和局部模型。

常见障碍:

  • owner/neighbour 间接访问;
  • 对两个 Cell 的散射写冲突;
  • 边界和模型类型导致分支;
  • 多个小 Field Kernel 启动开销;
  • CPU 端组装后频繁传输矩阵;
  • AMG 粗层 GPU 利用率低。

优化原则是让主要场和矩阵长期驻留设备,合并小循环,并为面或 Cell 重新排序;不要每次迭代在 CPU/GPU 间往返。

14. 收敛判断 ​

代数残差 ​

表示离散线性方程未满足程度,但不同软件的归一化定义可能不同。

守恒误差 ​

检查入口、出口、源项和累积量之间的质量、能量或组分平衡。

工程监控量 ​

例如阻力、升力、压降、平均温度、自由液面高度。残差下降但工程量持续漂移,通常还不能停止。

瞬态统计 ​

周期或湍流问题可能不趋向常数,需要检查时间序列、频谱、统计平均和采样长度。

15. 性能分解 ​

稳态总时间:

text
外迭代数
×(通量与组装 + 各方程线性求解 + 模型更新 + 通信)
+ 初始化与 I/O
1
2
3

瞬态总时间:

text
物理时间步数
× 每步校正次数
× 每次校正成本
+ Checkpoint 与结果输出
1
2
3
4

必须同时记录迭代次数和单次迭代成本。网格、离散格式、CFL、松弛、AMG 参数和硬件实现都会影响最终时间。

16. 观察、解释与下一步 ​

观察到什么说明什么下一步检查什么
连续性残差不降压力通量耦合或模型设置可能不一致压力参考、通量修正、边界和网格质量
工程量振荡可能是数值耦合不足,也可能是真实非稳态松弛、时间步、频谱和瞬态监控量
压力方程迭代多Poisson 系统或 AMG 层次质量较差非正交、系数尺度、粗化和平滑器
MPI 扩展停止Halo、全局归约、粗网格或不均衡占比上升Rank 时间分布、消息和 AMG 各层
GPU 利用率低任务粒度、往返或分支限制设备并行Kernel 时间线、拷贝和 Warp Stall
输出占比高写出策略而非求解计算成为瓶颈频率、字段、请求大小和并行格式
不同 Rank 数结果漂移归约顺序或非确定遍历改变数值路径停止准则、守恒和关键工程量容差

17. 正确性检查 ​

  • 全局质量、能量和组分守恒;
  • 网格收敛与离散格式敏感性;
  • 时间步与 Courant 数敏感性;
  • 压力、速度和通量边界一致;
  • 层流基准、制造解或解析解;
  • 湍流与多相结果对模型和参数的敏感性;
  • 不同并行规模下工程量在规定容差内一致;
  • 优化前后残差历史、守恒误差和关键监控量等价。

下一篇:[[04-solver-data-structures]]

最后更新于:

Pager
上一篇3. 结构求解器设计:从单元积分到非线性、动力与接触 / Structural Solver Design from Element Integration to Contact and Dynamics
下一篇5. 求解器数据结构:稀疏矩阵、场布局、Cache、NUMA 与 Ghost 数据 / Solver Data Structures for Sparse Matrices, Fields, NUMA, and Ghost Data

持续记录,持续成长

Copyright © Tidenflow