1# -*- coding: utf-8 -*-
2# Licensed under a 3-clause BSD style license - see LICENSE.rst
3"""
4This package defines the SI units.  They are also available in the
5`astropy.units` namespace.
6
7"""
8
9from astropy.constants import si as _si
10from .core import UnitBase, Unit, def_unit
11
12import numpy as _numpy
13
14_ns = globals()
15
16
17###########################################################################
18# DIMENSIONLESS
19
20def_unit(['percent', 'pct'], Unit(0.01), namespace=_ns, prefixes=False,
21         doc="percent: one hundredth of unity, factor 0.01",
22         format={'generic': '%', 'console': '%', 'cds': '%',
23                 'latex': r'\%', 'unicode': '%'})
24
25###########################################################################
26# LENGTH
27
28def_unit(['m', 'meter'], namespace=_ns, prefixes=True,
29         doc="meter: base unit of length in SI")
30
31def_unit(['micron'], um, namespace=_ns,
32         doc="micron: alias for micrometer (um)",
33         format={'latex': r'\mu m', 'unicode': '\N{MICRO SIGN}m'})
34
35def_unit(['Angstrom', 'AA', 'angstrom'], 0.1 * nm, namespace=_ns,
36         doc="ångström: 10 ** -10 m",
37         prefixes=[(['m', 'milli'], ['milli', 'm'], 1.e-3)],
38         format={'latex': r'\mathring{A}', 'unicode': 'Å',
39                 'vounit': 'Angstrom'})
40
41
42###########################################################################
43# VOLUMES
44
45def_unit((['l', 'L'], ['liter']), 1000 * cm ** 3.0, namespace=_ns, prefixes=True,
46         format={'latex': r'\mathcal{l}', 'unicode': 'ℓ'},
47         doc="liter: metric unit of volume")
48
49
50###########################################################################
51# ANGULAR MEASUREMENTS
52
53def_unit(['rad', 'radian'], namespace=_ns, prefixes=True,
54         doc="radian: angular measurement of the ratio between the length "
55         "on an arc and its radius")
56def_unit(['deg', 'degree'], _numpy.pi / 180.0 * rad, namespace=_ns,
57         prefixes=True,
58         doc="degree: angular measurement 1/360 of full rotation",
59         format={'latex': r'{}^{\circ}', 'unicode': '°'})
60def_unit(['hourangle'], 15.0 * deg, namespace=_ns, prefixes=False,
61         doc="hour angle: angular measurement with 24 in a full circle",
62         format={'latex': r'{}^{h}', 'unicode': 'ʰ'})
63def_unit(['arcmin', 'arcminute'], 1.0 / 60.0 * deg, namespace=_ns,
64         prefixes=True,
65         doc="arc minute: angular measurement",
66         format={'latex': r'{}^{\prime}', 'unicode': '′'})
67def_unit(['arcsec', 'arcsecond'], 1.0 / 3600.0 * deg, namespace=_ns,
68         prefixes=True,
69         doc="arc second: angular measurement")
70# These special formats should only be used for the non-prefix versions
71arcsec._format = {'latex': r'{}^{\prime\prime}', 'unicode': '″'}
72def_unit(['mas'], 0.001 * arcsec, namespace=_ns,
73         doc="milli arc second: angular measurement")
74def_unit(['uas'], 0.000001 * arcsec, namespace=_ns,
75         doc="micro arc second: angular measurement",
76         format={'latex': r'\mu as', 'unicode': 'μas'})
77
78def_unit(['sr', 'steradian'], rad ** 2, namespace=_ns, prefixes=True,
79         doc="steradian: unit of solid angle in SI")
80
81
82###########################################################################
83# TIME
84
85def_unit(['s', 'second'], namespace=_ns, prefixes=True,
86         exclude_prefixes=['a'],
87         doc="second: base unit of time in SI.")
88
89def_unit(['min', 'minute'], 60 * s, prefixes=True, namespace=_ns)
90def_unit(['h', 'hour', 'hr'], 3600 * s, namespace=_ns, prefixes=True,
91         exclude_prefixes=['p'])
92def_unit(['d', 'day'], 24 * h, namespace=_ns, prefixes=True,
93         exclude_prefixes=['c', 'y'])
94def_unit(['sday'], 86164.09053 * s, namespace=_ns,
95         doc="Sidereal day (sday) is the time of one rotation of the Earth.")
96def_unit(['wk', 'week'], 7 * day, namespace=_ns)
97def_unit(['fortnight'], 2 * wk, namespace=_ns)
98
99def_unit(['a', 'annum'], 365.25 * d, namespace=_ns, prefixes=True,
100         exclude_prefixes=['P'])
101def_unit(['yr', 'year'], 365.25 * d, namespace=_ns, prefixes=True)
102
103
104###########################################################################
105# FREQUENCY
106
107def_unit(['Hz', 'Hertz', 'hertz'], 1 / s, namespace=_ns, prefixes=True,
108         doc="Frequency")
109
110
111###########################################################################
112# MASS
113
114def_unit(['kg', 'kilogram'], namespace=_ns,
115         doc="kilogram: base unit of mass in SI.")
116def_unit(['g', 'gram'], 1.0e-3 * kg, namespace=_ns, prefixes=True,
117         exclude_prefixes=['k', 'kilo'])
118
119def_unit(['t', 'tonne'], 1000 * kg, namespace=_ns,
120         doc="Metric tonne")
121
122
123###########################################################################
124# AMOUNT OF SUBSTANCE
125
126def_unit(['mol', 'mole'], namespace=_ns, prefixes=True,
127         doc="mole: amount of a chemical substance in SI.")
128
129
130###########################################################################
131# TEMPERATURE
132
133def_unit(
134    ['K', 'Kelvin'], namespace=_ns, prefixes=True,
135    doc="Kelvin: temperature with a null point at absolute zero.")
136def_unit(
137    ['deg_C', 'Celsius'], namespace=_ns, doc='Degrees Celsius',
138    format={'latex': r'{}^{\circ}C', 'unicode': '°C'})
139
140
141###########################################################################
142# FORCE
143
144def_unit(['N', 'Newton', 'newton'], kg * m * s ** -2, namespace=_ns,
145         prefixes=True, doc="Newton: force")
146
147
148##########################################################################
149# ENERGY
150
151def_unit(['J', 'Joule', 'joule'], N * m, namespace=_ns, prefixes=True,
152         doc="Joule: energy")
153def_unit(['eV', 'electronvolt'], _si.e.value * J, namespace=_ns, prefixes=True,
154         doc="Electron Volt")
155
156
157##########################################################################
158# PRESSURE
159
160def_unit(['Pa', 'Pascal', 'pascal'], J * m ** -3, namespace=_ns, prefixes=True,
161         doc="Pascal: pressure")
162
163
164###########################################################################
165# POWER
166
167def_unit(['W', 'Watt', 'watt'], J / s, namespace=_ns, prefixes=True,
168         doc="Watt: power")
169
170
171###########################################################################
172# ELECTRICAL
173
174def_unit(['A', 'ampere', 'amp'], namespace=_ns, prefixes=True,
175         doc="ampere: base unit of electric current in SI")
176def_unit(['C', 'coulomb'], A * s, namespace=_ns, prefixes=True,
177         doc="coulomb: electric charge")
178def_unit(['V', 'Volt', 'volt'], J * C ** -1, namespace=_ns, prefixes=True,
179         doc="Volt: electric potential or electromotive force")
180def_unit((['Ohm', 'ohm'], ['Ohm']), V * A ** -1, namespace=_ns, prefixes=True,
181         doc="Ohm: electrical resistance",
182         format={'latex': r'\Omega', 'unicode': 'Ω'})
183def_unit(['S', 'Siemens', 'siemens'], A * V ** -1, namespace=_ns,
184         prefixes=True, doc="Siemens: electrical conductance")
185def_unit(['F', 'Farad', 'farad'], C * V ** -1, namespace=_ns, prefixes=True,
186         doc="Farad: electrical capacitance")
187
188
189###########################################################################
190# MAGNETIC
191
192def_unit(['Wb', 'Weber', 'weber'], V * s, namespace=_ns, prefixes=True,
193         doc="Weber: magnetic flux")
194def_unit(['T', 'Tesla', 'tesla'], Wb * m ** -2, namespace=_ns, prefixes=True,
195         doc="Tesla: magnetic flux density")
196def_unit(['H', 'Henry', 'henry'], Wb * A ** -1, namespace=_ns, prefixes=True,
197         doc="Henry: inductance")
198
199
200###########################################################################
201# ILLUMINATION
202
203def_unit(['cd', 'candela'], namespace=_ns, prefixes=True,
204         doc="candela: base unit of luminous intensity in SI")
205def_unit(['lm', 'lumen'], cd * sr, namespace=_ns, prefixes=True,
206         doc="lumen: luminous flux")
207def_unit(['lx', 'lux'], lm * m ** -2, namespace=_ns, prefixes=True,
208         doc="lux: luminous emittance")
209
210###########################################################################
211# RADIOACTIVITY
212
213def_unit(['Bq', 'becquerel'], 1 / s, namespace=_ns, prefixes=False,
214         doc="becquerel: unit of radioactivity")
215def_unit(['Ci', 'curie'], Bq * 3.7e10, namespace=_ns, prefixes=False,
216         doc="curie: unit of radioactivity")
217
218
219###########################################################################
220# BASES
221
222bases = set([m, s, kg, A, cd, rad, K, mol])
223
224
225###########################################################################
226# CLEANUP
227
228del UnitBase
229del Unit
230del def_unit
231
232
233###########################################################################
234# DOCSTRING
235
236# This generates a docstring for this module that describes all of the
237# standard units defined here.
238from .utils import generate_unit_summary as _generate_unit_summary
239if __doc__ is not None:
240    __doc__ += _generate_unit_summary(globals())
241