From ccdc6936d73dd0da1cda688c3b5a2ffd3ceb15c9 Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Fri, 5 Aug 2022 16:05:37 +0200 Subject: [PATCH 01/20] Add ElectricalResistivity quantity and related units. --- src/si/electrical_resistivity.rs | 117 +++++++++++++++++++++++++++++++ src/si/mod.rs | 1 + 2 files changed, 118 insertions(+) create mode 100644 src/si/electrical_resistivity.rs diff --git a/src/si/electrical_resistivity.rs b/src/si/electrical_resistivity.rs new file mode 100644 index 00000000..fa0eef60 --- /dev/null +++ b/src/si/electrical_resistivity.rs @@ -0,0 +1,117 @@ +//! Electrical resistivity (base unit ohm meter, m³ · kg · s⁻³ · A⁻²). + +quantity! { + /// Electrical resistivity (base unit ohm meter, m³ · kg · s⁻³ · A⁻²). + quantity: ElectricalResistivity; "electrical resistivity"; + /// Dimension of electrical resistivity, L³MT⁻³I⁻² (base unit ohm meter, m³ · kg · s⁻³ · A⁻²). + dimension: ISQ< + P3, // length + P1, // mass + N3, // time + N2, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @yottaohm_meter: prefix!(yotta); "YΩ · m", "yottaohm meter", "yottaohm meters"; + @zettaohm_meter: prefix!(zetta); "ZΩ · m", "zettaohm meter", "zettaohm meters"; + @exaohm_meter: prefix!(exa); "EΩ · m", "exaohm meter", "exaohm meters"; + @petaohm_meter: prefix!(peta); "PΩ · m", "petaohm meter", "petaohm meters"; + @teraohm_meter: prefix!(tera); "TΩ · m", "teraohm meter", "teraohm meters"; + @gigaohm_meter: prefix!(giga); "GΩ · m", "gigaohm meter", "gigaohm meters"; + @megaohm_meter: prefix!(mega); "MΩ · m", "megaohm meter", "megaohm meters"; + @kiloohm_meter: prefix!(kilo); "kΩ · m", "kiloohm meter", "kiloohm meters"; + @hectoohm_meter: prefix!(hecto); "hΩ · m", "hectoohm meter", "hectoohm meters"; + @decaohm_meter: prefix!(deca); "daΩ · m", "decaohm meter", "decaohm meters"; + /// Derived unit of electrical resistance. + @ohm_meter: prefix!(none); "Ω · m", "ohm meter", "ohm meters"; + @deciohm_meter: prefix!(deci); "dΩ · m", "deciohm meter", "deciohm meters"; + @centiohm_meter: prefix!(centi); "cΩ · m", "centiohm meter", "centiohm meters"; + @milliohm_meter: prefix!(milli); "mΩ · m", "milliohm meter", "milliohm meters"; + @microohm_meter: prefix!(micro); "µΩ · m", "microohm meter", "microohm meters"; + @nanoohm_meter: prefix!(nano); "nΩ · m", "nanoohm meter", "nanoohm meters"; + @picoohm_meter: prefix!(pico); "pΩ · m", "picoohm meter", "picoohm meters"; + @femtoohm_meter: prefix!(femto); "fΩ · m", "femtoohm meter", "femtoohm meters"; + @attoohm_meter: prefix!(atto); "aΩ · m", "attoohm meter", "attoohm meters"; + @zeptoohm_meter: prefix!(zepto); "zΩ · m", "zeptoohm meter", "zeptoohm meters"; + @yoctoohm_meter: prefix!(yocto); "yΩ · m", "yoctoohm meter", "yoctoohm meters"; + + @abohm_meter: 1.0_E-9; "abΩ · m", "abohm meter", "abohm meters"; + @statohm_meter: 8.987_552_917_115_481_E11; "statΩ · m", "statohm meter", "statohm meters"; + + @ohm_centimeter: prefix!(none) * prefix!(centi); "Ω · cm", "ohm centimeter", + "ohm centimeters"; + @abohm_centimeter: 1.0_E-9 * prefix!(centi); "abΩ · cm", "abohm centimeter", + "abohm centimeters"; + @statohm_centimeter: 8.987_552_917_115_481_E11 * prefix!(centi); "statΩ · cm", + "statohm centimeter", "statohm centimeters"; + + @ohm_inch: 2.54_E-2; "Ω · in", "ohm inch", "ohm inches"; + @ohm_foot: 3.048_E-1; "Ω · ft", "ohm foot", "ohm feet"; + @ohm_yard: 9.144_E-1; "Ω · yd", "ohm yard", "ohm yards"; + + @ohm_square_millimeter_per_meter: prefix!(milli) * prefix!(milli); "Ω · mm²/m", + "ohm square millimeter per meter", "ohm square millimeters per meter"; + } +} + +#[cfg(test)] +mod tests { + storage_types! { + use crate::num::One; + use crate::si::electrical_resistance as r; + use crate::si::electrical_resistivity as er; + use crate::si::length as l; + use crate::si::quantities::*; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: ElectricalResistivity = ElectricalResistance::new::(V::one()) + * Length::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + + test::(); + test::(); + + test::(); + test::(); + test::(); + + test::(); + test::(); + test::(); + + test::(); + + fn test, R: r::Conversion, L: l::Conversion>() { + Test::assert_approx_eq(&ElectricalResistivity::new::(V::one()), + &(ElectricalResistance::new::(V::one()) + * Length::new::(V::one()))); + } + } + } +} diff --git a/src/si/mod.rs b/src/si/mod.rs index 4dc28f61..dfba2968 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -65,6 +65,7 @@ system! { electric_potential::ElectricPotential, electrical_conductance::ElectricalConductance, electrical_resistance::ElectricalResistance, + electrical_resistivity::ElectricalResistivity, energy::Energy, force::Force, frequency::Frequency, From 3157863f8adbf9f45b361b5d9f202aef9db00239 Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Fri, 5 Aug 2022 17:18:05 +0200 Subject: [PATCH 02/20] Add ElectricalConductivity quantity with related units. --- src/si/electrical_conductivity.rs | 50 +++++++++++++++++++++++++++++++ src/si/mod.rs | 1 + 2 files changed, 51 insertions(+) create mode 100644 src/si/electrical_conductivity.rs diff --git a/src/si/electrical_conductivity.rs b/src/si/electrical_conductivity.rs new file mode 100644 index 00000000..ffd703d9 --- /dev/null +++ b/src/si/electrical_conductivity.rs @@ -0,0 +1,50 @@ +//! Electrical conductivity (base unit siemens per meter, m⁻³ · kg⁻¹ · s³ · A²). + +quantity! { + /// Electrical conductivity (base unit siemens per meter, m⁻³ · kg⁻¹ · s³ · A²). + quantity: ElectricalConductivity; "electrical conductivity"; + /// Dimension of electrical conductivity, L⁻³M⁻¹T³I² (base unit siemens per meter, + /// m⁻³ · kg⁻¹ · s³ · A²). + dimension: ISQ< + N3, // length + N1, // mass + P3, // time + P2, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @siemens_per_meter: prefix!(none); "S/m", "siemens per meter", "siemens per meter"; + @siemens_per_centimeter: prefix!(none) / prefix!(centi); "S/cm", "siemens per centimeter", + "siemens per centimeter"; + } +} + +#[cfg(test)] +mod tests { + storage_types! { + use crate::num::One; + use crate::si::electrical_conductance as g; + use crate::si::length as l; + use crate::si::electrical_conductivity as ec; + use crate::si::quantities::*; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: ElectricalConductivity = ElectricalConductance::new::(V::one()) + / Length::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + + fn test, G: g::Conversion, L: l::Conversion>() { + Test::assert_approx_eq(&ElectricalConductivity::new::(V::one()), + &(ElectricalConductance::new::(V::one()) / Length::new::(V::one()))); + } + } + } +} diff --git a/src/si/mod.rs b/src/si/mod.rs index 4dc28f61..422a2fd5 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -64,6 +64,7 @@ system! { electric_current::ElectricCurrent, electric_potential::ElectricPotential, electrical_conductance::ElectricalConductance, + electrical_conductivity::ElectricalConductivity, electrical_resistance::ElectricalResistance, energy::Energy, force::Force, From 62f5ea835d582a3bc76c76188b40536c70453b6d Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Fri, 5 Aug 2022 20:06:30 +0200 Subject: [PATCH 03/20] Add ElectricPermittivity with related units. --- src/si/electric_permittivity.rs | 50 +++++++++++++++++++++++++++++++++ src/si/mod.rs | 1 + 2 files changed, 51 insertions(+) create mode 100644 src/si/electric_permittivity.rs diff --git a/src/si/electric_permittivity.rs b/src/si/electric_permittivity.rs new file mode 100644 index 00000000..69d0f9c5 --- /dev/null +++ b/src/si/electric_permittivity.rs @@ -0,0 +1,50 @@ +//! Electric permittivity (base unit farad per meter, m⁻³ · kg⁻¹ · s⁴ · A²). + +quantity! { + /// Electric permittivity (base unit farad per meter, m⁻³ · kg⁻¹ · s⁴ · A²). + quantity: ElectricPermittivity; "electric permittivity"; + /// Dimension of electric permittivity, L⁻³M⁻¹T⁴I² (base unit farad per meter, + /// m⁻³ · kg⁻¹ · s⁴ · A²). + dimension: ISQ< + N3, // length + N1, // mass + P4, // time + P2, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @farad_per_meter: prefix!(none); "F/m", "farad per meter", "farads per meter"; + @vacuum_electric_permittivity: 8.854_187_8128_E-12; "ε₀", "vacuum electric permittivity", + "vacuum electric permittivity"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::capacitance as c; + use crate::si::electric_permittivity as ep; + use crate::si::length as l; + use crate::si::quantities::*; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: ElectricPermittivity = Capacitance::new::(V::one()) + / Length::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + + fn test, C: c::Conversion, L: l::Conversion>() { + Test::assert_approx_eq(&ElectricPermittivity::new::(V::one()), + &(Capacitance::new::(V::one()) + / Length::new::(V::one()))); + } + } + } +} diff --git a/src/si/mod.rs b/src/si/mod.rs index 4dc28f61..07377e53 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -62,6 +62,7 @@ system! { dynamic_viscosity::DynamicViscosity, electric_charge::ElectricCharge, electric_current::ElectricCurrent, + electric_permittivity::ElectricPermittivity, electric_potential::ElectricPotential, electrical_conductance::ElectricalConductance, electrical_resistance::ElectricalResistance, From 7d2c8b401132bfb46e4dd58587acb75de3e2c97a Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Sun, 7 Aug 2022 10:53:26 +0200 Subject: [PATCH 04/20] Add MassFlux quantity with related units. --- src/si/mass_flux.rs | 61 +++++++++++++++++++++++++++++++++++++++++++++ src/si/mod.rs | 1 + 2 files changed, 62 insertions(+) create mode 100644 src/si/mass_flux.rs diff --git a/src/si/mass_flux.rs b/src/si/mass_flux.rs new file mode 100644 index 00000000..e751d841 --- /dev/null +++ b/src/si/mass_flux.rs @@ -0,0 +1,61 @@ +//! Mass flux (base unit kilogram per square meter second, m⁻² · kg · s⁻¹). + +quantity! { + /// Mass flux (base unit kilogram per square meter second, m⁻² · kg · s⁻¹). + quantity: MassFlux; "mass flux"; + /// Dimension of mass flux, L⁻²MT⁻¹ (base unit kilogram per square meter second, + /// m⁻² · kg · s⁻¹). + dimension: ISQ< + N2, // length + P1, // mass + N1, // time + Z0, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @kilogram_per_square_meter_second: prefix!(none); "kg/(m² · s)", + "kilogram per square meter second", "kilograms per square meter second"; + @gram_per_square_centimeter_second: prefix!(milli) / prefix!(centi) / prefix!(centi); + "g/(cm² · s)", "gram per square centimeter second", + "grams per square centimeter second"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::mass as m; + use crate::si::mass_flux as mf; + use crate::si::quantities::*; + use crate::si::time as t; + use crate::si::area as a; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: MassFlux = Mass::new::(V::one()) + / Time::new::(V::one()) + / Area::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + + fn test, + A: a::Conversion, + T: t::Conversion, + MF: mf::Conversion>() + { + Test::assert_approx_eq(&MassFlux::new::(V::one()), + &(Mass::new::(V::one()) + / Time::new::(V::one()) + / Area::new::(V::one()))); + } + } + } +} diff --git a/src/si/mod.rs b/src/si/mod.rs index 4dc28f61..7feca7c2 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -83,6 +83,7 @@ system! { mass::Mass, mass_concentration::MassConcentration, mass_density::MassDensity, + mass_flux::MassFlux, mass_rate::MassRate, molar_concentration::MolarConcentration, molar_energy::MolarEnergy, From 55ac1c5bc596e5afe980cacaff0e2257cf27e91a Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Sun, 7 Aug 2022 14:09:48 +0200 Subject: [PATCH 05/20] Add MagneticPermeability quantity with related units. --- src/si/magnetic_permeability.rs | 50 +++++++++++++++++++++++++++++++++ src/si/mod.rs | 1 + 2 files changed, 51 insertions(+) create mode 100644 src/si/magnetic_permeability.rs diff --git a/src/si/magnetic_permeability.rs b/src/si/magnetic_permeability.rs new file mode 100644 index 00000000..042743ee --- /dev/null +++ b/src/si/magnetic_permeability.rs @@ -0,0 +1,50 @@ +//! Magnetic permeability (base unit henry per meter, m · kg · s⁻² · A⁻²). + +quantity! { + /// Magnetic permeability (base unit henry per meter, m · kg · s⁻² · A⁻²). + quantity: MagneticPermeability; "magnetic permeability"; + /// Dimension of magnetic permeability, LMT⁻²I⁻² (base unit henry per meter, + /// m · kg · s⁻² · A⁻²). + dimension: ISQ< + P1, // length + P1, // mass + N2, // time + N2, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @henry_per_meter: prefix!(none); "H/m", "henry per meter", "henrys per meter"; + @vacuum_magnetic_permeability: 1.256_637_062_12_E-6; "µ₀", "vacuum magnetic permeability", + "vacuum magnetic permeability"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::inductance as ind; + use crate::si::magnetic_permeability as mp; + use crate::si::length as l; + use crate::si::quantities::*; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: MagneticPermeability = Inductance::new::(V::one()) + / Length::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + + fn test, IND: ind::Conversion, L: l::Conversion>() { + Test::assert_approx_eq(&MagneticPermeability::new::(V::one()), + &(Inductance::new::(V::one()) + / Length::new::(V::one()))); + } + } + } +} diff --git a/src/si/mod.rs b/src/si/mod.rs index dfba2968..b968a085 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -81,6 +81,7 @@ system! { luminous_intensity::LuminousIntensity, magnetic_flux::MagneticFlux, magnetic_flux_density::MagneticFluxDensity, + magnetic_permeability::MagneticPermeability, mass::Mass, mass_concentration::MassConcentration, mass_density::MassDensity, From 8f24d0fd80293252b297c6f545f19c1820887d8a Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Tue, 9 Aug 2022 15:14:48 +0200 Subject: [PATCH 06/20] Add LinearMassDensity and ArealMassDensity quantities with related units. --- src/si/areal_mass_density.rs | 58 +++++++++++++++++++++++++++++++ src/si/linear_mass_density.rs | 64 +++++++++++++++++++++++++++++++++++ src/si/mod.rs | 2 ++ 3 files changed, 124 insertions(+) create mode 100644 src/si/areal_mass_density.rs create mode 100644 src/si/linear_mass_density.rs diff --git a/src/si/areal_mass_density.rs b/src/si/areal_mass_density.rs new file mode 100644 index 00000000..a1dd8820 --- /dev/null +++ b/src/si/areal_mass_density.rs @@ -0,0 +1,58 @@ +//! Areal mass density (base unit kilogram per square meter, m⁻² · kg). + +quantity! { + /// Areal mass density (base unit kilogram per square meter, m⁻² · kg). + quantity: ArealMassDensity; "areal mass density"; + /// Dimension of areal mass density, L⁻²M (base unit kilogram per square meter, m⁻² · kg). + dimension: ISQ< + N2, // length + P1, // mass + Z0, // time + Z0, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @kilogram_per_square_meter: prefix!(none); "kg/m²", "kilogram per square meter", + "kilograms per square meter"; + @gram_per_square_meter: prefix!(milli); "g/m²", "gram per square meter", + "grams per square meter"; + @gram_per_square_centimeter: prefix!(milli) / prefix!(centi) / prefix!(centi); "g/cm²", + "gram per square centimeter", "grams per square centimeter"; + + @ounce_per_square_foot: 2.834_952_E-2 / 9.290_304_E-2; "oz/ft²", "ounce per square foot", + "ounces per square foot"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::mass as m; + use crate::si::areal_mass_density as d; + use crate::si::quantities::*; + use crate::si::area as a; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: ArealMassDensity = Mass::new::(V::one()) + / Area::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + + test::(); + + fn test, A: a::Conversion, D: d::Conversion>() { + Test::assert_approx_eq(&ArealMassDensity::new::(V::one()), + &(Mass::new::(V::one()) / Area::new::(V::one()))); + } + } + } +} diff --git a/src/si/linear_mass_density.rs b/src/si/linear_mass_density.rs new file mode 100644 index 00000000..58c8007d --- /dev/null +++ b/src/si/linear_mass_density.rs @@ -0,0 +1,64 @@ +//! Linear mass density (base unit kilogram per meter, m⁻¹ · kg). + +quantity! { + /// Linear mass density (base unit kilogram per meter, m⁻¹ · kg). + quantity: LinearMassDensity; "linear mass density"; + /// Dimension of linear mass density, L⁻¹M (base unit kilogram per meter, m⁻¹ · kg). + dimension: ISQ< + N1, // length + P1, // mass + Z0, // time + Z0, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @kilogram_per_meter: prefix!(none); "kg/m", "kilogram per meter", "kilograms per meter"; + @gram_per_kilometer: prefix!(milli) / prefix!(kilo); "g/km", "gram per kilometer", + "grams per kilometer"; + @gram_per_centimeter: prefix!(milli) / prefix!(centi); "g/cm", "gram per centimeter", + "grams per centimeter"; + + @ounce_per_foot: 2.834_952_E-2 / 3.048_E-1; "oz/ft", "ounce per foot", "ounces per foot"; + @ounce_per_inch: 2.834_952_E-2 / 2.54_E-2; "oz/in", "ounce per inch", "ounces per inch"; + @pound_per_yard: 4.535_924_E-1 / 9.144_E-1; "lb/yd", "pound per yard", "pounds per yard"; + @pound_per_foot: 4.535_924_E-1 / 3.048_E-1; "lb/ft", "pound per foot", "pounds per foot"; + @pound_per_inch: 4.535_924_E-1 / 2.54_E-2; "lb/in", "pound per inch", "pounds per inch"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::mass as m; + use crate::si::linear_mass_density as d; + use crate::si::quantities::*; + use crate::si::length as l; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: LinearMassDensity = Mass::new::(V::one()) + / Length::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + + test::(); + test::(); + test::(); + test::(); + test::(); + + fn test, L: l::Conversion, D: d::Conversion>() { + Test::assert_approx_eq(&LinearMassDensity::new::(V::one()), + &(Mass::new::(V::one()) / Length::new::(V::one()))); + } + } + } +} diff --git a/src/si/mod.rs b/src/si/mod.rs index 9e341bcc..5590585a 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -53,6 +53,7 @@ system! { angular_jerk::AngularJerk, angular_velocity::AngularVelocity, area::Area, + areal_mass_density::ArealMassDensity, available_energy::AvailableEnergy, capacitance::Capacitance, catalytic_activity::CatalyticActivity, @@ -79,6 +80,7 @@ system! { information_rate::InformationRate, jerk::Jerk, length::Length, + linear_mass_density::LinearMassDensity, luminance::Luminance, luminous_intensity::LuminousIntensity, magnetic_flux::MagneticFlux, From eaf1d7a88471765a44d3f28f938bcc7eb1b362b8 Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Wed, 10 Aug 2022 12:45:50 +0200 Subject: [PATCH 07/20] Add electric charge density quantities with related units. --- src/si/electric_charge_areal_density.rs | 52 +++++++++++++++++++ src/si/electric_charge_linear_density.rs | 51 +++++++++++++++++++ src/si/electric_charge_volumetric_density.rs | 53 ++++++++++++++++++++ src/si/mod.rs | 3 ++ 4 files changed, 159 insertions(+) create mode 100644 src/si/electric_charge_areal_density.rs create mode 100644 src/si/electric_charge_linear_density.rs create mode 100644 src/si/electric_charge_volumetric_density.rs diff --git a/src/si/electric_charge_areal_density.rs b/src/si/electric_charge_areal_density.rs new file mode 100644 index 00000000..aba7e8d6 --- /dev/null +++ b/src/si/electric_charge_areal_density.rs @@ -0,0 +1,52 @@ +//! Electric charge areal density (base unit coulomb per square meter, m⁻² · A · s). + +quantity! { + ///Electric charge areal density (base unit coulomb per square meter, m⁻² · A · s). + quantity: ElectricChargeArealDensity; "electric charge areal density"; + /// Dimension of electric charge areal density, L⁻²TI (base unit coulomb per square meter, + /// m⁻² · A · s). + dimension: ISQ< + N2, // length + Z0, // mass + P1, // time + P1, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + kind: dyn (crate::si::marker::ConstituentConcentrationKind); + units { + @coulomb_per_square_meter: prefix!(none); "C/m²", "coulomb per square meter", + "coulombs per square meter"; + @coulomb_per_square_centimeter: prefix!(none) / prefix!(centi) / prefix!(centi); "C/cm²", + "coulomb per square centimeter", "coulombs per square centimeter"; + } +} + +#[cfg(test)] +mod tests { + storage_types! { + use crate::num::One; + use crate::si::electric_charge as q; + use crate::si::electric_charge_areal_density as ecad; + use crate::si::quantities::*; + use crate::si::area as a; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: ElectricChargeArealDensity = (ElectricCharge::new::(V::one()) + / Area::new::(V::one())).into(); + } + + #[test] + fn check_units() { + test::(); + test::(); + + fn test, A: a::Conversion, ECAD: ecad::Conversion>() { + Test::assert_approx_eq(&ElectricChargeArealDensity::new::(V::one()), + &(ElectricCharge::new::(V::one()) / Area::new::(V::one())).into()); + } + } + } +} diff --git a/src/si/electric_charge_linear_density.rs b/src/si/electric_charge_linear_density.rs new file mode 100644 index 00000000..53467c2d --- /dev/null +++ b/src/si/electric_charge_linear_density.rs @@ -0,0 +1,51 @@ +//! Electric charge linear density (base unit coulomb per meter, m⁻¹ · A · s). + +quantity! { + ///Electric charge linear density (base unit coulomb per meter, m⁻¹ · A · s). + quantity: ElectricChargeLinearDensity; "electric charge linear density"; + /// Dimension of electric charge linear density, L⁻¹TI (base unit coulomb per meter, + /// m⁻¹ · A · s). + dimension: ISQ< + N1, // length + Z0, // mass + P1, // time + P1, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + kind: dyn (crate::si::marker::ConstituentConcentrationKind); + units { + @coulomb_per_meter: prefix!(none); "C/m", "coulomb per meter", "coulombs per meter"; + @coulomb_per_centimeter: prefix!(none) / prefix!(centi); "C/cm", "coulomb per centimeter", + "coulombs per centimeter"; + } +} + +#[cfg(test)] +mod tests { + storage_types! { + use crate::num::One; + use crate::si::electric_charge as q; + use crate::si::electric_charge_linear_density as ecld; + use crate::si::quantities::*; + use crate::si::length as l; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: ElectricChargeLinearDensity = (ElectricCharge::new::(V::one()) + / Length::new::(V::one())).into(); + } + + #[test] + fn check_units() { + test::(); + test::(); + + fn test, L: l::Conversion, ECLD: ecld::Conversion>() { + Test::assert_approx_eq(&ElectricChargeLinearDensity::new::(V::one()), + &(ElectricCharge::new::(V::one()) / Length::new::(V::one())).into()); + } + } + } +} diff --git a/src/si/electric_charge_volumetric_density.rs b/src/si/electric_charge_volumetric_density.rs new file mode 100644 index 00000000..a2431c84 --- /dev/null +++ b/src/si/electric_charge_volumetric_density.rs @@ -0,0 +1,53 @@ +//! Electric charge volumetric density (base unit coulomb per cubic meter, m⁻³ · A · s). + +quantity! { + ///Electric charge volumetric density (base unit coulomb per cubic meter, m⁻³ · A · s). + quantity: ElectricChargeVolumetricDensity; "electric charge volumetric density"; + /// Dimension of electric charge volumetric density, TIL⁻³ (base unit coulomb per cubic meter, + /// m⁻³ · A · s). + dimension: ISQ< + N3, // length + Z0, // mass + P1, // time + P1, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + kind: dyn (crate::si::marker::ConstituentConcentrationKind); + units { + @coulomb_per_cubic_meter: prefix!(none); "C/m³", "coulomb per cubic meter", + "coulombs per cubic meter"; + @coulomb_per_cubic_centimeter: + prefix!(none) / prefix!(centi) / prefix!(centi) / prefix!(centi); "C/cm³", + "coulomb per cubic centimeter", "coulombs per cubic centimeter"; + } +} + +#[cfg(test)] +mod tests { + storage_types! { + use crate::num::One; + use crate::si::electric_charge as q; + use crate::si::electric_charge_volumetric_density as ecvd; + use crate::si::quantities::*; + use crate::si::volume as v; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: ElectricChargeVolumetricDensity = (ElectricCharge::new::(V::one()) + / Volume::new::(V::one())).into(); + } + + #[test] + fn check_units() { + test::(); + test::(); + + fn test, VOL: v::Conversion, ECVD: ecvd::Conversion>() { + Test::assert_approx_eq(&ElectricChargeVolumetricDensity::new::(V::one()), + &(ElectricCharge::new::(V::one()) / Volume::new::(V::one())).into()); + } + } + } +} diff --git a/src/si/mod.rs b/src/si/mod.rs index 9e341bcc..f92aa8ac 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -61,6 +61,9 @@ system! { diffusion_coefficient::DiffusionCoefficient, dynamic_viscosity::DynamicViscosity, electric_charge::ElectricCharge, + electric_charge_areal_density::ElectricChargeArealDensity, + electric_charge_linear_density::ElectricChargeLinearDensity, + electric_charge_volumetric_density::ElectricChargeVolumetricDensity, electric_current::ElectricCurrent, electric_permittivity::ElectricPermittivity, electric_potential::ElectricPotential, From 2d6d5003930461618068020a8d1fe59573738f17 Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Wed, 10 Aug 2022 13:46:15 +0200 Subject: [PATCH 08/20] Add ElectricDisplacementField with related units. --- src/si/electric_displacement_field.rs | 51 +++++++++++++++++++++++++++ src/si/mod.rs | 1 + 2 files changed, 52 insertions(+) create mode 100644 src/si/electric_displacement_field.rs diff --git a/src/si/electric_displacement_field.rs b/src/si/electric_displacement_field.rs new file mode 100644 index 00000000..3c8346ba --- /dev/null +++ b/src/si/electric_displacement_field.rs @@ -0,0 +1,51 @@ +//! Electric displacement field (base unit coulomb per square meter, m⁻² · A · s). + +quantity! { + ///Electric displacement field (base unit coulomb per square meter, m⁻² · A · s). + quantity: ElectricDisplacementField; "electric displacement field"; + /// Dimension of electric displacement field, L⁻²TI (base unit coulomb per square meter, + /// m⁻² · A · s). + dimension: ISQ< + N2, // length + Z0, // mass + P1, // time + P1, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @coulomb_per_square_meter: prefix!(none); "C/m²", "coulomb per square meter", + "coulombs per square meter"; + @coulomb_per_square_centimeter: prefix!(none) / prefix!(centi) / prefix!(centi); "C/cm²", + "coulomb per square centimeter", "coulombs per square centimeter"; + } +} + +#[cfg(test)] +mod tests { + storage_types! { + use crate::num::One; + use crate::si::electric_charge as q; + use crate::si::electric_displacement_field as d; + use crate::si::quantities::*; + use crate::si::area as a; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: ElectricDisplacementField = ElectricCharge::new::(V::one()) + / Area::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + + fn test, A: a::Conversion, D: d::Conversion>() { + Test::assert_approx_eq(&ElectricDisplacementField::new::(V::one()), + &(ElectricCharge::new::(V::one()) / Area::new::(V::one()))); + } + } + } +} diff --git a/src/si/mod.rs b/src/si/mod.rs index 9e341bcc..bb37616f 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -62,6 +62,7 @@ system! { dynamic_viscosity::DynamicViscosity, electric_charge::ElectricCharge, electric_current::ElectricCurrent, + electric_displacement_field::ElectricDisplacementField, electric_permittivity::ElectricPermittivity, electric_potential::ElectricPotential, electrical_conductance::ElectricalConductance, From 22e0f6949c886fdc81a05ec92fc7e3e415dbc0b1 Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Tue, 9 Aug 2022 19:42:27 +0200 Subject: [PATCH 09/20] Add Surface Electric Current Density with related units. --- src/si/mod.rs | 1 + src/si/surface_electric_current_density.rs | 56 ++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/si/surface_electric_current_density.rs diff --git a/src/si/mod.rs b/src/si/mod.rs index 9e341bcc..fdd98752 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -99,6 +99,7 @@ system! { ratio::Ratio, solid_angle::SolidAngle, specific_heat_capacity::SpecificHeatCapacity, + surface_electric_current_density::SurfaceElectricCurrentDensity, temperature_interval::TemperatureInterval, thermal_conductivity::ThermalConductivity, thermodynamic_temperature::ThermodynamicTemperature, diff --git a/src/si/surface_electric_current_density.rs b/src/si/surface_electric_current_density.rs new file mode 100644 index 00000000..14187800 --- /dev/null +++ b/src/si/surface_electric_current_density.rs @@ -0,0 +1,56 @@ +//! Surface electric current density (base unit ampere per meter, ). + +quantity! { + /// Surface electric current density (base unit ampere per meter, m⁻¹ · A). + quantity: SurfaceElectricCurrentDensity; "surface electric current density"; + /// Dimension of surface electric current density, IL⁻¹ (base unit ampere per meter, m⁻¹ · A). + dimension: ISQ< + N1, // length + Z0, // mass + Z0, // time + P1, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + kind: dyn (crate::si::marker::ConstituentConcentrationKind); + units { + @ampere_per_meter: prefix!(none); "A/m", "ampere per meter", "amperes per meter"; + @ampere_per_centimeter: prefix!(none) / prefix!(centi) ; "A/cm", "ampere per centimeter", + "amperes per centimeter"; + @ampere_per_millimeter: prefix!(none) / prefix!(milli) ; "A/mm", "ampere per millimeter", + "amperes per millimeter"; + @ampere_per_micrometer: prefix!(none) / prefix!(micro) ; "A/μm", "ampere per micrometer", + "amperes per micrometer"; + } +} + +#[cfg(test)] +mod tests { + storage_types! { + use crate::num::One; + use crate::si::length as l; + use crate::si::electric_current as i; + use crate::si::surface_electric_current_density as ecd; + use crate::si::quantities::*; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: SurfaceElectricCurrentDensity = (ElectricCurrent::new::(V::one()) + / Length::new::(V::one())).into(); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + test::(); + + fn test, L: l::Conversion, ECD: ecd::Conversion>() { + Test::assert_approx_eq(&SurfaceElectricCurrentDensity::new::(V::one()), + &(ElectricCurrent::new::(V::one()) / Length::new::(V::one())).into()); + } + } + } +} From 970d28554bc102650c6645eb887437f5787a467d Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Wed, 10 Aug 2022 15:21:42 +0200 Subject: [PATCH 10/20] Add magnetic H field with related units. --- src/si/magnetic_field_strength.rs | 58 +++++++++++++++++++++++++++++++ src/si/mod.rs | 1 + 2 files changed, 59 insertions(+) create mode 100644 src/si/magnetic_field_strength.rs diff --git a/src/si/magnetic_field_strength.rs b/src/si/magnetic_field_strength.rs new file mode 100644 index 00000000..2f67b0b2 --- /dev/null +++ b/src/si/magnetic_field_strength.rs @@ -0,0 +1,58 @@ +//! Magnetic field strength (H field) (base unit ampere per meter, m⁻¹ · A). + +quantity! { + /// Magnetic field strength (H field) (base unit ampere per meter, m⁻¹ · A). + quantity: MagneticFieldStrength; "magnetic field strength (H field)"; + /// Dimension of magnetic field strength (H field), L⁻¹I (base unit ampere per meter, m⁻¹ · A). + dimension: ISQ< + N1, // length + Z0, // mass + Z0, // time + P1, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @ampere_per_meter: prefix!(none); "A/m", "ampere per meter", "amperes per meter"; + @ampere_per_centimeter: prefix!(none) / prefix!(centi); "A/cm", "ampere per centimeter", + "amperes per centimeter"; + @ampere_per_millimeter: prefix!(none) / prefix!(milli); "A/mm", "ampere per millimeter", + "amperes per millimeter"; + @ampere_per_micrometer: prefix!(none) / prefix!(micro); "A/μm", "ampere per micrometer", + "amperes per micrometer"; + + /// 1 oersted = 1000/(4π) A/m + @oersted: 79.577_471_545_947_67; "Oe", "oersted", "oersteds"; + } +} + +#[cfg(test)] +mod tests { + storage_types! { + use crate::num::One; + use crate::si::length as l; + use crate::si::electric_current as i; + use crate::si::magnetic_field_strength as h; + use crate::si::quantities::*; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: MagneticFieldStrength = ElectricCurrent::new::(V::one()) + / Length::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + test::(); + + fn test, L: l::Conversion, H: h::Conversion>() { + Test::assert_approx_eq(&MagneticFieldStrength::new::(V::one()), + &(ElectricCurrent::new::(V::one()) / Length::new::(V::one()))); + } + } + } +} diff --git a/src/si/mod.rs b/src/si/mod.rs index 9e341bcc..c7292965 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -81,6 +81,7 @@ system! { length::Length, luminance::Luminance, luminous_intensity::LuminousIntensity, + magnetic_field_strength::MagneticFieldStrength, magnetic_flux::MagneticFlux, magnetic_flux_density::MagneticFluxDensity, mass::Mass, From e300666eda4e5a09bc1a716fe3437a27adbf8b2a Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Wed, 10 Aug 2022 20:19:34 +0200 Subject: [PATCH 11/20] Add MolarVolume quantity with related units. --- src/si/mod.rs | 1 + src/si/molar_volume.rs | 65 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/si/molar_volume.rs diff --git a/src/si/mod.rs b/src/si/mod.rs index b6166fa9..f6648b19 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -94,6 +94,7 @@ system! { molar_flux::MolarFlux, molar_heat_capacity::MolarHeatCapacity, molar_mass::MolarMass, + molar_volume::MolarVolume, momentum::Momentum, power::Power, pressure::Pressure, diff --git a/src/si/molar_volume.rs b/src/si/molar_volume.rs new file mode 100644 index 00000000..b47bdfba --- /dev/null +++ b/src/si/molar_volume.rs @@ -0,0 +1,65 @@ +//! Molar volume (base unit cubic meter per mole, m³ · mol⁻¹). + +quantity! { + /// Molar volume (base unit cubic meter per mole, m³ · mol⁻¹). + quantity: MolarVolume; "molar volume"; + /// Dimension of molar volume, L³N⁻¹ (base unit cubic meter per mole, m³ · mol⁻¹). + dimension: ISQ< + P3, // length + Z0, // mass + Z0, // time + Z0, // electric current + Z0, // thermodynamic temperature + N1, // amount of substance + Z0>; // luminous intensity + units { + @cubic_meter_per_mole: prefix!(none); "m³/mol", "cubic meter per mole", + "cubic meters per mole"; + @cubic_decimeter_per_mole: prefix!(deci) * prefix!(deci) * prefix!(deci); "dm³/mol", + "cubic decimeter per mole", "cubic decimeters per mole"; + @cubic_centimeter_per_mole: prefix!(centi) * prefix!(centi) * prefix!(centi); "cm³/mol", + "cubic centimeter per mole", "cubic centimeters per mole"; + + @cubic_meter_per_particle: 6.022_140_76_E23; "m³/particle", "cubic meter per particle", + "cubic meters per particle"; + @cubic_micrometer_per_particle: + prefix!(micro) * prefix!(micro) * prefix!(micro) * 6.022_140_76_E23; "µm³/particle", + "cubic micrometer per particle", "cubic micrometers per particle"; + @cubic_nanometer_per_particle: + prefix!(nano) * prefix!(nano) * prefix!(nano) * 6.022_140_76_E23; "nm³/particle", + "cubic nanometer per particle", "cubic nanometers per particle"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::amount_of_substance as aos; + use crate::si::molar_volume as mv; + use crate::si::quantities::*; + use crate::si::volume as v; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: MolarVolume = Volume::new::(V::one()) + / AmountOfSubstance::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + + fn test, AOS: aos::Conversion, MV: mv::Conversion>() { + Test::assert_approx_eq(&MolarVolume::new::(V::one()), + &(Volume::new::(V::one()) / AmountOfSubstance::new::(V::one()))); + } + } + } +} From 3c67754d93d316e01a7baadfb7fed510921ac53d Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Sat, 13 Aug 2022 11:18:10 +0200 Subject: [PATCH 12/20] Add standard_gravity as a unit of acceleration. --- src/si/acceleration.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/si/acceleration.rs b/src/si/acceleration.rs index 563e224d..be8a24cf 100644 --- a/src/si/acceleration.rs +++ b/src/si/acceleration.rs @@ -63,6 +63,8 @@ quantity! { "inches per second squared"; @millimeter_per_minute_squared: 2.777_777_777_777_777_8_E-7; "mm/min²", "millimeter per minute squared", "millimeters per minute squared"; + @standard_gravity: 9.806_65_E0; "g₀", "standard acceleration of gravity", + "standard accelerations of gravity"; } } From 261c8fc5c48f0584a79d52996e5fc1e3487fd6ae Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Sun, 14 Aug 2022 13:17:04 +0200 Subject: [PATCH 13/20] Adding universal cas constant and Boltzmann constant as units of measure. --- src/si/heat_capacity.rs | 2 ++ src/si/molar_heat_capacity.rs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/si/heat_capacity.rs b/src/si/heat_capacity.rs index 9f660c0e..79b385d3 100644 --- a/src/si/heat_capacity.rs +++ b/src/si/heat_capacity.rs @@ -167,6 +167,8 @@ quantity! { @btu_it_per_degree_fahrenheit: 1.899_100_8_E3; "Btu (IT)/°F", "British thermal unit (IT) per degree Fahrenheit", "British thermal units (IT) per degree Fahrenheit"; + + @boltzmann_constant: 1.380_649_E-23; "k", "Boltzmann constant", "Boltzmann constants"; } } diff --git a/src/si/molar_heat_capacity.rs b/src/si/molar_heat_capacity.rs index 11a695e0..22114485 100644 --- a/src/si/molar_heat_capacity.rs +++ b/src/si/molar_heat_capacity.rs @@ -94,6 +94,8 @@ quantity! { @electronvolt_per_kelvin_particle: 6.022_140_76_E23 * 1.602_176_634_E-19; "eV/(K · particle)", "electronvolt per kelvin particle", "electronvolts per kelvin particle"; + + @molar_gas_constant: 8.314_462_618_E0; "R", "molar gas constant", "molar gas constants"; } } From 59078387f758da5f3d05f63e96e0a22347a2c914 Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Sun, 14 Aug 2022 19:31:17 +0200 Subject: [PATCH 14/20] Add temperature coefficient --- src/si/mod.rs | 1 + src/si/temperature_coefficient.rs | 50 +++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/si/temperature_coefficient.rs diff --git a/src/si/mod.rs b/src/si/mod.rs index 2a79c44b..e113fdc5 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -110,6 +110,7 @@ system! { solid_angle::SolidAngle, specific_heat_capacity::SpecificHeatCapacity, surface_electric_current_density::SurfaceElectricCurrentDensity, + temperature_coefficient::TemperatureCoefficient, temperature_interval::TemperatureInterval, thermal_conductivity::ThermalConductivity, thermodynamic_temperature::ThermodynamicTemperature, diff --git a/src/si/temperature_coefficient.rs b/src/si/temperature_coefficient.rs new file mode 100644 index 00000000..3480b73a --- /dev/null +++ b/src/si/temperature_coefficient.rs @@ -0,0 +1,50 @@ +//! Temperature coefficient (base unit 1 / kelvin, K⁻¹). + +quantity! { + /// Temperature coefficient (base unit 1 / kelvin, K⁻¹). + quantity: TemperatureCoefficient; "temperature coefficient"; + /// Dimension of temperature coefficient, Th⁻¹ (base unit 1 / kelvin, K⁻¹). + dimension: ISQ< + Z0, // length + Z0, // mass + Z0, // time + Z0, // electric current + N1, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @per_kelvin: prefix!(none); "K⁻¹", "per kelvin", "per kelvin"; + @ppm_per_kelvin: 1E-6; "ppm/K", "ppm per kelvin", "ppm per kelvin"; + @ppm_per_degree_celsius: 1E-6; "ppm/°C", "ppm per degree Celsius", "ppm per degree Celsius"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::temperature_interval as ti; + use crate::si::temperature_coefficient as tc; + use crate::si::quantities::*; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: TemperatureCoefficient = V::one() + / TemperatureInterval::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + + fn test, TC: tc::Conversion>() { + Test::assert_approx_eq(&TemperatureCoefficient::new::(V::one()), + &(V::one() + / TemperatureInterval::new::(V::one()))); + } + } + } +} From dec2eecfe3e63a7e803288b570ea9f5441cca88c Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Sat, 13 Aug 2022 12:13:41 +0200 Subject: [PATCH 15/20] Add specific area and specific volume quantities. --- src/si/mod.rs | 2 ++ src/si/specific_area.rs | 57 ++++++++++++++++++++++++++++++++++++++ src/si/specific_volume.rs | 58 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 src/si/specific_area.rs create mode 100644 src/si/specific_volume.rs diff --git a/src/si/mod.rs b/src/si/mod.rs index 2a79c44b..d0562857 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -108,7 +108,9 @@ system! { radiant_exposure::RadiantExposure, ratio::Ratio, solid_angle::SolidAngle, + specific_area::SpecificArea, specific_heat_capacity::SpecificHeatCapacity, + specific_volume::SpecificVolume, surface_electric_current_density::SurfaceElectricCurrentDensity, temperature_interval::TemperatureInterval, thermal_conductivity::ThermalConductivity, diff --git a/src/si/specific_area.rs b/src/si/specific_area.rs new file mode 100644 index 00000000..4f5cacc0 --- /dev/null +++ b/src/si/specific_area.rs @@ -0,0 +1,57 @@ +//! Specific area (base unit square meter per kilogram, m² · kg⁻¹). + +quantity! { + /// Specific area (base unit square meter per kilogram, m² · kg⁻¹). + quantity: SpecificArea; "specific area"; + /// Dimension of specific area, L²M⁻¹ (base unit square meter per kilogram, m² · kg⁻¹). + dimension: ISQ< + P2, // length + N1, // mass + Z0, // time + Z0, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @square_meter_per_kilogram: prefix!(none); "m²/kg", "square meter per kilogram", + "square meters per kilogram"; + @square_centimeter_per_kilogram: prefix!(centi) * prefix!(centi); "cm²/kg", + "square centimeter per kilogram", "square centimeters per kilogram"; + + @square_meter_per_gram: prefix!(none) / prefix!(milli); "m²/g", "square meter per gram", + "square meters per gram"; + @square_centimeter_per_gram: prefix!(centi) * prefix!(centi) / prefix!(milli); "cm²/g", + "square centimeter per gram", "square centimeters per gram"; + } +} + +#[cfg(test)] +mod tests { + storage_types! { + use crate::num::One; + use crate::si::area as a; + use crate::si::mass as m; + use crate::si::specific_area as sa; + use crate::si::quantities::*; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: SpecificArea = Area::new::(V::one()) / Mass::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + + test::(); + test::(); + + fn test, M: m::Conversion, SA: sa::Conversion, >() { + Test::assert_eq(&SpecificArea::new::(V::one()), + &(Area::new::(V::one()) / Mass::new::(V::one()))); + } + } + } +} diff --git a/src/si/specific_volume.rs b/src/si/specific_volume.rs new file mode 100644 index 00000000..891f0f29 --- /dev/null +++ b/src/si/specific_volume.rs @@ -0,0 +1,58 @@ +//! Specific volume (base unit cubic meter per kilogram, m³ · kg⁻¹). + +quantity! { + /// Specific volume (base unit cubic meter per kilogram, m³ · kg⁻¹). + quantity: SpecificVolume; "specific volume"; + /// Dimension of specific volume, L³M⁻¹ (base unit cubic meter per kilogram, m³ · kg⁻¹). + dimension: ISQ< + P3, // length + N1, // mass + Z0, // time + Z0, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @cubic_meter_per_kilogram: prefix!(none); "m³/kg", "cubic meter per kilogram", + "cubic meters per kilogram"; + @cubic_centimeter_per_kilogram: prefix!(centi) * prefix!(centi) * prefix!(centi); "cm³/kg", + "cubic centimeter per kilogram", "cubic centimeters per kilogram"; + + @cubic_meter_per_gram: prefix!(none) / prefix!(milli); "m³/g", "cubic meter per gram", + "cubic meters per gram"; + @cubic_centimeter_per_gram: + prefix!(centi) * prefix!(centi) * prefix!(centi) / prefix!(milli); "cm³/g", + "cubic centimeter per gram", "cubic centimeters per gram"; + } +} + +#[cfg(test)] +mod tests { + storage_types! { + use crate::num::One; + use crate::si::volume as a; + use crate::si::mass as m; + use crate::si::specific_volume as sv; + use crate::si::quantities::*; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: SpecificVolume = Volume::new::(V::one()) + / Mass::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + test::(); + + fn test, M: m::Conversion, SV: sv::Conversion>() { + Test::assert_eq(&SpecificVolume::new::(V::one()), + &(Volume::new::(V::one()) / Mass::new::(V::one()))); + } + } + } +} From 8627845b4862081d08cdcf48c2647a942b2b17e7 Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Sat, 13 Aug 2022 10:52:21 +0200 Subject: [PATCH 16/20] Add areal and linear specific power density --- src/si/heat_flux_density.rs | 18 ++++++++++ src/si/linear_power_density.rs | 52 +++++++++++++++++++++++++++ src/si/mod.rs | 2 ++ src/si/volumetric_power_density.rs | 56 ++++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+) create mode 100644 src/si/linear_power_density.rs create mode 100644 src/si/volumetric_power_density.rs diff --git a/src/si/heat_flux_density.rs b/src/si/heat_flux_density.rs index 9f5bed48..c9168d11 100644 --- a/src/si/heat_flux_density.rs +++ b/src/si/heat_flux_density.rs @@ -56,6 +56,11 @@ quantity! { "zeptowatt per square meter", "zeptowatts per square meter"; @yoctowatt_per_square_meter: prefix!(yocto); "yW/m²", "yoctowatt per square meter", "yoctowatts per square meter"; + + @watt_per_square_centimeter: prefix!(none) / prefix!(centi) / prefix!(centi); "W/cm²", + "watt per square centimeter", "watts per square centimeter"; + @watt_per_square_millimeter: prefix!(none) / prefix!(milli) / prefix!(milli); "W/mm²", + "watt per square millimeter", "watts per square millimeter"; } } @@ -63,6 +68,7 @@ quantity! { mod test { storage_types! { use crate::num::One; + use crate::si::area as a; use crate::si::heat_flux_density as d; use crate::si::length as l; use crate::si::power as p; @@ -109,5 +115,17 @@ mod test { * Length::new::(V::one())))); } } + + #[test] + fn check_units_power_area() { + test::(); + test::(); + test::(); + + fn test, A: a::Conversion, D: d::Conversion>() { + Test::assert_approx_eq(&HeatFluxDensity::new::(V::one()), + &(Power::new::

