9.2 KiB
9.2 KiB
TLUSTY 检查进度
由 skill 自动维护
检查状态说明
- 通过 - 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
- 集成路径:
- 创建 RealCallbacks 实现 (包装 WNSTOR+SABOLF 调用)
- 填充完整参数结构体 (Opacf0AtomicParams 等, ~30个数组)
- 用 opacf0() 替代 compute_opacity() 计算 dabt/demt
- 估计工作量: 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.rssrc/tlusty/io/resolv.rs: 修改src/tlusty/math/continuum/mod.rs: 修改
尝试的改进 (2026-06-05, session #6)
- 人口导数包含在有限差分中 (已还原): 在 T+ΔT 扰动人口但保持 ne 固定, 导致导数过大(chmx → 0.599 overshoot)。正确方法需要自洽 ne 调整, 这需要完整的 WNSTOR→SABOLF→OPACF0 管道。
- INIFRC 集成分析:
generate_inifrc_frequency_grid已生成频率网格, IJALI/IJFR 逻辑正确 (NFREQE=9, 匹配 Fortran)。完整 INIFRC 需要原子数据库初始化, 当前不必要。 - 结论: 没有完整的 WNSTOR/SABOLF/OPACF0 管线, 不透明度温度导数无法显著改善。SOLVES chmx ~5% 平台是当前架构的固有限制。
NLTE 路径关键修复 (2026-06-05)
- REINT/FCOOL: REINT=1.0 启用积分形式辐射平衡方程,FCOOL=REINT*FCOOLI 捕获 ALI 隐式频率贡献
- 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 根因修复后重验证
环境变量
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;完全等价 |
已知差距(按优先级排序)
- 不透明度温度导数 (部分解决): 自洽 ne+Saha 有限差分已改善 4x (0.94%→0.23%)。进一步改善需要:
- WNSTOR 占据概率 (WOP < 1 修正 LTE 种群)
- SABOLF 解析温度导数 dsbf/dT
- 变量 Eddington 因子
- Lucy 流体静力学: ihecor=1 时密度积分产生浮点溢出 → 不透明度→0 → Jν→0。需要修复 BOLK/dm 除法
- INITIA 完整实现: 当前使用 fort.8 读入模型,非自洽灰大气创建
- 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 所以无影响