Files
DCTS/docs/cold_start_fix_2026_08_12.md
T
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

74 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 冷启动收敛调查与更正(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 假收敛。