(V::one()) / Area::new::(V::one()))); + } + } } } diff --git a/src/si/linear_power_density.rs b/src/si/linear_power_density.rs new file mode 100644 index 00000000..a33b99f1 --- /dev/null +++ b/src/si/linear_power_density.rs @@ -0,0 +1,52 @@ +//! Linear power density (base unit watt per meter, m · kg · s⁻³). + +quantity! { + /// Linear power density (base unit watt per meter, m · kg · s⁻³). + quantity: LinearPowerDensity; "linear power density"; + /// Dimension of linear power density, LMT⁻³ (base unit watt per meter, m · kg · s⁻³). + dimension: ISQ< + P1, // length + P1, // mass + N3, // time + Z0, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @watt_per_meter: prefix!(none); "W/m", "watt per meter", "watts per meter"; + @watt_per_centimeter: prefix!(none) / prefix!(centi); "W/cm", "watt per centimeter", + "watts per centimeter"; + @watt_per_millimeter: prefix!(none) / prefix!(milli); "W/mm", "watt per millimeter", + "watts per millimeter"; + } +} + +#[cfg(test)] +mod tests { + storage_types! { + use crate::num::One; + use crate::si::power as p; + use crate::si::quantities::*; + use crate::si::linear_power_density as lpd; + use crate::si::length as l; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: LinearPowerDensity = Power::new::(V::one()) + / Length::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + + fn test, L: l::Conversion, LPD: lpd::Conversion>() { + Test::assert_approx_eq(&LinearPowerDensity::new::(V::one()), + &(Power::new::

