sciforge 0.0.3

A comprehensive scientific computing library in pure Rust with zero dependencies
Documentation
//! Dispatch handler for electrodynamics functions.

use super::super::params::*;
use crate::hub::domain::common::errors::{HubError, HubResult};
use crate::hub::domain::physics as phys;
use crate::hub::engine::experience::runner::RunOutput;

pub(super) fn dispatch(func: &str, p: &Params) -> HubResult<RunOutput> {
    match func {
        "antenna_radiation_resistance_dipole" => Ok(RunOutput::Scalar(
            phys::electrodynamics::antenna_radiation_resistance_dipole(
                get_f(p, "length")?,
                get_f(p, "wavelength")?,
            ),
        )),
        "electrodynamics::brewster_angle" => Ok(RunOutput::Scalar(
            phys::electrodynamics::brewster_angle(get_f(p, "n1")?, get_f(p, "n2")?),
        )),
        "capacitance_parallel_plate" => Ok(RunOutput::Scalar(
            phys::electrodynamics::capacitance_parallel_plate(
                get_f(p, "area")?,
                get_f(p, "distance")?,
                get_f(p, "epsilon_r")?,
            ),
        )),
        "cyclotron_frequency" => Ok(RunOutput::Scalar(
            phys::electrodynamics::cyclotron_frequency(
                get_f(p, "charge")?,
                get_f(p, "mass")?,
                get_f(p, "b")?,
            ),
        )),
        "debye_length" => Ok(RunOutput::Scalar(phys::electrodynamics::debye_length(
            get_f(p, "temperature")?,
            get_f(p, "number_density")?,
            get_f(p, "charge")?,
        ))),
        "electric_potential_point" => Ok(RunOutput::Scalar(
            phys::electrodynamics::electric_potential_point(get_f(p, "q")?, get_f(p, "r")?),
        )),
        "energy_capacitor" => Ok(RunOutput::Scalar(phys::electrodynamics::energy_capacitor(
            get_f(p, "c")?,
            get_f(p, "v")?,
        ))),
        "energy_inductor" => Ok(RunOutput::Scalar(phys::electrodynamics::energy_inductor(
            get_f(p, "l")?,
            get_f(p, "i")?,
        ))),
        "fresnel_rp" => Ok(RunOutput::Scalar(phys::electrodynamics::fresnel_rp(
            get_f(p, "n1")?,
            get_f(p, "n2")?,
            get_f(p, "theta_i")?,
        ))),
        "fresnel_rs" => Ok(RunOutput::Scalar(phys::electrodynamics::fresnel_rs(
            get_f(p, "n1")?,
            get_f(p, "n2")?,
            get_f(p, "theta_i")?,
        ))),
        "group_velocity_dispersive" => Ok(RunOutput::Scalar(
            phys::electrodynamics::group_velocity_dispersive(
                get_f(p, "v_phase")?,
                get_f(p, "omega")?,
                get_f(p, "dv_domega")?,
            ),
        )),
        "inductance_solenoid" => Ok(RunOutput::Scalar(
            phys::electrodynamics::inductance_solenoid(
                get_f(p, "n_turns")?,
                get_f(p, "length")?,
                get_f(p, "area")?,
            ),
        )),
        "larmor_radiation_power" => Ok(RunOutput::Scalar(
            phys::electrodynamics::larmor_radiation_power(get_f(p, "charge")?, get_f(p, "accel")?),
        )),
        "larmor_radius" => Ok(RunOutput::Scalar(phys::electrodynamics::larmor_radius(
            get_f(p, "mass")?,
            get_f(p, "v_perp")?,
            get_f(p, "charge")?,
            get_f(p, "b")?,
        ))),
        "magnetic_field_loop" => Ok(RunOutput::Scalar(
            phys::electrodynamics::magnetic_field_loop(
                get_f(p, "current")?,
                get_f(p, "radius")?,
                get_f(p, "z")?,
            ),
        )),
        "magnetic_field_solenoid" => Ok(RunOutput::Scalar(
            phys::electrodynamics::magnetic_field_solenoid(
                get_f(p, "n_per_length")?,
                get_f(p, "current")?,
            ),
        )),
        "magnetic_field_wire" => Ok(RunOutput::Scalar(
            phys::electrodynamics::magnetic_field_wire(get_f(p, "current")?, get_f(p, "r")?),
        )),
        "mutual_inductance_coupling" => Ok(RunOutput::Scalar(
            phys::electrodynamics::mutual_inductance_coupling(
                get_f(p, "k")?,
                get_f(p, "l1")?,
                get_f(p, "l2")?,
            ),
        )),
        "parallel_capacitance" => Ok(RunOutput::Scalar(
            phys::electrodynamics::parallel_capacitance(get_v(p, "capacitances")?),
        )),
        "electrodynamics::parallel_resistance" => Ok(RunOutput::Scalar(
            phys::electrodynamics::parallel_resistance(get_v(p, "resistances")?),
        )),
        "phase_velocity" => Ok(RunOutput::Scalar(phys::electrodynamics::phase_velocity(
            get_f(p, "epsilon_r")?,
            get_f(p, "mu_r")?,
        ))),
        "plasma_frequency" => Ok(RunOutput::Scalar(phys::electrodynamics::plasma_frequency(
            get_f(p, "number_density")?,
            get_f(p, "mass")?,
            get_f(p, "charge")?,
        ))),
        "power_dissipated" => Ok(RunOutput::Scalar(phys::electrodynamics::power_dissipated(
            get_f(p, "v")?,
            get_f(p, "r")?,
        ))),
        "radiation_pressure_absorbed" => Ok(RunOutput::Scalar(
            phys::electrodynamics::radiation_pressure_absorbed(get_f(p, "intensity")?),
        )),
        "radiation_pressure_reflected" => Ok(RunOutput::Scalar(
            phys::electrodynamics::radiation_pressure_reflected(get_f(p, "intensity")?),
        )),
        "electrodynamics::rc_charging" => {
            Ok(RunOutput::Scalar(phys::electrodynamics::rc_charging(
                get_f(p, "v_source")?,
                get_f(p, "r")?,
                get_f(p, "c")?,
                get_f(p, "t")?,
            )))
        }
        "electrodynamics::rc_discharging" => {
            Ok(RunOutput::Scalar(phys::electrodynamics::rc_discharging(
                get_f(p, "v0")?,
                get_f(p, "r")?,
                get_f(p, "c")?,
                get_f(p, "t")?,
            )))
        }
        "rc_time_constant" => Ok(RunOutput::Scalar(phys::electrodynamics::rc_time_constant(
            get_f(p, "r")?,
            get_f(p, "c")?,
        ))),
        "rl_time_constant" => Ok(RunOutput::Scalar(phys::electrodynamics::rl_time_constant(
            get_f(p, "r")?,
            get_f(p, "l")?,
        ))),
        "series_capacitance" => Ok(RunOutput::Scalar(
            phys::electrodynamics::series_capacitance(get_v(p, "capacitances")?),
        )),
        "electrodynamics::series_resistance" => Ok(RunOutput::Scalar(
            phys::electrodynamics::series_resistance(get_v(p, "resistances")?),
        )),
        "skin_depth" => Ok(RunOutput::Scalar(phys::electrodynamics::skin_depth(
            get_f(p, "frequency")?,
            get_f(p, "conductivity")?,
            get_f(p, "mu_r")?,
        ))),
        "electrodynamics::snell" => Ok(RunOutput::Scalar(phys::electrodynamics::snell(
            get_f(p, "n1")?,
            get_f(p, "theta1")?,
            get_f(p, "n2")?,
        ))),
        "transformer_ratio" => Ok(RunOutput::Scalar(phys::electrodynamics::transformer_ratio(
            get_f(p, "n_primary")?,
            get_f(p, "n_secondary")?,
            get_f(p, "v_primary")?,
        ))),
        "electrodynamics::voltage_divider" => {
            Ok(RunOutput::Scalar(phys::electrodynamics::voltage_divider(
                get_f(p, "v_in")?,
                get_f(p, "r1")?,
                get_f(p, "r2")?,
            )))
        }
        "wave_impedance_free_space" => Ok(RunOutput::Scalar(
            phys::electrodynamics::wave_impedance_free_space(),
        )),
        "electrodynamics::wave_number" => Ok(RunOutput::Scalar(
            phys::electrodynamics::wave_number(get_f(p, "frequency")?),
        )),
        "electrodynamics::wavelength" => Ok(RunOutput::Scalar(phys::electrodynamics::wavelength(
            get_f(p, "frequency")?,
        ))),
        "wheatstone_bridge_balance" => Ok(RunOutput::Scalar(
            phys::electrodynamics::wheatstone_bridge_balance(
                get_f(p, "r1")?,
                get_f(p, "r2")?,
                get_f(p, "r3")?,
            ),
        )),
        "biot_savart_segment" => {
            let dl = get_v(p, "dl")?;
            let rv = get_v(p, "r")?;
            let r = phys::electrodynamics::biot_savart_segment(
                get_f(p, "current")?,
                [dl[0], dl[1], dl[2]],
                [rv[0], rv[1], rv[2]],
            );
            Ok(RunOutput::Triple(r[0], r[1], r[2]))
        }
        "electric_dipole_field" => {
            let pv = get_v(p, "p")?;
            let rv = get_v(p, "r")?;
            let r = phys::electrodynamics::electric_dipole_field(
                [pv[0], pv[1], pv[2]],
                [rv[0], rv[1], rv[2]],
            );
            Ok(RunOutput::Triple(r[0], r[1], r[2]))
        }
        "electric_field_point_charge" => {
            let rv = get_v(p, "r")?;
            let r = phys::electrodynamics::electric_field_point_charge(
                get_f(p, "q")?,
                [rv[0], rv[1], rv[2]],
            );
            Ok(RunOutput::Triple(r[0], r[1], r[2]))
        }
        "energy_density_em" => {
            let e = get_v(p, "e")?;
            let b = get_v(p, "b")?;
            Ok(RunOutput::Scalar(phys::electrodynamics::energy_density_em(
                [e[0], e[1], e[2]],
                [b[0], b[1], b[2]],
            )))
        }
        "fdtd_1d" => {
            let mut ez = get_v(p, "ez")?.to_vec();
            let mut hy = get_v(p, "hy")?.to_vec();
            phys::electrodynamics::fdtd_1d(&mut ez, &mut hy, get_u(p, "steps")?);
            Ok(RunOutput::Matrix(vec![ez, hy]))
        }
        "lorentz_force" => {
            let v = get_v(p, "v")?;
            let e = get_v(p, "e")?;
            let b = get_v(p, "b")?;
            let r = phys::electrodynamics::lorentz_force(
                get_f(p, "q")?,
                [v[0], v[1], v[2]],
                [e[0], e[1], e[2]],
                [b[0], b[1], b[2]],
            );
            Ok(RunOutput::Triple(r[0], r[1], r[2]))
        }
        "magnetic_dipole_field" => {
            let mv = get_v(p, "m")?;
            let rv = get_v(p, "r")?;
            let r = phys::electrodynamics::magnetic_dipole_field(
                [mv[0], mv[1], mv[2]],
                [rv[0], rv[1], rv[2]],
            );
            Ok(RunOutput::Triple(r[0], r[1], r[2]))
        }
        "poynting_vector" => {
            let e = get_v(p, "e")?;
            let b = get_v(p, "b")?;
            let r = phys::electrodynamics::poynting_vector([e[0], e[1], e[2]], [b[0], b[1], b[2]]);
            Ok(RunOutput::Triple(r[0], r[1], r[2]))
        }
        "waveguide_cutoff_te" => Ok(RunOutput::Scalar(
            phys::electrodynamics::waveguide_cutoff_te(
                get_i(p, "m")? as u32,
                get_i(p, "n")? as u32,
                get_f(p, "a")?,
                get_f(p, "b")?,
            ),
        )),
        _ => Err(HubError::InvalidInput(format!("unknown function: {func}"))),
    }
}