重构2
This commit is contained in:
+86
-2
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
/// 对角/三对角操作能级数
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user