# 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+Lucy,11迭代收敛) ### 未提交修改 (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+Lucy,11迭代收敛) - 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 所以无影响