This commit is contained in:
fmq
2026-03-21 09:12:18 +08:00
parent 8e21522d2d
commit f286ddacfe
56 changed files with 13755 additions and 330 deletions
+86 -2
View File
@@ -113,6 +113,58 @@ pub struct FixAlp {
pub aapp: Vec<Vec<Vec<f64>>>,
pub capp: Vec<Vec<Vec<f64>>>,
// ALI 算子 (MDEPTH)
/// 当前深度 ALI 算子
pub ali1: Vec<f64>,
/// 前一深度 ALI 算子
pub alim1: Vec<f64>,
/// 后一深度 ALI 算子
pub alip1: Vec<f64>,
/// ALI H 算子
pub alih1: Vec<f64>,
// 发射/吸收系数导数 (MDEPTH)
/// 发射系数 T 导数
pub demt1: Vec<f64>,
/// 发射系数 N 导数
pub demn1: Vec<f64>,
/// 吸收系数 T 导数
pub dabt1: Vec<f64>,
/// 吸收系数 N 导数
pub dabn1: Vec<f64>,
// 能级导数 (MLVEXP × MDEPTH)
/// 发射系数能级导数
pub demp1: Vec<Vec<f64>>,
/// 吸收系数能级导数
pub dabp1: Vec<Vec<f64>>,
// 源函数导数 (MDEPTH)
/// 源函数 T 导数
pub dsfdt: Vec<f64>,
/// 源函数 N 导数
pub dsfdn: Vec<f64>,
/// 前深度源函数 T 导数
pub dsfdtm: Vec<f64>,
/// 前深度源函数 N 导数
pub dsfdnm: Vec<f64>,
/// 后深度源函数 T 导数
pub dsfdtp: Vec<f64>,
/// 后深度源函数 N 导数
pub dsfdnp: Vec<f64>,
// 源函数能级导数 (MLVEXP × MDEPTH)
/// 源函数能级导数
pub dsfdp: Vec<Vec<f64>>,
/// 前深度源函数能级导数
pub dsfdpm: Vec<Vec<f64>>,
/// 后深度源函数能级导数
pub dsfdpp: Vec<Vec<f64>>,
// 冷却率积分 (MDEPTH)
/// 冷却率积分
pub fcooli: Vec<f64>,
// 控制参数
pub qtlas: f64,
pub ifali: i32,
@@ -186,8 +238,8 @@ impl Default for FixAlp {
ehen: vec![0.0; MDEPTH],
eret: vec![0.0; MDEPTH],
eren: vec![0.0; MDEPTH],
ehep: vec![vec![0.0; MDEPTH]; MLVEX3],
erep: vec![vec![0.0; MDEPTH]; MLVEX3],
ehep: vec![vec![0.0; MDEPTH]; MLVEXP],
erep: vec![vec![0.0; MDEPTH]; MLVEXP],
apt: vec![vec![0.0; MDEPTH]; MLVEXP],
apn: vec![vec![0.0; MDEPTH]; MLVEXP],
@@ -200,6 +252,38 @@ impl Default for FixAlp {
aapp: vec![vec![vec![0.0; MDEPTH]; MLVEX3]; MLVEX3],
capp: vec![vec![vec![0.0; MDEPTH]; MLVEX3]; MLVEX3],
// ALI 算子
ali1: vec![0.0; MDEPTH],
alim1: vec![0.0; MDEPTH],
alip1: vec![0.0; MDEPTH],
alih1: vec![0.0; MDEPTH],
// 发射/吸收系数导数
demt1: vec![0.0; MDEPTH],
demn1: vec![0.0; MDEPTH],
dabt1: vec![0.0; MDEPTH],
dabn1: vec![0.0; MDEPTH],
// 能级导数
demp1: vec![vec![0.0; MDEPTH]; MLVEXP],
dabp1: vec![vec![0.0; MDEPTH]; MLVEXP],
// 源函数导数
dsfdt: vec![0.0; MDEPTH],
dsfdn: vec![0.0; MDEPTH],
dsfdtm: vec![0.0; MDEPTH],
dsfdnm: vec![0.0; MDEPTH],
dsfdtp: vec![0.0; MDEPTH],
dsfdnp: vec![0.0; MDEPTH],
// 源函数能级导数
dsfdp: vec![vec![0.0; MDEPTH]; MLVEXP],
dsfdpm: vec![vec![0.0; MDEPTH]; MLVEXP],
dsfdpp: vec![vec![0.0; MDEPTH]; MLVEXP],
// 冷却率积分
fcooli: vec![0.0; MDEPTH],
qtlas: 0.0,
ifali: 0,
ifpopr: 0,
+8
View File
@@ -48,6 +48,14 @@ pub const MVOIGT: usize = 8080;
pub const MZZ: usize = 10;
/// 最高氢能级
pub const NLMX: usize = 80;
/// 最大氢谱线数
pub const MLINH: usize = 78;
/// 氢线温度点数
pub const MHT: usize = 7;
/// 氢线电子密度点数
pub const MHE: usize = 20;
/// 氢线波长点数
pub const MHWL: usize = 90;
/// 对角预处理能级数
pub const MLEVE3: usize = 1;
/// 对角/三对角操作能级数
+810
View File
@@ -427,6 +427,796 @@ impl LevAdd {
}
}
// ============================================================================
// WMCOMP - 氢能级权重和占据概率
// ============================================================================
/// 氢能级权重和占据概率。
/// 对应 COMMON /WMCOMP/
#[derive(Debug, Clone)]
pub struct WmComp {
/// 氢能级占据概率积分 (NLMX × 深度)
pub wnhint: Vec<Vec<f64>>,
/// He II 能级占据概率 (NLMX × 深度)
pub wnheii: Vec<Vec<f64>>,
/// 能级权重 (能级 × 深度)
pub wop: Vec<Vec<f64>>,
/// 能级权重标志 (负值表示合并能级)
pub ifwop: Vec<i32>,
}
impl Default for WmComp {
fn default() -> Self {
Self {
wnhint: vec![vec![0.0; MDEPTH]; NLMX],
wnheii: vec![vec![0.0; MDEPTH]; NLMX],
wop: vec![vec![0.0; MDEPTH]; MLEVEL],
ifwop: vec![0; MLEVEL],
}
}
}
// ============================================================================
// MRGPAR - 合并能级参数
// ============================================================================
/// 合并能级参数 (用于高激发态氢能级合并处理)。
/// 对应 COMMON /MRGPAR/
#[derive(Debug, Clone)]
pub struct MrgPar {
/// 合并能级截面参数 (MMER)
pub sgm0: Vec<f64>,
/// 频率参考 FRCH (MMER)
pub frch: Vec<f64>,
/// 截面扩展 (MMER × 深度)
pub sgext1: Vec<Vec<f64>>,
/// Gaunt 因子 (MMER × 深度)
pub gmer: Vec<Vec<f64>>,
/// 截面求和 (NLMX × MMER × 深度) - 3D 数组
pub sgmsum: Vec<Vec<Vec<f64>>>,
/// 截面求和导数 (NLMX × MMER × 深度) - 3D 数组
pub sgmsud: Vec<Vec<Vec<f64>>>,
/// Gaunt 因子 (MMER × 深度)
pub sgmg: Vec<Vec<f64>>,
/// 能级到合并能级的映射 (MLEVEL)
pub imrg: Vec<i32>,
/// 合并能级到能级的映射 (MMER)
pub iimer: Vec<i32>,
}
impl Default for MrgPar {
fn default() -> Self {
Self {
sgm0: vec![0.0; MMER],
frch: vec![0.0; MMER],
sgext1: vec![vec![0.0; MDEPTH]; MMER],
gmer: vec![vec![0.0; MDEPTH]; MMER],
// 3D 数组: [nlmx][mmer][depth]
sgmsum: vec![vec![vec![0.0; MDEPTH]; MMER]; NLMX],
sgmsud: vec![vec![vec![0.0; MDEPTH]; MMER]; NLMX],
sgmg: vec![vec![0.0; MDEPTH]; MMER],
imrg: vec![0; MLEVEL],
iimer: vec![0; MMER],
}
}
}
// ============================================================================
// FREAUX - 频率辅助数组
// ============================================================================
/// 频率辅助数组。
/// 对应 COMMON /FREAUX/
#[derive(Debug, Clone)]
pub struct FreAux {
/// Wien 定律系数 W0E = h*nu/kT 在阈值处
pub w0e: Vec<f64>,
/// Planck 函数系数 BNUE = 2h*nu³/c²
pub bnue: Vec<f64>,
/// 连续谱权重
pub wc: Vec<f64>,
/// 跃迁到连续谱的索引
pub ijtc: Vec<i32>,
/// ALI 频率索引
pub ijali: Vec<i32>,
/// 显式频率索引
pub ijex: Vec<i32>,
/// 频率索引
pub ijfr: Vec<i32>,
}
impl Default for FreAux {
fn default() -> Self {
Self {
w0e: vec![0.0; MFREQ],
bnue: vec![0.0; MFREQ],
wc: vec![0.0; MFREQ],
ijtc: vec![0; MTRANS],
ijali: vec![0; MFREQ],
ijex: vec![0; MFREQ],
ijfr: vec![0; MFREQ],
}
}
}
// ============================================================================
// INVINT - 逆整数幂数组
// ============================================================================
/// 逆整数幂数组。
/// 对应 COMMON /INVINT/
#[derive(Debug, Clone)]
pub struct InvInt {
/// 1/n² (n = 1..NLMX)
pub xi2: Vec<f64>,
/// 1/n³ (n = 1..NLMX)
pub xi3: Vec<f64>,
}
impl Default for InvInt {
fn default() -> Self {
let mut xi2 = vec![0.0; NLMX];
let mut xi3 = vec![0.0; NLMX];
for i in 1..=NLMX {
let x = i as f64;
xi2[i - 1] = 1.0 / (x * x);
xi3[i - 1] = xi2[i - 1] / x;
}
Self { xi2, xi3 }
}
}
// ============================================================================
// REPART - 辐射等效扩散参数
// ============================================================================
/// 辐射等效扩散参数。
/// 对应 COMMON /REPART/
#[derive(Debug, Clone)]
pub struct RePart {
/// 辐射等效积分
pub reint: Vec<f64>,
/// 辐射扩散因子
pub redif: Vec<f64>,
/// τ 分割点
pub taudiv: f64,
/// 最后深度索引
pub idlst: i32,
}
impl Default for RePart {
fn default() -> Self {
Self {
reint: vec![0.0; MDEPTH],
redif: vec![0.0; MDEPTH],
taudiv: 0.0,
idlst: 0,
}
}
}
// ============================================================================
// TURBUL - 湍流速度
// ============================================================================
/// 湍流速度参数。
/// 对应 COMMON /TURBUL/
#[derive(Debug, Clone)]
pub struct Turbul {
/// 湍流速度 VTURB(MDEPTH)
pub vturb: Vec<f64>,
/// 湍流速度平方 VTURBS(MDEPTH)
pub vturbs: Vec<f64>,
/// 湍流速度参数
pub vtb: f64,
/// 湍流标志
pub ipturb: i32,
}
impl Default for Turbul {
fn default() -> Self {
Self {
vturb: vec![0.0; MDEPTH],
vturbs: vec![0.0; MDEPTH],
vtb: 0.0,
ipturb: 0,
}
}
}
// ============================================================================
// STRAUX - Stark 轮廓辅助变量
// ============================================================================
/// Stark 轮廓辅助变量。
/// 对应 COMMON /STRAUX/
#[derive(Debug, Clone)]
pub struct StrAux {
/// 谱线展宽参数
pub xk0: Vec<f64>,
/// 当前谱线展宽
pub xk: f64,
/// Doppler 展宽
pub dbeta: f64,
/// Doppler 宽度
pub betad: f64,
/// 辅助参数 A
pub adh: f64,
/// 分割点
pub divh: f64,
}
impl Default for StrAux {
fn default() -> Self {
Self {
xk0: vec![0.0; MLINH],
xk: 0.0,
dbeta: 0.0,
betad: 0.0,
adh: 0.0,
divh: 0.0,
}
}
}
// ============================================================================
// PRESSR - 压力相关数组
// ============================================================================
/// 压力相关数组。
/// 对应 COMMON /PRESSR/
#[derive(Debug, Clone)]
pub struct PressR {
/// 总压力
pub ptotal: Vec<f64>,
/// 气体压力
pub pgs: Vec<f64>,
/// 辐射压力 (总)
pub pradt: Vec<f64>,
/// 辐射压力 (吸收)
pub prada: Vec<f64>,
}
impl Default for PressR {
fn default() -> Self {
Self {
ptotal: vec![0.0; MDEPTH],
pgs: vec![0.0; MDEPTH],
pradt: vec![0.0; MDEPTH],
prada: vec![0.0; MDEPTH],
}
}
}
// ============================================================================
// DWNPAR - 溶解分数参数
// ============================================================================
/// 溶解分数辅助参数。
/// 对应 COMMON /DWNPAR/
#[derive(Debug, Clone)]
pub struct DwnPar {
/// 电子密度的 2/3 次幂
pub elec23: Vec<f64>,
/// 修正因子
pub acor: Vec<f64>,
/// Z³ (Z = 1..MZZ)
pub z3: Vec<f64>,
/// 溶解分数参数 1
pub dwc1: Vec<Vec<f64>>,
/// 溶解分数参数 2
pub dwc2: Vec<f64>,
/// 溶解分数 (MMCDW × MDEPTH)
pub dwf1: Vec<Vec<f64>>,
/// 跃迁到溶解分数的映射 (MTRANS)
pub mcdw: Vec<i32>,
/// 溶解分数到跃迁的映射 (MMCDW)
pub itrcdw: Vec<i32>,
/// 溶解分数计数
pub ncdw: i32,
}
impl Default for DwnPar {
fn default() -> Self {
Self {
elec23: vec![0.0; MDEPTH],
acor: vec![0.0; MDEPTH],
z3: vec![0.0; MZZ],
dwc1: vec![vec![0.0; MDEPTH]; MZZ],
dwc2: vec![0.0; MDEPTH],
dwf1: vec![vec![0.0; MDEPTH]; MMCDW],
mcdw: vec![0; MTRANS],
itrcdw: vec![0; MMCDW],
ncdw: 0,
}
}
}
// ============================================================================
// LINOVR - 谱线叠加
// ============================================================================
/// 谱线叠加参数。
/// 对应 COMMON /LINOVR/
#[derive(Debug, Clone)]
pub struct LinOvr {
/// 每个频率点的谱线数
pub nitj: Vec<i32>,
/// 每个频率点的跃迁索引
pub ijlin: Vec<i32>,
/// 谱线跃迁索引 (MITJ × MFREQ)
pub itrlin: Vec<Vec<i32>>,
}
impl Default for LinOvr {
fn default() -> Self {
Self {
nitj: vec![0; MFREQ],
ijlin: vec![0; MFREQ],
itrlin: vec![vec![0; MFREQ]; MITJ],
}
}
}
// ============================================================================
// LINFRQ - 谱线频率
// ============================================================================
/// 谱线频率参数。
/// 对应 COMMON /LINFRQ/
#[derive(Debug, Clone)]
pub struct LinFrq {
/// 每个频率点的谱线数
pub nlines: Vec<i32>,
}
impl Default for LinFrq {
fn default() -> Self {
Self {
nlines: vec![0; MFREQ],
}
}
}
// ============================================================================
// COMPIF - 计算标志
// ============================================================================
/// 计算标志参数。
/// 对应 COMMON /COMPIF/
#[derive(Debug, Clone)]
pub struct CompIf {
/// 经验线标志 (MTRANS)
pub linexp: Vec<bool>,
}
impl Default for CompIf {
fn default() -> Self {
Self {
linexp: vec![false; MTRANS],
}
}
}
// ============================================================================
// CUROPA - 当前不透明度
// ============================================================================
/// 当前不透明度参数。
/// 对应 COMMON /CUROPA/
#[derive(Debug, Clone)]
pub struct CurOpa {
/// 吸收系数
pub abso1: Vec<f64>,
/// 发射系数
pub emis1: Vec<f64>,
/// 散射系数
pub scat1: Vec<f64>,
/// 总吸收
pub absot: Vec<f64>,
/// 显式频率吸收
pub absoe1: Vec<f64>,
/// 电子发射
pub emel1: Vec<f64>,
/// 谱线吸收
pub abso1l: Vec<f64>,
/// 谱线发射
pub emis1l: Vec<f64>,
/// 不透明度导数 (压力)
pub absopr: Vec<f64>,
/// 发射导数 (压力)
pub emispr: Vec<f64>,
}
impl Default for CurOpa {
fn default() -> Self {
Self {
abso1: vec![0.0; MDEPTH],
emis1: vec![0.0; MDEPTH],
scat1: vec![0.0; MDEPTH],
absot: vec![0.0; MDEPTH],
absoe1: vec![0.0; MFREX],
emel1: vec![0.0; MDEPTH],
abso1l: vec![0.0; MDEPTH],
emis1l: vec![0.0; MDEPTH],
absopr: vec![0.0; MDEPTH],
emispr: vec![0.0; MDEPTH],
}
}
}
// ============================================================================
// 氢线 Stark 展宽表格 (HYDPRF)
// ============================================================================
/// 氢线 Stark 展宽表格参数。
/// 对应 COMMON /HYDPRF/
#[derive(Debug, Clone)]
pub struct HydPrf {
/// 氢线轮廓 PRFHYD(MLINH,MHWL,MHT,MHE)
/// 注意:Fortran 是列优先,这里用 1D 数组模拟 4D
/// 索引:prfhyd[iline + mlinh*iwl + mlinh*mhwl*it + mlinh*mhwl*mht*ie]
pub prfhyd: Vec<f64>,
/// 氢线波长 WLHYD(MLINH,MHWL)
pub wlhyd: Vec<f64>,
/// 波长网格 WLH(MHWL,MLINH)
pub wlh: Vec<f64>,
/// 温度网格 XTLEM(MHT,MLINH)
pub xtlem: Vec<f64>,
/// 电子密度网格 XNELEM(MHE,MLINH)
pub xnelem: Vec<f64>,
/// 每条线的波长点数 NWLHYD(MLINH)
pub nwlhyd: Vec<i32>,
/// 波长点数 NWLH(MLINH)
pub nwlh: Vec<i32>,
/// 温度点数 NTH(MLINH)
pub nth: Vec<i32>,
/// 电子密度点数 NEH(MLINH)
pub neh: Vec<i32>,
/// 线索引 ILINH(4,22)
pub ilinh: Vec<i32>,
/// 氢线表格读取标志
pub ihydpr: i32,
}
impl Default for HydPrf {
fn default() -> Self {
use super::constants::{MHT, MHE, MHWL, MLINH};
Self {
// PRFHYD: MLINH * MHWL * MHT * MHE = 78 * 90 * 7 * 20 = 982,800
prfhyd: vec![0.0; MLINH * MHWL * MHT * MHE],
// WLHYD: MLINH * MHWL = 78 * 90 = 7,020
wlhyd: vec![0.0; MLINH * MHWL],
// WLH: MHWL * MLINH = 90 * 78 = 7,020
wlh: vec![0.0; MHWL * MLINH],
// XTLEM: MHT * MLINH = 7 * 78 = 546
xtlem: vec![0.0; MHT * MLINH],
// XNELEM: MHE * MLINH = 20 * 78 = 1,560
xnelem: vec![0.0; MHE * MLINH],
nwlhyd: vec![0; MLINH],
nwlh: vec![0; MLINH],
nth: vec![0; MLINH],
neh: vec![0; MLINH],
// ILINH: 4 * 22 = 88
ilinh: vec![0; 88],
ihydpr: 0,
}
}
}
impl HydPrf {
/// 获取 PRFHYD 值 (4D 数组访问)
///
/// # 参数
/// - `iline`: 谱线索引 (0-indexed)
/// - `iwl`: 波长索引 (0-indexed)
/// - `it`: 温度索引 (0-indexed)
/// - `ie`: 电子密度索引 (0-indexed)
pub fn get_prfhyd(&self, iline: usize, iwl: usize, it: usize, ie: usize) -> f64 {
use super::constants::{MHT, MHWL, MLINH};
let idx = iline + MLINH * iwl + MLINH * MHWL * it + MLINH * MHWL * MHT * ie;
self.prfhyd[idx]
}
/// 设置 PRFHYD 值 (4D 数组访问)
pub fn set_prfhyd(&mut self, iline: usize, iwl: usize, it: usize, ie: usize, value: f64) {
use super::constants::{MHT, MHWL, MLINH};
let idx = iline + MLINH * iwl + MLINH * MHWL * it + MLINH * MHWL * MHT * ie;
self.prfhyd[idx] = value;
}
/// 获取 WLHYD 值 (2D 数组访问)
pub fn get_wlhyd(&self, iline: usize, iwl: usize) -> f64 {
use super::constants::MLINH;
self.wlhyd[iline + MLINH * iwl]
}
/// 获取 WLH 值 (2D 数组访问,注意 Fortran 索引顺序)
/// Fortran: WLH(MHWL,MLINH) -> Rust: wlh[iwl + MHWL*iline]
pub fn get_wlh(&self, iwl: usize, iline: usize) -> f64 {
use super::constants::MHWL;
self.wlh[iwl + MHWL * iline]
}
/// 获取 XTLEM 值 (2D 数组访问)
/// Fortran: XTLEM(MHT,MLINH) -> Rust: xtlem[it + MHT*iline]
pub fn get_xtlem(&self, it: usize, iline: usize) -> f64 {
use super::constants::MHT;
self.xtlem[it + MHT * iline]
}
/// 获取 XNELEM 值 (2D 数组访问)
/// Fortran: XNELEM(MHE,MLINH) -> Rust: xnelem[ie + MHE*iline]
pub fn get_xnelem(&self, ie: usize, iline: usize) -> f64 {
use super::constants::MHE;
self.xnelem[ie + MHE * iline]
}
/// 设置 XTLEM 值 (2D 数组访问)
pub fn set_xtlem(&mut self, it: usize, iline: usize, value: f64) {
use super::constants::MHT;
self.xtlem[it + MHT * iline] = value;
}
/// 设置 XNELEM 值 (2D 数组访问)
pub fn set_xnelem(&mut self, ie: usize, iline: usize, value: f64) {
use super::constants::MHE;
self.xnelem[ie + MHE * iline] = value;
}
}
// ============================================================================
// XENPRF - Xenomorph 谱线轮廓表
// ============================================================================
/// Xenomorph 氢线轮廓表。
/// 对应 COMMON /XENPRF/
#[derive(Debug, Clone)]
pub struct XenPrf {
/// 轮廓表 PRFXB(MLINH,MHWL,MHT,MHE) - 蓝翼
pub prfxb: Vec<f64>,
/// 轮廓表 PRFXR(MLINH,MHWL,MHT,MHE) - 红翼
pub prfxr: Vec<f64>,
/// 波长表 ALXEN(MLINH,MHWL)
pub alxen: Vec<f64>,
/// 温度网格 XTXEN(MHT,MLINH)
pub xtxen: Vec<f64>,
/// 电子密度网格 XNEXEN(MHE,MLINH)
pub xnexen: Vec<f64>,
/// 电子密度最小值
pub xnemin: f64,
/// 每条线的波长点数 NWLXEN(MLINH)
pub nwlxen: Vec<i32>,
/// 每条线的温度点数 NTHXEN(MLINH)
pub nthxen: Vec<i32>,
/// 每条线的电子密度点数 NEHXEN(MLINH)
pub nehxen: Vec<i32>,
/// 线索引 ILXEN(4,22)
pub ilxen: Vec<i32>,
/// 氢线标志
pub ihxenb: i32,
}
impl Default for XenPrf {
fn default() -> Self {
use super::constants::{MHT, MHE, MHWL, MLINH};
Self {
// PRFXB, PRFXR: MLINH * MHWL * MHT * MHE = 78 * 90 * 7 * 20 = 982,800
prfxb: vec![0.0; MLINH * MHWL * MHT * MHE],
prfxr: vec![0.0; MLINH * MHWL * MHT * MHE],
// ALXEN: MLINH * MHWL = 78 * 90 = 7,020
alxen: vec![0.0; MLINH * MHWL],
// XTXEN: MHT * MLINH = 7 * 78 = 546
xtxen: vec![0.0; MHT * MLINH],
// XNEXEN: MHE * MLINH = 20 * 78 = 1,560
xnexen: vec![0.0; MHE * MLINH],
xnemin: 0.0,
nwlxen: vec![0; MLINH],
nthxen: vec![0; MLINH],
nehxen: vec![0; MLINH],
// ILXEN: 4 * 22 = 88
ilxen: vec![0; 88],
ihxenb: 0,
}
}
}
impl XenPrf {
/// 获取 PRFXB 值 (4D 数组访问)
pub fn get_prfxb(&self, iline: usize, iwl: usize, it: usize, ie: usize) -> f64 {
use super::constants::{MHT, MHWL, MLINH};
let idx = iline + MLINH * iwl + MLINH * MHWL * it + MLINH * MHWL * MHT * ie;
self.prfxb[idx]
}
/// 设置 PRFXB 值 (4D 数组访问)
pub fn set_prfxb(&mut self, iline: usize, iwl: usize, it: usize, ie: usize, value: f64) {
use super::constants::{MHT, MHWL, MLINH};
let idx = iline + MLINH * iwl + MLINH * MHWL * it + MLINH * MHWL * MHT * ie;
self.prfxb[idx] = value;
}
/// 获取 PRFXR 值 (4D 数组访问)
pub fn get_prfxr(&self, iline: usize, iwl: usize, it: usize, ie: usize) -> f64 {
use super::constants::{MHT, MHWL, MLINH};
let idx = iline + MLINH * iwl + MLINH * MHWL * it + MLINH * MHWL * MHT * ie;
self.prfxr[idx]
}
/// 设置 PRFXR 值 (4D 数组访问)
pub fn set_prfxr(&mut self, iline: usize, iwl: usize, it: usize, ie: usize, value: f64) {
use super::constants::{MHT, MHWL, MLINH};
let idx = iline + MLINH * iwl + MLINH * MHWL * it + MLINH * MHWL * MHT * ie;
self.prfxr[idx] = value;
}
/// 获取 XTXEN 值 (温度网格, 2D)
pub fn get_xtxen(&self, it: usize, iline: usize) -> f64 {
use super::constants::MHT;
self.xtxen[it + MHT * iline]
}
/// 获取 XNEXEN 值 (电子密度网格, 2D)
pub fn get_xnexen(&self, ie: usize, iline: usize) -> f64 {
use super::constants::MHE;
self.xnexen[ie + MHE * iline]
}
}
// ============================================================================
// RAYSCT - Rayleigh 散射截面
// ============================================================================
/// Rayleigh 散射截面参数。
/// 对应 COMMON /RAYSCT/
#[derive(Debug, Clone)]
pub struct RaySct {
/// 氢 Rayleigh 散射截面 (MFREQ)
pub rcs: Vec<f64>,
/// 氦 Rayleigh 散射截面 (MFREQ)
pub rche: Vec<f64>,
/// H2 Rayleigh 散射截面 (MFREQ)
pub rch2: Vec<f64>,
}
impl Default for RaySct {
fn default() -> Self {
Self {
rcs: vec![0.0; MFREQ],
rche: vec![0.0; MFREQ],
rch2: vec![0.0; MFREQ],
}
}
}
// ============================================================================
// EOSPAR - 状态方程粒子数密度
// ============================================================================
/// 状态方程粒子数密度参数。
/// 对应 COMMON /eospar/
#[derive(Debug, Clone)]
pub struct EosPar {
/// 分子粒子数密度 (600 × MDEPTH)
pub anmol: Vec<Vec<f64>>,
/// 原子粒子数密度 (100 × MDEPTH)
pub anato: Vec<Vec<f64>>,
/// 离子粒子数密度 (100 × MDEPTH)
pub anion: Vec<Vec<f64>>,
}
impl Default for EosPar {
fn default() -> Self {
Self {
anmol: vec![vec![0.0; MDEPTH]; 600],
anato: vec![vec![0.0; MDEPTH]; 100],
anion: vec![vec![0.0; MDEPTH]; 100],
}
}
}
// ============================================================================
// SURFAC - 表面辐射通量
// ============================================================================
/// 表面辐射通量参数。
/// 对应 COMMON /SURFAC/
#[derive(Debug, Clone)]
pub struct Surfac {
/// 表面辐射通量 (MFREQ)
pub flux: Vec<f64>,
/// 频率相关权重因子 (MFREQ)
pub fh: Vec<f64>,
/// 表面辐射强度 Q0 (MFREQ)
pub q0: Vec<f64>,
/// 表面辐射强度 UU0 (MFREQ)
pub uu0: Vec<f64>,
}
impl Default for Surfac {
fn default() -> Self {
Self {
flux: vec![0.0; MFREQ],
fh: vec![0.0; MFREQ],
q0: vec![0.0; MFREQ],
uu0: vec![0.0; MFREQ],
}
}
}
// ============================================================================
// CURRNT - 当前深度辐射参数
// ============================================================================
/// 当前深度辐射参数。
/// 对应 COMMON /CURRNT/
#[derive(Debug, Clone)]
pub struct Currnt {
/// 普朗克函数权重 (MDEPTH)
pub xkf: Vec<f64>,
/// 1 - XKF (MDEPTH)
pub xkf1: Vec<f64>,
/// 普朗克函数 × XKF (MDEPTH)
pub xkfb: Vec<f64>,
}
impl Default for Currnt {
fn default() -> Self {
Self {
xkf: vec![0.0; MDEPTH],
xkf1: vec![0.0; MDEPTH],
xkfb: vec![0.0; MDEPTH],
}
}
}
// ============================================================================
// TOTFLX - 总辐射通量
// ============================================================================
/// 总辐射通量参数。
/// 对应 COMMON /TOTFLX/
#[derive(Debug, Clone)]
pub struct TotFlx {
/// 总辐射通量 (MDEPTH)
pub fltot: Vec<f64>,
/// 固定辐射通量 (MDEPTH)
pub flfix: Vec<f64>,
/// 显式频率辐射通量 (MDEPTH)
pub flexp: Vec<f64>,
/// 冷却率 (MDEPTH)
pub fcool: Vec<f64>,
/// 冷却率积分 (MDEPTH)
pub fcooli: Vec<f64>,
/// 辐射通量红翼 (MDEPTH)
pub flrd: Vec<f64>,
/// 辐射压力 (MDEPTH)
pub fprad: Vec<f64>,
/// 辐射梯度 (MDEPTH)
pub grad: Vec<f64>,
/// 辐射压力导数 (MDEPTH)
pub fprd: Vec<f64>,
/// 频率相关辐射梯度 (MFREQ × MDEPTH)
pub gradf: Vec<Vec<f64>>,
}
impl Default for TotFlx {
fn default() -> Self {
Self {
fltot: vec![0.0; MDEPTH],
flfix: vec![0.0; MDEPTH],
flexp: vec![0.0; MDEPTH],
fcool: vec![0.0; MDEPTH],
fcooli: vec![0.0; MDEPTH],
flrd: vec![0.0; MDEPTH],
fprad: vec![0.0; MDEPTH],
grad: vec![0.0; MDEPTH],
fprd: vec![0.0; MDEPTH],
gradf: vec![vec![0.0; MDEPTH]; MFREQ],
}
}
}
// ============================================================================
// 综合模型状态
// ============================================================================
@@ -444,6 +1234,26 @@ pub struct ModelState {
pub phoexp: PhoExp,
pub obfpar: ObfPar,
pub levadd: LevAdd,
pub wmcomp: WmComp,
pub mrgpar: MrgPar,
pub invint: InvInt,
pub freaux: FreAux,
pub repart: RePart,
pub turbul: Turbul,
pub straux: StrAux,
pub pressr: PressR,
pub dwnpar: DwnPar,
pub linovr: LinOvr,
pub linfrq: LinFrq,
pub compif: CompIf,
pub curopa: CurOpa,
pub hydprf: HydPrf,
pub xenprf: XenPrf,
pub raysct: RaySct,
pub eospar: EosPar,
pub surfac: Surfac,
pub currnt: Currnt,
pub totflx: TotFlx,
}
impl ModelState {