重构5,无io和无io依赖的模块已经全部重构完毕,接下来是重构剩余的模块,主要是io和依赖io的模块。

This commit is contained in:
fmq
2026-03-22 17:08:40 +08:00
parent 59404207c3
commit 5078d6120e
35 changed files with 11554 additions and 16 deletions
+203
View File
@@ -0,0 +1,203 @@
---
name: fortran-to-rust
description: "Fortran 到 Rust 的重构指南和工作流。触发条件:(1) 刚使用过fortran-analyzer skills 获得需要重构的模块(2)用户提到重构 Fortran 到 Rust(2) 开始新的 Fortran 函数重构;(3) 翻译 Fortran 代码;(4) 处理 COMMON 块转换;(5) 用户问'怎么把 Fortran 函数转成 Rust'。提供完整重构流程、常见陷阱、测试规范。"
---
# Fortran → Rust 重构指南
将 TLUSTY/SYNSPEC 的 Fortran 函数重构为 Rust。
## 重构流程
### Step 1: 选择目标函数
使用 fortran-analyzer skills 获取需要重构的模块,不要因为行数多、复杂或者 COMMON 依赖就回避它们。如果已使用过就跳过,直接重构即可。
### Step 2: 分析 Fortran 源码
```bash
cat tlusty/extracted/TARGET.f
```
检查清单:
- [ ] INCLUDE 文件(COMMON 块,已经提取到src/state/下)
- [ ] 函数参数和返回值
- [ ] 调用的其他函数
- [ ] 是否有 I/O 操作
- [ ] DATA 语句(已预提取到 `src/data.rs`
注意:不要因为代码复杂就回避它,复杂的函数往往是重构的重点。只要按照步骤逐行分析,就能找到合适的 Rust 实现方式。要完整实现 Fortran 的功能,不能删减任何逻辑。
### Step 3: 创建 Rust 模块
```bash
touch src/math/TARGET.rs
```
### Step 4: 实现函数
**命名映射**:
| Fortran | Rust |
|---------|------|
| `FUNCTION` | `pub fn` |
| `SUBROUTINE` | `pub fn`(返回值用元组或可变参数)|
| COMMON 块 | 结构体参数 |
### Step 5: 添加到 mod.rs
```rust
// src/math/mod.rs
mod target;
pub use target::target;
```
### Step 6: 编写测试
```rust
#[cfg(test)]
mod tests {
use super::*;
use approx::assert_relative_eq;
#[test]
fn test_basic() {
// 基本功能测试
}
}
```
### Step 7: 运行测试
```bash
# 单个模块测试(不要全量 cargo test!系统会卡死)
# 方式1:静默警告,只显示测试结果
cargo test target -- --quiet 2>&1 | grep -E "^test|^running|^test result"
# 方式2:完全静默警告(推荐)
RUSTFLAGS="-A warnings" cargo test target 2>&1 | tail -10
# 方式3:仅查看测试结果
cargo test target 2>/dev/null
```
## 常见陷阱
| 问题 | Fortran | Rust |
|------|---------|------|
| 数组索引 | `arr(i)` 1-indexed | `arr[i-1]` 0-indexed |
| 负对数 | `-LOG(X)` | `-ln(X)` 不是 `ln(-X)` |
| 幂运算歧义 | `x**2` | `(x)*(x)` 避免类型歧义 |
| 循环变量 | 可能变负 | 用 `isize` 不用 `usize` |
| 矩阵存储 | 列优先 `A(j,i)` | `a[(i-1)*N + (j-1)]` |
| 精度 | 隐式类型 | 显式 `f64`/`f32` |
## 精度要求
| 函数类型 | 容差 |
|---------|------|
| 简单数学运算 | `1e-10` |
| 多项式近似 | `1e-7` |
| f32 数组 | `1e-24` |
```rust
use approx::assert_relative_eq;
assert_relative_eq!(result, expected, epsilon = 1e-7);
```
## 代码规范
### 文件头注释
```rust
//! 模块简要说明。
//!
//! 重构自 TLUSTY `filename.f`
```
### 函数注释
```rust
/// 函数功能说明。
///
/// # 参数
/// * `x` - 参数说明
///
/// # 返回值
/// 返回值说明
pub fn func(x: f64) -> f64 { ... }
```
## SPECIAL_MAPPINGS
一个 Rust 文件实现多个 Fortran 函数时,更新 `.claude/skills/fortran-analyzer/scripts/analyze_fortran.py`:
```python
SPECIAL_MAPPINGS = {
'gfree': ['gfree0', 'gfreed', 'gfree1'],
'interpolate': ['yint', 'lagran'],
'sgmer': ['sgmer0', 'sgmer1', 'sgmerd'],
# 添加新映射...
}
```
## 快速命令参考
```bash
# 查看重构进度
python3 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py --priority | head -20
# 查看函数依赖树
python3 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py --tree FUNCTION_NAME
# 测试单个模块(静默警告)
RUSTFLAGS="-A warnings" cargo test module_name 2>&1 | tail -10
# 或更简洁的方式
cargo test module_name -- --quiet 2>&1 | grep -E "^test|^running|^test result"
# 编译检查
cargo build 2>&1 | grep error
# 更新追踪表
python3 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py > fortran_analysis.csv
```
## 项目结构
```
rust/src/
├── math/ # 函数 (85+ 个 .rs 文件)
├── state/ # COMMON 块 (8 个模块)
│ ├── constants.rs # BASICS.FOR
│ ├── atomic.rs # ATOMIC.FOR
│ ├── model.rs # MODELQ.FOR
│ ├── arrays.rs # ARRAY1.FOR
│ ├── iterat.rs # ITERAT.FOR
│ ├── alipar.rs # ALIPAR.FOR
│ └── odfpar.rs # ODFPAR.FOR
└── data.rs # 静态数据(DATA 语句)
```
## 详细参考
完整的陷阱列表和解决方案见:`.learnings/LEARNINGS.md`
包含 14 个实际案例:
- F01-F02: 索引转换、表达式解析
- F03-F05: 类型推断、精度、溢出
- F06-F08: COMMON 块、测试数据、可变引用
- F09-F11: 依赖分析、列重叠、公式验证
- F12-F14: 大型结构体、GOTO 转换、mut 变量
重构前必读:**Quick Reference - Refactoring Checklist**14 项检查)
## 相关 Skills
| Skill | 用途 | 状态 |
|-------|------|------|
| `fortran-extractor` | 提取 Fortran 文件 | ✅ 已完成 |
| `fortran-analyzer` | 分析依赖关系 | 活跃使用 |
| `fortran-to-rust` | 执行重构 | 本 skill |