--- name: fortran-extractor description: "[已完成] TLUSTY/SYNSPEC 拆分已完成。仅当用户明确请求'重新提取 Fortran'或'再次拆分 Fortran 文件'时触发。" --- # Fortran 代码提取器 从大型 Fortran 源文件中提取各个程序单元(SUBROUTINE、FUNCTION、PROGRAM、BLOCK DATA)到独立文件,并生成依赖分析报告。 ## 快速参考 | 场景 | 命令 | |------|------| | 提取 Fortran 文件 | `python3 .claude/skills/fortran-extractor/scripts/extract_fortran.py ` | | 默认路径 | `tlusty/tlusty208.f` → `tlusty/extracted/` | ## 输出文件 提取完成后,输出目录包含: | 文件 | 说明 | |------|------| | `*.f` | 各个提取的程序单元 | | `_SUMMARY.txt` | 提取摘要(单元数、类型统计) | | `_COMMON_ANALYSIS.txt` | COMMON 块依赖分析 | | `_PURE_UNITS.txt` | 无 COMMON 依赖的纯函数列表 | | `Makefile` | 编译配置(含正确标志) | ## 提取的单元类型 - `SUBROUTINE` - 子程序 - `FUNCTION` - 函数 - `PROGRAM` - 主程序(支持无名 PROGRAM) - `BLOCK DATA` - 数据块(支持无名 BLOCK DATA) ## Makefile 编译标志 生成的 Makefile 使用以下 gfortran 标志: ```makefile FFLAGS = -O3 -fno-automatic -mcmodel=large ``` - `-mcmodel=large`: 支持大型 COMMON 数组(>2GB 地址空间) - `-fno-automatic`: 静态存储(旧 Fortran 兼容性) **注意**: 不要使用 `-ffixed-line-length-none`,会破坏 73-80 列处理。 ## COMMON 块分析 脚本自动分析每个单元的 COMMON 块依赖: - **命名 COMMON**: `COMMON /NAME/ ...` - **空白 COMMON**: `COMMON varname`(不带斜杠) - **INCLUDE 依赖**: `INCLUDE 'XXX.FOR'` ### 纯函数识别 无 COMMON 依赖的单元被识别为"纯函数",可以独立测试和重构。 ## 使用示例 ```bash # 提取 TLUSTY python3 .claude/skills/fortran-extractor/scripts/extract_fortran.py tlusty/tlusty208.f tlusty/extracted/ # 提取 SYNSPEC python3 .claude/skills/fortran-extractor/scripts/extract_fortran.py synspec/synspec54.f synspec/extracted/ # 查看提取结果 cat tlusty/extracted/_SUMMARY.txt cat tlusty/extracted/_PURE_UNITS.txt ``` ## 后续步骤 提取完成后,可以: 1. **编译验证**: `cd extracted && make` 2. **依赖分析**: 使用 `fortran-analyzer` skill 分析函数调用依赖 3. **重构**: 使用 `fortran-to-rust` skill 开始 Rust 重构 ## 脚本位置 核心脚本位于 `.claude/skills/fortran-extractor/scripts/extract_fortran.py`,主要功能: - `extract_units()`: 提取程序单元 - `analyze_commons()`: 分析 COMMON 依赖 - `generate_makefile()`: 生成编译配置