Phase 1 翻译 (完成): - TLUSTY 350 函数 100% 翻译 - SYNSPEC 168 函数 100% 翻译 - ~495 Rust 模块 Phase 2 集成 (完成): - TLUSTY RESOLV 7 个 TODO 全部清除 - TLUSTY Runner IJALI 频率选择实现 - OPFRAC ioniz.dat 解析完整实现 - SYNSPEC Runner 编排流程连接完成 - SYNSPEC RESOLV OPAC→RTE→OUTPRI 调用链完整 Phase 3 验证 (完成, 修复 8 处 bug): - INITIA: compute_hydrogen_level_bounds 索引混合修复 - INILIN: GAMR0/GS0/GW0 展宽公式修复, 经典 VdW 公式修复 - INIBL0: CNM 常数 2.997925e18→e17 修复 - OPAC: Lyman IJ=2 修正缺失修复 - RTE: minv3 矩阵求逆符号错误修复 自动化脚本改进: - specf2r.sh: 添加 429 限流退避、完成检测、同步等待 - SKILL.md: 三阶段工作流 + 状态文件系统 - references/: Phase 1/2/3 独立参考文档 新增: - src/bin/synspec.rs: SYNSPEC 可执行文件入口 - .f2r_phase/.f2r_tasks/.f2r_complete: 状态管理文件 编译: 0 错误 | Clippy: 0 错误 | 测试: voigt 28 + eldens 5 通过 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.2 KiB
3.2 KiB
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 中标记 ✅ → 取下一个任务
★ 核心原则
1. 先读 Fortran 源码:每个 TODO 都对应 Fortran 中的具体逻辑
2. 保持调用顺序:Fortran CALL 顺序必须严格保持
3. 正确传递参数:COMMON 块变量 → Rust struct 字段映射正确
4. 数组下标转换:1-based → 0-based
5. 不能用空壳:回调/closure 必须调用实际函数
6. 每步验证编译:修改后立即 cargo build
编译验证
每次修改后:
RUSTFLAGS="-A warnings" cargo build 2>&1 | tail -5
相关模块的单元测试:
cargo test --lib <模块名> 2>&1 | tail -3
禁止全量测试,内存会被占满。
完成标准
.f2r_tasks中所有任务标记 ✅cargo build零错误- 无
TODO/FIXME遗留在生产代码中 - 更新
.f2r_phase为verify - 生成 Phase 3 的
.f2r_tasks