Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
Units.hpp
Go to the documentation of this file.
1// Vulcan Unit Conversions
2// Common aerospace unit conversion utilities
3#pragma once
4
5#include <janus/math/Arithmetic.hpp>
6#include <janus/math/Logic.hpp>
8
9namespace vulcan::units {
10
11// =============================================================================
12// Angular Conversions
13// =============================================================================
14
16template <typename Scalar> constexpr Scalar deg_to_rad(const Scalar &deg) {
17 return deg * constants::angle::deg2rad;
18}
19
21template <typename Scalar> constexpr Scalar rad_to_deg(const Scalar &rad) {
22 return rad * constants::angle::rad2deg;
23}
24
26template <typename Scalar> constexpr Scalar wrap_to_2pi(const Scalar &angle) {
27 const double two_pi = 2.0 * constants::angle::pi;
28 Scalar wrapped = janus::fmod(angle, Scalar(two_pi));
29 return janus::where(wrapped < 0.0, wrapped + two_pi, wrapped);
30}
31
33template <typename Scalar> constexpr Scalar wrap_to_pi(const Scalar &angle) {
34 // Wrap to [0, 2pi), then shift to [-pi, pi)?
35 // Actually, simple fmod logic:
36 // angle - 2pi * floor((angle + pi) / 2pi)
37 // janus doesn't guarantee floor?
38 // let's use the 2pi wrap shifting.
40}
41
43template <typename Scalar>
44constexpr Scalar wrap_to_180(const Scalar &angle_deg) {
45 const double three_sixty = 360.0;
46 Scalar wrapped = janus::fmod(angle_deg, Scalar(three_sixty));
47 wrapped =
48 janus::where(wrapped < 0.0, wrapped + three_sixty, wrapped); // [0, 360)
49 // shift to [-180, 180)
50 return janus::where(wrapped >= 180.0, wrapped - three_sixty, wrapped);
51 // Wait, simpler: wrap_to_360(angle + 180) - 180
52 // reuse logic
53 // Scalar w = janus::fmod(angle_deg + 180.0, 360.0);
54 // w = janus::where(w < 0.0, w + 360.0, w);
55 // return w - 180.0;
56}
57
58// =============================================================================
59// Length Conversions
60// =============================================================================
61
63template <typename Scalar> constexpr Scalar ft_to_m(const Scalar &ft) {
64 return ft * 0.3048;
65}
66
68template <typename Scalar> constexpr Scalar m_to_ft(const Scalar &m) {
69 return m / 0.3048;
70}
71
73template <typename Scalar> constexpr Scalar nm_to_m(const Scalar &nm) {
74 return nm * 1852.0;
75}
76
78template <typename Scalar> constexpr Scalar m_to_nm(const Scalar &m) {
79 return m / 1852.0;
80}
81
83template <typename Scalar> constexpr Scalar km_to_m(const Scalar &km) {
84 return km * 1000.0;
85}
86
88template <typename Scalar> constexpr Scalar m_to_km(const Scalar &m) {
89 return m / 1000.0;
90}
91
92// =============================================================================
93// Speed Conversions
94// =============================================================================
95
97template <typename Scalar> constexpr Scalar kts_to_mps(const Scalar &kts) {
98 return kts * 0.514444;
99}
100
102template <typename Scalar> constexpr Scalar mps_to_kts(const Scalar &mps) {
103 return mps / 0.514444;
104}
105
107template <typename Scalar> constexpr Scalar fps_to_mps(const Scalar &fps) {
108 return fps * 0.3048;
109}
110
112template <typename Scalar> constexpr Scalar mps_to_fps(const Scalar &mps) {
113 return mps / 0.3048;
114}
115
116// =============================================================================
117// Mass/Force Conversions
118// =============================================================================
119
121template <typename Scalar> constexpr Scalar lbm_to_kg(const Scalar &lbm) {
122 return lbm * 0.45359237;
123}
124
126template <typename Scalar> constexpr Scalar kg_to_lbm(const Scalar &kg) {
127 return kg / 0.45359237;
128}
129
131template <typename Scalar> constexpr Scalar slug_to_kg(const Scalar &slug) {
132 return slug * 14.593903;
133}
134
136template <typename Scalar> constexpr Scalar kg_to_slug(const Scalar &kg) {
137 return kg / 14.593903;
138}
139
141template <typename Scalar> constexpr Scalar slug_to_lbm(const Scalar &slug) {
142 return slug * 32.17405;
143}
144
146template <typename Scalar> constexpr Scalar lbm_to_slug(const Scalar &lbm) {
147 return lbm / 32.17405;
148}
149
151template <typename Scalar> constexpr Scalar lbf_to_N(const Scalar &lbf) {
152 return lbf * 4.4482216;
153}
154
156template <typename Scalar> constexpr Scalar N_to_lbf(const Scalar &N) {
157 return N / 4.4482216;
158}
159
160// =============================================================================
161// Inertia (Moment of Inertia) Conversions
162// =============================================================================
163
165template <typename Scalar>
166constexpr Scalar slugft2_to_kgm2(const Scalar &slugft2) {
167 // 1 slug-ft² = 14.593903 kg * (0.3048 m)² = 1.35582 kg·m²
168 return slugft2 * 1.3558179;
169}
170
172template <typename Scalar>
173constexpr Scalar kgm2_to_slugft2(const Scalar &kgm2) {
174 return kgm2 / 1.3558179;
175}
176
178template <typename Scalar>
179constexpr Scalar lbmft2_to_kgm2(const Scalar &lbmft2) {
180 // 1 lbm-ft² = 0.45359237 kg * (0.3048 m)² = 0.042140 kg·m²
181 return lbmft2 * 0.04214011;
182}
183
185template <typename Scalar> constexpr Scalar kgm2_to_lbmft2(const Scalar &kgm2) {
186 return kgm2 / 0.04214011;
187}
188
190template <typename Scalar>
191constexpr Scalar lbmin2_to_kgm2(const Scalar &lbmin2) {
192 // 1 lbm-in² = 0.45359237 kg * (0.0254 m)² = 2.9264e-4 kg·m²
193 return lbmin2 * 2.9263966e-4;
194}
195
197template <typename Scalar> constexpr Scalar kgm2_to_lbmin2(const Scalar &kgm2) {
198 return kgm2 / 2.9263966e-4;
199}
200
202template <typename Scalar>
203constexpr Scalar slugin2_to_kgm2(const Scalar &slugin2) {
204 // 1 slug-in² = 14.593903 kg * (0.0254 m)² = 9.4154e-3 kg·m²
205 return slugin2 * 9.4154069e-3;
206}
207
209template <typename Scalar>
210constexpr Scalar kgm2_to_slugin2(const Scalar &kgm2) {
211 return kgm2 / 9.4154069e-3;
212}
213
214// =============================================================================
215// Pressure Conversions
216// =============================================================================
217
219template <typename Scalar> constexpr Scalar psi_to_Pa(const Scalar &psi) {
220 return psi * 6894.76;
221}
222
224template <typename Scalar> constexpr Scalar Pa_to_psi(const Scalar &Pa) {
225 return Pa / 6894.76;
226}
227
229template <typename Scalar> constexpr Scalar atm_to_Pa(const Scalar &atm) {
230 return atm * 101325.0;
231}
232
234template <typename Scalar> constexpr Scalar Pa_to_atm(const Scalar &Pa) {
235 return Pa / 101325.0;
236}
237
238// =============================================================================
239// Temperature Conversions
240// =============================================================================
241
243template <typename Scalar> constexpr Scalar C_to_K(const Scalar &C) {
244 return C + 273.15;
245}
246
248template <typename Scalar> constexpr Scalar K_to_C(const Scalar &K) {
249 return K - 273.15;
250}
251
253template <typename Scalar> constexpr Scalar F_to_K(const Scalar &F) {
254 return (F - 32.0) * 5.0 / 9.0 + 273.15;
255}
256
258template <typename Scalar> constexpr Scalar K_to_F(const Scalar &K) {
259 return (K - 273.15) * 9.0 / 5.0 + 32.0;
260}
261
263template <typename Scalar> constexpr Scalar R_to_K(const Scalar &R) {
264 return R * 5.0 / 9.0;
265}
266
268template <typename Scalar> constexpr Scalar K_to_R(const Scalar &K) {
269 return K * 9.0 / 5.0;
270}
271
272} // namespace vulcan::units
constexpr double rad2deg
Radians to degrees conversion factor.
Definition Constants.hpp:159
constexpr double deg2rad
Degrees to radians conversion factor.
Definition Constants.hpp:156
constexpr double pi
Pi.
Definition Constants.hpp:153
Definition Units.hpp:9
constexpr Scalar Pa_to_psi(const Scalar &Pa)
Convert Pascals to psi.
Definition Units.hpp:224
constexpr Scalar wrap_to_180(const Scalar &angle_deg)
Wrap angle to [-180, 180) degrees.
Definition Units.hpp:44
constexpr Scalar Pa_to_atm(const Scalar &Pa)
Convert Pascals to atmospheres.
Definition Units.hpp:234
constexpr Scalar psi_to_Pa(const Scalar &psi)
Convert psi to Pascals.
Definition Units.hpp:219
constexpr Scalar K_to_F(const Scalar &K)
Convert Kelvin to Fahrenheit.
Definition Units.hpp:258
constexpr Scalar deg_to_rad(const Scalar &deg)
Convert degrees to radians.
Definition Units.hpp:16
constexpr Scalar km_to_m(const Scalar &km)
Convert kilometers to meters.
Definition Units.hpp:83
constexpr Scalar lbm_to_kg(const Scalar &lbm)
Convert pounds-mass (lbm) to kilograms.
Definition Units.hpp:121
constexpr Scalar atm_to_Pa(const Scalar &atm)
Convert atmospheres to Pascals.
Definition Units.hpp:229
constexpr Scalar lbmft2_to_kgm2(const Scalar &lbmft2)
Convert lbm-ft² to kg-m²
Definition Units.hpp:179
constexpr Scalar slug_to_lbm(const Scalar &slug)
Convert slugs to pounds-mass (1 slug ≈ 32.174 lbm).
Definition Units.hpp:141
constexpr Scalar m_to_km(const Scalar &m)
Convert meters to kilometers.
Definition Units.hpp:88
constexpr Scalar m_to_ft(const Scalar &m)
Convert meters to feet.
Definition Units.hpp:68
constexpr Scalar kgm2_to_lbmft2(const Scalar &kgm2)
Convert kg-m² to lbm-ft²
Definition Units.hpp:185
constexpr Scalar mps_to_kts(const Scalar &mps)
Convert meters per second to knots.
Definition Units.hpp:102
constexpr Scalar wrap_to_2pi(const Scalar &angle)
Wrap angle to [0, 2π).
Definition Units.hpp:26
constexpr Scalar slugin2_to_kgm2(const Scalar &slugin2)
Convert slug-in² to kg-m²
Definition Units.hpp:203
constexpr Scalar kgm2_to_lbmin2(const Scalar &kgm2)
Convert kg-m² to lbm-in²
Definition Units.hpp:197
constexpr Scalar fps_to_mps(const Scalar &fps)
Convert feet per second to meters per second.
Definition Units.hpp:107
constexpr Scalar mps_to_fps(const Scalar &mps)
Convert meters per second to feet per second.
Definition Units.hpp:112
constexpr Scalar lbf_to_N(const Scalar &lbf)
Convert pound-force to Newtons.
Definition Units.hpp:151
constexpr Scalar slug_to_kg(const Scalar &slug)
Convert slugs to kilograms (1 slug = 1 lbf·s²/ft ≈ 14.5939 kg).
Definition Units.hpp:131
constexpr Scalar K_to_R(const Scalar &K)
Convert Kelvin to Rankine.
Definition Units.hpp:268
constexpr Scalar kts_to_mps(const Scalar &kts)
Convert knots to meters per second.
Definition Units.hpp:97
constexpr Scalar lbmin2_to_kgm2(const Scalar &lbmin2)
Convert lbm-in² to kg-m²
Definition Units.hpp:191
constexpr Scalar wrap_to_pi(const Scalar &angle)
Wrap angle to [-π, π).
Definition Units.hpp:33
constexpr Scalar slugft2_to_kgm2(const Scalar &slugft2)
Convert slug-ft² to kg-m²
Definition Units.hpp:166
constexpr Scalar rad_to_deg(const Scalar &rad)
Convert radians to degrees.
Definition Units.hpp:21
constexpr Scalar F_to_K(const Scalar &F)
Convert Fahrenheit to Kelvin.
Definition Units.hpp:253
constexpr Scalar R_to_K(const Scalar &R)
Convert Rankine to Kelvin.
Definition Units.hpp:263
constexpr Scalar K_to_C(const Scalar &K)
Convert Kelvin to Celsius.
Definition Units.hpp:248
constexpr Scalar lbm_to_slug(const Scalar &lbm)
Convert pounds-mass to slugs.
Definition Units.hpp:146
constexpr Scalar kg_to_lbm(const Scalar &kg)
Convert kilograms to pounds-mass (lbm).
Definition Units.hpp:126
constexpr Scalar kgm2_to_slugin2(const Scalar &kgm2)
Convert kg-m² to slug-in²
Definition Units.hpp:210
constexpr Scalar N_to_lbf(const Scalar &N)
Convert Newtons to pound-force.
Definition Units.hpp:156
constexpr Scalar ft_to_m(const Scalar &ft)
Convert feet to meters.
Definition Units.hpp:63
constexpr Scalar C_to_K(const Scalar &C)
Convert Celsius to Kelvin.
Definition Units.hpp:243
constexpr Scalar kgm2_to_slugft2(const Scalar &kgm2)
Convert kg-m² to slug-ft²
Definition Units.hpp:173
constexpr Scalar nm_to_m(const Scalar &nm)
Convert nautical miles to meters.
Definition Units.hpp:73
constexpr Scalar kg_to_slug(const Scalar &kg)
Convert kilograms to slugs.
Definition Units.hpp:136
constexpr Scalar m_to_nm(const Scalar &m)
Convert meters to nautical miles.
Definition Units.hpp:78