# 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 ``` ## 编译验证 每次修改后: ```bash RUSTFLAGS="-A warnings" cargo build 2>&1 | tail -5 ``` 相关模块的单元测试: ```bash cargo test --lib <模块名> 2>&1 | tail -3 ``` 禁止全量测试,内存会被占满。 ## 完成标准 1. `.f2r_tasks` 中所有任务标记 ✅ 2. `cargo build` 零错误 3. 无 `TODO`/`FIXME` 遗留在生产代码中 4. 更新 `.f2r_phase` 为 `verify` 5. 生成 Phase 3 的 `.f2r_tasks`