Skip to main content

unitforge/quantities/
distance.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::{Float, 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#[cfg(feature = "strum")]
15use strum_macros::EnumIter;
16
17#[cfg_attr(feature = "strum", derive(EnumIter))]
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19#[derive(Copy, Clone, PartialEq, Debug)]
20#[cfg_attr(feature = "pyo3", pyclass(eq, eq_int))]
21pub enum DistanceUnit {
22    km,
23    m,
24    dm,
25    cm,
26    mm,
27    um,
28    nm,
29    mi,
30    yd,
31    ft,
32    inch,
33    planck,
34    fm,
35    an,
36    AU,
37    ly,
38    pc,
39    kpc,
40    Mpc,
41    Gpc,
42    solar_radius,
43    earth_radius,
44    lunar_radius,
45    jupiter_radius,
46}
47
48impl PhysicsUnit for DistanceUnit {
49    fn name(&self) -> &str {
50        match &self {
51            DistanceUnit::km => "km",
52            DistanceUnit::m => "m",
53            DistanceUnit::dm => "dm",
54            DistanceUnit::cm => "cm",
55            DistanceUnit::mm => "mm",
56            DistanceUnit::um => "μm",
57            DistanceUnit::nm => "nm",
58            DistanceUnit::mi => "mi",
59            DistanceUnit::yd => "yd",
60            DistanceUnit::ft => "ft",
61            DistanceUnit::inch => "in",
62            DistanceUnit::planck => "Planck Distance",
63            DistanceUnit::fm => "fm",
64            DistanceUnit::an => "Å",
65            DistanceUnit::AU => "AU",
66            DistanceUnit::ly => "ly",
67            DistanceUnit::pc => "py",
68            DistanceUnit::kpc => "kpc",
69            DistanceUnit::Mpc => "MPc",
70            DistanceUnit::Gpc => "GPc",
71            DistanceUnit::solar_radius => "M☉",
72            DistanceUnit::earth_radius => "M⊕",
73            DistanceUnit::lunar_radius => "M☽",
74            DistanceUnit::jupiter_radius => "M♃",
75        }
76    }
77
78    fn base_per_x(&self) -> (f64, i32) {
79        match self {
80            DistanceUnit::km => (1.0, 3),
81            DistanceUnit::m => (1.0, 0),
82            DistanceUnit::dm => (1.0, -1),
83            DistanceUnit::cm => (1.0, -2),
84            DistanceUnit::mm => (1.0, -3),
85            DistanceUnit::um => (1.0, -6),
86            DistanceUnit::nm => (1.0, -9),
87            DistanceUnit::mi => (1.609344, 3),
88            DistanceUnit::yd => (9.144, -1),
89            DistanceUnit::ft => (3.048, -1),
90            DistanceUnit::inch => (2.54, -2),
91            DistanceUnit::planck => (1.616255, -35),
92            DistanceUnit::fm => (1., -15),
93            DistanceUnit::an => (1., -10),
94            DistanceUnit::AU => (1.49597870700, 11),
95            DistanceUnit::ly => (Time::new(1., TimeUnit::year) * Velocity::c()).get_tuple(),
96            DistanceUnit::pc => (3.085677581, 16),
97            DistanceUnit::kpc => (3.085677581, 16 + 3),
98            DistanceUnit::Mpc => (3.085677581, 16 + 6),
99            DistanceUnit::Gpc => (3.085677581, 16 + 9),
100            DistanceUnit::solar_radius => (6.957, 8),
101            DistanceUnit::earth_radius => (6.3781, 6),
102            DistanceUnit::lunar_radius => (1.738, 6),
103            DistanceUnit::jupiter_radius => (7.1492, 7),
104        }
105    }
106}
107
108impl_const!(Distance, a_0, 5.29177210544, -11);
109impl_const!(Distance, r_e, 2.8179403227, -15);
110
111impl_quantity!(Distance, DistanceUnit, [DistanceUnit::mm]);
112impl_div_with_self_to_f64!(Distance);
113
114impl_mul!(Distance, Strain, Distance);