346 lines
13 KiB
Plaintext
346 lines
13 KiB
Plaintext
# 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 文件已重构完成!**
|
||
|