物理修复(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 篇根因分析/验证文档
3.8 KiB
3.8 KiB
冷启动收敛调查与更正(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 冻结 populations(nitzer=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 冻结 Jacobian(Kantorovich) |
tlusty208.f:848-857 |
默认 IACC=7 在 iter≥7 外推 PSY0(Ng/ACCEL2) |
tlusty208.f:29704 |
禁用 Kantorovich+Ng(设 itek/iacc > NITER)确实把发散幅度降低了约
1e12~1e14×(如 he0_c-2_n-2: baseline 1e18 → nokant 1e4),但达不到收敛——
Newton 迭代自身在 grey LTE 起点即处于收敛域外,振荡不衰减。
物理背景
失败点的特征:He-poor(he=−4)+ 高 Teff(50-60kK)+ 低 logg(5.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 之间振荡发散。调参救不回收敛域外的问题。
结论与建议
- YAML 已回退:
workflows/sdB_cno.yaml恢复生产配置(nc NITER=10、nl NITER=100 orelax=0.5、seed_nc NITER=20、seed_nl NITER=100 orelax=0.5,itek/iacc 用默认)。 此前所有"修复"(itek:0 / iacc:0 / DPSILG=1.5 / itek=999)均无效或有害,全部移除。 - 真正的可行方向(需框架/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 假收敛。