sciforge-core 0.0.4

Shared engineering primitives: materials, fasteners, fluids, propulsion taxonomies, std components.
Documentation
use crate::moleculars::{Gas, Liquid, Material};
use sciforge_hub::prelude::constants::physics::optics::dispersion;
use sciforge_hub::prelude::physics::optics::devices as sf_dev;

impl Material {
    pub fn sellmeier_n_at_um(&self, wavelength_um: f64) -> Option<f64> {
        let s = dispersion::by_formula(self.formula)?;
        Some(sf_dev::sellmeier(
            s.b1, s.c1_um2, s.b2, s.c2_um2, s.b3, s.c3_um2, wavelength_um,
        ))
    }

    pub fn sellmeier_n_at_nm(&self, wavelength_nm: f64) -> Option<f64> {
        self.sellmeier_n_at_um(wavelength_nm * 1.0e-3)
    }

    pub fn sellmeier_valid_range_um(&self) -> Option<(f64, f64)> {
        dispersion::by_formula(self.formula).map(|s| s.valid_range_um)
    }

    pub fn is_sellmeier_in_range_um(&self, wavelength_um: f64) -> Option<bool> {
        let (lo, hi) = self.sellmeier_valid_range_um()?;
        Some((lo..=hi).contains(&wavelength_um))
    }

    pub fn abbe_number(&self) -> Option<f64> {
        let n_d = self.sellmeier_n_at_nm(587.6)?;
        let n_f = self.sellmeier_n_at_nm(486.1)?;
        let n_c = self.sellmeier_n_at_nm(656.3)?;
        Some(sf_dev::abbe_number(n_d, n_f, n_c))
    }

    pub fn group_index_at_um(&self, wavelength_um: f64) -> Option<f64> {
        let h = 1.0e-3;
        let n0 = self.sellmeier_n_at_um(wavelength_um)?;
        let n_plus = self.sellmeier_n_at_um(wavelength_um + h)?;
        let n_minus = self.sellmeier_n_at_um(wavelength_um - h)?;
        let dn_dlambda_per_m = (n_plus - n_minus) / (2.0 * h * 1.0e-6);
        Some(sf_dev::group_index(n0, wavelength_um * 1.0e-6, dn_dlambda_per_m))
    }
}

impl Liquid {
    pub fn sellmeier_n_at_um(&self, wavelength_um: f64) -> Option<f64> {
        let s = dispersion::by_formula(self.formula)?;
        Some(sf_dev::sellmeier(
            s.b1, s.c1_um2, s.b2, s.c2_um2, s.b3, s.c3_um2, wavelength_um,
        ))
    }
}

impl Gas {
    pub fn sellmeier_n_at_um(&self, wavelength_um: f64) -> Option<f64> {
        let s = dispersion::by_formula(self.formula)?;
        Some(sf_dev::sellmeier(
            s.b1, s.c1_um2, s.b2, s.c2_um2, s.b3, s.c3_um2, wavelength_um,
        ))
    }
}