SpectraRust/.claude/skills/tlusty-iteration/progress.md

10 KiB
Raw Blame History

TLUSTY 检查进度

由 skill 自动维护

检查状态说明

  • 通过 - Fortran 和 Rust 逐行对比一致
  • [~] 部分通过 - 功能运行但存在已知限制

★★★ 当前状态: 灰大气模型大幅改善 + 完整 NITER=30 迭代 ★★★

最新验证 (2026-06-11, session #17) — 灰大气深度网格修复

灰大气模型: 不再用常数 κ=0.4,改用密度+温度相关 Kramers 模型

  • 修复 NSTPAR 默认值: TAUFIR=1e-7 (非1e-4), TAULAS=316 (非100), DION0=1.0 (非0.5)
  • κ = κ_es + 4.3e24 * ρ * T^(-3.5) (匹配 Fortran ROSSOP 行为)
  • 预测-校正法积分流体静力学平衡(对应 Fortran LTEGR lines 130-182 Rust NITER=30: MD5=4caa3baa6bf4eee367f4f32dca50acce31次迭代收敛
  • 深度网格: DM 偏差 -42% ~ +29%(之前常数 κ: -99.9% ~ +45%
  • 温度: 偏差 -6.6% ~ +7.9%(之前: -91% ~ -41%
  • 深层温度: id=70 仅差 0.3% (137872 vs 137404)
  • 表面温度: id=1 差 8% (26306 vs 28392),因简化 κ 模型 Fortran 参考: MD5=759482772c154caef5da1c4ad5790ef6

已修复的 NSTPAR 默认值对照表

参数 旧 Rust 正确值 (PVALUE) 说明
TAUFIR 1e-4 1e-7 PVALUE(138)='1.D-7'
TAULAS 100 316.0 PVALUE(139)='316.0'
ABROS0 0.4 0.4 PVALUE(140)='0.4' ✓
DION0 0.5 1.0 PVALUE(143)='1.'
NDGREY 0 0 PVALUE(144)='0' ✓
IDGREY 0 0 PVALUE(145)='0' ✓
NITER 30 30 PVALUE(64)='30' ✓
IOPTAB 0 0 PVALUE(10)='0' ✓

历史 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 根因修复后重验证

环境变量

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/原子数据,创建灰大气
LTEGR 部分通过 main.rs (create_grey_atmosphere) session #17 修复: TAUFIR=1e-7,TAULAS=316,Kramers κ(ρ,T)+预测校正;DM偏差<42%
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. 灰大气深度网格 (session #17 部分解决): Kramers κ(ρ,T) 模型给出 DM 偏差 <42%T 偏差 <8%。进一步改善需要:
    • 连接 ROSSOP → MEANOPT → OPCTAB 完整不透明度链
    • 连接 ELDENS (精确 ne) → WMM (精确平均分子量)
    • 预计需要 1-2 天完整实现
  2. 不透明度温度导数 (部分解决): 自洽 ne+Saha 有限差分已改善 4x (0.94%→0.23%)。进一步改善需要:
    • WNSTOR 占据概率 (WOP < 1 修正 LTE 种群)
    • SABOLF 解析温度导数 dsbf/dT
    • 变量 Eddinger 因子
  3. Lucy 流体静力学: ihecor=1 时密度积分产生浮点溢出 → 不透明度→0 → Jν→0。需要修复 BOLK/dm 除法
  4. INITIA 完整实现: 当前使用简化版灰大气创建,需要完整 INITIA含 NSTPAR namelist 解析)
  5. 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 所以无影响