(V::one()) / Length::new::(V::one()))); + } + } + } +} diff --git a/src/si/mod.rs b/src/si/mod.rs index 2a79c44b..2bd70498 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -85,6 +85,7 @@ system! { jerk::Jerk, length::Length, linear_mass_density::LinearMassDensity, + linear_power_density::LinearPowerDensity, luminance::Luminance, luminous_intensity::LuminousIntensity, magnetic_field_strength::MagneticFieldStrength, @@ -118,6 +119,7 @@ system! { velocity::Velocity, volume::Volume, volume_rate::VolumeRate, + volumetric_power_density::VolumetricPowerDensity, } } diff --git a/src/si/volumetric_power_density.rs b/src/si/volumetric_power_density.rs new file mode 100644 index 00000000..4a8a1024 --- /dev/null +++ b/src/si/volumetric_power_density.rs @@ -0,0 +1,56 @@ +//! Volumetric power density (base unit watt per cubic meter, m⁻¹ · kg · s⁻³). + +quantity! { + /// Volumetric power density (base unit watt per cubic meter, m⁻¹ · kg · s⁻³). + quantity: VolumetricPowerDensity; "volumetric power density"; + /// Dimension of volumetric power density, L⁻¹MT⁻³ (base unit watt per cubic meter, + /// m⁻¹ · kg · s⁻³). + dimension: ISQ< + N1, // length + P1, // mass + N3, // time + Z0, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @watt_per_cubic_meter: prefix!(none); "W/m³", "watt per cubic meter", + "watts per cubic meter"; + @watt_per_cubic_centimeter: + prefix!(none) / prefix!(centi) / prefix!(centi) / prefix!(centi); "W/cm³", + "watt per cubic centimeter", "watts per cubic centimeter"; + @watt_per_cubic_millimeter: + prefix!(none) / prefix!(milli) / prefix!(milli) / prefix!(milli); "W/mm³", + "watt per cubic millimeter", "watts per cubic millimeter"; + } +} + +#[cfg(test)] +mod tests { + storage_types! { + use crate::num::One; + use crate::si::power as p; + use crate::si::quantities::*; + use crate::si::volumetric_power_density as vpd; + use crate::si::volume as v; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: VolumetricPowerDensity = Power::new::(V::one()) + / Volume::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + + fn test, U: v::Conversion, VPD: vpd::Conversion>() { + Test::assert_approx_eq(&VolumetricPowerDensity::new::(V::one()), + &(Power::new::

