Coverage for /usr/lib/python3/dist-packages/sympy/physics/units/systems/si.py: 99%
140 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
1"""
2SI unit system.
3Based on MKSA, which stands for "meter, kilogram, second, ampere".
4Added kelvin, candela and mole.
6"""
8from __future__ import annotations
10from sympy.physics.units import DimensionSystem, Dimension, dHg0
12from sympy.physics.units.quantities import Quantity
14from sympy.core.numbers import (Rational, pi)
15from sympy.core.singleton import S
16from sympy.functions.elementary.miscellaneous import sqrt
17from sympy.physics.units.definitions.dimension_definitions import (
18 acceleration, action, current, impedance, length, mass, time, velocity,
19 amount_of_substance, temperature, information, frequency, force, pressure,
20 energy, power, charge, voltage, capacitance, conductance, magnetic_flux,
21 magnetic_density, inductance, luminous_intensity
22)
23from sympy.physics.units.definitions import (
24 kilogram, newton, second, meter, gram, cd, K, joule, watt, pascal, hertz,
25 coulomb, volt, ohm, siemens, farad, henry, tesla, weber, dioptre, lux,
26 katal, gray, becquerel, inch, liter, julian_year, gravitational_constant,
27 speed_of_light, elementary_charge, planck, hbar, electronvolt,
28 avogadro_number, avogadro_constant, boltzmann_constant, electron_rest_mass,
29 stefan_boltzmann_constant, Da, atomic_mass_constant, molar_gas_constant,
30 faraday_constant, josephson_constant, von_klitzing_constant,
31 acceleration_due_to_gravity, magnetic_constant, vacuum_permittivity,
32 vacuum_impedance, coulomb_constant, atmosphere, bar, pound, psi, mmHg,
33 milli_mass_unit, quart, lightyear, astronomical_unit, planck_mass,
34 planck_time, planck_temperature, planck_length, planck_charge, planck_area,
35 planck_volume, planck_momentum, planck_energy, planck_force, planck_power,
36 planck_density, planck_energy_density, planck_intensity,
37 planck_angular_frequency, planck_pressure, planck_current, planck_voltage,
38 planck_impedance, planck_acceleration, bit, byte, kibibyte, mebibyte,
39 gibibyte, tebibyte, pebibyte, exbibyte, curie, rutherford, radian, degree,
40 steradian, angular_mil, atomic_mass_unit, gee, kPa, ampere, u0, c, kelvin,
41 mol, mole, candela, m, kg, s, electric_constant, G, boltzmann
42)
43from sympy.physics.units.prefixes import PREFIXES, prefix_unit
44from sympy.physics.units.systems.mksa import MKSA, dimsys_MKSA
46derived_dims = (frequency, force, pressure, energy, power, charge, voltage,
47 capacitance, conductance, magnetic_flux,
48 magnetic_density, inductance, luminous_intensity)
49base_dims = (amount_of_substance, luminous_intensity, temperature)
51units = [mol, cd, K, lux, hertz, newton, pascal, joule, watt, coulomb, volt,
52 farad, ohm, siemens, weber, tesla, henry, candela, lux, becquerel,
53 gray, katal]
55all_units: list[Quantity] = []
56for u in units:
57 all_units.extend(prefix_unit(u, PREFIXES))
59all_units.extend(units)
60all_units.extend([mol, cd, K, lux])
63dimsys_SI = dimsys_MKSA.extend(
64 [
65 # Dimensional dependencies for other base dimensions:
66 temperature,
67 amount_of_substance,
68 luminous_intensity,
69 ])
71dimsys_default = dimsys_SI.extend(
72 [information],
73)
75SI = MKSA.extend(base=(mol, cd, K), units=all_units, name='SI', dimension_system=dimsys_SI, derived_units={
76 power: watt,
77 magnetic_flux: weber,
78 time: second,
79 impedance: ohm,
80 pressure: pascal,
81 current: ampere,
82 voltage: volt,
83 length: meter,
84 frequency: hertz,
85 inductance: henry,
86 temperature: kelvin,
87 amount_of_substance: mole,
88 luminous_intensity: candela,
89 conductance: siemens,
90 mass: kilogram,
91 magnetic_density: tesla,
92 charge: coulomb,
93 force: newton,
94 capacitance: farad,
95 energy: joule,
96 velocity: meter/second,
97})
99One = S.One
101SI.set_quantity_dimension(radian, One)
103SI.set_quantity_scale_factor(ampere, One)
105SI.set_quantity_scale_factor(kelvin, One)
107SI.set_quantity_scale_factor(mole, One)
109SI.set_quantity_scale_factor(candela, One)
111# MKSA extension to MKS: derived units
113SI.set_quantity_scale_factor(coulomb, One)
115SI.set_quantity_scale_factor(volt, joule/coulomb)
117SI.set_quantity_scale_factor(ohm, volt/ampere)
119SI.set_quantity_scale_factor(siemens, ampere/volt)
121SI.set_quantity_scale_factor(farad, coulomb/volt)
123SI.set_quantity_scale_factor(henry, volt*second/ampere)
125SI.set_quantity_scale_factor(tesla, volt*second/meter**2)
127SI.set_quantity_scale_factor(weber, joule/ampere)
130SI.set_quantity_dimension(lux, luminous_intensity / length ** 2)
131SI.set_quantity_scale_factor(lux, steradian*candela/meter**2)
133# katal is the SI unit of catalytic activity
135SI.set_quantity_dimension(katal, amount_of_substance / time)
136SI.set_quantity_scale_factor(katal, mol/second)
138# gray is the SI unit of absorbed dose
140SI.set_quantity_dimension(gray, energy / mass)
141SI.set_quantity_scale_factor(gray, meter**2/second**2)
143# becquerel is the SI unit of radioactivity
145SI.set_quantity_dimension(becquerel, 1 / time)
146SI.set_quantity_scale_factor(becquerel, 1/second)
148#### CONSTANTS ####
150# elementary charge
151# REF: NIST SP 959 (June 2019)
153SI.set_quantity_dimension(elementary_charge, charge)
154SI.set_quantity_scale_factor(elementary_charge, 1.602176634e-19*coulomb)
156# Electronvolt
157# REF: NIST SP 959 (June 2019)
159SI.set_quantity_dimension(electronvolt, energy)
160SI.set_quantity_scale_factor(electronvolt, 1.602176634e-19*joule)
162# Avogadro number
163# REF: NIST SP 959 (June 2019)
165SI.set_quantity_dimension(avogadro_number, One)
166SI.set_quantity_scale_factor(avogadro_number, 6.02214076e23)
168# Avogadro constant
170SI.set_quantity_dimension(avogadro_constant, amount_of_substance ** -1)
171SI.set_quantity_scale_factor(avogadro_constant, avogadro_number / mol)
173# Boltzmann constant
174# REF: NIST SP 959 (June 2019)
176SI.set_quantity_dimension(boltzmann_constant, energy / temperature)
177SI.set_quantity_scale_factor(boltzmann_constant, 1.380649e-23*joule/kelvin)
179# Stefan-Boltzmann constant
180# REF: NIST SP 959 (June 2019)
182SI.set_quantity_dimension(stefan_boltzmann_constant, energy * time ** -1 * length ** -2 * temperature ** -4)
183SI.set_quantity_scale_factor(stefan_boltzmann_constant, pi**2 * boltzmann_constant**4 / (60 * hbar**3 * speed_of_light ** 2))
185# Atomic mass
186# REF: NIST SP 959 (June 2019)
188SI.set_quantity_dimension(atomic_mass_constant, mass)
189SI.set_quantity_scale_factor(atomic_mass_constant, 1.66053906660e-24*gram)
191# Molar gas constant
192# REF: NIST SP 959 (June 2019)
194SI.set_quantity_dimension(molar_gas_constant, energy / (temperature * amount_of_substance))
195SI.set_quantity_scale_factor(molar_gas_constant, boltzmann_constant * avogadro_constant)
197# Faraday constant
199SI.set_quantity_dimension(faraday_constant, charge / amount_of_substance)
200SI.set_quantity_scale_factor(faraday_constant, elementary_charge * avogadro_constant)
202# Josephson constant
204SI.set_quantity_dimension(josephson_constant, frequency / voltage)
205SI.set_quantity_scale_factor(josephson_constant, 0.5 * planck / elementary_charge)
207# Von Klitzing constant
209SI.set_quantity_dimension(von_klitzing_constant, voltage / current)
210SI.set_quantity_scale_factor(von_klitzing_constant, hbar / elementary_charge ** 2)
212# Acceleration due to gravity (on the Earth surface)
214SI.set_quantity_dimension(acceleration_due_to_gravity, acceleration)
215SI.set_quantity_scale_factor(acceleration_due_to_gravity, 9.80665*meter/second**2)
217# magnetic constant:
219SI.set_quantity_dimension(magnetic_constant, force / current ** 2)
220SI.set_quantity_scale_factor(magnetic_constant, 4*pi/10**7 * newton/ampere**2)
222# electric constant:
224SI.set_quantity_dimension(vacuum_permittivity, capacitance / length)
225SI.set_quantity_scale_factor(vacuum_permittivity, 1/(u0 * c**2))
227# vacuum impedance:
229SI.set_quantity_dimension(vacuum_impedance, impedance)
230SI.set_quantity_scale_factor(vacuum_impedance, u0 * c)
232# Electron rest mass
233SI.set_quantity_dimension(electron_rest_mass, mass)
234SI.set_quantity_scale_factor(electron_rest_mass, 9.1093837015e-31*kilogram)
236# Coulomb's constant:
237SI.set_quantity_dimension(coulomb_constant, force * length ** 2 / charge ** 2)
238SI.set_quantity_scale_factor(coulomb_constant, 1/(4*pi*vacuum_permittivity))
240SI.set_quantity_dimension(psi, pressure)
241SI.set_quantity_scale_factor(psi, pound * gee / inch ** 2)
243SI.set_quantity_dimension(mmHg, pressure)
244SI.set_quantity_scale_factor(mmHg, dHg0 * acceleration_due_to_gravity * kilogram / meter**2)
246SI.set_quantity_dimension(milli_mass_unit, mass)
247SI.set_quantity_scale_factor(milli_mass_unit, atomic_mass_unit/1000)
249SI.set_quantity_dimension(quart, length ** 3)
250SI.set_quantity_scale_factor(quart, Rational(231, 4) * inch**3)
252# Other convenient units and magnitudes
254SI.set_quantity_dimension(lightyear, length)
255SI.set_quantity_scale_factor(lightyear, speed_of_light*julian_year)
257SI.set_quantity_dimension(astronomical_unit, length)
258SI.set_quantity_scale_factor(astronomical_unit, 149597870691*meter)
260# Fundamental Planck units:
262SI.set_quantity_dimension(planck_mass, mass)
263SI.set_quantity_scale_factor(planck_mass, sqrt(hbar*speed_of_light/G))
265SI.set_quantity_dimension(planck_time, time)
266SI.set_quantity_scale_factor(planck_time, sqrt(hbar*G/speed_of_light**5))
268SI.set_quantity_dimension(planck_temperature, temperature)
269SI.set_quantity_scale_factor(planck_temperature, sqrt(hbar*speed_of_light**5/G/boltzmann**2))
271SI.set_quantity_dimension(planck_length, length)
272SI.set_quantity_scale_factor(planck_length, sqrt(hbar*G/speed_of_light**3))
274SI.set_quantity_dimension(planck_charge, charge)
275SI.set_quantity_scale_factor(planck_charge, sqrt(4*pi*electric_constant*hbar*speed_of_light))
277# Derived Planck units:
279SI.set_quantity_dimension(planck_area, length ** 2)
280SI.set_quantity_scale_factor(planck_area, planck_length**2)
282SI.set_quantity_dimension(planck_volume, length ** 3)
283SI.set_quantity_scale_factor(planck_volume, planck_length**3)
285SI.set_quantity_dimension(planck_momentum, mass * velocity)
286SI.set_quantity_scale_factor(planck_momentum, planck_mass * speed_of_light)
288SI.set_quantity_dimension(planck_energy, energy)
289SI.set_quantity_scale_factor(planck_energy, planck_mass * speed_of_light**2)
291SI.set_quantity_dimension(planck_force, force)
292SI.set_quantity_scale_factor(planck_force, planck_energy / planck_length)
294SI.set_quantity_dimension(planck_power, power)
295SI.set_quantity_scale_factor(planck_power, planck_energy / planck_time)
297SI.set_quantity_dimension(planck_density, mass / length ** 3)
298SI.set_quantity_scale_factor(planck_density, planck_mass / planck_length**3)
300SI.set_quantity_dimension(planck_energy_density, energy / length ** 3)
301SI.set_quantity_scale_factor(planck_energy_density, planck_energy / planck_length**3)
303SI.set_quantity_dimension(planck_intensity, mass * time ** (-3))
304SI.set_quantity_scale_factor(planck_intensity, planck_energy_density * speed_of_light)
306SI.set_quantity_dimension(planck_angular_frequency, 1 / time)
307SI.set_quantity_scale_factor(planck_angular_frequency, 1 / planck_time)
309SI.set_quantity_dimension(planck_pressure, pressure)
310SI.set_quantity_scale_factor(planck_pressure, planck_force / planck_length**2)
312SI.set_quantity_dimension(planck_current, current)
313SI.set_quantity_scale_factor(planck_current, planck_charge / planck_time)
315SI.set_quantity_dimension(planck_voltage, voltage)
316SI.set_quantity_scale_factor(planck_voltage, planck_energy / planck_charge)
318SI.set_quantity_dimension(planck_impedance, impedance)
319SI.set_quantity_scale_factor(planck_impedance, planck_voltage / planck_current)
321SI.set_quantity_dimension(planck_acceleration, acceleration)
322SI.set_quantity_scale_factor(planck_acceleration, speed_of_light / planck_time)
324# Older units for radioactivity
326SI.set_quantity_dimension(curie, 1 / time)
327SI.set_quantity_scale_factor(curie, 37000000000*becquerel)
329SI.set_quantity_dimension(rutherford, 1 / time)
330SI.set_quantity_scale_factor(rutherford, 1000000*becquerel)
333# check that scale factors are the right SI dimensions:
334for _scale_factor, _dimension in zip(
335 SI._quantity_scale_factors.values(),
336 SI._quantity_dimension_map.values()
337):
338 dimex = SI.get_dimensional_expr(_scale_factor)
339 if dimex != 1:
340 # XXX: equivalent_dims is an instance method taking two arguments in
341 # addition to self so this can not work:
342 if not DimensionSystem.equivalent_dims(_dimension, Dimension(dimex)): # type: ignore
343 raise ValueError("quantity value and dimension mismatch")
344del _scale_factor, _dimension
346__all__ = [
347 'mmHg', 'atmosphere', 'inductance', 'newton', 'meter',
348 'vacuum_permittivity', 'pascal', 'magnetic_constant', 'voltage',
349 'angular_mil', 'luminous_intensity', 'all_units',
350 'julian_year', 'weber', 'exbibyte', 'liter',
351 'molar_gas_constant', 'faraday_constant', 'avogadro_constant',
352 'lightyear', 'planck_density', 'gee', 'mol', 'bit', 'gray',
353 'planck_momentum', 'bar', 'magnetic_density', 'prefix_unit', 'PREFIXES',
354 'planck_time', 'dimex', 'gram', 'candela', 'force', 'planck_intensity',
355 'energy', 'becquerel', 'planck_acceleration', 'speed_of_light',
356 'conductance', 'frequency', 'coulomb_constant', 'degree', 'lux', 'planck',
357 'current', 'planck_current', 'tebibyte', 'planck_power', 'MKSA', 'power',
358 'K', 'planck_volume', 'quart', 'pressure', 'amount_of_substance',
359 'joule', 'boltzmann_constant', 'Dimension', 'c', 'planck_force', 'length',
360 'watt', 'action', 'hbar', 'gibibyte', 'DimensionSystem', 'cd', 'volt',
361 'planck_charge', 'dioptre', 'vacuum_impedance', 'dimsys_default', 'farad',
362 'charge', 'gravitational_constant', 'temperature', 'u0', 'hertz',
363 'capacitance', 'tesla', 'steradian', 'planck_mass', 'josephson_constant',
364 'planck_area', 'stefan_boltzmann_constant', 'base_dims',
365 'astronomical_unit', 'radian', 'planck_voltage', 'impedance',
366 'planck_energy', 'Da', 'atomic_mass_constant', 'rutherford', 'second', 'inch',
367 'elementary_charge', 'SI', 'electronvolt', 'dimsys_SI', 'henry',
368 'planck_angular_frequency', 'ohm', 'pound', 'planck_pressure', 'G', 'psi',
369 'dHg0', 'von_klitzing_constant', 'planck_length', 'avogadro_number',
370 'mole', 'acceleration', 'information', 'planck_energy_density',
371 'mebibyte', 's', 'acceleration_due_to_gravity', 'electron_rest_mass',
372 'planck_temperature', 'units', 'mass', 'dimsys_MKSA', 'kelvin', 'kPa',
373 'boltzmann', 'milli_mass_unit', 'planck_impedance', 'electric_constant',
374 'derived_dims', 'kg', 'coulomb', 'siemens', 'byte', 'magnetic_flux',
375 'atomic_mass_unit', 'm', 'kibibyte', 'kilogram', 'One', 'curie', 'u',
376 'time', 'pebibyte', 'velocity', 'ampere', 'katal',
377]