重构3
This commit is contained in:
@@ -0,0 +1,337 @@
|
||||
# Fortran 重构追踪表
|
||||
|
||||
> 自动生成,请勿手动修改。运行 `python3 scripts/generate_tracking.py > FORTRAN_TRACKING.md` 更新。
|
||||
|
||||
## 统计
|
||||
|
||||
| 指标 | 数量 |
|
||||
|------|------|
|
||||
| 总单元数 | 304 |
|
||||
| 已完成 | 125 |
|
||||
| 待处理 | 179 |
|
||||
| 纯函数 | 67 |
|
||||
| 有文件 I/O | 117 |
|
||||
| 完成率 | 41.1% |
|
||||
|
||||
## 状态说明
|
||||
|
||||
- ✅ `done` - 已重构为 Rust
|
||||
- ⬜ `pending` - 待处理
|
||||
- 🔄 `in_progress` - 进行中
|
||||
- ⏭️ `skip` - 跳过 (I/O 依赖或暂不处理)
|
||||
|
||||
## 类型说明
|
||||
|
||||
- **纯函数**: 无 COMMON 依赖、无文件 I/O、无外部调用依赖
|
||||
- **COMMON 依赖**: 需要状态结构体
|
||||
- **调用依赖**: 调用其他子程序,需要先实现依赖
|
||||
|
||||
## 完整追踪表
|
||||
|
||||
|
||||
| Fortran 文件 | 单元名 | 类型 | 纯函数 | COMMON 依赖 | 调用依赖 | I/O | Rust 模块 | 状态 |
|
||||
|-------------|--------|------|--------|-------------|----------|-----|-----------|------|
|
||||
| _unnamed_block_data_.f | C | BLOCK DATA | | BASICS, ATOMIC | | | | ⬜ |
|
||||
| accel2.f | ACCEL2 | SUBROUTINE | | BASICS, ITERAT, MODELQ | | 📁 | | ⬜ |
|
||||
| accelp.f | ACCELP | SUBROUTINE | | BASICS, MODELQ, ITERAT, POPULS | | 📁 | | ⬜ |
|
||||
| alifr1.f | ALIFR1 | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ALIPAR | ALIFR3 | | | ⬜ |
|
||||
| alifr3.f | ALIFR3 | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ALIPAR | | | alifr3.rs | ✅ |
|
||||
| alifr6.f | ALIFR6 | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ALIPAR | | | alifr6.rs | ✅ |
|
||||
| alifrk.f | ALIFRK | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ALIPAR | | | alifrk.rs | ✅ |
|
||||
| alisk1.f | ALISK1 | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR, ARRAY1, ITERAT | ALIFRK, ROSSTD, OPACF1, RTEFR1 | 📁 | | ⬜ |
|
||||
| alisk2.f | ALISK2 | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR, ARRAY1, ITERAT | ALIFRK, ROSSTD, OPACF1, RTEFR1 | 📁 | | ⬜ |
|
||||
| alist1.f | ALIST1 | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR, ITERAT | OPACFD, ALIFR1, ROSSTD, RTEFR1 | 📁 | | ⬜ |
|
||||
| alist2.f | ALIST2 | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR, ARRAY1, ITERAT | RTEFR1, ROSSTD, ALIFR1, QUIT, OPACFD | 📁 | | ⬜ |
|
||||
| allard.f | ALLARD | SUBROUTINE | | BASICS, calphatd, callarda, callardc, callardg, callardb, quasun | ALLARDT | 📁 | | ⬜ |
|
||||
| allardt.f | ALLARDT | SUBROUTINE | | BASICS, calphatd | | | allardt.rs | ✅ |
|
||||
| angset.f | ANGSET | SUBROUTINE | ✓ | BASICS | GAULEG | | angset.rs | ✅ |
|
||||
| betah.f | BETAH | FUNCTION | ✓ | | BETAH | | betah.rs | ✅ |
|
||||
| bhe.f | BHE | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ARRAY1, ALIPAR | | | bhe.rs | ✅ |
|
||||
| bhed.f | BHED | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ARRAY1, ALIPAR, CMATZD, SURFEX | | | bhe.rs | ✅ |
|
||||
| bhez.f | BHEZ | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ARRAY1, ALIPAR, SURFEX | | | bhe.rs | ✅ |
|
||||
| bkhsgo.f | BKHSGO | SUBROUTINE | ✓ | | | | bkhsgo.rs | ✅ |
|
||||
| bpop.f | BPOP | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ARRAY1, ALIPAR, ODFPAR, ITERAT | MATINV, BPOPT, BPOPF, LEVSOL, RATMAT, BPOPC, BPOPE, LEVGRP | | | ⬜ |
|
||||
| bpopc.f | BPOPC | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ARRAY1, ALIPAR, ODFPAR, ADCHAR | STATE | | | ⬜ |
|
||||
| bpope.f | BPOPE | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR, ITERAT, ARRAY1 | SGMER1, DWNFR1 | | | ⬜ |
|
||||
| bpopf.f | BPOPF | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ARRAY1, ALIPAR, ODFPAR | | | bpopf.rs | ✅ |
|
||||
| bpopt.f | BPOPT | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ARRAY1, ALIPAR, ODFPAR | COLIS | | | ⬜ |
|
||||
| bre.f | BRE | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ARRAY1, ALIPAR | COMPT0 | | | ⬜ |
|
||||
| brez.f | BREZ | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ARRAY1, ALIPAR | COMPT0 | | | ⬜ |
|
||||
| brte.f | BRTE | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ALIPAR, ARRAY1 | COMPT0 | | | ⬜ |
|
||||
| brtez.f | BRTEZ | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ALIPAR, ARRAY1 | COMPT0 | | | ⬜ |
|
||||
| butler.f | BUTLER | SUBROUTINE | ✓ | | | | butler.rs | ✅ |
|
||||
| carbon.f | CARBON | SUBROUTINE | ✓ | | | | carbon.rs | ✅ |
|
||||
| ceh12.f | CEH12 | FUNCTION | ✓ | | CEH12 | | ceh12.rs | ✅ |
|
||||
| change.f | CHANGE | SUBROUTINE | | BASICS, ATOMIC, MODELQ | STEQEQ, READBF | 📁 | | ⬜ |
|
||||
| chckse.f | CHCKSE | SUBROUTINE | | BASICS, ATOMIC, MODELQ | SABOLF | 📁 | | ⬜ |
|
||||
| chctab.f | CHCTAB | SUBROUTINE | | BASICS, MODELQ, abntab | | 📁 | | ⬜ |
|
||||
| cheav.f | CHEAV | FUNCTION | | BASICS, ATOMIC | CHEAV, QUIT | 📁 | | ⬜ |
|
||||
| cheavj.f | CHEAVJ | FUNCTION | | BASICS, ATOMIC | QUIT, CHEAVJ | 📁 | | ⬜ |
|
||||
| cia_h2h.f | CIA_H2H | SUBROUTINE | | | LOCATE, IF | 📁 | | ⬜ |
|
||||
| cia_h2h2.f | CIA_H2H2 | SUBROUTINE | | | LOCATE, IF | 📁 | | ⬜ |
|
||||
| cia_h2he.f | CIA_H2HE | SUBROUTINE | | | LOCATE, IF | 📁 | | ⬜ |
|
||||
| cia_hhe.f | CIA_HHE | SUBROUTINE | | | LOCATE, IF | 📁 | | ⬜ |
|
||||
| cion.f | CION | FUNCTION | ✓ | | CION | | cion.rs | ✅ |
|
||||
| ckoest.f | CKOEST | FUNCTION | ✓ | BASICS | CKOEST | | ckoest.rs | ✅ |
|
||||
| colh.f | COLH | SUBROUTINE | | BASICS, ATOMIC, MODELQ | CSPEC, BUTLER, IRC | | | ⬜ |
|
||||
| colhe.f | COLHE | SUBROUTINE | | BASICS, ATOMIC | COLLHE, CSPEC, IRC | | | ⬜ |
|
||||
| colis.f | COLIS | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, CTRTEMP | CSPEC, COLH, COLHE, IRC | | | ⬜ |
|
||||
| collhe.f | COLLHE | SUBROUTINE | ✓ | | | | collhe.rs | ✅ |
|
||||
| column.f | COLUMN | SUBROUTINE | | BASICS, MODELQ, relcor | | 📁 | | ⬜ |
|
||||
| compt0.f | COMPT0 | SUBROUTINE | | BASICS, MODELQ, ALIPAR, ITERAT, auxcbc | | | compt0.rs | ✅ |
|
||||
| comset.f | COMSET | SUBROUTINE | | BASICS, MODELQ, comgfs, auxcbc | | | comset.rs | ✅ |
|
||||
| concor.f | CONCOR | SUBROUTINE | | BASICS, MODELQ | CONOUT | 📁 | | ⬜ |
|
||||
| conout.f | CONOUT | SUBROUTINE | | BASICS, MODELQ, ALIPAR, CUBCON | MEANOP, MEANOPT, CONVEC, OPACF0 | 📁 | | ⬜ |
|
||||
| conref.f | CONREF | SUBROUTINE | | BASICS, MODELQ, ARRAY1, imucnn, CUBCON | CONVC1, WNSTOR, STEQEQ, ELDENS, CONVEC, CONOUT | 📁 | | ⬜ |
|
||||
| contmd.f | CONTMD | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ALIPAR, PRSAUX, CUBCON | MEANOP, WNSTOR, STEQEQ, OPACF0, CONVEC, CONOUT, CUBIC | 📁 | | ⬜ |
|
||||
| contmp.f | CONTMP | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ALIPAR, ichndm, CUBCON | MEANOP, WNSTOR, STEQEQ, ELDENS, OPACF0, CONVEC, MEANOPT, CONOUT, CUBIC | 📁 | | ⬜ |
|
||||
| convc1.f | CONVC1 | SUBROUTINE | | BASICS, CUBCON | TRMDER, TRMDRT | | | ⬜ |
|
||||
| convec.f | CONVEC | SUBROUTINE | | BASICS, CUBCON | TRMDER, TRMDRT | | | ⬜ |
|
||||
| coolrt.f | COOLRT | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR, ARRAY1, ITERAT, COOLCO | OPACFA, RTEFR1 | 📁 | | ⬜ |
|
||||
| corrwm.f | CORRWM | SUBROUTINE | | BASICS, ATOMIC, MODELQ | QUIT | 📁 | | ⬜ |
|
||||
| cross.f | CROSS | FUNCTION | | BASICS, ATOMIC, MODELQ | CROSS | | cross.rs | ✅ |
|
||||
| crossd.f | CROSSD | FUNCTION | | BASICS, ATOMIC, MODELQ | CROSSD | | cross.rs | ✅ |
|
||||
| cspec.f | CSPEC | SUBROUTINE | | BASICS, ATOMIC | QUIT | | | ⬜ |
|
||||
| ctdata.f | CTDATA | BLOCK DATA | | CTIon, CTRecomb | | | ctdata.rs | ✅ |
|
||||
| cubic.f | CUBIC | SUBROUTINE | | BASICS, CUBCON | | | cubic.rs | ✅ |
|
||||
| dielrc.f | DIELRC | SUBROUTINE | ✓ | | | | dielrc.rs | ✅ |
|
||||
| dietot.f | DIETOT | SUBROUTINE | | BASICS, ATOMIC, MODELQ | DIELRC | 📁 | | ⬜ |
|
||||
| divstr.f | DIVSTR | SUBROUTINE | | BASICS, MODELQ | | | divstr.rs | ✅ |
|
||||
| dmder.f | DMDER | SUBROUTINE | | BASICS, ATOMIC, MODELQ, DEPTDR | | | dmder.rs | ✅ |
|
||||
| dmeval.f | DMEVAL | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT, ARRAY1 | | 📁 | | ⬜ |
|
||||
| dopgam.f | DOPGAM | SUBROUTINE | | BASICS, ATOMIC, MODELQ | GAMSP | | dopgam.rs | ✅ |
|
||||
| dwnfr.f | DWNFR | SUBROUTINE | | BASICS, MODELQ | | | dwnfr.rs | ✅ |
|
||||
| dwnfr0.f | DWNFR0 | SUBROUTINE | | BASICS, MODELQ | | | dwnfr0.rs | ✅ |
|
||||
| dwnfr1.f | DWNFR1 | SUBROUTINE | | BASICS, MODELQ | | | dwnfr1.rs | ✅ |
|
||||
| eint.f | EINT | SUBROUTINE | ✓ | | EXPINX | | expint.rs | ✅ |
|
||||
| elcor.f | ELCOR | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ADCHAR | WNSTOR, STEQEQ, STATE, MOLEQ | 📁 | | ⬜ |
|
||||
| eldenc.f | ELDENC | SUBROUTINE | | BASICS, MODELQ, ATOMIC, eletab, hmolab, eospar | RHONEN, STATE, MOLEQ | 📁 | | ⬜ |
|
||||
| eldens.f | ELDENS | SUBROUTINE | | BASICS, MODELQ, ATOMIC, terden, eospar | ENTENE, STATE, MPARTF, LINEQS, MOLEQ | 📁 | | ⬜ |
|
||||
| emat.f | EMAT | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ARRAY1, ALIPAR | | | emat.rs | ✅ |
|
||||
| entene.f | ENTENE | SUBROUTINE | | BASICS, ATOMIC, MODELQ | MPARTF | | | ⬜ |
|
||||
| erfcin.f | ERFCIN | FUNCTION | ✓ | | ERFCIN | | erfcx.rs | ✅ |
|
||||
| erfcx.f | ERFCX | FUNCTION | ✓ | | ERFCX | | erfcx.rs | ✅ |
|
||||
| expint.f | EXPINT | FUNCTION | ✓ | | EXPINT | | expint.rs | ✅ |
|
||||
| expinx.f | EXPINX | SUBROUTINE | ✓ | | | | expint.rs | ✅ |
|
||||
| expo.f | EXPO | FUNCTION | ✓ | | EXPO | | expo.rs | ✅ |
|
||||
| ffcros.f | FFCROS | FUNCTION | ✓ | | FFCROS | | ffcros.rs | ✅ |
|
||||
| gami.f | GAMI | FUNCTION | ✓ | | GAMI | | gami.rs | ✅ |
|
||||
| gamsp.f | GAMSP | SUBROUTINE | ✓ | BASICS | | | gamsp.rs | ✅ |
|
||||
| gauleg.f | GAULEG | SUBROUTINE | ✓ | | | | gauleg.rs | ✅ |
|
||||
| gaunt.f | GAUNT | FUNCTION | ✓ | | GAUNT | | gaunt.rs | ✅ |
|
||||
| getlal.f | GETLAL | SUBROUTINE | | BASICS, callardc, callarda, calphatd, callardg, callardb, quasun | | 📁 | | ⬜ |
|
||||
| getwrd.f | GETWRD | SUBROUTINE | ✓ | | | | getwrd.rs | ✅ |
|
||||
| gfree0.f | GFREE0 | SUBROUTINE | | BASICS, MODELQ | | | gfree.rs | ✅ |
|
||||
| gfree1.f | GFREE1 | FUNCTION | | BASICS, MODELQ | GFREE1 | | gfree.rs | ✅ |
|
||||
| gfreed.f | GFREED | SUBROUTINE | | BASICS, MODELQ | | | gfree.rs | ✅ |
|
||||
| ghydop.f | GHYDOP | SUBROUTINE | | BASICS, MODELQ, ATOMIC, intcfg | | | ghydop.rs | ✅ |
|
||||
| gntk.f | GNTK | FUNCTION | ✓ | | GNTK | | gntk.rs | ✅ |
|
||||
| gomini.f | GOMINI | SUBROUTINE | | BASICS, MODELQ, intcfg | | 📁 | | ⬜ |
|
||||
| grcor.f | GRCOR | SUBROUTINE | ✓ | | | | grcor.rs | ✅ |
|
||||
| greyd.f | GREYD | SUBROUTINE | | BASICS, MODELQ, ATOMIC, ALIPAR | WNSTOR, RHONEN, STEQEQ, OPACF0, MEANOP | 📁 | | ⬜ |
|
||||
| gridp.f | GRIDP | SUBROUTINE | ✓ | BASICS | | | gridp.rs | ✅ |
|
||||
| h2minus.f | H2MINUS | SUBROUTINE | | BASICS | LOCATE | 📁 | | ⬜ |
|
||||
| hction.f | HCTION | FUNCTION | | CTRTEMP, CTIon | HCTION | | ctdata.rs | ✅ |
|
||||
| hctrecom.f | HCTRECOM | FUNCTION | | CTRTEMP, CTRecomb | HCTRECOM | | ctdata.rs | ✅ |
|
||||
| hedif.f | HEDIF | SUBROUTINE | | BASICS, MODELQ, ATOMIC, hediff | | 📁 | | ⬜ |
|
||||
| hephot.f | HEPHOT | FUNCTION | ✓ | | HEPHOT | | hephot.rs | ✅ |
|
||||
| hesol6.f | HESOL6 | SUBROUTINE | | BASICS, MODELQ, PRSAUX | MATINV | | | ⬜ |
|
||||
| hesolv.f | HESOLV | SUBROUTINE | | BASICS, MODELQ, PRSAUX | MATINV, RHONEN, STEQEQ, WNSTOR | 📁 | | ⬜ |
|
||||
| hidalg.f | HIDALG | FUNCTION | ✓ | | HIDALG | | hidalg.rs | ✅ |
|
||||
| ijali2.f | IJALI2 | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR | QUIT | 📁 | | ⬜ |
|
||||
| ijalis.f | IJALIS | SUBROUTINE | | BASICS, ATOMIC, MODELQ | | 📁 | | ⬜ |
|
||||
| incldy.f | INCLDY | SUBROUTINE | | BASICS, ATOMIC, MODELQ | LEVSOL, RATMAT, WNSTOR, QUIT, SABOLF | 📁 | | ⬜ |
|
||||
| indexx.f | INDEXX | SUBROUTINE | ✓ | | | | indexx.rs | ✅ |
|
||||
| inicom.f | INICOM | SUBROUTINE | | BASICS, ATOMIC, MODELQ, comgfs | | | inicom.rs | ✅ |
|
||||
| inifrc.f | INIFRC | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ijflar | INDEXX | 📁 | | ⬜ |
|
||||
| inifrs.f | INIFRS | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR | INDEXX, QUIT | 📁 | | ⬜ |
|
||||
| inifrt.f | INIFRT | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ijflar | INDEXX | 📁 | | ⬜ |
|
||||
| inilam.f | INILAM | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT, ALIPAR | OPACF1, RTEFR1, COLIS, OPAINI, WNSTOR, STEQEQ, SABOLF, ELCOR, RATES1 | | | ⬜ |
|
||||
| initia.f | INITIA | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT, ODFPAR, ALIPAR, STRPAR, INUNIT, freqcl | RDATA, RDATAX, OPADD0, STATE, DOPGAM, ODFHYS, INTERP, LINSET, NSTPAR, QUIT, LINSPL, INIFRC, READBF | 📁 | | ⬜ |
|
||||
| inkul.f | INKUL | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, COLKUR, LINED | | 📁 | | ⬜ |
|
||||
| inpdis.f | INPDIS | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT, ODFPAR, ALIPAR, relcor | GRCOR | 📁 | | ⬜ |
|
||||
| inpmod.f | INPMOD | SUBROUTINE | | BASICS, ATOMIC, MODELQ, eospar | LEVSOL, RATMAT, WNSTOR, QUIT, SABOLF, MOLEQ, KURUCZ, INCLDY | 📁 | | ⬜ |
|
||||
| interp.f | INTERP | SUBROUTINE | ✓ | BASICS | | | interp.rs | ✅ |
|
||||
| inthyd.f | INTHYD | SUBROUTINE | | BASICS, MODELQ | DIVSTR | | inthyd.rs | ✅ |
|
||||
| intlem.f | INTLEM | SUBROUTINE | | BASICS, MODELQ | INTHYD | | intlem.rs | ✅ |
|
||||
| intxen.f | INTXEN | SUBROUTINE | | BASICS, MODELQ | | | intxen.rs | ✅ |
|
||||
| irc.f | IRC | SUBROUTINE | ✓ | | EXPINX, SZIRC | | irc.rs | ✅ |
|
||||
| iroset.f | IROSET | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, LINED | LEVCD, QUIT, INKUL | 📁 | | ⬜ |
|
||||
| kurucz.f | KURUCZ | SUBROUTINE | | BASICS, ATOMIC, MODELQ, temlim | LEVSOL, RATMAT, WNSTOR, RHONEN, QUIT, SABOLF, MOLEQ | 📁 | | ⬜ |
|
||||
| lagran.f | LAGRAN | SUBROUTINE | ✓ | | | | interpolate.rs | ✅ |
|
||||
| laguer.f | LAGUER | SUBROUTINE | | | | 📁 | laguer.rs | ✅ |
|
||||
| lemini.f | LEMINI | SUBROUTINE | | BASICS, MODELQ | | 📁 | | ⬜ |
|
||||
| levcd.f | LEVCD | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, COLKUR | INDEXX, QUIT | 📁 | | ⬜ |
|
||||
| levgrp.f | LEVGRP | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT | | | levgrp.rs | ✅ |
|
||||
| levset.f | LEVSET | SUBROUTINE | | BASICS, ATOMIC, MODELQ | QUIT | | | ⬜ |
|
||||
| levsol.f | LEVSOL | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT | LINEQS | | levsol.rs | ✅ |
|
||||
| lineqs.f | LINEQS | SUBROUTINE | ✓ | BASICS | | | lineqs.rs | ✅ |
|
||||
| linpro.f | LINPRO | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, quasun | STARK0, DOPGAM, INTLEM, DIVSTR, INTXEN | | | ⬜ |
|
||||
| linsel.f | LINSEL | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR | OPAINI, QUIT, OPACF1, RTEFR1 | 📁 | | ⬜ |
|
||||
| linset.f | LINSET | SUBROUTINE | | BASICS, ATOMIC, MODELQ | IJALIS, STARK0, QUIT, DIVSTR | 📁 | | ⬜ |
|
||||
| linspl.f | LINSPL | SUBROUTINE | | BASICS, ATOMIC, MODELQ | | | linspl.rs | ✅ |
|
||||
| locate.f | LOCATE | SUBROUTINE | ✓ | | | | locate.rs | ✅ |
|
||||
| ltegr.f | LTEGR | SUBROUTINE | | BASICS, ATOMIC, MODELQ | INTERP, WNSTOR, STEQEQ, QUIT, ROSSOP, CONOUT | 📁 | | ⬜ |
|
||||
| ltegrd.f | LTEGRD | SUBROUTINE | | BASICS, MODELQ, FACTRS, CUBCON, TOTJHK, FLXAUX, PRSAUX | TEMPER, INTERP, ZMRHO, WNSTOR, STEQEQ, ELDENS, QUIT, CONOUT | 📁 | | ⬜ |
|
||||
| lucy.f | LUCY | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ITERAT, ALIPAR, ARRAY1 | OPACFL, RTEFR1, COLIS, WNSTOR, STEQEQ, SABOLF, ELCOR, OPAINI | 📁 | | ⬜ |
|
||||
| lymlin.f | LYMLIN | SUBROUTINE | | BASICS, ATOMIC, MODELQ | STARK0, DIVSTR | 📁 | | ⬜ |
|
||||
| matcon.f | MATCON | SUBROUTINE | | BASICS, MODELQ, ARRAY1, CUBCON | CONVEC | | | ⬜ |
|
||||
| matgen.f | MATGEN | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ARRAY1, ALIPAR | BHED, BRTE, BHEZ, BREZ, MATCON, BRTEZ, EMAT, BHE, SABOLF, BPOP, BRE | | | ⬜ |
|
||||
| matinv.f | MATINV | SUBROUTINE | ✓ | BASICS | | | matinv.rs | ✅ |
|
||||
| meanop.f | MEANOP | SUBROUTINE | | BASICS, MODELQ, ATOMIC | | | meanop.rs | ✅ |
|
||||
| meanopt.f | MEANOPT | SUBROUTINE | | BASICS, MODELQ | OPCTAB | | | ⬜ |
|
||||
| minv3.f | MINV3 | SUBROUTINE | ✓ | | | | minv3.rs | ✅ |
|
||||
| moleq.f | MOLEQ | SUBROUTINE | | BASICS, MODELQ, ATOMIC, COMFH1, entrop, moldat, eospar, adchar, ioniz2, terden, hmolab | RUSSEL, MPARTF | 📁 | | ⬜ |
|
||||
| mpartf.f | MPARTF | SUBROUTINE | | moldat | | 📁 | | ⬜ |
|
||||
| newdm.f | NEWDM | SUBROUTINE | | BASICS, MODELQ, FACTRS, PRSAUX, FLXAUX | INTERP, TEMPER | 📁 | | ⬜ |
|
||||
| newdmt.f | NEWDMT | SUBROUTINE | | BASICS, MODELQ, FACTRS, PRSAUX, FLXAUX | GRIDP, INTERP, TEMPER | 📁 | | ⬜ |
|
||||
| newpop.f | NEWPOP | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT | | 📁 | | ⬜ |
|
||||
| nstout.f | NSTOUT | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT, ODFPAR, ALIPAR | QUIT | 📁 | | ⬜ |
|
||||
| nstpar.f | NSTPAR | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT, ODFPAR, ALIPAR, imucnn, temlim, adiaba, ifpzpa, derdif, ichndm, ipricr, deridt, hediff, FLXAUX, irwint, moldat, quasun, freqcl, icnrsp | QUIT, GETWRD | 📁 | | ⬜ |
|
||||
| odf1.f | ODF1 | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR | DWNFR, ODFHST, DIVSTR | 📁 | | ⬜ |
|
||||
| odffr.f | ODFFR | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR | QUIT | | | ⬜ |
|
||||
| odfhst.f | ODFHST | SUBROUTINE | | BASICS, MODELQ, ODFPAR | | | odfhst.rs | ✅ |
|
||||
| odfhyd.f | ODFHYD | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR | INDEXX, ODFHST, DIVSTR | | | ⬜ |
|
||||
| odfhys.f | ODFHYS | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR | IJALIS, STARK0, ODFFR | | | ⬜ |
|
||||
| odfmer.f | ODFMER | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR | ODFHYD | | | ⬜ |
|
||||
| odfset.f | ODFSET | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, STFCR | IJALIS, QUIT | 📁 | | ⬜ |
|
||||
| opacf0.f | OPACF0 | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR, hmolab | GFREE0, DWNFR1, DWNFR0, WNSTOR, LINPRO, SABOLF, SGMER1, OPADD, OPACT1 | | | ⬜ |
|
||||
| opacf1.f | OPACF1 | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR, ipricr, hmolab | QUASIM, GHYDOP, DWNFR1, LYMLIN, SGMER1, OPADD, PRD, OPACT1 | 📁 | | ⬜ |
|
||||
| opacfa.f | OPACFA | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR, COOLCO | SGMER1, OPADD, PRD, DWNFR1 | | | ⬜ |
|
||||
| opacfd.f | OPACFD | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR, ARRAY1, ITERAT, dsctva, hmolab, rhoder | OPACTD, QUASIM, DWNFR1, LYMLIN, OPCTAB, SGMER1, OPADD, PRD, GFREED | 📁 | | ⬜ |
|
||||
| opacfl.f | OPACFL | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR | SGMER1, OPADD, DWNFR1 | | | ⬜ |
|
||||
| opact1.f | OPACT1 | SUBROUTINE | | BASICS, MODELQ, ALIPAR, hmolab | OPCTAB | | | ⬜ |
|
||||
| opactd.f | OPACTD | SUBROUTINE | | BASICS, MODELQ, ALIPAR, ARRAY1, ITERAT, dsctva, hmolab, rhoder | OPCTAB | | | ⬜ |
|
||||
| opactr.f | OPACTR | SUBROUTINE | | BASICS, MODELQ, ALIPAR, ATOMIC, dsctva, hmolab, grdpra | RATMAL, OPACF1, LEVSOL, WNSTOR, STEQEQ, ELDENS, SABOLF, OPAINI, PGSET | | | ⬜ |
|
||||
| opadd.f | OPADD | SUBROUTINE | | BASICS, ATOMIC, MODELQ, eospar | CIA_H2H, CIA_H2HE, CIA_HHE, H2MINUS, CIA_H2H2 | | | ⬜ |
|
||||
| opadd0.f | OPADD0 | SUBROUTINE | | BASICS, ATOMIC, MODELQ | QUIT | | | ⬜ |
|
||||
| opahst.f | OPAHST | SUBROUTINE | | BASICS, ODFPAR | STARK0 | 📁 | | ⬜ |
|
||||
| opaini.f | OPAINI | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR | DWNFR0, REFLEV, WNSTOR, LINPRO, SABOLF, LEVGRP | | | ⬜ |
|
||||
| opctab.f | OPCTAB | SUBROUTINE | | BASICS, MODELQ | RAYLEIGH | | | ⬜ |
|
||||
| opdata.f | OPDATA | SUBROUTINE | | TOPB | | 📁 | | ⬜ |
|
||||
| opfrac.f | OPFRAC | SUBROUTINE | | pfoptb | | 📁 | | ⬜ |
|
||||
| osccor.f | OSCCOR | SUBROUTINE | | BASICS, MODELQ, ITERAT | | 📁 | | ⬜ |
|
||||
| outpri.f | OUTPRI | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ARRAY1, grdpra | RATMAL, OPACF1, LEVSOL, WNSTOR, SABOLF | 📁 | | ⬜ |
|
||||
| output.f | OUTPUT | SUBROUTINE | | BASICS, MODELQ | | 📁 | | ⬜ |
|
||||
| partf.f | PARTF | SUBROUTINE | | BASICS, irwint, PFSTDS | PFFE, PFNI, OPFRAC, MPARTF, PFHEAV, PFSPEC, PFCNO | | | ⬜ |
|
||||
| pfcno.f | PFCNO | SUBROUTINE | ✓ | BASICS | | | pfcno.rs | ✅ |
|
||||
| pffe.f | PFFE | SUBROUTINE | ✓ | | | | pffe.rs | ✅ |
|
||||
| pfheav.f | PFHEAV | SUBROUTINE | | | | 📁 | | ⬜ |
|
||||
| pfni.f | PFNI | SUBROUTINE | ✓ | | | | pfni.rs | ✅ |
|
||||
| pfspec.f | PFSPEC | SUBROUTINE | ✓ | | | | pfspec.rs | ✅ |
|
||||
| pgset.f | PGSET | SUBROUTINE | | BASICS, ITERAT, MODELQ, rybpgs, grdpra | TRIDAG | 📁 | | ⬜ |
|
||||
| prchan.f | PRCHAN | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT | | 📁 | | ⬜ |
|
||||
| prd.f | PRD | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT | DOPGAM | | | ⬜ |
|
||||
| prdini.f | PRDINI | SUBROUTINE | | BASICS, ATOMIC, MODELQ | | | prdini.rs | ✅ |
|
||||
| princ.f | PRINC | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ALIPAR | LINPRO, DWNFR, OPACF1, SABOLF | 📁 | | ⬜ |
|
||||
| prnt.f | PRNT | SUBROUTINE | | BASICS, ATOMIC, MODELQ | SABOLF | 📁 | | ⬜ |
|
||||
| profil.f | PROFIL | FUNCTION | | BASICS, ATOMIC, MODELQ, quasun | PROFIL, STARK0, DIVSTR | | profil.rs | ✅ |
|
||||
| profsp.f | PROFSP | FUNCTION | | BASICS, ATOMIC, MODELQ | PROFSP, SABOLF | | | ⬜ |
|
||||
| prsent.f | PRSENT | SUBROUTINE | | tdflag, tdedge, THERM, TABLTD | | 📁 | | ⬜ |
|
||||
| psolve.f | PSOLVE | SUBROUTINE | | BASICS, MODELQ | | | psolve.rs | ✅ |
|
||||
| pzert.f | PZERT | SUBROUTINE | | BASICS, ATOMIC, MODELQ | | | pzert.rs | ✅ |
|
||||
| pzeval.f | PZEVAL | SUBROUTINE | | BASICS, MODELQ, ALIPAR, icnrsp | CONOUT | 📁 | | ⬜ |
|
||||
| pzevld.f | PZEVLD | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ALIPAR, ARRAY1, ifpzpa, PRSAUX, grdpra, DEPTDR | | | pzevld.rs | ✅ |
|
||||
| quartc.f | QUARTC | SUBROUTINE | | | | 📁 | quartc.rs | ✅ |
|
||||
| quasim.f | QUASIM | SUBROUTINE | | BASICS, ATOMIC, MODELQ, quasun | ALLARD | | | ⬜ |
|
||||
| quit.f | QUIT | SUBROUTINE | | | | 📁 | quit.rs | ✅ |
|
||||
| radpre.f | RADPRE | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR | QUIT, INDEXX, OPACF1, RTEFR1 | 📁 | | ⬜ |
|
||||
| radtot.f | RADTOT | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR, ITERAT, OPTDPT, TOTJHK, SURFEX | OPAINI, OPACF1, RTEFR1 | | | ⬜ |
|
||||
| raph.f | RAPH | FUNCTION | ✓ | | RAPH | | raph.rs | ✅ |
|
||||
| rates1.f | RATES1 | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR, ITERAT | ROSSTD, OPACF1, RTEFR1 | | | ⬜ |
|
||||
| ratmal.f | RATMAL | SUBROUTINE | | BASICS, ATOMIC, MODELQ | | | ratmal.rs | ✅ |
|
||||
| ratmat.f | RATMAT | SUBROUTINE | | BASICS, ATOMIC, MODELQ | REFLEV | | | ⬜ |
|
||||
| ratsp1.f | RATSP1 | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR, ARRAY1, ITERAT | ROSSTD, OPACF1, RTEFR1 | 📁 | | ⬜ |
|
||||
| rayini.f | RAYINI | SUBROUTINE | | BASICS, MODELQ, ATOMIC | RAYLEIGH | 📁 | | ⬜ |
|
||||
| rayleigh.f | RAYLEIGH | SUBROUTINE | | BASICS, ATOMIC, MODELQ, RAYSCT, eospar | | | rayleigh.rs | ✅ |
|
||||
| rayset.f | RAYSET | SUBROUTINE | | BASICS, MODELQ | | | rayset.rs | ✅ |
|
||||
| rdata.f | RDATA | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT, ODFPAR, ALIPAR, STRPAR, INUNIT, imodlc | RDATAX, LINSET, QUIT, DOPGAM | 📁 | | ⬜ |
|
||||
| rdatax.f | RDATAX | SUBROUTINE | | BASICS, ATOMIC, MODELQ | BKHSGO | 📁 | | ⬜ |
|
||||
| readbf.f | READBF | SUBROUTINE | | BASICS | | 📁 | | ⬜ |
|
||||
| rechck.f | RECHCK | SUBROUTINE | | BASICS, ATOMIC, MODELQ | OPACF1, RTEFR1 | 📁 | | ⬜ |
|
||||
| reflev.f | REFLEV | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT | | | | ⬜ |
|
||||
| reiman.f | REIMAN | FUNCTION | ✓ | | REIMAN | | reiman.rs | ✅ |
|
||||
| resolv.f | RESOLV | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT, ALIPAR, ARRAY1, icnrsp | NEWPOP, TAUFR1, TIMING, OPACF1, RTEFR1, ROSSTD, STEQEQ, CONOUT, ELCOR, OPAINI, RATES1, PRD | 📁 | | ⬜ |
|
||||
| rhoeos.f | RHOEOS | FUNCTION | | BASICS, MODELQ | PRSENT, RHOEOS | | | ⬜ |
|
||||
| rhonen.f | RHONEN | SUBROUTINE | | BASICS, MODELQ | ELDENS | | | ⬜ |
|
||||
| rhsgen.f | RHSGEN | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ARRAY1, ALIPAR, CUBCON | MATINV, STATE, RATMAT, COMPT0, SABOLF, CONVEC, LEVGRP | | | ⬜ |
|
||||
| rossop.f | ROSSOP | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ALIPAR | WNSTOR, STEQEQ, ELDENS, OPACF0, MEANOP, MEANOPT | | | ⬜ |
|
||||
| rosstd.f | ROSSTD | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT, ALIPAR | | 📁 | | ⬜ |
|
||||
| rte_sc.f | RTE_SC | SUBROUTINE | ✓ | BASICS | | | rte_sc.rs | ✅ |
|
||||
| rteang.f | RTEANG | SUBROUTINE | | BASICS, MODELQ, ALIPAR, EXTINT, SURFEX | GAULEG | | | ⬜ |
|
||||
| rtecf0.f | RTECF0 | SUBROUTINE | | BASICS, MODELQ, ALIPAR, ITERAT, OPTDPT, auxcbc, AUXRTE | | | | ⬜ |
|
||||
| rtecf1.f | RTECF1 | SUBROUTINE | | BASICS, MODELQ, ALIPAR, ITERAT, OPTDPT, comgfs, AUXRTE, EXTINT, SURFEX | RTEFE2, RTESOL, RTECF0 | 📁 | | ⬜ |
|
||||
| rtecmc.f | RTECMC | SUBROUTINE | | BASICS, MODELQ, ALIPAR, ITERAT, comgfs, AUXRTE | MATINV, OPACF1, RTECF0 | | | ⬜ |
|
||||
| rtecmu.f | RTECMU | SUBROUTINE | | BASICS, MODELQ, ALIPAR, ITERAT, OPTDPT, AUXRTE | RTESOL, OPACF1, RTECF0, GAULEG | 📁 | | ⬜ |
|
||||
| rtecom.f | RTECOM | SUBROUTINE | | BASICS, MODELQ, ALIPAR, ITERAT, OPTDPT, comgfs, AUXRTE | OPACF1, RTECF0, RTECF1 | | | ⬜ |
|
||||
| rtedf1.f | RTEDF1 | SUBROUTINE | | BASICS, MODELQ, ALIPAR, OPTDPT | | | rtedf1.rs | ✅ |
|
||||
| rtedf2.f | RTEDF2 | SUBROUTINE | | BASICS, MODELQ, ALIPAR | | | | ⬜ |
|
||||
| rtefe2.f | RTEFE2 | SUBROUTINE | ✓ | BASICS | | | rtefe2.rs | ✅ |
|
||||
| rtefr1.f | RTEFR1 | SUBROUTINE | | BASICS, MODELQ, ALIPAR, ITERAT, OPTDPT | MATINV, RTESOL, RTEDF1, RTECF1, RTEDF2, MINV3 | 📁 | | ⬜ |
|
||||
| rteint.f | RTEINT | SUBROUTINE | | BASICS, MODELQ, ALIPAR, ITERAT, OPTDPT | MATINV, OPACF1 | 📁 | | ⬜ |
|
||||
| rtesol.f | RTESOL | SUBROUTINE | ✓ | BASICS | | | rtesol.rs | ✅ |
|
||||
| russel.f | RUSSEL | SUBROUTINE | | BASICS, MODELQ, COMFH1 | MPARTF | 📁 | | ⬜ |
|
||||
| rybchn.f | RYBCHN | SUBROUTINE | | BASICS, ITERAT, MODELQ, ALIPAR, ARRAY1, rybpgs, grdpra | PGSET, ELDENS | 📁 | | ⬜ |
|
||||
| rybene.f | RYBENE | SUBROUTINE | | BASICS, MODELQ, ALIPAR, ARRAY1, RYBMTX, deridt, CUBCON | CONVEC | | | ⬜ |
|
||||
| rybheq.f | RYBHEQ | SUBROUTINE | | BASICS, MODELQ, rybpgs, grdpra | OPACF1, RTEFR1, WNSTOR, STEQEQ, ELDENS, ELCOR, OPAINI, PGSET | 📁 | | ⬜ |
|
||||
| rybmat.f | RYBMAT | SUBROUTINE | | BASICS, MODELQ, ALIPAR, ARRAY1, dsctva, RYBMTX | | | | ⬜ |
|
||||
| rybsol.f | RYBSOL | SUBROUTINE | | BASICS, MODELQ, ATOMIC, ALIPAR, ARRAY1, ITERAT, imodlc, RYBMTX | RYBMAT, RTEFR1, ROSSTD, OPACTR, LINEQS, STEQEQ, ALIFR1, TRIDAG, RYBCHN, OPACFD | 📁 | | ⬜ |
|
||||
| sabolf.f | SABOLF | SUBROUTINE | | BASICS, ATOMIC, MODELQ | PARTF | | | ⬜ |
|
||||
| sbfch.f | SBFCH | FUNCTION | ✓ | | SBFCH | | sbfch.rs | ✅ |
|
||||
| sbfhe1.f | SBFHE1 | FUNCTION | | BASICS, ATOMIC | SBFHE1, QUIT | 📁 | sbfhe1.rs | ✅ |
|
||||
| sbfhmi.f | SBFHMI | FUNCTION | ✓ | | SBFHMI | | sbfhmi.rs | ✅ |
|
||||
| sbfhmi_old.f | SBFHMI_OLD | FUNCTION | ✓ | | SBFHMI_OLD | | sbfhmi_old.rs | ✅ |
|
||||
| sbfoh.f | SBFOH | FUNCTION | ✓ | | SBFOH | | sbfoh.rs | ✅ |
|
||||
| setdrt.f | SETDRT | SUBROUTINE | | BASICS, MODELQ, RHODER | | | | ⬜ |
|
||||
| settrm.f | SETTRM | SUBROUTINE | | tdflag, tdedge, THERM, TABLTD | PRSENT | 📁 | | ⬜ |
|
||||
| sffhmi.f | SFFHMI | FUNCTION | ✓ | | SFFHMI | | sffhmi.rs | ✅ |
|
||||
| sffhmi_add.f | SFFHMI_ADD | FUNCTION | ✓ | | SFFHMI_ADD | | sffhmi_add.rs | ✅ |
|
||||
| sghe12.f | SGHE12 | FUNCTION | ✓ | | SGHE12 | | sghe12.rs | ✅ |
|
||||
| sgmer0.f | SGMER0 | SUBROUTINE | | BASICS, ATOMIC, MODELQ | | | sgmer.rs | ✅ |
|
||||
| sgmer1.f | SGMER1 | SUBROUTINE | | BASICS, ATOMIC, MODELQ | | | sgmer.rs | ✅ |
|
||||
| sgmerd.f | SGMERD | SUBROUTINE | | BASICS, ATOMIC, MODELQ | | | sgmer.rs | ✅ |
|
||||
| sigave.f | SIGAVE | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR | | 📁 | | ⬜ |
|
||||
| sigk.f | SIGK | FUNCTION | | BASICS, ATOMIC | SPSIGK, SIGK | | | ⬜ |
|
||||
| sigmar.f | SIGMAR | FUNCTION | | BASICS | SIGMAR, LAGUER | 📁 | | ⬜ |
|
||||
| solve.f | SOLVE | SUBROUTINE | | BASICS, ITERAT, MODELQ, ARRAY1, ALIPAR, CMATZD | MATINV, PRCHAN, RHSGEN, WNSTOR, MATGEN | 📁 | | ⬜ |
|
||||
| solves.f | SOLVES | SUBROUTINE | | BASICS, ITERAT, MODELQ, ARRAY1, ALIPAR, STOMAT, CMATZD | MATINV, PRCHAN, RHSGEN, WNSTOR, MATGEN | 📁 | | ⬜ |
|
||||
| spsigk.f | SPSIGK | SUBROUTINE | ✓ | | CARBON | | spsigk.rs | ✅ |
|
||||
| srtfrq.f | SRTFRQ | SUBROUTINE | | BASICS, ATOMIC, MODELQ | INDEXX, QUIT | 📁 | | ⬜ |
|
||||
| stark0.f | STARK0 | SUBROUTINE | ✓ | | | | stark0.rs | ✅ |
|
||||
| starka.f | STARKA | FUNCTION | | BASICS, MODELQ | STARKA | | starka.rs | ✅ |
|
||||
| start.f | START | SUBROUTINE | | BASICS, hediff | | 📁 | | ⬜ |
|
||||
| state.f | STATE | SUBROUTINE | | BASICS, ATOMIC, MODELQ, terden, PFSTDS | OPFRAC, PARTF | 📁 | | ⬜ |
|
||||
| steqeq.f | STEQEQ | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT, POPSTR, PPAPAR | LEVSOL, RATMAT, SABOLF, MOLEQ | | | ⬜ |
|
||||
| switch.f | SWITCH | SUBROUTINE | | BASICS, ATOMIC, MODELQ | | 📁 | | ⬜ |
|
||||
| szirc.f | SZIRC | SUBROUTINE | ✓ | | EINT | | szirc.rs | ✅ |
|
||||
| tabini.f | TABINI | SUBROUTINE | | BASICS, MODELQ, ATOMIC, eletab, abntab, intcff | | 📁 | | ⬜ |
|
||||
| tabint.f | TABINT | SUBROUTINE | | BASICS, MODELQ, ATOMIC, intcff | | | | ⬜ |
|
||||
| taufr1.f | TAUFR1 | SUBROUTINE | | BASICS, MODELQ, ALIPAR, ITERAT, OPTDPT | | | | ⬜ |
|
||||
| tdpini.f | TDPINI | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR, ALIPAR | GFREE0 | | tdpini.rs | ✅ |
|
||||
| temcor.f | TEMCOR | SUBROUTINE | | BASICS, MODELQ, ARRAY1, ALIPAR, CUBCON | MEANOP, WNSTOR, STEQEQ, ELDENS, OPACF0, CONVEC | 📁 | | ⬜ |
|
||||
| temper.f | TEMPER | SUBROUTINE | | BASICS, MODELQ, ALIPAR, FACTRS, PRSAUX, FLXAUX | WNSTOR, TLOCAL, STEQEQ, ELDENS, OPACF0, MEANOP, MEANOPT | 📁 | | ⬜ |
|
||||
| timing.f | TIMING | SUBROUTINE | | | | 📁 | | ⬜ |
|
||||
| tiopf.f | TIOPF | SUBROUTINE | ✓ | | | | tiopf.rs | ✅ |
|
||||
| tlocal.f | TLOCAL | SUBROUTINE | | BASICS, MODELQ, FACTRS, FLXAUX | QUARTC | | | ⬜ |
|
||||
| tlusty.f | TLUSTY | UNKNOWN | | BASICS, ITERAT, ALIPAR | TIMING | 📁 | | ⬜ |
|
||||
| topbas.f | TOPBAS | FUNCTION | | TOPB | TOPBAS | 📁 | | ⬜ |
|
||||
| traini.f | TRAINI | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ODFPAR | | | traini.rs | ✅ |
|
||||
| tridag.f | TRIDAG | SUBROUTINE | ✓ | | | | tridag.rs | ✅ |
|
||||
| trmder.f | TRMDER | SUBROUTINE | | BASICS, derdif, terden, adiaba | ELDENS | | | ⬜ |
|
||||
| trmdrt.f | TRMDRT | SUBROUTINE | | BASICS, tdedge, CC, tdflag, CONVOUT | PRSENT | | | ⬜ |
|
||||
| ubeta.f | UBETA | FUNCTION | ✓ | | UBETA, LAGRAN | | ubeta.rs | ✅ |
|
||||
| vern16.f | VERN16 | FUNCTION | ✓ | BASICS | VERN16 | | vern16.rs | ✅ |
|
||||
| vern18.f | VERN18 | FUNCTION | ✓ | BASICS | VERN18 | | vern18.rs | ✅ |
|
||||
| vern20.f | VERN20 | FUNCTION | ✓ | BASICS | VERN20 | | vern20.rs | ✅ |
|
||||
| vern26.f | VERN26 | FUNCTION | ✓ | BASICS | VERN26 | | vern26.rs | ✅ |
|
||||
| verner.f | VERNER | FUNCTION | | BASICS, ATOMIC | QUIT, VERNER | | verner.rs | ✅ |
|
||||
| visini.f | VISINI | SUBROUTINE | | BASICS, ATOMIC, MODELQ, ITERAT | | 📁 | | ⬜ |
|
||||
| voigt.f | VOIGT | FUNCTION | ✓ | | VOIGT | | voigt.rs | ✅ |
|
||||
| voigte.f | VOIGTE | FUNCTION | ✓ | | VOIGTE | | voigte.rs | ✅ |
|
||||
| wn.f | WN | FUNCTION | ✓ | BASICS | WN | | wn.rs | ✅ |
|
||||
| wnstor.f | WNSTOR | SUBROUTINE | | BASICS, ATOMIC, MODELQ | | | wnstor.rs | ✅ |
|
||||
| xenini.f | XENINI | SUBROUTINE | | BASICS, MODELQ | | 📁 | | ⬜ |
|
||||
| xk2dop.f | XK2DOP | FUNCTION | ✓ | | XK2DOP | | xk2dop.rs | ✅ |
|
||||
| yint.f | YINT | FUNCTION | ✓ | | YINT | | interpolate.rs | ✅ |
|
||||
| ylintp.f | YLINTP | FUNCTION | ✓ | | YLINTP | | ylintp.rs | ✅ |
|
||||
| zmrho.f | ZMRHO | SUBROUTINE | | BASICS, MODELQ | | | zmrho.rs | ✅ |
|
||||
@@ -0,0 +1,110 @@
|
||||
# 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) - 重构过程中遇到的问题及解决方法
|
||||
@@ -0,0 +1,374 @@
|
||||
# TLUSTY Rust 重构规范
|
||||
|
||||
## 1. 选定下一个重构目标
|
||||
|
||||
优先处理依赖少无io的函数
|
||||
|
||||
注意:DATA 语句(硬编码的数据表)已经由scripts/extract_fortran_data.py生成到src/data.rs中
|
||||
|
||||
不要管复杂不复杂和有无common依赖,
|
||||
按python3 scripts/analyze_fortran.py --priority | head -10 的顺序来
|
||||
|
||||
分离出来的原始fortran函数在/home/fmq/program/tlusty/tl208-s54/rust/tlusty/extracted文件夹下
|
||||
### 优先级排序
|
||||
|
||||
**核心原则**: 优先处理"传递未实现依赖=0"的函数,它们不依赖其他未完成的函数。
|
||||
|
||||
按以下顺序选择待重构函数:
|
||||
|
||||
1. **无未实现依赖** (传递未实现=0)
|
||||
- 可立即开始,无需等待其他函数
|
||||
- 包括纯函数和只有 COMMON 依赖的函数
|
||||
|
||||
2. **少量未实现依赖** (传递未实现=1~3)
|
||||
- 需要先完成少数依赖函数
|
||||
- 用 `--tree` 查看具体依赖链
|
||||
|
||||
3. **多未实现依赖** (传递未实现>3)
|
||||
- 依赖链较长,最后处理
|
||||
- 或考虑整体重构策略
|
||||
|
||||
4. **有 I/O 依赖的函数**
|
||||
- 最后处理,可能需要设计新的 I/O 抽象层
|
||||
|
||||
### 查询命令
|
||||
|
||||
CSV 列结构: `fortran_file,unit_name,unit_type,is_pure,common_deps,call_deps,has_io,rust_module,status`
|
||||
|
||||
#### 依赖树分析
|
||||
|
||||
```bash
|
||||
# 输出重构优先级列表(按未实现依赖排序,推荐!)
|
||||
python3 scripts/analyze_fortran.py --priority
|
||||
|
||||
# 输出指定单元的依赖树
|
||||
python3 scripts/analyze_fortran.py --tree UNIT_NAME
|
||||
|
||||
# 输出完整传递依赖的 CSV
|
||||
python3 scripts/analyze_fortran.py --full > fortran_analysis_full.csv
|
||||
```
|
||||
|
||||
**优先级列表说明:**
|
||||
```
|
||||
重构优先级列表 (按未实现依赖排序)
|
||||
====================================================================================================
|
||||
单元名 未实现 传递未实现 深度 直接调用 传递调用 IO
|
||||
----------------------------------------------------------------------------------------------------
|
||||
C 0 0 0 0 0 ○
|
||||
ALIFR3 0 0 0 0 0 ○
|
||||
```
|
||||
- **未实现**: 直接依赖中未完成的函数数
|
||||
- **传递未实现**: 所有递归依赖中未完成的函数数(关键指标!)
|
||||
- **排序**: 传递未实现少 → 深度低 → 依赖少
|
||||
- 只显示未完成(pending)的函数
|
||||
- IO 列: ○ = 无IO, ✓ = 有IO
|
||||
|
||||
**依赖树输出示例:**
|
||||
```
|
||||
依赖树: ALISK1 ○
|
||||
============================================================
|
||||
直接依赖: 4, 传递依赖: 27, 未实现: 20
|
||||
未实现依赖: ALIFRK, OPACF1, OPADD, ROSSTD, ...
|
||||
------------------------------------------------------------
|
||||
○ ALISK1 (4未实现)
|
||||
├── ○ OPACF1 (6未实现)
|
||||
│ ├── ○ OPADD (5未实现)
|
||||
│ │ ├── ○ cia_h2h2 (1未实现)
|
||||
│ │ │ └── if [未找到/未实现]
|
||||
│ │ └── ✓ locate
|
||||
│ └── ...
|
||||
└── ○ ALIFRK
|
||||
```
|
||||
- ✓ = 已完成, ○ = 待处理
|
||||
- `(N未实现)` = 该节点有 N 个直接依赖未完成
|
||||
- 顶部汇总:传递未实现依赖数及列表
|
||||
- 子节点按未实现依赖数排序(多的在前)
|
||||
|
||||
#### 按纯度筛选
|
||||
|
||||
无io的纯函数已经全部实现重构
|
||||
#### 按 I/O 筛选
|
||||
|
||||
```bash
|
||||
# 有 I/O 的未完成函数 (最后处理)
|
||||
awk -F, '$7=="True" && $9=="pending"' fortran_analysis.csv
|
||||
|
||||
# 无 I/O 的未完成函数 (优先处理)
|
||||
awk -F, '$7=="False" && $9=="pending"' fortran_analysis.csv
|
||||
|
||||
# 无 I/O 且无调用依赖的未完成函数
|
||||
awk -F, '$6=="" && $7=="False" && $9=="pending"' fortran_analysis.csv
|
||||
```
|
||||
|
||||
#### 按 COMMON 依赖筛选
|
||||
|
||||
```bash
|
||||
# 只依赖 BASICS 的未完成函数
|
||||
awk -F, '$5=="BASICS" && $9=="pending"' fortran_analysis.csv
|
||||
|
||||
# 依赖 BASICS 和 ATOMIC,但无其他依赖
|
||||
awk -F, '$5 ~ /^BASICS\|ATOMIC$/ && $9=="pending"' fortran_analysis.csv
|
||||
|
||||
# 不依赖 MODELQ 的未完成函数 (MODELQ 最复杂)
|
||||
awk -F, '$5 !~ /MODELQ/ && $9=="pending"' fortran_analysis.csv
|
||||
|
||||
# 列出所有不同的 COMMON 依赖组合
|
||||
awk -F, '{print $5}' fortran_analysis.csv | sort | uniq -c | sort -rn
|
||||
```
|
||||
|
||||
#### 按状态筛选
|
||||
|
||||
```bash
|
||||
# 所有已完成函数
|
||||
awk -F, '$9=="done"' fortran_analysis.csv
|
||||
|
||||
# 所有进行中函数
|
||||
awk -F, '$9=="in_progress"' fortran_analysis.csv
|
||||
|
||||
# 统计各状态数量
|
||||
awk -F, '{print $9}' fortran_analysis.csv | sort | uniq -c
|
||||
```
|
||||
|
||||
#### 组合筛选
|
||||
|
||||
```bash
|
||||
# 最佳候选:无 I/O + 无调用依赖 + 纯函数或简单 COMMON
|
||||
awk -F, '$6=="" && $7=="False" && $9=="pending"' fortran_analysis.csv
|
||||
|
||||
# 次优候选:无 I/O + 有调用依赖但依赖已完成
|
||||
awk -F, '$6!="" && $7=="False" && $9=="pending"' fortran_analysis.csv
|
||||
|
||||
# 查看特定函数的依赖信息
|
||||
awk -F, '$2=="TARGET"' fortran_analysis.csv
|
||||
```
|
||||
|
||||
#### 按代码大小排序
|
||||
|
||||
```bash
|
||||
# 按行数排序(选小的先做)
|
||||
cd tlusty/extracted
|
||||
wc -l *.f | sort -n | head -30
|
||||
|
||||
# 查看小文件 + 纯函数
|
||||
for f in $(ls *.f); do
|
||||
lines=$(wc -l < "$f")
|
||||
name=$(basename "$f" .f)
|
||||
if grep -q "True.*pending" ../../fortran_analysis.csv && [ $lines -lt 100 ]; then
|
||||
echo "$lines $name"
|
||||
fi
|
||||
done | sort -n
|
||||
```
|
||||
|
||||
#### 快速查看
|
||||
|
||||
```bash
|
||||
# 查看重构进度摘要
|
||||
echo "已完成: $(awk -F, '$9=="done"' fortran_analysis.csv | wc -l)"
|
||||
echo "待处理: $(awk -F, '$9=="pending"' fortran_analysis.csv | wc -l)"
|
||||
echo "纯函数待处理: $(awk -F, '$4=="True" && $9=="pending"' fortran_analysis.csv | wc -l)"
|
||||
echo "无IO待处理: $(awk -F, '$7=="False" && $9=="pending"' fortran_analysis.csv | wc -l)"
|
||||
```
|
||||
|
||||
## 2. 重构流程
|
||||
|
||||
### Step 1: 分析 Fortran 源码
|
||||
|
||||
```bash
|
||||
# 查看源码
|
||||
cat tlusty/extracted/TARGET.f
|
||||
```
|
||||
|
||||
检查:
|
||||
- [ ] INCLUDE 文件列表
|
||||
- [ ] COMMON 块
|
||||
- [ ] 调用的其他函数
|
||||
- [ ] 是否有 I/O
|
||||
|
||||
### Step 2: 创建 Rust 模块
|
||||
|
||||
```bash
|
||||
# 创建文件
|
||||
touch src/math/TARGET.rs
|
||||
```
|
||||
|
||||
### Step 3: 实现函数
|
||||
|
||||
遵循命名规范:
|
||||
- Fortran `FUNCTION` → Rust `pub fn`
|
||||
- Fortran `SUBROUTINE` → Rust `pub fn` (返回值用参数或元组)
|
||||
- COMMON 块 → 结构体参数
|
||||
|
||||
### Step 4: 添加到 mod.rs
|
||||
|
||||
```rust
|
||||
// src/math/mod.rs
|
||||
mod target;
|
||||
pub use target::target;
|
||||
```
|
||||
|
||||
### Step 5: 编写测试
|
||||
|
||||
```rust
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use approx::assert_relative_eq;
|
||||
|
||||
#[test]
|
||||
fn test_target_basic() {
|
||||
// 基本测试
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Step 6: 运行测试
|
||||
|
||||
```bash
|
||||
# 单个模块测试 (不要 cargo test 全量!)
|
||||
cargo test target
|
||||
```
|
||||
|
||||
### Step 7: 更新追踪表
|
||||
|
||||
```bash
|
||||
# 如果是一对一映射,脚本自动识别
|
||||
python3 scripts/analyze_fortran.py > fortran_analysis.csv
|
||||
python3 scripts/generate_tracking.py > FORTRAN_TRACKING.md
|
||||
|
||||
# 如果是一对多映射,先更新 SPECIAL_MAPPINGS
|
||||
```
|
||||
|
||||
## 3. SPECIAL_MAPPINGS 维护
|
||||
|
||||
### 何时需要更新
|
||||
|
||||
当一个 Rust 文件实现多个 Fortran 函数时,需要添加映射。
|
||||
|
||||
### 位置
|
||||
|
||||
`scripts/analyze_fortran.py` 第 72 行
|
||||
|
||||
### 格式
|
||||
|
||||
```python
|
||||
SPECIAL_MAPPINGS = {
|
||||
# Rust 文件名 -> [Fortran 函数名列表]
|
||||
'gfree': ['gfree0', 'gfreed', 'gfree1'],
|
||||
'interpolate': ['yint', 'lagran'],
|
||||
'sgmer': ['sgmer0', 'sgmer1', 'sgmerd'],
|
||||
'ctdata': ['hction', 'hctrecom'],
|
||||
'cross': ['cross', 'crossd'],
|
||||
'expint': ['eint', 'expinx'],
|
||||
'erfcx': ['erfcx', 'erfcin'],
|
||||
# 新增映射...
|
||||
}
|
||||
```
|
||||
|
||||
### 添加新映射后执行
|
||||
|
||||
```bash
|
||||
python3 scripts/analyze_fortran.py > fortran_analysis.csv
|
||||
python3 scripts/generate_tracking.py > FORTRAN_TRACKING.md
|
||||
```
|
||||
|
||||
## 4. 状态更新流程
|
||||
|
||||
### 手动更新状态
|
||||
|
||||
如需手动标记状态,编辑 `fortran_analysis.csv`:
|
||||
|
||||
```csv
|
||||
# status 列: done, pending, in_progress, skip
|
||||
filename.f,UNIT,SUBROUTINE,False,"...",...,False,src/math/xxx.rs,done
|
||||
```
|
||||
|
||||
然后重新生成 Markdown:
|
||||
|
||||
```bash
|
||||
python3 scripts/generate_tracking.py > FORTRAN_TRACKING.md
|
||||
```
|
||||
|
||||
## 5. 代码规范
|
||||
|
||||
### 文件头注释
|
||||
|
||||
```rust
|
||||
//! 模块简要说明。
|
||||
//!
|
||||
//! 重构自 TLUSTY `filename.f`
|
||||
```
|
||||
|
||||
### 函数注释
|
||||
|
||||
```rust
|
||||
/// 函数功能说明。
|
||||
///
|
||||
/// # 参数
|
||||
///
|
||||
/// * `x` - 参数说明
|
||||
///
|
||||
/// # 返回值
|
||||
///
|
||||
/// 返回值说明
|
||||
///
|
||||
/// # 示例
|
||||
///
|
||||
/// ```
|
||||
/// use tlusty_rust::math::func;
|
||||
/// assert!((func(1.0) - 2.0).abs() < 1e-10);
|
||||
/// ```
|
||||
pub fn func(x: f64) -> f64 { ... }
|
||||
```
|
||||
|
||||
### 精度要求
|
||||
|
||||
| 函数类型 | 容差 |
|
||||
|---------|------|
|
||||
| 简单数学运算 | 1e-10 |
|
||||
| 多项式近似 | 1e-7 |
|
||||
| f32 数组 | 1e-24 |
|
||||
|
||||
### 常见陷阱
|
||||
|
||||
| 问题 | 解决方案 |
|
||||
|------|----------|
|
||||
| Fortran 1-indexed | `arr(i)` → `arr[i-1]` |
|
||||
| `-LOG(X)` | 是 `-ln(X)` 不是 `ln(-X)` |
|
||||
| powi 类型歧义 | 用显式乘法 `(a)*(a)` |
|
||||
| 矩阵列优先 | `A(j,i)` → `a[(i-1)*N + (j-1)]` |
|
||||
|
||||
## 6. 快速命令参考
|
||||
|
||||
```bash
|
||||
# 查看重构进度
|
||||
cat FORTRAN_TRACKING.md | head -20
|
||||
|
||||
# 进度统计
|
||||
echo "已完成: $(awk -F, '$9=="done"' fortran_analysis.csv | wc -l)"
|
||||
echo "待处理: $(awk -F, '$9=="pending"' fortran_analysis.csv | wc -l)"
|
||||
|
||||
# 推荐方式:查看优先级列表(按未实现依赖排序)
|
||||
python3 scripts/analyze_fortran.py --priority | head -30
|
||||
|
||||
# 查看函数依赖树(含未实现依赖数)
|
||||
python3 scripts/analyze_fortran.py --tree FUNCTION_NAME
|
||||
|
||||
# 找最佳候选:无IO + 无调用依赖
|
||||
awk -F, '$6=="" && $7=="False" && $9=="pending"' fortran_analysis.csv | head -5
|
||||
|
||||
# 找纯函数
|
||||
grep "True.*pending" fortran_analysis.csv | head -5
|
||||
|
||||
# 找无IO的函数
|
||||
awk -F, '$7=="False" && $9=="pending"' fortran_analysis.csv | head -5
|
||||
|
||||
# 测试单个模块
|
||||
cargo test module_name
|
||||
|
||||
# 更新追踪表
|
||||
python3 scripts/analyze_fortran.py > fortran_analysis.csv && \
|
||||
python3 scripts/generate_tracking.py > FORTRAN_TRACKING.md
|
||||
|
||||
# 编译检查
|
||||
cargo build 2>&1 | grep error
|
||||
```
|
||||
@@ -0,0 +1,305 @@
|
||||
fortran_file,unit_name,unit_type,is_pure,common_deps,call_deps,has_io,rust_module,status
|
||||
_unnamed_block_data_.f,C,BLOCK DATA,False,"BASICS|ATOMIC","",False,,pending
|
||||
accel2.f,ACCEL2,SUBROUTINE,False,"BASICS|ITERAT|MODELQ","",True,,pending
|
||||
accelp.f,ACCELP,SUBROUTINE,False,"BASICS|MODELQ|ITERAT|POPULS","",True,,pending
|
||||
alifr1.f,ALIFR1,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ALIPAR","ALIFR3",False,,pending
|
||||
alifr3.f,ALIFR3,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ALIPAR","",False,src/math/alifr3.rs,done
|
||||
alifr6.f,ALIFR6,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ALIPAR","",False,src/math/alifr6.rs,done
|
||||
alifrk.f,ALIFRK,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ALIPAR","",False,src/math/alifrk.rs,done
|
||||
alisk1.f,ALISK1,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ARRAY1|ITERAT","RTEFR1|ALIFRK|ROSSTD|OPACF1",True,,pending
|
||||
alisk2.f,ALISK2,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ARRAY1|ITERAT","RTEFR1|ALIFRK|ROSSTD|OPACF1",True,,pending
|
||||
alist1.f,ALIST1,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ITERAT","RTEFR1|ALIFR1|OPACFD|ROSSTD",True,,pending
|
||||
alist2.f,ALIST2,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ARRAY1|ITERAT","QUIT|OPACFD|RTEFR1|ALIFR1|ROSSTD",True,,pending
|
||||
allard.f,ALLARD,SUBROUTINE,False,"BASICS|callardb|callardc|callarda|quasun|callardg|calphatd","ALLARDT",True,,pending
|
||||
allardt.f,ALLARDT,SUBROUTINE,False,"BASICS|calphatd","",False,src/math/allardt.rs,done
|
||||
angset.f,ANGSET,SUBROUTINE,True,"BASICS","GAULEG",False,src/math/angset.rs,done
|
||||
betah.f,BETAH,FUNCTION,True,"","",False,src/math/betah.rs,done
|
||||
bhe.f,BHE,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR","",False,src/math/bhe.rs,done
|
||||
bhed.f,BHED,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|CMATZD|SURFEX","",False,src/math/bhe.rs,done
|
||||
bhez.f,BHEZ,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|SURFEX","",False,src/math/bhe.rs,done
|
||||
bkhsgo.f,BKHSGO,SUBROUTINE,True,"","",False,src/math/bkhsgo.rs,done
|
||||
bpop.f,BPOP,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|ODFPAR|ITERAT","LEVGRP|BPOPE|RATMAT|BPOPT|MATINV|BPOPC|LEVSOL|BPOPF",False,,pending
|
||||
bpopc.f,BPOPC,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|ODFPAR|ADCHAR","STATE",False,,pending
|
||||
bpope.f,BPOPE,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ITERAT|ARRAY1","DWNFR1|SGMER1",False,,pending
|
||||
bpopf.f,BPOPF,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|ODFPAR","",False,src/math/bpopf.rs,done
|
||||
bpopt.f,BPOPT,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|ODFPAR","COLIS",False,,pending
|
||||
bre.f,BRE,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR","COMPT0",False,,pending
|
||||
brez.f,BREZ,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR","COMPT0",False,,pending
|
||||
brte.f,BRTE,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ALIPAR|ARRAY1","COMPT0",False,,pending
|
||||
brtez.f,BRTEZ,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ALIPAR|ARRAY1","COMPT0",False,,pending
|
||||
butler.f,BUTLER,SUBROUTINE,True,"","",False,src/math/butler.rs,done
|
||||
carbon.f,CARBON,SUBROUTINE,True,"","",False,src/math/carbon.rs,done
|
||||
ceh12.f,CEH12,FUNCTION,True,"","",False,src/math/ceh12.rs,done
|
||||
change.f,CHANGE,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","READBF|STEQEQ",True,,pending
|
||||
chckse.f,CHCKSE,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","SABOLF",True,,pending
|
||||
chctab.f,CHCTAB,SUBROUTINE,False,"BASICS|MODELQ|abntab","",True,,pending
|
||||
cheav.f,CHEAV,FUNCTION,False,"BASICS|ATOMIC","QUIT",True,,pending
|
||||
cheavj.f,CHEAVJ,FUNCTION,False,"BASICS|ATOMIC","QUIT",True,,pending
|
||||
cia_h2h.f,CIA_H2H,SUBROUTINE,False,"","LOCATE|IF",True,,pending
|
||||
cia_h2h2.f,CIA_H2H2,SUBROUTINE,False,"","LOCATE|IF",True,,pending
|
||||
cia_h2he.f,CIA_H2HE,SUBROUTINE,False,"","LOCATE|IF",True,,pending
|
||||
cia_hhe.f,CIA_HHE,SUBROUTINE,False,"","LOCATE|IF",True,,pending
|
||||
cion.f,CION,FUNCTION,True,"","",False,src/math/cion.rs,done
|
||||
ckoest.f,CKOEST,FUNCTION,True,"BASICS","",False,src/math/ckoest.rs,done
|
||||
colh.f,COLH,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","IRC|CSPEC|BUTLER",False,,pending
|
||||
colhe.f,COLHE,SUBROUTINE,False,"BASICS|ATOMIC","IRC|COLLHE|CSPEC",False,,pending
|
||||
colis.f,COLIS,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|CTRTEMP","IRC|COLHE|CSPEC|COLH",False,,pending
|
||||
collhe.f,COLLHE,SUBROUTINE,True,"","",False,src/math/collhe.rs,done
|
||||
column.f,COLUMN,SUBROUTINE,False,"BASICS|MODELQ|relcor","",True,,pending
|
||||
compt0.f,COMPT0,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|ITERAT|auxcbc","",False,src/math/compt0.rs,done
|
||||
comset.f,COMSET,SUBROUTINE,False,"BASICS|MODELQ|auxcbc|comgfs","",False,src/math/comset.rs,done
|
||||
concor.f,CONCOR,SUBROUTINE,False,"BASICS|MODELQ","CONOUT",True,,pending
|
||||
conout.f,CONOUT,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|CUBCON","MEANOPT|MEANOP|CONVEC|OPACF0",True,,pending
|
||||
conref.f,CONREF,SUBROUTINE,False,"BASICS|MODELQ|ARRAY1|imucnn|CUBCON","WNSTOR|ELDENS|CONVC1|STEQEQ|CONOUT|CONVEC",True,,pending
|
||||
contmd.f,CONTMD,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ALIPAR|PRSAUX|CUBCON","MEANOP|CUBIC|OPACF0|STEQEQ|WNSTOR|CONOUT|CONVEC",True,,pending
|
||||
contmp.f,CONTMP,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ALIPAR|ichndm|CUBCON","MEANOPT|MEANOP|CUBIC|OPACF0|STEQEQ|ELDENS|WNSTOR|CONOUT|CONVEC",True,,pending
|
||||
convc1.f,CONVC1,SUBROUTINE,False,"BASICS|CUBCON","TRMDER|TRMDRT",False,,pending
|
||||
convec.f,CONVEC,SUBROUTINE,False,"BASICS|CUBCON","TRMDER|TRMDRT",False,,pending
|
||||
coolrt.f,COOLRT,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ARRAY1|ITERAT|COOLCO","RTEFR1|OPACFA",True,,pending
|
||||
corrwm.f,CORRWM,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","QUIT",True,,pending
|
||||
cross.f,CROSS,FUNCTION,False,"BASICS|ATOMIC|MODELQ","",False,src/math/cross.rs,done
|
||||
crossd.f,CROSSD,FUNCTION,False,"BASICS|ATOMIC|MODELQ","",False,src/math/cross.rs,done
|
||||
cspec.f,CSPEC,SUBROUTINE,False,"BASICS|ATOMIC","QUIT",False,,pending
|
||||
ctdata.f,CTDATA,BLOCK DATA,False,"CTIon|CTRecomb","",False,src/math/ctdata.rs,done
|
||||
cubic.f,CUBIC,SUBROUTINE,False,"BASICS|CUBCON","",False,src/math/cubic.rs,done
|
||||
dielrc.f,DIELRC,SUBROUTINE,True,"","",False,src/math/dielrc.rs,done
|
||||
dietot.f,DIETOT,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","DIELRC",True,,pending
|
||||
divstr.f,DIVSTR,SUBROUTINE,False,"BASICS|MODELQ","",False,src/math/divstr.rs,done
|
||||
dmder.f,DMDER,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|DEPTDR","",False,src/math/dmder.rs,done
|
||||
dmeval.f,DMEVAL,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT|ARRAY1","",True,,pending
|
||||
dopgam.f,DOPGAM,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","GAMSP",False,src/math/dopgam.rs,done
|
||||
dwnfr.f,DWNFR,SUBROUTINE,False,"BASICS|MODELQ","",False,src/math/dwnfr.rs,done
|
||||
dwnfr0.f,DWNFR0,SUBROUTINE,False,"BASICS|MODELQ","",False,src/math/dwnfr0.rs,done
|
||||
dwnfr1.f,DWNFR1,SUBROUTINE,False,"BASICS|MODELQ","",False,src/math/dwnfr1.rs,done
|
||||
eint.f,EINT,SUBROUTINE,True,"","EXPINX",False,src/math/expint.rs,done
|
||||
elcor.f,ELCOR,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ADCHAR","WNSTOR|STEQEQ|STATE|MOLEQ",True,,pending
|
||||
eldenc.f,ELDENC,SUBROUTINE,False,"BASICS|MODELQ|ATOMIC|eospar|hmolab|eletab","RHONEN|STATE|MOLEQ",True,,pending
|
||||
eldens.f,ELDENS,SUBROUTINE,False,"BASICS|MODELQ|ATOMIC|eospar|terden","ENTENE|LINEQS|MPARTF|STATE|MOLEQ",True,,pending
|
||||
emat.f,EMAT,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR","",False,src/math/emat.rs,done
|
||||
entene.f,ENTENE,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","MPARTF",False,,pending
|
||||
erfcin.f,ERFCIN,FUNCTION,True,"","",False,src/math/erfcx.rs,done
|
||||
erfcx.f,ERFCX,FUNCTION,True,"","",False,src/math/erfcx.rs,done
|
||||
expint.f,EXPINT,FUNCTION,True,"","",False,src/math/expint.rs,done
|
||||
expinx.f,EXPINX,SUBROUTINE,True,"","",False,src/math/expint.rs,done
|
||||
expo.f,EXPO,FUNCTION,True,"","",False,src/math/expo.rs,done
|
||||
ffcros.f,FFCROS,FUNCTION,True,"","",False,src/math/ffcros.rs,done
|
||||
gami.f,GAMI,FUNCTION,True,"","",False,src/math/gami.rs,done
|
||||
gamsp.f,GAMSP,SUBROUTINE,True,"BASICS","",False,src/math/gamsp.rs,done
|
||||
gauleg.f,GAULEG,SUBROUTINE,True,"","",False,src/math/gauleg.rs,done
|
||||
gaunt.f,GAUNT,FUNCTION,True,"","",False,src/math/gaunt.rs,done
|
||||
getlal.f,GETLAL,SUBROUTINE,False,"BASICS|callardb|callardc|callarda|quasun|callardg|calphatd","",True,,pending
|
||||
getwrd.f,GETWRD,SUBROUTINE,True,"","",False,src/math/getwrd.rs,done
|
||||
gfree0.f,GFREE0,SUBROUTINE,False,"BASICS|MODELQ","",False,src/math/gfree.rs,done
|
||||
gfree1.f,GFREE1,FUNCTION,False,"BASICS|MODELQ","",False,src/math/gfree.rs,done
|
||||
gfreed.f,GFREED,SUBROUTINE,False,"BASICS|MODELQ","",False,src/math/gfree.rs,done
|
||||
ghydop.f,GHYDOP,SUBROUTINE,False,"BASICS|MODELQ|ATOMIC|intcfg","",False,src/math/ghydop.rs,done
|
||||
gntk.f,GNTK,FUNCTION,True,"","",False,src/math/gntk.rs,done
|
||||
gomini.f,GOMINI,SUBROUTINE,False,"BASICS|MODELQ|intcfg","",True,,pending
|
||||
grcor.f,GRCOR,SUBROUTINE,True,"","",False,src/math/grcor.rs,done
|
||||
greyd.f,GREYD,SUBROUTINE,False,"BASICS|MODELQ|ATOMIC|ALIPAR","WNSTOR|MEANOP|OPACF0|STEQEQ|RHONEN",True,,pending
|
||||
gridp.f,GRIDP,SUBROUTINE,True,"BASICS","",False,src/math/gridp.rs,done
|
||||
h2minus.f,H2MINUS,SUBROUTINE,False,"BASICS","LOCATE",True,,pending
|
||||
hction.f,HCTION,FUNCTION,False,"CTIon|CTRTEMP","",False,src/math/ctdata.rs,done
|
||||
hctrecom.f,HCTRECOM,FUNCTION,False,"CTRTEMP|CTRecomb","",False,src/math/ctdata.rs,done
|
||||
hedif.f,HEDIF,SUBROUTINE,False,"BASICS|MODELQ|ATOMIC|hediff","",True,,pending
|
||||
hephot.f,HEPHOT,FUNCTION,True,"","",False,src/math/hephot.rs,done
|
||||
hesol6.f,HESOL6,SUBROUTINE,False,"BASICS|MODELQ|PRSAUX","MATINV",False,,pending
|
||||
hesolv.f,HESOLV,SUBROUTINE,False,"BASICS|MODELQ|PRSAUX","WNSTOR|STEQEQ|RHONEN|MATINV",True,,pending
|
||||
hidalg.f,HIDALG,FUNCTION,True,"","",False,src/math/hidalg.rs,done
|
||||
ijali2.f,IJALI2,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR","QUIT",True,,pending
|
||||
ijalis.f,IJALIS,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","",True,,pending
|
||||
incldy.f,INCLDY,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","QUIT|RATMAT|SABOLF|WNSTOR|LEVSOL",True,,pending
|
||||
indexx.f,INDEXX,SUBROUTINE,True,"","",False,src/math/indexx.rs,done
|
||||
inicom.f,INICOM,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|comgfs","",False,src/math/inicom.rs,done
|
||||
inifrc.f,INIFRC,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ijflar","INDEXX",True,,pending
|
||||
inifrs.f,INIFRS,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR","QUIT|INDEXX",True,,pending
|
||||
inifrt.f,INIFRT,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ijflar","INDEXX",True,,pending
|
||||
inilam.f,INILAM,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT|ALIPAR","WNSTOR|RTEFR1|RATES1|ELCOR|COLIS|SABOLF|STEQEQ|OPAINI|OPACF1",False,,pending
|
||||
initia.f,INITIA,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT|ODFPAR|ALIPAR|freqcl|INUNIT|STRPAR","OPADD0|QUIT|ODFHYS|LINSPL|NSTPAR|INIFRC|READBF|RDATA|STATE|DOPGAM|LINSET|RDATAX|INTERP",True,,pending
|
||||
inkul.f,INKUL,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|COLKUR|LINED","",True,,pending
|
||||
inpdis.f,INPDIS,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT|ODFPAR|ALIPAR|relcor","GRCOR",True,,pending
|
||||
inpmod.f,INPMOD,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|eospar","QUIT|RATMAT|KURUCZ|INCLDY|MOLEQ|SABOLF|WNSTOR|LEVSOL",True,,pending
|
||||
interp.f,INTERP,SUBROUTINE,True,"BASICS","",False,src/math/interp.rs,done
|
||||
inthyd.f,INTHYD,SUBROUTINE,False,"BASICS|MODELQ","DIVSTR",False,src/math/inthyd.rs,done
|
||||
intlem.f,INTLEM,SUBROUTINE,False,"BASICS|MODELQ","INTHYD",False,src/math/intlem.rs,done
|
||||
intxen.f,INTXEN,SUBROUTINE,False,"BASICS|MODELQ","",False,src/math/intxen.rs,done
|
||||
irc.f,IRC,SUBROUTINE,True,"","EXPINX|SZIRC",False,src/math/irc.rs,done
|
||||
iroset.f,IROSET,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|LINED","QUIT|LEVCD|INKUL",True,,pending
|
||||
kurucz.f,KURUCZ,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|temlim","QUIT|RATMAT|MOLEQ|SABOLF|WNSTOR|LEVSOL|RHONEN",True,,pending
|
||||
lagran.f,LAGRAN,SUBROUTINE,True,"","",False,src/math/interpolate.rs,done
|
||||
laguer.f,LAGUER,SUBROUTINE,False,"","",True,src/math/laguer.rs,done
|
||||
lemini.f,LEMINI,SUBROUTINE,False,"BASICS|MODELQ","",True,,pending
|
||||
levcd.f,LEVCD,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|COLKUR","QUIT|INDEXX",True,,pending
|
||||
levgrp.f,LEVGRP,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT","",False,src/math/levgrp.rs,done
|
||||
levset.f,LEVSET,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","QUIT",False,,pending
|
||||
levsol.f,LEVSOL,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT","LINEQS",False,src/math/levsol.rs,done
|
||||
lineqs.f,LINEQS,SUBROUTINE,True,"BASICS","",False,src/math/lineqs.rs,done
|
||||
linpro.f,LINPRO,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|quasun","DIVSTR|STARK0|DOPGAM|INTLEM|INTXEN",False,,pending
|
||||
linsel.f,LINSEL,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR","RTEFR1|QUIT|OPAINI|OPACF1",True,,pending
|
||||
linset.f,LINSET,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","DIVSTR|QUIT|IJALIS|STARK0",True,,pending
|
||||
linspl.f,LINSPL,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","",False,src/math/linspl.rs,done
|
||||
locate.f,LOCATE,SUBROUTINE,True,"","",False,src/math/locate.rs,done
|
||||
ltegr.f,LTEGR,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","QUIT|CONOUT|ROSSOP|WNSTOR|STEQEQ|INTERP",True,,pending
|
||||
ltegrd.f,LTEGRD,SUBROUTINE,False,"BASICS|MODELQ|PRSAUX|CUBCON|TOTJHK|FACTRS|FLXAUX","QUIT|TEMPER|CONOUT|ELDENS|WNSTOR|STEQEQ|INTERP|ZMRHO",True,,pending
|
||||
lucy.f,LUCY,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ITERAT|ALIPAR|ARRAY1","OPACFL|RTEFR1|ELCOR|COLIS|SABOLF|WNSTOR|STEQEQ|OPAINI",True,,pending
|
||||
lymlin.f,LYMLIN,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","DIVSTR|STARK0",True,,pending
|
||||
matcon.f,MATCON,SUBROUTINE,False,"BASICS|MODELQ|ARRAY1|CUBCON","CONVEC",False,,pending
|
||||
matgen.f,MATGEN,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR","BHED|MATCON|BREZ|BRE|BRTEZ|BHE|BRTE|SABOLF|BHEZ|EMAT|BPOP",False,,pending
|
||||
matinv.f,MATINV,SUBROUTINE,True,"BASICS","",False,src/math/matinv.rs,done
|
||||
meanop.f,MEANOP,SUBROUTINE,False,"BASICS|MODELQ|ATOMIC","",False,src/math/meanop.rs,done
|
||||
meanopt.f,MEANOPT,SUBROUTINE,False,"BASICS|MODELQ","OPCTAB",False,,pending
|
||||
minv3.f,MINV3,SUBROUTINE,True,"","",False,src/math/minv3.rs,done
|
||||
moleq.f,MOLEQ,SUBROUTINE,False,"BASICS|MODELQ|ATOMIC|adchar|eospar|hmolab|terden|ioniz2|COMFH1|moldat|entrop","MPARTF|RUSSEL",True,,pending
|
||||
mpartf.f,MPARTF,SUBROUTINE,False,"moldat","",True,,pending
|
||||
newdm.f,NEWDM,SUBROUTINE,False,"BASICS|MODELQ|FACTRS|PRSAUX|FLXAUX","INTERP|TEMPER",True,,pending
|
||||
newdmt.f,NEWDMT,SUBROUTINE,False,"BASICS|MODELQ|FACTRS|PRSAUX|FLXAUX","INTERP|GRIDP|TEMPER",True,,pending
|
||||
newpop.f,NEWPOP,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT","",True,,pending
|
||||
nstout.f,NSTOUT,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT|ODFPAR|ALIPAR","QUIT",True,,pending
|
||||
nstpar.f,NSTPAR,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT|ODFPAR|ALIPAR|deridt|irwint|icnrsp|imucnn|ichndm|derdif|hediff|freqcl|temlim|moldat|ifpzpa|quasun|ipricr|adiaba|FLXAUX","QUIT|GETWRD",True,,pending
|
||||
odf1.f,ODF1,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR","DIVSTR|ODFHST|DWNFR",True,,pending
|
||||
odffr.f,ODFFR,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR","QUIT",False,,pending
|
||||
odfhst.f,ODFHST,SUBROUTINE,False,"BASICS|MODELQ|ODFPAR","",False,src/math/odfhst.rs,done
|
||||
odfhyd.f,ODFHYD,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR","DIVSTR|ODFHST|INDEXX",False,,pending
|
||||
odfhys.f,ODFHYS,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR","ODFFR|STARK0|IJALIS",False,,pending
|
||||
odfmer.f,ODFMER,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR","ODFHYD",False,,pending
|
||||
odfset.f,ODFSET,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|STFCR","QUIT|IJALIS",True,,pending
|
||||
opacf0.f,OPACF0,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|hmolab","OPACT1|OPADD|SGMER1|GFREE0|DWNFR0|DWNFR1|SABOLF|WNSTOR|LINPRO",False,,pending
|
||||
opacf1.f,OPACF1,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|hmolab|ipricr","OPACT1|OPADD|QUASIM|LYMLIN|GHYDOP|DWNFR1|PRD|SGMER1",True,,pending
|
||||
opacfa.f,OPACFA,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|COOLCO","DWNFR1|OPADD|PRD|SGMER1",False,,pending
|
||||
opacfd.f,OPACFD,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ARRAY1|ITERAT|dsctva|rhoder|hmolab","OPADD|OPACTD|QUASIM|LYMLIN|OPCTAB|DWNFR1|PRD|SGMER1|GFREED",True,,pending
|
||||
opacfl.f,OPACFL,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR","DWNFR1|OPADD|SGMER1",False,,pending
|
||||
opact1.f,OPACT1,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|hmolab","OPCTAB",False,,pending
|
||||
opactd.f,OPACTD,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|ARRAY1|ITERAT|dsctva|rhoder|hmolab","OPCTAB",False,,pending
|
||||
opactr.f,OPACTR,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|ATOMIC|grdpra|dsctva|hmolab","STEQEQ|PGSET|ELDENS|SABOLF|RATMAL|WNSTOR|LEVSOL|OPAINI|OPACF1",False,,pending
|
||||
opadd.f,OPADD,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|eospar","H2MINUS|CIA_H2H|CIA_H2HE|CIA_H2H2|CIA_HHE",False,,pending
|
||||
opadd0.f,OPADD0,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","QUIT",False,,pending
|
||||
opahst.f,OPAHST,SUBROUTINE,False,"BASICS|ODFPAR","STARK0",True,,pending
|
||||
opaini.f,OPAINI,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR","LEVGRP|DWNFR0|REFLEV|SABOLF|WNSTOR|LINPRO",False,,pending
|
||||
opctab.f,OPCTAB,SUBROUTINE,False,"BASICS|MODELQ","RAYLEIGH",False,,pending
|
||||
opdata.f,OPDATA,SUBROUTINE,False,"TOPB","",True,,pending
|
||||
opfrac.f,OPFRAC,SUBROUTINE,False,"pfoptb","",True,,pending
|
||||
osccor.f,OSCCOR,SUBROUTINE,False,"BASICS|MODELQ|ITERAT","",True,,pending
|
||||
outpri.f,OUTPRI,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ARRAY1|grdpra","SABOLF|RATMAL|WNSTOR|LEVSOL|OPACF1",True,,pending
|
||||
output.f,OUTPUT,SUBROUTINE,False,"BASICS|MODELQ","",True,,pending
|
||||
partf.f,PARTF,SUBROUTINE,False,"BASICS|PFSTDS|irwint","OPFRAC|MPARTF|PFNI|PFFE|PFCNO|PFHEAV|PFSPEC",False,,pending
|
||||
pfcno.f,PFCNO,SUBROUTINE,True,"BASICS","",False,src/math/pfcno.rs,done
|
||||
pffe.f,PFFE,SUBROUTINE,True,"","",False,src/math/pffe.rs,done
|
||||
pfheav.f,PFHEAV,SUBROUTINE,False,"","",True,,pending
|
||||
pfni.f,PFNI,SUBROUTINE,True,"","",False,src/math/pfni.rs,done
|
||||
pfspec.f,PFSPEC,SUBROUTINE,True,"","",False,src/math/pfspec.rs,done
|
||||
pgset.f,PGSET,SUBROUTINE,False,"BASICS|ITERAT|MODELQ|grdpra|rybpgs","TRIDAG",True,,pending
|
||||
prchan.f,PRCHAN,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT","",True,,pending
|
||||
prd.f,PRD,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT","DOPGAM",False,,pending
|
||||
prdini.f,PRDINI,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","",False,src/math/prdini.rs,done
|
||||
princ.f,PRINC,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ALIPAR","DWNFR|LINPRO|SABOLF|OPACF1",True,,pending
|
||||
prnt.f,PRNT,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","SABOLF",True,,pending
|
||||
profil.f,PROFIL,FUNCTION,False,"BASICS|ATOMIC|MODELQ|quasun","DIVSTR|STARK0",False,src/math/profil.rs,done
|
||||
profsp.f,PROFSP,FUNCTION,False,"BASICS|ATOMIC|MODELQ","SABOLF",False,,pending
|
||||
prsent.f,PRSENT,SUBROUTINE,False,"tdedge|TABLTD|tdflag|THERM","",True,,pending
|
||||
psolve.f,PSOLVE,SUBROUTINE,False,"BASICS|MODELQ","",False,src/math/psolve.rs,done
|
||||
pzert.f,PZERT,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","",False,src/math/pzert.rs,done
|
||||
pzeval.f,PZEVAL,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|icnrsp","CONOUT",True,,pending
|
||||
pzevld.f,PZEVLD,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ALIPAR|ARRAY1|grdpra|DEPTDR|ifpzpa|PRSAUX","",False,src/math/pzevld.rs,done
|
||||
quartc.f,QUARTC,SUBROUTINE,False,"","",True,src/math/quartc.rs,done
|
||||
quasim.f,QUASIM,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|quasun","ALLARD",False,,pending
|
||||
quit.f,QUIT,SUBROUTINE,False,"","",True,src/math/quit.rs,done
|
||||
radpre.f,RADPRE,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR","RTEFR1|INDEXX|QUIT|OPACF1",True,,pending
|
||||
radtot.f,RADTOT,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ITERAT|TOTJHK|SURFEX|OPTDPT","RTEFR1|OPAINI|OPACF1",False,,pending
|
||||
raph.f,RAPH,FUNCTION,True,"","",False,src/math/raph.rs,done
|
||||
rates1.f,RATES1,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ITERAT","RTEFR1|ROSSTD|OPACF1",False,,pending
|
||||
ratmal.f,RATMAL,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","",False,src/math/ratmal.rs,done
|
||||
ratmat.f,RATMAT,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","REFLEV",False,,pending
|
||||
ratsp1.f,RATSP1,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ARRAY1|ITERAT","RTEFR1|ROSSTD|OPACF1",True,,pending
|
||||
rayini.f,RAYINI,SUBROUTINE,False,"BASICS|MODELQ|ATOMIC","RAYLEIGH",True,,pending
|
||||
rayleigh.f,RAYLEIGH,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|eospar|RAYSCT","",False,src/math/rayleigh.rs,done
|
||||
rayset.f,RAYSET,SUBROUTINE,False,"BASICS|MODELQ","",False,src/math/rayset.rs,done
|
||||
rdata.f,RDATA,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT|ODFPAR|ALIPAR|INUNIT|STRPAR|imodlc","QUIT|DOPGAM|LINSET|RDATAX",True,,pending
|
||||
rdatax.f,RDATAX,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","BKHSGO",True,,pending
|
||||
readbf.f,READBF,SUBROUTINE,False,"BASICS","",True,,pending
|
||||
rechck.f,RECHCK,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","RTEFR1|OPACF1",True,,pending
|
||||
reflev.f,REFLEV,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT","",False,src/math/reflev.rs,done
|
||||
reiman.f,REIMAN,FUNCTION,True,"","",False,src/math/reiman.rs,done
|
||||
resolv.f,RESOLV,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT|ALIPAR|ARRAY1|icnrsp","NEWPOP|RTEFR1|RATES1|TAUFR1|ELCOR|ROSSTD|PRD|STEQEQ|CONOUT|OPAINI|TIMING|OPACF1",True,,pending
|
||||
rhoeos.f,RHOEOS,FUNCTION,False,"BASICS|MODELQ","PRSENT",False,,pending
|
||||
rhonen.f,RHONEN,SUBROUTINE,False,"BASICS|MODELQ","ELDENS",False,,pending
|
||||
rhsgen.f,RHSGEN,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|CUBCON","LEVGRP|RATMAT|MATINV|STATE|SABOLF|CONVEC|COMPT0",False,,pending
|
||||
rossop.f,ROSSOP,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ALIPAR","WNSTOR|MEANOPT|MEANOP|OPACF0|ELDENS|STEQEQ",False,,pending
|
||||
rosstd.f,ROSSTD,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT|ALIPAR","",True,,pending
|
||||
rte_sc.f,RTE_SC,SUBROUTINE,True,"BASICS","",False,src/math/rte_sc.rs,done
|
||||
rteang.f,RTEANG,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|SURFEX|EXTINT","GAULEG",False,,pending
|
||||
rtecf0.f,RTECF0,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|ITERAT|auxcbc|AUXRTE|OPTDPT","",False,src/math/rtecf0.rs,done
|
||||
rtecf1.f,RTECF1,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|ITERAT|SURFEX|comgfs|AUXRTE|EXTINT|OPTDPT","RTECF0|RTEFE2|RTESOL",True,,pending
|
||||
rtecmc.f,RTECMC,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|ITERAT|AUXRTE|comgfs","RTECF0|MATINV|OPACF1",False,,pending
|
||||
rtecmu.f,RTECMU,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|ITERAT|AUXRTE|OPTDPT","GAULEG|RTESOL|RTECF0|OPACF1",True,,pending
|
||||
rtecom.f,RTECOM,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|ITERAT|AUXRTE|comgfs|OPTDPT","RTECF1|RTECF0|OPACF1",False,,pending
|
||||
rtedf1.f,RTEDF1,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|OPTDPT","",False,src/math/rtedf1.rs,done
|
||||
rtedf2.f,RTEDF2,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR","",False,src/math/rtedf2.rs,done
|
||||
rtefe2.f,RTEFE2,SUBROUTINE,True,"BASICS","",False,src/math/rtefe2.rs,done
|
||||
rtefr1.f,RTEFR1,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|ITERAT|OPTDPT","RTEDF2|RTESOL|MATINV|RTECF1|MINV3|RTEDF1",True,,pending
|
||||
rteint.f,RTEINT,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|ITERAT|OPTDPT","MATINV|OPACF1",True,,pending
|
||||
rtesol.f,RTESOL,SUBROUTINE,True,"BASICS","",False,src/math/rtesol.rs,done
|
||||
russel.f,RUSSEL,SUBROUTINE,False,"BASICS|MODELQ|COMFH1","MPARTF",True,,pending
|
||||
rybchn.f,RYBCHN,SUBROUTINE,False,"BASICS|ITERAT|MODELQ|ALIPAR|ARRAY1|grdpra|rybpgs","ELDENS|PGSET",True,,pending
|
||||
rybene.f,RYBENE,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|ARRAY1|deridt|RYBMTX|CUBCON","CONVEC",False,,pending
|
||||
rybheq.f,RYBHEQ,SUBROUTINE,False,"BASICS|MODELQ|grdpra|rybpgs","RTEFR1|ELCOR|PGSET|ELDENS|WNSTOR|STEQEQ|OPAINI|OPACF1",True,,pending
|
||||
rybmat.f,RYBMAT,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|ARRAY1|dsctva|RYBMTX","",False,src/math/rybmat.rs,done
|
||||
rybsol.f,RYBSOL,SUBROUTINE,False,"BASICS|MODELQ|ATOMIC|ALIPAR|ARRAY1|ITERAT|imodlc|RYBMTX","OPACTR|OPACFD|RYBMAT|RYBCHN|LINEQS|RTEFR1|ALIFR1|ROSSTD|TRIDAG|STEQEQ",True,,pending
|
||||
sabolf.f,SABOLF,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","PARTF",False,,pending
|
||||
sbfch.f,SBFCH,FUNCTION,True,"","",False,src/math/sbfch.rs,done
|
||||
sbfhe1.f,SBFHE1,FUNCTION,False,"BASICS|ATOMIC","QUIT",True,src/math/sbfhe1.rs,done
|
||||
sbfhmi.f,SBFHMI,FUNCTION,True,"","",False,src/math/sbfhmi.rs,done
|
||||
sbfhmi_old.f,SBFHMI_OLD,FUNCTION,True,"","",False,src/math/sbfhmi_old.rs,done
|
||||
sbfoh.f,SBFOH,FUNCTION,True,"","",False,src/math/sbfoh.rs,done
|
||||
setdrt.f,SETDRT,SUBROUTINE,False,"BASICS|MODELQ|RHODER","",False,src/math/setdrt.rs,done
|
||||
settrm.f,SETTRM,SUBROUTINE,False,"tdedge|TABLTD|tdflag|THERM","PRSENT",True,,pending
|
||||
sffhmi.f,SFFHMI,FUNCTION,True,"","",False,src/math/sffhmi.rs,done
|
||||
sffhmi_add.f,SFFHMI_ADD,FUNCTION,True,"","",False,src/math/sffhmi_add.rs,done
|
||||
sghe12.f,SGHE12,FUNCTION,True,"","",False,src/math/sghe12.rs,done
|
||||
sgmer0.f,SGMER0,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","",False,src/math/sgmer.rs,done
|
||||
sgmer1.f,SGMER1,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","",False,src/math/sgmer.rs,done
|
||||
sgmerd.f,SGMERD,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","",False,src/math/sgmer.rs,done
|
||||
sigave.f,SIGAVE,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR","",True,,pending
|
||||
sigk.f,SIGK,FUNCTION,False,"BASICS|ATOMIC","SPSIGK",False,,pending
|
||||
sigmar.f,SIGMAR,FUNCTION,False,"BASICS","LAGUER",True,,pending
|
||||
solve.f,SOLVE,SUBROUTINE,False,"BASICS|ITERAT|MODELQ|ARRAY1|ALIPAR|CMATZD","MATGEN|PRCHAN|MATINV|WNSTOR|RHSGEN",True,,pending
|
||||
solves.f,SOLVES,SUBROUTINE,False,"BASICS|ITERAT|MODELQ|ARRAY1|ALIPAR|CMATZD|STOMAT","MATGEN|PRCHAN|MATINV|WNSTOR|RHSGEN",True,,pending
|
||||
spsigk.f,SPSIGK,SUBROUTINE,True,"","CARBON",False,src/math/spsigk.rs,done
|
||||
srtfrq.f,SRTFRQ,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","QUIT|INDEXX",True,,pending
|
||||
stark0.f,STARK0,SUBROUTINE,True,"","",False,src/math/stark0.rs,done
|
||||
starka.f,STARKA,FUNCTION,False,"BASICS|MODELQ","",False,src/math/starka.rs,done
|
||||
start.f,START,SUBROUTINE,False,"BASICS|hediff","",True,,pending
|
||||
state.f,STATE,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|PFSTDS|terden","OPFRAC|PARTF",True,,pending
|
||||
steqeq.f,STEQEQ,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT|POPSTR|PPAPAR","LEVSOL|RATMAT|SABOLF|MOLEQ",False,,pending
|
||||
switch.f,SWITCH,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","",True,,pending
|
||||
szirc.f,SZIRC,SUBROUTINE,True,"","EINT",False,src/math/szirc.rs,done
|
||||
tabini.f,TABINI,SUBROUTINE,False,"BASICS|MODELQ|ATOMIC|intcff|abntab|eletab","",True,,pending
|
||||
tabint.f,TABINT,SUBROUTINE,False,"BASICS|MODELQ|ATOMIC|intcff","",False,src/math/tabint.rs,done
|
||||
taufr1.f,TAUFR1,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|ITERAT|OPTDPT","",False,src/math/taufr1.rs,done
|
||||
tdpini.f,TDPINI,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR","GFREE0",False,src/math/tdpini.rs,done
|
||||
temcor.f,TEMCOR,SUBROUTINE,False,"BASICS|MODELQ|ARRAY1|ALIPAR|CUBCON","WNSTOR|MEANOP|OPACF0|ELDENS|STEQEQ|CONVEC",True,,pending
|
||||
temper.f,TEMPER,SUBROUTINE,False,"BASICS|MODELQ|ALIPAR|FACTRS|PRSAUX|FLXAUX","WNSTOR|MEANOPT|TLOCAL|MEANOP|OPACF0|ELDENS|STEQEQ",True,,pending
|
||||
timing.f,TIMING,SUBROUTINE,False,"","",True,,pending
|
||||
tiopf.f,TIOPF,SUBROUTINE,True,"","",False,src/math/tiopf.rs,done
|
||||
tlocal.f,TLOCAL,SUBROUTINE,False,"BASICS|MODELQ|FACTRS|FLXAUX","QUARTC",False,,pending
|
||||
tlusty.f,TLUSTY,UNKNOWN,False,"BASICS|ITERAT|ALIPAR","TIMING",True,,pending
|
||||
topbas.f,TOPBAS,FUNCTION,False,"TOPB","",True,,pending
|
||||
traini.f,TRAINI,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ODFPAR","",False,src/math/traini.rs,done
|
||||
tridag.f,TRIDAG,SUBROUTINE,True,"","",False,src/math/tridag.rs,done
|
||||
trmder.f,TRMDER,SUBROUTINE,False,"BASICS|terden|adiaba|derdif","ELDENS",False,,pending
|
||||
trmdrt.f,TRMDRT,SUBROUTINE,False,"BASICS|CC|CONVOUT|tdedge|tdflag","PRSENT",False,,pending
|
||||
ubeta.f,UBETA,FUNCTION,True,"","LAGRAN",False,src/math/ubeta.rs,done
|
||||
vern16.f,VERN16,FUNCTION,True,"BASICS","",False,src/math/vern16.rs,done
|
||||
vern18.f,VERN18,FUNCTION,True,"BASICS","",False,src/math/vern18.rs,done
|
||||
vern20.f,VERN20,FUNCTION,True,"BASICS","",False,src/math/vern20.rs,done
|
||||
vern26.f,VERN26,FUNCTION,True,"BASICS","",False,src/math/vern26.rs,done
|
||||
verner.f,VERNER,FUNCTION,False,"BASICS|ATOMIC","QUIT",False,src/math/verner.rs,done
|
||||
visini.f,VISINI,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ|ITERAT","",True,,pending
|
||||
voigt.f,VOIGT,FUNCTION,True,"","",False,src/math/voigt.rs,done
|
||||
voigte.f,VOIGTE,FUNCTION,True,"","",False,src/math/voigte.rs,done
|
||||
wn.f,WN,FUNCTION,True,"BASICS","",False,src/math/wn.rs,done
|
||||
wnstor.f,WNSTOR,SUBROUTINE,False,"BASICS|ATOMIC|MODELQ","",False,src/math/wnstor.rs,done
|
||||
xenini.f,XENINI,SUBROUTINE,False,"BASICS|MODELQ","",True,,pending
|
||||
xk2dop.f,XK2DOP,FUNCTION,True,"","",False,src/math/xk2dop.rs,done
|
||||
yint.f,YINT,FUNCTION,True,"","",False,src/math/interpolate.rs,done
|
||||
ylintp.f,YLINTP,FUNCTION,True,"","",False,src/math/ylintp.rs,done
|
||||
zmrho.f,ZMRHO,SUBROUTINE,False,"BASICS|MODELQ","",False,src/math/zmrho.rs,done
|
||||
|
@@ -0,0 +1,77 @@
|
||||
# TLUSTY/SYNSPEC 重构计划
|
||||
|
||||
> **实时追踪见 [FORTRAN_TRACKING.md](../../FORTRAN_TRACKING.md)**
|
||||
> 本文档提供重构优先级和阶段划分参考。
|
||||
|
||||
## 优先级原则
|
||||
|
||||
1. **纯函数优先** - 无 COMMON/I/O 依赖,独立测试
|
||||
2. **依赖少的优先** - 只依赖 BASICS 的函数
|
||||
3. **小型函数优先** - 行数少,风险低
|
||||
4. **核心功能优先** - 辐射转移、不透明度
|
||||
|
||||
## 阶段划分
|
||||
|
||||
### 阶段 1: 纯函数 (is_pure=True)
|
||||
|
||||
已完成大部分,剩余查看:
|
||||
```bash
|
||||
grep "True.*pending" fortran_analysis.csv
|
||||
```
|
||||
|
||||
### 阶段 2: 简单 COMMON 依赖
|
||||
|
||||
只依赖 BASICS 或已有状态结构体的函数。
|
||||
|
||||
### 阶段 3: 复杂 COMMON 依赖
|
||||
|
||||
依赖多个 COMMON 块的函数。
|
||||
|
||||
### 阶段 4: I/O 依赖 (117个)
|
||||
|
||||
最后处理,可能需要设计 I/O 抽象层。
|
||||
|
||||
## 核心函数分类
|
||||
|
||||
### 辐射转移 (RTE)
|
||||
- `bre.f`, `brez.f` - 基本辐射转移
|
||||
- `brte.f`, `brtez.f` - 扩展辐射转移
|
||||
- `rte_sc.f`, `rtedf*.f` - 深度/角度积分
|
||||
|
||||
### 不透明度 (Opacity)
|
||||
- `opacfl.f` - 核心不透明度计算
|
||||
- `opctab.f` - 不透明度表插值
|
||||
- `opadd*.f` - 不透明度叠加
|
||||
|
||||
### 统计平衡 (Statistical Equilibrium)
|
||||
- `bpop*.f` - 束缚态占据数
|
||||
- `levsol.f` - 能级求解 ✅
|
||||
- `ratmat.f` - 速率矩阵
|
||||
|
||||
### ALI 求解器
|
||||
- `alifr1.f`, `alifr3.f`, `alifr6.f` - ALI 迭代
|
||||
|
||||
## 推荐执行顺序
|
||||
|
||||
```
|
||||
1. 完成剩余纯函数
|
||||
2. 简单 COMMON 函数 (setdrt, cubic, dmder ✅)
|
||||
3. 辐射转移核心
|
||||
4. 不透明度核心
|
||||
5. 统计平衡核心
|
||||
6. I/O 封装
|
||||
7. 主程序集成
|
||||
```
|
||||
|
||||
## 查询命令
|
||||
|
||||
```bash
|
||||
# 未完成的纯函数
|
||||
grep "True.*pending" fortran_analysis.csv
|
||||
|
||||
# 只依赖 BASICS 的待处理函数
|
||||
grep "BASICS.*pending" fortran_analysis.csv | grep -v "ATOMIC\|MODELQ"
|
||||
|
||||
# 按行数排序
|
||||
cd tlusty/extracted && wc -l *.f | sort -n | head -30
|
||||
```
|
||||
@@ -0,0 +1,670 @@
|
||||
# Fortran → Rust 重构问题与解决方案
|
||||
|
||||
记录重构过程中遇到的问题,避免重复踩坑。
|
||||
|
||||
---
|
||||
|
||||
## 1. Fortran 1-indexed 转 Rust 0-indexed
|
||||
|
||||
### 问题
|
||||
Fortran 数组从 1 开始索引,Rust 从 0 开始。
|
||||
|
||||
### 解决方案
|
||||
```rust
|
||||
// 数组访问
|
||||
arr(i) → arr[i-1]
|
||||
|
||||
// 循环范围
|
||||
DO I=1,N → for i in 0..n
|
||||
|
||||
// 边界条件 (locate, ylintp 等)
|
||||
// Fortran: jl=0 表示"在第一个有效索引之前"
|
||||
// Rust: jl=0 就是第一个有效索引,无需调整
|
||||
```
|
||||
|
||||
### 示例 (ylintp.f)
|
||||
```fortran
|
||||
! Fortran: jl=0 需要调整
|
||||
IF (J.EQ.0) J = J+1 ! 调整到 J=1
|
||||
```
|
||||
```rust
|
||||
// Rust: jl=0 就是第一个有效索引,直接使用
|
||||
// 删除 IF (J.EQ.0) 的调整逻辑
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Fortran 表达式解析错误
|
||||
|
||||
### 问题
|
||||
`XL=-LOG(X)` 被误解为 `(-x).ln()` 而不是 `-x.ln()`
|
||||
|
||||
### 示例 (erfcin.f)
|
||||
```fortran
|
||||
XL=-LOG(X) ! 意思是: XL = -ln(X)
|
||||
```
|
||||
```rust
|
||||
// 错误:
|
||||
let xl = (-x).ln(); // ln(-x) = NaN for x>0
|
||||
|
||||
// 正确:
|
||||
let xl = -x.ln(); // -ln(x)
|
||||
```
|
||||
|
||||
### 教训
|
||||
Fortran 中 `-LOG(X)` 是 `-(LOG(X))`,不是 `LOG(-X)`
|
||||
|
||||
---
|
||||
|
||||
## 3. powi 类型歧义
|
||||
|
||||
### 问题
|
||||
`(z1 - z2).powi(2)` 编译错误,类型不明确
|
||||
|
||||
### 解决方案
|
||||
```rust
|
||||
// 错误:
|
||||
(z1 - z2).powi(2) // 编译器无法推断类型
|
||||
|
||||
// 方案1: 显式乘法 (推荐)
|
||||
(z1 - z2) * (z1 - z2)
|
||||
|
||||
// 方案2: 显式类型标注
|
||||
((z1 - z2): f64).powi(2)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 多项式近似精度
|
||||
|
||||
### 问题
|
||||
eint 函数 Rust 与 Fortran 结果差异 ~1.3e-8
|
||||
|
||||
### 原因
|
||||
Abramowitz-Stegun 多项式近似本身精度有限
|
||||
|
||||
### 解决方案
|
||||
放宽 epsilon 到 1e-7
|
||||
```rust
|
||||
// 简单函数: epsilon = 1e-10
|
||||
// 多项式近似: epsilon = 1e-7
|
||||
assert_relative_eq!(e1, exp_e1, epsilon = 1e-7);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 数组索引越界
|
||||
|
||||
### 问题
|
||||
`locate` 函数无限循环
|
||||
|
||||
### 原因
|
||||
Fortran 中 ju=N+1 (越界值),Rust 直接用导致越界访问
|
||||
|
||||
### 解决方案
|
||||
使用 i64 允许负值,或调整边界逻辑
|
||||
```rust
|
||||
// 使用 i64 支持 jl=-1
|
||||
let mut jl: i64 = -1;
|
||||
let mut ju: i64 = n as i64;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. voigte 索引偏移
|
||||
|
||||
### 问题
|
||||
voigte 返回负值
|
||||
|
||||
### 原因
|
||||
Fortran m 值是 1-indexed,Rust 中直接用导致索引偏移
|
||||
|
||||
### 解决方案
|
||||
```rust
|
||||
// Fortran: m=6 表示第6个元素
|
||||
// Rust: 需要用 m-1
|
||||
let (m, quo) = if v < 2.4 {
|
||||
(5, 1.0) // Fortran m=6 → 0-indexed m=5
|
||||
} else {
|
||||
(10, 1.0) // Fortran m=11 → 0-indexed m=10
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 条件分支遗漏
|
||||
|
||||
### 问题
|
||||
voigte 某些参数组合返回错误值
|
||||
|
||||
### 原因
|
||||
漏掉了 Fortran 中的嵌套条件判断
|
||||
|
||||
### 教训
|
||||
仔细对比 Fortran 的所有分支,特别是嵌套 IF
|
||||
|
||||
---
|
||||
|
||||
## 8. COMMON 依赖误判
|
||||
|
||||
### 问题
|
||||
某些标记为"纯函数"的文件实际有 COMMON 依赖
|
||||
|
||||
### 已确认有依赖的文件
|
||||
```
|
||||
gamsp.f - 使用 VOIPAR COMMON
|
||||
sgmer1.f - 使用 COMMON
|
||||
sgmerd.f - 使用 COMMON
|
||||
cross.f - 使用 COMMON
|
||||
gfree1.f - 使用 COMMON
|
||||
gfree0.f - 使用 BASICS, MODELQ COMMON
|
||||
gfreed.f - 使用 BASICS, MODELQ COMMON
|
||||
wn.f - 使用 BASICS COMMON
|
||||
crossd.f - 使用 BASICS, ATOMIC, MODELQ COMMON
|
||||
dopgam.f - 使用 BASICS, ATOMIC, MODELQ COMMON
|
||||
verner.f - 使用 BASICS, ATOMIC COMMON
|
||||
sbfhe1.f - 使用 BASICS, ATOMIC COMMON
|
||||
rayini.f - 有文件 I/O + COMMON
|
||||
```
|
||||
|
||||
### 解决方案
|
||||
重构前检查所有 INCLUDE 语句,不仅是 IMPLIC.FOR
|
||||
|
||||
---
|
||||
|
||||
## 9. Clenshaw 求和整数溢出
|
||||
|
||||
### 问题
|
||||
collhe 中递减循环溢出
|
||||
|
||||
### 原因
|
||||
`ir` 和 `jj` 递减到负数时,无符号整数溢出
|
||||
|
||||
### 解决方案
|
||||
```rust
|
||||
// 错误: 用 usize
|
||||
let mut ir: usize = ...;
|
||||
ir -= 1; // 当 ir=0 时溢出!
|
||||
|
||||
// 正确: 用有符号整数
|
||||
let mut ir: isize = ...;
|
||||
ir -= 1; // 正常变为 -1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. 索引计算中间结果溢出
|
||||
|
||||
### 问题
|
||||
collhe 的索引计算 `((iu+1)^2 - 3*(iu+1) + 4)/2` 溢出
|
||||
|
||||
### 原因
|
||||
中间结果超出 usize 范围
|
||||
|
||||
### 解决方案
|
||||
```rust
|
||||
// 使用 i32 避免中间结果溢出
|
||||
let idx = (((iu + 1) * (iu + 1) - 3 * (iu + 1) + 4) / 2 - 1) as usize;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. 数组变量命名冲突
|
||||
|
||||
### 问题
|
||||
不同 Fortran 文件中同名变量冲突
|
||||
|
||||
### 原因
|
||||
Fortran 文件局部作用域,Rust 需要唯一名称
|
||||
|
||||
### 解决方案
|
||||
修改 `extract_fortran_data.py`:所有变量添加文件名前缀
|
||||
```rust
|
||||
// 旧: ADI, BDENS (冲突)
|
||||
// 新: DIELRC_ADI, DIELRC_BDENS
|
||||
pub const DIELRC_ADI: [f64; 18] = [...];
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 12. 2D 数组存储顺序
|
||||
|
||||
### 问题
|
||||
Fortran 列优先,Rust 行优先
|
||||
|
||||
### 解决方案
|
||||
脚本自动转置,访问方式改变
|
||||
```rust
|
||||
// Fortran: ARR(j, i) 列优先
|
||||
// Rust: ARR[i][j] 行优先 (已转置)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 13. DATA 语句数值解析
|
||||
|
||||
### 问题
|
||||
负数和科学计数法中有空格
|
||||
|
||||
### 示例
|
||||
```fortran
|
||||
DATA A / - 14.2, 1.48 D-2 /
|
||||
```
|
||||
|
||||
### 解决方案
|
||||
```python
|
||||
# 修复负数空格
|
||||
val = re.sub(r'-\s+(\d)', r'-\1', val)
|
||||
# 修复科学计数法空格
|
||||
val = re.sub(r'(\d)\s+([eEdD])', r'\1\2', val)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 14. BPOPF 测试失败 - 温度列与主循环列重叠
|
||||
|
||||
### 问题
|
||||
BPOPF 函数测试中,B[20][21] 的值是 -0.12 而不是预期的 -0.02。
|
||||
|
||||
### 原因
|
||||
测试参数设置导致温度列 (NRE) 与主循环的某一列 (NSE+II) 重叠:
|
||||
- 主循环更新列 NSE+1 到 NSE+NLVEXP (Fortran 1-indexed: 21-23)
|
||||
- 温度列是 NRE (Fortran 1-indexed: 22)
|
||||
- 当 II=2 时,列 NSE+II = 22 = NRE,两者写入同一列
|
||||
|
||||
### 解决方案
|
||||
测试参数设置时避免列重叠:
|
||||
```rust
|
||||
let params = BpopfParams {
|
||||
nfreqe: 10,
|
||||
inse: 11, // NSE = 10 + 11 - 1 = 20
|
||||
inre: 0, // 不更新温度列,避免与主循环列重叠
|
||||
inpc: 0, // 不更新电子密度列
|
||||
// ...
|
||||
};
|
||||
```
|
||||
|
||||
### Fortran 索引转换注意事项
|
||||
- `NSE = NFREQE + INSE - 1` (Fortran 起始列索引)
|
||||
- `NRE = NFREQE + INRE` (温度列,1-indexed)
|
||||
- Rust 主循环: `col = nse + ii` (nse 已经是 0-indexed 起始点)
|
||||
- Rust 温度列: `col = (nre - 1) as usize` (需要减 1 转换为 0-indexed)
|
||||
|
||||
### 调试技巧
|
||||
1. 添加 `#[cfg(test)]` 条件编译的调试输出
|
||||
2. 打印 ESEMAT 矩阵验证是否为单位矩阵
|
||||
3. 打印每次 B 矩阵更新的行、列、值
|
||||
4. 检查温度列和电子密度列是否与主循环列重叠
|
||||
|
||||
---
|
||||
|
||||
## 15. RAYLEIGH 氦散射截面公式错误
|
||||
|
||||
### 问题
|
||||
Rayleigh 氦散射截面计算结果不正确。
|
||||
|
||||
### 原因
|
||||
公式理解错误:
|
||||
- 错误: `5.484e-14 / x2 * (...)` 其中 `x2 = 1/x²`
|
||||
- 正确: `5.484e-14 / (x * x) * (...)`
|
||||
|
||||
### 解决方案
|
||||
```rust
|
||||
// 错误写法
|
||||
let x2 = 1.0 / (x * x);
|
||||
raysct.rche[ik] = 5.484e-14 / x2 * (...); // 这等于 5.484e-14 * x²
|
||||
|
||||
// 正确写法
|
||||
raysct.rche[ik] = 5.484e-14 / (x * x) * (...); // 这等于 5.484e-14 / x²
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 16. ALIFR3 - 大型 COMMON 块函数重构策略
|
||||
|
||||
### 问题
|
||||
ALIFR3 函数依赖大量 COMMON 块变量(来自 FIXALP, MODELQ, ALIPAR 等)。
|
||||
|
||||
### 解决方案
|
||||
创建综合的输入结构体,使用生命周期参数引用数据:
|
||||
|
||||
```rust
|
||||
/// 输入状态结构体 (使用生命周期引用数据)
|
||||
pub struct Alifr3ModelState<'a> {
|
||||
// 深度相关 (MDEPTH)
|
||||
pub elec: &'a [f64],
|
||||
pub densi: &'a [f64],
|
||||
// ... 其他字段
|
||||
|
||||
// 输出累积变量 (可变引用)
|
||||
pub heit: &'a mut [f64],
|
||||
pub hein: &'a mut [f64],
|
||||
// ... 其他字段
|
||||
}
|
||||
```
|
||||
|
||||
### 多分支条件处理
|
||||
Fortran 使用 GOTO 分支,Rust 使用 if-else:
|
||||
|
||||
```fortran
|
||||
IF(ILMCOR.NE.3) GO TO 199
|
||||
! ... ILMCOR==3 的代码
|
||||
199 IF(ILASCT.NE.0) GO TO 299
|
||||
! ... ILASCT==0 的代码
|
||||
299 ! ... ILASCT!=0 的代码
|
||||
```
|
||||
|
||||
```rust
|
||||
if params.ilmcor == 3 {
|
||||
// ... ILMCOR==3 的代码
|
||||
return;
|
||||
}
|
||||
if params.ilasct == 0 {
|
||||
// ... ILASCT==0 的代码
|
||||
return;
|
||||
}
|
||||
// ... ILASCT!=0 的代码
|
||||
```
|
||||
|
||||
### 注意事项
|
||||
- ABST 的计算方式在不同分支中不同:
|
||||
- ILMCOR==3: `ABST = UN/ABSO1(ID)`
|
||||
- ILASCT==0: `ABST = UN/(ABSO1(ID)-ELSCAT(ID))`
|
||||
- ILASCT!=0: `ABST = UN/ABSO1(ID)`
|
||||
- DSFN1 的计算在不同分支也有差异(是否包含 SIGEC 项)
|
||||
|
||||
---
|
||||
|
||||
## 17. ALIFR6 - COMMON 块结构体命名冲突
|
||||
|
||||
### 问题
|
||||
添加新的 COMMON 块结构体时,编译器报错 `ambiguous glob re-exports: the name 'Comptn'`。
|
||||
|
||||
### 原因
|
||||
`Comptn` 结构体同时存在于:
|
||||
- `src/state/config.rs` - Compton 散射角度参数(已有)
|
||||
- `src/state/model.rs` - 新添加的重复定义
|
||||
|
||||
两个模块都通过 `pub use *` 重新导出,导致名称冲突。
|
||||
|
||||
### 解决方案
|
||||
添加新结构体前,先搜索是否已存在:
|
||||
```bash
|
||||
grep -r "pub struct Comptn" src/state/
|
||||
```
|
||||
|
||||
如果已存在,扩展现有结构体而不是创建新的。
|
||||
|
||||
---
|
||||
|
||||
## 18. ALIFR6 - 循环中可变变量重新赋值
|
||||
|
||||
### 问题
|
||||
在循环中重新赋值 `s0p = s0p_new` 报错 `cannot assign twice to immutable variable`。
|
||||
|
||||
### 原因
|
||||
变量在 if-else 块中首次定义后,无法在循环中重新赋值。
|
||||
|
||||
### 解决方案
|
||||
```rust
|
||||
// 错误:不可变变量
|
||||
let (s0p, dsft1p, dsfn1p) = if ... { ... };
|
||||
|
||||
// 正确:声明为可变
|
||||
let (mut s0p, mut dsft1p, mut dsfn1p) = if ... { ... };
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 19. ALIFR6/ALIFR3 - 大型函数三段式处理模式
|
||||
|
||||
### 模式
|
||||
ALIFR6 和 ALIFR3 类函数有三个独立处理部分:
|
||||
|
||||
1. **第一个深度点 (ID=1)**
|
||||
- 特殊边界条件
|
||||
- DSFT1M/DSFN1M 初始化为 0
|
||||
|
||||
2. **深度循环 (ID=2 到 ND-1)**
|
||||
- 保存前一步值 (DSFTMM, DSFNMM)
|
||||
- 更新当前值
|
||||
- 计算下一步值 (DSFT1P, DSFN1P)
|
||||
|
||||
3. **最深点 (ID=ND)**
|
||||
- IBC 下边界条件处理
|
||||
- 可能的额外导数 (DSFT1D, DSFN1D)
|
||||
|
||||
### IBC 下边界条件
|
||||
| IBC | 说明 |
|
||||
|-----|------|
|
||||
| 0 | 无特殊处理 |
|
||||
| 1 | 简单 Planck 函数修正 |
|
||||
| 2 | 改进边界条件 |
|
||||
| 3 | 完整边界条件 + DSFT1D/DSFN1D |
|
||||
|
||||
---
|
||||
|
||||
## 20. ALIFR6 - 三对角 Lambda* 算子
|
||||
|
||||
### 特点
|
||||
ALIFR6 与 ALIFR3 的主要区别是额外计算三对角算子:
|
||||
|
||||
- **下对角线**: AREIT, AREIN, AREIP (使用 ALIM1)
|
||||
- **上对角线**: CREIT, CREIN, CREIP (使用 ALIP1)
|
||||
- **对角线**: REIT, REIN, REIP (使用 ALI1)
|
||||
|
||||
### IFALI >= 7 额外计算
|
||||
- HEITP, HEINP, HEIPP (He 相关)
|
||||
- REDTP, REDNP, REDPP (Red 相关)
|
||||
- EHET, EHEN, EHEP (Ehe 相关)
|
||||
- ERET, EREN, EREP (Ere 相关)
|
||||
|
||||
---
|
||||
|
||||
## 快速检查清单
|
||||
|
||||
重构新函数前检查:
|
||||
|
||||
- [ ] 是否有 INCLUDE 语句 (除 IMPLIC.FOR 外)
|
||||
- [ ] 是否使用 COMMON 块
|
||||
- [ ] COMMON 块结构体是否已存在于其他模块 (grep 检查)
|
||||
- [ ] 是否有文件 I/O (OPEN, READ, WRITE)
|
||||
- [ ] 数组索引是否需要 -1 调整
|
||||
- [ ] 循环变量是否可能变负 (用 isize/i32)
|
||||
- [ ] 多项式近似精度是否需要放宽
|
||||
- [ ] 是否有嵌套 IF 分支遗漏
|
||||
- [ ] 矩阵列索引是否可能与温度/密度列重叠
|
||||
- [ ] 公式中 `1/x` 和 `x` 的顺序是否正确
|
||||
- [ ] 大型 COMMON 块函数是否需要创建综合输入结构体
|
||||
- [ ] 多分支 GOTO 是否正确转换为 if-else
|
||||
- [ ] 循环中重新赋值的变量是否声明为 mut
|
||||
- [ ] 变量字段在哪个 COMMON 块 → 对应哪个 Rust 结构体 (查 `.FOR` 原文)
|
||||
- [ ] 测试初始化用 `ModelState::new()` 而非 `::default()`
|
||||
- [ ] 二维数组内层维度是否是深度/角度/频率 (不要默认 MDEPTH)
|
||||
- [ ] loop 内部积分变量是否在 loop 外声明以便 break 后使用
|
||||
|
||||
---
|
||||
|
||||
## 21. COMMON 块变量所属结构体查找
|
||||
|
||||
### 问题
|
||||
Fortran COMMON 块变量(如 `IDISK`、`IBC`、`ICHCOO`、`IJORIG`)应放在哪个 Rust 结构体中?
|
||||
|
||||
### 解决方案
|
||||
通过查阅 `.FOR` 中的 COMMON 定义来确认:
|
||||
- `IDISK`、`IBC` → `BASICS.FOR` 的 `COMMON/BASNUM/` → `config.basnum`
|
||||
- `ICHCOO`、`ICOMST`、`ICOMDE` → `BASICS.FOR` 的 `common/compti/` → `config.compti`
|
||||
- `IJORIG` → `BASICS.FOR` 的 `common/comptn/` → `config.comptn.ijorig`
|
||||
- `IWINBL` → `MODELQ.FOR` 的 `COMMON/WINDBL/` → `model.windbl.iwinbl`
|
||||
- `IFZ0` → `BASICS.FOR` 的 `COMMON/CENTRL/` → `config.centrl.ifz0`
|
||||
|
||||
```bash
|
||||
# 快速查找变量所在 COMMON 块
|
||||
grep -i "变量名" tlusty/extracted/*.FOR
|
||||
```
|
||||
|
||||
### 教训
|
||||
编译报错 `no field 'xxx' on type 'Accel'` 时,不要盲目添加字段——先查原始 `.FOR` 确认 COMMON 归属。
|
||||
|
||||
---
|
||||
|
||||
## 22. 循环外变量对 break 后可见
|
||||
|
||||
### 问题
|
||||
`ah`、`qq0`、`u0` 在 ALI 循环内定义,循环 `break` 后用于写回结果时编译报 `cannot find value`。
|
||||
|
||||
### 原因
|
||||
Rust 变量作用域严格,`loop {}` 块内 `let` 声明的变量在块外不可见。
|
||||
|
||||
### 解决方案
|
||||
```rust
|
||||
// 正确:循环前提前声明,循环内用 _inner 临时变量
|
||||
let mut ah = 0.0f64;
|
||||
let mut qq0 = 0.0f64;
|
||||
loop {
|
||||
let mut ah_inner = 0.0f64;
|
||||
let mut qq0_inner = 0.0f64;
|
||||
// 积分计算...
|
||||
if converged {
|
||||
ah = ah_inner; // break 前赋值回外部变量
|
||||
qq0 = qq0_inner;
|
||||
break;
|
||||
}
|
||||
}
|
||||
model.surfac.flux[ij] = ah; // 此处可用
|
||||
```
|
||||
|
||||
### 常见错误(变量被遮蔽)
|
||||
```rust
|
||||
let mut ah = 0.0f64;
|
||||
loop {
|
||||
let mut ah = 0.0; // ← 遮蔽外层 ah!外层永远是 0
|
||||
if converged { break; }
|
||||
}
|
||||
// ah 还是 0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 23. 测试初始化:`ModelState::new()` vs `::default()`
|
||||
|
||||
### 问题
|
||||
测试报错 `index out of bounds: the len is 0 but the index is 0`,即便访问 `model.totrad.rad[0][0]`。
|
||||
|
||||
### 原因
|
||||
`ModelState` 有 `#[derive(Default)]`,但 `CurRad` 等子结构体**只有 `new()` 方法,没有手动 `Default` 实现**。
|
||||
`derive(Default)` 对 `Vec` 产生空 Vec,访问任意元素都越界。
|
||||
|
||||
### 解决方案
|
||||
```rust
|
||||
// ❌ 错误:CurRad::default() 产生空 Vec
|
||||
let mut model = ModelState::default();
|
||||
|
||||
// ✅ 正确:ModelState::new() 调用 CurRad::new(),正确分配数组
|
||||
let mut model = ModelState::new();
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 24. `extint` 索引:内层是角度维度
|
||||
|
||||
### 问题
|
||||
`model.totrad.extint[ij][i]` 在 `for i in 0..MDEPTH` 循环中越界(len=6, index=6)。
|
||||
|
||||
### 原因
|
||||
`extint` 对应 Fortran `EXTINT(MFREQ, MMU)`:
|
||||
- 外层:频率索引(MFREQ)
|
||||
- **内层:角度索引(MMU = 6),不是深度!**
|
||||
|
||||
### 解决方案
|
||||
```rust
|
||||
// 正确:遍历角度 (MMU=6)
|
||||
use crate::state::constants::MMU;
|
||||
for i in 0..MMU {
|
||||
model.totrad.extint[0][i] = 0.0;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 25. 常用二维数组维度汇总
|
||||
|
||||
| 变量 | 外层维度 | 内层维度 |
|
||||
|------|---------|---------|
|
||||
| `totrad.rad[ij][id]` | 频率 MFREQ | 深度 MDEPTH |
|
||||
| `totrad.extint[ij][i]` | 频率 MFREQ | **角度 MMU** |
|
||||
| `totrad.fak[ij][id]` | 频率 MFREQ | 深度 MDEPTH |
|
||||
| `comptf.delj[iji][id]` | 频率 MFREQ | 深度 MDEPTH |
|
||||
| `expraf.radex[ije][id]` | 显式频率 MFREX | 深度 MDEPTH |
|
||||
| `angles.amu[i]` / `wtmu[i]` | 角度 MMU | — |
|
||||
|
||||
### 教训
|
||||
看到二维数组前,确认两个维度各是什么,不要默认都是 MDEPTH。
|
||||
|
||||
---
|
||||
|
||||
## 26. 2026-03-21 新增模块完整性检查
|
||||
|
||||
### SETDRT (密度对温度的导数)
|
||||
- **状态**: ✅ 完整
|
||||
- 原版 Fortran 调用 RHOEOS 函数
|
||||
- Rust 版使用泛型函数参数 `rhoeos_fn`,设计更灵活
|
||||
- 有限差分计算完全一致
|
||||
|
||||
### TAUFR1 (光学深度计算)
|
||||
- **状态**: ✅ 完整
|
||||
- `ss0` 数组在原版中也计算但未使用,与 Fortran 一致
|
||||
- `XCON` 常量在原版定义但未使用,已忽略
|
||||
- 核心逻辑:光学深度计算、参考深度插值、Planck 函数计算
|
||||
|
||||
### TABINT (频率表插值)
|
||||
- **状态**: ⚠️ 部分实现
|
||||
- **问题**: `interpolate_opacity` 函数中未实际修改 `absopac` 数组
|
||||
- 代码中有注释 "暂时跳过实际修改"
|
||||
- 二分查找和插值系数计算完整
|
||||
|
||||
**待修复**:
|
||||
```rust
|
||||
// 当前代码 (错误):
|
||||
let opac = rc * (params.freq[ij] / frtab[j - 1]).log10() + absort[j - 1];
|
||||
let _ = opac; // 计算了但没有写回
|
||||
|
||||
// 应该:
|
||||
// 需要设计一个可变引用来修改 absopac
|
||||
```
|
||||
|
||||
### RYBMAT (Rybicki矩阵)
|
||||
- **状态**: ⚠️ 简化实现
|
||||
- 原版 ~390 行 → Rust 375 行
|
||||
- **问题**: 测试失败 `result.rb[0].is_finite()` 返回 NaN
|
||||
|
||||
**可能原因**:
|
||||
1. 边界条件 `id=0` 时 `dm[id+1] - dm[id]` 可能为零
|
||||
2. `abso1` 数组可能包含零值导致除零
|
||||
3. Hermitian 方法 (`isplin=2`) 被简化
|
||||
|
||||
**待修复**:
|
||||
```rust
|
||||
// 需要添加边界检查
|
||||
let ddm = (params.dm[id + 1] - params.dm[id]) * HALF;
|
||||
if ddm.abs() < 1e-30 {
|
||||
continue; // 跳过无效深度点
|
||||
}
|
||||
let dtm = UN / ((params.abso1[id] + params.abso1[id + 1]) * ddm);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 27. 优先级列表注意事项
|
||||
|
||||
优先级列表 (`python3 scripts/analyze_fortran.py --priority`) 显示"传递未实现=0"的函数可能有隐藏依赖:
|
||||
|
||||
- **SETDRT** 调用 RHOEOS(标记为 pending),但通过函数参数传入解决了
|
||||
- **TABINT** 无外部调用,真正独立
|
||||
- **TAUFR1** 无外部调用,真正独立
|
||||
- **RYBMAT** 无外部调用,但依赖大量 COMMON 块变量
|
||||
|
||||
**教训**: 优先级列表只检查显式的 SUBROUTINE/FUNCTION 调用,不检查:
|
||||
1. COMMON 块依赖
|
||||
2. 通过参数传入的函数指针
|
||||
3. 隐式的外部函数引用
|
||||
Reference in New Issue
Block a user