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
+25 -11
View File
@@ -83,11 +83,7 @@ DCTS 运行时所依赖的物理计算底座二进制文件 `assets/tlusty_stati
* **标准编译命令**:
```bash
cd /home/fmq/program/tlusty/tl208-s54/tlusty
gfortran -fno-automatic -O3 -o ../dcts/assets/tlusty_static tlusty208.f
```
* **大内存寻址编译选项 (推荐超大能级网格使用)**:
```bash
gfortran -fno-automatic -mcmodel=large -O3 -o ../dcts/assets/tlusty_static tlusty208.f
gfortran -fno-automatic -fno-toplevel-reorder -mcmodel=medium -O3 -o ../dcts/assets/tlusty_static tlusty208.f
```
#### 2. 编译 SYNSPEC 理论光谱合成引擎 (`assets/synspec_static`)
@@ -98,18 +94,36 @@ DCTS 运行时所依赖的物理计算底座二进制文件 `assets/tlusty_stati
* **标准编译命令**:
```bash
cd /home/fmq/program/tlusty/tl208-s54/synspec
gfortran -fno-automatic -O3 -o ../dcts/assets/synspec_static synspec54.f
```
* **大内存寻址编译选项**:
```bash
gfortran -fno-automatic -mcmodel=large -O3 -o ../dcts/assets/synspec_static synspec54.f
gfortran -fno-automatic -fno-toplevel-reorder -mcmodel=medium -O3 -o ../dcts/assets/synspec_static synspec54.f
```
#### 关键编译选项说明:
- `-fno-automatic`: 禁用局部变量的自动栈分配(强制将局部变量保存在静态内存区)。这是保证传统 FORTRAN 77 程序正常运行的关键参数,防止大型局部数组造成栈溢出(Stack Overflow)或段错误(Segmentation Fault)。
- `-O3`: 开启全量 LLVM/GCC 代码优化,极大加快完全线性化/加速 Lambda 迭代(CL/ALI)及辐射转移方程形式解的计算速度。
- `-mcmodel=large`: 当模型数组与数据段超越 2GB 寻址限制时,允许可执行文件使用 64 位大内存寻址模式
- **`-fno-toplevel-reorder`(关键修复,2026-08-11**: 禁用 gfortran 的顶级函数/变量重排优化。**SYNSPEC 与 TLUSTY 必须加此选项**——不加会导致 Balmer 跃迁(3646 Å)之后整个波长范围输出 NaN(`-O1` 及以上均触发,仅 `-O0` 幸免)。根因:该优化破坏了 SYNSPEC/TLUSTY 依赖的 COMMON 块数据初始化顺序,使氢线不透明度计算读到未初始化的内存。此项优化缺失对计算速度无显著影响(实测 `-O3 -fno-toplevel-reorder` 与 `-O3` 速度相当)
- `-mcmodel=medium`: 允许大型 COMMON 块(SYNSPEC 的 LINDAT/PARAMS COMMON 块超过 2GB)使用 64 位寻址,避免链接器 "relocation truncated to fit" 错误。
#### 3. 谱线表(SYNSPEC fort.19)部署
SYNSPEC 的谱线表通过 `assets/data/{linelist}` 分发(`/api/data/file/{name}` 路由),工作流 YAML 的 `linelist` 字段指定文件名。可用线表:
| 线表 | 波长范围 | 线数 | 大小 | 适用场景 |
| :--- | :--- | :--- | :--- | :--- |
| `gfATO.dat` | 1823000 Å | 230 万 | 238 MB | **默认/推荐**:全波段(EUV+UV+光学+近/中红外) |
| `gfVIS99.dat` | 30007550 Å | 15 万 | 12 MB | 仅可见光诊断(快速) |
**部署步骤**`gfATO.dat` 不入库,需手动放置):
```bash
# 把 gfATO.dat 复制到 server 的 assets/data/ 目录(被 .gitignore 排除)
cp /path/to/gfATO.dat assets/data/gfATO.dat
# node 端首次连接时自动从 server 下载(238MB,首次较慢,之后缓存)
```
**SYNSPEC 波长范围限制**(实测):
- 可靠范围:**100–23000 Å**(超出此范围输出截断,仅 ~235 行无效数据)
- 工作流默认配置:`alam0: 100.0, alast: 20000.0`(留安全余量)
- 波长范围由工作流 YAML `synspec_input.line6.alam0/alast` 控制,须与线表覆盖范围匹配
---