[solver] 重做聚合非线性残差并用于双时间内迭代早停 #6

开放中
TiMidlY2026-08-08 07:30:29 +08:00创建 · 0评论
所有者

背景

当前 TGV 的 Unst_Res 不能作为可靠的非线性残差或双时间内迭代收敛判据:

  • ComputeUnsteadyResidual 在 OpenMP 下使用线程私有向量和标量,最终只有 master 分片进入 MPI 归约;各线程还会竞争写 TGV_Unsteady_Residual
  • 即使单线程,它把更新前、已取负的 LinSysRes 与更新后的守恒量组合,状态时刻不一致。
  • 时间项与有限体积积分空间残差的尺度不一致,现有数值不对应定义清楚的离散方程残差。
  • 双时间步下当前不计算该字段;默认配置通过 INNER_ITER=5CONV_STARTITER=5 固定跑满五轮,没有基于聚合非线性残差的提前结束。

相关入口:

  • SU2_CFD/include/solvers/CFVMFlowSolverBase.inl::ComputeUnsteadyResidual
  • SU2_CFD/include/solvers/CFVMFlowSolverBase.inl::ImplicitEuler_Iteration
  • SU2_CFD/src/iteration/CFluidIteration.cpp 的 inner-iteration 循环与收敛判断
  • 正式一阶双时间实测 Dataset:bscc-m9-hq53

目标

把“残差定义、并行聚合、history 输出、收敛判断”作为一件事完成:

  1. 为单时间步和一阶/二阶双时间步定义数学上明确的离散非线性残差,区分空间积分残差、物理时间项和伪时间项。
  2. 明确采用积分形式还是逐控制体体积归一形式,以及最终报告绝对范数、相对范数还是二者。
  3. 在同一个状态 W 上计算残差与归一化分母,不混用更新前 RHS 和更新后解。
  4. 用线程安全、MPI 正确的方式聚合全局范数;不得保留每线程两份全域向量或共享写竞态。
  5. 将该量写入 history,并接入双时间 Inner_Iter 的可配置提前收敛判据;INNER_ITER 仍是上限,未达到阈值时必须跑到上限。
  6. 在数学口径和数值行为验证完成前,保持当前固定五轮默认行为;是否修改默认阈值另行作明确决定。

设计约束

  • 残差必须对应同一个离散非线性方程和同一个状态。若需要在更新后重新装配空间残差,应明确额外成本;若复用下一轮已经装配的残差,应明确首轮、末轮和退出判断的时序。
  • OpenMP 先做线程内局部累积,再确定性汇总到 rank 局部值;MPI collective 只归约标量统计。
  • 不以 RMS_DENSITY 等单一守恒分量冒充全系统聚合残差。
  • 不吞掉无效输入或非有限值;按仓库输出/错误处理约定明确报告。
  • history 字段名称、旧 Unst_Res 的兼容或替换策略需在实现前确定。

验收条件

  • 文档给出单时间步、一阶双时间步、二阶双时间步的离散残差定义及量纲/归一化说明。
  • 同一算例下 OMP_NUM_THREADS=14 的残差时间序列在浮点容差内一致,无数据竞态。
  • MPI 全局范数只统计 owned DOF,不重复 halo;不同合法拓扑间只保留预期的浮点归约差异。
  • 残差在双时间 history 中为有限、非占位值,并能逐 Inner_Iter 追踪。
  • 设置收敛阈值后可在达到条件时提前退出;未达到时严格受 INNER_ITER 上限控制。
  • 默认未启用早停时,现有固定五轮行为和物理解不漂移。
  • 增加针对残差定义、OpenMP 聚合、MPI owned-DOF 口径和提前退出的测试。
  • 测量额外墙钟与内存开销;任何额外全残差装配都必须有明确必要性和数据支撑。
