uom/si/
molar_concentration.rs

1//! Molar concentration (base unit mole per cubic meter, mol · m⁻³).
2
3quantity! {
4    /// Molar concentration (base unit mole per cubic meter, mol · m⁻³).
5    quantity: MolarConcentration; "molar concentration";
6    /// Dimension of molar concentration, L⁻³N (base unit mole per cubic meter, mol · m⁻³).
7    dimension: ISQ<
8        N3,     // length
9        Z0,     // mass
10        Z0,     // time
11        Z0,     // electric current
12        Z0,     // thermodynamic temperature
13        P1,     // amount of substance
14        Z0>;    // luminous intensity
15    kind: dyn (crate::si::marker::ConstituentConcentrationKind);
16    units {
17        @yottamole_per_cubic_meter: prefix!(yotta); "Ymol/m³",
18            "yottamole per cubic meter", "yottamoles per cubic meter";
19        @zettamole_per_cubic_meter: prefix!(zetta); "Zmol/m³",
20            "zettamole per cubic meter", "zettamoles per cubic meter";
21        @examole_per_cubic_meter: prefix!(exa); "Emol/m³",
22            "examole per cubic meter", "examoles per cubic meter";
23        @petamole_per_cubic_meter: prefix!(peta); "Pmol/m³",
24            "petamole per cubic meter", "petamoles per cubic meter";
25        @teramole_per_cubic_meter: prefix!(tera); "Tmol/m³",
26            "teramole per cubic meter", "teramoles per cubic meter";
27        @gigamole_per_cubic_meter: prefix!(giga); "Gmol/m³",
28            "gigamole per cubic meter", "gigamoles per cubic meter";
29        @megamole_per_cubic_meter: prefix!(mega); "Mmol/m³",
30            "megamole per cubic meter", "megamoles per cubic meter";
31        @kilomole_per_cubic_meter: prefix!(kilo); "kmol/m³",
32            "kilomole per cubic meter", "kilomoles per cubic meter";
33        @hectomole_per_cubic_meter: prefix!(hecto); "hmol/m³",
34            "hectomole per cubic meter", "hectomoles per cubic meter";
35        @decamole_per_cubic_meter: prefix!(deca); "damol/m³",
36            "decamole per cubic meter", "decamoles per cubic meter";
37        @mole_per_cubic_meter: prefix!(none); "mol/m³",
38            "mole per cubic meter", "moles per cubic meter";
39        @decimole_per_cubic_meter: prefix!(deci); "dmol/m³",
40            "decimole per cubic meter", "decimoles per cubic meter";
41        @centimole_per_cubic_meter: prefix!(centi); "cmol/m³",
42            "centimole per cubic meter", "centimoles per cubic meter";
43        @millimole_per_cubic_meter: prefix!(milli); "mmol/m³",
44            "millimole per cubic meter", "millimoles per cubic meter";
45        @micromole_per_cubic_meter: prefix!(micro); "µmol/m³",
46            "micromole per cubic meter", "micromoles per cubic meter";
47        @nanomole_per_cubic_meter: prefix!(nano); "nmol/m³",
48            "nanomole per cubic meter", "nanomoles per cubic meter";
49        @picomole_per_cubic_meter: prefix!(pico); "pmol/m³",
50            "picomole per cubic meter", "picomoles per cubic meter";
51        @femtomole_per_cubic_meter: prefix!(femto); "fmol/m³",
52            "femtomole per cubic meter", "femtomoles per cubic meter";
53        @attomole_per_cubic_meter: prefix!(atto); "amol/m³",
54            "attomole per cubic meter", "attomoles per cubic meter";
55        @zeptomole_per_cubic_meter: prefix!(zepto); "zmol/m³",
56            "zeptomole per cubic meter", "zeptomoles per cubic meter";
57        @yoctomole_per_cubic_meter: prefix!(yocto); "ymol/m³",
58            "yoctomole per cubic meter", "yoctomoles per cubic meter";
59
60        @kilomole_per_cubic_decimeter:
61            prefix!(kilo) / prefix!(deci) / prefix!(deci) / prefix!(deci);
62            "kmol/dm³", "kilomole per cubic decimeter", "kilomoles per cubic decimeter";
63        @kilomole_per_liter:
64            prefix!(kilo) / prefix!(milli);
65            "kmol/L", "kilomole per liter", "kilomoles per liter";
66        @mole_per_cubic_decimeter:
67            prefix!(none) / prefix!(deci) / prefix!(deci) / prefix!(deci);
68            "mol/dm³", "mole per cubic decimeter", "moles per cubic decimeter";
69        @mole_per_liter:
70            prefix!(none) / prefix!(milli);
71            "mol/L", "mole per liter", "moles per liter";
72        @millimole_per_cubic_decimeter:
73            prefix!(milli) / prefix!(deci) / prefix!(deci) / prefix!(deci);
74            "mmol/dm³", "millimole per cubic decimeter", "millimoles per cubic decimeter";
75        @millimole_per_liter:
76            prefix!(milli) / prefix!(milli);
77            "mmol/L", "millimole per liter", "millimoles per liter";
78        @micromole_per_cubic_decimeter:
79            prefix!(micro) / prefix!(deci) / prefix!(deci) / prefix!(deci);
80            "μmol/dm³", "micromole per cubic decimeter", "micromoles per cubic decimeter";
81        @micromole_per_liter:
82            prefix!(micro) / prefix!(milli);
83            "μmol/L", "micromole per liter", "micromoles per liter";
84        @nanomole_per_cubic_decimeter:
85            prefix!(nano) / prefix!(deci) / prefix!(deci) / prefix!(deci);
86            "nmol/dm³", "nanomole per cubic decimeter", "nanomoles per cubic decimeter";
87        @nanomole_per_liter:
88            prefix!(nano) / prefix!(milli);
89            "nmol/L", "nanomole per liter", "nanomoles per liter";
90        @picomole_per_cubic_decimeter:
91            prefix!(pico) / prefix!(deci) / prefix!(deci) / prefix!(deci);
92            "pmol/dm³", "picomole per cubic decimeter", "picomoles per cubic decimeter";
93        @picomole_per_liter:
94            prefix!(pico) / prefix!(milli);
95            "pmol/L", "picomole per liter", "picomoles per liter";
96        @femtomole_per_cubic_decimeter:
97            prefix!(femto) / prefix!(deci) / prefix!(deci) / prefix!(deci);
98            "fmol/dm³", "femtomole per cubic decimeter", "femtomoles per cubic decimeter";
99        @femtomole_per_liter:
100            prefix!(femto) / prefix!(milli);
101            "fmol/L", "femtomole per liter", "femtomoles per liter";
102
103        @kilomole_per_deciliter:
104            prefix!(kilo) / prefix!(deci) / prefix!(milli);
105            "kmol/dL", "kilomole per deciliter", "kilomoles per deciliter";
106        @mole_per_deciliter:
107            prefix!(none) / prefix!(deci) / prefix!(milli);
108            "mol/dL", "mole per deciliter", "moles per deciliter";
109        @millimole_per_deciliter:
110            prefix!(milli) / prefix!(deci) / prefix!(milli);
111            "mmol/dL", "millimole per deciliter", "millimoles per deciliter";
112        @micromole_per_deciliter:
113            prefix!(micro) / prefix!(deci) / prefix!(milli);
114            "μmol/dL", "micromole per deciliter", "micromoles per deciliter";
115        @nanomole_per_deciliter:
116            prefix!(nano) / prefix!(deci) / prefix!(milli);
117            "nmol/dL", "nanomole per deciliter", "nanomoles per deciliter";
118        @picomole_per_deciliter:
119            prefix!(pico) / prefix!(deci) / prefix!(milli);
120            "pmol/dL", "picomole per deciliter", "picomoles per deciliter";
121        @femtomole_per_deciliter:
122            prefix!(femto) / prefix!(deci) / prefix!(milli);
123            "fmol/dL", "femtomole per deciliter", "femtomoles per deciliter";
124
125        @kilomole_per_milliliter:
126            prefix!(kilo) / prefix!(milli) / prefix!(milli);
127            "kmol/mL", "kilomole per milliliter", "kilomoles per milliliter";
128        @mole_per_milliliter:
129            prefix!(none) / prefix!(milli) / prefix!(milli);
130            "mol/mL", "mole per milliliter", "moles per milliliter";
131        @millimole_per_milliliter:
132            prefix!(milli) / prefix!(milli) / prefix!(milli);
133            "mmol/mL", "millimole per milliliter", "millimoles per milliliter";
134        @micromole_per_milliliter:
135            prefix!(micro) / prefix!(milli) / prefix!(milli);
136            "μmol/mL", "micromole per milliliter", "micromoles per milliliter";
137        @nanomole_per_milliliter:
138            prefix!(nano) / prefix!(milli) / prefix!(milli);
139            "nmol/mL", "nanomole per milliliter", "nanomoles per milliliter";
140        @picomole_per_milliliter:
141            prefix!(pico) / prefix!(milli) / prefix!(milli);
142            "pmol/mL", "picomole per milliliter", "picomoles per milliliter";
143        @femtomole_per_milliliter:
144            prefix!(femto) / prefix!(milli) / prefix!(milli);
145            "fmol/mL", "femtomole per milliliter", "femtomoles per milliliter";
146
147        @particle_per_cubic_meter: 1.0_E0 / 6.022_140_76_E23; "particle/m³",
148            "particle per cubic meter", "particles per cubic meter";
149        @particle_per_cubic_decimeter:
150            1.0_E0 / 6.022_140_76_E23 / prefix!(deci) / prefix!(deci) / prefix!(deci);
151            "particle/dm³", "particle per cubic decimeter", "particles per cubic decimeter";
152        @particle_per_liter: 1.0_E0 / 6.022_140_76_E23 / prefix!(milli); "particle/L",
153            "particle per liter", "particles per liter";
154        @particle_per_deciliter: 1.0_E0 / 6.022_140_76_E23 / prefix!(deci) / prefix!(milli);
155            "particle/dL", "particle per deciliter", "particles per deciliter";
156        @particle_per_milliliter: 1.0_E0 / 6.022_140_76_E23 / prefix!(milli) / prefix!(milli);
157            "particle/mL", "particle per milliliter", "particles per milliliter";
158    }
159}
160
161#[cfg(test)]
162mod test {
163    storage_types! {
164        use crate::num::One;
165        use crate::si::amount_of_substance as aos;
166        use crate::si::molar_concentration as c;
167        use crate::si::quantities::*;
168        use crate::si::volume as v;
169        use crate::tests::Test;
170
171        #[test]
172        fn check_dimension() {
173            let _: MolarConcentration<V> = (AmountOfSubstance::new::<aos::mole>(V::one())
174                / Volume::new::<v::cubic_meter>(V::one())).into();
175        }
176
177        #[test]
178        fn check_units() {
179            test::<aos::yottamole, v::cubic_meter, c::yottamole_per_cubic_meter>();
180            test::<aos::zettamole, v::cubic_meter, c::zettamole_per_cubic_meter>();
181            test::<aos::examole, v::cubic_meter, c::examole_per_cubic_meter>();
182            test::<aos::petamole, v::cubic_meter, c::petamole_per_cubic_meter>();
183            test::<aos::teramole, v::cubic_meter, c::teramole_per_cubic_meter>();
184            test::<aos::gigamole, v::cubic_meter, c::gigamole_per_cubic_meter>();
185            test::<aos::megamole, v::cubic_meter, c::megamole_per_cubic_meter>();
186            test::<aos::kilomole, v::cubic_meter, c::kilomole_per_cubic_meter>();
187            test::<aos::hectomole, v::cubic_meter, c::hectomole_per_cubic_meter>();
188            test::<aos::decamole, v::cubic_meter, c::decamole_per_cubic_meter>();
189            test::<aos::mole, v::cubic_meter, c::mole_per_cubic_meter>();
190            test::<aos::decimole, v::cubic_meter, c::decimole_per_cubic_meter>();
191            test::<aos::centimole, v::cubic_meter, c::centimole_per_cubic_meter>();
192            test::<aos::millimole, v::cubic_meter, c::millimole_per_cubic_meter>();
193            test::<aos::micromole, v::cubic_meter, c::micromole_per_cubic_meter>();
194            test::<aos::nanomole, v::cubic_meter, c::nanomole_per_cubic_meter>();
195            test::<aos::picomole, v::cubic_meter, c::picomole_per_cubic_meter>();
196            test::<aos::femtomole, v::cubic_meter, c::femtomole_per_cubic_meter>();
197            test::<aos::attomole, v::cubic_meter, c::attomole_per_cubic_meter>();
198            test::<aos::zeptomole, v::cubic_meter, c::zeptomole_per_cubic_meter>();
199            test::<aos::yoctomole, v::cubic_meter, c::yoctomole_per_cubic_meter>();
200
201            test::<aos::kilomole, v::cubic_decimeter, c::kilomole_per_cubic_decimeter>();
202            test::<aos::kilomole, v::liter, c::kilomole_per_liter>();
203            test::<aos::mole, v::cubic_decimeter, c::mole_per_cubic_decimeter>();
204            test::<aos::mole, v::liter, c::mole_per_liter>();
205            test::<aos::millimole, v::cubic_decimeter, c::millimole_per_cubic_decimeter>();
206            test::<aos::millimole, v::liter, c::millimole_per_liter>();
207            test::<aos::micromole, v::cubic_decimeter, c::micromole_per_cubic_decimeter>();
208            test::<aos::micromole, v::liter, c::micromole_per_liter>();
209            test::<aos::nanomole, v::cubic_decimeter, c::nanomole_per_cubic_decimeter>();
210            test::<aos::nanomole, v::liter, c::nanomole_per_liter>();
211            test::<aos::picomole, v::cubic_decimeter, c::picomole_per_cubic_decimeter>();
212            test::<aos::picomole, v::liter, c::picomole_per_liter>();
213            test::<aos::femtomole, v::cubic_decimeter, c::femtomole_per_cubic_decimeter>();
214            test::<aos::femtomole, v::liter, c::femtomole_per_liter>();
215
216            test::<aos::kilomole, v::deciliter, c::kilomole_per_deciliter>();
217            test::<aos::mole, v::deciliter, c::mole_per_deciliter>();
218            test::<aos::millimole, v::deciliter, c::millimole_per_deciliter>();
219            test::<aos::micromole, v::deciliter, c::micromole_per_deciliter>();
220            test::<aos::nanomole, v::deciliter, c::nanomole_per_deciliter>();
221            test::<aos::picomole, v::deciliter, c::picomole_per_deciliter>();
222            test::<aos::femtomole, v::deciliter, c::femtomole_per_deciliter>();
223
224            test::<aos::kilomole, v::milliliter, c::kilomole_per_milliliter>();
225            test::<aos::mole, v::milliliter, c::mole_per_milliliter>();
226            test::<aos::millimole, v::milliliter, c::millimole_per_milliliter>();
227            test::<aos::micromole, v::milliliter, c::micromole_per_milliliter>();
228            test::<aos::nanomole, v::milliliter, c::nanomole_per_milliliter>();
229            test::<aos::picomole, v::milliliter, c::picomole_per_milliliter>();
230            test::<aos::femtomole, v::milliliter, c::femtomole_per_milliliter>();
231
232            test::<aos::particle, v::cubic_meter, c::particle_per_cubic_meter>();
233            test::<aos::particle, v::cubic_decimeter, c::particle_per_cubic_decimeter>();
234            test::<aos::particle, v::liter, c::particle_per_liter>();
235            test::<aos::particle, v::deciliter, c::particle_per_deciliter>();
236            test::<aos::particle, v::milliliter, c::particle_per_milliliter>();
237
238            fn test<AOS: aos::Conversion<V>, U: v::Conversion<V>, C: c::Conversion<V>>() {
239                Test::assert_approx_eq(&MolarConcentration::new::<C>(V::one()),
240                    &(AmountOfSubstance::new::<AOS>(V::one()) / Volume::new::<U>(V::one())).into());
241            }
242        }
243    }
244}