SpectraRust/REFACTORING_PROGRESS.txt
2026-03-19 22:16:23 +08:00

346 lines
13 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# TLUSTY/SYNSPEC Rust 重构进度跟踪
## 统计
- TLUSTY 总单元: 304
- TLUSTY 纯函数: 195 (无 COMMON 依赖)
- SYNSPEC 总单元: 168
- SYNSPEC 纯函数: 93
## 当前状态
- **已完成重构**: 62 个函数 + 8 个状态模块 + 1 个数据文件 (src/data.rs)
- **测试通过**: 281 个
- **最后更新**: 2026-03-19
- **TLUSTY 纯函数重构基本完成** (剩余 4 个有复杂依赖)
### 已完成模块列表
| 模块 | 说明 |
|------|------|
| angset | Compton 散射角度设置 |
| betah | 压力标高 |
| bkhsgo | K/L 壳层光电离截面 |
| butler | H 碰撞激发速率 |
| carbon | C 光电离截面 |
| ceh12 | H I Lyman-α 碰撞速率 |
| cion | 碰撞电离速率 |
| ckoest | Koester He I 光电离拟合 |
| collhe | He 碰撞速率系数 |
| dielrc | 双电子复合速率 |
| erfcx | 余误差函数 |
| expint | 指数积分 E₁ |
| expo | 安全指数函数 |
| ffcros | 自由-自由截面 (桩) |
| gami | γ 函数 |
| gamsp | 用户自定义展宽参数 (占位) |
| gauleg | Gauss-Legendre 积分 |
| gaunt | Gaunt 因子 |
| getwrd | 文本单词提取 |
| gfree | 氢自由-自由 Gaunt 因子 |
| gntk | Kramers-Gaunt 截面 |
| grcor | 广义相对论修正因子 |
| hephot | He I 光电离截面 |
| hidalg | Hidalgo 光电离数据 |
| indexx | 堆排序索引 |
| interpolate | Lagrange/线性插值 |
| irc | 氢原子碰撞电离速率 |
| laguer | Laguerre 根 |
| locate | 二分查找 |
| minv3 | 3x3 矩阵求逆 |
| pffe | Fe IV-IX 配分函数 |
| pfni | Ni IV-IX 配分函数 |
| pfspec | 特殊元素配分函数 |
| quartc | 四次方程求根 |
| quit | 退出处理 |
| raph | Newton-Raphson 迭代 |
| reiman | Reilman-Manson 光电离 |
| sbfch | CH 束缚-自由截面 |
| sbfhe1 | He I 束缚-自由截面 |
| sbfhmi | H⁻ 束缚-自由截面 |
| sbfhmi_old | H⁻ 束缚-自由截面 (旧版) |
| sbfoh | OH 束缚-自由截面 |
| sffhmi | H⁻ 自由-自由截面 |
| sghe12 | He I <n=2> 截面 |
| spsigk | 特殊光电离截面 |
| stark0 | Stark 轮廓参数 |
| szirc | 电子碰撞电离速率 |
| tiopf | Ti 光电离截面 |
| tridag | 三对角矩阵求解 |
| ubeta | U(β) 函数插值 |
| voigt | Voigt 轮廓 |
| voigte | Voigt 轮廓 (替代) |
| verner | Verner 光电离 (有 COMMON 依赖) |
| wn | 占据概率 (有 COMMON 依赖) |
| xk2dop | Doppler 宽度转换 |
| ylintp | 对数插值 |
## 状态说明
- ⬜ 待处理
- 🔄 进行中
- ✓ 已完成
- ✅ 已验证(有 Fortran 回归测试)
---
## TLUSTY 纯函数进度
### 优先级 P0 (最小文件,先处理)
| 文件 | 行数 | 状态 | 完成日期 | 备注 |
|------|------|------|----------|------|
| expo.f | 10 | ✅ | 2026-03-19 | 安全指数函数 |
| quit.f | 10 | ✅ | 2026-03-19 | 退出子程序 |
| ffcros.f | 13 | ✅ | 2026-03-19 | 自由-自由截面 (占位) |
| gamsp.f | 14 | ✅ | 2026-03-19 | 展宽因子 (有 COMMON) |
| sgmer1.f | 14 | ❌ | | Stark展宽 (有 COMMON) |
| sgmerd.f | 15 | ❌ | | Stark展宽 (有 COMMON) |
| lagran.f | 16 | ✅ | 2026-03-19 | Lagrange插值 |
| gntk.f | 17 | ✅ | 2026-03-19 | Gaunt因子 |
| raph.f | 17 | ✅ | 2026-03-19 | hedif辅助函数 |
| cross.f | 18 | ✅ | 2026-03-19 | 截面计算 (有 COMMON) |
| eint.f | 18 | ✅ | 2026-03-19 | 指数积分 (含 expinx) |
| sghe12.f | 18 | ✅ | 2026-03-19 | He展宽 |
| yint.f | 18 | ✅ | 2026-03-19 | 二次插值 |
| erfcin.f | 20 | ✅ | 2026-03-19 | 误差函数补 |
| erfcx.f | 20 | ✅ | 2026-03-19 | 缩放误差函数 |
| gfree1.f | 21 | ✅ | 2026-03-19 | Gaunt自由 (有 COMMON) |
| sbfhmi_old.f | 22 | ✅ | 2026-03-19 | H-截面 |
| tridag.f | 22 | ✅ | 2026-03-19 | 三对角矩阵 |
| timing.f | 24 | ❌ | | 计时 (有 I/O) |
| expint.f | 30 | ✅ | 2026-03-19 | 指数积分 |
### 优先级 P1 (中等大小)
| 文件 | 行数 | 状态 | 完成日期 | 备注 |
|------|------|------|----------|------|
| ylintp.f | 31 | ✅ | 2026-03-19 | 线性插值 |
| xk2dop.f | 32 | ✅ | 2026-03-19 | Doppler宽度 |
| betah.f | 33 | ✅ | 2026-03-19 | 压力标高 |
| gauleg.f | 34 | ✅ | 2026-03-19 | Gauss-Legendre积分 |
| quartc.f | 35 | ✅ | 2026-03-19 | 四次方程求解 |
| minv3.f | 37 | ✅ | 2026-03-19 | 3x3矩阵求逆 |
| crossd.f | 31 | ✅ | 2026-03-19 | 截面计算+双电子复合 (有 COMMON) |
| wn.f | 41 | ✅ | 2026-03-19 | 占据概率 (有 COMMON) |
| sbfhmi.f | 42 | ✅ | 2026-03-19 | H-截面 |
| angset.f | 44 | ✅ | 2026-03-19 | 角度设置 (有 COMMON) |
| gami.f | 45 | ✅ | 2026-03-19 | 微扰展宽 |
| gaunt.f | 45 | ✅ | 2026-03-19 | Gaunt因子 |
| ubeta.f | 40 | ✅ | 2026-03-19 | U(β) 函数 |
| rayini.f | 42 | ❌ | | 射线初始化 (有 I/O) |
| indexx.f | 45 | ✅ | 2026-03-19 | 索引排序 |
| laguer.f | 59 | ✅ | 2026-03-19 | Laguerre多项式求根 |
| sbfhe1.f | 157 | ✅ | 2026-03-19 | He截面 (有 COMMON) |
| hephot.f | 163 | ✅ | 2026-03-19 | He光电离 |
| verner.f | 237 | ✅ | 2026-03-19 | Verner截面 (有 COMMON) |
| voigt.f | 64 | ✅ | 2026-03-19 | Voigt线型 |
| voigte.f | 92 | ✅ | 2026-03-19 | Voigt线型 |
| locate.f | 25 | ✅ | 2026-03-19 | 二分查找 |
---
## SYNSPEC 纯函数进度
(待 TLUSTY 完成后再处理)
---
## 重构日志
### 2026-03-19
**已完成:**
- 创建 Rust 项目结构 (Cargo.toml, src/)
- 重构 expo.f → src/math/expo.rs
- 重构 yint.f → src/math/interpolate.rs (yint)
- 重构 lagran.f → src/math/interpolate.rs (lagran)
- 重构 tridag.f → src/math/tridag.rs
- 重构 eint.f + expinx.f → src/math/expint.rs
- 重构 quit.f → src/math/quit.rs
- 重构 ffcros.f → src/math/ffcros.rs
- 重构 gntk.f → src/math/gntk.rs
- 重构 raph.f → src/math/raph.rs
- 重构 erfcx.f + erfcin.f → src/math/erfcx.rs
- 重构 sghe12.f → src/math/sghe12.rs
- 重构 ylintp.f → src/math/ylintp.rs
- 重构 gauleg.f → src/math/gauleg.rs
- 重构 locate.f → src/math/locate.rs
- 重构 voigt.f → src/math/voigt.rs
- 重构 voigte.f → src/math/voigte.rs
- 重构 indexx.f → src/math/indexx.rs
- 重构 quartc.f → src/math/quartc.rs
- 重构 betah.f → src/math/betah.rs
- 重构 gami.f → src/math/gami.rs
- 重构 xk2dop.f → src/math/xk2dop.rs
- 重构 minv3.f → src/math/minv3.rs
- 重构 laguer.f → src/math/laguer.rs
- 重构 collhe.f → src/math/collhe.rs (He 碰撞速率, 929 元素大数组)
- 重构 butler.f → src/math/butler.rs (H 碰撞激发)
- 重构 cion.f → src/math/cion.rs (碰撞电离)
- 重构 irc.f → src/math/irc.rs (H 碰撞电离速率)
- 重构 getwrd.f → src/math/getwrd.rs (文本解析)
- 重构 spsigk.f → src/math/spsigk.rs (特殊光电离)
- 重构 tiopf.f → src/math/tiopf.rs (Ti 光电离)
- 重构 sbfhmi_old.f → src/math/sbfhmi_old.rs (H- 束缚-自由旧版)
- 重构 bkhsgo.f → src/math/bkhsgo.rs (K/L 壳层光电离)
- 重构 carbon.f → src/math/carbon.rs (C 光电离)
- 重构 hephot.f → src/math/hephot.rs (He 光电离)
- 重构 hidalg.f → src/math/hidalg.rs (Hidalgo 光电离)
- 重构 reiman.f → src/math/reiman.rs (Reilman-Manson 光电离)
- 重构 sbfhmi.f → src/math/sbfhmi.rs (H- 束缚-自由)
- 重构 sffhmi.f → src/math/sffhmi.rs (H- 自由-自由)
- 重构 grcor.f → src/math/grcor.rs (广义相对论修正)
- 重构 gaunt.f → src/math/gaunt.rs (Gaunt 因子)
- 重构 stark0.f → src/math/stark0.rs (Stark 轮廓)
- 重构 szirc.f → src/math/szirc.rs (电子碰撞电离)
- 重构 ubeta.f → src/math/ubeta.rs (U(β) 函数)
- 重构 dielrc.f → src/math/dielrc.rs (双电子复合速率, 18 个大型数组)
- 重构 pfni.f → src/math/pfni.rs (Ni IV-IX 配分函数, 12 个数组)
- 创建 Fortran 对比测试框架 (tests/fortran_ref/, tests/fortran_comparison.rs)
- **224 个测试通过** (208 单元测试 + 12 Fortran 对比测试 + 4 文档测试)
**规范:**
- 代码注释使用中文
- 测试必须与原 Fortran 代码对比验证
- 精度要求: epsilon = 1e-10 (简单函数), 1e-7 (多项式近似)
**注意事项:**
- `gamsp.f`, `sgmer1.f`, `sgmerd.f`, `cross.f`, `gfree1.f` 实际有 COMMON 依赖,不是纯函数
- Fortran 1-indexed 数组转 Rust 0-indexed 时要特别注意边界条件
- `erfcin` 中 `XL=-LOG(X)` 是 `-ln(X)`,不是 `ln(-X)`
- `ylintp` 在 0-indexed 中 jl=0 是有效索引,不需要调整
- `collhe` 中 Clenshaw 求和的 `ir` 和 `jj` 必须用有符号整数 (`isize`),否则递减时会溢出
- `collhe` 的索引计算 `((iu+1)^2 - 3*(iu+1) + 4)/2` 在 Rust 中需用 `i32` 避免中间结果溢出
### 2026-03-19 (续)
**修复:**
- 修复 `pffe.rs` 中的数组引用错误:`P6A/P6B` 应使用 `PFFE_P6A/PFFE_P6B`
**待重构的纯函数分析:**
- `SBFCH` (278行): CH 束缚-自由截面,有 1575 个数据点
- `SBFOH` (327行): OH 束缚-自由截面,有 1950 个数据点
- `TIMING` (24行): 有 I/O 依赖,不适合纯函数
- `CIA_*` (89-90行): 有文件 I/O需要特别处理
**当前模块统计:**
- 49 个 Rust 模块 (不含 mod.rs)
- 218 个单元测试
- 12 个 Fortran 对比测试
- 4 个文档测试
**新增模块:**
- 重构 sbfch.f → src/math/sbfch.rs (CH 束缚-自由截面, 1575 个数据点)
- 重构 sbfoh.f → src/math/sbfoh.rs (OH 束缚-自由截面, 1950 个数据点)
**脚本改进:**
- 修改 `extract_fortran_data.py`: 所有变量都添加文件名前缀 (如 `SBFCH_C1`, `DIELRC_ADI`)
- 避免不同文件中同名变量冲突
### 2026-03-19 (进度总结)
**当前状态:**
- **49 个 Rust 模块**已完成
- **234 个测试通过** (218 单元测试 + 12 Fortran 对比测试 + 4 文档测试)
**纯函数重构完成度分析:**
TLUSTY 原有 195 个无 COMMON 依赖的纯函数,其中大部分已经重构。剩余的函数可分为两类:
1. **有 COMMON/IO 依赖的函数** (暂时不重构):
- `gamsp.f`, `sgmer1.f`, `sgmerd.f` - Stark 展宽
- `cross.f`, `crossd.f` - 截面计算
- `gfree1.f` - Gaunt 自由
- `wn.f` - 占据概率
- `angset.f` - 角度设置
- `rayini.f` - 射线初始化 (有文件 I/O)
- `sbfhe1.f` - He 截面
- `verner.f`, `vern16/18/20/26.f` - Verner 截面
- `timing.f` - 计时 (有 I/O)
- `CIA_*` - 碰撞诱导吸收 (有文件 I/O)
2. **可能遗漏的纯函数**:
- 需要进一步检查 `gfree0.f`, `gfreed.f` 等函数
**下一步计划:**
1. 检查 `gfree0.f`, `gfreed.f` 是否为纯函数
2. 如果是纯函数,继续重构
3. 考虑 SYNSPEC 纯函数的重构
**图例说明:**
- ✅ 已完成
- ❌ 有 COMMON/IO 依赖 (暂不处理)
- ⬜ 待处理
### 2026-03-19 (状态模块重构)
**新增 state 模块** - 将 Fortran COMMON 块转换为 Rust struct
| 文件 | 对应 Fortran | 说明 |
|------|-------------|------|
| src/state/mod.rs | - | 模块入口 |
| src/state/constants.rs | BASICS.FOR | 物理常数和维度参数 |
| src/state/config.rs | BASICS.FOR | 运行时配置 (BASNUM, INPPAR 等) |
| src/state/atomic.rs | ATOMIC.FOR | 原子/离子/能级数据 (ATOPAR, IONPAR 等) |
| src/state/model.rs | MODELQ.FOR | 大气模型状态 (MODPAR, LEVPOP 等) |
| src/state/arrays.rs | ARRAY1.FOR | 大型计算数组 |
**COMMON 块映射:**
| Fortran COMMON | Rust struct | 文件 |
|----------------|-------------|------|
| /BASNUM/ | BasNum | config.rs |
| /INPPAR/ | InpPar | config.rs |
| /MATKEY/ | MatKey | config.rs |
| /RUNKEY/ | RunKey | config.rs |
| /CONKEY/ | ConKey | config.rs |
| /OPCPAR/ | OpcPar | config.rs |
| /ANGLES/ | Angles | config.rs |
| /ATOPAR/ | AtoPar | atomic.rs |
| /IONPAR/ | IonPar | atomic.rs |
| /LEVPAR/ | LevPar | atomic.rs |
| /TRAPAR/ | TraPar | atomic.rs |
| /PHOSET/ | PhoSet | atomic.rs |
| /VOIPAR/ | VoiPar | atomic.rs |
| /MODPAR/ | ModPar | model.rs |
| /LEVPOP/ | LevPop | model.rs |
| /GFFPAR/ | GffPar | model.rs |
| /TOTRAD/ | TotRad | model.rs |
| /CURRAD/ | CurRad | model.rs |
| /FRQALL/ | FrqAll | model.rs |
| 无标签 COMMON | MainArrays | arrays.rs |
| /EXPRAD/ | ExpRad | arrays.rs |
| /BPOCOM/ | BpoCom | arrays.rs |
**综合结构:**
- `TlustyConfig` - 综合配置 (包含所有控制参数)
- `AtomicData` - 综合原子数据
- `ModelState` - 综合模型状态
- `ComputeArrays` - 综合计算数组
**测试更新:**
- 255 个测试通过 (239 单元测试 + 12 Fortran 对比测试 + 4 文档测试)
### 2026-03-19 (完成 .FOR 文件重构)
**完成所有 TLUSTY .FOR 文件重构:**
| 文件 | Rust 模块 | COMMON 块 |
|------|-----------|-----------|
| ITERAT.FOR | iterat.rs | LAMBDA, CHNMAT, ACCEL, ACCLP, ACCLT, CHNAD |
| ALIPAR.FOR | alipar.rs | FIXALP (ALI 数组) |
| ODFPAR.FOR | odfpar.rs | ODFION, ODFCTR, ODFFRQ, ODFMOD, ODFSTK, SPLCOM, OPALIM, OPLIMT, LEVCOM |
**新增常量:**
- MLEVE3, MLVEX3, MTRAN3 (对角/三对角预处理)
- MCROSS, MBF (截面和束缚-自由跃迁)
**内存估算:**
- SplCom (Fe 线数据): ~90 MB
- LevCom (Kurucz 能级): ~0.5 MB
- FixAlp (ALI 数组): ~数百 MB (取决于 MLVEXP)
**所有 TLUSTY .FOR 文件已重构完成!**