tlusty重构完成

This commit is contained in:
Asfmq 2026-03-25 13:31:23 +08:00
parent b71930cf8e
commit f08c328b70
342 changed files with 992 additions and 670 deletions

View File

@ -5,23 +5,14 @@
//!
//! # 模块结构
//!
//! - `state`: 状态管理 (COMMON 块转换)
//! - `constants`: 物理常数和维度参数
//! - `config`: 运行时配置
//! - `atomic`: 原子/离子/能级数据
//! - `model`: 大气模型状态
//! - `arrays`: 大型计算数组
//! - `io`: Fortran I/O 兼容层
//! - `reader`: Fortran 格式输入读取
//! - `writer`: Fortran 格式输出
//! - `model`: 模型文件 (fort.7/8)
//! - `input`: 主输入 (fort.5)
//! - `math`: 数学工具函数
//! - `data`: 静态数据数组
//! - `physics`: 物理计算模块
//! - `tlusty`: TLUSTY 专用模块
//! - `data`: 静态数据数组
//! - `io`: I/O 模块
//! - `math`: 数学函数
//! - `physics`: 物理计算
//! - `state`: 状态管理 (COMMON 块)
//! - `synspec`: SYNSPEC 专用模块
//! - `math`: 数学函数
pub mod data;
pub mod io;
pub mod math;
pub mod physics;
pub mod state;
pub mod tlusty;
pub mod synspec;

View File

