unitforge/quantities/
mass.rs

1use crate::impl_macros::macros::*;
2use crate::prelude::*;
3use crate::quantities::*;
4use ndarray::{Array1, Array2, ArrayView1, ArrayView2};
5use num_traits::identities::Zero;
6use num_traits::FromPrimitive;
7#[cfg(feature = "pyo3")]
8use pyo3::pyclass;
9#[cfg(feature = "serde")]
10use serde::{Deserialize, Serialize};
11use std::cmp::Ordering;
12use std::fmt;
13use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
14
15#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
16#[derive(Copy, Clone, PartialEq, Debug)]
17#[cfg_attr(feature = "pyo3", pyclass(eq, eq_int))]
18pub enum MassUnit {
19    mg,
20    g,
21    kg,
22    t,
23    Mg,
24    kt,
25    Gg,
26    oz,  // Ounce
27    lb,  // Pound
28    st,  // Stone
29    cwt, // Hundredweight (US)
30    planck,
31    u,
32    keV_c2,
33    eV_c2,
34    MeV_c2,
35    GeV_c2,
36    TeV_c2,
37    solar_mass,
38    earth_mass,
39    lunar_mass,
40    jupiter_mass,
41}
42
43impl PhysicsUnit for MassUnit {
44    fn name(&self) -> &str {
45        match &self {
46            MassUnit::mg => "mg",
47            MassUnit::g => "g",
48            MassUnit::kg => "kg",
49            MassUnit::t => "t",
50            MassUnit::kt => "kt",
51            MassUnit::Mg => "Mg",
52            MassUnit::Gg => "Gg",
53            MassUnit::oz => "oz",
54            MassUnit::lb => "lb",
55            MassUnit::st => "st",
56            MassUnit::cwt => "cwt",
57            MassUnit::planck => "Planck Mass",
58            MassUnit::u => "Atomic mass unit",
59            MassUnit::eV_c2 => "eV/c²",
60            MassUnit::keV_c2 => "keV/c²",
61            MassUnit::MeV_c2 => "MeV/c²",
62            MassUnit::GeV_c2 => "MeV/c²",
63            MassUnit::TeV_c2 => "TeV/c²",
64            MassUnit::solar_mass => "M☉",
65            MassUnit::earth_mass => "M⊕",
66            MassUnit::lunar_mass => "M☽",
67            MassUnit::jupiter_mass => "M♃",
68        }
69    }
70
71    fn base_per_x(&self) -> (f64, i32) {
72        match self {
73            MassUnit::mg => (1., -6),
74            MassUnit::g => (1., -3),
75            MassUnit::kg => (1., 0),
76            MassUnit::t => (1., 3),
77            MassUnit::kt => (1., 6),
78            MassUnit::Mg => (1., 3),
79            MassUnit::Gg => (1., 6),
80            MassUnit::oz => (2.83495, -2),
81            MassUnit::lb => (4.5359, -1),
82            MassUnit::st => (6.35029, 0),
83            MassUnit::cwt => (5.08023, 1),
84            MassUnit::planck => (2.17643424, -8),
85            MassUnit::u => (1.6605390689252, -27),
86            MassUnit::eV_c2 => (ForceDistance::new(1., ForceDistanceUnit::eV)
87                / power!(Velocity::c(), 2))
88            .get_tuple(),
89            MassUnit::keV_c2 => (ForceDistance::new(1., ForceDistanceUnit::keV)
90                / power!(Velocity::c(), 2))
91            .get_tuple(),
92            MassUnit::MeV_c2 => (ForceDistance::new(1., ForceDistanceUnit::MeV)
93                / power!(Velocity::c(), 2))
94            .get_tuple(),
95            MassUnit::GeV_c2 => (ForceDistance::new(1., ForceDistanceUnit::GeV)
96                / power!(Velocity::c(), 2))
97            .get_tuple(),
98            MassUnit::TeV_c2 => (ForceDistance::new(1., ForceDistanceUnit::TeV)
99                / power!(Velocity::c(), 2))
100            .get_tuple(),
101            MassUnit::solar_mass => (1.98892, 30),
102            MassUnit::earth_mass => (5.9736, 24),
103            MassUnit::lunar_mass => (7.348, 22),
104            MassUnit::jupiter_mass => (1.89881, 27),
105        }
106    }
107}
108
109impl_const!(Mass, electron, 9.1093837139, -31);
110impl_const!(Mass, proton, 1.67262192595, -27);
111impl_const!(Mass, neutron, 1.67492750056, -27);
112
113impl_quantity!(Mass, MassUnit, MassUnit::kg);
114impl_div_with_self_to_f64!(Mass);
115impl_div!(Mass, Volume, Density);
116impl_div!(Mass, Density, Volume);