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::electronics::circuits as sf_circuits;

#[derive(Debug, Clone, Copy)]
pub struct Resistor {
    pub material: Material,
    pub length_m: f64,
    pub area_m2: f64,
}

impl Resistor {
    pub fn new(material: Material, length_m: f64, area_m2: f64) -> Self {
        Self { material, length_m, area_m2 }
    }

    pub fn resistance_ohm(&self) -> Option<f64> {
        self.material.resistance_ohm(self.length_m, self.area_m2)
    }

    pub fn resistance_at_ohm(&self, temperature_k: f64) -> Option<f64> {
        self.material.resistance_at_ohm(self.length_m, self.area_m2, temperature_k)
    }

    pub fn voltage_drop_v(&self, current_a: f64) -> Option<f64> {
        self.resistance_ohm().map(|r| sf_circuits::ohm_voltage(current_a, r))
    }

    pub fn current_a(&self, voltage_v: f64) -> Option<f64> {
        self.resistance_ohm().map(|r| sf_circuits::ohm_current(voltage_v, r))
    }

    pub fn power_w(&self, current_a: f64) -> Option<f64> {
        let r = self.resistance_ohm()?;
        Some(sf_circuits::power_dc(sf_circuits::ohm_voltage(current_a, r), current_a))
    }

    pub fn ac_resistance_ohm(&self, radius_m: f64, frequency_hz: f64) -> Option<f64> {
        self.material.ac_resistance_ohm(self.length_m, radius_m, frequency_hz)
    }
}

pub fn series(resistors: &[Resistor]) -> Option<f64> {
    let values: Option<Vec<f64>> = resistors.iter().map(|r| r.resistance_ohm()).collect();
    values.map(|v| sf_circuits::series_resistance(&v))
}

pub fn parallel(resistors: &[Resistor]) -> Option<f64> {
    let values: Option<Vec<f64>> = resistors.iter().map(|r| r.resistance_ohm()).collect();
    values.map(|v| sf_circuits::parallel_resistance(&v))
}

#[derive(Debug, Clone, Copy)]
pub struct Capacitor {
    pub capacitance_f: f64,
}

impl Capacitor {
    pub fn new(capacitance_f: f64) -> Self {
        Self { capacitance_f }
    }

    pub fn impedance(&self, frequency_hz: f64) -> (f64, f64) {
        sf_circuits::impedance_capacitor(self.capacitance_f, frequency_hz)
    }

    pub fn impedance_magnitude_ohm(&self, frequency_hz: f64) -> f64 {
        let (re, im) = self.impedance(frequency_hz);
        sf_circuits::impedance_magnitude(re, im)
    }

    pub fn impedance_phase_rad(&self, frequency_hz: f64) -> f64 {
        let (re, im) = self.impedance(frequency_hz);
        sf_circuits::impedance_phase(re, im)
    }

    pub fn energy_j(&self, voltage_v: f64) -> f64 {
        sf_circuits::capacitor_energy(self.capacitance_f, voltage_v)
    }

    pub fn rc_charging_v(&self, supply_v: f64, time_s: f64, resistance_ohm: f64) -> f64 {
        sf_circuits::rc_charging(supply_v, time_s, resistance_ohm, self.capacitance_f)
    }

    pub fn rc_discharging_v(&self, initial_v: f64, time_s: f64, resistance_ohm: f64) -> f64 {
        sf_circuits::rc_discharging(initial_v, time_s, resistance_ohm, self.capacitance_f)
    }

    pub fn time_constant_s(&self, resistance_ohm: f64) -> f64 {
        resistance_ohm * self.capacitance_f
    }
}

#[derive(Debug, Clone, Copy)]
pub struct Inductor {
    pub inductance_h: f64,
}

impl Inductor {
    pub fn new(inductance_h: f64) -> Self {
        Self { inductance_h }
    }

    pub fn impedance(&self, frequency_hz: f64) -> (f64, f64) {
        sf_circuits::impedance_inductor(self.inductance_h, frequency_hz)
    }

    pub fn impedance_magnitude_ohm(&self, frequency_hz: f64) -> f64 {
        let (re, im) = self.impedance(frequency_hz);
        sf_circuits::impedance_magnitude(re, im)
    }

    pub fn energy_j(&self, current_a: f64) -> f64 {
        sf_circuits::inductor_energy(self.inductance_h, current_a)
    }

    pub fn current_rise_a(&self, voltage_v: f64, resistance_ohm: f64, time_s: f64) -> f64 {
        sf_circuits::rl_current_rise(voltage_v, resistance_ohm, self.inductance_h, time_s)
    }

    pub fn current_decay_a(&self, initial_current_a: f64, resistance_ohm: f64, time_s: f64) -> f64 {
        sf_circuits::rl_current_decay(initial_current_a, resistance_ohm, self.inductance_h, time_s)
    }

    pub fn time_constant_s(&self, resistance_ohm: f64) -> f64 {
        self.inductance_h / resistance_ohm
    }
}

#[derive(Debug, Clone, Copy)]
pub struct RlcCircuit {
    pub resistance_ohm: f64,
    pub inductance_h: f64,
    pub capacitance_f: f64,
}

impl RlcCircuit {
    pub fn new(resistance_ohm: f64, inductance_h: f64, capacitance_f: f64) -> Self {
        Self { resistance_ohm, inductance_h, capacitance_f }
    }

    pub fn resonant_frequency_hz(&self) -> f64 {
        sf_circuits::rlc_resonant_frequency(self.inductance_h, self.capacitance_f)
    }

    pub fn quality_factor(&self) -> f64 {
        sf_circuits::rlc_quality_factor(self.resistance_ohm, self.inductance_h, self.capacitance_f)
    }

    pub fn bandwidth_hz(&self) -> f64 {
        sf_circuits::rlc_bandwidth(self.resonant_frequency_hz(), self.quality_factor())
    }
}