sciforge 0.0.3

A comprehensive scientific computing library in pure Rust with zero dependencies
Documentation
//! Dispatch handler for acoustics 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 {
        "a_weighting" => Ok(RunOutput::Scalar(phys::acoustics::absorption::a_weighting(
            get_f(p, "f")?,
        ))),
        "absorption_coefficient" => Ok(RunOutput::Scalar(
            phys::acoustics::absorption::absorption_coefficient(
                get_f(p, "i0")?,
                get_f(p, "i")?,
                get_f(p, "x")?,
            ),
        )),
        "acoustic_impedance" => Ok(RunOutput::Scalar(
            phys::acoustics::propagation::acoustic_impedance(get_f(p, "rho")?, get_f(p, "c")?),
        )),
        "atmospheric_absorption" => Ok(RunOutput::Scalar(
            phys::acoustics::absorption::atmospheric_absorption(
                get_f(p, "f")?,
                get_f(p, "humidity")?,
                get_f(p, "temperature")?,
            ),
        )),
        "beat_frequency" => Ok(RunOutput::Scalar(
            phys::acoustics::resonance::beat_frequency(get_f(p, "f1")?, get_f(p, "f2")?),
        )),
        "decibel_addition" => Ok(RunOutput::Scalar(
            phys::acoustics::absorption::decibel_addition(get_v(p, "levels")?),
        )),
        "doppler_approaching" => Ok(RunOutput::Scalar(
            phys::acoustics::doppler::doppler_approaching(
                get_f(p, "f0")?,
                get_f(p, "c")?,
                get_f(p, "v_source")?,
            ),
        )),
        "doppler_general" => Ok(RunOutput::Scalar(
            phys::acoustics::doppler::doppler_general(
                get_f(p, "f0")?,
                get_f(p, "c")?,
                get_f(p, "v_observer")?,
                get_f(p, "v_source")?,
            ),
        )),
        "doppler_radar_velocity" => Ok(RunOutput::Scalar(
            phys::acoustics::doppler::doppler_radar_velocity(
                get_f(p, "delta_f")?,
                get_f(p, "f0")?,
                get_f(p, "c")?,
            ),
        )),
        "doppler_receding" => Ok(RunOutput::Scalar(
            phys::acoustics::doppler::doppler_receding(
                get_f(p, "f0")?,
                get_f(p, "c")?,
                get_f(p, "v_source")?,
            ),
        )),
        "doppler_shift_wavelength" => Ok(RunOutput::Scalar(
            phys::acoustics::doppler::doppler_shift_wavelength(
                get_f(p, "lambda0")?,
                get_f(p, "v")?,
                get_f(p, "c")?,
            ),
        )),
        "fundamental_frequency_string" => Ok(RunOutput::Scalar(
            phys::acoustics::resonance::fundamental_frequency_string(
                get_f(p, "l")?,
                get_f(p, "tension")?,
                get_f(p, "mu")?,
            ),
        )),
        "harmonic_frequency" => Ok(RunOutput::Scalar(
            phys::acoustics::resonance::harmonic_frequency(
                get_f(p, "fundamental")?,
                get_i(p, "n")? as u32,
            ),
        )),
        "helmholtz_resonator" => Ok(RunOutput::Scalar(
            phys::acoustics::resonance::helmholtz_resonator(
                get_f(p, "c")?,
                get_f(p, "a")?,
                get_f(p, "v")?,
                get_f(p, "l")?,
            ),
        )),
        "intensity" => Ok(RunOutput::Scalar(phys::acoustics::propagation::intensity(
            get_f(p, "power")?,
            get_f(p, "area")?,
        ))),
        "intensity_after_absorption" => Ok(RunOutput::Scalar(
            phys::acoustics::absorption::intensity_after_absorption(
                get_f(p, "i0")?,
                get_f(p, "alpha")?,
                get_f(p, "x")?,
            ),
        )),
        "intensity_level_db" => Ok(RunOutput::Scalar(
            phys::acoustics::propagation::intensity_level_db(
                get_f(p, "intensity")?,
                get_f(p, "i_ref")?,
            ),
        )),
        "inverse_square_law" => Ok(RunOutput::Scalar(
            phys::acoustics::propagation::inverse_square_law(
                get_f(p, "i0")?,
                get_f(p, "r0")?,
                get_f(p, "r")?,
            ),
        )),
        "mach_cone_angle" => Ok(RunOutput::Scalar(
            phys::acoustics::doppler::mach_cone_angle(get_f(p, "v")?, get_f(p, "c")?),
        )),
        "mass_law_transmission_loss" => Ok(RunOutput::Scalar(
            phys::acoustics::absorption::mass_law_transmission_loss(
                get_f(p, "f")?,
                get_f(p, "surface_density")?,
            ),
        )),
        "noise_reduction_coefficient" => Ok(RunOutput::Scalar(
            phys::acoustics::absorption::noise_reduction_coefficient(get_v(p, "alphas")?),
        )),
        "plane_wave_pressure" => Ok(RunOutput::Scalar(
            phys::acoustics::propagation::plane_wave_pressure(
                get_f(p, "rho")?,
                get_f(p, "c")?,
                get_f(p, "v")?,
            ),
        )),
        "porous_absorber_flow_resistivity" => Ok(RunOutput::Scalar(
            phys::acoustics::absorption::porous_absorber_flow_resistivity(
                get_f(p, "sigma")?,
                get_f(p, "thickness")?,
                get_f(p, "f")?,
            ),
        )),
        "acoustics::resonance::quality_factor" => Ok(RunOutput::Scalar(
            phys::acoustics::resonance::quality_factor(get_f(p, "f0")?, get_f(p, "bandwidth")?),
        )),
        "reflection_coefficient" => Ok(RunOutput::Scalar(
            phys::acoustics::propagation::reflection_coefficient(get_f(p, "z1")?, get_f(p, "z2")?),
        )),
        "acoustics::doppler::relativistic_doppler" => Ok(RunOutput::Scalar(
            phys::acoustics::doppler::relativistic_doppler(
                get_f(p, "f0")?,
                get_f(p, "v")?,
                get_f(p, "c")?,
            ),
        )),
        "resonant_frequency_pipe_closed" => Ok(RunOutput::Scalar(
            phys::acoustics::resonance::resonant_frequency_pipe_closed(
                get_f(p, "l")?,
                get_f(p, "c")?,
                get_i(p, "n")? as u32,
            ),
        )),
        "resonant_frequency_pipe_open" => Ok(RunOutput::Scalar(
            phys::acoustics::resonance::resonant_frequency_pipe_open(
                get_f(p, "l")?,
                get_f(p, "c")?,
                get_i(p, "n")? as u32,
            ),
        )),
        "reverberation_time_sabine" => Ok(RunOutput::Scalar(
            phys::acoustics::resonance::reverberation_time_sabine(get_f(p, "v")?, get_f(p, "a")?),
        )),
        "room_constant" => Ok(RunOutput::Scalar(
            phys::acoustics::absorption::room_constant(get_f(p, "s")?, get_f(p, "alpha_avg")?),
        )),
        "room_mode_frequency" => Ok(RunOutput::Scalar(
            phys::acoustics::resonance::room_mode_frequency(
                get_f(p, "c")?,
                get_f(p, "lx")?,
                get_f(p, "ly")?,
                get_f(p, "lz")?,
                get_i(p, "nx")? as u32,
                get_i(p, "ny")? as u32,
                get_i(p, "nz")? as u32,
            ),
        )),
        "schroeder_frequency" => Ok(RunOutput::Scalar(
            phys::acoustics::resonance::schroeder_frequency(get_f(p, "rt60")?, get_f(p, "v")?),
        )),
        "sonic_boom_pressure" => Ok(RunOutput::Scalar(
            phys::acoustics::doppler::sonic_boom_pressure(
                get_f(p, "k")?,
                get_f(p, "l")?,
                get_f(p, "d")?,
                get_f(p, "mach")?,
            ),
        )),
        "sound_pressure_level" => Ok(RunOutput::Scalar(
            phys::acoustics::propagation::sound_pressure_level(get_f(p, "p")?, get_f(p, "p_ref")?),
        )),
        "sound_transmission_class" => Ok(RunOutput::Scalar(
            phys::acoustics::absorption::sound_transmission_class(get_v(p, "tl_values")?),
        )),
        "speed_of_sound_gas" => Ok(RunOutput::Scalar(
            phys::acoustics::propagation::speed_of_sound_gas(
                get_f(p, "gamma")?,
                get_f(p, "r")?,
                get_f(p, "t")?,
                get_f(p, "m")?,
            ),
        )),
        "speed_of_sound_solid" => Ok(RunOutput::Scalar(
            phys::acoustics::propagation::speed_of_sound_solid(get_f(p, "e")?, get_f(p, "rho")?),
        )),
        "spherical_spreading" => Ok(RunOutput::Scalar(
            phys::acoustics::propagation::spherical_spreading(
                get_f(p, "p0")?,
                get_f(p, "r0")?,
                get_f(p, "r")?,
            ),
        )),
        "standing_wave_nodes" => Ok(RunOutput::Scalar(
            phys::acoustics::resonance::standing_wave_nodes(get_f(p, "l")?, get_f(p, "wavelength")?)
                as f64,
        )),
        "transmission_coefficient" => Ok(RunOutput::Scalar(
            phys::acoustics::propagation::transmission_coefficient(
                get_f(p, "z1")?,
                get_f(p, "z2")?,
            ),
        )),
        "acoustics::propagation::wavelength" => Ok(RunOutput::Scalar(
            phys::acoustics::propagation::wavelength(get_f(p, "speed")?, get_f(p, "frequency")?),
        )),
        _ => Err(HubError::InvalidInput(format!("unknown function: {func}"))),
    }
}