454 lines
12 KiB
Python
454 lines
12 KiB
Python
|
# isort:skip_file
|
||
|
"""
|
||
|
Dimensional analysis and unit systems.
|
||
|
|
||
|
This module defines dimension/unit systems and physical quantities. It is
|
||
|
based on a group-theoretical construction where dimensions are represented as
|
||
|
vectors (coefficients being the exponents), and units are defined as a dimension
|
||
|
to which we added a scale.
|
||
|
|
||
|
Quantities are built from a factor and a unit, and are the basic objects that
|
||
|
one will use when doing computations.
|
||
|
|
||
|
All objects except systems and prefixes can be used in SymPy expressions.
|
||
|
Note that as part of a CAS, various objects do not combine automatically
|
||
|
under operations.
|
||
|
|
||
|
Details about the implementation can be found in the documentation, and we
|
||
|
will not repeat all the explanations we gave there concerning our approach.
|
||
|
Ideas about future developments can be found on the `Github wiki
|
||
|
<https://github.com/sympy/sympy/wiki/Unit-systems>`_, and you should consult
|
||
|
this page if you are willing to help.
|
||
|
|
||
|
Useful functions:
|
||
|
|
||
|
- ``find_unit``: easily lookup pre-defined units.
|
||
|
- ``convert_to(expr, newunit)``: converts an expression into the same
|
||
|
expression expressed in another unit.
|
||
|
|
||
|
"""
|
||
|
|
||
|
from .dimensions import Dimension, DimensionSystem
|
||
|
from .unitsystem import UnitSystem
|
||
|
from .util import convert_to
|
||
|
from .quantities import Quantity
|
||
|
|
||
|
from .definitions.dimension_definitions import (
|
||
|
amount_of_substance, acceleration, action, area,
|
||
|
capacitance, charge, conductance, current, energy,
|
||
|
force, frequency, impedance, inductance, length,
|
||
|
luminous_intensity, magnetic_density,
|
||
|
magnetic_flux, mass, momentum, power, pressure, temperature, time,
|
||
|
velocity, voltage, volume
|
||
|
)
|
||
|
|
||
|
Unit = Quantity
|
||
|
|
||
|
speed = velocity
|
||
|
luminosity = luminous_intensity
|
||
|
magnetic_flux_density = magnetic_density
|
||
|
amount = amount_of_substance
|
||
|
|
||
|
from .prefixes import (
|
||
|
# 10-power based:
|
||
|
yotta,
|
||
|
zetta,
|
||
|
exa,
|
||
|
peta,
|
||
|
tera,
|
||
|
giga,
|
||
|
mega,
|
||
|
kilo,
|
||
|
hecto,
|
||
|
deca,
|
||
|
deci,
|
||
|
centi,
|
||
|
milli,
|
||
|
micro,
|
||
|
nano,
|
||
|
pico,
|
||
|
femto,
|
||
|
atto,
|
||
|
zepto,
|
||
|
yocto,
|
||
|
# 2-power based:
|
||
|
kibi,
|
||
|
mebi,
|
||
|
gibi,
|
||
|
tebi,
|
||
|
pebi,
|
||
|
exbi,
|
||
|
)
|
||
|
|
||
|
from .definitions import (
|
||
|
percent, percents,
|
||
|
permille,
|
||
|
rad, radian, radians,
|
||
|
deg, degree, degrees,
|
||
|
sr, steradian, steradians,
|
||
|
mil, angular_mil, angular_mils,
|
||
|
m, meter, meters,
|
||
|
kg, kilogram, kilograms,
|
||
|
s, second, seconds,
|
||
|
A, ampere, amperes,
|
||
|
K, kelvin, kelvins,
|
||
|
mol, mole, moles,
|
||
|
cd, candela, candelas,
|
||
|
g, gram, grams,
|
||
|
mg, milligram, milligrams,
|
||
|
ug, microgram, micrograms,
|
||
|
t, tonne, metric_ton,
|
||
|
newton, newtons, N,
|
||
|
joule, joules, J,
|
||
|
watt, watts, W,
|
||
|
pascal, pascals, Pa, pa,
|
||
|
hertz, hz, Hz,
|
||
|
coulomb, coulombs, C,
|
||
|
volt, volts, v, V,
|
||
|
ohm, ohms,
|
||
|
siemens, S, mho, mhos,
|
||
|
farad, farads, F,
|
||
|
henry, henrys, H,
|
||
|
tesla, teslas, T,
|
||
|
weber, webers, Wb, wb,
|
||
|
optical_power, dioptre, D,
|
||
|
lux, lx,
|
||
|
katal, kat,
|
||
|
gray, Gy,
|
||
|
becquerel, Bq,
|
||
|
km, kilometer, kilometers,
|
||
|
dm, decimeter, decimeters,
|
||
|
cm, centimeter, centimeters,
|
||
|
mm, millimeter, millimeters,
|
||
|
um, micrometer, micrometers, micron, microns,
|
||
|
nm, nanometer, nanometers,
|
||
|
pm, picometer, picometers,
|
||
|
ft, foot, feet,
|
||
|
inch, inches,
|
||
|
yd, yard, yards,
|
||
|
mi, mile, miles,
|
||
|
nmi, nautical_mile, nautical_miles,
|
||
|
angstrom, angstroms,
|
||
|
ha, hectare,
|
||
|
l, L, liter, liters,
|
||
|
dl, dL, deciliter, deciliters,
|
||
|
cl, cL, centiliter, centiliters,
|
||
|
ml, mL, milliliter, milliliters,
|
||
|
ms, millisecond, milliseconds,
|
||
|
us, microsecond, microseconds,
|
||
|
ns, nanosecond, nanoseconds,
|
||
|
ps, picosecond, picoseconds,
|
||
|
minute, minutes,
|
||
|
h, hour, hours,
|
||
|
day, days,
|
||
|
anomalistic_year, anomalistic_years,
|
||
|
sidereal_year, sidereal_years,
|
||
|
tropical_year, tropical_years,
|
||
|
common_year, common_years,
|
||
|
julian_year, julian_years,
|
||
|
draconic_year, draconic_years,
|
||
|
gaussian_year, gaussian_years,
|
||
|
full_moon_cycle, full_moon_cycles,
|
||
|
year, years,
|
||
|
G, gravitational_constant,
|
||
|
c, speed_of_light,
|
||
|
elementary_charge,
|
||
|
hbar,
|
||
|
planck,
|
||
|
eV, electronvolt, electronvolts,
|
||
|
avogadro_number,
|
||
|
avogadro, avogadro_constant,
|
||
|
boltzmann, boltzmann_constant,
|
||
|
stefan, stefan_boltzmann_constant,
|
||
|
R, molar_gas_constant,
|
||
|
faraday_constant,
|
||
|
josephson_constant,
|
||
|
von_klitzing_constant,
|
||
|
Da, dalton, amu, amus, atomic_mass_unit, atomic_mass_constant,
|
||
|
me, electron_rest_mass,
|
||
|
gee, gees, acceleration_due_to_gravity,
|
||
|
u0, magnetic_constant, vacuum_permeability,
|
||
|
e0, electric_constant, vacuum_permittivity,
|
||
|
Z0, vacuum_impedance,
|
||
|
coulomb_constant, electric_force_constant,
|
||
|
atmosphere, atmospheres, atm,
|
||
|
kPa,
|
||
|
bar, bars,
|
||
|
pound, pounds,
|
||
|
psi,
|
||
|
dHg0,
|
||
|
mmHg, torr,
|
||
|
mmu, mmus, milli_mass_unit,
|
||
|
quart, quarts,
|
||
|
ly, lightyear, lightyears,
|
||
|
au, astronomical_unit, astronomical_units,
|
||
|
planck_mass,
|
||
|
planck_time,
|
||
|
planck_temperature,
|
||
|
planck_length,
|
||
|
planck_charge,
|
||
|
planck_area,
|
||
|
planck_volume,
|
||
|
planck_momentum,
|
||
|
planck_energy,
|
||
|
planck_force,
|
||
|
planck_power,
|
||
|
planck_density,
|
||
|
planck_energy_density,
|
||
|
planck_intensity,
|
||
|
planck_angular_frequency,
|
||
|
planck_pressure,
|
||
|
planck_current,
|
||
|
planck_voltage,
|
||
|
planck_impedance,
|
||
|
planck_acceleration,
|
||
|
bit, bits,
|
||
|
byte,
|
||
|
kibibyte, kibibytes,
|
||
|
mebibyte, mebibytes,
|
||
|
gibibyte, gibibytes,
|
||
|
tebibyte, tebibytes,
|
||
|
pebibyte, pebibytes,
|
||
|
exbibyte, exbibytes,
|
||
|
)
|
||
|
|
||
|
from .systems import (
|
||
|
mks, mksa, si
|
||
|
)
|
||
|
|
||
|
|
||
|
def find_unit(quantity, unit_system="SI"):
|
||
|
"""
|
||
|
Return a list of matching units or dimension names.
|
||
|
|
||
|
- If ``quantity`` is a string -- units/dimensions containing the string
|
||
|
`quantity`.
|
||
|
- If ``quantity`` is a unit or dimension -- units having matching base
|
||
|
units or dimensions.
|
||
|
|
||
|
Examples
|
||
|
========
|
||
|
|
||
|
>>> from sympy.physics import units as u
|
||
|
>>> u.find_unit('charge')
|
||
|
['C', 'coulomb', 'coulombs', 'planck_charge', 'elementary_charge']
|
||
|
>>> u.find_unit(u.charge)
|
||
|
['C', 'coulomb', 'coulombs', 'planck_charge', 'elementary_charge']
|
||
|
>>> u.find_unit("ampere")
|
||
|
['ampere', 'amperes']
|
||
|
>>> u.find_unit('angstrom')
|
||
|
['angstrom', 'angstroms']
|
||
|
>>> u.find_unit('volt')
|
||
|
['volt', 'volts', 'electronvolt', 'electronvolts', 'planck_voltage']
|
||
|
>>> u.find_unit(u.inch**3)[:9]
|
||
|
['L', 'l', 'cL', 'cl', 'dL', 'dl', 'mL', 'ml', 'liter']
|
||
|
"""
|
||
|
unit_system = UnitSystem.get_unit_system(unit_system)
|
||
|
|
||
|
import sympy.physics.units as u
|
||
|
rv = []
|
||
|
if isinstance(quantity, str):
|
||
|
rv = [i for i in dir(u) if quantity in i and isinstance(getattr(u, i), Quantity)]
|
||
|
dim = getattr(u, quantity)
|
||
|
if isinstance(dim, Dimension):
|
||
|
rv.extend(find_unit(dim))
|
||
|
else:
|
||
|
for i in sorted(dir(u)):
|
||
|
other = getattr(u, i)
|
||
|
if not isinstance(other, Quantity):
|
||
|
continue
|
||
|
if isinstance(quantity, Quantity):
|
||
|
if quantity.dimension == other.dimension:
|
||
|
rv.append(str(i))
|
||
|
elif isinstance(quantity, Dimension):
|
||
|
if other.dimension == quantity:
|
||
|
rv.append(str(i))
|
||
|
elif other.dimension == Dimension(unit_system.get_dimensional_expr(quantity)):
|
||
|
rv.append(str(i))
|
||
|
return sorted(set(rv), key=lambda x: (len(x), x))
|
||
|
|
||
|
# NOTE: the old units module had additional variables:
|
||
|
# 'density', 'illuminance', 'resistance'.
|
||
|
# They were not dimensions, but units (old Unit class).
|
||
|
|
||
|
__all__ = [
|
||
|
'Dimension', 'DimensionSystem',
|
||
|
'UnitSystem',
|
||
|
'convert_to',
|
||
|
'Quantity',
|
||
|
|
||
|
'amount_of_substance', 'acceleration', 'action', 'area',
|
||
|
'capacitance', 'charge', 'conductance', 'current', 'energy',
|
||
|
'force', 'frequency', 'impedance', 'inductance', 'length',
|
||
|
'luminous_intensity', 'magnetic_density',
|
||
|
'magnetic_flux', 'mass', 'momentum', 'power', 'pressure', 'temperature', 'time',
|
||
|
'velocity', 'voltage', 'volume',
|
||
|
|
||
|
'Unit',
|
||
|
|
||
|
'speed',
|
||
|
'luminosity',
|
||
|
'magnetic_flux_density',
|
||
|
'amount',
|
||
|
|
||
|
'yotta',
|
||
|
'zetta',
|
||
|
'exa',
|
||
|
'peta',
|
||
|
'tera',
|
||
|
'giga',
|
||
|
'mega',
|
||
|
'kilo',
|
||
|
'hecto',
|
||
|
'deca',
|
||
|
'deci',
|
||
|
'centi',
|
||
|
'milli',
|
||
|
'micro',
|
||
|
'nano',
|
||
|
'pico',
|
||
|
'femto',
|
||
|
'atto',
|
||
|
'zepto',
|
||
|
'yocto',
|
||
|
|
||
|
'kibi',
|
||
|
'mebi',
|
||
|
'gibi',
|
||
|
'tebi',
|
||
|
'pebi',
|
||
|
'exbi',
|
||
|
|
||
|
'percent', 'percents',
|
||
|
'permille',
|
||
|
'rad', 'radian', 'radians',
|
||
|
'deg', 'degree', 'degrees',
|
||
|
'sr', 'steradian', 'steradians',
|
||
|
'mil', 'angular_mil', 'angular_mils',
|
||
|
'm', 'meter', 'meters',
|
||
|
'kg', 'kilogram', 'kilograms',
|
||
|
's', 'second', 'seconds',
|
||
|
'A', 'ampere', 'amperes',
|
||
|
'K', 'kelvin', 'kelvins',
|
||
|
'mol', 'mole', 'moles',
|
||
|
'cd', 'candela', 'candelas',
|
||
|
'g', 'gram', 'grams',
|
||
|
'mg', 'milligram', 'milligrams',
|
||
|
'ug', 'microgram', 'micrograms',
|
||
|
't', 'tonne', 'metric_ton',
|
||
|
'newton', 'newtons', 'N',
|
||
|
'joule', 'joules', 'J',
|
||
|
'watt', 'watts', 'W',
|
||
|
'pascal', 'pascals', 'Pa', 'pa',
|
||
|
'hertz', 'hz', 'Hz',
|
||
|
'coulomb', 'coulombs', 'C',
|
||
|
'volt', 'volts', 'v', 'V',
|
||
|
'ohm', 'ohms',
|
||
|
'siemens', 'S', 'mho', 'mhos',
|
||
|
'farad', 'farads', 'F',
|
||
|
'henry', 'henrys', 'H',
|
||
|
'tesla', 'teslas', 'T',
|
||
|
'weber', 'webers', 'Wb', 'wb',
|
||
|
'optical_power', 'dioptre', 'D',
|
||
|
'lux', 'lx',
|
||
|
'katal', 'kat',
|
||
|
'gray', 'Gy',
|
||
|
'becquerel', 'Bq',
|
||
|
'km', 'kilometer', 'kilometers',
|
||
|
'dm', 'decimeter', 'decimeters',
|
||
|
'cm', 'centimeter', 'centimeters',
|
||
|
'mm', 'millimeter', 'millimeters',
|
||
|
'um', 'micrometer', 'micrometers', 'micron', 'microns',
|
||
|
'nm', 'nanometer', 'nanometers',
|
||
|
'pm', 'picometer', 'picometers',
|
||
|
'ft', 'foot', 'feet',
|
||
|
'inch', 'inches',
|
||
|
'yd', 'yard', 'yards',
|
||
|
'mi', 'mile', 'miles',
|
||
|
'nmi', 'nautical_mile', 'nautical_miles',
|
||
|
'angstrom', 'angstroms',
|
||
|
'ha', 'hectare',
|
||
|
'l', 'L', 'liter', 'liters',
|
||
|
'dl', 'dL', 'deciliter', 'deciliters',
|
||
|
'cl', 'cL', 'centiliter', 'centiliters',
|
||
|
'ml', 'mL', 'milliliter', 'milliliters',
|
||
|
'ms', 'millisecond', 'milliseconds',
|
||
|
'us', 'microsecond', 'microseconds',
|
||
|
'ns', 'nanosecond', 'nanoseconds',
|
||
|
'ps', 'picosecond', 'picoseconds',
|
||
|
'minute', 'minutes',
|
||
|
'h', 'hour', 'hours',
|
||
|
'day', 'days',
|
||
|
'anomalistic_year', 'anomalistic_years',
|
||
|
'sidereal_year', 'sidereal_years',
|
||
|
'tropical_year', 'tropical_years',
|
||
|
'common_year', 'common_years',
|
||
|
'julian_year', 'julian_years',
|
||
|
'draconic_year', 'draconic_years',
|
||
|
'gaussian_year', 'gaussian_years',
|
||
|
'full_moon_cycle', 'full_moon_cycles',
|
||
|
'year', 'years',
|
||
|
'G', 'gravitational_constant',
|
||
|
'c', 'speed_of_light',
|
||
|
'elementary_charge',
|
||
|
'hbar',
|
||
|
'planck',
|
||
|
'eV', 'electronvolt', 'electronvolts',
|
||
|
'avogadro_number',
|
||
|
'avogadro', 'avogadro_constant',
|
||
|
'boltzmann', 'boltzmann_constant',
|
||
|
'stefan', 'stefan_boltzmann_constant',
|
||
|
'R', 'molar_gas_constant',
|
||
|
'faraday_constant',
|
||
|
'josephson_constant',
|
||
|
'von_klitzing_constant',
|
||
|
'Da', 'dalton', 'amu', 'amus', 'atomic_mass_unit', 'atomic_mass_constant',
|
||
|
'me', 'electron_rest_mass',
|
||
|
'gee', 'gees', 'acceleration_due_to_gravity',
|
||
|
'u0', 'magnetic_constant', 'vacuum_permeability',
|
||
|
'e0', 'electric_constant', 'vacuum_permittivity',
|
||
|
'Z0', 'vacuum_impedance',
|
||
|
'coulomb_constant', 'electric_force_constant',
|
||
|
'atmosphere', 'atmospheres', 'atm',
|
||
|
'kPa',
|
||
|
'bar', 'bars',
|
||
|
'pound', 'pounds',
|
||
|
'psi',
|
||
|
'dHg0',
|
||
|
'mmHg', 'torr',
|
||
|
'mmu', 'mmus', 'milli_mass_unit',
|
||
|
'quart', 'quarts',
|
||
|
'ly', 'lightyear', 'lightyears',
|
||
|
'au', 'astronomical_unit', 'astronomical_units',
|
||
|
'planck_mass',
|
||
|
'planck_time',
|
||
|
'planck_temperature',
|
||
|
'planck_length',
|
||
|
'planck_charge',
|
||
|
'planck_area',
|
||
|
'planck_volume',
|
||
|
'planck_momentum',
|
||
|
'planck_energy',
|
||
|
'planck_force',
|
||
|
'planck_power',
|
||
|
'planck_density',
|
||
|
'planck_energy_density',
|
||
|
'planck_intensity',
|
||
|
'planck_angular_frequency',
|
||
|
'planck_pressure',
|
||
|
'planck_current',
|
||
|
'planck_voltage',
|
||
|
'planck_impedance',
|
||
|
'planck_acceleration',
|
||
|
'bit', 'bits',
|
||
|
'byte',
|
||
|
'kibibyte', 'kibibytes',
|
||
|
'mebibyte', 'mebibytes',
|
||
|
'gibibyte', 'gibibytes',
|
||
|
'tebibyte', 'tebibytes',
|
||
|
'pebibyte', 'pebibytes',
|
||
|
'exbibyte', 'exbibytes',
|
||
|
|
||
|
'mks', 'mksa', 'si',
|
||
|
]
|