## 背景 当前 TGV 的 `Unst_Res` 不能作为可靠的非线性残差或双时间内迭代收敛判据: - `ComputeUnsteadyResidual` 在 OpenMP 下使用线程私有向量和标量,最终只有 master 分片进入 MPI 归约;各线程还会竞争写 `TGV_Unsteady_Residual`。 - 即使单线程,它把更新前、已取负的 `LinSysRes` 与更新后的守恒量组合,状态时刻不一致。 - 时间项与有限体积积分空间残差的尺度不一致,现有数值不对应定义清楚的离散方程残差。 - 双时间步下当前不计算该字段;默认配置通过 `INNER_ITER=5`、`CONV_STARTITER=5` 固定跑满五轮,没有基于聚合非线性残差的提前结束。 相关入口: - `SU2_CFD/include/solvers/CFVMFlowSolverBase.inl::ComputeUnsteadyResidual` - `SU2_CFD/include/solvers/CFVMFlowSolverBase.inl::ImplicitEuler_Iteration` - `SU2_CFD/src/iteration/CFluidIteration.cpp` 的 inner-iteration 循环与收敛判断 - 正式一阶双时间实测 Dataset:`bscc-m9-hq53` ## 目标 把“残差定义、并行聚合、history 输出、收敛判断”作为一件事完成: 1. 为单时间步和一阶/二阶双时间步定义数学上明确的离散非线性残差,区分空间积分残差、物理时间项和伪时间项。 2. 明确采用积分形式还是逐控制体体积归一形式,以及最终报告绝对范数、相对范数还是二者。 3. 在同一个状态 `W` 上计算残差与归一化分母,不混用更新前 RHS 和更新后解。 4. 用线程安全、MPI 正确的方式聚合全局范数;不得保留每线程两份全域向量或共享写竞态。 5. 将该量写入 history,并接入双时间 `Inner_Iter` 的可配置提前收敛判据;`INNER_ITER` 仍是上限,未达到阈值时必须跑到上限。 6. 在数学口径和数值行为验证完成前,保持当前固定五轮默认行为;是否修改默认阈值另行作明确决定。 ## 设计约束 - 残差必须对应同一个离散非线性方程和同一个状态。若需要在更新后重新装配空间残差,应明确额外成本;若复用下一轮已经装配的残差,应明确首轮、末轮和退出判断的时序。 - OpenMP 先做线程内局部累积,再确定性汇总到 rank 局部值;MPI collective 只归约标量统计。 - 不以 `RMS_DENSITY` 等单一守恒分量冒充全系统聚合残差。 - 不吞掉无效输入或非有限值;按仓库输出/错误处理约定明确报告。 - history 字段名称、旧 `Unst_Res` 的兼容或替换策略需在实现前确定。 ## 验收条件 - [ ] 文档给出单时间步、一阶双时间步、二阶双时间步的离散残差定义及量纲/归一化说明。 - [ ] 同一算例下 `OMP_NUM_THREADS=1` 与 `4` 的残差时间序列在浮点容差内一致,无数据竞态。 - [ ] MPI 全局范数只统计 owned DOF,不重复 halo;不同合法拓扑间只保留预期的浮点归约差异。 - [ ] 残差在双时间 history 中为有限、非占位值,并能逐 `Inner_Iter` 追踪。 - [ ] 设置收敛阈值后可在达到条件时提前退出;未达到时严格受 `INNER_ITER` 上限控制。 - [ ] 默认未启用早停时,现有固定五轮行为和物理解不漂移。 - [ ] 增加针对残差定义、OpenMP 聚合、MPI owned-DOF 口径和提前退出的测试。 - [ ] 测量额外墙钟与内存开销;任何额外全残差装配都必须有明确必要性和数据支撑。
登录并参与到对话中。
1位参与者
通知
到期时间
到期日期无效或超出范围。请使用“yyyy-mm-dd”格式。

未设置到期时间。

依赖议题

未设置依赖项。

引用
TiMidlY/SU2-Quantum#6
没有提供说明。