sciforge 0.0.3

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

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

pub(super) fn dispatch(func: &str, p: &Params) -> HubResult<RunOutput> {
    match func {
        "coriolis_parameter" => Ok(RunOutput::Scalar(meteo::dynamics::coriolis_parameter(
            get_f(p, "latitude")?,
            get_f(p, "omega")?,
        ))),
        "geostrophic_wind" => {
            let r = meteo::dynamics::geostrophic_wind(
                get_f(p, "dp_dx")?,
                get_f(p, "dp_dy")?,
                get_f(p, "rho")?,
                get_f(p, "f")?,
            );
            Ok(RunOutput::Pair(r.0, r.1))
        }
        "rossby_number" => Ok(RunOutput::Scalar(meteo::dynamics::rossby_number(
            get_f(p, "u")?,
            get_f(p, "l")?,
            get_f(p, "f")?,
        ))),
        "rossby_wave_speed" => Ok(RunOutput::Scalar(meteo::dynamics::rossby_wave_speed(
            get_f(p, "beta")?,
            get_f(p, "k")?,
        ))),
        "thermal_wind" => Ok(RunOutput::Scalar(meteo::dynamics::thermal_wind(
            get_f(p, "f")?,
            get_f(p, "delta_t")?,
            get_f(p, "delta_x")?,
            get_f(p, "t_mean")?,
        ))),
        "potential_vorticity" => Ok(RunOutput::Scalar(meteo::dynamics::potential_vorticity(
            get_f(p, "f")?,
            get_f(p, "dtheta_dp")?,
        ))),
        "ekman_depth" => Ok(RunOutput::Scalar(meteo::dynamics::ekman_depth(
            get_f(p, "nu")?,
            get_f(p, "f")?,
        ))),
        "richardson_number" => Ok(RunOutput::Scalar(meteo::dynamics::richardson_number(
            get_f(p, "n2")?,
            get_f(p, "du_dz")?,
        ))),
        "rossby_deformation_radius" => Ok(RunOutput::Scalar(
            meteo::dynamics::rossby_deformation_radius(
                get_f(p, "n")?,
                get_f(p, "h")?,
                get_f(p, "f")?,
            ),
        )),
        "cyclone_gradient_wind" => Ok(RunOutput::Scalar(meteo::dynamics::cyclone_gradient_wind(
            get_f(p, "r")?,
            get_f(p, "f")?,
            get_f(p, "dp_dr")?,
            get_f(p, "rho")?,
        ))),
        _ => Err(HubError::InvalidInput(format!("unknown function: {func}"))),
    }
}