SpectraRust/.claude/skills/fortran-to-rust/SKILL.md

5.2 KiB
Raw Blame History

name description
fortran-to-rust 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 源码

cat tlusty/extracted/TARGET.f

检查清单:

  • INCLUDE 文件COMMON 块已经提取到src/state/下)
  • 函数参数和返回值
  • 调用的其他函数
  • 是否有 I/O 操作
  • DATA 语句(已预提取到 src/data.rs

注意:不要因为代码复杂就回避它,复杂的函数往往是重构的重点。只要按照步骤逐行分析,就能找到合适的 Rust 实现方式。要完整实现 Fortran 的功能,不能删减任何逻辑。

Step 3: 创建 Rust 模块

touch src/math/TARGET.rs

Step 4: 实现函数

命名映射:

Fortran Rust
FUNCTION pub fn
SUBROUTINE pub fn(返回值用元组或可变参数)
COMMON 块 结构体参数

Step 5: 添加到 mod.rs

// src/math/mod.rs
mod target;
pub use target::target;

Step 6: 编写测试

#[cfg(test)]
mod tests {
    use super::*;
    use approx::assert_relative_eq;

    #[test]
    fn test_basic() {
        // 基本功能测试
    }
}

Step 7: 运行测试

# 单个模块测试(不要全量 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
use approx::assert_relative_eq;
assert_relative_eq!(result, expected, epsilon = 1e-7);

代码规范

文件头注释

//! 模块简要说明。
//!
//! 重构自 TLUSTY `filename.f`

函数注释

/// 函数功能说明。
///
/// # 参数
/// * `x` - 参数说明
///
/// # 返回值
/// 返回值说明
pub fn func(x: f64) -> f64 { ... }

SPECIAL_MAPPINGS

一个 Rust 文件实现多个 Fortran 函数时,更新 .claude/skills/fortran-analyzer/scripts/analyze_fortran.py:

SPECIAL_MAPPINGS = {
    'gfree': ['gfree0', 'gfreed', 'gfree1'],
    'interpolate': ['yint', 'lagran'],
    'sgmer': ['sgmer0', 'sgmer1', 'sgmerd'],
    # 添加新映射...
}

快速命令参考

# 查看重构进度
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 Checklist14 项检查)

相关 Skills

Skill 用途 状态
fortran-extractor 提取 Fortran 文件 已完成
fortran-analyzer 分析依赖关系 活跃使用
fortran-to-rust 执行重构 本 skill