SpectraRust/.claude/skills/codegraph-guide/references/phase2-integrate.md

5.1 KiB
Raw Blame History

Phase 2: 集成工作流参考

状态:当前活跃阶段 目标:将已翻译的纯计算函数连接为可运行的编排流程

任务来源

.f2r_tasks 读取。当前主要任务方向:

1. TLUSTY RESOLV 编排补全 (src/tlusty/io/resolv.rs)

Resolv 是 TLUSTY 主循环的核心编排器,每个频率点调用一次。当前有 7 个 TODO

TODO 位置 内容 说明
L81 原子数据丰度 从原子数据文件读取精确值替换硬编码 HHe 值
L2038 ComputeArrays 传递 将 ComputeArrays 添加到 ResolvParams 或从调用方传入
L2146 ComputeArrays 传入 同上,另一处调用点
L2251 rru/rrd 累积 累积辐射率获得完整输出
L2439 CoolrtParams 2D 重构为 2D 接口获得精确冷却率
L2606 频率不透明度更新 按频率从 opacfl_data 更新不透明度
L2624 rtecmu 频率循环 循环所有频率点调用 rtecmu+opacf1+taufr1

2. TLUSTY Runner (src/tlusty/main.rs)

TODO 位置 内容
L482 实现正确的 IJALI 频率选择(只用关键频率)

3. TLUSTY OPFRAC (src/tlusty/math/continuum/opfrac.rs)

TODO 位置 内容
L309 解析 ioniz.dat 文件完整实现

4. SYNSPEC Runner (src/synspec/runner.rs)

连接所有编排步骤的参数传递,确保完整流程可运行:

  • CHANGE: 能级人口重分配
  • MOLINI: 分子平衡初始化
  • EOSPRI: EOS 参数诊断输出
  • ABNCHN: 丰度缩放
  • INGRID 网格模式完整流程
  • INMOLI 循环
  • IDMTAB 实际调用
  • FINGRD 最终输出

5. SYNSPEC RESOLV (src/synspec/math/resolv.rs)

  • 构造完整的 ResolvParams 从模型数据
  • 填充 OPAC→RTE→OUTPRI 完整调用链

集成工作流(严格遵守)

每次会话:
1. 读取 .f2r_tasks → 取第一个未完成任务
2. 读取任务对应的目标文件,定位 TODO
3. 使用 codegraph 了解调用关系和依赖:
   codegraph_explore "<目标函数> 的调用链"
   codegraph_callees <目标函数>
   codegraph_callers <目标函数>
4. ★ 必须先读取对应的 Fortran 源码,理解原始逻辑
5. 实现修改,连接纯计算函数到编排流程
6. 编译验证:
   RUSTFLAGS="-A warnings" cargo build 2>&1 | tail -5
7. 编译失败 → 修复 → 重试
8. 编译通过 → ★ 运行验证(见下方)→ 在 .f2r_tasks 中标记 ✅ → 取下一个任务

★ 运行验证(每项任务完成后必须执行)

编译通过 ≠ 完成。 必须实际运行程序验证产出。

# TLUSTY 运行验证
cd tests/tlusty/hhe_rust
rm -f fort.7 rust.6 stderr.txt
# 先确保有 fort.8 模型文件(如果需要)
cp ../hhe/fort.8 . 2>/dev/null
../../../target/debug/tlusty < hhe35lt.5 > rust.6 2>stderr.txt
# 检查fort.7 是否生成且非空?
ls -la fort.7
cat stderr.txt

# SYNSPEC 运行验证
cd tests/synspec/hhe
cp hhe35nl.7 fort.8
ln -sf fort.55.con fort.55 2>/dev/null
rm -f fort.7 rust.6 stderr.txt
../../../target/debug/synspec < hhe35nl.5 > rust.6 2>stderr.txt
# 检查fort.7 是否生成且非空?
ls -la fort.7
cat stderr.txt

判定标准:

  • fort.7 生成且非空 → 任务完成
  • panic / 无输出 / fort.7 为空 → 必须修复,不能标记

★ 自修正机制

每次运行后,根据实际错误更新本文件和 .f2r_tasks

1. 运行程序 → 观察错误panic 信息、空输出、stderr
2. 定位 bug 位置(文件名:行号)
3. 修复 bug → 编译 → 重新运行
4. 如果发现新的运行问题:
   a. 添加到 .f2r_tasks
   b. 更新 phase2-integrate.md 中的已知问题
5. 只有实际运行通过才能标记 ✅

已知运行问题(持续更新)

问题 状态 详情
TLUSTY fort.8 缺失 待修 runner 在 tests/tlusty/hhe_rust/ 中找不到 fort.8
TLUSTY 无输出 待修 rust.6 为空,主循环未执行
SYNSPEC iniset panic 待修 iniset.rs:161 索引越界 len=1, index=3
SYNSPEC nion=0 待修 INITIA 原子数据未加载nion/nlevel/natom 全为 0
SYNSPEC RDATA 空 待修 读取 0 ions, 0 levels

★ 核心原则

1. 先读 Fortran 源码:每个 TODO 都对应 Fortran 中的具体逻辑
2. 保持调用顺序Fortran CALL 顺序必须严格保持
3. 正确传递参数COMMON 块变量 → Rust struct 字段映射正确
4. 数组下标转换1-based → 0-based
5. 不能用空壳:回调/closure 必须调用实际函数
6. 每步验证编译:修改后立即 cargo build
7. ★ 编译通过 ≠ 完成:必须实际运行程序验证产出

编译验证

每次修改后:

RUSTFLAGS="-A warnings" cargo build 2>&1 | tail -5

相关模块的单元测试:

cargo test --lib <模块名> 2>&1 | tail -3

禁止全量测试,内存会被占满。

完成标准

  1. .f2r_tasks 中所有任务标记
  2. cargo build 零错误
  3. TODO/FIXME 遗留在生产代码中
  4. TLUSTY 端到端运行成功fort.7 非空)
  5. SYNSPEC 端到端运行成功fort.7 非空)
  6. 更新 .f2r_phaseverify
  7. 生成 Phase 3 的 .f2r_tasks