物理修复(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 篇根因分析/验证文档
74 lines
3.8 KiB
Markdown
74 lines
3.8 KiB
Markdown
# 冷启动收敛调查与更正(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 冻结 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 修正
|
||
就达 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.5,itek/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 假收敛。
|