111 lines
3.4 KiB
Markdown
111 lines
3.4 KiB
Markdown
# TLUSTY/SYNSPEC Rust 重构项目记忆
|
||
|
||
注意用中文回复
|
||
|
||
重要!!!:不要进行全量测试 `cargo test`,系统会卡死,需要时一个个来测
|
||
|
||
## 分离子模块(已经完成)
|
||
```bash
|
||
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目录下
|
||
|
||
## 重构追踪系统
|
||
|
||
```bash
|
||
# 更新追踪表 (必须按顺序执行)
|
||
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](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 行):
|
||
```python
|
||
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/REFACTORING_GUIDE.md) - 重构规范 ⭐
|
||
- [MEMORY/FORTRAN_TRACKING.md](MEMORY/FORTRAN_TRACKING.md) - 函数追踪表
|
||
- [MEMORY/refactoring_notes.md](MEMORY/refactoring_notes.md) - 重构过程中遇到的问题及解决方法
|