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
@@ -0,0 +1,97 @@
# 400 失败点二次分析与 NaN 伪收敛修复(2026-08-17
> 背景:三层修复(nst 行宽 / nl_direct 回退 / seed_finder 边界)部署重跑后,
> 9216 点中 8816 完成、**400 失败**。数据源:最新 DB 快照 `/home/fmq/下载/dcts.db`
> + 全量更新后的 `data/salvage/`6 节点)。
## 一、400 点分类(按每点最新一次任务)
| 类别 | 数量 | 机制 |
|---|---:|---|
| **NaN 伪收敛** | **261** | 见 §二,本轮核心 bug |
| 真发散(nl/nl_direct 1e16 STOP | ~131 | 20kK/logg≥6 富氦簇(~50+ 60kK/logg≤5.5 贫氦簇(~65)等 |
| 收敛但最深层能量残差 1.0–2.3% 超 1% 阈值 | 7 | 边际案例 |
分布(NaN 伪收敛修复前):teff=20000:76、55000:77、60000:121 为主。
## 二、NaN 伪收敛:根因链
生产工件实证(t60000_g6.0_he-4_c-4_n-4_o-4,多节点一致):
1. `seed_nc` 发散(best_max_relc 1.15e15),fort.7 含 4823 行 NaN → **污染种子**
2. `nl` 从污染种子启动 → TLUSTY 立即崩溃,fort.9 写出**全 `0.00E+00`**
(NaN 参与的相对变化无法计算,写出零;fort.9 尾部 TEMP 列可见 NaN);
3. `check_fort9`max_relc=0 < chmax=1e-3 → **`converged=true`(伪收敛)**
4. 因 nl 被判"收敛"**nl_direct 回退被跳过**(回退仅在 require_converged 失败时触发);
5. 最终门槛全灭(emflux nan_ratio=100%、温度 NaN、bfac 38% 极端值)→ 点失败,
282/288 个 emflux 失败的 ratio 恰为 0`integrated_flux=0, n_points=0`)。
## 三、修复
`crates/common/src/runner.rs` `execute_tlusty_stage()`
- 阶段被判 converged 后复查本阶段 fort.7`atmosphere_has_nan`,含 NaN/Inf/`***`/
E+300 检测),命中即否决收敛并标注 note;
- 被否决的阶段**不产出种子**`produced_seed=None`),阻断污染向下游传播。
测试:`unit_nan_pseudo_convergence_veto`(全零 fort.9 + NaN fort.7 → seed_nc 判失败、
nl 回退原始种子收敛);全 workspace 测试通过。
## 四、直测验证(test/20260817_failed400/direct-nl 复现 nl_direct 回退路径)
| 测试 | 点 | 种子 | 结果 |
|---|---|---|---|
| q1 | t60000_g6.0_he-4_c-4_n-4_o-4NaN 伪收敛簇) | 邻点 o-2 的收敛 .7 | ✅ **12it 收敛 7.0e-4**,温度三项全过(表层 0.79×Teff),emflux 4π∫Hλ/σT⁴=1.0014 |
| q2 | t20000_g6.5_he2_c-4_n-4_o-220k 富氦簇) | 邻点 c-3_n-3_o-2 | ❌ iter42 发散 STOP1.35e18 |
| q3 | t60000_g5.0_he-4_c-4_n-4_o-260k g5 簇) | 邻点 o-4 的收敛 .7 | ❌ 100it 耗尽,max_relc 546(温度结构物理但未收敛) |
q1 证明:NaN 伪收敛簇(261 点,65%)在修复后经 nl_direct 回退路径可完整恢复
(数值收敛 + 物理门槛全过)。q2/q3 为真发散硬核(~131 点),所用邻居种子不足以
收敛,需依赖生产的 exact_family 种子选择、多策略重试或 Teff 连续步进。
## 五、三类问题的验证测试与方案(test/20260817_failed400/
### 5.1 NaN 伪收敛簇(261 点)回收估计验证 — 成立
分层抽样 17 点(每 teff 档 2 个,种子 = 完成点中 CNO 精确匹配/最近邻的
salvage .7),direct-nl= nl_direct 回退的等价路径):
- **11/17 收敛**(20–41 迭代),温度结构三项全过,emflux 1.00011.0017 全达标;
- 6 个失败均为种子距离过大(Δlogg 0.5–1.5)直接 STOP——生产端 seed_finder 有
多候选 + 多策略重试(attempt 至 11 次),实际回收率高于单种子 65%;
- 结论:"修复后预期回收 ~261 点"估计成立且偏保守。
### 5.2 能量边际点(7 个)— nl_tight 回退,已实现
实测(mg_tight):从自身最终模型续迭代、CHMAX 1e-3→1e-4,约 19 迭代后
最深层 (RAD+CON)/TOT 残差 0.0199/0.0228 → **0.0011/0.0016**(降 ~10×)。
`runner.rs` 新增 nl_tight 回退:能量门槛失败 + 最终大气无 NaN 时,以
`<label>_tight`(CHMAX÷10)从自身模型续迭代,成功则刷新最终大气/快照并
重判能量。单测 `unit_nl_tight_fallback_wiring` 通过。
### 5.3 真发散硬核(~131 点)— 连续步进(continuation)方案验证通过
| 批次 | 配置 | 结果 |
|---|---|---|
| hard_base16 点分层抽样) | direct-nl + 最近完成点种子 | 4/16 |
| hard_ore0312 个失败点) | 同上 + ORELAX=0.3 | 1/12 |
| ladder_60k_he460k 贫氦簇代表) | 55k→57.5k→60k 三步 Teff 步进 | ✅ 28it/3.9e-4,物理过,emflux=1.0008 |
| ladder_20k_he220k/6.5 富氦簇代表) | g6.0→6.25→6.5 三步 logg 步进 | ✅ 27it/8.1e-4,物理过,emflux=1.0112<2% 阈值) |
两个最难簇的代表点在 direct-nl、ORELAX 全部失败后,**仅靠 2 个中间参数的
连续步进即完全收敛**。机理:单步 Δ 超出 Newton 收敛域时,把参数空间距离
切分为多段,每段以段首收敛解热启动段尾。
### 5.4 生产化建议
1. 部署本修复(NaN 伪收敛否决 + nl_tight 回退)重试 400 点:预期回收 261 簇
>65%/种子×多候选)+ 7 个能量边际点;
2. 为剩余硬核实现 ladder 策略:失败点自动生成 2–3 个中间参数步进链
(优先 logg 维度,其次 Teff;步长 Δlogg≤0.25 / ΔTeff≤2.5kK),
每步独立 nl + require_converged 串联,最后一步产出目标点模型。
实测两簇代表点总耗时 <6 分钟/点(3 步 × ~2 分钟)。
## 六、遗留问题
- 20k/6.5 富氦簇解分支跳变:同一点不同种子在好解/坏解(emflux 0.69)间跳变,
ladder 步进天然规避(每步验证收敛与物理性后才前进)。