sciforge-core 0.0.4

Shared engineering primitives: materials, fasteners, fluids, propulsion taxonomies, std components.
Documentation
use crate::moleculars::Liquid;
use sciforge_hub::prelude::constants::physics::electrodynamics::resistivity::{
    self, ELECTROLYTE_MAX_OHM_M, ELECTROLYTE_MIN_OHM_M,
};
use sciforge_hub::prelude::physics::electronics::circuits as sf_circuits;

impl Liquid {
    pub fn electrical_resistivity_ohm_m(&self) -> Option<f64> {
        resistivity::by_formula(self.formula).map(|r| r.rho_ohm_m)
    }

    pub fn electrical_resistivity_at_ohm_m(&self, temperature_k: f64) -> Option<f64> {
        resistivity::by_formula(self.formula).map(|r| r.rho_at(temperature_k))
    }

    pub fn electrical_conductivity_s_per_m(&self) -> Option<f64> {
        resistivity::by_formula(self.formula).map(|r| r.conductivity_s_per_m())
    }

    pub fn resistance_ohm(&self, length_m: f64, area_m2: f64) -> Option<f64> {
        self.electrical_resistivity_ohm_m()
            .map(|rho| rho * length_m / area_m2)
    }

    pub fn resistance_at_ohm(
        &self,
        length_m: f64,
        area_m2: f64,
        temperature_k: f64,
    ) -> Option<f64> {
        self.electrical_resistivity_at_ohm_m(temperature_k)
            .map(|rho| rho * length_m / area_m2)
    }

    pub fn conductance_s(&self, length_m: f64, area_m2: f64) -> Option<f64> {
        self.resistance_ohm(length_m, area_m2).map(|r| 1.0 / r)
    }

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

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

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

    pub fn current_density_a_m2(&self, electric_field_v_per_m: f64) -> Option<f64> {
        self.electrical_conductivity_s_per_m()
            .map(|sigma| sigma * electric_field_v_per_m)
    }

    pub fn joule_heat_per_volume_w_m3(&self, electric_field_v_per_m: f64) -> Option<f64> {
        self.electrical_conductivity_s_per_m()
            .map(|sigma| sigma * electric_field_v_per_m * electric_field_v_per_m)
    }

    pub fn is_electrolyte(&self) -> bool {
        self.electrical_resistivity_ohm_m()
            .is_some_and(|rho| (ELECTROLYTE_MIN_OHM_M..ELECTROLYTE_MAX_OHM_M).contains(&rho))
    }
}