SpectraRust/MEMORY/MEMORY.md
2026-03-21 16:23:35 +08:00

3.4 KiB
Raw Blame History

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

步骤:

  1. python3 scripts/analyze_fortran.py --priority - 找未实现依赖少的函数
  2. 分析tlusty/extracted/文件夹下对应的 Fortran 源码 (INCLUDE/COMMON/调用/I/O)
  3. 创建 src/math/TARGET.rs
  4. 实现函数 + 测试
  5. 添加到 mod.rs
  6. cargo test target (单个测试!)
  7. 更新追踪表

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

详细文档