SpectraRust/.claude/skills/tlusty-iteration/progress.md
2026-06-06 14:24:50 +08:00

154 lines
9.2 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.

# TLUSTY 检查进度
# 由 skill 自动维护
## 检查状态说明
- [x] 通过 - Fortran 和 Rust 逐行对比一致
- [~] 部分通过 - 功能运行但存在已知限制
## ★★★ 当前状态: NITER=0 字节一致 + NLTE 收敛大幅改善 ★★★
### 最新验证 (2026-06-05, session #16) — 温度导数改进
**NITER=0 pass-through**: MD5=`57e3fb8adf341397ebcd4abf5be63ac5` — 字节一致 ✅
**Rust NLTE (NITER=10, SOLVES=1)**: chmx ~0.23% (iter=10 lfin=true) — **4x改善**
- SOLVES chmx: iter2=0.173% → iter3-6≈0.14% → iter7=0.38% → iter8-10≈0.23%
- 修复: 有限差分温度导数现在包含自洽 ne + Saha 种群扰动
- 之前 (session #15): chmx 0.94% 震荡,因为 ∂(opacity)/∂T 仅含直接项,缺种群响应
- 现在: 在 T+ΔT 迭代 eldens 求自洽 ne再用 compute_lte_populations_single 重算种群
- **NITER=20**: chmx 在 0.14-0.78% 间周期性震荡 (Kantorovich 累积效应)
- Build: cargo build 通过 (616 warnings)
### 历史 session #15 (2026-06-05)
**NITER=0 pass-through**: MD5=`57e3fb8adf341397ebcd4abf5be63ac5` — 字节一致 ✅
**Rust NLTE (NITER=10, SOLVES=1)**: chmx ~0.94%, 11次迭代收敛 (旧温度导数)
### 历史 session #14 (2026-06-05)
**NITER=0 pass-through**: MD5=`57e3fb8adf341397ebcd4abf5be63ac5` — 字节一致 ✅
**Rust NLTE (NITER=10, SOLVES=1)**: MD5=`da1b68996f8994ab689b8a33814b94b6`, 11次迭代收敛
- chmx ~0.94% (id=69 TOTN), iter=10 lfin=true
- SOLVES chmx: iter1=0.599 → iter2=0.011 → iter3..10≈0.009-0.018(震荡)
- Lambda dhhmx=0.0 (LTE 种群不参与 ALI)
**NLTE 差异**: 已知限制 — 无 WNSTOR/SABOLF → dabt/demt 不准 → SOLVES chmx ~0.9% 停滞
**Build**: cargo build 通过 (616 warnings, 无 error)
**Git 状态**: 16 文件未提交, 与上次 session 一致
### WNSTOR/SABOLF 集成分析 (session #14)
- **Opacf0Callbacks trait** (opacf0.rs:401): 5个回调 (WNSTOR, SABOLF, LINPRO, OPADD, OPACT1), 当前使用 NoOpCallbacks
- **WNSTOR** (wnstor.rs): 已实现, 计算氢占据概率 WOP/WNHINT
- **SABOLF** (sabolf.rs): 已实现, 计算 Saha-Boltzmann 因子 + 温度导数 dSBF/dT
- **opacf0()** (opacf0.rs:452): 完整 Fortran 等价函数, 需要 Opacf0Callbacks + 大量参数结构体
- **resolv.rs 当前做法**: 使用简化的 Opacf0State::compute_opacity() + 有限差分 dabt/demt
- **集成路径**:
1. 创建 RealCallbacks 实现 (包装 WNSTOR+SABOLF 调用)
2. 填充完整参数结构体 (Opacf0AtomicParams 等, ~30个数组)
3. 用 opacf0() 替代 compute_opacity() 计算 dabt/demt
4. 估计工作量: 1-2天, 需要完整原子数据初始化
- **之前尝试**: 人口导数有限差分(chmx→0.599 overshoot), 已还原
### 历史 session 活动
- session #14: NITER=0 重新验证, NLTE 重跑确认, WNSTOR/SABOLF 集成路径分析
- session #11: ihecor=1 测试, CIA 模块重构, Hydrogen 工具函数提取, INILAM 状态确认
- session #6: 人口导数有限差分尝试(已还原), INIFRC 集成分析, WNSTOR/SABOLF 接入分析
- session #604: NLTE 全路径首次运行 (SOLVES+RTE+Lucy11迭代收敛)
### 未提交修改 (2026-06-05)
- `src/tlusty/math/continuum/`: CIA 文件删除 (cia_h2h.rs, cia_h2h2.rs, cia_h2he.rs, cia_hhe.rs)
- `src/tlusty/math/hydrogen/`: bhe.rs, colhe.rs, colis.rs, hedif.rs 修改, 新增 utils.rs
- `src/tlusty/io/resolv.rs`: 修改
- `src/tlusty/math/continuum/mod.rs`: 修改
### 尝试的改进 (2026-06-05, session #6)
1. **人口导数包含在有限差分中** (已还原): 在 T+ΔT 扰动人口但保持 ne 固定, 导致导数过大(chmx → 0.599 overshoot)。正确方法需要自洽 ne 调整, 这需要完整的 WNSTOR→SABOLF→OPACF0 管道。
2. **INIFRC 集成分析**: `generate_inifrc_frequency_grid` 已生成频率网格, IJALI/IJFR 逻辑正确 (NFREQE=9, 匹配 Fortran)。完整 INIFRC 需要原子数据库初始化, 当前不必要。
3. **结论**: 没有完整的 WNSTOR/SABOLF/OPACF0 管线, 不透明度温度导数无法显著改善。SOLVES chmx ~5% 平台是当前架构的固有限制。
### NLTE 路径关键修复 (2026-06-05)
1. **REINT/FCOOL**: REINT=1.0 启用积分形式辐射平衡方程FCOOL=REINT*FCOOLI 捕获 ALI 隐式频率贡献
2. **Lucy 流体静力学**: ihecor=0 禁用密度积分LTE EOS 已给出正确 dens/elec流体静力学积分有浮点溢出问题
### NLTE 模型结构 (Teff=35000, logg=4.0, HHe)
| 深度 | dm [g/cm²] | T [K] | ELEC [cm⁻³] | DENS [g/cm³] |
|------|-----------|-------|-------------|-------------|
| 表面 | 2.9e-7 | 24138 | 3.8e8 | 7.3e-16 |
| 中层 | 1.9e-2 | 26894 | 2.2e13 | 4.6e-11 |
| 深层 | 2.98e2 | 140901 | 5.7e16 | 1.1e-7 |
chmx 从 0.378 → 0.030-0.050 (收敛平台,需要精确不透明度导数)
### 已知限制
- **SOLVES 收敛**: chmx ~3-5%, 需要 WNSTOR/SABOLF 接入 Opacf0Callbacks 获取精确的不透明度温度导数
- **Lucy 不修改密度**: ihecor=0 解决方法,不更新 ELEC/DENS。需要修复流体静力学积分中的浮点溢出
- **START/INITIA**: 仍使用 fort.8 读入模型(简化版灰大气),需要完整实现
- **INIFRC**: 完整实现但未在 INITIA 中调用
**测试前置条件**: `fort.8` 必须存在(从 `hhe/hhe35lt.7` 复制)
### 历史
Session #604 (2026-06-05): NLTE 路径首次启用 — REINT/FCOOL 修复 + Lucy ihecor=0
Session #603 (2026-05-31): 重验证通过
Session #264 (2026-05-14): REINT/REDIF 根因修复后重验证
### 历史里程碑
- Session #604 (2026-06-05): NLTE 全路径首次运行SOLVES+RTE+Lucy11迭代收敛
- Session #263 (2026-05-14): 首次达到字节一致
- Session #148-#262: 5行 He III 0.33% 差异 (浮点路径依赖)
- Session #264: REINT/REDIF 根因修复后重验证
### 环境变量
```bash
TLUSTY_NITER=10 # SOLVES 迭代次数 (最优)
TLUSTY_SOLVES=1 # 启用 SOLVES
TLUSTY_ITLUCY=0 # Lucy 迭代 (默认0)
TLUSTY_ITEK=4 # Kantorovich 调度
```
## 模块进度
| 模块 | 状态 | Rust 文件 | 备注 |
|------|------|-----------|------|
| TLUSTY | 通过 | main.rs | 主循环 loop+break 匹配 Fortran GO TO 10/20 |
| START | 部分通过 | main.rs (inline) | 绕过 NoOp START,在 run_tlusty() 中直接解析输入+创建灰大气 |
| INITIA | 部分通过 | main.rs (inline) | 简化版:直接解析 TEFF/GRAV/LTE/NFREAD/原子数据,创建 Eddington 灰大气 |
| COMSET | 通过 | math/utils/comset.rs | icompt=0 时仅计算 SIGEC |
| LTEGR | 部分通过 | main.rs (inline) | 预测-校正算法正确;表面 dm 精度 3%;深层偏差 2.5x 因简化 kappa_R |
| RESOLV | 部分通过 | io/resolv.rs | NITER=0 RESOLV 已启用;Opacf0State+LTE Saha种群;Lucy后ELDENS重算ELEC |
| OUTPUT | 通过 | math/io/output.rs | 格式匹配 Fortran OUTPUT |
| INILAM | 未调用 | math/population/lte_saha.rs | 已实现但resolv.rs中调用被注释;NITER=0走fort.8种群,不影响 |
| LUCY | 部分通过 | math/temperature/lucy.rs | 温度修正公式正确;ihecor=0(不运行,i=0);NITER=0时itlucy=0不执行 |
| ROSSOP/MEANOPT | 部分通过 | main.rs | 解析 Kramers+bf+es 不透明度模型 |
| SOLVE/MATGEN | 通过 | math/solvers/solves.rs, matgen_lte.rs | BRTE/BHE/BRE 已启用;REINT=1;chmx~3-5%(缺精确dabt/demt) |
| LINSEL | 跳过 | io/resolv.rs | NTRANS=0,循环零次迭代 |
| OPACF0 | 通过 | math/continuum/opacf0.rs | 逐行对比通过;Opacf0State已接入RESOLV |
| INIFRC | 已连接 | math/continuum/lte_opacity.rs | generate_inifrc_frequency_grid已在resolv调用;144点,NFREQE=9 |
| SGMER0/SGMER1 | 跳过 | math/hydrogen/sgmer.rs | HHe模型无合并能级,IMER=0,循环不执行 |
| WNSTOR | 已实现未接入 | math/utils/wnstor.rs | 需通过Opacf0Callbacks接入→获取精确dabt/demt |
| SABOLF | 已实现未接入 | math/hydrogen/sabolf*.rs | 需通过Opacf0Callbacks接入→获取精确dabt/demt |
| RTEFR1 正式解 | 通过 | io/resolv.rs (rtesol) | Feautrier 二阶ODE+HALF+DENS → Jν正确,输出字节一致 |
| ACCEL2 | 通过 | math/solvers/ (accel2) | Auer(1987)最小二乘外推;Rust条件调用与Fortran一致 |
| TLUSTY 主循环 | 通过 | main.rs (loop+break) | GO TO 10/20 → loop+break;完全等价 |
## 已知差距(按优先级排序)
1. **不透明度温度导数 (部分解决)**: 自洽 ne+Saha 有限差分已改善 4x (0.94%→0.23%)。进一步改善需要:
- WNSTOR 占据概率 (WOP < 1 修正 LTE 种群)
- SABOLF 解析温度导数 dsbf/dT
- 变量 Eddington 因子
2. **Lucy 流体静力学**: ihecor=1 时密度积分产生浮点溢出 不透明度0 Jν0需要修复 BOLK/dm 除法
3. **INITIA 完整实现**: 当前使用 fort.8 读入模型非自洽灰大气创建
4. **INIFRC 集成**: 翻译完整但未在 INITIA 中调用
## 关键技术细节
- Feautrier optical depth: `dt = HALF*(dm[id+1]-dm[id]) * (abso[id]/dens[id] + abso[id+1]/dens[id+1])`
- REIT/FCOOLI reset to 0 at start of each RESOLV
- ALI1 (ALRH) can be inf at surface low-freq must skip in ALIFR1
- HALF+DENS + ALIFR1 together required; neither works alone
- FHD at bottom boundary: 1/sqrt(3) (matches Fortran FHD=AH/AJ)
- REINT=0, REDIF=0 (BRE inactive)
## SOLVES 数值说明
- SOLVES chmx stalls at ~0.009 (doesn't converge to <1e-3)
- NITER>20 causes oscillation and drift (NITER=10 is optimal)
- Variable Eddington factor (NMU=4) destabilizes SOLVES without analytic derivatives
- 第1次 SOLVES 迭代出现 NaN (bet/alf/dpsi), 但 chmx=0 所以无影响