154 lines
9.2 KiB
Markdown
154 lines
9.2 KiB
Markdown
# 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 所以无影响
|