sciforge-core 0.0.4

Shared engineering primitives: materials, fasteners, fluids, propulsion taxonomies, std components.
Documentation
use crate::moleculars::Material;
use sciforge_hub::prelude::constants::physics::optics::birefringence;
use sciforge_hub::prelude::physics::optics::polarization as sf_pol;

impl Material {
    pub fn ordinary_index(&self) -> Option<f64> {
        birefringence::by_formula(self.formula).map(|b| b.n_ordinary)
    }

    pub fn extraordinary_index(&self) -> Option<f64> {
        birefringence::by_formula(self.formula).map(|b| b.n_extraordinary)
    }

    pub fn birefringence_kind(&self) -> Option<&'static str> {
        birefringence::by_formula(self.formula).map(|b| b.kind)
    }

    pub fn birefringence_value(&self) -> Option<f64> {
        let b = birefringence::by_formula(self.formula)?;
        Some(sf_pol::birefringence(b.n_extraordinary, b.n_ordinary))
    }

    pub fn is_uniaxial(&self) -> bool {
        birefringence::by_formula(self.formula).is_some()
    }

    pub fn retardance_at_m(&self, thickness_m: f64, wavelength_m: f64) -> Option<f64> {
        let dn = self.birefringence_value()?;
        Some(sf_pol::retardance(dn.abs(), thickness_m, wavelength_m))
    }

    pub fn quarter_wave_thickness_m(&self, wavelength_m: f64) -> Option<f64> {
        let dn = self.birefringence_value()?.abs();
        if dn == 0.0 {
            return None;
        }
        Some(wavelength_m / (4.0 * dn))
    }

    pub fn half_wave_thickness_m(&self, wavelength_m: f64) -> Option<f64> {
        let dn = self.birefringence_value()?.abs();
        if dn == 0.0 {
            return None;
        }
        Some(wavelength_m / (2.0 * dn))
    }
}