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, lb, st, cwt, 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);