use crate::physics::basic::{
AngularMomentum, Coef, MagneticAngularVelocity, MagneticAngularVelocityType, MagneticInduction,
MagneticMoment, Vector3,
};
use crate::utils::float;
const FLOAT_F64_E_6: f64 = 1e-6;
impl Vector3<MagneticAngularVelocity> {
pub fn limit_float(&self, threshold: f64, magnetic_angular_velocity_type: MagneticAngularVelocityType) -> Self {
let (x, y, z) = match magnetic_angular_velocity_type {
MagneticAngularVelocityType::TeslaRadPerSecond => (
float::limit_float(self.x.as_tesla_rad_per_second(), threshold),
float::limit_float(self.y.as_tesla_rad_per_second(), threshold),
float::limit_float(self.z.as_tesla_rad_per_second(), threshold),
),
MagneticAngularVelocityType::MillTeslaRadPerSecond => (
float::limit_float(self.x.as_mill_tesla_rad_per_second(), threshold),
float::limit_float(self.y.as_mill_tesla_rad_per_second(), threshold),
float::limit_float(self.z.as_mill_tesla_rad_per_second(), threshold),
),
MagneticAngularVelocityType::MicroTeslaRadPerSecond => (
float::limit_float(self.x.as_micro_tesla_rad_per_second(), threshold),
float::limit_float(self.y.as_micro_tesla_rad_per_second(), threshold),
float::limit_float(self.z.as_micro_tesla_rad_per_second(), threshold),
),
MagneticAngularVelocityType::NanoTeslaRadPerSecond => (
float::limit_float(self.x.as_nano_tesla_rad_per_second(), threshold),
float::limit_float(self.y.as_nano_tesla_rad_per_second(), threshold),
float::limit_float(self.z.as_nano_tesla_rad_per_second(), threshold),
),
MagneticAngularVelocityType::GaussRadPerSecond => (
float::limit_float(self.x.as_gauss_rad_per_second(), threshold),
float::limit_float(self.y.as_gauss_rad_per_second(), threshold),
float::limit_float(self.z.as_gauss_rad_per_second(), threshold),
),
MagneticAngularVelocityType::MillGaussRadPerSecond => (
float::limit_float(self.x.as_mill_gauss_rad_per_second(), threshold),
float::limit_float(self.y.as_mill_gauss_rad_per_second(), threshold),
float::limit_float(self.z.as_mill_gauss_rad_per_second(), threshold),
),
MagneticAngularVelocityType::KiloGaussRadPerSecond => (
float::limit_float(self.x.as_kilo_gauss_rad_per_second(), threshold),
float::limit_float(self.y.as_kilo_gauss_rad_per_second(), threshold),
float::limit_float(self.z.as_kilo_gauss_rad_per_second(), threshold),
),
};
match magnetic_angular_velocity_type {
MagneticAngularVelocityType::TeslaRadPerSecond => Self { x: MagneticAngularVelocity::from_tesla_rad_per_second(x), y: MagneticAngularVelocity::from_tesla_rad_per_second(y), z: MagneticAngularVelocity::from_tesla_rad_per_second(z) },
MagneticAngularVelocityType::MillTeslaRadPerSecond => Self { x: MagneticAngularVelocity::from_mill_tesla_rad_per_second(x), y: MagneticAngularVelocity::from_mill_tesla_rad_per_second(y), z: MagneticAngularVelocity::from_mill_tesla_rad_per_second(z) },
MagneticAngularVelocityType::MicroTeslaRadPerSecond => Self { x: MagneticAngularVelocity::from_micro_tesla_rad_per_second(x), y: MagneticAngularVelocity::from_micro_tesla_rad_per_second(y), z: MagneticAngularVelocity::from_micro_tesla_rad_per_second(z) },
MagneticAngularVelocityType::NanoTeslaRadPerSecond => Self { x: MagneticAngularVelocity::from_nano_tesla_rad_per_second(x), y: MagneticAngularVelocity::from_nano_tesla_rad_per_second(y), z: MagneticAngularVelocity::from_nano_tesla_rad_per_second(z) },
MagneticAngularVelocityType::GaussRadPerSecond => Self { x: MagneticAngularVelocity::from_gauss_rad_per_second(x), y: MagneticAngularVelocity::from_gauss_rad_per_second(y), z: MagneticAngularVelocity::from_gauss_rad_per_second(z) },
MagneticAngularVelocityType::MillGaussRadPerSecond => Self { x: MagneticAngularVelocity::from_mill_gauss_rad_per_second(x), y: MagneticAngularVelocity::from_mill_gauss_rad_per_second(y), z: MagneticAngularVelocity::from_mill_gauss_rad_per_second(z) },
MagneticAngularVelocityType::KiloGaussRadPerSecond => Self { x: MagneticAngularVelocity::from_kilo_gauss_rad_per_second(x), y: MagneticAngularVelocity::from_kilo_gauss_rad_per_second(y), z: MagneticAngularVelocity::from_kilo_gauss_rad_per_second(z) },
}
}
pub fn to_vector3_coef(
&self,
magnetic_angular_velocity_type: MagneticAngularVelocityType,
) -> Vector3<Coef> {
match magnetic_angular_velocity_type {
MagneticAngularVelocityType::TeslaRadPerSecond => {
let (x, y, z) = (
self.x.as_tesla_rad_per_second(),
self.y.as_tesla_rad_per_second(),
self.z.as_tesla_rad_per_second(),
);
Vector3::<Coef>::from_array([x, y, z])
}
MagneticAngularVelocityType::MillTeslaRadPerSecond => {
let (x, y, z) = (
self.x.as_mill_tesla_rad_per_second(),
self.y.as_mill_tesla_rad_per_second(),
self.z.as_mill_tesla_rad_per_second(),
);
Vector3::<Coef>::from_array([x, y, z])
}
MagneticAngularVelocityType::MicroTeslaRadPerSecond => {
let (x, y, z) = (
self.x.as_micro_tesla_rad_per_second(),
self.y.as_micro_tesla_rad_per_second(),
self.z.as_micro_tesla_rad_per_second(),
);
Vector3::<Coef>::from_array([x, y, z])
}
MagneticAngularVelocityType::NanoTeslaRadPerSecond => {
let (x, y, z) = (
self.x.as_nano_tesla_rad_per_second(),
self.y.as_nano_tesla_rad_per_second(),
self.z.as_nano_tesla_rad_per_second(),
);
Vector3::<Coef>::from_array([x, y, z])
}
MagneticAngularVelocityType::GaussRadPerSecond => {
let (x, y, z) = (
self.x.as_gauss_rad_per_second(),
self.y.as_gauss_rad_per_second(),
self.z.as_gauss_rad_per_second(),
);
Vector3::<Coef>::from_array([x, y, z])
}
MagneticAngularVelocityType::MillGaussRadPerSecond => {
let (x, y, z) = (
self.x.as_mill_gauss_rad_per_second(),
self.y.as_mill_gauss_rad_per_second(),
self.z.as_mill_gauss_rad_per_second(),
);
Vector3::<Coef>::from_array([x, y, z])
}
MagneticAngularVelocityType::KiloGaussRadPerSecond => {
let (x, y, z) = (
self.x.as_kilo_gauss_rad_per_second(),
self.y.as_kilo_gauss_rad_per_second(),
self.z.as_kilo_gauss_rad_per_second(),
);
Vector3::<Coef>::from_array([x, y, z])
}
}
}
pub fn from_vector_coef(
coef: Vector3<Coef>,
magnetic_angular_velocity_type: MagneticAngularVelocityType,
) -> Vector3<MagneticAngularVelocity> {
let [x, y, z] = coef.to_array();
match magnetic_angular_velocity_type {
MagneticAngularVelocityType::TeslaRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(x),
MagneticAngularVelocity::from_tesla_rad_per_second(y),
MagneticAngularVelocity::from_tesla_rad_per_second(z),
),
MagneticAngularVelocityType::MillTeslaRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_mill_tesla_rad_per_second(x),
MagneticAngularVelocity::from_mill_tesla_rad_per_second(y),
MagneticAngularVelocity::from_mill_tesla_rad_per_second(z),
),
MagneticAngularVelocityType::MicroTeslaRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_micro_tesla_rad_per_second(x),
MagneticAngularVelocity::from_micro_tesla_rad_per_second(y),
MagneticAngularVelocity::from_micro_tesla_rad_per_second(z),
),
MagneticAngularVelocityType::NanoTeslaRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_nano_tesla_rad_per_second(x),
MagneticAngularVelocity::from_nano_tesla_rad_per_second(y),
MagneticAngularVelocity::from_nano_tesla_rad_per_second(z),
),
MagneticAngularVelocityType::GaussRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_gauss_rad_per_second(x),
MagneticAngularVelocity::from_gauss_rad_per_second(y),
MagneticAngularVelocity::from_gauss_rad_per_second(z),
),
MagneticAngularVelocityType::MillGaussRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_mill_gauss_rad_per_second(x),
MagneticAngularVelocity::from_mill_gauss_rad_per_second(y),
MagneticAngularVelocity::from_mill_gauss_rad_per_second(z),
),
MagneticAngularVelocityType::KiloGaussRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_kilo_gauss_rad_per_second(x),
MagneticAngularVelocity::from_kilo_gauss_rad_per_second(y),
MagneticAngularVelocity::from_kilo_gauss_rad_per_second(z),
),
}
}
pub fn from_array_with_unit(
array: [f64; 3],
magnetic_angular_velocity_type: MagneticAngularVelocityType,
) -> Vector3<MagneticAngularVelocity> {
let [x, y, z] = array;
match magnetic_angular_velocity_type {
MagneticAngularVelocityType::TeslaRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(x),
MagneticAngularVelocity::from_tesla_rad_per_second(y),
MagneticAngularVelocity::from_tesla_rad_per_second(z),
),
MagneticAngularVelocityType::MillTeslaRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_mill_tesla_rad_per_second(x),
MagneticAngularVelocity::from_mill_tesla_rad_per_second(y),
MagneticAngularVelocity::from_mill_tesla_rad_per_second(z),
),
MagneticAngularVelocityType::MicroTeslaRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_micro_tesla_rad_per_second(x),
MagneticAngularVelocity::from_micro_tesla_rad_per_second(y),
MagneticAngularVelocity::from_micro_tesla_rad_per_second(z),
),
MagneticAngularVelocityType::NanoTeslaRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_nano_tesla_rad_per_second(x),
MagneticAngularVelocity::from_nano_tesla_rad_per_second(y),
MagneticAngularVelocity::from_nano_tesla_rad_per_second(z),
),
MagneticAngularVelocityType::GaussRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_gauss_rad_per_second(x),
MagneticAngularVelocity::from_gauss_rad_per_second(y),
MagneticAngularVelocity::from_gauss_rad_per_second(z),
),
MagneticAngularVelocityType::MillGaussRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_mill_gauss_rad_per_second(x),
MagneticAngularVelocity::from_mill_gauss_rad_per_second(y),
MagneticAngularVelocity::from_mill_gauss_rad_per_second(z),
),
MagneticAngularVelocityType::KiloGaussRadPerSecond => Vector3::new(
MagneticAngularVelocity::from_kilo_gauss_rad_per_second(x),
MagneticAngularVelocity::from_kilo_gauss_rad_per_second(y),
MagneticAngularVelocity::from_kilo_gauss_rad_per_second(z),
),
}
}
pub fn to_magnetic_moment(
&self,
k: &AngularMomentum,
magnetic_induction: &Vector3<MagneticInduction>,
) -> Vector3<MagneticMoment> {
let k_val = k.as_nms();
let magnetic_induction: Vector3<MagneticInduction> = Vector3::new(
MagneticInduction::from_nano_tesla(magnetic_induction.x.as_nano_tesla()),
MagneticInduction::from_nano_tesla(magnetic_induction.y.as_nano_tesla()),
MagneticInduction::from_nano_tesla(magnetic_induction.z.as_nano_tesla()),
);
let mut denom = magnetic_induction.norm_square();
if denom == 0.0 {
denom = FLOAT_F64_E_6;
}
let wx = self.x.as_nano_tesla_rad_per_second();
let wy = self.y.as_nano_tesla_rad_per_second();
let wz = self.z.as_nano_tesla_rad_per_second();
let mx = MagneticMoment::from_nano_am2(k_val * wx / denom);
let my = MagneticMoment::from_nano_am2(k_val * wy / denom);
let mz = MagneticMoment::from_nano_am2(k_val * wz / denom);
Vector3::new(mx, my, mz)
}
}
#[cfg(test)]
mod tests {
use super::*;
use super::super::*;
use approx::assert_relative_eq;
#[test]
fn test_limit_float() {
let v = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(1.0),
MagneticAngularVelocity::from_tesla_rad_per_second(-5.0),
MagneticAngularVelocity::from_tesla_rad_per_second(3.0),
);
let result = v.limit_float(3.0, MagneticAngularVelocityType::TeslaRadPerSecond);
assert_relative_eq!(result.x.as_tesla_rad_per_second(), 1.0);
assert_relative_eq!(result.y.as_tesla_rad_per_second(), -3.0);
assert_relative_eq!(result.z.as_tesla_rad_per_second(), 3.0);
let result = v.limit_float(1e10, MagneticAngularVelocityType::MillTeslaRadPerSecond);
assert_relative_eq!(result.x.as_mill_tesla_rad_per_second(), 1000.0);
assert_relative_eq!(result.y.as_mill_tesla_rad_per_second(), -5000.0);
assert_relative_eq!(result.z.as_mill_tesla_rad_per_second(), 3000.0);
let result = v.limit_float(1e10, MagneticAngularVelocityType::MicroTeslaRadPerSecond);
assert_relative_eq!(result.x.as_micro_tesla_rad_per_second(), 1000000.0);
assert_relative_eq!(result.y.as_micro_tesla_rad_per_second(), -5000000.0);
assert_relative_eq!(result.z.as_micro_tesla_rad_per_second(), 3000000.0);
let result = v.limit_float(1e10, MagneticAngularVelocityType::NanoTeslaRadPerSecond);
assert_relative_eq!(result.x.as_nano_tesla_rad_per_second(), 1000000000.0);
assert_relative_eq!(result.y.as_nano_tesla_rad_per_second(), -5000000000.0);
assert_relative_eq!(result.z.as_nano_tesla_rad_per_second(), 3000000000.0);
let result = v.limit_float(1e10, MagneticAngularVelocityType::GaussRadPerSecond);
assert_relative_eq!(result.x.as_gauss_rad_per_second(), 10000.0);
assert_relative_eq!(result.y.as_gauss_rad_per_second(), -50000.0);
assert_relative_eq!(result.z.as_gauss_rad_per_second(), 30000.0);
let result = v.limit_float(1e10, MagneticAngularVelocityType::MillGaussRadPerSecond);
assert_relative_eq!(result.x.as_mill_gauss_rad_per_second(), 10000000.0);
assert_relative_eq!(result.y.as_mill_gauss_rad_per_second(), -50000000.0);
assert_relative_eq!(result.z.as_mill_gauss_rad_per_second(), 30000000.0);
let result = v.limit_float(1e10, MagneticAngularVelocityType::KiloGaussRadPerSecond);
assert_relative_eq!(result.x.as_kilo_gauss_rad_per_second(), 10.0);
assert_relative_eq!(result.y.as_kilo_gauss_rad_per_second(), -50.0);
assert_relative_eq!(result.z.as_kilo_gauss_rad_per_second(), 30.0);
}
#[test]
fn test_to_vector3_coef_tesla_rad_per_second() {
let magnetic_angular_velocity_vec = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(1.0),
MagneticAngularVelocity::from_tesla_rad_per_second(2.0),
MagneticAngularVelocity::from_tesla_rad_per_second(3.0),
);
let coef_vec = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::TeslaRadPerSecond);
assert_relative_eq!(coef_vec.x.get_value(), 1.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.y.get_value(), 2.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.z.get_value(), 3.0, epsilon = 1e-10);
}
#[test]
fn test_to_vector3_coef_mill_tesla_rad_per_second() {
let magnetic_angular_velocity_vec = Vector3::new(
MagneticAngularVelocity::from_mill_tesla_rad_per_second(1000.0),
MagneticAngularVelocity::from_mill_tesla_rad_per_second(2000.0),
MagneticAngularVelocity::from_mill_tesla_rad_per_second(3000.0),
);
let coef_vec = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::MillTeslaRadPerSecond);
assert_relative_eq!(coef_vec.x.get_value(), 1000.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.y.get_value(), 2000.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.z.get_value(), 3000.0, epsilon = 1e-10);
}
#[test]
fn test_to_vector3_coef_micro_tesla_rad_per_second() {
let magnetic_angular_velocity_vec = Vector3::new(
MagneticAngularVelocity::from_micro_tesla_rad_per_second(1000000.0),
MagneticAngularVelocity::from_micro_tesla_rad_per_second(2000000.0),
MagneticAngularVelocity::from_micro_tesla_rad_per_second(3000000.0),
);
let coef_vec = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::MicroTeslaRadPerSecond);
assert_relative_eq!(coef_vec.x.get_value(), 1000000.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.y.get_value(), 2000000.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.z.get_value(), 3000000.0, epsilon = 1e-10);
}
#[test]
fn test_to_vector3_coef_nano_tesla_rad_per_second() {
let magnetic_angular_velocity_vec = Vector3::new(
MagneticAngularVelocity::from_nano_tesla_rad_per_second(1000000000.0),
MagneticAngularVelocity::from_nano_tesla_rad_per_second(2000000000.0),
MagneticAngularVelocity::from_nano_tesla_rad_per_second(3000000000.0),
);
let coef_vec = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::NanoTeslaRadPerSecond);
assert_relative_eq!(coef_vec.x.get_value(), 1000000000.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.y.get_value(), 2000000000.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.z.get_value(), 3000000000.0, epsilon = 1e-10);
}
#[test]
fn test_to_vector3_coef_gauss_rad_per_second() {
let magnetic_angular_velocity_vec = Vector3::new(
MagneticAngularVelocity::from_gauss_rad_per_second(10000.0),
MagneticAngularVelocity::from_gauss_rad_per_second(20000.0),
MagneticAngularVelocity::from_gauss_rad_per_second(30000.0),
);
let coef_vec = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::GaussRadPerSecond);
assert_relative_eq!(coef_vec.x.get_value(), 10000.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.y.get_value(), 20000.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.z.get_value(), 30000.0, epsilon = 1e-10);
}
#[test]
fn test_to_vector3_coef_mill_gauss_rad_per_second() {
let magnetic_angular_velocity_vec = Vector3::new(
MagneticAngularVelocity::from_mill_gauss_rad_per_second(10000000.0),
MagneticAngularVelocity::from_mill_gauss_rad_per_second(20000000.0),
MagneticAngularVelocity::from_mill_gauss_rad_per_second(30000000.0),
);
let coef_vec = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::MillGaussRadPerSecond);
assert_relative_eq!(coef_vec.x.get_value(), 10000000.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.y.get_value(), 20000000.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.z.get_value(), 30000000.0, epsilon = 1e-10);
}
#[test]
fn test_to_vector3_coef_kilo_gauss_rad_per_second() {
let magnetic_angular_velocity_vec = Vector3::new(
MagneticAngularVelocity::from_kilo_gauss_rad_per_second(10.0),
MagneticAngularVelocity::from_kilo_gauss_rad_per_second(20.0),
MagneticAngularVelocity::from_kilo_gauss_rad_per_second(30.0),
);
let coef_vec = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::KiloGaussRadPerSecond);
assert_relative_eq!(coef_vec.x.get_value(), 10.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.y.get_value(), 20.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.z.get_value(), 30.0, epsilon = 1e-10);
}
#[test]
fn test_from_vector_coef_tesla_rad_per_second() {
let coef_vec = Vector3::new(Coef::new(1.0), Coef::new(2.0), Coef::new(3.0));
let magnetic_angular_velocity_vec = Vector3::<MagneticAngularVelocity>::from_vector_coef(
coef_vec,
MagneticAngularVelocityType::TeslaRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec.x.as_tesla_rad_per_second(),
1.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec.y.as_tesla_rad_per_second(),
2.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec.z.as_tesla_rad_per_second(),
3.0,
epsilon = 1e-10
);
}
#[test]
fn test_from_vector_coef_mill_tesla_rad_per_second() {
let coef_vec = Vector3::new(Coef::new(1000.0), Coef::new(2000.0), Coef::new(3000.0));
let magnetic_angular_velocity_vec = Vector3::<MagneticAngularVelocity>::from_vector_coef(
coef_vec,
MagneticAngularVelocityType::MillTeslaRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.x
.as_mill_tesla_rad_per_second(),
1000.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.y
.as_mill_tesla_rad_per_second(),
2000.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.z
.as_mill_tesla_rad_per_second(),
3000.0,
epsilon = 1e-10
);
}
#[test]
fn test_from_vector_coef_micro_tesla_rad_per_second() {
let coef_vec = Vector3::new(
Coef::new(1000000.0),
Coef::new(2000000.0),
Coef::new(3000000.0),
);
let magnetic_angular_velocity_vec = Vector3::<MagneticAngularVelocity>::from_vector_coef(
coef_vec,
MagneticAngularVelocityType::MicroTeslaRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.x
.as_micro_tesla_rad_per_second(),
1000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.y
.as_micro_tesla_rad_per_second(),
2000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.z
.as_micro_tesla_rad_per_second(),
3000000.0,
epsilon = 1e-10
);
}
#[test]
fn test_from_vector_coef_nano_tesla_rad_per_second() {
let coef_vec = Vector3::new(
Coef::new(1000000000.0),
Coef::new(2000000000.0),
Coef::new(3000000000.0),
);
let magnetic_angular_velocity_vec = Vector3::<MagneticAngularVelocity>::from_vector_coef(
coef_vec,
MagneticAngularVelocityType::NanoTeslaRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.x
.as_nano_tesla_rad_per_second(),
1000000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.y
.as_nano_tesla_rad_per_second(),
2000000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.z
.as_nano_tesla_rad_per_second(),
3000000000.0,
epsilon = 1e-10
);
}
#[test]
fn test_from_vector_coef_gauss_rad_per_second() {
let coef_vec = Vector3::new(Coef::new(10000.0), Coef::new(20000.0), Coef::new(30000.0));
let magnetic_angular_velocity_vec = Vector3::<MagneticAngularVelocity>::from_vector_coef(
coef_vec,
MagneticAngularVelocityType::GaussRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec.x.as_gauss_rad_per_second(),
10000.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec.y.as_gauss_rad_per_second(),
20000.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec.z.as_gauss_rad_per_second(),
30000.0,
epsilon = 1e-10
);
}
#[test]
fn test_from_vector_coef_mill_gauss_rad_per_second() {
let coef_vec = Vector3::new(
Coef::new(10000000.0),
Coef::new(20000000.0),
Coef::new(30000000.0),
);
let magnetic_angular_velocity_vec = Vector3::<MagneticAngularVelocity>::from_vector_coef(
coef_vec,
MagneticAngularVelocityType::MillGaussRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.x
.as_mill_gauss_rad_per_second(),
10000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.y
.as_mill_gauss_rad_per_second(),
20000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.z
.as_mill_gauss_rad_per_second(),
30000000.0,
epsilon = 1e-10
);
}
#[test]
fn test_from_vector_coef_kilo_gauss_rad_per_second() {
let coef_vec = Vector3::new(Coef::new(10.0), Coef::new(20.0), Coef::new(30.0));
let magnetic_angular_velocity_vec = Vector3::<MagneticAngularVelocity>::from_vector_coef(
coef_vec,
MagneticAngularVelocityType::KiloGaussRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.x
.as_kilo_gauss_rad_per_second(),
10.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.y
.as_kilo_gauss_rad_per_second(),
20.0,
epsilon = 1e-10
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.z
.as_kilo_gauss_rad_per_second(),
30.0,
epsilon = 1e-10
);
}
#[test]
fn test_from_vector_coef_roundtrip() {
let original_magnetic_angular_velocity_vec = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(1.0),
MagneticAngularVelocity::from_tesla_rad_per_second(2.0),
MagneticAngularVelocity::from_tesla_rad_per_second(3.0),
);
let coef_vec = original_magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::TeslaRadPerSecond);
let reconstructed_magnetic_angular_velocity_vec =
Vector3::<MagneticAngularVelocity>::from_vector_coef(
coef_vec,
MagneticAngularVelocityType::TeslaRadPerSecond,
);
assert_relative_eq!(
reconstructed_magnetic_angular_velocity_vec
.x
.as_tesla_rad_per_second(),
1.0,
epsilon = 1e-10
);
assert_relative_eq!(
reconstructed_magnetic_angular_velocity_vec
.y
.as_tesla_rad_per_second(),
2.0,
epsilon = 1e-10
);
assert_relative_eq!(
reconstructed_magnetic_angular_velocity_vec
.z
.as_tesla_rad_per_second(),
3.0,
epsilon = 1e-10
);
}
#[test]
fn test_magnetic_angular_velocity_comprehensive_as_methods() {
let magnetic_angular_velocity_vec = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(1.0),
MagneticAngularVelocity::from_tesla_rad_per_second(2.0),
MagneticAngularVelocity::from_tesla_rad_per_second(3.0),
);
let coef_tesla = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::TeslaRadPerSecond);
let coef_mill_tesla = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::MillTeslaRadPerSecond);
let coef_micro_tesla = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::MicroTeslaRadPerSecond);
let coef_nano_tesla = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::NanoTeslaRadPerSecond);
let coef_gauss = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::GaussRadPerSecond);
let coef_mill_gauss = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::MillGaussRadPerSecond);
let coef_kilo_gauss = magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::KiloGaussRadPerSecond);
assert_relative_eq!(coef_tesla.x.get_value(), 1.0, epsilon = 1e-10);
assert_relative_eq!(coef_mill_tesla.x.get_value(), 1000.0, epsilon = 1e-10);
assert_relative_eq!(coef_micro_tesla.x.get_value(), 1000000.0, epsilon = 1e-10);
assert_relative_eq!(coef_nano_tesla.x.get_value(), 1000000000.0, epsilon = 1e-10);
assert_relative_eq!(coef_gauss.x.get_value(), 10000.0, epsilon = 1e-10);
assert_relative_eq!(coef_mill_gauss.x.get_value(), 10000000.0, epsilon = 1e-10);
assert_relative_eq!(coef_kilo_gauss.x.get_value(), 10.0, epsilon = 1e-10);
let mill_tesla_vec = Vector3::new(
MagneticAngularVelocity::from_mill_tesla_rad_per_second(1000.0),
MagneticAngularVelocity::from_mill_tesla_rad_per_second(2000.0),
MagneticAngularVelocity::from_mill_tesla_rad_per_second(3000.0),
);
let coef_from_mill_tesla =
mill_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::TeslaRadPerSecond);
let coef_from_mill_tesla_mill =
mill_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::MillTeslaRadPerSecond);
let coef_from_mill_tesla_micro =
mill_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::MicroTeslaRadPerSecond);
let coef_from_mill_tesla_nano =
mill_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::NanoTeslaRadPerSecond);
let coef_from_mill_tesla_gauss =
mill_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::GaussRadPerSecond);
let coef_from_mill_tesla_mill_gauss =
mill_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::MillGaussRadPerSecond);
let coef_from_mill_tesla_kilo_gauss =
mill_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::KiloGaussRadPerSecond);
assert_relative_eq!(coef_from_mill_tesla.x.get_value(), 1.0, epsilon = 1e-10);
assert_relative_eq!(
coef_from_mill_tesla_mill.x.get_value(),
1000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_mill_tesla_micro.x.get_value(),
1000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_mill_tesla_nano.x.get_value(),
1000000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_mill_tesla_gauss.x.get_value(),
10000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_mill_tesla_mill_gauss.x.get_value(),
10000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_mill_tesla_kilo_gauss.x.get_value(),
10.0,
epsilon = 1e-10
);
let micro_tesla_vec = Vector3::new(
MagneticAngularVelocity::from_micro_tesla_rad_per_second(1000000.0),
MagneticAngularVelocity::from_micro_tesla_rad_per_second(2000000.0),
MagneticAngularVelocity::from_micro_tesla_rad_per_second(3000000.0),
);
let coef_from_micro_tesla =
micro_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::TeslaRadPerSecond);
let coef_from_micro_tesla_mill =
micro_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::MillTeslaRadPerSecond);
let coef_from_micro_tesla_micro =
micro_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::MicroTeslaRadPerSecond);
let coef_from_micro_tesla_nano =
micro_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::NanoTeslaRadPerSecond);
let coef_from_micro_tesla_gauss =
micro_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::GaussRadPerSecond);
let coef_from_micro_tesla_mill_gauss =
micro_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::MillGaussRadPerSecond);
let coef_from_micro_tesla_kilo_gauss =
micro_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::KiloGaussRadPerSecond);
assert_relative_eq!(coef_from_micro_tesla.x.get_value(), 1.0, epsilon = 1e-10);
assert_relative_eq!(
coef_from_micro_tesla_mill.x.get_value(),
1000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_micro_tesla_micro.x.get_value(),
1000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_micro_tesla_nano.x.get_value(),
1000000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_micro_tesla_gauss.x.get_value(),
10000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_micro_tesla_mill_gauss.x.get_value(),
10000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_micro_tesla_kilo_gauss.x.get_value(),
10.0,
epsilon = 1e-10
);
let nano_tesla_vec = Vector3::new(
MagneticAngularVelocity::from_nano_tesla_rad_per_second(1000000000.0),
MagneticAngularVelocity::from_nano_tesla_rad_per_second(2000000000.0),
MagneticAngularVelocity::from_nano_tesla_rad_per_second(3000000000.0),
);
let coef_from_nano_tesla =
nano_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::TeslaRadPerSecond);
let coef_from_nano_tesla_mill =
nano_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::MillTeslaRadPerSecond);
let coef_from_nano_tesla_micro =
nano_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::MicroTeslaRadPerSecond);
let coef_from_nano_tesla_nano =
nano_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::NanoTeslaRadPerSecond);
let coef_from_nano_tesla_gauss =
nano_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::GaussRadPerSecond);
let coef_from_nano_tesla_mill_gauss =
nano_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::MillGaussRadPerSecond);
let coef_from_nano_tesla_kilo_gauss =
nano_tesla_vec.to_vector3_coef(MagneticAngularVelocityType::KiloGaussRadPerSecond);
assert_relative_eq!(coef_from_nano_tesla.x.get_value(), 1.0, epsilon = 1e-10);
assert_relative_eq!(
coef_from_nano_tesla_mill.x.get_value(),
1000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_nano_tesla_micro.x.get_value(),
1000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_nano_tesla_nano.x.get_value(),
1000000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_nano_tesla_gauss.x.get_value(),
10000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_nano_tesla_mill_gauss.x.get_value(),
10000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_nano_tesla_kilo_gauss.x.get_value(),
10.0,
epsilon = 1e-10
);
let gauss_vec = Vector3::new(
MagneticAngularVelocity::from_gauss_rad_per_second(10000.0),
MagneticAngularVelocity::from_gauss_rad_per_second(20000.0),
MagneticAngularVelocity::from_gauss_rad_per_second(30000.0),
);
let coef_from_gauss =
gauss_vec.to_vector3_coef(MagneticAngularVelocityType::TeslaRadPerSecond);
let coef_from_gauss_mill =
gauss_vec.to_vector3_coef(MagneticAngularVelocityType::MillTeslaRadPerSecond);
let coef_from_gauss_micro =
gauss_vec.to_vector3_coef(MagneticAngularVelocityType::MicroTeslaRadPerSecond);
let coef_from_gauss_nano =
gauss_vec.to_vector3_coef(MagneticAngularVelocityType::NanoTeslaRadPerSecond);
let coef_from_gauss_gauss =
gauss_vec.to_vector3_coef(MagneticAngularVelocityType::GaussRadPerSecond);
let coef_from_gauss_mill_gauss =
gauss_vec.to_vector3_coef(MagneticAngularVelocityType::MillGaussRadPerSecond);
let coef_from_gauss_kilo_gauss =
gauss_vec.to_vector3_coef(MagneticAngularVelocityType::KiloGaussRadPerSecond);
assert_relative_eq!(coef_from_gauss.x.get_value(), 1.0, epsilon = 1e-10);
assert_relative_eq!(coef_from_gauss_mill.x.get_value(), 1000.0, epsilon = 1e-10);
assert_relative_eq!(
coef_from_gauss_micro.x.get_value(),
1000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_gauss_nano.x.get_value(),
1000000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_gauss_gauss.x.get_value(),
10000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_gauss_mill_gauss.x.get_value(),
10000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_gauss_kilo_gauss.x.get_value(),
10.0,
epsilon = 1e-10
);
let mill_gauss_vec = Vector3::new(
MagneticAngularVelocity::from_mill_gauss_rad_per_second(10000000.0),
MagneticAngularVelocity::from_mill_gauss_rad_per_second(20000000.0),
MagneticAngularVelocity::from_mill_gauss_rad_per_second(30000000.0),
);
let coef_from_mill_gauss =
mill_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::TeslaRadPerSecond);
let coef_from_mill_gauss_mill =
mill_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::MillTeslaRadPerSecond);
let coef_from_mill_gauss_micro =
mill_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::MicroTeslaRadPerSecond);
let coef_from_mill_gauss_nano =
mill_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::NanoTeslaRadPerSecond);
let coef_from_mill_gauss_gauss =
mill_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::GaussRadPerSecond);
let coef_from_mill_gauss_mill_gauss =
mill_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::MillGaussRadPerSecond);
let coef_from_mill_gauss_kilo_gauss =
mill_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::KiloGaussRadPerSecond);
assert_relative_eq!(coef_from_mill_gauss.x.get_value(), 1.0, epsilon = 1e-10);
assert_relative_eq!(
coef_from_mill_gauss_mill.x.get_value(),
1000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_mill_gauss_micro.x.get_value(),
1000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_mill_gauss_nano.x.get_value(),
1000000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_mill_gauss_gauss.x.get_value(),
10000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_mill_gauss_mill_gauss.x.get_value(),
10000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_mill_gauss_kilo_gauss.x.get_value(),
10.0,
epsilon = 1e-10
);
let kilo_gauss_vec = Vector3::new(
MagneticAngularVelocity::from_kilo_gauss_rad_per_second(10.0),
MagneticAngularVelocity::from_kilo_gauss_rad_per_second(20.0),
MagneticAngularVelocity::from_kilo_gauss_rad_per_second(30.0),
);
let coef_from_kilo_gauss =
kilo_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::TeslaRadPerSecond);
let coef_from_kilo_gauss_mill =
kilo_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::MillTeslaRadPerSecond);
let coef_from_kilo_gauss_micro =
kilo_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::MicroTeslaRadPerSecond);
let coef_from_kilo_gauss_nano =
kilo_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::NanoTeslaRadPerSecond);
let coef_from_kilo_gauss_gauss =
kilo_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::GaussRadPerSecond);
let coef_from_kilo_gauss_mill_gauss =
kilo_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::MillGaussRadPerSecond);
let coef_from_kilo_gauss_kilo_gauss =
kilo_gauss_vec.to_vector3_coef(MagneticAngularVelocityType::KiloGaussRadPerSecond);
assert_relative_eq!(coef_from_kilo_gauss.x.get_value(), 1.0, epsilon = 1e-10);
assert_relative_eq!(
coef_from_kilo_gauss_mill.x.get_value(),
1000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_kilo_gauss_micro.x.get_value(),
1000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_kilo_gauss_nano.x.get_value(),
1000000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_kilo_gauss_gauss.x.get_value(),
10000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_kilo_gauss_mill_gauss.x.get_value(),
10000000.0,
epsilon = 1e-10
);
assert_relative_eq!(
coef_from_kilo_gauss_kilo_gauss.x.get_value(),
10.0,
epsilon = 1e-10
);
}
#[test]
fn test_to_vector3_coef_zero_values() {
let zero_magnetic_angular_velocity_vec = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(0.0),
MagneticAngularVelocity::from_tesla_rad_per_second(0.0),
MagneticAngularVelocity::from_tesla_rad_per_second(0.0),
);
let coef_vec = zero_magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::TeslaRadPerSecond);
assert_relative_eq!(coef_vec.x.get_value(), 0.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.y.get_value(), 0.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.z.get_value(), 0.0, epsilon = 1e-10);
}
#[test]
fn test_to_vector3_coef_negative_values() {
let negative_magnetic_angular_velocity_vec = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(-1.0),
MagneticAngularVelocity::from_tesla_rad_per_second(-2.0),
MagneticAngularVelocity::from_tesla_rad_per_second(-3.0),
);
let coef_vec = negative_magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::TeslaRadPerSecond);
assert_relative_eq!(coef_vec.x.get_value(), -1.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.y.get_value(), -2.0, epsilon = 1e-10);
assert_relative_eq!(coef_vec.z.get_value(), -3.0, epsilon = 1e-10);
}
#[test]
fn test_to_vector3_coef_small_values() {
let small_magnetic_angular_velocity_vec = Vector3::new(
MagneticAngularVelocity::from_nano_tesla_rad_per_second(1e-9),
MagneticAngularVelocity::from_nano_tesla_rad_per_second(2e-9),
MagneticAngularVelocity::from_nano_tesla_rad_per_second(3e-9),
);
let coef_vec = small_magnetic_angular_velocity_vec
.to_vector3_coef(MagneticAngularVelocityType::NanoTeslaRadPerSecond);
assert_relative_eq!(coef_vec.x.get_value(), 1e-9, epsilon = 1e-10);
assert_relative_eq!(coef_vec.y.get_value(), 2e-9, epsilon = 1e-10);
assert_relative_eq!(coef_vec.z.get_value(), 3e-9, epsilon = 1e-10);
}
#[test]
fn test_to_magnetic_moment_with_scalar_k() {
let w = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(2.0),
MagneticAngularVelocity::from_tesla_rad_per_second(3.0),
MagneticAngularVelocity::from_tesla_rad_per_second(4.0),
);
let b = Vector3::new(
MagneticInduction::from_tesla(1.0),
MagneticInduction::from_tesla(2.0),
MagneticInduction::from_tesla(2.0),
);
let k = AngularMomentum::from_kg_m2_per_second(5.0);
let m = w.to_magnetic_moment(&k, &b);
assert_relative_eq!(m.x.as_am2(), 10.0 / 9.0, epsilon = 1e-12);
assert_relative_eq!(m.y.as_am2(), 15.0 / 9.0, epsilon = 1e-12);
assert_relative_eq!(m.z.as_am2(), 20.0 / 9.0, epsilon = 1e-12);
}
#[test]
fn test_to_magnetic_moment_zero_magnetic_induction() {
let w = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(1.0),
MagneticAngularVelocity::from_tesla_rad_per_second(2.0),
MagneticAngularVelocity::from_tesla_rad_per_second(3.0),
);
let b = Vector3::new(
MagneticInduction::from_tesla(0.0),
MagneticInduction::from_tesla(0.0),
MagneticInduction::from_tesla(0.0),
);
let k = AngularMomentum::from_kg_m2_per_second(1.0);
let m = w.to_magnetic_moment(&k, &b);
let expected_denom = FLOAT_F64_E_6;
assert_relative_eq!(m.x.as_am2(), 1.0 / expected_denom, epsilon = 1e-12);
assert_relative_eq!(m.y.as_am2(), 2.0 / expected_denom, epsilon = 1e-12);
assert_relative_eq!(m.z.as_am2(), 3.0 / expected_denom, epsilon = 1e-12);
}
#[test]
fn test_to_magnetic_moment_different_units() {
let w = Vector3::new(
MagneticAngularVelocity::from_mill_tesla_rad_per_second(1000.0), MagneticAngularVelocity::from_gauss_rad_per_second(10000.0), MagneticAngularVelocity::from_micro_tesla_rad_per_second(1000000.0), );
let b = Vector3::new(
MagneticInduction::from_gauss(10000.0), MagneticInduction::from_mill_tesla(1000.0), MagneticInduction::from_micro_tesla(1000000.0), );
let k = AngularMomentum::from_mill_nms(1000.0);
let m = w.to_magnetic_moment(&k, &b);
assert_relative_eq!(m.x.as_am2(), 1.0 / 3.0, epsilon = 1e-12);
assert_relative_eq!(m.y.as_am2(), 1.0 / 3.0, epsilon = 1e-12);
assert_relative_eq!(m.z.as_am2(), 1.0 / 3.0, epsilon = 1e-12);
}
#[test]
fn test_to_magnetic_moment_negative_values() {
let w = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(-2.0),
MagneticAngularVelocity::from_tesla_rad_per_second(3.0),
MagneticAngularVelocity::from_tesla_rad_per_second(-1.5),
);
let b = Vector3::new(
MagneticInduction::from_tesla(-1.0),
MagneticInduction::from_tesla(2.0),
MagneticInduction::from_tesla(-1.0),
);
let k = AngularMomentum::from_kg_m2_per_second(-2.0);
let m = w.to_magnetic_moment(&k, &b);
assert_relative_eq!(m.x.as_am2(), 4.0 / 6.0, epsilon = 1e-12);
assert_relative_eq!(m.y.as_am2(), -6.0 / 6.0, epsilon = 1e-12);
assert_relative_eq!(m.z.as_am2(), 3.0 / 6.0, epsilon = 1e-12);
}
#[test]
fn test_to_magnetic_moment_small_values() {
let w = Vector3::new(
MagneticAngularVelocity::from_nano_tesla_rad_per_second(1e-9),
MagneticAngularVelocity::from_nano_tesla_rad_per_second(2e-9),
MagneticAngularVelocity::from_nano_tesla_rad_per_second(3e-9),
);
let b = Vector3::new(
MagneticInduction::from_nano_tesla(1e-9),
MagneticInduction::from_nano_tesla(2e-9),
MagneticInduction::from_nano_tesla(3e-9),
);
let k = AngularMomentum::from_nano_nms(1e-9);
let m = w.to_magnetic_moment(&k, &b);
let expected_denom = 14e-18;
assert_relative_eq!(m.x.as_am2(), 1e-18 / expected_denom, epsilon = 1e-12);
assert_relative_eq!(m.y.as_am2(), 2e-18 / expected_denom, epsilon = 1e-12);
assert_relative_eq!(m.z.as_am2(), 3e-18 / expected_denom, epsilon = 1e-12);
}
#[test]
fn test_to_magnetic_moment_large_values() {
let w = Vector3::new(
MagneticAngularVelocity::from_kilo_gauss_rad_per_second(1000.0), MagneticAngularVelocity::from_kilo_gauss_rad_per_second(2000.0), MagneticAngularVelocity::from_kilo_gauss_rad_per_second(3000.0), );
let b = Vector3::new(
MagneticInduction::from_kilo_gauss(10.0), MagneticInduction::from_kilo_gauss(20.0), MagneticInduction::from_kilo_gauss(30.0), );
let k = AngularMomentum::from_nms(1e6);
let m = w.to_magnetic_moment(&k, &b);
assert_relative_eq!(m.x.as_am2(), 1e8 / 14.0, epsilon = 1e-12);
assert_relative_eq!(m.y.as_am2(), 2e8 / 14.0, epsilon = 1e-12);
assert_relative_eq!(m.z.as_am2(), 3e8 / 14.0, epsilon = 1e-12);
}
#[test]
fn test_to_magnetic_moment_mixed_angular_momentum_units() {
let w = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(1.0),
MagneticAngularVelocity::from_tesla_rad_per_second(1.0),
MagneticAngularVelocity::from_tesla_rad_per_second(1.0),
);
let b = Vector3::new(
MagneticInduction::from_tesla(1.0),
MagneticInduction::from_tesla(1.0),
MagneticInduction::from_tesla(1.0),
);
let k_nms = AngularMomentum::from_nms(1.0);
let m_nms = w.to_magnetic_moment(&k_nms, &b);
assert_relative_eq!(m_nms.x.as_am2(), 1.0 / 3.0, epsilon = 1e-12);
assert_relative_eq!(m_nms.y.as_am2(), 1.0 / 3.0, epsilon = 1e-12);
assert_relative_eq!(m_nms.z.as_am2(), 1.0 / 3.0, epsilon = 1e-12);
let k_mill_nms = AngularMomentum::from_mill_nms(1000.0); let m_mill_nms = w.to_magnetic_moment(&k_mill_nms, &b);
assert_relative_eq!(m_mill_nms.x.as_am2(), 1.0 / 3.0, epsilon = 1e-12);
assert_relative_eq!(m_mill_nms.y.as_am2(), 1.0 / 3.0, epsilon = 1e-12);
assert_relative_eq!(m_mill_nms.z.as_am2(), 1.0 / 3.0, epsilon = 1e-12);
}
#[test]
fn test_to_magnetic_moment_equivalent_to_mag_speed_damp_gyro_mode() {
let b = Vector3::<MagneticInduction>::new(
MagneticInduction::from_tesla(1.0),
MagneticInduction::from_tesla(0.0),
MagneticInduction::from_tesla(0.0),
);
let w: Vector3<AngularVelocity> = Vector3::new(
AngularVelocity::from_rad_per_second(0.0),
AngularVelocity::from_rad_per_second(1.0),
AngularVelocity::from_rad_per_second(2.0),
);
let k = AngularMomentum::from_nms(0.5); let cross_product = b.cross(&w) * -1.0;
let result = cross_product.to_magnetic_moment(&k, &b);
let expected_result = [0.0, 1.0, -0.5];
println!("=== to_magnetic_moment 等价性测试(修正版) ===");
println!("输入参数(与旧版本一致):");
println!(
" ω (magnetic_angular_velocity): [{}, {}, {}] T·rad/s",
w.x.as_rad_per_second(),
w.y.as_rad_per_second(),
w.z.as_rad_per_second()
);
println!(
" B (magnetic_induction): [{}, {}, {}] T",
b.x.as_tesla(),
b.y.as_tesla(),
b.z.as_tesla()
);
println!(" k (angular_momentum): {} N·m·s", k.as_nms());
println!("旧版本输出: [-0.0, 1.0, -0.5] A·m²");
println!(
"新版本输出: [{}, {}, {}] A·m²",
result.x.as_am2(),
result.y.as_am2(),
result.z.as_am2()
);
println!(
"预期结果: [{}, {}, {}] A·m²",
expected_result[0], expected_result[1], expected_result[2]
);
println!();
assert_relative_eq!(result.x.as_am2(), expected_result[0], epsilon = 1e-6);
assert_relative_eq!(result.y.as_am2(), expected_result[1], epsilon = 1e-6);
assert_relative_eq!(result.z.as_am2(), expected_result[2], epsilon = 1e-6);
}
#[test]
fn test_to_magnetic_moment_non_zero_cross_product_equivalent() {
let w = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(0.0),
MagneticAngularVelocity::from_tesla_rad_per_second(0.2),
MagneticAngularVelocity::from_tesla_rad_per_second(0.3),
);
let b = Vector3::new(
MagneticInduction::from_tesla(1.0),
MagneticInduction::from_tesla(0.0),
MagneticInduction::from_tesla(0.0),
);
let k = AngularMomentum::from_nms(1.0);
let result = w.to_magnetic_moment(&k, &b);
let expected_result = [0.0, 0.2, 0.3];
println!("=== to_magnetic_moment 非零测试 ===");
println!("输入参数:");
println!(" ω (magnetic_angular_velocity): [0, 0.2, 0.3] T·rad/s");
println!(" B (magnetic_induction): [1, 0, 0] T");
println!(" k (angular_momentum): 1.0 N·m·s");
println!("手动计算:");
println!(" |B|² = 1² + 0² + 0² = 1");
println!(" 结果 = k * ω / |B|² = 1.0 * [0, 0.2, 0.3] / 1 = [0, 0.2, 0.3]");
println!(
"实际结果: [{}, {}, {}] A·m²",
result.x.as_am2(),
result.y.as_am2(),
result.z.as_am2()
);
println!(
"预期结果: [{}, {}, {}] A·m²",
expected_result[0], expected_result[1], expected_result[2]
);
println!();
assert_relative_eq!(result.x.as_am2(), expected_result[0], epsilon = 1e-6);
assert_relative_eq!(result.y.as_am2(), expected_result[1], epsilon = 1e-6);
assert_relative_eq!(result.z.as_am2(), expected_result[2], epsilon = 1e-6);
}
#[test]
fn test_to_magnetic_moment_zero_angular_velocity_equivalent() {
let w = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(0.0),
MagneticAngularVelocity::from_tesla_rad_per_second(0.0),
MagneticAngularVelocity::from_tesla_rad_per_second(0.0),
);
let b = Vector3::new(
MagneticInduction::from_tesla(1.0),
MagneticInduction::from_tesla(2.0),
MagneticInduction::from_tesla(3.0),
);
let k = AngularMomentum::from_nms(1.0);
let result = w.to_magnetic_moment(&k, &b);
let expected_result = [0.0, 0.0, 0.0];
println!("=== to_magnetic_moment 零角速度测试 ===");
println!("输入参数:");
println!(" ω (magnetic_angular_velocity): [0, 0, 0] T·rad/s");
println!(" B (magnetic_induction): [1, 2, 3] T");
println!(" k (angular_momentum): 1.0 N·m·s");
println!("手动计算:");
println!(" |B|² = 1² + 2² + 3² = 14");
println!(" 结果 = k * ω / |B|² = 1.0 * [0, 0, 0] / 14 = [0, 0, 0]");
println!(
"实际结果: [{}, {}, {}] A·m²",
result.x.as_am2(),
result.y.as_am2(),
result.z.as_am2()
);
println!(
"预期结果: [{}, {}, {}] A·m²",
expected_result[0], expected_result[1], expected_result[2]
);
println!();
assert_relative_eq!(result.x.as_am2(), expected_result[0], epsilon = 1e-6);
assert_relative_eq!(result.y.as_am2(), expected_result[1], epsilon = 1e-6);
assert_relative_eq!(result.z.as_am2(), expected_result[2], epsilon = 1e-6);
}
#[test]
fn test_to_magnetic_moment_small_magnetic_field_protection_equivalent() {
let w = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(0.1),
MagneticAngularVelocity::from_tesla_rad_per_second(0.2),
MagneticAngularVelocity::from_tesla_rad_per_second(0.3),
);
let b = Vector3::new(
MagneticInduction::from_nano_tesla(1e-10),
MagneticInduction::from_nano_tesla(1e-10),
MagneticInduction::from_nano_tesla(1e-10),
);
let k = AngularMomentum::from_nms(1.0);
let result = w.to_magnetic_moment(&k, &b);
let expected_result = [3.333333333333333e36, 6.666666666666666e36, 1e37];
println!("=== to_magnetic_moment 小磁场保护测试 ===");
println!("输入参数:");
println!(" ω (magnetic_angular_velocity): [0.1, 0.2, 0.3] T·rad/s");
println!(" B (magnetic_induction): [1e-10, 1e-10, 1e-10] T (小磁场)");
println!(" k (angular_momentum): 1.0 N·m·s");
println!("手动计算:");
println!(" |B|² = 3e-20");
println!(" 3e-20 < FLOAT_F64_E_6 (1e-6),使用最小值保护");
println!(" denom = FLOAT_F64_E_6 = 1e-6");
println!(" 结果 = k * ω / denom = 1.0 * [0.1, 0.2, 0.3] / 1e-6 = [1e5, 2e5, 3e5]");
println!(
"实际结果: [{}, {}, {}] A·m²",
result.x.as_am2(),
result.y.as_am2(),
result.z.as_am2()
);
println!(
"预期结果: [{}, {}, {}] A·m²",
expected_result[0], expected_result[1], expected_result[2]
);
println!();
assert_relative_eq!(result.x.as_am2(), expected_result[0], epsilon = 1e-6);
assert_relative_eq!(result.y.as_am2(), expected_result[1], epsilon = 1e-6);
assert_relative_eq!(result.z.as_am2(), expected_result[2], epsilon = 1e-6);
}
#[test]
fn test_to_magnetic_moment_different_units_equivalent() {
let w = Vector3::new(
MagneticAngularVelocity::from_mill_tesla_rad_per_second(1000.0), MagneticAngularVelocity::from_gauss_rad_per_second(10000.0), MagneticAngularVelocity::from_micro_tesla_rad_per_second(1000000.0), );
let b = Vector3::new(
MagneticInduction::from_gauss(10000.0), MagneticInduction::from_mill_tesla(1000.0), MagneticInduction::from_micro_tesla(1000000.0), );
let k = AngularMomentum::from_mill_nms(1000.0);
let result = w.to_magnetic_moment(&k, &b);
let expected_result = [1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0];
println!("=== to_magnetic_moment 不同单位测试 ===");
println!("输入参数:");
println!(" ω (magnetic_angular_velocity): [1, 1, 1] T·rad/s (不同单位)");
println!(" B (magnetic_induction): [1, 1, 1] T (不同单位)");
println!(" k (angular_momentum): 1.0 N·m·s");
println!("手动计算:");
println!(" |B|² = 1² + 1² + 1² = 3");
println!(" 结果 = k * ω / |B|² = 1.0 * [1, 1, 1] / 3 = [1/3, 1/3, 1/3]");
println!(
"实际结果: [{}, {}, {}] A·m²",
result.x.as_am2(),
result.y.as_am2(),
result.z.as_am2()
);
println!(
"预期结果: [{}, {}, {}] A·m²",
expected_result[0], expected_result[1], expected_result[2]
);
println!();
assert_relative_eq!(result.x.as_am2(), expected_result[0], epsilon = 1e-6);
assert_relative_eq!(result.y.as_am2(), expected_result[1], epsilon = 1e-6);
assert_relative_eq!(result.z.as_am2(), expected_result[2], epsilon = 1e-6);
}
#[test]
fn test_to_magnetic_moment_equivalent_to_old_gyro_mode_detailed() {
let b = Vector3::new(
MagneticInduction::from_tesla(1.0), MagneticInduction::from_tesla(0.0), MagneticInduction::from_tesla(0.0), );
let omega = Vector3::new(
AngularVelocity::from_rad_per_second(0.0), AngularVelocity::from_rad_per_second(1.0), AngularVelocity::from_rad_per_second(2.0), );
let cross_product = b.cross(&omega);
let w = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(
-cross_product.x.as_tesla_rad_per_second(),
),
MagneticAngularVelocity::from_tesla_rad_per_second(
-cross_product.y.as_tesla_rad_per_second(),
),
MagneticAngularVelocity::from_tesla_rad_per_second(
-cross_product.z.as_tesla_rad_per_second(),
),
);
let k = AngularMomentum::from_nms(0.5);
let result = w.to_magnetic_moment(&k, &b);
let expected_result = [0.0, 1.0, -0.5];
println!("=== to_magnetic_moment 等价性测试(陀螺模式详细) ===");
println!("输入参数(与旧版本一致):");
println!(
" ω (magnetic_angular_velocity): [{}, {}, {}] T·rad/s",
w.x.as_tesla_rad_per_second(),
w.y.as_tesla_rad_per_second(),
w.z.as_tesla_rad_per_second()
);
println!(
" B (magnetic_induction): [{}, {}, {}] T",
b.x.as_tesla(),
b.y.as_tesla(),
b.z.as_tesla()
);
println!(" k (angular_momentum): {} N·m·s", k.as_nms());
println!("旧版本输出: [-0.0, 1.0, -0.5] T");
println!(
"新版本输出: [{}, {}, {}] A·m²",
result.x.as_am2(),
result.y.as_am2(),
result.z.as_am2()
);
println!(
"预期结果: [{}, {}, {}] A·m²",
expected_result[0], expected_result[1], expected_result[2]
);
println!();
assert_relative_eq!(result.x.as_am2(), expected_result[0], epsilon = 1e-6);
assert_relative_eq!(result.y.as_am2(), expected_result[1], epsilon = 1e-6);
assert_relative_eq!(result.z.as_am2(), expected_result[2], epsilon = 1e-6);
}
#[test]
fn test_to_magnetic_moment_equivalent_to_old_gyro_mode_non_zero_cross() {
let b = Vector3::new(
MagneticInduction::from_tesla(1.0), MagneticInduction::from_tesla(0.0), MagneticInduction::from_tesla(0.0), );
let omega = Vector3::new(
AngularVelocity::from_rad_per_second(0.0), AngularVelocity::from_rad_per_second(0.2), AngularVelocity::from_rad_per_second(0.3), );
let cross_product = b.cross(&omega);
let w = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(
-cross_product.x.as_tesla_rad_per_second(),
),
MagneticAngularVelocity::from_tesla_rad_per_second(
-cross_product.y.as_tesla_rad_per_second(),
),
MagneticAngularVelocity::from_tesla_rad_per_second(
-cross_product.z.as_tesla_rad_per_second(),
),
);
let k = AngularMomentum::from_nms(1.0);
let result = w.to_magnetic_moment(&k, &b);
let expected_result = [0.0, 0.3, -0.2];
println!("=== to_magnetic_moment 等价性测试(陀螺模式非零叉积) ===");
println!("输入参数(与旧版本一致):");
println!(
" ω (magnetic_angular_velocity): [{}, {}, {}] T·rad/s",
w.x.as_tesla_rad_per_second(),
w.y.as_tesla_rad_per_second(),
w.z.as_tesla_rad_per_second()
);
println!(
" B (magnetic_induction): [{}, {}, {}] T",
b.x.as_tesla(),
b.y.as_tesla(),
b.z.as_tesla()
);
println!(" k (angular_momentum): {} N·m·s", k.as_nms());
println!("旧版本输出: [-0.0, 0.3, -0.2] T");
println!(
"新版本输出: [{}, {}, {}] A·m²",
result.x.as_am2(),
result.y.as_am2(),
result.z.as_am2()
);
println!(
"预期结果: [{}, {}, {}] A·m²",
expected_result[0], expected_result[1], expected_result[2]
);
println!();
assert_relative_eq!(result.x.as_am2(), expected_result[0], epsilon = 1e-6);
assert_relative_eq!(result.y.as_am2(), expected_result[1], epsilon = 1e-6);
assert_relative_eq!(result.z.as_am2(), expected_result[2], epsilon = 1e-6);
}
#[test]
fn test_to_magnetic_moment_equivalent_to_old_small_magnetic_field() {
let b = Vector3::new(
MagneticInduction::from_tesla(1e-6), MagneticInduction::from_tesla(1e-6), MagneticInduction::from_tesla(1e-6), );
let omega = Vector3::new(
AngularVelocity::from_rad_per_second(0.1), AngularVelocity::from_rad_per_second(0.2), AngularVelocity::from_rad_per_second(0.3), );
let cross_product = b.cross(&omega);
let w = Vector3::new(
MagneticAngularVelocity::from_tesla_rad_per_second(
-cross_product.x.as_tesla_rad_per_second(),
),
MagneticAngularVelocity::from_tesla_rad_per_second(
-cross_product.y.as_tesla_rad_per_second(),
),
MagneticAngularVelocity::from_tesla_rad_per_second(
-cross_product.z.as_tesla_rad_per_second(),
),
);
let k = AngularMomentum::from_nms(1.0);
let result = w.to_magnetic_moment(&k, &b);
let expected_result = [-33333.33333333333, 66666.66666666666, -33333.33333333333];
println!("=== to_magnetic_moment 等价性测试(小磁场保护) ===");
println!("输入参数(与旧版本一致):");
println!(
" ω (magnetic_angular_velocity): [{}, {}, {}] T·rad/s",
w.x.as_tesla_rad_per_second(),
w.y.as_tesla_rad_per_second(),
w.z.as_tesla_rad_per_second()
);
println!(
" B (magnetic_induction): [{}, {}, {}] T",
b.x.as_tesla(),
b.y.as_tesla(),
b.z.as_tesla()
);
println!(" k (angular_momentum): {} N·m·s", k.as_nms());
println!("旧版本输出: [-33333.336, 66666.67, -33333.332] T");
println!(
"新版本输出: [{}, {}, {}] A·m²",
result.x.as_am2(),
result.y.as_am2(),
result.z.as_am2()
);
println!(
"预期结果: [{}, {}, {}] A·m²",
expected_result[0], expected_result[1], expected_result[2]
);
println!();
assert_relative_eq!(result.x.as_am2(), expected_result[0], epsilon = 1e-6);
assert_relative_eq!(result.y.as_am2(), expected_result[1], epsilon = 1e-6);
assert_relative_eq!(result.z.as_am2(), expected_result[2], epsilon = 1e-6);
}
#[test]
fn test_mag_speed_damp_calc_magmeter_mode() {
let b: Vector3<MagneticInduction> = Vector3::new(
MagneticInduction::from_micro_tesla(2.0),
MagneticInduction::from_micro_tesla(3.0),
MagneticInduction::from_micro_tesla(4.0),
);
let b_prev: Vector3<MagneticInduction> = Vector3::new(
MagneticInduction::from_micro_tesla(1.0),
MagneticInduction::from_micro_tesla(2.0),
MagneticInduction::from_micro_tesla(3.0),
);
let w: AngularVelocity = AngularVelocity::from_rad_per_second(1.0 / 0.2);
let delta_B = b - b_prev;
let cross = (delta_B * w) / -4.0;
let angular_momentum = AngularMomentum::from_nms(0.3);
let result = cross.to_magnetic_moment(&angular_momentum, &b);
println!("输出结果(μT级入参): {:?}", result.to_array());
assert_relative_eq!(-12931.0344827, result.x.as_am2(), epsilon = 1e-4);
assert_relative_eq!(-12931.0344827, result.y.as_am2(), epsilon = 1e-4);
assert_relative_eq!(-12931.0344827, result.z.as_am2(), epsilon = 1e-4);
}
#[test]
fn test_from_array_with_unit() {
let array = [1.0, 2.0, 3.0];
let magnetic_angular_velocity_vec =
Vector3::<MagneticAngularVelocity>::from_array_with_unit(
array,
MagneticAngularVelocityType::TeslaRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec.x.as_tesla_rad_per_second(),
1.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec.y.as_tesla_rad_per_second(),
2.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec.z.as_tesla_rad_per_second(),
3.0
);
let array = [1000.0, 2000.0, 3000.0];
let magnetic_angular_velocity_vec =
Vector3::<MagneticAngularVelocity>::from_array_with_unit(
array,
MagneticAngularVelocityType::MillTeslaRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.x
.as_mill_tesla_rad_per_second(),
1000.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.y
.as_mill_tesla_rad_per_second(),
2000.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.z
.as_mill_tesla_rad_per_second(),
3000.0
);
let array = [1000000.0, 2000000.0, 3000000.0];
let magnetic_angular_velocity_vec =
Vector3::<MagneticAngularVelocity>::from_array_with_unit(
array,
MagneticAngularVelocityType::MicroTeslaRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.x
.as_micro_tesla_rad_per_second(),
1000000.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.y
.as_micro_tesla_rad_per_second(),
2000000.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.z
.as_micro_tesla_rad_per_second(),
3000000.0
);
let array = [1000000000.0, 2000000000.0, 3000000000.0];
let magnetic_angular_velocity_vec =
Vector3::<MagneticAngularVelocity>::from_array_with_unit(
array,
MagneticAngularVelocityType::NanoTeslaRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.x
.as_nano_tesla_rad_per_second(),
1000000000.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.y
.as_nano_tesla_rad_per_second(),
2000000000.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.z
.as_nano_tesla_rad_per_second(),
3000000000.0
);
let array = [10000.0, 20000.0, 30000.0];
let magnetic_angular_velocity_vec =
Vector3::<MagneticAngularVelocity>::from_array_with_unit(
array,
MagneticAngularVelocityType::GaussRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec.x.as_gauss_rad_per_second(),
10000.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec.y.as_gauss_rad_per_second(),
20000.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec.z.as_gauss_rad_per_second(),
30000.0
);
let array = [10000000.0, 20000000.0, 30000000.0];
let magnetic_angular_velocity_vec =
Vector3::<MagneticAngularVelocity>::from_array_with_unit(
array,
MagneticAngularVelocityType::MillGaussRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.x
.as_mill_gauss_rad_per_second(),
10000000.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.y
.as_mill_gauss_rad_per_second(),
20000000.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.z
.as_mill_gauss_rad_per_second(),
30000000.0
);
let array = [10.0, 20.0, 30.0];
let magnetic_angular_velocity_vec =
Vector3::<MagneticAngularVelocity>::from_array_with_unit(
array,
MagneticAngularVelocityType::KiloGaussRadPerSecond,
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.x
.as_kilo_gauss_rad_per_second(),
10.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.y
.as_kilo_gauss_rad_per_second(),
20.0
);
assert_relative_eq!(
magnetic_angular_velocity_vec
.z
.as_kilo_gauss_rad_per_second(),
30.0
);
}
}