3.4 KiB
3.4 KiB
TLUSTY/SYNSPEC Rust 重构项目记忆
注意用中文回复
重要!!!:不要进行全量测试 cargo test,系统会卡死,需要时一个个来测
分离子模块(已经完成)
cd /home/fmq/program/tlusty/tl208-s54/rust
python3 extract_fortran.py tlusty/tlusty208.f tlusty/extracted/
cp tlusty/*.FOR tlusty/extracted/
分离后的子文件在tlusty/extracted/下
common模块
common模块(×.FOR)已经重构到src/state目录下
重构追踪系统
# 更新追踪表 (必须按顺序执行)
python3 scripts/analyze_fortran.py > MEMORY/fortran_analysis.csv
python3 scripts/generate_tracking.py > MEMORY/FORTRAN_TRACKING.md
# 依赖树分析命令
python3 scripts/analyze_fortran.py --priority # 按未实现依赖排序的重构优先级(只显示pending)
python3 scripts/analyze_fortran.py --tree UNIT # 输出依赖树(含未实现依赖数)
python3 scripts/analyze_fortran.py --full # 输出完整传递依赖
| 指标 | 数量 |
|---|---|
| 总单元 | 305 |
| 已完成 | 107 |
| 待处理 | 198 |
| 完成率 | 35.1% |
重构流程
DATA 语句(硬编码的数据表)已经由scripts/extract_fortran_data.py生成到src/data.rs中
详细规范见 MEMORY/REFACTORING_GUIDE.md
步骤:
python3 scripts/analyze_fortran.py --priority- 找未实现依赖少的函数- 分析tlusty/extracted/文件夹下对应的 Fortran 源码 (INCLUDE/COMMON/调用/I/O)
- 创建
src/math/TARGET.rs - 实现函数 + 测试
- 添加到
mod.rs cargo test target(单个测试!)- 更新追踪表
SPECIAL_MAPPINGS (scripts/analyze_fortran.py 第 72 行):
SPECIAL_MAPPINGS = {
'gfree': ['gfree0', 'gfreed', 'gfree1'],
'interpolate': ['yint', 'lagran'],
'sgmer': ['sgmer0', 'sgmer1', 'sgmerd'],
'ctdata': ['hction', 'hctrecom'],
'cross': ['cross', 'crossd'],
'expint': ['eint', 'expinx'],
'erfcx': ['erfcx', 'erfcin'],
'lineqs': ['lineqs', 'lineqs_nr'],
# 新增映射...
}
当前状态 (2026-03-20)
- 已完成: 107 个函数 + 15 个状态模块
- 测试通过: 421+ 个
- 最新完成: alifrk.rs (Kantorovich 迭代简化版)
查看实时进度: cat FORTRAN_TRACKING.md | head -20
项目结构
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 # 静态数据
关键陷阱
| 问题 | 解决方案 |
|---|---|
| Fortran 1-indexed | arr(i) → arr[i-1] |
-LOG(X) |
是 -ln(X) 不是 ln(-X) |
| powi 类型歧义 | 用显式乘法 (a)*(a) |
| 循环变量变负 | 用 isize 不用 usize |
| 多项式近似精度 | 放宽到 1e-7 |
| 矩阵列优先 | A(j,i) → a[(i-1)*N + (j-1)] |
| COMMON 块冲突 | 添加前 grep 检查是否已存在 |
| 循环变量重赋值 | 声明为 mut |
详细文档
- MEMORY/REFACTORING_GUIDE.md - 重构规范 ⭐
- MEMORY/FORTRAN_TRACKING.md - 函数追踪表
- MEMORY/refactoring_notes.md - 重构过程中遇到的问题及解决方法