@ -6,9 +6,9 @@
//!
//! 设置光致电离截面数组,用于辐射转移计算。
use super::sigk::{sigk, SigkParams};
use crate::state::atomic::AtomicData;
use crate::state::constants::{MCROSS, MFREQ};
use crate::tlusty::math::sigk::{sigk, SigkParams};
use crate::tlusty::state::atomic::AtomicData;
use crate::tlusty::state::constants::{MCROSS, MFREQ};
// ============================================================================
// 常量
@ -115,7 +115,7 @@ pub fn croset(params: &CrosetParams) -> Vec<Vec<f64>> {
itr: it,
mode: 0,
atomic,
opdata: &super::topbas::OpData::default(),
opdata: &crate::tlusty::math::topbas::OpData::default(),
};
cross[it][ij] = sigk(&sigk_params);
}
@ -128,7 +128,7 @@ pub fn croset(params: &CrosetParams) -> Vec<Vec<f64>> {
itr: it,
mode: 1,
atomic,
opdata: &super::topbas::OpData::default(),
opdata: &crate::tlusty::math::topbas::OpData::default(),
};
cross[it][ij] = sigk(&sigk_params);
@ -226,7 +226,7 @@ pub fn crosew(params: &CrosewParams) -> Vec<Vec<f64>> {
itr: it,
mode: 0,
atomic,
opdata: &super::topbas::OpData::default(),
opdata: &crate::tlusty::math::topbas::OpData::default(),
};
cross[it][ij] = sigk(&sigk_params);
}
@ -239,7 +239,7 @@ pub fn crosew(params: &CrosewParams) -> Vec<Vec<f64>> {
itr: it,
mode: 1,
atomic,
opdata: &super::topbas::OpData::default(),
opdata: &crate::tlusty::math::topbas::OpData::default(),
};
cross[it][ij] = sigk(&sigk_params);
@ -257,7 +257,7 @@ pub fn crosew(params: &CrosewParams) -> Vec<Vec<f64>> {
#[cfg(test)]
mod tests {
use super::*;
use crate::state::atomic::AtomicData;
use crate::tlusty::state::atomic::AtomicData;
fn create_test_atomic() -> AtomicData {
let mut atomic = AtomicData::new();

59
src/synspec/math/mod.rs Normal file
View File

@ -0,0 +1,59 @@
//! SYNSPEC 数学工具函数。
//!
//! 重构自 SYNSPEC Fortran 代码。
mod count_words;
mod crosew;
mod divhe2;
mod eps;
mod extprf;
mod feautr;
mod gamhe;
mod griem;
mod he2sew;
mod heset;
mod hylset;
mod inibla;
mod iniblm;
mod intrp;
mod ispec;
mod molop;
mod partdv;
mod phe2;
mod phtion;
mod phtx;
mod pretab;
mod sffhmi_old;
mod sgmerg;
mod starkir;
mod tint;
mod voigtk;
mod wtot;
pub use count_words::count_words;
pub use crosew::{croset, crosew, CrosetParams, CrosewParams};
pub use divhe2::divhe2;
pub use eps::eps;
pub use extprf::extprf;
pub use feautr::{feautr, FeautrParams};
pub use gamhe::{gamhe, GamheData, GamheParams};
pub use griem::{griem, GriemParams};
pub use he2sew::{he2sew, He2WindowParams};
pub use heset::{heset, HesetInput, HesetOutput};
pub use hylset::{hylset, HylsetParams, HylsetOutput};
pub use inibla::{inibla, IniblaParams, IniblaOutput, compute_doppler_width, compute_vdw_width, compute_planck, CL, H, BOLK, BN, HK};
pub use iniblm::{iniblm, IniblmParams, IniblmOutput, compute_molecular_doppler_width, compute_molecular_planck};
pub use intrp::{intrp, intrp_to_vec};
pub use ispec::{ispec, PROFILE_VOIGT, PROFILE_HYDROGEN, PROFILE_HEI_4471, PROFILE_HEI_4388, PROFILE_HEI_4026};
pub use molop::{molop_pure, MolopConfig, MolopModelState, MolopFreqParams, MolLineData, MolModelState, MolopOutput};
pub use partdv::{partdv, partdv_with_params, PartdvParams};
pub use phe2::{phe2, Phe2Params, Phe2Output};
pub use phtion::{phtion, phtion_pure, PhtionParams, PhtionOutput, PhotcsData, MFRQ};
pub use phtx::{phtx, PhtxParams, PhtxOutput, PhtxState, LevelPhotoData, HhePhotoData};
pub use pretab::{pretab, VoigtTables};
pub use sffhmi_old::sffhmi_old;
pub use sgmerg::{sgmerg, sgmerg_pure, SgmergParams};
pub use starkir::starkir;
pub use tint::{tint, TintResult};
pub use voigtk::{voigtk, MVOI};
pub use wtot::{wtot, LINE_4471, LINE_4387, LINE_4026, LINE_4922};

View File

@ -4,7 +4,7 @@
//!
//! 计算给定深度点的总分子谱线不透明度 (ABLIN) 和发射率 (EMLIN)。
use super::voigtk::{voigtk, MVOI};
use crate::synspec::math::voigtk::{voigtk, MVOI};
/// 常量
const UN: f64 = 1.0;

View File

@ -4,7 +4,7 @@
//!
//! 计算详细光致电离的吸收和发射系数(从 READPH 读取的表格数据)。
use crate::state::constants::{HK, BN};
use crate::tlusty::state::constants::{HK, BN};
/// 光致电离截面数据(对应 COMMON/PHOTCS/
#[derive(Debug, Clone)]

View File

@ -6,7 +6,7 @@
//! 1. 能级光致电离NLTE 布居数)
//! 2. 氢/氦光致电离LTE 布居数)
use crate::state::constants::{HK, BN};
use crate::tlusty::state::constants::{HK, BN};
/// c3 常数hc/k [cm K]
const C3: f64 = 1.4387886;

View File

@ -7,7 +7,7 @@
//! - 最多 10 个 Doppler 宽度
//! - 共 MVOI=2001 个点
use crate::math::interp::interp;
use crate::tlusty::math::interp::interp;
/// Voigt 表步长 (每 Doppler 宽度的步数)
const VSTEPS: f64 = 200.0;
@ -67,9 +67,9 @@ impl VoigtTables {
/// 创建新的 Voigt 表 (未初始化)。
pub fn new() -> Self {
Self {
h0tab: vec![0.0; crate::state::MVOI],
h1tab: vec![0.0; crate::state::MVOI],
h2tab: vec![0.0; crate::state::MVOI],
h0tab: vec![0.0; crate::tlusty::state::MVOI],
h1tab: vec![0.0; crate::tlusty::state::MVOI],
h2tab: vec![0.0; crate::tlusty::state::MVOI],
}
}
@ -83,7 +83,7 @@ impl VoigtTables {
/// 3. 计算 H0TAB(i) = exp(-v²) (Gauss 轮廓)
/// 4. 计算 H2TAB(i) = H0TAB(i) * (1 - 2v²) (二阶导数)
pub fn compute(&mut self) {
let n = crate::state::MVOI;
let n = crate::tlusty::state::MVOI;
// 准备插值输入
let mut x = TABVI.to_vec();
@ -133,9 +133,9 @@ mod tests {
let tables = pretab();
// 检查数组大小
assert_eq!(tables.h0tab.len(), crate::state::MVOI);
assert_eq!(tables.h1tab.len(), crate::state::MVOI);
assert_eq!(tables.h2tab.len(), crate::state::MVOI);
assert_eq!(tables.h0tab.len(), crate::tlusty::state::MVOI);
assert_eq!(tables.h1tab.len(), crate::tlusty::state::MVOI);
assert_eq!(tables.h2tab.len(), crate::tlusty::state::MVOI);
// H0TAB 在 v=0 时应为 1 (exp(0) = 1)
assert_relative_eq!(tables.h0tab[0], 1.0, epsilon = 1e-15);
@ -192,8 +192,8 @@ mod tests {
#[test]
fn test_voigt_tables_default() {
let tables = VoigtTables::default();
assert_eq!(tables.h0tab.len(), crate::state::MVOI);
assert_eq!(tables.h1tab.len(), crate::state::MVOI);
assert_eq!(tables.h2tab.len(), crate::state::MVOI);
assert_eq!(tables.h0tab.len(), crate::tlusty::state::MVOI);
assert_eq!(tables.h1tab.len(), crate::tlusty::state::MVOI);
assert_eq!(tables.h2tab.len(), crate::tlusty::state::MVOI);
}
}

View File

@ -2,7 +2,7 @@
//!
//! 重构自 SYNSPEC `starkir.f`
use crate::math::eint;
use crate::tlusty::math::eint;
/// 物理常量
const PI: f64 = 3.14159265;

5
src/synspec/mod.rs Normal file
View File

@ -0,0 +1,5 @@
//! SYNSPEC 模块。
//!
//! 合成光谱计算。
pub mod math;

View File

@ -7,9 +7,9 @@
//! 计算每个能级的总进出速率,用于检查统计平衡。
//! 输出到 fort.16:每个能级的 <OUT> 和 <IN> 速率及相对差异。
use crate::state::atomic::AtomicData;
use crate::state::constants::HK;
use crate::state::model::ModelState;
use crate::tlusty::state::atomic::AtomicData;
use crate::tlusty::state::constants::HK;
use crate::tlusty::state::model::ModelState;
// ============================================================================
// 输入参数结构体
@ -66,10 +66,10 @@ pub struct ChckseOutput {
/// 计算 Saha-Boltzmann 因子(简化版,仅用于 CHCKSE
fn compute_sbf(
t: f64,
levpar: &crate::state::atomic::LevPar,
ionpar: &crate::state::atomic::IonPar,
levpar: &crate::tlusty::state::atomic::LevPar,
ionpar: &crate::tlusty::state::atomic::IonPar,
) -> Vec<f64> {
use crate::state::constants::BOLK;
use crate::tlusty::state::constants::BOLK;
const CCON: f64 = 2.0706e-16;
@ -344,9 +344,9 @@ pub fn format_chckse_output(output: &ChckseOutput) -> String {
#[cfg(test)]
mod tests {
use super::*;
use crate::state::atomic::{AtomicData, IonPar, LevPar, TraPar};
use crate::state::constants::{MDEPTH, MLEVEL, MTRANS};
use crate::state::model::{CraTes, LevPop, ModPar, ModelState, RrRates, WmComp};
use crate::tlusty::state::atomic::{AtomicData, IonPar, LevPar, TraPar};
use crate::tlusty::state::constants::{MDEPTH, MLEVEL, MTRANS};
use crate::tlusty::state::model::{CraTes, LevPop, ModPar, ModelState, RrRates, WmComp};
fn create_test_model() -> ModelState {
let mut model = ModelState::default();

View File

@ -8,10 +8,10 @@
//! - 计算深度结构和 LTE 占据数
use super::{FortranReader, Result};
use crate::state::atomic::AtomicData;
use crate::state::config::InpPar;
use crate::state::constants::{BOLK, MDEPTH};
use crate::state::model::{LevPop, ModPar, WmComp};
use crate::tlusty::state::atomic::AtomicData;
use crate::tlusty::state::config::InpPar;
use crate::tlusty::state::constants::{BOLK, MDEPTH};
use crate::tlusty::state::model::{LevPop, ModPar, WmComp};
// ============================================================================
// 常量
@ -208,9 +208,9 @@ pub fn read_cloudy_model<R: std::io::BufRead>(
#[cfg(test)]
mod tests {
use super::*;
use crate::state::config::InpPar;
use crate::state::constants::MDEPTH;
use crate::state::model::ModPar;
use crate::tlusty::state::config::InpPar;
use crate::tlusty::state::constants::MDEPTH;
use crate::tlusty::state::model::ModPar;
fn create_test_input() -> CloudyModelInput {
let ndpth = 5;

View File

@ -17,7 +17,7 @@
//! 本模块将纯计算部分提取为独立函数,便于测试。
use super::{Result, FortranReader, FortranWriter};
use crate::state::constants::*;
use crate::tlusty::state::constants::*;
// ============================================================================
// 物理常数

View File

@ -10,9 +10,9 @@
//! - 处理分子平衡(如果启用)
use super::{FortranReader, Result};
use crate::state::atomic::{AtoPar, LevPar};
use crate::state::config::{BasNum, InpPar};
use crate::state::constants::{MDEPTH, MLEVEL};
use crate::tlusty::state::atomic::{AtoPar, LevPar};
use crate::tlusty::state::config::{BasNum, InpPar};
use crate::tlusty::state::constants::{MDEPTH, MLEVEL};
// ============================================================================
// 常量
@ -473,8 +473,8 @@ pub fn inpmod<R: std::io::BufRead>(
#[cfg(test)]
mod tests {
use super::*;
use crate::state::atomic::LevPar;
use crate::state::config::{BasNum, InpPar};
use crate::tlusty::state::atomic::LevPar;
use crate::tlusty::state::config::{BasNum, InpPar};
use std::io::Cursor;
fn create_test_basnum() -> BasNum {

View File

@ -16,13 +16,13 @@
//! - fort.41: 谱线截面摘要
use super::Result;
use crate::math::quit as quit_func;
use crate::math::voigte as voigte_func;
use crate::state::atomic::AtomicData;
use crate::state::config::BasNum;
use crate::state::constants::*;
use crate::state::model::ModelState;
use crate::state::odfpar::OdfData;
use crate::tlusty::math::quit as quit_func;
use crate::tlusty::math::voigte as voigte_func;
use crate::tlusty::state::atomic::AtomicData;
use crate::tlusty::state::config::BasNum;
use crate::tlusty::state::constants::*;
use crate::tlusty::state::model::ModelState;
use crate::tlusty::state::odfpar::OdfData;
use std::io::Write;
// ============================================================================

View File

@ -12,7 +12,7 @@
//! - 提取温度、密度、电子密度等物理量
use super::{IoError, Result};
use crate::state::constants::*;
use crate::tlusty::state::constants::*;
use std::io::BufRead;
// ============================================================================

View File

@ -9,13 +9,13 @@
//! 假设 Gamma(T)=0.05, T=Teff。
use super::{FortranReader, IoError, Result};
use crate::math::indexx as indexx_func;
use crate::math::quit as quit_func;
use crate::math::wn as wn_func;
use crate::state::atomic::{AtomicData, IonPar, LevPar};
use crate::state::constants::*;
use crate::state::model::ModPar;
use crate::state::odfpar::LevCom;
use crate::tlusty::math::indexx as indexx_func;
use crate::tlusty::math::quit as quit_func;
use crate::tlusty::math::wn as wn_func;
use crate::tlusty::state::atomic::{AtomicData, IonPar, LevPar};
use crate::tlusty::state::constants::*;
use crate::tlusty::state::model::ModPar;
use crate::tlusty::state::odfpar::LevCom;
use std::fs::File;
use std::io::{BufRead, BufReader, BufWriter, Write};

View File

@ -4,10 +4,10 @@
//!
//! 为 START 的辅助过程,设置频率点和积分权重用于谱线计算。
use crate::state::atomic::{AtoPar, IonPar, LevPar, TraPar};
use crate::state::config::{BasNum, InpPar};
use crate::state::constants::{CAS, HALF, MFREQ, MFREQP, MTRANS, TWO, UN};
use crate::state::model::{FrqAll, LinOvr, StdPar, Turbul};
use crate::tlusty::state::atomic::{AtoPar, IonPar, LevPar, TraPar};
use crate::tlusty::state::config::{BasNum, InpPar};
use crate::tlusty::state::constants::{CAS, HALF, MFREQ, MFREQP, MTRANS, TWO, UN};
use crate::tlusty::state::model::{FrqAll, LinOvr, StdPar, Turbul};
// ============================================================================
// 常量
@ -260,7 +260,7 @@ fn handle_itr_zero(
}
// 调用 STARK0
let (xkij, wl0, fij) = crate::math::stark0(ii, jj, izz);
let (xkij, wl0, fij) = crate::tlusty::math::stark0(ii, jj, izz);
let fxk = f00 * xkij;
let dbeta = wl0 * wl0 * C18IN / fxk;
let betad = dopp * dbeta;
@ -268,7 +268,7 @@ fn handle_itr_zero(
let fid0 = OS0 * (trapar.osc0[it_idx] - fij) * dop1 * PISQ1;
// 调用 DIVSTR
let (adh, divh) = crate::math::divstr(betad, izz as i32);
let (adh, divh) = crate::tlusty::math::divstr(betad, izz as i32);
// 计算轮廓
let ifr0_it = trapar.ifr0[it_idx];
@ -278,7 +278,7 @@ fn handle_itr_zero(
for ij in ifr0_it..=ifr1_it {
let ij_idx = (ij - 1) as usize;
let beta = dbeta * (state.freq[ij_idx] - fr0_it).abs();
let sg = crate::math::starka(beta, fac, adh, betad, divh);
let sg = crate::tlusty::math::starka(beta, fac, adh, betad, divh);
let mut sg0 = 0.0;
let v = (state.freq[ij_idx] - fr0_it) * dop1;
if v.abs() <= 13.0 {
@ -317,7 +317,7 @@ fn handle_inmod_zero(
let fr = state.freq[ij_idx];
// 创建 PROFIL 参数
let profil_params = crate::math::ProfilParams {
let profil_params = crate::tlusty::math::ProfilParams {
fr,
a: params.agam,
dop: params.dop,
@ -335,7 +335,7 @@ fn handle_inmod_zero(
iquasi: 0,
};
let profil_val = crate::math::profil(&profil_params);
let profil_val = crate::tlusty::math::profil(&profil_params);
state.prof[ij_idx] = profil_val * s / params.dop;
state.ijlin[ij_idx] = itr;
}
@ -379,7 +379,7 @@ fn setup_simpson(
_itr: i32,
) -> anyhow::Result<()> {
if n % 2 != 1 {
return Err(crate::math::quit::quit_error(
return Err(crate::tlusty::math::quit::quit_error(
"even number of points in Simpson - LINSET",
n as i32,
n as i32,
@ -424,7 +424,7 @@ fn setup_modified_simpson(
m: usize,
) -> anyhow::Result<()> {
if n % 2 != 1 {
return Err(crate::math::quit::quit_error(
return Err(crate::tlusty::math::quit::quit_error(
"even number of points in MSimpson - LINSET",
n as i32,
n as i32,
@ -473,7 +473,7 @@ fn setup_modified_simpson(
// 处理 XMAX < 0 的情况(非对称)
if n % 4 != 1 {
return Err(crate::math::quit::quit_error(
return Err(crate::tlusty::math::quit::quit_error(
"conflict in MSimpson - LINSET",
n as i32,
n as i32,
@ -524,7 +524,7 @@ fn compute_profiles_and_weights(
state.w[ij_idx] = params.dop * w0[i];
// 创建 PROFIL 参数
let profil_params = crate::math::ProfilParams {
let profil_params = crate::tlusty::math::ProfilParams {
fr: state.freq[ij_idx],
a: params.agam,
dop: params.dop,
@ -542,7 +542,7 @@ fn compute_profiles_and_weights(
iquasi: 0,
};
let profil_val = crate::math::profil(&profil_params);
let profil_val = crate::tlusty::math::profil(&profil_params);
state.prof[ij_idx] = profil_val * s / params.dop;
}

View File

@ -23,8 +23,8 @@
//! - `wnstor`: 能级占据数存储
use super::FortranWriter;
use crate::state::constants::{BOLK, MDEPTH, HALF, TWO, UN, SIG4P};
use crate::math::{compute_hopf, compute_temperature, rossop, RossopConfig, RossopParams, RossopModelState, RossopOutput};
use crate::tlusty::state::constants::{BOLK, MDEPTH, HALF, TWO, UN, SIG4P};
use crate::tlusty::math::{compute_hopf, compute_temperature, rossop, RossopConfig, RossopParams, RossopModelState, RossopOutput};
// ============================================================================
// 配置结构体

View File

@ -7,8 +7,8 @@
//! 计算初始的 LTE-Grey 盘模型,作为后续非 LTE 迭代的起点。
//! 这是盘模型disk model的计算与大气模型ltegr不同。
use crate::math::zmrho;
use crate::state::constants::{HALF, MDEPTH, TWO, UN, SIG4P, SIGE, BOLK};
use crate::tlusty::math::zmrho;
use crate::tlusty::state::constants::{HALF, MDEPTH, TWO, UN, SIG4P, SIGE, BOLK};
// ============================================================================
// 常量

View File

@ -6,7 +6,7 @@
//! 共有 236 个可配置参数。
use super::{FortranReader, FortranWriter, Result};
use crate::math::getwrd;
use crate::tlusty::math::getwrd;
// ============================================================================
// 参数常量

View File

@ -14,7 +14,7 @@ use std::fs::File;
use std::io::{BufRead, BufReader, Write};
use super::{FortranReader, IoError, Result};
use crate::state::constants::{MDEPTH, MFODF, MFREQ, MDODF, MTRANS, MION};
use crate::tlusty::state::constants::{MDEPTH, MFODF, MFREQ, MDODF, MTRANS, MION};
// ============================================================================
// 数据结构

View File

@ -11,7 +11,7 @@
use std::io::{BufWriter, Write};
use crate::state::constants::{MDEPTH, MFREQ, MFREX, MLEVEL, UN, HALF};
use crate::tlusty::state::constants::{MDEPTH, MFREQ, MFREX, MLEVEL, UN, HALF};
// 物理常数
/// Stefan-Boltzmann 常数 × 4

View File

@ -10,11 +10,11 @@
use std::path::Path;
use super::{FortranReader, IoError, Result};
use crate::math::rayset::rayset;
use crate::math::rayleigh::{rayleigh, RayleighParams};
use crate::state::constants::{MDEPTH, MTABR, MTABT};
use crate::state::model::{EosPar, NumbOpac, RaySct, RayTbl, TabLop, Vectors};
use crate::state::config::BasNum;
use crate::tlusty::math::rayset::rayset;
use crate::tlusty::math::rayleigh::{rayleigh, RayleighParams};
use crate::tlusty::state::constants::{MDEPTH, MTABR, MTABT};
use crate::tlusty::state::model::{EosPar, NumbOpac, RaySct, RayTbl, TabLop, Vectors};
use crate::tlusty::state::config::BasNum;
/// Rayleigh 散射表数据(从文件读取)
#[derive(Debug, Clone)]

View File

@ -30,8 +30,8 @@
//! - fort.6: 标准输出(进度和诊断信息)
use super::FortranWriter;
use crate::state::constants::{MDEPTH, MFREQ, MLEVEL};
use crate::math::{
use crate::tlusty::state::constants::{MDEPTH, MFREQ, MLEVEL};
use crate::tlusty::math::{
rayset, prd, opaini, rates1_pure, ratsp1, steqeq_pure, newpop,
elcor_pure, accelp, rosstd_evaluate, output, pzert,
pzeval_pure, radpre_pure, timing, conout_pure,
@ -39,9 +39,9 @@ use crate::math::{
rybheq, princ_pure, coolrt_pure, rechck_pure, rteint, rtecmu,
taufr1, linsel_pure, rtecf1,
};
use crate::state::config::TlustyConfig;
use crate::state::atomic::AtomicData;
use crate::state::model::ModelState;
use crate::tlusty::state::config::TlustyConfig;
use crate::tlusty::state::atomic::AtomicData;
use crate::tlusty::state::model::ModelState;
// ============================================================================
// 配置结构体

View File

@ -8,7 +8,7 @@
//! - 计算边缘热力学量
use super::{FortranReader, IoError, Result};
use crate::math::{prsent, PrsentParams, ThermTables};
use crate::tlusty::math::{prsent, PrsentParams, ThermTables};
use std::path::Path;
// 气体常数 (erg/mol/K)

View File

@ -8,8 +8,8 @@
//! 3. 选择最终频率集
//! 4. 计算积分权重
use crate::state::config::BasNum;
use crate::state::constants::{BN, HALF, HK, SIG4P, UN, TWO};
use crate::tlusty::state::config::BasNum;
use crate::tlusty::state::constants::{BN, HALF, HK, SIG4P, UN, TWO};
/// SRTFRQ 输出信息
#[derive(Debug, Clone, Default)]

View File

@ -16,10 +16,10 @@
//! - fort.1: 读取 idisk 参数
use super::FortranReader;
use crate::math::{comset, ComsetParams};
use crate::state::config::TlustyConfig;
use crate::state::atomic::AtomicData;
use crate::state::model::ModelState;
use crate::tlusty::math::{comset, ComsetParams};
use crate::tlusty::state::config::TlustyConfig;
use crate::tlusty::state::atomic::AtomicData;
use crate::tlusty::state::model::ModelState;
// ============================================================================
// 配置参数

View File

@ -20,7 +20,7 @@ use std::io::{BufRead, BufReader, BufWriter, Read, Write};
use std::path::Path;
use super::{FortranReader, IoError, Result};
use crate::state::constants::{MATOM, MFREQC, MFRTAB, MTABR, MTABT};
use crate::tlusty::state::constants::{MATOM, MFREQC, MFRTAB, MTABR, MTABT};
/// 最大表维度
pub const MTABTO: usize = 100;

View File

@ -5,7 +5,7 @@
//! 读取 XENOMORPH 表数据文件(蓝翼和红翼),填充 XenPrf 结构体。
use super::{FortranReader, IoError, Result};
use crate::state::model::XenPrf;
use crate::tlusty::state::model::XenPrf;
use std::io::BufRead;
use std::path::Path;

View File

@ -18,10 +18,10 @@
//!
//! Auer, L. 1987, in Numerical Radiative Transfer, ed. W. Kalkofen (Cambridge: Cambridge Univ. Press), 101
use crate::state::constants::{MDEPTH, MFREQ, MLEVEL};
use crate::state::model::ModelState;
use crate::state::config::TlustyConfig;
use crate::state::atomic::AtomicData;
use crate::tlusty::state::constants::{MDEPTH, MFREQ, MLEVEL};
use crate::tlusty::state::model::ModelState;
use crate::tlusty::state::config::TlustyConfig;
use crate::tlusty::state::atomic::AtomicData;
// ============================================================================
// 配置参数

View File

@ -4,7 +4,7 @@
//! 使用 Auer (1987) 算法加速 populations 的收敛。
//! 参考: Numerical Radiative Transfer, p. 101
use crate::io::{FortranWriter, IoError, Result};
use crate::tlusty::io::{FortranWriter, IoError, Result};
/// 加速收敛参数。
pub struct AccelpParams<'a> {

View File

@ -16,8 +16,8 @@
//!
//! 当 IFALI > 5 时,返回 `true`,调用者应调用 `alifr3`。
use crate::state::alipar::FixAlp;
use crate::state::constants::{UN, TWO, HALF};
use crate::tlusty::state::alipar::FixAlp;
use crate::tlusty::state::constants::{UN, TWO, HALF};
/// ALIFR1 输入参数
pub struct Alifr1Params {

View File

@ -6,8 +6,8 @@
//! 温度、电子密度和占据数的导数。
//! 这是一致三对角算子的变体。
use crate::state::alipar::FixAlp;
use crate::state::constants::{MLEVEL, MDEPTH, UN, TWO};
use crate::tlusty::state::alipar::FixAlp;
use crate::tlusty::state::constants::{MLEVEL, MDEPTH, UN, TWO};
/// ALIFR3 输入参数
pub struct Alifr3Params {

View File

@ -16,7 +16,7 @@
//! - IBC 下边界条件处理
//! - IFALI>=7 时额外的导数 (HEITP, HEINP, HEIPP, REDTP, REDNP, REDPP)
use crate::state::constants::{MLVEXP, UN};
use crate::tlusty::state::constants::{MLVEXP, UN};
// 常量
const T23: f64 = 2.0 / 3.0;

View File

@ -6,7 +6,7 @@
//! 计算流体静力学和辐射平衡量 - ALI 点的总加热和冷却率对
//! 温度、电子密度和占据数的导数。
use crate::state::constants::{MDEPTH, MFREQ, UN, HALF};
use crate::tlusty::state::constants::{MDEPTH, MFREQ, UN, HALF};
/// ALIFRK 输入参数
pub struct AlifrkParams {

View File

@ -22,7 +22,7 @@
//! 5. 辐射压力计算
//! 6. Rosseland 平均不透明度
use crate::state::constants::{MDEPTH, MFREQ, MTRANS, UN, HK, PCK};
use crate::tlusty::state::constants::{MDEPTH, MFREQ, MTRANS, UN, HK, PCK};
// ============================================================================
// 配置结构体

View File

@ -13,7 +13,7 @@
//! - 支持 Opacity Sampling 选项 (ISPODF)
//! - 扩展频率数据存储顺序不同
use crate::state::constants::{MDEPTH, MFREQ, MTRANS, UN, HK, PCK};
use crate::tlusty::state::constants::{MDEPTH, MFREQ, MTRANS, UN, HK, PCK};
// ============================================================================
// 配置结构体

View File

@ -17,7 +17,7 @@
//! - ALIFR1: ALI 频率相关计算
//! - ROSSTD: Rosseland 平均不透明度
use crate::state::constants::{MDEPTH, MFREQ, MLEVEL, MTRANS, HALF, HK, PCK, UN};
use crate::tlusty::state::constants::{MDEPTH, MFREQ, MLEVEL, MTRANS, HALF, HK, PCK, UN};
// ============================================================================
// 输入/输出结构体

View File

@ -10,7 +10,7 @@
//! - IRDER = 2: 计算 APP (能级导数)
//! - IRDER = 3: 计算 APT, APN, APP (所有导数)
use crate::state::constants::{MDEPTH, MFREQ, MLEVEL, MTRANS, MLVEXP, UN};
use crate::tlusty::state::constants::{MDEPTH, MFREQ, MLEVEL, MTRANS, MLVEXP, UN};
/// ALIST2 输入参数(只读)
pub struct Alist2Params<'a> {

View File

@ -4,7 +4,7 @@
//!
//! 计算氢线的准分子不透明度轮廓,基于 Allard 等人的数据表。
use crate::state::model::{CalphatD, CallardA, CallardB, CallardC, CallardG, ModelState};
use crate::tlusty::state::model::{CalphatD, CallardA, CallardB, CallardC, CallardG, ModelState};
// 归一化常数
// 8.8528e-29 * lambda_0^2 * f_ij

View File

@ -4,7 +4,7 @@
//!
//! 设置角度点和角度相关量,用于处理 Compton 散射。
use crate::state::{Comptn, MMUC};
use crate::tlusty::state::{Comptn, MMUC};
// ============================================================================
// 常量
@ -105,7 +105,7 @@ pub fn angset(comptn: &mut Comptn, nmuc_init: usize) {
#[cfg(test)]
mod tests {
use super::*;
use crate::state::MFREQ;
use crate::tlusty::state::MFREQ;
fn create_test_comptn() -> Comptn {
Comptn::default()

View File

@ -2,7 +2,7 @@
//!
//! 重构自 TLUSTY `betah.f`
use crate::math::erfcx;
use crate::tlusty::math::erfcx;
/// 求解总压力标高 β。
///

View File

@ -5,7 +5,7 @@
//! 这些函数填充矩阵 A, B, C 的流体静力学平衡行
//! (NFREQE+INHE)-th row。
use crate::state::constants::{BOLK, HALF, MDEPTH, MFREQ, MLEVEL, MTOT, TWO, UN};
use crate::tlusty::state::constants::{BOLK, HALF, MDEPTH, MFREQ, MLEVEL, MTOT, TWO, UN};
// ============================================================================
// 控制参数

View File

@ -23,13 +23,13 @@
//! - BPOPT: B 矩阵 T 部分(温度相关)
//! - BPOPC: B 矩阵 C 部分(电荷守恒)
use crate::state::arrays::{BpoCom, MainArrays};
use crate::state::atomic::AtomicData;
use crate::state::config::TlustyConfig;
use crate::state::constants::MLEVEL;
use crate::state::iterat::IterControl;
use crate::state::model::ModelState;
use crate::state::alipar::FixAlp;
use crate::tlusty::state::arrays::{BpoCom, MainArrays};
use crate::tlusty::state::atomic::AtomicData;
use crate::tlusty::state::config::TlustyConfig;
use crate::tlusty::state::constants::MLEVEL;
use crate::tlusty::state::iterat::IterControl;
use crate::tlusty::state::model::ModelState;
use crate::tlusty::state::alipar::FixAlp;
use super::matinv;

View File

@ -14,8 +14,8 @@
//! - APNN = (占据数向量) * (dAJ/d(ne))
//! - APM = (占据数向量) * (dAJ/dN)
use crate::state::constants::*;
use crate::math::state::{state_pure, StateParams, StateOutput};
use crate::tlusty::state::constants::*;
use crate::tlusty::math::state::{state_pure, StateParams, StateOutput};
// ============================================================================
// 输入参数结构体

View File

@ -4,7 +4,7 @@
//!
//! 处理完全重叠情况下的 B 矩阵元素。
use crate::state::constants::{MFREX, MLEVEL, MLVEXP, UN};
use crate::tlusty::state::constants::{MFREX, MLEVEL, MLVEXP, UN};
/// BPOPE 输入参数
pub struct BpopeParams {

View File

@ -14,9 +14,9 @@
//!
//! 如果 IFALI >= 6还需要计算 A 和 C 矩阵的相应元素。
use crate::state::alipar::FixAlp;
use crate::state::arrays::{BpoCom, MainArrays};
use crate::state::constants::{MLEVEL, MLVEX3, MTOT, UN};
use crate::tlusty::state::alipar::FixAlp;
use crate::tlusty::state::arrays::{BpoCom, MainArrays};
use crate::tlusty::state::constants::{MLEVEL, MLVEX3, MTOT, UN};
/// BPOPF 输入参数
pub struct BpopfParams<'a> {

View File

@ -9,7 +9,7 @@
//! - 处理统计平衡方程对温度和密度的依赖性
//! - 支持 LTE 和非 LTE 两种模式
use crate::state::constants::{HK, H, UN};
use crate::tlusty::state::constants::{HK, H, UN};
// ============================================================================
// 常量

View File

@ -5,7 +5,7 @@
//! 计算辐射平衡方程对应的矩阵 A, B, C 部分(第 NFREQE+INRE 行)。
//! 包含积分方程部分和微分方程部分。
use crate::state::constants::{HALF, SIG4P, UN};
use crate::tlusty::state::constants::{HALF, SIG4P, UN};
// ============================================================================
// 常量

View File

@ -5,7 +5,7 @@
//! 与 BRE 类似,但使用几何深度 ZD 而非柱质量密度 DM 进行差分。
//! 用于球对称或柱对称几何配置。
use crate::state::constants::{HALF, SIG4P, UN};
use crate::tlusty::state::constants::{HALF, SIG4P, UN};
/// 最大线性化能级数
const MLVEXP: usize = 233;

View File

@ -5,7 +5,7 @@
//! 计算线性化辐射转移方程的矩阵 A, B, C 部分(前 NFREQE 行)。
//! 处理三种深度情况:上边界、内部点、下边界。
use crate::state::constants::{HALF, UN};
use crate::tlusty::state::constants::{HALF, UN};
// ============================================================================
// 常量

View File

@ -7,8 +7,8 @@
//! - 支持多种模式来计算新能级的粒子数
//! - 使用 STEQEQ 计算 LTE 粒子数
use crate::math::steqeq::{steqeq_pure, SteqeqConfig, SteqeqParams, SteqeqOutput, MAX_LEVEL};
use crate::state::constants::{BOLK, MDEPTH, MLEVEL, UN};
use crate::tlusty::math::steqeq::{steqeq_pure, SteqeqConfig, SteqeqParams, SteqeqOutput, MAX_LEVEL};
use crate::tlusty::state::constants::{BOLK, MDEPTH, MLEVEL, UN};
/// CHANGE 配置参数
#[derive(Debug, Clone)]

View File

@ -3,8 +3,8 @@
//! 重构自 TLUSTY `chctab.f`
//! 比较当前模型参数与不透明度表中的参数,并调整设置以避免重复计算。
use crate::io::{FortranWriter, IoError, Result};
use crate::state::constants::MATOM;
use crate::tlusty::io::{FortranWriter, IoError, Result};
use crate::tlusty::state::constants::MATOM;
/// 元素符号表
pub const ELEMENT_SYMBOLS: [&str; 99] = [

View File

@ -4,7 +4,7 @@
//!
//! 基于 Raymond 的方法,使用 Tim Kallman 的程序。
use crate::math::expo;
use crate::tlusty::math::expo;
/// 碰撞电离速率系数数组。
struct CionData {

View File

@ -4,7 +4,7 @@
//!
//! 参考Koester (1985, AA 149, 423)
use crate::state::CAS;
use crate::tlusty::state::CAS;
/// 基本光子截面常数
const PHOT0: f64 = 2.815e29;

View File

@ -9,8 +9,8 @@ use super::butler::butler;
use super::ceh12::ceh12;
use super::cspec::cspec;
use super::irc::irc;
use crate::data::{COLH_CCOOL, COLH_CHOT};
use crate::state::constants::{EH, HK, TWO, UN};
use crate::tlusty::data::{COLH_CCOOL, COLH_CHOT};
use crate::tlusty::state::constants::{EH, HK, TWO, UN};
// 物理常量
const CC0: f64 = 5.465e-11;

View File

@ -8,7 +8,7 @@
//! - 支持多种碰撞速率公式ICOL = 0, 1, 2, 3
//! - 包含碰撞电离和碰撞激发
use crate::state::constants::{HK, H, UN};
use crate::tlusty::state::constants::{HK, H, UN};
// ============================================================================
// 常量和数据

View File

@ -14,7 +14,7 @@ use super::colh::{colh, ColhAtomicData, ColhOutput, ColhParams};
use super::cspec::cspec;
use super::irc::irc;
use super::ylintp::ylintp;
use crate::state::constants::{EH, HK, TWO, UN};
use crate::tlusty::state::constants::{EH, HK, TWO, UN};
// ============================================================================
// 常量

Some files were not shown because too many files have changed in this diff Show More