From 580880d0ce0350c45a68f55b011c336267be54e7 Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Sat, 6 Aug 2022 12:13:25 +0200 Subject: [PATCH] Add NumberDensity quantities: Volumetric, Areal, and Linear. --- src/si/areal_number_density.rs | 85 +++++++++++++++++++++++++++ src/si/linear_number_density.rs | 65 +++++++++++++++++++++ src/si/mod.rs | 3 + src/si/volumetric_number_density.rs | 90 +++++++++++++++++++++++++++++ 4 files changed, 243 insertions(+) create mode 100644 src/si/areal_number_density.rs create mode 100644 src/si/linear_number_density.rs create mode 100644 src/si/volumetric_number_density.rs diff --git a/src/si/areal_number_density.rs b/src/si/areal_number_density.rs new file mode 100644 index 00000000..b81dc145 --- /dev/null +++ b/src/si/areal_number_density.rs @@ -0,0 +1,85 @@ +//! Areal number density (base unit 1 per square meter, m⁻²). + +quantity! { + /// Areal number density (base unit 1 per square meter, m⁻²). + quantity: ArealNumberDensity; "areal number density"; + /// Dimension of areal number density, L⁻² (base unit 1 per square meter, m⁻²). + dimension: ISQ< + N2, // length + Z0, // mass + Z0, // time + Z0, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + kind: dyn (crate::si::marker::ConstituentConcentrationKind); + units { + @per_square_kilometer: prefix!(none) / prefix!(kilo) / prefix!(kilo); "km⁻²", + "per square kilometer", "per square kilometer"; + @per_square_meter: prefix!(none); "m⁻²", "per square meter", "per square meter"; + @per_square_decimeter: prefix!(none) / prefix!(deci) / prefix!(deci); "dm⁻²", + "per square decimeter", "per square decimeter"; + @per_square_centimeter: prefix!(none) / prefix!(centi) / prefix!(centi); "cm⁻²", + "per square centimeter", "per square centimeter"; + @per_square_millimeter: prefix!(none) / prefix!(milli) / prefix!(milli); "mm⁻²", + "per square millimeter", "per square millimeter"; + @per_square_micrometer: prefix!(none) / prefix!(micro) / prefix!(micro); "µm⁻²", + "per square micrometer", "per square micrometer"; + + @per_acre: prefix!(none) / 4.046_873_E3; "ac⁻²", "per acre", "per acre"; + @per_are: prefix!(none) / 1.0_E2; "a⁻²", "per are", "per are"; + @per_barn: prefix!(none) / 1.0_E-28; "b⁻²", "per barn", "per barn"; + @per_circular_mil: prefix!(none) / 5.067_075_E-10; "cmil⁻²", "per circular mil", + "per circular mil"; + @per_hectare: prefix!(none) / 1.0_E4; "ha⁻²", "per hectare", "per hectare"; + @per_square_foot: prefix!(none) / 9.290_304_E-2; "ft⁻²", "per square foot", + "per square foot"; + @per_square_inch: prefix!(none) / 6.451_6_E-4; "in⁻²", "per square inch", "per square inch"; + @per_square_mile: prefix!(none) / 2.589_988_E6; "mi⁻²", "per square mile", + "per square mile"; + @per_square_yard: prefix!(none) / 8.361_274_E-1; "yd⁻²", "per square yard", + "per square yard"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::area as a; + use crate::si::areal_number_density as n; + use crate::si::quantities::*; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: ArealNumberDensity = (V::one() + / Area::new::(V::one())).into(); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + + fn test, A: a::Conversion>() { + Test::assert_approx_eq(&ArealNumberDensity::new::(V::one()), + &(V::one() / Area::new::(V::one())).into()); + } + } + } +} diff --git a/src/si/linear_number_density.rs b/src/si/linear_number_density.rs new file mode 100644 index 00000000..9d2cc55b --- /dev/null +++ b/src/si/linear_number_density.rs @@ -0,0 +1,65 @@ +//! Linear number density (base unit 1 per meter, m⁻¹). + +quantity! { + /// Linear number density (base unit 1 per meter, m⁻¹). + quantity: LinearNumberDensity; "linear number density"; + /// Dimension of linear number density, L⁻¹ (base 1 unit per meter, m⁻¹). + dimension: ISQ< + N1, // length + Z0, // mass + Z0, // time + Z0, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + kind: dyn (crate::si::marker::ConstituentConcentrationKind); + units { + @per_kilometer: prefix!(none) / prefix!(kilo); "km⁻¹", "per kilometer", "per kilometer"; + @per_meter: prefix!(none); "m⁻¹", "per meter", "per meter"; + @per_decimeter: prefix!(none) / prefix!(deci); "dm⁻¹", "per decimeter", "per decimeter"; + @per_centimeter: prefix!(none) / prefix!(centi); "cm⁻¹", "per centimeter", "per centimeter"; + @per_millimeter: prefix!(none) / prefix!(milli); "mm⁻¹", "per millimeter", "per millimeter"; + + @per_foot: prefix!(none) / 3.048_E-1; "ft⁻¹", "per foot", "per foot"; + @per_foot_survey: prefix!(none) / 3.048_006_E-1; "ft (U.S. survey)", "foot (U.S. survey)", + "foot (U.S. survey)"; + @per_inch: prefix!(none) / 2.54_E-2; "in⁻¹", "per inch", "per inch"; + @per_mile: prefix!(none) / 1.609_344_E3; "mi⁻¹", "per mile", "per mile"; + @per_mile_survey: prefix!(none) / 1.609_347_E3; "mi⁻¹ (U.S. survey)", + "per mile (U.S. survey)", "per mile (U.S. survey)"; + @per_nautical_mile: prefix!(none) / 1.852_E3; "M⁻¹", "per nautical mile", + "per nautical mile"; + @per_yard: prefix!(none) / 9.144_E-1; "yd⁻¹", "per yard", "per yard"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::length as l; + use crate::si::linear_number_density as n; + use crate::si::quantities::*; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: LinearNumberDensity = (V::one() + / Length::new::(V::one())).into(); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + test::(); + test::(); + + fn test, L: l::Conversion>() { + Test::assert_approx_eq(&LinearNumberDensity::new::(V::one()), + &(V::one() / Length::new::(V::one())).into()); + } + } + } +} diff --git a/src/si/mod.rs b/src/si/mod.rs index 8072134e..ebc3b8df 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -54,6 +54,7 @@ system! { angular_velocity::AngularVelocity, area::Area, areal_mass_density::ArealMassDensity, + areal_number_density::ArealNumberDensity, available_energy::AvailableEnergy, capacitance::Capacitance, catalytic_activity::CatalyticActivity, @@ -86,6 +87,7 @@ system! { jerk::Jerk, length::Length, linear_mass_density::LinearMassDensity, + linear_number_density::LinearNumberDensity, linear_power_density::LinearPowerDensity, luminance::Luminance, luminous_intensity::LuminousIntensity, @@ -124,6 +126,7 @@ system! { velocity::Velocity, volume::Volume, volume_rate::VolumeRate, + volumetric_number_density::VolumetricNumberDensity, volumetric_power_density::VolumetricPowerDensity, } } diff --git a/src/si/volumetric_number_density.rs b/src/si/volumetric_number_density.rs new file mode 100644 index 00000000..3da330fd --- /dev/null +++ b/src/si/volumetric_number_density.rs @@ -0,0 +1,90 @@ +//! Volumetric number density (base unit 1 per cubic meter, m⁻³). + +quantity! { + /// Volumetric number density (base unit 1 per cubic meter, m⁻³). + quantity: VolumetricNumberDensity; "volumetric number density"; + /// Dimension of volumetric number density, L⁻³ (base unit 1 per cubic meter, m⁻³). + dimension: ISQ< + N3, // length + Z0, // mass + Z0, // time + Z0, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + kind: dyn (crate::si::marker::ConstituentConcentrationKind); + units { + @per_cubic_kilometer: prefix!(none) / prefix!(kilo) / prefix!(kilo) / prefix!(kilo); "km⁻³", + "per cubic kilometer", "per cubic kilometer"; + @per_cubic_meter: prefix!(none); "m⁻³", "per cubic meter", "per cubic meter"; + @per_cubic_decimeter: prefix!(none) / prefix!(deci) / prefix!(deci) / prefix!(deci); "dm⁻³", + "per cubic decimeter", "per cubic decimeter"; + @per_cubic_centimeter: prefix!(none) / prefix!(centi) / prefix!(centi) / prefix!(centi); + "cm⁻³", "per cubic centimeter", "per cubic centimeter"; + @per_cubic_millimeter: prefix!(none) / prefix!(milli) / prefix!(milli) / prefix!(milli); + "mm⁻³", "per cubic millimeter", "per cubic millimeter"; + + @per_cubic_foot: prefix!(none) / 2.831_685_E-2; "ft⁻³", "per cubic foot", "per cubic foot"; + @per_cubic_inch: prefix!(none) / 1.638_706_E-5; "in⁻³", "per cubic inch", "per cubic inch"; + @per_cubic_mile: prefix!(none) / 4.168_182_E9; "mi⁻³", "per cubic mile", "per cubic mile"; + @per_cubic_yard: prefix!(none) / 7.645_549_E-1; "yd⁻³", "per cubic yard", "per cubic yard"; + @per_fluid_ounce: prefix!(none) / 2.957_353_E-5; "per fl oz", "per fluid ounce", + "per fluid ounce"; + @per_fluid_ounce_imperial: prefix!(none) / 2.841_306_E-5; "per fl oz (UK)", + "per Imperial fluid ounce", "per Imperial fluid ounce"; + @per_gallon_imperial: prefix!(none) / 4.546_09_E-3; "per gal (UK)", "per Imperial gallon", + "per Imperial gallon"; + @per_gallon: prefix!(none) / 3.785_412_E-3; "per gal", "per gallon", "per gallon"; + @per_liter: prefix!(none) / prefix!(milli); "L⁻¹", "per liter", "per liter"; + @per_deciliter: prefix!(none) / prefix!(milli) / prefix!(deci); "dL⁻¹", "per deciliter", + "per deciliter"; + @per_centiliter: prefix!(none) / prefix!(milli) / prefix!(centi); "cL⁻¹", + "per centiliter", "per centiliter"; + @per_milliliter: prefix!(none) / prefix!(milli) / prefix!(milli); "mL⁻¹", + "per milliliter", "per milliliter"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::volume as v; + use crate::si::volumetric_number_density as n; + use crate::si::quantities::*; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: VolumetricNumberDensity = (V::one() + / Volume::new::(V::one())).into(); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + test::(); + test::(); + + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + + fn test, U: v::Conversion>() { + Test::assert_approx_eq(&VolumetricNumberDensity::new::(V::one()), + &(V::one() / Volume::new::(V::one())).into()); + } + } + } +}