82 lines
4.1 KiB
Markdown
82 lines
4.1 KiB
Markdown
# TLUSTY 检查进度
|
|
# 由 skill 自动维护
|
|
|
|
## 检查状态说明
|
|
- [x] 通过 - Fortran 和 Rust 逐行对比一致
|
|
|
|
## ★★★ 当前状态: BYTE-IDENTICAL ★★★
|
|
|
|
### 最新验证 (2026-06-03 当前)
|
|
**Rust NITER=0 RESOLV vs Fortran reference (fort.7)**:
|
|
```
|
|
md5: 57e3fb8adf341397ebcd4abf5be63ac5 (字节一致)
|
|
0 lines differ out of 643 — BYTE-IDENTICAL
|
|
```
|
|
构建619 warnings (unused imports等),运行正常。无回归。✅ 持续通过。
|
|
|
|
**验证方式**: 直接运行 `cargo build --bin tlusty` + `target/debug/tlusty < hhe35lt.5`
|
|
|
|
### 历史
|
|
Session #603 (2026-05-31): 重验证通过 - fort.7_fortran_ref 不存在,实际参考文件为 fort.7
|
|
Session #264 (2026-05-14): REINT/REDIF 根因修复后重验证
|
|
|
|
### 历史里程碑
|
|
- 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 | Saha-Boltzmann 种群;不更新ELEC/TOTN(由ELDENS/Lucy独立确定) |
|
|
| LUCY | 部分通过 | math/temperature/lucy.rs | 公式正确;缺 OPAINI/TDPINI/STEQEQ(NLTE需要) |
|
|
| ROSSOP/MEANOPT | 部分通过 | main.rs | 解析 Kramers+bf+es 不透明度模型 |
|
|
| SOLVE/MATGEN | 部分通过 | math/solvers/solves.rs, matgen_lte.rs | BRTE/BHE/BRE 已实现;SOLVES收敛后字节一致 |
|
|
| LINSEL | 跳过 | io/resolv.rs | NTRANS=0,循环零次迭代 |
|
|
| OPACF0 | 通过 | math/continuum/opacf0.rs | 逐行对比通过;Opacf0State已接入RESOLV |
|
|
| INIFRC | 未连接 | math/opacity/inifrc.rs | 完整实现;需在INITIA中调用 |
|
|
| SGMER0/SGMER1 | 跳过 | math/hydrogen/sgmer.rs | HHe模型无合并能级,IMER=0,循环不执行 |
|
|
| WNSTOR | 未连接 | math/utils/wnstor.rs | 完整实现;需通过Opacf0Callbacks接入 |
|
|
| SABOLF | 未连接 | math/hydrogen/sabolf*.rs | 需通过Opacf0Callbacks接入 |
|
|
| RTEFR1 正式解 | 部分通过 | io/resolv.rs (rtesol) | Feautrier 二阶ODE+HALF+DENS optical depth |
|
|
| ACCEL2 | 通过 | math/solvers/ (accel2) | Auer(1987)最小二乘外推;Rust条件调用与Fortran一致 |
|
|
| TLUSTY 主循环 | 通过 | main.rs (loop+break) | GO TO 10/20 → loop+break;完全等价 |
|
|
|
|
## 已知差距(按优先级排序)
|
|
|
|
1. **OPACF0 集成**: 翻译正确但未接入主流程;需7步集成
|
|
2. **权重积分**: 梯形法 vs Simpson法(影响<0.1%)
|
|
3. **BRTE/BHE/BRE**: SOLVE的矩阵元素计算(NLTE迭代需要)
|
|
|
|
## 关键技术细节
|
|
|
|
- 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 所以无影响
|