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