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

160 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 中标记 ✅ → 取下一个任务
```
## ★ 运行验证(每项任务完成后必须执行)
**编译通过 ≠ 完成。** 必须实际运行程序验证产出。
```bash
# 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. ★ 编译通过 ≠ 完成:必须实际运行程序验证产出
```
## 编译验证
每次修改后:
```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. **TLUSTY 端到端运行成功**`fort.7` 非空)
5. **SYNSPEC 端到端运行成功**`fort.7` 非空)
6. 更新 `.f2r_phase``verify`
7. 生成 Phase 3 的 `.f2r_tasks`