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);