160 lines
5.1 KiB
Markdown
160 lines
5.1 KiB
Markdown
# 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`
|