#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum NeutrinoSpec {
Effective {
n_eff: f64,
masses_ev: Vec<f64>,
},
Split {
n_ur: f64,
masses_ev: Vec<f64>,
temp_factors: Vec<f64>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum AccuracyPreset {
Fast,
#[default]
Default,
Precise,
Paper,
}
impl AccuracyPreset {
pub fn neutrino_n_points(&self) -> usize {
match self {
Self::Fast => 256,
Self::Default => 512,
Self::Precise => 1024,
Self::Paper => 2048,
}
}
pub fn neutrino_integ_steps(&self) -> usize {
match self {
Self::Fast => 600,
Self::Default => 1200,
Self::Precise => 2000,
Self::Paper => 4000,
}
}
pub fn neutrino_y_max(&self) -> f64 {
match self {
Self::Fast => 35.0_f64,
Self::Default => 45.0_f64,
Self::Precise => 50.0_f64,
Self::Paper => 60.0_f64,
}
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct DerivedParams {
pub h: f64,
pub h2: f64,
pub t_cmb0_k: f64,
pub t_nu0_base_k: f64,
pub t_nu0_k: f64,
pub omega_b0: f64,
pub omega_cdm0: f64,
pub omega_m0: f64,
pub omega_k0: f64,
pub omega_de0: f64,
pub omega_g0: f64,
pub omega_ur0: f64,
pub omega_nu0: f64,
pub omega_gnu0: f64,
pub omega_non_de0: f64,
}
impl DerivedParams {
pub fn new(
h: f64,
t_cmb0: f64,
omega_b: f64,
omega_cdm: f64,
omega_k: f64,
omega_de: f64,
omega_g: f64,
omega_ur: f64,
omega_nu: f64,
t_nu0_base: f64,
t_nu0: f64,
) -> Self {
let h2 = h * h;
let omega_m = omega_b + omega_cdm;
let omega_non_de = omega_g + omega_ur + omega_nu + omega_m + omega_k;
Self {
h,
h2,
t_cmb0_k: t_cmb0,
t_nu0_base_k: t_nu0_base,
t_nu0_k: t_nu0,
omega_b0: omega_b,
omega_cdm0: omega_cdm,
omega_m0: omega_m,
omega_k0: omega_k,
omega_de0: omega_de,
omega_g0: omega_g,
omega_ur0: omega_ur,
omega_nu0: omega_nu,
omega_gnu0: omega_g + omega_ur + omega_nu,
omega_non_de0: omega_non_de,
}
}
}