uom/si/
available_energy.rs

1//! Available energy (base unit joule per kilogram, m² · s⁻²).
2
3quantity! {
4    /// Available energy (base unit joule per kilogram, m² · s⁻²).
5    quantity: AvailableEnergy; "available energy";
6    /// Dimension of available energy, L²T⁻² (base unit joule per kilogram, m² · s⁻²).
7    dimension: ISQ<
8        P2,     // length
9        Z0,     // mass
10        N2,     // time
11        Z0,     // electric current
12        Z0,     // thermodynamic temperature
13        Z0,     // amount of substance
14        Z0>;    // luminous intensity
15    units {
16        @yottajoule_per_kilogram: prefix!(yotta); "YJ/kg", "yottajoule per kilogram",
17            "yottajoules per kilogram";
18        @zettajoule_per_kilogram: prefix!(zetta); "ZJ/kg", "zettajoule per kilogram",
19            "zettajoules per kilogram";
20        @exajoule_per_kilogram: prefix!(exa); "EJ/kg", "exajoule per kilogram",
21            "exajoules per kilogram";
22        @petajoule_per_kilogram: prefix!(peta); "PJ/kg", "petajoule per kilogram",
23            "petajoules per kilogram";
24        @terajoule_per_kilogram: prefix!(tera); "TJ/kg", "terajoule per kilogram",
25            "terajoules per kilogram";
26        @gigajoule_per_kilogram: prefix!(giga); "GJ/kg", "gigajoule per kilogram",
27            "gigajoules per kilogram";
28        @megajoule_per_kilogram: prefix!(mega); "MJ/kg", "megajoule per kilogram",
29            "megajoules per kilogram";
30        @kilojoule_per_kilogram: prefix!(kilo); "kJ/kg", "kilojoule per kilogram",
31            "kilojoules per kilogram";
32        @hectojoule_per_kilogram: prefix!(hecto); "hJ/kg", "hectojoule per kilogram",
33            "hectojoules per kilogram";
34        @decajoule_per_kilogram: prefix!(deca); "daJ/kg", "decajoule per kilogram",
35            "decajoules per kilogram";
36        /// Derived unit of available energy.
37        @joule_per_kilogram: prefix!(none); "J/kg", "joule per kilogram", "joules per kilogram";
38        @decijoule_per_kilogram: prefix!(deci); "dJ/kg", "decijoule per kilogram",
39            "decijoules per kilogram";
40        @centijoule_per_kilogram: prefix!(centi); "cJ/kg", "centijoule per kilogram",
41            "centijoules per kilogram";
42        @millijoule_per_kilogram: prefix!(milli); "mJ/kg", "millijoule per kilogram",
43            "millijoules per kilogram";
44        @microjoule_per_kilogram: prefix!(micro); "µJ/kg", "microjoule per kilogram",
45            "microjoules per kilogram";
46        @nanojoule_per_kilogram: prefix!(nano); "nJ/kg", "nanojoule per kilogram",
47            "nanojoules per kilogram";
48        @picojoule_per_kilogram: prefix!(pico); "pJ/kg", "picojoule per kilogram",
49            "picojoules per kilogram";
50        @femtojoule_per_kilogram: prefix!(femto); "fJ/kg", "femtojoule per kilogram",
51            "femtojoules per kilogram";
52        @attojoule_per_kilogram: prefix!(atto); "aJ/kg", "attojoule per kilogram",
53            "attojoules per kilogram";
54        @zeptojoule_per_kilogram: prefix!(zepto); "zJ/kg", "zeptojoule per kilogram",
55            "zeptojoules per kilogram";
56        @yoctojoule_per_kilogram: prefix!(yocto); "yJ/kg", "yoctojoule per kilogram",
57            "yoctojoules per kilogram";
58
59        @joule_per_zeptogram: prefix!(yotta); "J/zg", "joule per zeptogram",
60            "joules per zeptogram";
61        @joule_per_attogram: prefix!(zetta); "J/ag", "joule per attogram", "joules per attogram";
62        @joule_per_femtogram: prefix!(exa); "J/fg", "joule per femtogram", "joules per femtogram";
63        @joule_per_picogram: prefix!(peta); "J/pg", "joule per picogram", "joules per picogram";
64        @joule_per_nanogram: prefix!(tera); "J/ng", "joule per nanogram", "joules per nanogram";
65        @joule_per_microgram: prefix!(giga); "J/µg", "joule per microgram", "joules per microgram";
66        @joule_per_milligram: prefix!(mega); "J/mg", "joule per milligram", "joules per milligram";
67        @joule_per_gram: prefix!(kilo); "J/g", "joule per gram", "joules per gram";
68        @joule_per_megagram: prefix!(milli); "J/Mg", "joule per megagram", "joules per megagram";
69        @joule_per_gigagram: prefix!(micro); "J/Gg", "joule per gigagram", "joules per gigagram";
70        @joule_per_teragram: prefix!(nano); "J/Tg", "joule per teragram", "joules per teragram";
71        @joule_per_petagram: prefix!(pico); "J/Pg", "joule per petagram", "joules per petagram";
72        @joule_per_exagram: prefix!(femto); "J/Eg", "joule per exagram", "joules per exagram";
73        @joule_per_zettagram: prefix!(atto); "J/Zg", "joule per zettagram", "joules per zettagram";
74        @joule_per_yottagram: prefix!(zepto); "J/Yg", "joule per yottagram",
75            "joules per yottagram";
76
77        @btu_it_per_pound: 2.326_000_171_078_704_E3; "Btu (IT)/lb",
78            "British thermal unit (IT) per pound", "British thermal units (IT) per pound";
79        @btu_per_pound: 2.324_443_707_610_621_E3; "Btu/lb", "British thermal unit per pound",
80            "British thermal units per pound";
81        @calorie_it_per_gram: 4.186_8_E3; "cal (IT)/lb", "calorie (IT) per gram",
82            "calories (IT) per gram";
83        @calorie_per_gram: 4.184_E3; "cal/lb", "calorie per gram", "calories per gram";
84    }
85}
86
87#[cfg(test)]
88mod tests {
89    storage_types! {
90        use crate::num::One;
91        use crate::si::available_energy as v;
92        use crate::si::energy as e;
93        use crate::si::mass as m;
94        use crate::si::quantities::*;
95        use crate::tests::Test;
96
97        #[test]
98        fn check_dimension() {
99            let _: AvailableEnergy<V> = Energy::new::<e::joule>(V::one())
100                / Mass::new::<m::kilogram>(V::one());
101        }
102
103        #[test]
104        fn check_units() {
105            test::<e::yottajoule, m::kilogram, v::yottajoule_per_kilogram>();
106            test::<e::exajoule, m::kilogram, v::exajoule_per_kilogram>();
107            test::<e::terajoule, m::kilogram, v::terajoule_per_kilogram>();
108            test::<e::megajoule, m::kilogram, v::megajoule_per_kilogram>();
109            test::<e::joule, m::kilogram, v::joule_per_kilogram>();
110            test::<e::microjoule, m::kilogram, v::microjoule_per_kilogram>();
111            test::<e::picojoule, m::kilogram, v::picojoule_per_kilogram>();
112            test::<e::attojoule, m::kilogram, v::attojoule_per_kilogram>();
113            test::<e::yoctojoule, m::kilogram, v::yoctojoule_per_kilogram>();
114
115            test::<e::joule, m::zeptogram, v::joule_per_zeptogram>();
116            test::<e::joule, m::femtogram, v::joule_per_femtogram>();
117            test::<e::joule, m::nanogram, v::joule_per_nanogram>();
118            test::<e::joule, m::milligram, v::joule_per_milligram>();
119            test::<e::joule, m::gigagram, v::joule_per_gigagram>();
120            test::<e::joule, m::petagram, v::joule_per_petagram>();
121            test::<e::joule, m::zettagram, v::joule_per_zettagram>();
122
123            test::<e::btu_it, m::pound, v::btu_it_per_pound>();
124            test::<e::btu, m::pound, v::btu_per_pound>();
125            test::<e::calorie_it, m::gram, v::calorie_it_per_gram>();
126            test::<e::calorie, m::gram, v::calorie_per_gram>();
127
128            fn test<E: e::Conversion<V>, M: m::Conversion<V>, A: v::Conversion<V>>() {
129                Test::assert_approx_eq(&AvailableEnergy::new::<A>(V::one()),
130                    &(Energy::new::<E>(V::one()) / Mass::new::<M>(V::one())));
131            }
132        }
133    }
134}