重构6
This commit is contained in:
@@ -426,10 +426,12 @@ opctab.rs 原文档只提到"插值计算",漏掉了:
|
||||
|
||||
重构新函数前检查:
|
||||
|
||||
- [ ] 新模块放到 src/math/ 目录(不是 src/io/)
|
||||
- [ ] 是否有 INCLUDE 语句 (除 IMPLIC.FOR 外)
|
||||
- [ ] 是否使用 COMMON 块
|
||||
- [ ] COMMON 块结构体是否已存在于其他模块
|
||||
- [ ] 是否有文件 I/O (OPEN, READ, WRITE)
|
||||
- [ ] 有 I/O 的模块提供纯计算版本 + 带 I/O 包装版本
|
||||
- [ ] 数组索引是否需要 -1 调整
|
||||
- [ ] 循环变量是否可能变负 (用 isize/i32)
|
||||
- [ ] 多项式近似精度是否需要放宽
|
||||
@@ -828,3 +830,290 @@ assert!(result.dulog.is_finite());
|
||||
- HESOL6: 耦合系统求解器(Newton-Raphson + Ng 加速)
|
||||
- MPARTF: 配分函数计算(Irwin 多项式数据)
|
||||
- ENTENE: 内能和熵计算
|
||||
|
||||
---
|
||||
|
||||
## [LRN-20260322-012] correction
|
||||
|
||||
**Logged**: 2026-03-22T20:00:00Z
|
||||
**Priority**: high
|
||||
**Status**: resolved
|
||||
**Area**: backend
|
||||
|
||||
### Summary
|
||||
src/io/ 目录专用于 Fortran IO 兼容层,所有重构的模块暂时放到 src/math/
|
||||
|
||||
### Details
|
||||
项目结构约定:
|
||||
- `src/io/` - Fortran 风格的 I/O 兼容层(FortranReader, FortranWriter, ModelFile 等)
|
||||
- `src/math/` - 所有重构的 Fortran 函数(包括有 I/O 操作的)
|
||||
|
||||
重构的模块即使有 WRITE 语句也放到 `src/math/`,因为:
|
||||
1. I/O 兼容层是基础设施代码
|
||||
2. 重构代码暂时都放 math,后续统一整理
|
||||
|
||||
### Suggested Action
|
||||
重构新模块时,无论是否有 I/O,都创建在 src/math/ 目录下
|
||||
|
||||
### Metadata
|
||||
- Source: user_feedback
|
||||
- Related Files: accelp.rs, chctab.rs
|
||||
- Tags: project_structure, io, math
|
||||
|
||||
---
|
||||
|
||||
## [LRN-20260322-013] best_practice
|
||||
|
||||
**Logged**: 2026-03-22T20:00:00Z
|
||||
**Priority**: medium
|
||||
**Status**: resolved
|
||||
**Area**: backend
|
||||
|
||||
### Summary
|
||||
有 I/O 的模块提供两个版本:纯计算函数 + 带 I/O 包装函数
|
||||
|
||||
### Details
|
||||
对于有 Fortran WRITE 语句的模块,提供两个版本:
|
||||
|
||||
```rust
|
||||
// 纯计算函数(可独立测试)
|
||||
pub fn accelp(params: &mut AccelpParams) -> Option<AccelpResult> { ... }
|
||||
|
||||
// 带 I/O 输出的包装函数
|
||||
pub fn accelp_io<W: std::io::Write>(
|
||||
params: &mut AccelpParams,
|
||||
writer: &mut FortranWriter<W>,
|
||||
) -> Result<Option<AccelpResult>> { ... }
|
||||
```
|
||||
|
||||
### Metadata
|
||||
- Source: fortran-to-rust refactoring
|
||||
- Related Files: accelp.rs
|
||||
- Tags: rust, io, refactoring, testing
|
||||
|
||||
---
|
||||
|
||||
## [LRN-20260322-014] correction
|
||||
|
||||
**Logged**: 2026-03-22T21:00:00Z
|
||||
**Priority**: high
|
||||
**Status**: resolved
|
||||
**Area**: backend
|
||||
|
||||
### Summary
|
||||
FortranWriter 使用 write_raw() + write_newline(),没有 write_line() 方法
|
||||
|
||||
### Details
|
||||
```rust
|
||||
// 错误:FortranWriter 没有 write_line() 方法
|
||||
writer.write_line("text")?;
|
||||
|
||||
// 正确:使用 write_raw() + write_newline()
|
||||
writer.write_raw("text")?;
|
||||
writer.write_newline()?;
|
||||
```
|
||||
|
||||
### Metadata
|
||||
- Source: fortran-to-rust refactoring
|
||||
- Related Files: corrwm.rs, output.rs
|
||||
- Tags: rust, io, fortranwriter
|
||||
|
||||
---
|
||||
|
||||
## [LRN-20260322-015] correction
|
||||
|
||||
**Logged**: 2026-03-22T21:00:00Z
|
||||
**Priority**: high
|
||||
**Status**: resolved
|
||||
**Area**: backend
|
||||
|
||||
### Summary
|
||||
format_exp_fortran() 需要 4 个参数:(val, width, decimals, use_d)
|
||||
|
||||
### Details
|
||||
```rust
|
||||
// 错误:只有 2 个参数
|
||||
format_exp_fortran(val, 17)
|
||||
|
||||
// 正确:4 个参数
|
||||
format_exp_fortran(val, 17, 8, true) // width=17, decimals=8, use_d=true
|
||||
```
|
||||
|
||||
对应 Fortran 格式 `1PD17.8` 或 `D17.8`。
|
||||
|
||||
### Metadata
|
||||
- Source: fortran-to-rust refactoring
|
||||
- Related Files: corrwm.rs
|
||||
- Tags: rust, io, formatting
|
||||
|
||||
---
|
||||
|
||||
## [LRN-20260322-016] insight
|
||||
|
||||
**Logged**: 2026-03-22T21:00:00Z
|
||||
**Priority**: high
|
||||
**Status**: resolved
|
||||
**Area**: backend
|
||||
|
||||
### Summary
|
||||
ODF 相关数据分散在多个结构体中
|
||||
|
||||
### Details
|
||||
ODF(不透明度分布函数)数据分布在 `src/state/odfpar.rs` 的多个结构体:
|
||||
- `OdfFrq`: xdo, kdo(频率数据)
|
||||
- `OdfMod`: i1odf, i2odf, nqlodf(模型数据)
|
||||
- `OdfStk`: xkij, wl0, fij(Stark 展宽数据)
|
||||
- `OdfCtr`: jndodf(跃迁 ODF 索引)
|
||||
|
||||
重构 ODF 相关模块时需要同时引用这些结构体。
|
||||
|
||||
### Metadata
|
||||
- Source: fortran-to-rust refactoring
|
||||
- Related Files: odfhys.rs, odfpar.rs
|
||||
- Tags: rust, struct, odf
|
||||
|
||||
---
|
||||
|
||||
## [LRN-20260322-017] correction
|
||||
|
||||
**Logged**: 2026-03-22T21:00:00Z
|
||||
**Priority**: critical
|
||||
**Status**: resolved
|
||||
**Area**: backend
|
||||
|
||||
### Summary
|
||||
Fortran 2D 数组 KDO(4,MHOD) → Rust 时注意维度转置
|
||||
|
||||
### Details
|
||||
Fortran 数组 `KDO(4,MHOD)` 在 Rust 中定义为 `kdo: vec![vec![0; 4]; MHOD]`:
|
||||
- Fortran 访问 `KDO(IK, JND)` 其中 IK=1-4, JND=1-MHOD
|
||||
- Rust 访问 `kdo[JND-1][IK-1]`(转置后的索引)
|
||||
|
||||
```rust
|
||||
// 错误:按 Fortran 顺序访问
|
||||
let val = kdo[ik][jnd]; // ik=0-3 会越界,因为第一维只有 MHOD=3
|
||||
|
||||
// 正确:按转置后的顺序访问
|
||||
let val = kdo[jnd][ik]; // jnd=0-2, ik=0-3
|
||||
```
|
||||
|
||||
### Suggested Action
|
||||
重构 2D 数组时,检查 Rust 结构体定义的维度顺序,不要假设与 Fortran 相同
|
||||
|
||||
### Metadata
|
||||
- Source: fortran-to-rust refactoring
|
||||
- Related Files: odfhys.rs, odfpar.rs
|
||||
- Tags: rust, array, indexing, fortran
|
||||
|
||||
---
|
||||
|
||||
## [LRN-20260322-018] correction
|
||||
|
||||
**Logged**: 2026-03-22T21:00:00Z
|
||||
**Priority**: high
|
||||
**Status**: resolved
|
||||
**Area**: backend
|
||||
|
||||
### Summary
|
||||
xi2 在 InvInt 结构体中,不在 InpPar;iz 在 IonPar 中,不在 AtoPar
|
||||
|
||||
### Details
|
||||
```rust
|
||||
// 错误
|
||||
params.inppar.xi2[i]
|
||||
params.atopar.iz[i]
|
||||
|
||||
// 正确
|
||||
params.inppar.xi2[i] // xi2 实际在 InvInt 中,需要单独传递
|
||||
params.ionpar.iz[i] // iz 在 IonPar 中
|
||||
```
|
||||
|
||||
### Metadata
|
||||
- Source: fortran-to-rust refactoring
|
||||
- Related Files: odfhys.rs
|
||||
- Tags: rust, struct, field
|
||||
|
||||
---
|
||||
|
||||
## 本次会话完成的模块 (2026-03-22 晚)
|
||||
|
||||
| 模块 | 测试数 | 状态 |
|
||||
|------|--------|------|
|
||||
| `corrwm.rs` | 6 | ✅ 通过 |
|
||||
| `odfhys.rs` | 3 | ✅ 通过 |
|
||||
|
||||
重构要点:
|
||||
- CORRWM: 频率点标志和减法权重管理
|
||||
- ODFHYS: 氢线 ODF 初始化(简化模式和完整模式)
|
||||
|
||||
---
|
||||
|
||||
## [LRN-20260323-019] correction
|
||||
|
||||
**Logged**: 2026-03-23T15:30:00Z
|
||||
**Priority**: high
|
||||
**Status**: resolved
|
||||
**Area**: backend
|
||||
|
||||
### Summary
|
||||
`crate` 是 Rust 保留关键字,不能用作变量名或字段名
|
||||
|
||||
### Details
|
||||
```rust
|
||||
// 错误:crate 是保留关键字
|
||||
pub crate: &'a [[[f64; MCFIT]; MXTCOL]],
|
||||
|
||||
// 正确:使用其他名称
|
||||
pub crate_tab: &'a [[[f64; MCFIT]; MXTCOL]],
|
||||
```
|
||||
|
||||
### Suggested Action
|
||||
重构 Fortran 变量名时,检查是否与 Rust 关键字冲突
|
||||
|
||||
### Metadata
|
||||
- Source: fortran-to-rust refactoring
|
||||
- Related Files: colis.rs
|
||||
- Tags: rust, keyword, naming
|
||||
- See Also: LRN-20260321-F03
|
||||
|
||||
---
|
||||
|
||||
## [LRN-20260323-020] best_practice
|
||||
|
||||
**Logged**: 2026-03-23T15:30:00Z
|
||||
**Priority**: medium
|
||||
**Status**: resolved
|
||||
**Area**: tests
|
||||
|
||||
### Summary
|
||||
测试中数值字面量需要显式类型标注以避免类型推断失败
|
||||
|
||||
### Details
|
||||
```rust
|
||||
// 错误:无法推断类型
|
||||
let t1 = 5000.0;
|
||||
let cs1 = csmpl1(t1.sqrt(), 5.0, 1.0); // t1.sqrt() 类型不明
|
||||
|
||||
// 正确:显式标注
|
||||
let t1: f64 = 5000.0;
|
||||
let cs1 = csmpl1(t1.sqrt(), 5.0, 1.0);
|
||||
```
|
||||
|
||||
### Metadata
|
||||
- Source: fortran-to-rust refactoring
|
||||
- Related Files: colis.rs
|
||||
- Tags: rust, type_inference, testing
|
||||
- See Also: LRN-20260321-F03
|
||||
|
||||
---
|
||||
|
||||
## 本次会话完成的模块 (2026-03-23)
|
||||
|
||||
| 模块 | 测试数 | 状态 |
|
||||
|------|--------|------|
|
||||
| `colis.rs` | 5 | ✅ 通过 |
|
||||
| `bpopt.rs` | 3 | ✅ 通过 |
|
||||
|
||||
重构要点:
|
||||
- COLIS: 其他物种碰撞速率驱动程序(Seaton/Allen/Van Regemorter 公式,表格化数据处理)
|
||||
- BPOPT: B 矩阵优化列计算(温度/电子密度导数,LTE/非LTE 模式)
|
||||
|
||||
Reference in New Issue
Block a user