1 /++
2 This module only contains a template mixin that defines
3 SI units, prefixes and symbols.
4 
5 Copyright: Copyright 2013-2018, Nicolas Sicard
6 Authors: Nicolas Sicard
7 License: $(LINK www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
8 Source: $(LINK https://github.com/biozic/quantities)
9 +/
10 module quantities.si.definitions;
11 
12 /++
13 Generates the definitions of the SI units, prefixes and symbols.
14 +/
15 mixin template SIDefinitions(N)
16 {
17     import quantities.compiletime.quantity : Quantity, unit, square, cubic;
18     import quantities.runtime.qvariant : prefix;
19     import quantities.runtime.parsing : SymbolList;
20     import std.math : PI;
21     import std.traits : isNumeric;
22 
23     static assert(isNumeric!N);
24 
25     /// The dimensionless unit 1.
26     enum one = unit!(N, "");
27     
28     /// Base SI units.
29     enum meter = unit!(N, "L");
30     alias metre = meter; /// ditto
31     enum kilogram = unit!(N, "M"); /// ditto
32     enum second = unit!(N, "T"); /// ditto
33     enum ampere = unit!(N, "I"); /// ditto
34     enum kelvin = unit!(N, "Θ"); /// ditto
35     enum mole = unit!(N, "N"); /// ditto
36     enum candela = unit!(N, "J"); /// ditto
37 
38     /// Derived SI units
39     enum radian = meter / meter; // ditto
40     enum steradian = square(meter) / square(meter); /// ditto
41     enum hertz = 1 / second; /// ditto
42     enum newton = kilogram * meter / square(second); /// ditto
43     enum pascal = newton / square(meter); /// ditto
44     enum joule = newton * meter; /// ditto
45     enum watt = joule / second; /// ditto
46     enum coulomb = second * ampere; /// ditto
47     enum volt = watt / ampere; /// ditto
48     enum farad = coulomb / volt; /// ditto
49     enum ohm = volt / ampere; /// ditto
50     enum siemens = ampere / volt; /// ditto
51     enum weber = volt * second; /// ditto
52     enum tesla = weber / square(meter); /// ditto
53     enum henry = weber / ampere; /// ditto
54     enum celsius = kelvin; /// ditto
55     enum lumen = candela / steradian; /// ditto
56     enum lux = lumen / square(meter); /// ditto
57     enum becquerel = 1 / second; /// ditto
58     enum gray = joule / kilogram; /// ditto
59     enum sievert = joule / kilogram; /// ditto
60     enum katal = mole / second; /// ditto
61 
62     /// Units compatible with the SI
63     enum gram = 1e-3 * kilogram;
64     enum minute = 60 * second; /// ditto
65     enum hour = 60 * minute; /// ditto
66     enum day = 24 * hour; /// ditto
67     enum degreeOfAngle = PI / 180 * radian; /// ditto
68     enum minuteOfAngle = degreeOfAngle / 60; /// ditto
69     enum secondOfAngle = minuteOfAngle / 60; /// ditto
70     enum hectare = 1e4 * square(meter); /// ditto
71     enum liter = 1e-3 * cubic(meter); /// ditto
72     alias litre = liter; /// ditto
73     enum ton = 1e3 * kilogram; /// ditto
74     enum electronVolt = 1.60217653e-19 * joule; /// ditto
75     enum dalton = 1.66053886e-27 * kilogram; /// ditto
76 
77     /// SI prefixes.
78     alias yotta = prefix!1e24;
79     alias zetta = prefix!1e21; /// ditto
80     alias exa = prefix!1e18; /// ditto
81     alias peta = prefix!1e15; /// ditto
82     alias tera = prefix!1e12; /// ditto
83     alias giga = prefix!1e9; /// ditto
84     alias mega = prefix!1e6; /// ditto
85     alias kilo = prefix!1e3; /// ditto
86     alias hecto = prefix!1e2; /// ditto
87     alias deca = prefix!1e1; /// ditto
88     alias deci = prefix!1e-1; /// ditto
89     alias centi = prefix!1e-2; /// ditto
90     alias milli = prefix!1e-3; /// ditto
91     alias micro = prefix!1e-6; /// ditto
92     alias nano = prefix!1e-9; /// ditto
93     alias pico = prefix!1e-12; /// ditto
94     alias femto = prefix!1e-15; /// ditto
95     alias atto = prefix!1e-18; /// ditto
96     alias zepto = prefix!1e-21; /// ditto
97     alias yocto = prefix!1e-24; /// ditto
98 
99     /// A list of common SI symbols and prefixes
100     // dfmt off
101     enum siSymbolList = SymbolList!N()
102         .addUnit("m", meter)
103         .addUnit("kg", kilogram)
104         .addUnit("s", second)
105         .addUnit("A", ampere)
106         .addUnit("K", kelvin)
107         .addUnit("mol", mole)
108         .addUnit("cd", candela)
109         .addUnit("rad", radian)
110         .addUnit("sr", steradian)
111         .addUnit("Hz", hertz)
112         .addUnit("N", newton)
113         .addUnit("Pa", pascal)
114         .addUnit("J", joule)
115         .addUnit("W", watt)
116         .addUnit("C", coulomb)
117         .addUnit("V", volt)
118         .addUnit("F", farad)
119         .addUnit("Ω", ohm)
120         .addUnit("S", siemens)
121         .addUnit("Wb", weber)
122         .addUnit("T", tesla)
123         .addUnit("H", henry)
124         .addUnit("lm", lumen)
125         .addUnit("lx", lux)
126         .addUnit("Bq", becquerel)
127         .addUnit("Gy", gray)
128         .addUnit("Sv", sievert)
129         .addUnit("kat", katal)
130         .addUnit("g", gram)
131         .addUnit("min", minute)
132         .addUnit("h", hour)
133         .addUnit("d", day)
134         .addUnit("l", liter)
135         .addUnit("L", liter)
136         .addUnit("t", ton)
137         .addUnit("eV", electronVolt)
138         .addUnit("Da", dalton)
139         .addPrefix("Y", 1e24)
140         .addPrefix("Z", 1e21)
141         .addPrefix("E", 1e18)
142         .addPrefix("P", 1e15)
143         .addPrefix("T", 1e12)
144         .addPrefix("G", 1e9)
145         .addPrefix("M", 1e6)
146         .addPrefix("k", 1e3)
147         .addPrefix("h", 1e2)
148         .addPrefix("da", 1e1)
149         .addPrefix("d", 1e-1)
150         .addPrefix("c", 1e-2)
151         .addPrefix("m", 1e-3)
152         .addPrefix("µ", 1e-6)
153         .addPrefix("n", 1e-9)
154         .addPrefix("p", 1e-12)
155         .addPrefix("f", 1e-15)
156         .addPrefix("a", 1e-18)
157         .addPrefix("z", 1e-21)
158         .addPrefix("y", 1e-24);
159     // dfmt on
160 }