-
Notifications
You must be signed in to change notification settings - Fork 97
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add photometric units #313
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,61 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//! Illuminance (base unit lux, lx, cd · sr / m²). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
quantity! { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/// Illuminance (base unit lux, lx, cd · sr / m²). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
quantity: Illuminance; "illuminance"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/// Dimension of illuminance, E (base unit lux, lx, cd · sr / m²). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dimension: ISQ< | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
N2, // length | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Z0, // mass | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Z0, // time | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Z0, // electric current | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Z0, // thermodynamic temperature | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Z0, // amount of substance | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
P1>; // luminous intensity | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
kind: dyn (crate::si::marker::IlluminanceKind); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
units { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@yottalux: prefix!(yotta); "Ylm", "yottalux", "yottaluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@zettalux: prefix!(zetta); "Zlm", "zettalux", "zettaluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@exalux: prefix!(exa); "Elm", "exalux", "exaluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@petalux: prefix!(peta); "Plm", "petalux", "petaluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@teralux: prefix!(tera); "Tlm", "teralux", "teraluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@gigalux: prefix!(giga); "Glm", "gigalux", "gigaluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@megalux: prefix!(mega); "Mlm", "megalux", "megaluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@kilolux: prefix!(kilo); "klm", "kilolux", "kiloluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@hectolux: prefix!(hecto); "hlm", "hectolux", "hectoluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@decalux: prefix!(deca); "dalm", "decalux", "decaluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/// The lux is defined to be 1 lumen per square meter, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/// or 1 candela steradian per square meter. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+27
to
+28
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@lux: prefix!(none); "lm", "lux", "luxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Copy/paste error from luminous flux? It also seems the plural and singular are the same. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@decilux: prefix!(deci); "dlm", "decilux", "deciluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@centilux: prefix!(centi); "clm", "centilux", "centiluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@millilux: prefix!(milli); "mlm", "millilux", "milliluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@microlux: prefix!(micro); "µlm", "microlux", "microluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@nanolux: prefix!(nano); "nlm", "nanolux", "nanoluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@picolux: prefix!(pico); "plm", "picolux", "picoluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@femtolux: prefix!(femto); "flm", "femtolux", "femtoluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@attolux: prefix!(atto); "alm", "attolux", "attoluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@zeptolux: prefix!(zepto); "zlm", "zeptolux", "zeptoluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@yoctolux: prefix!(yocto); "ylm", "yoctolux", "yoctoluxs"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#[cfg(test)] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mod tests { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
storage_types! { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use crate::si::quantities::*; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use crate::si::luminous_flux as lf; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use crate::si::area as a; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use crate::si::illuminance as i; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use crate::tests::{A, Test}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
quickcheck! { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#[allow(trivial_casts)] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fn add(l: A<V>, r: A<V>) -> bool { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Test::eq(&Illuminance::<V>::new::<i::lux>(&*l / &*r), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
&(LuminousFlux::<V>::new::<lf::lumen>((*l).clone()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/ Area::<V>::new::<a::square_meter>((*r).clone())).into()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+52
to
+59
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Rather than doing Lines 53 to 87 in 51a7cbf
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,114 @@ | ||||||
//! Luminous flux (base unit lumen, lm, cd · sr). | ||||||
|
||||||
use crate::si::luminous_intensity::LuminousIntensity; | ||||||
use crate::si::solid_angle::SolidAngle; | ||||||
|
||||||
quantity! { | ||||||
/// Luminous flux (base unit lumen, lm, cd · sr). | ||||||
quantity: LuminousFlux; "luminous flux"; | ||||||
/// Dimension of luminous flux, Φ (base unit lumen, lm, cd · sr). | ||||||
dimension: ISQ< | ||||||
Z0, // length | ||||||
Z0, // mass | ||||||
Z0, // time | ||||||
Z0, // electric current | ||||||
Z0, // thermodynamic temperature | ||||||
Z0, // amount of substance | ||||||
P1>; // luminous intensity | ||||||
kind: dyn (crate::si::marker::LuminousFluxKind); | ||||||
units { | ||||||
@yottalumen: prefix!(yotta); "Ylm", "yottalumen", "yottalumens"; | ||||||
@zettalumen: prefix!(zetta); "Zlm", "zettalumen", "zettalumens"; | ||||||
@exalumen: prefix!(exa); "Elm", "exalumen", "exalumens"; | ||||||
@petalumen: prefix!(peta); "Plm", "petalumen", "petalumens"; | ||||||
@teralumen: prefix!(tera); "Tlm", "teralumen", "teralumens"; | ||||||
@gigalumen: prefix!(giga); "Glm", "gigalumen", "gigalumens"; | ||||||
@megalumen: prefix!(mega); "Mlm", "megalumen", "megalumens"; | ||||||
@kilolumen: prefix!(kilo); "klm", "kilolumen", "kilolumens"; | ||||||
@hectolumen: prefix!(hecto); "hlm", "hectolumen", "hectolumens"; | ||||||
@decalumen: prefix!(deca); "dalm", "decalumen", "decalumens"; | ||||||
/// The lumen is defined to be 1 candela steradian. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
@lumen: prefix!(none); "lm", "lumen", "lumens"; | ||||||
@decilumen: prefix!(deci); "dlm", "decilumen", "decilumens"; | ||||||
@centilumen: prefix!(centi); "clm", "centilumen", "centilumens"; | ||||||
@millilumen: prefix!(milli); "mlm", "millilumen", "millilumens"; | ||||||
@microlumen: prefix!(micro); "µlm", "microlumen", "microlumens"; | ||||||
@nanolumen: prefix!(nano); "nlm", "nanolumen", "nanolumens"; | ||||||
@picolumen: prefix!(pico); "plm", "picolumen", "picolumens"; | ||||||
@femtolumen: prefix!(femto); "flm", "femtolumen", "femtolumens"; | ||||||
@attolumen: prefix!(atto); "alm", "attolumen", "attolumens"; | ||||||
@zeptolumen: prefix!(zepto); "zlm", "zeptolumen", "zeptolumens"; | ||||||
@yoctolumen: prefix!(yocto); "ylm", "yoctolumen", "yoctolumens"; | ||||||
} | ||||||
} | ||||||
|
||||||
// TODO: Explicitly allow luminous flux = luminous intensity * solid angle using | ||||||
// trait implementations such as the below. | ||||||
#[doc(hidden)] | ||||||
macro_rules! impl_ops { | ||||||
( | ||||||
$MulDivTrait:ident, $muldiv_fun:ident, $muldiv_op:tt | ||||||
) => { | ||||||
#[cfg(feature = "autoconvert")] | ||||||
impl<Ul, Ur, V> $crate::lib::ops::$MulDivTrait<SolidAngle<Ur, V>> | ||||||
for LuminousIntensity<Ul, V> | ||||||
where | ||||||
Ul: super::Units<V> + ?Sized, | ||||||
Ur: super::Units<V> + ?Sized, | ||||||
V: $crate::num::Num + $crate::Conversion<V>, | ||||||
{ | ||||||
type Output = LuminousFlux<Ul, V>; | ||||||
|
||||||
#[inline(always)] | ||||||
fn $muldiv_fun(self, rhs: SolidAngle<Ur, V>) -> Self::Output { | ||||||
super::Quantity { | ||||||
dimension: $crate::lib::marker::PhantomData, | ||||||
units: $crate::lib::marker::PhantomData, | ||||||
value: self.value | ||||||
$muldiv_op super::change_base::<Dimension, Ul, Ur, V>(&rhs.value), | ||||||
} | ||||||
} | ||||||
} | ||||||
|
||||||
#[cfg(not(feature = "autoconvert"))] | ||||||
impl<U, V> $crate::lib::ops::$MulDivTrait<SolidAngle<U, V>> | ||||||
for LuminousIntensity<U, V> | ||||||
where | ||||||
U: super::Units<V> + ?Sized, | ||||||
V: $crate::num::Num + $crate::Conversion<V>, | ||||||
{ | ||||||
type Output = LuminousFlux<U, V>; | ||||||
|
||||||
#[inline(always)] | ||||||
fn $muldiv_fun(self, rhs: SolidAngle<U, V>) -> Self::Output { | ||||||
super::Quantity { | ||||||
dimension: $crate::lib::marker::PhantomData, | ||||||
units: $crate::lib::marker::PhantomData, | ||||||
value: self.value $muldiv_op rhs.value, | ||||||
} | ||||||
} | ||||||
} | ||||||
}; | ||||||
} | ||||||
|
||||||
//impl_ops!(Mul, mul, *); | ||||||
|
||||||
#[cfg(test)] | ||||||
mod tests { | ||||||
storage_types! { | ||||||
use crate::si::quantities::*; | ||||||
use crate::si::luminous_flux as lf; | ||||||
use crate::si::luminous_intensity as li; | ||||||
use crate::si::solid_angle as sa; | ||||||
use crate::tests::{A, Test}; | ||||||
|
||||||
quickcheck! { | ||||||
#[allow(trivial_casts)] | ||||||
fn add(l: A<V>, r: A<V>) -> bool { | ||||||
Test::eq(&LuminousFlux::<V>::new::<lf::lumen>(&*l * &*r), | ||||||
&(LuminousIntensity::<V>::new::<li::candela>((*l).clone()) | ||||||
* SolidAngle::<V>::new::<sa::steradian>((*r).clone())).into()) | ||||||
} | ||||||
} | ||||||
} | ||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
By convention just the base 7 units are included. I've excluded the steradian (sr) because it's not a base unit, but I'm not convinced this is the right choice.
For the dimension comment the base unit dimensions are used. There isn't a current place where a quantity's symbol is defined or used anywhere. I'll add an issue about this.