(V::one()) / Volume::new::(V::one()))); + } + } + } +} From 23addfe108abdb2be630f94a4815a859ef9a6a29 Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Thu, 11 Aug 2022 10:38:02 +0200 Subject: [PATCH 17/20] Add ElectricFlux quantity with related units. --- src/si/electric_flux.rs | 50 +++++++++++++++++++++++++++++++++++++++++ src/si/mod.rs | 1 + 2 files changed, 51 insertions(+) create mode 100644 src/si/electric_flux.rs diff --git a/src/si/electric_flux.rs b/src/si/electric_flux.rs new file mode 100644 index 00000000..f7fa92a3 --- /dev/null +++ b/src/si/electric_flux.rs @@ -0,0 +1,50 @@ +//! Electric Flux (base unit volt meter, m³ ⋅ kg ⋅ s⁻³ ⋅ A⁻¹). + +quantity! { + /// Electric Flux (base unit volt meter, m³ ⋅ kg ⋅ s⁻³ ⋅ A⁻¹). + quantity: ElectricFlux; "electric flux"; + /// Dimension of electric flux, L³MT⁻³I⁻¹ (base unit volt meter, m³ ⋅ kg ⋅ s⁻³ ⋅ A⁻¹). + dimension: ISQ< + P3, // length + P1, // mass + N3, // time + N1, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @volt_meter: prefix!(none); "V ⋅ m", "volt meter", "volt meters"; + @volt_centimeter: prefix!(none) * prefix!(centi); "V ⋅ cm", "volt centimeter", + "volt centimeters"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::electric_flux as ef; + use crate::si::quantities::*; + use crate::si::electric_potential as ep; + use crate::si::length as l; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: ElectricFlux = ElectricPotential::new::(V::one()) + * Length::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + + fn test, L: l::Conversion, EP: ep::Conversion>() { + Test::assert_approx_eq(&ElectricFlux::new::(V::one()), + &(ElectricPotential::new::(V::one()) + * Length::new::(V::one()))); + } + } + } +} diff --git a/src/si/mod.rs b/src/si/mod.rs index 2a79c44b..4ec30bc4 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -67,6 +67,7 @@ system! { electric_charge_volumetric_density::ElectricChargeVolumetricDensity, electric_current::ElectricCurrent, electric_displacement_field::ElectricDisplacementField, + electric_flux::ElectricFlux, electric_permittivity::ElectricPermittivity, electric_potential::ElectricPotential, electrical_conductance::ElectricalConductance, From ede7791abf9cb8859d6d9aa23dc9540c6454b972 Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Thu, 11 Aug 2022 16:35:39 +0200 Subject: [PATCH 18/20] Add TemperatureGradient quantity with related units. --- src/si/mod.rs | 1 + src/si/temperature_gradient.rs | 62 ++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 src/si/temperature_gradient.rs diff --git a/src/si/mod.rs b/src/si/mod.rs index 90168a64..38cd5a04 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -113,6 +113,7 @@ system! { specific_heat_capacity::SpecificHeatCapacity, surface_electric_current_density::SurfaceElectricCurrentDensity, temperature_coefficient::TemperatureCoefficient, + temperature_gradient::TemperatureGradient, temperature_interval::TemperatureInterval, thermal_conductivity::ThermalConductivity, thermodynamic_temperature::ThermodynamicTemperature, diff --git a/src/si/temperature_gradient.rs b/src/si/temperature_gradient.rs new file mode 100644 index 00000000..f1e8233e --- /dev/null +++ b/src/si/temperature_gradient.rs @@ -0,0 +1,62 @@ +//! Temperature gradient (base unit kelvin per meter, m⁻¹ · K). + +quantity! { + /// Temperature gradient (base unit kelvin per meter, m⁻¹ · K). + quantity: TemperatureGradient; "temperature gradient"; + /// Dimension of temperature gradient, L⁻¹Th (base unit kelvin per meter, K · m⁻¹). + dimension: ISQ< + N1, // length + Z0, // mass + Z0, // time + Z0, // electric current + P1, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + units { + @kelvin_per_kilometer: prefix!(none) / prefix!(kilo); "K/km", "kelvin per kilometer", + "kelvins per kilometer"; + @kelvin_per_hectometer: prefix!(none) / prefix!(hecto); "K/hm", "kelvin per hectometer", + "kelvins per hectometer"; + @kelvin_per_meter: prefix!(none); "K/m", "kelvin per meter", "kelvins per meter"; + @kelvin_per_centimeter: prefix!(none) / prefix!(centi); "K/cm", "kelvin per centimeter", + "kelvins per centimeter"; + @kelvin_per_millimeter: prefix!(none) / prefix!(milli); "K/mm", "kelvin per millimeter", + "kelvins per millimeter"; + @kelvin_per_micrometer: prefix!(none) / prefix!(micro); "K/µm", "kelvin per micrometer", + "kelvins per micrometer"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::temperature_gradient as tg; + use crate::si::temperature_interval as ti; + use crate::si::quantities::*; + use crate::si::length as l; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: TemperatureGradient = TemperatureInterval::new::(V::one()) + / Length::new::(V::one()); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + + fn test, L: l::Conversion, TG: tg::Conversion>() { + Test::assert_approx_eq(&TemperatureGradient::new::(V::one()), + &(TemperatureInterval::new::(V::one()) + / Length::new::(V::one()))); + } + } + } +} From 580880d0ce0350c45a68f55b011c336267be54e7 Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Sat, 6 Aug 2022 12:13:25 +0200 Subject: [PATCH 19/20] 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()); + } + } + } +} From 8bf9b289a3f8f6d9bfbc3e2409d534f170ae79ac Mon Sep 17 00:00:00 2001 From: Vlad Voronenkov Date: Sun, 7 Aug 2022 18:50:14 +0200 Subject: [PATCH 20/20] Add specific number rates: volumetric, areal, and linear. --- src/si/areal_number_rate.rs | 82 ++++++++++++++++++++++++++++ src/si/linear_number_rate.rs | 79 +++++++++++++++++++++++++++ src/si/mod.rs | 3 ++ src/si/volumetric_number_rate.rs | 91 ++++++++++++++++++++++++++++++++ 4 files changed, 255 insertions(+) create mode 100644 src/si/areal_number_rate.rs create mode 100644 src/si/linear_number_rate.rs create mode 100644 src/si/volumetric_number_rate.rs diff --git a/src/si/areal_number_rate.rs b/src/si/areal_number_rate.rs new file mode 100644 index 00000000..06381681 --- /dev/null +++ b/src/si/areal_number_rate.rs @@ -0,0 +1,82 @@ +//! Areal number rate (base unit 1 per square meter second, m⁻² · s⁻¹). + +quantity! { + /// Areal number rate (base unit 1 per square meter second, m⁻² · s⁻¹). + quantity: ArealNumberRate; "areal number rate"; + /// Dimension of areal number rate, L⁻²T⁻¹ (base unit 1 per square meter second, m⁻² · s⁻¹). + dimension: ISQ< + N2, // length + Z0, // mass + N1, // time + Z0, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + kind: dyn (crate::si::marker::ConstituentConcentrationKind); + units { + @per_square_meter_second: prefix!(none); "m⁻² · s⁻¹", "per square meter second", + "per square meter second"; + @per_square_centimeter_second: prefix!(none) / prefix!(centi) / prefix!(centi); + "cm⁻² · s⁻¹", "per square centimeter second", "per square centimeter second"; + + @per_acre_second: prefix!(none) / 4.046_873_E3; "ac⁻¹ · s⁻¹", "per acre second", + "per acre second"; + @per_are_second: prefix!(none) / 1.0_E2; "a⁻¹ · s⁻¹", "per are second", "per are second"; + @per_barn_second: prefix!(none) / 1.0_E-28; "b⁻¹ · s⁻¹", "per barn second", + "per barn second"; + @per_circular_mil_second: prefix!(none) / 5.067_075_E-10; "cmil⁻¹ · s⁻¹", + "per circular mil second", "per circular mil second"; + @per_hectare_second: prefix!(none) / 1.0_E4; "ha⁻¹ · s⁻¹", "per hectare second", + "per hectare second"; + @per_square_foot_second: prefix!(none) / 9.290_304_E-2; "ft⁻² · s⁻¹", + "per square foot second", "per square foot second"; + @per_square_inch_second: prefix!(none) / 6.451_6_E-4; "in⁻² · s⁻¹", + "per square inch second", "per square inch second"; + @per_square_mile_second: prefix!(none) / 2.589_988_E6; "mi⁻² · s⁻¹", + "per square mile second", "per square mile second"; + @per_square_yard_second: prefix!(none) / 8.361_274_E-1; "yd⁻² · s⁻¹", + "per square yard second", "per square yard second"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::areal_number_rate as anr; + use crate::si::quantities::*; + use crate::si::time as t; + use crate::si::area as a; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: ArealNumberRate = (V::one() + / Time::new::(V::one()) + / Area::new::(V::one())).into(); + } + + #[test] + fn check_units() { + test::(); + test::(); + + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + + fn test, A: a::Conversion, T: t::Conversion>() { + Test::assert_approx_eq(&ArealNumberRate::new::(V::one()), + &(V::one() + / Time::new::(V::one()) + / Area::new::(V::one())).into()); + } + } + } +} diff --git a/src/si/linear_number_rate.rs b/src/si/linear_number_rate.rs new file mode 100644 index 00000000..3b627cf5 --- /dev/null +++ b/src/si/linear_number_rate.rs @@ -0,0 +1,79 @@ +//! Linear number rate (base unit 1 per meter second, m⁻¹ · s⁻¹). + +quantity! { + /// Linear number rate (base unit 1 per meter second, m⁻¹ · s⁻¹). + quantity: LinearNumberRate; "linear number rate"; + /// Dimension of linear number rate, L⁻¹T⁻¹ (base unit 1 per meter second, m⁻¹ · s⁻¹). + dimension: ISQ< + N1, // length + Z0, // mass + N1, // time + Z0, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + kind: dyn (crate::si::marker::ConstituentConcentrationKind); + units { + @per_kilometer_second: prefix!(none) / prefix!(kilo); "km⁻¹ · s⁻¹", "per kilometer second", + "per kilometer second"; + @per_meter_second: prefix!(none); "m⁻¹ · s⁻¹", "per meter second", "per meter second"; + @per_centimeter_second: prefix!(none) / prefix!(centi); "cm⁻¹ · s⁻¹", + "per centimeter second", "per centimeter second"; + @per_millimeter_second: prefix!(none) / prefix!(milli); "mm⁻¹ · s⁻¹", + "per millimeter second", "per millimeter second"; + + @per_foot_second: prefix!(none) / 3.048_E-1; "ft⁻¹ · s⁻¹", "per foot second", + "per foot second"; + @per_foot_survey_second: prefix!(none) / 3.048_006_E-1; "ft⁻¹ (U.S. survey) · s⁻¹", + "per foot (U.S. survey) second", "per foot (U.S. survey) second"; + @per_inch_second: prefix!(none) / 2.54_E-2; "in⁻¹ · s⁻¹", "per inch second", + "per inch second"; + @per_mile_second: prefix!(none) / 1.609_344_E3; "mi⁻¹ · s⁻¹", "per mile second", + "per mile second"; + @per_mile_survey_second: prefix!(none) / 1.609_347_E3; "mi⁻¹ (U.S. survey) · s⁻¹", + "per mile (U.S. survey) second", "per mile (U.S. survey) second"; + @per_yard_second: prefix!(none) / 9.144_E-1; "yd⁻¹ · s⁻¹", "per yard second", + "per yard second"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::linear_number_rate as lnr; + use crate::si::quantities::*; + use crate::si::time as t; + use crate::si::length as l; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: LinearNumberRate = (V::one() + / Time::new::(V::one()) + / Length::new::(V::one())).into(); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + test::(); + + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + + fn test, L: l::Conversion, T: t::Conversion>() { + Test::assert_approx_eq(&LinearNumberRate::new::(V::one()), + &(V::one() + / Time::new::(V::one()) + / Length::new::(V::one())).into()); + } + } + } +} diff --git a/src/si/mod.rs b/src/si/mod.rs index ebc3b8df..9e7d9ff0 100644 --- a/src/si/mod.rs +++ b/src/si/mod.rs @@ -55,6 +55,7 @@ system! { area::Area, areal_mass_density::ArealMassDensity, areal_number_density::ArealNumberDensity, + areal_number_rate::ArealNumberRate, available_energy::AvailableEnergy, capacitance::Capacitance, catalytic_activity::CatalyticActivity, @@ -88,6 +89,7 @@ system! { length::Length, linear_mass_density::LinearMassDensity, linear_number_density::LinearNumberDensity, + linear_number_rate::LinearNumberRate, linear_power_density::LinearPowerDensity, luminance::Luminance, luminous_intensity::LuminousIntensity, @@ -127,6 +129,7 @@ system! { volume::Volume, volume_rate::VolumeRate, volumetric_number_density::VolumetricNumberDensity, + volumetric_number_rate::VolumetricNumberRate, volumetric_power_density::VolumetricPowerDensity, } } diff --git a/src/si/volumetric_number_rate.rs b/src/si/volumetric_number_rate.rs new file mode 100644 index 00000000..6952befa --- /dev/null +++ b/src/si/volumetric_number_rate.rs @@ -0,0 +1,91 @@ +//! Volumetric number rate (base unit 1 per cubic meter second, m⁻³ · s⁻¹). + +quantity! { + /// Volumetric number rate (base unit 1 per cubic meter second, m⁻³ · s⁻¹). + quantity: VolumetricNumberRate; "volumetric number rate"; + /// Dimension of volumetric number rate, L⁻³T⁻¹ (base unit 1 per cubic meter second, m⁻³ · s⁻¹). + dimension: ISQ< + N3, // length + Z0, // mass + N1, // time + Z0, // electric current + Z0, // thermodynamic temperature + Z0, // amount of substance + Z0>; // luminous intensity + kind: dyn (crate::si::marker::ConstituentConcentrationKind); + units { + @per_cubic_meter_second: prefix!(none); "m⁻³ · s⁻¹", + "per cubic meter second", "per cubic meter second"; + @per_cubic_centimeter_second: + prefix!(none) / prefix!(centi) / prefix!(centi) / prefix!(centi); "cm⁻³ · s⁻¹", + "per cubic centimeter second", "per cubic centimeter second"; + @per_cubic_millimeter_second: + prefix!(none) / prefix!(milli) / prefix!(milli) / prefix!(milli); "mm⁻³ · s⁻¹", + "per cubic millimeter second", "per cubic millimeter second"; + + @per_cubic_foot_second: prefix!(none) / 2.831_685_E-2; "ft⁻³ · s⁻¹", + "per cubic foot second", "per cubic foot second"; + @per_cubic_inch_second: prefix!(none) / 1.638_706_E-5; "in⁻³ · s⁻¹", + "per cubic inch second", "per cubic inch second"; + @per_cubic_mile_second: prefix!(none) / 4.168_182_E9; "mi⁻³ · s⁻¹", + "per cubic mile second", "per cubic mile second"; + @per_cubic_yard_second: prefix!(none) / 7.645_549_E-1; "yd⁻³ · s⁻¹", + "per cubic yard second", "per cubic yard second"; + @per_fluid_ounce_second: prefix!(none) / 2.957_353_E-5; "fl oz⁻¹ · s⁻¹", + "per fluid ounce second", "per fluid ounce second"; + @per_fluid_ounce_imperial_second: prefix!(none) / 2.841_306_E-5; "fl oz⁻¹ (UK) · s⁻¹", + "per Imperial fluid ounce second", "per Imperial fluid ounce second"; + @per_gallon_imperial_second: prefix!(none) / 4.546_09_E-3; "gal⁻¹ (UK) · s⁻¹", + "per Imperial gallon second", "per Imperial gallon second"; + @per_gallon_second: prefix!(none) / 3.785_412_E-3; "gal⁻¹ · s⁻¹", "per gallon second", + "per gallon second"; + @per_liter_second: prefix!(none) / prefix!(milli); "L⁻¹ · s⁻¹", "per liter second", + "per liter second"; + @per_milliliter_second: prefix!(none) / prefix!(milli) / prefix!(milli); "mL⁻¹ · s⁻¹", + "per milliliter second", "per milliliter second"; + } +} + +#[cfg(test)] +mod test { + storage_types! { + use crate::num::One; + use crate::si::volumetric_number_rate as vnr; + use crate::si::quantities::*; + use crate::si::time as t; + use crate::si::volume as vol; + use crate::tests::Test; + + #[test] + fn check_dimension() { + let _: VolumetricNumberRate = (V::one() + / Time::new::(V::one()) + / Volume::new::(V::one())).into(); + } + + #[test] + fn check_units() { + test::(); + test::(); + test::(); + + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + test::(); + + fn test, VOL: vol::Conversion, T: t::Conversion>() { + Test::assert_approx_eq(&VolumetricNumberRate::new::(V::one()), + &(V::one() + / Time::new::(V::one()) + / Volume::new::(V::one())).into()); + } + } + } +}