Files
DCTS/docs/cold_start_fix_2026_08_12.md
fmq b058e66722 feat(all): NaN 伪收敛否决与 nl_tight 能量回退、emflux 检验 4π 修正、nst 行宽与种子边界修复、gfATO 谱线表接通与网格加密 9216 点、阶段分项统计与跳板机部署
物理修复(400 失败点归因,见 docs/failed400_nan_pseudo_convergence_2026_08_17.md):
- runner: 阶段 converged 后复查 fort.7,含 NaN/Inf 即否决(fort.9 全零伪收敛,
  曾致 261 点误跳过 nl_direct 回退);否决阶段不产出种子,阻断污染传播
- runner: nl_tight 回退——仅能量边际失败时以 CHMAX 收紧 10× 从自身模型续迭代,
  残差降幅 ~10×;execute_tlusty_stage 抽取供主链与回退共用
- conv_check: fort.14 为 Eddington 通量 Hλ,积分需乘 4π 再比 σTeff⁴
  (旧版 ratio 稳定 0.0796=1/4π,全点系统性假阳性)+ 回归测试
- nst_writer: 单行超 80 字符被 TLUSTY 静默截断,IFALI/JALI/TRAD 等从未生效;
  按 75 字符自动换行
- seed_finder: Teff 容忍度改含边界 <=,相邻 5000K 档恢复互为种子 + 回归测试

谱线表与网格:
- 默认线表 gfVIS99 → gfATO(全波段 18-23000Å),TaskSpec.linelist 支持工作流
  级覆盖,节点按需下载(进程互斥锁防并发重复下载 238MB)
- sdB_cno Teff 加密至 5000K 步长,432 → 9216 点;tlusty/synspec 静态二进制更新

统计与部署:
- grid 汇总改按 tlusty_status/synspec_status 分项计数,新增 tlusty_failed/
  synspec_failed/synspec_pending,前端详情页双视图适配
- deploy/fetch_results 支持跳板机 ProxyJump 与 SSH 主连接复用,fetch 新增 --force;
- Docker 构建支持 CARGO_MIRROR/USE_MIRRORS 国内镜像参数;移除 tools/ 拷贝
- 新增 tlusty-synspec-test skill 与 6 篇根因分析/验证文档
2026-08-17 23:55:26 +08:00

3.8 KiB
Raw Permalink Blame History

冷启动收敛调查与更正(2026-08-12)

⚠️ 结论更正(重要)

本文件是对 2026-08-11 系列"收敛修复"itek:0/iacc:0/DPSILG=1.5)的彻底复核。

最终结论:以上配置改动都无法让失败网格点从冷启动收敛,已全部回退。

此前声称"禁用 Kantorovich 后 iter5 从 1e51e7 降到 0.21.0、点收敛"是错误结论, 源于在探测程序运行中解析 fort.9 时只读到部分深度(TLUSTY 逐深度写入、缓冲未刷新), 把"部分深度的最大值"误当成了"该迭代的真实最大值"。

真实数据(完整 50 深度重新解析)

点 (he-2/he0 中等难度) baseline 末relc nokant(ITEK≥NITER) 末relc
he-2_c-1_n-2_o-4 4.5e+15 1.7e+03
he-2_c-2_n-4_o-4 6.3e+09 1.5e+07
he-2_c-4_n-1_o-1 9.7e+09 1.5e+04
he0_c-1_n-3_o-2 4.5e+09 7.0e+04
he0_c-2_n-2_o-3 1.4e+18 1.0e+04

6 个测试点 × 4 种配置 = 24 次运行,0 次收敛。 最难点 t50000_g5.0_he-4_c-4_n-4_o-4 用 itek=999 + orelax=0.5/0.1 也发散 iter10 relc≈6e5,两种 orelax 结果几乎相同)。

调查中确认的源码事实(仍然有效)

发现 源码依据
ITEK=0 冻结 populationsnitzer=0),不是禁用 Kantorovich tlusty208.f:1937 if(nitzer.gt.itek) nitzer=itek
IACC=0 是空操作(被 clamp 回默认 7 tlusty208.f:1928 IF(IACC.LE.4) IACC=7
默认 ITEK=4 在 iter≥5 冻结 JacobianKantorovich tlusty208.f:848-857
默认 IACC=7 在 iter≥7 外推 PSY0Ng/ACCEL2 tlusty208.f:29704

禁用 Kantorovich+Ng(设 itek/iacc > NITER确实把发散幅度降低了约 1e12~1e14×(如 he0_c-2_n-2: baseline 1e18 → nokant 1e4),但达不到收敛—— Newton 迭代自身在 grey LTE 起点即处于收敛域外,振荡不衰减。

物理背景

失败点的特征:He-poorhe=4+ 高 Teff50-60kK+ 低 logg5.0-5.5+ 极贫 CNO。DB 统计:

He 丰度 收敛 失败 失败率
he=+2(富氦) 359 25 7%
he=0 177 206 54%
he=2 139 245 64%
he=4(贫氦) 132 252 66%

这些点(纯 H 极端 NLTE 电离)从 grey LTE 模型冷启动,首次 NLTE 迭代的 POP 修正 就达 1e21e4(相对变化),Newton 步长超出收敛域。无论加速/阻尼参数如何设置, 迭代都在 1e21e6 之间振荡发散。调参救不回收敛域外的问题。

结论与建议

  1. YAML 已回退workflows/sdB_cno.yaml 恢复生产配置(nc NITER=10、nl NITER=100 orelax=0.5、seed_nc NITER=20、seed_nl NITER=100 orelax=0.5itek/iacc 用默认)。 此前所有"修复"itek:0 / iacc:0 / DPSILG=1.5 / itek=999)均无效或有害,全部移除。
  2. 真正的可行方向(需框架/Rust 改动,非 YAML 配置):
    • 连续法(continuation:从已收敛的较低 Teff(如 40-45kK)模型出发, 以该模型为 fort.8 热启动,逐步升高 Teff——NLTE 大气建模处理硬收敛点的标准方法。
    • 改进 seed_step 种子选择:优先选 He 丰度匹配的已收敛邻居(he=+2 邻居 收敛率 93% vs he=4 邻居 34%),而非仅按 Teff/logg 距离。
    • 或接受这些极端点(he=4 + 极贫 CNO + 50-60kK)需要人工/半自动处理。

相关计算文件

  • test/20260811_convergence_fix_abtest/runs_nc_probe/5 个中等难度点的 baseline / nokant / nokant_relax 三配置完整 10 迭代轨迹(fort.9),全部发散。
  • test/20260811_convergence_fix_abtest/runs_verify/runs_verify_01/: 最难点完整冷链(lte→nc→nl)验证,nc 发散、nl 因 NaN 假收敛。