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 篇根因分析/验证文档
This commit is contained in:
fmq
2026-08-17 23:55:26 +08:00
parent 43b82b1ae2
commit b058e66722
54 changed files with 5624 additions and 347 deletions
+73
View File
@@ -0,0 +1,73 @@
# 冷启动收敛调查与更正(2026-08-12)
## ⚠️ 结论更正(重要)
本文件是对 2026-08-11 系列"收敛修复"`itek:0`/`iacc:0`/`DPSILG=1.5`)的彻底复核。
**最终结论:以上配置改动都无法让失败网格点从冷启动收敛,已全部回退。**
此前声称"禁用 Kantorovich 后 iter5 从 1e5~1e7 降到 0.2~1.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 冻结 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 修正
就达 1e2~1e4(相对变化),Newton 步长超出收敛域。无论加速/阻尼参数如何设置,
迭代都在 1e2~1e6 之间振荡发散。**调参救不回收敛域外的问题。**
## 结论与建议
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 假收敛。