use crate::dimension::{Dimension, Rational16};
use crate::unit::base::BaseUnit;
const DIM_FORCE: Dimension = Dimension::MASS
.mul(&Dimension::LENGTH)
.mul(&Dimension::TIME.pow(Rational16::new(-2, 1)));
const DIM_ENERGY: Dimension = Dimension::MASS
.mul(&Dimension::LENGTH.pow(Rational16::new(2, 1)))
.mul(&Dimension::TIME.pow(Rational16::new(-2, 1)));
const DIM_PRESSURE: Dimension = Dimension::MASS
.mul(&Dimension::LENGTH.pow(Rational16::new(-1, 1)))
.mul(&Dimension::TIME.pow(Rational16::new(-2, 1)));
const DIM_VISCOSITY: Dimension = Dimension::MASS
.mul(&Dimension::LENGTH.pow(Rational16::new(-1, 1)))
.mul(&Dimension::TIME.pow(Rational16::new(-1, 1)));
const DIM_MAGNETIC_FIELD: Dimension = Dimension::MASS
.mul(&Dimension::TIME.pow(Rational16::new(-2, 1)))
.mul(&Dimension::CURRENT.pow(Rational16::new(-1, 1)));
const DIM_MAGNETIC_FLUX: Dimension = Dimension::MASS
.mul(&Dimension::LENGTH.pow(Rational16::new(2, 1)))
.mul(&Dimension::TIME.pow(Rational16::new(-2, 1)))
.mul(&Dimension::CURRENT.pow(Rational16::new(-1, 1)));
const DIM_VOLTAGE: Dimension = Dimension::MASS
.mul(&Dimension::LENGTH.pow(Rational16::new(2, 1)))
.mul(&Dimension::TIME.pow(Rational16::new(-3, 1)))
.mul(&Dimension::CURRENT.pow(Rational16::new(-1, 1)));
const DIM_CHARGE: Dimension = Dimension::CURRENT.mul(&Dimension::TIME);
pub const CENTIMETER: BaseUnit = BaseUnit::new("centimeter", "cm", &[], Dimension::LENGTH, 1e-2);
pub const GRAM: BaseUnit = BaseUnit::new("gram", "g", &[], Dimension::MASS, 1e-3);
pub const DYNE: BaseUnit = BaseUnit::new("dyne", "dyn", &[], DIM_FORCE, 1e-5);
pub const ERG: BaseUnit = BaseUnit::new("erg", "erg", &[], DIM_ENERGY, 1e-7);
pub const BARYE: BaseUnit = BaseUnit::new("barye", "Ba", &[], DIM_PRESSURE, 0.1);
pub const POISE: BaseUnit = BaseUnit::new("poise", "P", &[], DIM_VISCOSITY, 0.1);
pub const STOKES: BaseUnit = BaseUnit::new(
"stokes",
"St",
&[],
Dimension::LENGTH
.pow(Rational16::new(2, 1))
.mul(&Dimension::TIME.pow(Rational16::new(-1, 1))),
1e-4,
);
pub const KAYSER: BaseUnit = BaseUnit::new(
"kayser",
"kayser",
&["cm^-1"],
Dimension::LENGTH.pow(Rational16::new(-1, 1)),
100.0,
);
pub const GAUSS: BaseUnit = BaseUnit::new("gauss", "G", &["Gauss"], DIM_MAGNETIC_FIELD, 1e-4);
pub const MAXWELL: BaseUnit = BaseUnit::new("maxwell", "Mx", &[], DIM_MAGNETIC_FLUX, 1e-8);
pub const OERSTED: BaseUnit = BaseUnit::new(
"oersted",
"Oe",
&[],
DIM_MAGNETIC_FIELD,
1e-4 / (4.0 * std::f64::consts::PI) * 1e3,
);
pub const STATCOULOMB: BaseUnit =
BaseUnit::new("statcoulomb", "statC", &["esu"], DIM_CHARGE, 3.335641e-10);
pub const STATAMPERE: BaseUnit =
BaseUnit::new("statampere", "statA", &[], Dimension::CURRENT, 3.335641e-10);
pub const STATVOLT: BaseUnit = BaseUnit::new("statvolt", "statV", &[], DIM_VOLTAGE, 299.792458);
pub const FRANKLIN: BaseUnit = BaseUnit::new("franklin", "Fr", &[], DIM_CHARGE, 3.335641e-10);
pub const BIOT: BaseUnit = BaseUnit::new("biot", "Bi", &["abampere"], Dimension::CURRENT, 10.0);
pub const ABCOULOMB: BaseUnit = BaseUnit::new("abcoulomb", "abC", &[], DIM_CHARGE, 10.0);
#[cfg(test)]
mod tests {
use super::*;
use crate::systems::si::{J, N, T};
#[test]
fn test_dyne_to_newton() {
let q = 1e5 * DYNE;
let q_n = q.to(N).unwrap();
assert!((q_n.value() - 1.0).abs() < 1e-10);
}
#[test]
fn test_erg_to_joule() {
let q = 1e7 * ERG;
let q_j = q.to(J).unwrap();
assert!((q_j.value() - 1.0).abs() < 1e-10);
}
#[test]
fn test_gauss_to_tesla() {
let q = 1e4 * GAUSS;
let q_t = q.to(T).unwrap();
assert!((q_t.value() - 1.0).abs() < 1e-10);
}
}