6.6 KiB
6.6 KiB
| name | description |
|---|---|
| tlusty-iteration | TLUSTY Rust主程序迭代开发与Fortran对比测试。触发条件:(1) 用户提到'迭代测试'、'对比测试'、'主程序开发';(2) 用户想验证Rust实现与Fortran的一致性;(3) 继续TLUSTY主程序开发;(4) 运行TLUSTY测试用例。提供完整迭代流程、测试方法、差异分析。 |
TLUSTY Rust 主程序迭代与对比测试
本技能指导 Rust TLUSTY 主程序的迭代开发,目标是使输出与 Fortran 参考实现一致。
当前状态 (2026-03-26)
已完成的工作
-
OPCTAB 表读取实现 (
opacity_table.rs):- 支持文本格式 OPCTAB 文件读取
- 2D 插值 (温度-密度)
- Rosseland 和 Planck 平均不透明度计算
- 环境变量
OPCTAB指定表路径
-
测试验证:
- 成功加载
optab11_7f.dat(100000 频率点) - 表范围: T = 3000-15000 K, ρ = 1e-12 - 1e-6 g/cm³
- 成功加载
核心问题:OPCTAB 温度范围限制
问题: 可用的 OPCTAB 表 (optab11_7f.dat) 仅覆盖 3000-15000 K,但测试用例 Teff = 35000 K 超出此范围。
Fortran 的处理方式:
- 当
ioptab = 0(默认) 时,使用OPACF0从原子物理计算不透明度 - OPACF0 计算: 束缚-自由、自由-自由、H⁻、H₂⁺ 等贡献
- 这需要完整的原子数据 (能级、跃迁、截面)
Rust 当前处理:
- 当 T 超出表范围时,回退到 Kramers 近似
- κ_bf ≈ 4.3e-25 * (1e4/T)^3.5
- κ_es = σ_e * ne / ρ
解决方案 (按优先级)
-
寻找更高温度的 OPCTAB 表 (最简单)
- 需要覆盖 10000-50000 K 的表
- 可从 OPAL 或 OPLIB 获取
-
实现 OPACF0 (最准确)
- 从原子数据计算束缚-自由不透明度
- 计算自由-自由 (Kramers)
- 添加 H⁻、H₂⁺ 贡献
- 需要大量原子物理模块
-
改进 Kramers 近似 (折中)
- 添加温度/密度相关修正
- 参考 OPAL/OPLIB 公式
测试对比 (Teff=35000K, 超出 OPCTAB 范围)
| 参数 | Rust (Kramers) | Fortran (OPACF0) | 问题 |
|---|---|---|---|
| 表面柱质量 | 7.4e-6 | 2.9e-7 g/cm² | 25x 偏高 |
| 输出列数 | 40 | 42 | 缺少 2 列 |
根本原因: Kramers 不透明度太低 → 需要更多质量才能达到相同光深
项目文件结构
SpectraRust/
├── src/
│ ├── bin/tlusty.rs # Rust 主程序入口
│ └── tlusty/
│ ├── io/ # I/O 模块 (ltegr, start, model...)
│ ├── math/ # 数学模块 (eos, continuum, ali...)
│ └── state/ # 状态结构 (constants, atomic, model...)
├── tests/
│ ├── tlusty/
│ │ ├── hhe_fortran/ # Fortran 输入文件和参考输出
│ │ └── hhe_rust/ # Rust 输入文件和输出
├── tlusty/
│ └── extracted/ # 提取的 Fortran 源码 (304 个模块)
│ ├── tlusty.f # 主程序
│ ├── start.f # 初始化
│ ├── ltegr.f # LTE 灰大气
│ └── ...
└── .claude/skills/
└── fortran-analyzer/scripts/
└── analyze_fortran.py # 模块分析脚本
迭代工作流程
Step 1: 运行对比测试
生成 Fortran 参考输出
如果需要重新生成 Fortran 参考输出:
# 1. 进入测试目录
cd tests/tlusty/hhe_fortran
# 2. 确保有 data 链接
ln -sf $TLUSTY/data data
# 3. 运行 Fortran
$TLUSTY/tlusty/tlusty.exe < hhe35lt.5 > fortran.6
# 4. 复制输出
cp fort.7 fort.7.ref
运行 Rust
cargo build
cd tests/tlusty/hhe_rust
ln -sf $TLUSTY/data data
../../../target/debug/tlusty < hhe35lt.5 > rust.6 2>&1
# 对比第一深度点
echo "=== Rust ===" && head -3 hhe_rust/fort.7
echo "=== Fortran ===" && head -3 hhe_fortran/fort.7
Step 2: 定位差异来源
# 提取温度列对比
paste <(awk '{print NR, $3}' hhe_rust/fort.7) <(awk '{print $3}' hhe_fortran/fort.7) | \
awk '{diff=$2-$3; if(diff<0)diff=-diff; if(diff>100) print $1, $2, $3, diff}'
# 提取电子密度对比
paste <(awk '{print NR, $6}' hhe_rust/fort.7) <(awk '{print $6}' hhe_fortran/fort.7) | \
awk '{diff=$2-$3; if(diff<0)diff=-diff; if($2>0 && diff/$2>0.05) print $1, $2, $3}'
Step 3: 分析 Fortran 源码
# 查看目标模块
cat tlusty/extracted/eldens.f | head -100
# 查看 COMMON 块依赖
grep -E "INCLUDE|COMMON" tlusty/extracted/eldens.f
# 查看调用关系
grep -E "CALL|FUNCTION" tlusty/extracted/eldens.f
Step 4: 修复 Rust 代码
- 找到对应的 Rust 模块 (
src/tlusty/math/eos/eldens.rs) - 对比 Fortran 逻辑
- 修复差异
- 编译测试
# 编译
cargo build 2>&1 | grep -E "error|warning" | head -20
# 单元测试
cargo test eldens 2>&1 | tail -20
Step 5: 重新对比
重复 Step 1,验证差异是否缩小
模块分析与对应 (使用 analyze_fortran.py)
查看模块对应表
# 查看所有模块的 Rust 实现状态
python3 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py 2>&1 | \
grep -E ",done$" | head -30
# 查看特定模块的 Rust 对应
python3 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py 2>&1 | \
grep -i "ELDENS\|ROSSOP\|STEQQEQ"
# 输出格式: fortran_file,unit_name,unit_type,is_pure,common_deps,call_deps,has_io,rust_module,status
查看依赖树
# 查看主程序依赖树
python3 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py --tree TLUSTY
# 查看特定模块依赖树
python3 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py --tree LTEGR
python3 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py --tree ELDENS
python3 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py --tree RESOLV
查看重构优先级
# 查看未实现模块的优先级列表
python3 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py --priority | head -30
当前关键模块状态
LTE 模型核心:
python3 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py 2>&1 | \
grep -E "LTEGR|ROSSOP|ELDENS|STEQQEQ|WNSTOR|SABOLF|MEANOPT"
辐射转移模块:
python3 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py 2>&1 | \
grep -E "RESOLV|SOLVE|ALIFR|RHSGEN|EMAT"
不透明度模块:
python3 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py 2>&1 | \
grep -E "OPACF|OPADD|OPCTAB|OPACT"
相关 Skills
| Skill | 用途 |
|---|---|
fortran-analyzer |
分析模块依赖关系 |
fortran-to-rust |
模块重构指南 |