This commit is contained in:
fmq
2026-03-21 16:23:35 +08:00
parent f286ddacfe
commit 497e62e13c
35 changed files with 10781 additions and 364 deletions
+337
View File
@@ -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 | ✅ |
+110
View File
@@ -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) - 重构过程中遇到的问题及解决方法
+374
View File
@@ -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
```
+305
View File
@@ -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
1 fortran_file unit_name unit_type is_pure common_deps call_deps has_io rust_module status
2 _unnamed_block_data_.f C BLOCK DATA False BASICS|ATOMIC False pending
3 accel2.f ACCEL2 SUBROUTINE False BASICS|ITERAT|MODELQ True pending
4 accelp.f ACCELP SUBROUTINE False BASICS|MODELQ|ITERAT|POPULS True pending
5 alifr1.f ALIFR1 SUBROUTINE False BASICS|ATOMIC|MODELQ|ALIPAR ALIFR3 False pending
6 alifr3.f ALIFR3 SUBROUTINE False BASICS|ATOMIC|MODELQ|ALIPAR False src/math/alifr3.rs done
7 alifr6.f ALIFR6 SUBROUTINE False BASICS|ATOMIC|MODELQ|ALIPAR False src/math/alifr6.rs done
8 alifrk.f ALIFRK SUBROUTINE False BASICS|ATOMIC|MODELQ|ALIPAR False src/math/alifrk.rs done
9 alisk1.f ALISK1 SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ARRAY1|ITERAT RTEFR1|ALIFRK|ROSSTD|OPACF1 True pending
10 alisk2.f ALISK2 SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ARRAY1|ITERAT RTEFR1|ALIFRK|ROSSTD|OPACF1 True pending
11 alist1.f ALIST1 SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ITERAT RTEFR1|ALIFR1|OPACFD|ROSSTD True pending
12 alist2.f ALIST2 SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ARRAY1|ITERAT QUIT|OPACFD|RTEFR1|ALIFR1|ROSSTD True pending
13 allard.f ALLARD SUBROUTINE False BASICS|callardb|callardc|callarda|quasun|callardg|calphatd ALLARDT True pending
14 allardt.f ALLARDT SUBROUTINE False BASICS|calphatd False src/math/allardt.rs done
15 angset.f ANGSET SUBROUTINE True BASICS GAULEG False src/math/angset.rs done
16 betah.f BETAH FUNCTION True False src/math/betah.rs done
17 bhe.f BHE SUBROUTINE False BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR False src/math/bhe.rs done
18 bhed.f BHED SUBROUTINE False BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|CMATZD|SURFEX False src/math/bhe.rs done
19 bhez.f BHEZ SUBROUTINE False BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|SURFEX False src/math/bhe.rs done
20 bkhsgo.f BKHSGO SUBROUTINE True False src/math/bkhsgo.rs done
21 bpop.f BPOP SUBROUTINE False BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|ODFPAR|ITERAT LEVGRP|BPOPE|RATMAT|BPOPT|MATINV|BPOPC|LEVSOL|BPOPF False pending
22 bpopc.f BPOPC SUBROUTINE False BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|ODFPAR|ADCHAR STATE False pending
23 bpope.f BPOPE SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ITERAT|ARRAY1 DWNFR1|SGMER1 False pending
24 bpopf.f BPOPF SUBROUTINE False BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|ODFPAR False src/math/bpopf.rs done
25 bpopt.f BPOPT SUBROUTINE False BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|ODFPAR COLIS False pending
26 bre.f BRE SUBROUTINE False BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR COMPT0 False pending
27 brez.f BREZ SUBROUTINE False BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR COMPT0 False pending
28 brte.f BRTE SUBROUTINE False BASICS|ATOMIC|MODELQ|ALIPAR|ARRAY1 COMPT0 False pending
29 brtez.f BRTEZ SUBROUTINE False BASICS|ATOMIC|MODELQ|ALIPAR|ARRAY1 COMPT0 False pending
30 butler.f BUTLER SUBROUTINE True False src/math/butler.rs done
31 carbon.f CARBON SUBROUTINE True False src/math/carbon.rs done
32 ceh12.f CEH12 FUNCTION True False src/math/ceh12.rs done
33 change.f CHANGE SUBROUTINE False BASICS|ATOMIC|MODELQ READBF|STEQEQ True pending
34 chckse.f CHCKSE SUBROUTINE False BASICS|ATOMIC|MODELQ SABOLF True pending
35 chctab.f CHCTAB SUBROUTINE False BASICS|MODELQ|abntab True pending
36 cheav.f CHEAV FUNCTION False BASICS|ATOMIC QUIT True pending
37 cheavj.f CHEAVJ FUNCTION False BASICS|ATOMIC QUIT True pending
38 cia_h2h.f CIA_H2H SUBROUTINE False LOCATE|IF True pending
39 cia_h2h2.f CIA_H2H2 SUBROUTINE False LOCATE|IF True pending
40 cia_h2he.f CIA_H2HE SUBROUTINE False LOCATE|IF True pending
41 cia_hhe.f CIA_HHE SUBROUTINE False LOCATE|IF True pending
42 cion.f CION FUNCTION True False src/math/cion.rs done
43 ckoest.f CKOEST FUNCTION True BASICS False src/math/ckoest.rs done
44 colh.f COLH SUBROUTINE False BASICS|ATOMIC|MODELQ IRC|CSPEC|BUTLER False pending
45 colhe.f COLHE SUBROUTINE False BASICS|ATOMIC IRC|COLLHE|CSPEC False pending
46 colis.f COLIS SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|CTRTEMP IRC|COLHE|CSPEC|COLH False pending
47 collhe.f COLLHE SUBROUTINE True False src/math/collhe.rs done
48 column.f COLUMN SUBROUTINE False BASICS|MODELQ|relcor True pending
49 compt0.f COMPT0 SUBROUTINE False BASICS|MODELQ|ALIPAR|ITERAT|auxcbc False src/math/compt0.rs done
50 comset.f COMSET SUBROUTINE False BASICS|MODELQ|auxcbc|comgfs False src/math/comset.rs done
51 concor.f CONCOR SUBROUTINE False BASICS|MODELQ CONOUT True pending
52 conout.f CONOUT SUBROUTINE False BASICS|MODELQ|ALIPAR|CUBCON MEANOPT|MEANOP|CONVEC|OPACF0 True pending
53 conref.f CONREF SUBROUTINE False BASICS|MODELQ|ARRAY1|imucnn|CUBCON WNSTOR|ELDENS|CONVC1|STEQEQ|CONOUT|CONVEC True pending
54 contmd.f CONTMD SUBROUTINE False BASICS|ATOMIC|MODELQ|ALIPAR|PRSAUX|CUBCON MEANOP|CUBIC|OPACF0|STEQEQ|WNSTOR|CONOUT|CONVEC True pending
55 contmp.f CONTMP SUBROUTINE False BASICS|ATOMIC|MODELQ|ALIPAR|ichndm|CUBCON MEANOPT|MEANOP|CUBIC|OPACF0|STEQEQ|ELDENS|WNSTOR|CONOUT|CONVEC True pending
56 convc1.f CONVC1 SUBROUTINE False BASICS|CUBCON TRMDER|TRMDRT False pending
57 convec.f CONVEC SUBROUTINE False BASICS|CUBCON TRMDER|TRMDRT False pending
58 coolrt.f COOLRT SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ARRAY1|ITERAT|COOLCO RTEFR1|OPACFA True pending
59 corrwm.f CORRWM SUBROUTINE False BASICS|ATOMIC|MODELQ QUIT True pending
60 cross.f CROSS FUNCTION False BASICS|ATOMIC|MODELQ False src/math/cross.rs done
61 crossd.f CROSSD FUNCTION False BASICS|ATOMIC|MODELQ False src/math/cross.rs done
62 cspec.f CSPEC SUBROUTINE False BASICS|ATOMIC QUIT False pending
63 ctdata.f CTDATA BLOCK DATA False CTIon|CTRecomb False src/math/ctdata.rs done
64 cubic.f CUBIC SUBROUTINE False BASICS|CUBCON False src/math/cubic.rs done
65 dielrc.f DIELRC SUBROUTINE True False src/math/dielrc.rs done
66 dietot.f DIETOT SUBROUTINE False BASICS|ATOMIC|MODELQ DIELRC True pending
67 divstr.f DIVSTR SUBROUTINE False BASICS|MODELQ False src/math/divstr.rs done
68 dmder.f DMDER SUBROUTINE False BASICS|ATOMIC|MODELQ|DEPTDR False src/math/dmder.rs done
69 dmeval.f DMEVAL SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT|ARRAY1 True pending
70 dopgam.f DOPGAM SUBROUTINE False BASICS|ATOMIC|MODELQ GAMSP False src/math/dopgam.rs done
71 dwnfr.f DWNFR SUBROUTINE False BASICS|MODELQ False src/math/dwnfr.rs done
72 dwnfr0.f DWNFR0 SUBROUTINE False BASICS|MODELQ False src/math/dwnfr0.rs done
73 dwnfr1.f DWNFR1 SUBROUTINE False BASICS|MODELQ False src/math/dwnfr1.rs done
74 eint.f EINT SUBROUTINE True EXPINX False src/math/expint.rs done
75 elcor.f ELCOR SUBROUTINE False BASICS|ATOMIC|MODELQ|ADCHAR WNSTOR|STEQEQ|STATE|MOLEQ True pending
76 eldenc.f ELDENC SUBROUTINE False BASICS|MODELQ|ATOMIC|eospar|hmolab|eletab RHONEN|STATE|MOLEQ True pending
77 eldens.f ELDENS SUBROUTINE False BASICS|MODELQ|ATOMIC|eospar|terden ENTENE|LINEQS|MPARTF|STATE|MOLEQ True pending
78 emat.f EMAT SUBROUTINE False BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR False src/math/emat.rs done
79 entene.f ENTENE SUBROUTINE False BASICS|ATOMIC|MODELQ MPARTF False pending
80 erfcin.f ERFCIN FUNCTION True False src/math/erfcx.rs done
81 erfcx.f ERFCX FUNCTION True False src/math/erfcx.rs done
82 expint.f EXPINT FUNCTION True False src/math/expint.rs done
83 expinx.f EXPINX SUBROUTINE True False src/math/expint.rs done
84 expo.f EXPO FUNCTION True False src/math/expo.rs done
85 ffcros.f FFCROS FUNCTION True False src/math/ffcros.rs done
86 gami.f GAMI FUNCTION True False src/math/gami.rs done
87 gamsp.f GAMSP SUBROUTINE True BASICS False src/math/gamsp.rs done
88 gauleg.f GAULEG SUBROUTINE True False src/math/gauleg.rs done
89 gaunt.f GAUNT FUNCTION True False src/math/gaunt.rs done
90 getlal.f GETLAL SUBROUTINE False BASICS|callardb|callardc|callarda|quasun|callardg|calphatd True pending
91 getwrd.f GETWRD SUBROUTINE True False src/math/getwrd.rs done
92 gfree0.f GFREE0 SUBROUTINE False BASICS|MODELQ False src/math/gfree.rs done
93 gfree1.f GFREE1 FUNCTION False BASICS|MODELQ False src/math/gfree.rs done
94 gfreed.f GFREED SUBROUTINE False BASICS|MODELQ False src/math/gfree.rs done
95 ghydop.f GHYDOP SUBROUTINE False BASICS|MODELQ|ATOMIC|intcfg False src/math/ghydop.rs done
96 gntk.f GNTK FUNCTION True False src/math/gntk.rs done
97 gomini.f GOMINI SUBROUTINE False BASICS|MODELQ|intcfg True pending
98 grcor.f GRCOR SUBROUTINE True False src/math/grcor.rs done
99 greyd.f GREYD SUBROUTINE False BASICS|MODELQ|ATOMIC|ALIPAR WNSTOR|MEANOP|OPACF0|STEQEQ|RHONEN True pending
100 gridp.f GRIDP SUBROUTINE True BASICS False src/math/gridp.rs done
101 h2minus.f H2MINUS SUBROUTINE False BASICS LOCATE True pending
102 hction.f HCTION FUNCTION False CTIon|CTRTEMP False src/math/ctdata.rs done
103 hctrecom.f HCTRECOM FUNCTION False CTRTEMP|CTRecomb False src/math/ctdata.rs done
104 hedif.f HEDIF SUBROUTINE False BASICS|MODELQ|ATOMIC|hediff True pending
105 hephot.f HEPHOT FUNCTION True False src/math/hephot.rs done
106 hesol6.f HESOL6 SUBROUTINE False BASICS|MODELQ|PRSAUX MATINV False pending
107 hesolv.f HESOLV SUBROUTINE False BASICS|MODELQ|PRSAUX WNSTOR|STEQEQ|RHONEN|MATINV True pending
108 hidalg.f HIDALG FUNCTION True False src/math/hidalg.rs done
109 ijali2.f IJALI2 SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR QUIT True pending
110 ijalis.f IJALIS SUBROUTINE False BASICS|ATOMIC|MODELQ True pending
111 incldy.f INCLDY SUBROUTINE False BASICS|ATOMIC|MODELQ QUIT|RATMAT|SABOLF|WNSTOR|LEVSOL True pending
112 indexx.f INDEXX SUBROUTINE True False src/math/indexx.rs done
113 inicom.f INICOM SUBROUTINE False BASICS|ATOMIC|MODELQ|comgfs False src/math/inicom.rs done
114 inifrc.f INIFRC SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ijflar INDEXX True pending
115 inifrs.f INIFRS SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR QUIT|INDEXX True pending
116 inifrt.f INIFRT SUBROUTINE False BASICS|ATOMIC|MODELQ|ijflar INDEXX True pending
117 inilam.f INILAM SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT|ALIPAR WNSTOR|RTEFR1|RATES1|ELCOR|COLIS|SABOLF|STEQEQ|OPAINI|OPACF1 False pending
118 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
119 inkul.f INKUL SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|COLKUR|LINED True pending
120 inpdis.f INPDIS SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT|ODFPAR|ALIPAR|relcor GRCOR True pending
121 inpmod.f INPMOD SUBROUTINE False BASICS|ATOMIC|MODELQ|eospar QUIT|RATMAT|KURUCZ|INCLDY|MOLEQ|SABOLF|WNSTOR|LEVSOL True pending
122 interp.f INTERP SUBROUTINE True BASICS False src/math/interp.rs done
123 inthyd.f INTHYD SUBROUTINE False BASICS|MODELQ DIVSTR False src/math/inthyd.rs done
124 intlem.f INTLEM SUBROUTINE False BASICS|MODELQ INTHYD False src/math/intlem.rs done
125 intxen.f INTXEN SUBROUTINE False BASICS|MODELQ False src/math/intxen.rs done
126 irc.f IRC SUBROUTINE True EXPINX|SZIRC False src/math/irc.rs done
127 iroset.f IROSET SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|LINED QUIT|LEVCD|INKUL True pending
128 kurucz.f KURUCZ SUBROUTINE False BASICS|ATOMIC|MODELQ|temlim QUIT|RATMAT|MOLEQ|SABOLF|WNSTOR|LEVSOL|RHONEN True pending
129 lagran.f LAGRAN SUBROUTINE True False src/math/interpolate.rs done
130 laguer.f LAGUER SUBROUTINE False True src/math/laguer.rs done
131 lemini.f LEMINI SUBROUTINE False BASICS|MODELQ True pending
132 levcd.f LEVCD SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|COLKUR QUIT|INDEXX True pending
133 levgrp.f LEVGRP SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT False src/math/levgrp.rs done
134 levset.f LEVSET SUBROUTINE False BASICS|ATOMIC|MODELQ QUIT False pending
135 levsol.f LEVSOL SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT LINEQS False src/math/levsol.rs done
136 lineqs.f LINEQS SUBROUTINE True BASICS False src/math/lineqs.rs done
137 linpro.f LINPRO SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|quasun DIVSTR|STARK0|DOPGAM|INTLEM|INTXEN False pending
138 linsel.f LINSEL SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR RTEFR1|QUIT|OPAINI|OPACF1 True pending
139 linset.f LINSET SUBROUTINE False BASICS|ATOMIC|MODELQ DIVSTR|QUIT|IJALIS|STARK0 True pending
140 linspl.f LINSPL SUBROUTINE False BASICS|ATOMIC|MODELQ False src/math/linspl.rs done
141 locate.f LOCATE SUBROUTINE True False src/math/locate.rs done
142 ltegr.f LTEGR SUBROUTINE False BASICS|ATOMIC|MODELQ QUIT|CONOUT|ROSSOP|WNSTOR|STEQEQ|INTERP True pending
143 ltegrd.f LTEGRD SUBROUTINE False BASICS|MODELQ|PRSAUX|CUBCON|TOTJHK|FACTRS|FLXAUX QUIT|TEMPER|CONOUT|ELDENS|WNSTOR|STEQEQ|INTERP|ZMRHO True pending
144 lucy.f LUCY SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ITERAT|ALIPAR|ARRAY1 OPACFL|RTEFR1|ELCOR|COLIS|SABOLF|WNSTOR|STEQEQ|OPAINI True pending
145 lymlin.f LYMLIN SUBROUTINE False BASICS|ATOMIC|MODELQ DIVSTR|STARK0 True pending
146 matcon.f MATCON SUBROUTINE False BASICS|MODELQ|ARRAY1|CUBCON CONVEC False pending
147 matgen.f MATGEN SUBROUTINE False BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR BHED|MATCON|BREZ|BRE|BRTEZ|BHE|BRTE|SABOLF|BHEZ|EMAT|BPOP False pending
148 matinv.f MATINV SUBROUTINE True BASICS False src/math/matinv.rs done
149 meanop.f MEANOP SUBROUTINE False BASICS|MODELQ|ATOMIC False src/math/meanop.rs done
150 meanopt.f MEANOPT SUBROUTINE False BASICS|MODELQ OPCTAB False pending
151 minv3.f MINV3 SUBROUTINE True False src/math/minv3.rs done
152 moleq.f MOLEQ SUBROUTINE False BASICS|MODELQ|ATOMIC|adchar|eospar|hmolab|terden|ioniz2|COMFH1|moldat|entrop MPARTF|RUSSEL True pending
153 mpartf.f MPARTF SUBROUTINE False moldat True pending
154 newdm.f NEWDM SUBROUTINE False BASICS|MODELQ|FACTRS|PRSAUX|FLXAUX INTERP|TEMPER True pending
155 newdmt.f NEWDMT SUBROUTINE False BASICS|MODELQ|FACTRS|PRSAUX|FLXAUX INTERP|GRIDP|TEMPER True pending
156 newpop.f NEWPOP SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT True pending
157 nstout.f NSTOUT SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT|ODFPAR|ALIPAR QUIT True pending
158 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
159 odf1.f ODF1 SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR DIVSTR|ODFHST|DWNFR True pending
160 odffr.f ODFFR SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR QUIT False pending
161 odfhst.f ODFHST SUBROUTINE False BASICS|MODELQ|ODFPAR False src/math/odfhst.rs done
162 odfhyd.f ODFHYD SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR DIVSTR|ODFHST|INDEXX False pending
163 odfhys.f ODFHYS SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR ODFFR|STARK0|IJALIS False pending
164 odfmer.f ODFMER SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR ODFHYD False pending
165 odfset.f ODFSET SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|STFCR QUIT|IJALIS True pending
166 opacf0.f OPACF0 SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|hmolab OPACT1|OPADD|SGMER1|GFREE0|DWNFR0|DWNFR1|SABOLF|WNSTOR|LINPRO False pending
167 opacf1.f OPACF1 SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|hmolab|ipricr OPACT1|OPADD|QUASIM|LYMLIN|GHYDOP|DWNFR1|PRD|SGMER1 True pending
168 opacfa.f OPACFA SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|COOLCO DWNFR1|OPADD|PRD|SGMER1 False pending
169 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
170 opacfl.f OPACFL SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR DWNFR1|OPADD|SGMER1 False pending
171 opact1.f OPACT1 SUBROUTINE False BASICS|MODELQ|ALIPAR|hmolab OPCTAB False pending
172 opactd.f OPACTD SUBROUTINE False BASICS|MODELQ|ALIPAR|ARRAY1|ITERAT|dsctva|rhoder|hmolab OPCTAB False pending
173 opactr.f OPACTR SUBROUTINE False BASICS|MODELQ|ALIPAR|ATOMIC|grdpra|dsctva|hmolab STEQEQ|PGSET|ELDENS|SABOLF|RATMAL|WNSTOR|LEVSOL|OPAINI|OPACF1 False pending
174 opadd.f OPADD SUBROUTINE False BASICS|ATOMIC|MODELQ|eospar H2MINUS|CIA_H2H|CIA_H2HE|CIA_H2H2|CIA_HHE False pending
175 opadd0.f OPADD0 SUBROUTINE False BASICS|ATOMIC|MODELQ QUIT False pending
176 opahst.f OPAHST SUBROUTINE False BASICS|ODFPAR STARK0 True pending
177 opaini.f OPAINI SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR LEVGRP|DWNFR0|REFLEV|SABOLF|WNSTOR|LINPRO False pending
178 opctab.f OPCTAB SUBROUTINE False BASICS|MODELQ RAYLEIGH False pending
179 opdata.f OPDATA SUBROUTINE False TOPB True pending
180 opfrac.f OPFRAC SUBROUTINE False pfoptb True pending
181 osccor.f OSCCOR SUBROUTINE False BASICS|MODELQ|ITERAT True pending
182 outpri.f OUTPRI SUBROUTINE False BASICS|ATOMIC|MODELQ|ARRAY1|grdpra SABOLF|RATMAL|WNSTOR|LEVSOL|OPACF1 True pending
183 output.f OUTPUT SUBROUTINE False BASICS|MODELQ True pending
184 partf.f PARTF SUBROUTINE False BASICS|PFSTDS|irwint OPFRAC|MPARTF|PFNI|PFFE|PFCNO|PFHEAV|PFSPEC False pending
185 pfcno.f PFCNO SUBROUTINE True BASICS False src/math/pfcno.rs done
186 pffe.f PFFE SUBROUTINE True False src/math/pffe.rs done
187 pfheav.f PFHEAV SUBROUTINE False True pending
188 pfni.f PFNI SUBROUTINE True False src/math/pfni.rs done
189 pfspec.f PFSPEC SUBROUTINE True False src/math/pfspec.rs done
190 pgset.f PGSET SUBROUTINE False BASICS|ITERAT|MODELQ|grdpra|rybpgs TRIDAG True pending
191 prchan.f PRCHAN SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT True pending
192 prd.f PRD SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT DOPGAM False pending
193 prdini.f PRDINI SUBROUTINE False BASICS|ATOMIC|MODELQ False src/math/prdini.rs done
194 princ.f PRINC SUBROUTINE False BASICS|ATOMIC|MODELQ|ALIPAR DWNFR|LINPRO|SABOLF|OPACF1 True pending
195 prnt.f PRNT SUBROUTINE False BASICS|ATOMIC|MODELQ SABOLF True pending
196 profil.f PROFIL FUNCTION False BASICS|ATOMIC|MODELQ|quasun DIVSTR|STARK0 False src/math/profil.rs done
197 profsp.f PROFSP FUNCTION False BASICS|ATOMIC|MODELQ SABOLF False pending
198 prsent.f PRSENT SUBROUTINE False tdedge|TABLTD|tdflag|THERM True pending
199 psolve.f PSOLVE SUBROUTINE False BASICS|MODELQ False src/math/psolve.rs done
200 pzert.f PZERT SUBROUTINE False BASICS|ATOMIC|MODELQ False src/math/pzert.rs done
201 pzeval.f PZEVAL SUBROUTINE False BASICS|MODELQ|ALIPAR|icnrsp CONOUT True pending
202 pzevld.f PZEVLD SUBROUTINE False BASICS|ATOMIC|MODELQ|ALIPAR|ARRAY1|grdpra|DEPTDR|ifpzpa|PRSAUX False src/math/pzevld.rs done
203 quartc.f QUARTC SUBROUTINE False True src/math/quartc.rs done
204 quasim.f QUASIM SUBROUTINE False BASICS|ATOMIC|MODELQ|quasun ALLARD False pending
205 quit.f QUIT SUBROUTINE False True src/math/quit.rs done
206 radpre.f RADPRE SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR RTEFR1|INDEXX|QUIT|OPACF1 True pending
207 radtot.f RADTOT SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ITERAT|TOTJHK|SURFEX|OPTDPT RTEFR1|OPAINI|OPACF1 False pending
208 raph.f RAPH FUNCTION True False src/math/raph.rs done
209 rates1.f RATES1 SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ITERAT RTEFR1|ROSSTD|OPACF1 False pending
210 ratmal.f RATMAL SUBROUTINE False BASICS|ATOMIC|MODELQ False src/math/ratmal.rs done
211 ratmat.f RATMAT SUBROUTINE False BASICS|ATOMIC|MODELQ REFLEV False pending
212 ratsp1.f RATSP1 SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR|ARRAY1|ITERAT RTEFR1|ROSSTD|OPACF1 True pending
213 rayini.f RAYINI SUBROUTINE False BASICS|MODELQ|ATOMIC RAYLEIGH True pending
214 rayleigh.f RAYLEIGH SUBROUTINE False BASICS|ATOMIC|MODELQ|eospar|RAYSCT False src/math/rayleigh.rs done
215 rayset.f RAYSET SUBROUTINE False BASICS|MODELQ False src/math/rayset.rs done
216 rdata.f RDATA SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT|ODFPAR|ALIPAR|INUNIT|STRPAR|imodlc QUIT|DOPGAM|LINSET|RDATAX True pending
217 rdatax.f RDATAX SUBROUTINE False BASICS|ATOMIC|MODELQ BKHSGO True pending
218 readbf.f READBF SUBROUTINE False BASICS True pending
219 rechck.f RECHCK SUBROUTINE False BASICS|ATOMIC|MODELQ RTEFR1|OPACF1 True pending
220 reflev.f REFLEV SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT False src/math/reflev.rs done
221 reiman.f REIMAN FUNCTION True False src/math/reiman.rs done
222 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
223 rhoeos.f RHOEOS FUNCTION False BASICS|MODELQ PRSENT False pending
224 rhonen.f RHONEN SUBROUTINE False BASICS|MODELQ ELDENS False pending
225 rhsgen.f RHSGEN SUBROUTINE False BASICS|ATOMIC|MODELQ|ARRAY1|ALIPAR|CUBCON LEVGRP|RATMAT|MATINV|STATE|SABOLF|CONVEC|COMPT0 False pending
226 rossop.f ROSSOP SUBROUTINE False BASICS|ATOMIC|MODELQ|ALIPAR WNSTOR|MEANOPT|MEANOP|OPACF0|ELDENS|STEQEQ False pending
227 rosstd.f ROSSTD SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT|ALIPAR True pending
228 rte_sc.f RTE_SC SUBROUTINE True BASICS False src/math/rte_sc.rs done
229 rteang.f RTEANG SUBROUTINE False BASICS|MODELQ|ALIPAR|SURFEX|EXTINT GAULEG False pending
230 rtecf0.f RTECF0 SUBROUTINE False BASICS|MODELQ|ALIPAR|ITERAT|auxcbc|AUXRTE|OPTDPT False src/math/rtecf0.rs done
231 rtecf1.f RTECF1 SUBROUTINE False BASICS|MODELQ|ALIPAR|ITERAT|SURFEX|comgfs|AUXRTE|EXTINT|OPTDPT RTECF0|RTEFE2|RTESOL True pending
232 rtecmc.f RTECMC SUBROUTINE False BASICS|MODELQ|ALIPAR|ITERAT|AUXRTE|comgfs RTECF0|MATINV|OPACF1 False pending
233 rtecmu.f RTECMU SUBROUTINE False BASICS|MODELQ|ALIPAR|ITERAT|AUXRTE|OPTDPT GAULEG|RTESOL|RTECF0|OPACF1 True pending
234 rtecom.f RTECOM SUBROUTINE False BASICS|MODELQ|ALIPAR|ITERAT|AUXRTE|comgfs|OPTDPT RTECF1|RTECF0|OPACF1 False pending
235 rtedf1.f RTEDF1 SUBROUTINE False BASICS|MODELQ|ALIPAR|OPTDPT False src/math/rtedf1.rs done
236 rtedf2.f RTEDF2 SUBROUTINE False BASICS|MODELQ|ALIPAR False src/math/rtedf2.rs done
237 rtefe2.f RTEFE2 SUBROUTINE True BASICS False src/math/rtefe2.rs done
238 rtefr1.f RTEFR1 SUBROUTINE False BASICS|MODELQ|ALIPAR|ITERAT|OPTDPT RTEDF2|RTESOL|MATINV|RTECF1|MINV3|RTEDF1 True pending
239 rteint.f RTEINT SUBROUTINE False BASICS|MODELQ|ALIPAR|ITERAT|OPTDPT MATINV|OPACF1 True pending
240 rtesol.f RTESOL SUBROUTINE True BASICS False src/math/rtesol.rs done
241 russel.f RUSSEL SUBROUTINE False BASICS|MODELQ|COMFH1 MPARTF True pending
242 rybchn.f RYBCHN SUBROUTINE False BASICS|ITERAT|MODELQ|ALIPAR|ARRAY1|grdpra|rybpgs ELDENS|PGSET True pending
243 rybene.f RYBENE SUBROUTINE False BASICS|MODELQ|ALIPAR|ARRAY1|deridt|RYBMTX|CUBCON CONVEC False pending
244 rybheq.f RYBHEQ SUBROUTINE False BASICS|MODELQ|grdpra|rybpgs RTEFR1|ELCOR|PGSET|ELDENS|WNSTOR|STEQEQ|OPAINI|OPACF1 True pending
245 rybmat.f RYBMAT SUBROUTINE False BASICS|MODELQ|ALIPAR|ARRAY1|dsctva|RYBMTX False src/math/rybmat.rs done
246 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
247 sabolf.f SABOLF SUBROUTINE False BASICS|ATOMIC|MODELQ PARTF False pending
248 sbfch.f SBFCH FUNCTION True False src/math/sbfch.rs done
249 sbfhe1.f SBFHE1 FUNCTION False BASICS|ATOMIC QUIT True src/math/sbfhe1.rs done
250 sbfhmi.f SBFHMI FUNCTION True False src/math/sbfhmi.rs done
251 sbfhmi_old.f SBFHMI_OLD FUNCTION True False src/math/sbfhmi_old.rs done
252 sbfoh.f SBFOH FUNCTION True False src/math/sbfoh.rs done
253 setdrt.f SETDRT SUBROUTINE False BASICS|MODELQ|RHODER False src/math/setdrt.rs done
254 settrm.f SETTRM SUBROUTINE False tdedge|TABLTD|tdflag|THERM PRSENT True pending
255 sffhmi.f SFFHMI FUNCTION True False src/math/sffhmi.rs done
256 sffhmi_add.f SFFHMI_ADD FUNCTION True False src/math/sffhmi_add.rs done
257 sghe12.f SGHE12 FUNCTION True False src/math/sghe12.rs done
258 sgmer0.f SGMER0 SUBROUTINE False BASICS|ATOMIC|MODELQ False src/math/sgmer.rs done
259 sgmer1.f SGMER1 SUBROUTINE False BASICS|ATOMIC|MODELQ False src/math/sgmer.rs done
260 sgmerd.f SGMERD SUBROUTINE False BASICS|ATOMIC|MODELQ False src/math/sgmer.rs done
261 sigave.f SIGAVE SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR True pending
262 sigk.f SIGK FUNCTION False BASICS|ATOMIC SPSIGK False pending
263 sigmar.f SIGMAR FUNCTION False BASICS LAGUER True pending
264 solve.f SOLVE SUBROUTINE False BASICS|ITERAT|MODELQ|ARRAY1|ALIPAR|CMATZD MATGEN|PRCHAN|MATINV|WNSTOR|RHSGEN True pending
265 solves.f SOLVES SUBROUTINE False BASICS|ITERAT|MODELQ|ARRAY1|ALIPAR|CMATZD|STOMAT MATGEN|PRCHAN|MATINV|WNSTOR|RHSGEN True pending
266 spsigk.f SPSIGK SUBROUTINE True CARBON False src/math/spsigk.rs done
267 srtfrq.f SRTFRQ SUBROUTINE False BASICS|ATOMIC|MODELQ QUIT|INDEXX True pending
268 stark0.f STARK0 SUBROUTINE True False src/math/stark0.rs done
269 starka.f STARKA FUNCTION False BASICS|MODELQ False src/math/starka.rs done
270 start.f START SUBROUTINE False BASICS|hediff True pending
271 state.f STATE SUBROUTINE False BASICS|ATOMIC|MODELQ|PFSTDS|terden OPFRAC|PARTF True pending
272 steqeq.f STEQEQ SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT|POPSTR|PPAPAR LEVSOL|RATMAT|SABOLF|MOLEQ False pending
273 switch.f SWITCH SUBROUTINE False BASICS|ATOMIC|MODELQ True pending
274 szirc.f SZIRC SUBROUTINE True EINT False src/math/szirc.rs done
275 tabini.f TABINI SUBROUTINE False BASICS|MODELQ|ATOMIC|intcff|abntab|eletab True pending
276 tabint.f TABINT SUBROUTINE False BASICS|MODELQ|ATOMIC|intcff False src/math/tabint.rs done
277 taufr1.f TAUFR1 SUBROUTINE False BASICS|MODELQ|ALIPAR|ITERAT|OPTDPT False src/math/taufr1.rs done
278 tdpini.f TDPINI SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR|ALIPAR GFREE0 False src/math/tdpini.rs done
279 temcor.f TEMCOR SUBROUTINE False BASICS|MODELQ|ARRAY1|ALIPAR|CUBCON WNSTOR|MEANOP|OPACF0|ELDENS|STEQEQ|CONVEC True pending
280 temper.f TEMPER SUBROUTINE False BASICS|MODELQ|ALIPAR|FACTRS|PRSAUX|FLXAUX WNSTOR|MEANOPT|TLOCAL|MEANOP|OPACF0|ELDENS|STEQEQ True pending
281 timing.f TIMING SUBROUTINE False True pending
282 tiopf.f TIOPF SUBROUTINE True False src/math/tiopf.rs done
283 tlocal.f TLOCAL SUBROUTINE False BASICS|MODELQ|FACTRS|FLXAUX QUARTC False pending
284 tlusty.f TLUSTY UNKNOWN False BASICS|ITERAT|ALIPAR TIMING True pending
285 topbas.f TOPBAS FUNCTION False TOPB True pending
286 traini.f TRAINI SUBROUTINE False BASICS|ATOMIC|MODELQ|ODFPAR False src/math/traini.rs done
287 tridag.f TRIDAG SUBROUTINE True False src/math/tridag.rs done
288 trmder.f TRMDER SUBROUTINE False BASICS|terden|adiaba|derdif ELDENS False pending
289 trmdrt.f TRMDRT SUBROUTINE False BASICS|CC|CONVOUT|tdedge|tdflag PRSENT False pending
290 ubeta.f UBETA FUNCTION True LAGRAN False src/math/ubeta.rs done
291 vern16.f VERN16 FUNCTION True BASICS False src/math/vern16.rs done
292 vern18.f VERN18 FUNCTION True BASICS False src/math/vern18.rs done
293 vern20.f VERN20 FUNCTION True BASICS False src/math/vern20.rs done
294 vern26.f VERN26 FUNCTION True BASICS False src/math/vern26.rs done
295 verner.f VERNER FUNCTION False BASICS|ATOMIC QUIT False src/math/verner.rs done
296 visini.f VISINI SUBROUTINE False BASICS|ATOMIC|MODELQ|ITERAT True pending
297 voigt.f VOIGT FUNCTION True False src/math/voigt.rs done
298 voigte.f VOIGTE FUNCTION True False src/math/voigte.rs done
299 wn.f WN FUNCTION True BASICS False src/math/wn.rs done
300 wnstor.f WNSTOR SUBROUTINE False BASICS|ATOMIC|MODELQ False src/math/wnstor.rs done
301 xenini.f XENINI SUBROUTINE False BASICS|MODELQ True pending
302 xk2dop.f XK2DOP FUNCTION True False src/math/xk2dop.rs done
303 yint.f YINT FUNCTION True False src/math/interpolate.rs done
304 ylintp.f YLINTP FUNCTION True False src/math/ylintp.rs done
305 zmrho.f ZMRHO SUBROUTINE False BASICS|MODELQ False src/math/zmrho.rs done
+77
View File
@@ -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
```
+670
View File
@@ -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-indexedRust 中直接用导致索引偏移
### 解决方案
```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. 隐式的外部函数引用