Skip to content

Commit 57dd40c

Browse files
Add quantities for radioactivity and specific radioactivity.
1 parent 7c4b27b commit 57dd40c

5 files changed

+262
-0
lines changed

src/si/mod.rs

+3
Original file line numberDiff line numberDiff line change
@@ -107,15 +107,18 @@ system! {
107107
molar_flux::MolarFlux,
108108
molar_heat_capacity::MolarHeatCapacity,
109109
molar_mass::MolarMass,
110+
molar_radioactivity::MolarRadioactivity,
110111
molar_volume::MolarVolume,
111112
momentum::Momentum,
112113
power::Power,
113114
pressure::Pressure,
114115
radiant_exposure::RadiantExposure,
116+
radioactivity::Radioactivity,
115117
ratio::Ratio,
116118
solid_angle::SolidAngle,
117119
specific_area::SpecificArea,
118120
specific_heat_capacity::SpecificHeatCapacity,
121+
specific_radioactivity::SpecificRadioactivity,
119122
specific_volume::SpecificVolume,
120123
surface_electric_current_density::SurfaceElectricCurrentDensity,
121124
temperature_coefficient::TemperatureCoefficient,

src/si/molar_radioactivity.rs

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//! MolarRadioactivity (base unit becquerel per mole, s⁻¹ · mol⁻¹).
2+
3+
quantity! {
4+
/// MolarRadioactivity (base unit becquerel per mole, s⁻¹ · mol⁻¹).
5+
quantity: MolarRadioactivity; "molar radioactivity";
6+
/// Dimension of molar radioactivity, T⁻¹N⁻¹ (base unit becquerel per mole, s⁻¹ · mol⁻¹).
7+
dimension: ISQ<
8+
Z0, // length
9+
Z0, // mass
10+
N1, // time
11+
Z0, // electric current
12+
Z0, // thermodynamic temperature
13+
N1, // amount of substance
14+
Z0>; // luminous intensity
15+
kind: dyn (crate::si::marker::ConstituentConcentrationKind);
16+
17+
units {
18+
19+
@becquerel_per_mole: prefix!(none); "Bq/mol",
20+
"becquerel per mole", "becquerels per mole";
21+
22+
@curie_per_mole: 3.7_E10; "Ci/mol", "curie per mole", "curie per mole";
23+
24+
@disintegrations_per_minute_per_mole: 1.0 / 6.0_E1; "dpm/mol",
25+
"disintegration per minute per mole", "disintegrations per minute per mole";
26+
}
27+
}
28+
29+
#[cfg(test)]
30+
mod tests {
31+
storage_types! {
32+
use crate::num::One;
33+
use crate::si::radioactivity as rad;
34+
use crate::si::molar_radioactivity as mrad;
35+
use crate::si::quantities::*;
36+
use crate::si::amount_of_substance as aos;
37+
use crate::tests::Test;
38+
39+
#[test]
40+
fn check_dimension() {
41+
let _: MolarRadioactivity<V> = (Radioactivity::new::<rad::becquerel>(V::one()) / AmountOfSubstance::new::<aos::mole>(V::one())).into();
42+
}
43+
44+
#[test]
45+
fn check_units() {
46+
47+
test::<rad::becquerel, aos::mole, mrad::becquerel_per_mole>();
48+
test::<rad::curie, aos::mole, mrad::curie_per_mole>();
49+
test::<rad::disintegrations_per_minute, aos::mole, mrad::disintegrations_per_minute_per_mole>();
50+
51+
fn test<RAD: rad::Conversion<V>, AOS: aos::Conversion<V>, SRAD: mrad::Conversion<V>>() {
52+
Test::assert_approx_eq(&MolarRadioactivity::new::<SRAD>(V::one()),
53+
&(Radioactivity::new::<RAD>(V::one()) / AmountOfSubstance::new::<AOS>(V::one())).into());
54+
}
55+
}
56+
57+
58+
}
59+
}

src/si/radioactivity.rs

+118
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
//! Radioactivity (base unit becquerel, s⁻¹).
2+
3+
quantity! {
4+
/// Radioactivity (base unit becquerel, s⁻¹).
5+
quantity: Radioactivity; "radioactivity";
6+
/// Dimension of radioactivity, T⁻¹ (base unit becquerel, s⁻¹).
7+
dimension: ISQ<
8+
Z0, // length
9+
Z0, // mass
10+
N1, // time
11+
Z0, // electric current
12+
Z0, // thermodynamic temperature
13+
Z0, // amount of substance
14+
Z0>; // luminous intensity
15+
kind: dyn (crate::si::marker::ConstituentConcentrationKind);
16+
17+
units {
18+
@yottabecquerel: prefix!(yotta); "YBq", "yottabecquerel", "yottabecquerels";
19+
@zettabecquerel: prefix!(zetta); "ZBq", "zettabecquerel", "zettabecquerels";
20+
@exabecquerel: prefix!(exa); "EBq", "exabecquerel", "exabecquerels";
21+
@petabecquerel: prefix!(peta); "PBq", "petabecquerel", "petabecquerels";
22+
@terabecquerel: prefix!(tera); "TBq", "terabecquerel", "terabecquerels";
23+
@gigabecquerel: prefix!(giga); "GBq", "gigabecquerel", "gigabecquerels";
24+
@megabecquerel: prefix!(mega); "MBq", "megabecquerel", "megabecquerels";
25+
@kilobecquerel: prefix!(kilo); "kBq", "kilobecquerel", "kilobecquerels";
26+
@hectobecquerel: prefix!(hecto); "hBq", "hectobecquerel", "hectobecquerels";
27+
@decabecquerel: prefix!(deca); "daBq", "decabecquerel", "decabecquerels";
28+
/// The becquerel is one decay per second.
29+
@becquerel: prefix!(none); "Bq", "becquerel", "becquerels";
30+
@millibecquerel: prefix!(milli); "mBq", "millibecquerel", "millibecquerels";
31+
@microbecquerel: prefix!(micro); "µBq", "microbecquerel", "microbecquerels";
32+
@nanobecquerel: prefix!(nano); "nBq", "nanobecquerel", "nanobecquerels";
33+
34+
@gigacurie: prefix!(giga) * 3.7_E10; "GCi", "gigacurie", "gigacurie";
35+
@megacurie: prefix!(mega) * 3.7_E10; "MCi", "megacurie", "megacurie";
36+
@kilocurie: prefix!(kilo) * 3.7_E10; "kCi", "kilocurie", "kilocurie";
37+
@curie: 3.7_E10; "Ci", "curie", "curie";
38+
@millicurie: prefix!(milli) * 3.7_E10; "mCi", "millicurie", "millicurie";
39+
@microcurie: prefix!(micro) * 3.7_E10; "µCi", "microcurie", "microcurie";
40+
@nanocurie: prefix!(nano) * 3.7_E10; "nCi", "nanocurie", "nanocurie";
41+
42+
@disintegrations_per_minute: 1.0 / 6.0_E1; "dpm", "disintegration per minute", "disintegrations per minute";
43+
}
44+
}
45+
46+
#[cfg(test)]
47+
mod tests {
48+
storage_types! {
49+
use crate::num::One;
50+
use crate::si::radioactivity as rad;
51+
use crate::si::quantities::*;
52+
use crate::si::time as t;
53+
use crate::tests::Test;
54+
55+
#[test]
56+
fn check_dimension() {
57+
let _: Time<V> = (V::one() / Radioactivity::new::<rad::becquerel>(V::one())).into();
58+
let _: Radioactivity<V> = (V::one() / Time::new::<t::second>(V::one())).into();
59+
}
60+
61+
62+
63+
#[test]
64+
fn check_units() {
65+
66+
test::<t::second, rad::becquerel>();
67+
test::<t::decisecond, rad::decabecquerel>();
68+
test::<t::centisecond, rad::hectobecquerel>();
69+
test::<t::millisecond, rad::kilobecquerel>();
70+
test::<t::microsecond, rad::megabecquerel>();
71+
test::<t::nanosecond, rad::gigabecquerel>();
72+
test::<t::picosecond, rad::terabecquerel>();
73+
test::<t::femtosecond, rad::petabecquerel>();
74+
test::<t::attosecond, rad::exabecquerel>();
75+
test::<t::zeptosecond, rad::zettabecquerel>();
76+
test::<t::yoctosecond, rad::yottabecquerel>();
77+
78+
79+
fn test<T: t::Conversion<V>, RAD: rad::Conversion<V>>() {
80+
Test::assert_approx_eq(&(V::one() / Time::new::<T>(V::one())),
81+
&Radioactivity::new::<RAD>(V::one()).into());
82+
Test::assert_approx_eq(&Time::new::<T>(V::one()),
83+
&(V::one() / Radioactivity::new::<RAD>(V::one())).into());
84+
}
85+
}
86+
87+
#[test]
88+
fn check_curie() {
89+
90+
test::<rad::gigabecquerel, rad::gigacurie>();
91+
test::<rad::megabecquerel, rad::megacurie>();
92+
test::<rad::kilobecquerel, rad::kilocurie>();
93+
test::<rad::becquerel, rad::curie>();
94+
test::<rad::millibecquerel, rad::millicurie>();
95+
test::<rad::microbecquerel, rad::microcurie>();
96+
test::<rad::nanobecquerel, rad::nanocurie>();
97+
98+
fn test<RadBq: rad::Conversion<V>, RadCi: rad::Conversion<V>>() {
99+
Test::assert_approx_eq(&(V::one() * 3.7_E10 * Radioactivity::new::<RadBq>(V::one())),
100+
&Radioactivity::new::<RadCi>(V::one()));
101+
102+
}
103+
}
104+
105+
106+
#[test]
107+
fn check_dpm() {
108+
109+
test::<rad::becquerel, rad::disintegrations_per_minute>();
110+
111+
fn test<RadBq: rad::Conversion<V>, RadCi: rad::Conversion<V>>() {
112+
Test::assert_approx_eq(&(V::one() / 6_E1 * Radioactivity::new::<RadBq>(V::one())),
113+
&Radioactivity::new::<RadCi>(V::one()));
114+
115+
}
116+
}
117+
}
118+
}

src/si/specific_radioactivity.rs

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//! SpecificRadioactivity (base unit becquerel per kilogram, kg⁻¹ · s⁻¹).
2+
3+
quantity! {
4+
/// SpecificRadioactivity (base unit becquerel per kilogram, kg⁻¹ · s⁻¹).
5+
quantity: SpecificRadioactivity; "specific radioactivity";
6+
/// Dimension of specific radioactivity, M⁻¹T⁻¹ (base unit becquerel per kilogram, kg⁻¹ · s⁻¹).
7+
dimension: ISQ<
8+
Z0, // length
9+
N1, // mass
10+
N1, // time
11+
Z0, // electric current
12+
Z0, // thermodynamic temperature
13+
Z0, // amount of substance
14+
Z0>; // luminous intensity
15+
kind: dyn (crate::si::marker::ConstituentConcentrationKind);
16+
17+
units {
18+
19+
@becquerel_per_kilogram: prefix!(none); "Bq/kg",
20+
"becquerel per kilogram", "becquerels per kilogram";
21+
22+
@curie_per_kilogram: 3.7_E10; "Ci/kg", "curie per kilogram", "curie per kilogram";
23+
24+
@disintegrations_per_minute_per_kilogram: 1.0 / 6.0_E1; "dpm/kg",
25+
"disintegration per minute per kilogram", "disintegrations per minute per kilogram";
26+
}
27+
}
28+
29+
#[cfg(test)]
30+
mod tests {
31+
storage_types! {
32+
use crate::num::One;
33+
use crate::si::radioactivity as rad;
34+
use crate::si::specific_radioactivity as srad;
35+
use crate::si::quantities::*;
36+
use crate::si::mass as m;
37+
use crate::tests::Test;
38+
39+
#[test]
40+
fn check_dimension() {
41+
let _: SpecificRadioactivity<V> = (Radioactivity::new::<rad::becquerel>(V::one()) / Mass::new::<m::kilogram>(V::one())).into();
42+
}
43+
44+
#[test]
45+
fn check_units() {
46+
47+
test::<rad::becquerel, m::kilogram, srad::becquerel_per_kilogram>();
48+
test::<rad::curie, m::kilogram, srad::curie_per_kilogram>();
49+
test::<rad::disintegrations_per_minute, m::kilogram, srad::disintegrations_per_minute_per_kilogram>();
50+
51+
fn test<RAD: rad::Conversion<V>, M: m::Conversion<V>, SRAD: srad::Conversion<V>>() {
52+
Test::assert_approx_eq(&SpecificRadioactivity::new::<SRAD>(V::one()),
53+
&(Radioactivity::new::<RAD>(V::one()) / Mass::new::<M>(V::one())).into());
54+
}
55+
}
56+
57+
58+
}
59+
}

src/si/volumetric_number_rate.rs

+23
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@ quantity! {
4343
"per liter second";
4444
@per_milliliter_second: prefix!(none) / prefix!(milli) / prefix!(milli); "mL⁻¹ · s⁻¹",
4545
"per milliliter second", "per milliliter second";
46+
47+
48+
@becquerel_per_cubic_meter: prefix!(none); "Bq·m⁻³",
49+
"becquerel per cubic meter", "becquerels per cubic meter";
50+
51+
@curie_per_cubic_meter: 3.7_E10; "Ci·m⁻³", "curie per cubic meter", "curie per cubic meter";
52+
53+
@disintegrations_per_minute_per_cubic_meter: 1.0 / 6.0_E1; "dpm·m⁻³",
54+
"disintegration per minute per cubic meter", "disintegrations per minute per cubic meter";
4655
}
4756
}
4857

