sciforge 0.0.3

A comprehensive scientific computing library in pure Rust with zero dependencies
Documentation
use sciforge::hub::prelude::*;

fn run_phys(name: &str, params: Vec<(&str, ParameterValue)>) -> RunOutput {
    let mut exp = Experiment::new(DomainType::Physics, name);
    for (k, v) in params {
        exp = exp.param(k, v);
    }
    ExperimentRunner::new()
        .run(&exp)
        .unwrap_or_else(|_| panic!("dispatch '{name}' failed"))
}

fn scalar(o: RunOutput) -> f64 {
    match o {
        RunOutput::Scalar(v) => v,
        _ => panic!("expected Scalar, got {o:?}"),
    }
}

#[test]
fn electric_field_point_charge() {
    let out = run_phys(
        "electric_field_point_charge",
        vec![
            ("q", ParameterValue::Scalar(1e-6)),
            ("r", ParameterValue::Vector(vec![1.0, 0.0, 0.0])),
        ],
    );
    match out {
        RunOutput::Triple(ex, ey, ez) => {
            assert!(ex > 0.0, "E-field x-component should be positive, got {ex}");
            assert!(ey.abs() < 1e-6);
            assert!(ez.abs() < 1e-6);
        }
        other => panic!("expected Triple, got {other:?}"),
    }
}

#[test]
fn capacitance_parallel_plate() {
    let v = scalar(run_phys(
        "capacitance_parallel_plate",
        vec![
            ("epsilon_r", ParameterValue::Scalar(1.0)),
            ("area", ParameterValue::Scalar(1.0)),
            ("distance", ParameterValue::Scalar(1e-3)),
        ],
    ));
    assert!(v > 0.0, "capacitance should be positive, got {v}");
}

#[test]
fn skin_depth() {
    let v = scalar(run_phys(
        "skin_depth",
        vec![
            ("conductivity", ParameterValue::Scalar(1.68e-8)),
            ("frequency", ParameterValue::Scalar(1e6)),
            ("mu_r", ParameterValue::Scalar(1.0)),
        ],
    ));
    assert!(v > 0.0, "skin depth should be positive, got {v}");
}