sciforge-core 0.0.4

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

#[derive(Debug, Clone, Copy)]
pub struct OpticalFiber {
    pub core: Material,
    pub cladding: Material,
    pub core_radius_m: f64,
}

impl OpticalFiber {
    pub fn new(core: Material, cladding: Material, core_radius_m: f64) -> Self {
        Self { core, cladding, core_radius_m }
    }

    pub fn numerical_aperture(&self) -> Option<f64> {
        let n_core = self.core.refractive_index()?;
        let n_clad = self.cladding.refractive_index()?;
        Some(sf_dev::fiber_numerical_aperture(n_core, n_clad))
    }

    pub fn acceptance_angle_air_rad(&self) -> Option<f64> {
        let na = self.numerical_aperture()?;
        Some(sf_dev::fiber_acceptance_angle(na, 1.0))
    }

    pub fn v_number(&self, wavelength_m: f64) -> Option<f64> {
        let na = self.numerical_aperture()?;
        Some(sf_dev::fiber_v_number(self.core_radius_m, na, wavelength_m))
    }

    pub fn is_single_mode(&self, wavelength_m: f64) -> Option<bool> {
        self.v_number(wavelength_m).map(|v| v < 2.405)
    }

    pub fn approximate_mode_count(&self, wavelength_m: f64) -> Option<f64> {
        self.v_number(wavelength_m).map(|v| v * v / 2.0)
    }
}