@@ -51,6 +60,7 @@ mod test {
5160
storage_types! {
5261
use crate::num::One;
5362
use crate::si::volumetric_number_rate as vnr;
63+
use crate::si::radioactivity as rad;
5464
use crate::si::quantities::*;
5565
use crate::si::time as t;
5666
use crate::si::volume as vol;
@@ -87,5 +97,18 @@ mod test {
8797
/ Volume::new::<VOL>(V::one())).into());
8898
}
8999
}
100+
101+
#[test]
102+
fn check_units_volumetric_radioactivity() {
103+
104+
test::<rad::becquerel, vol::cubic_meter, vnr::becquerel_per_cubic_meter>();
105+
test::<rad::curie, vol::cubic_meter, vnr::curie_per_cubic_meter>();
106+
test::<rad::disintegrations_per_minute, vol::cubic_meter, vnr::disintegrations_per_minute_per_cubic_meter>();
107+
108+
fn test<RAD: rad::Conversion<V>, VOL: vol::Conversion<V>, VNR: vnr::Conversion<V>>() {
109+
Test::assert_approx_eq(&VolumetricNumberRate::new::<VNR>(V::one()),
110+
&(Radioactivity::new::<RAD>(V::one()) / Volume::new::<VOL>(V::one())).into());
111+
}
112+
}
90113
}
91114
}

0 commit comments

Comments
 (0)