Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/hgrecco/pint
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewgsavage committed Jan 15, 2025
2 parents 4fababf + 18f1191 commit 4012c26
Show file tree
Hide file tree
Showing 14 changed files with 167 additions and 75 deletions.
10 changes: 8 additions & 2 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,13 @@ Pint Changelog
0.25.0 (unreleased)
-------------------

- Nothing changed yet
- Add docs to the functions in ``pint.testing`` (PR #2070)
- Fix round function returning float instead of int (#2081)
- Fix return type of `PlainQuantity.to` (#2088)
- Update constants to CODATA 2022 recommended values. (#2049)
- Fixed issue with `.to_compact` and Magnitudes with uncertainties / Quantities with units (PR #2069, issue #2044)
- Add conductivity dimension. (#2112)
- Add absorbance unit and dimension. (#2114)


0.24.4 (2024-11-07)
Expand Down Expand Up @@ -32,7 +38,7 @@ Pint Changelog


0.24.1 (2024-06-24)
-----------------
-------------------

- Fix custom formatter needing the registry object. (PR #2011)
- Support python 3.9 following difficulties installing with NumPy 2. (PR #2019)
Expand Down
2 changes: 1 addition & 1 deletion docs/advanced/measurement.rst
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,4 @@ the `Propagation of uncertainty`_ rules.


.. _`Propagation of uncertainty`: http://en.wikipedia.org/wiki/Propagation_of_uncertainty
.. _`Uncertainties package`: https://uncertainties-python-package.readthedocs.io/en/latest/
.. _`Uncertainties package`: https://uncertainties.readthedocs.io/en/latest/
1 change: 1 addition & 0 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
"sphinx_design",
]


# Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"]

Expand Down
2 changes: 1 addition & 1 deletion docs/ecosystem.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Pint integrations:


Packages using pint:
------------------
--------------------

- `fluids <https://github.com/CalebBell/fluids>`_ Practical fluid dynamics calculations
- `ht <https://github.com/CalebBell/ht/>`_ Practical heat transfer calculations
Expand Down
1 change: 1 addition & 0 deletions docs/getting/overview.rst
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ License
-------

.. literalinclude:: ../../LICENSE
:language: none

.. _`comprehensive list of physical units, prefixes and constants`: https://github.com/hgrecco/pint/blob/master/pint/default_en.txt
.. _`uncertainties package`: https://pythonhosted.org/uncertainties/
Expand Down
21 changes: 10 additions & 11 deletions pint/constants_en.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,22 +46,21 @@ wien_wavelength_displacement_law_constant = ℎ * c / (k * wien_x)
wien_frequency_displacement_law_constant = wien_u * k / ℎ

#### MEASURED CONSTANTS ####
# Recommended CODATA-2018 values
# Recommended CODATA-2022 values
# To some extent, what is measured and what is derived is a bit arbitrary.
# The choice of measured constants is based on convenience and on available uncertainty.
# The uncertainty in the last significant digits is given in parentheses as a comment.

newtonian_constant_of_gravitation = 6.67430e-11 m^3/(kg s^2) = _ = gravitational_constant # (15)
rydberg_constant = 1.0973731568160e7 * m^-1 = R_∞ = R_inf # (21)
electron_g_factor = -2.00231930436256 = g_e # (35)
atomic_mass_constant = 1.66053906660e-27 kg = m_u # (50)
electron_mass = 9.1093837015e-31 kg = m_e = atomic_unit_of_mass = a_u_mass # (28)
proton_mass = 1.67262192369e-27 kg = m_p # (51)
neutron_mass = 1.67492749804e-27 kg = m_n # (95)
lattice_spacing_of_Si = 1.920155716e-10 m = d_220 # (32)
K_alpha_Cu_d_220 = 0.80232719 # (22)
K_alpha_Mo_d_220 = 0.36940604 # (19)
K_alpha_W_d_220 = 0.108852175 # (98)
rydberg_constant = 1.0973731568157e7 * m^-1 = R_∞ = R_inf # (12)
electron_g_factor = -2.00231930436092 = g_e # (36)
atomic_mass_constant = 1.66053906892e-27 kg = m_u # (52)
electron_mass = 9.1093837139e-31 kg = m_e = atomic_unit_of_mass = a_u_mass # (28)
proton_mass = 1.67262192595e-27 kg = m_p # (52)
neutron_mass = 1.67492750056e-27 kg = m_n # (85)
x_unit_Cu = 1.00207697e-13 m = Xu_Cu # (28)
x_unit_Mo = 1.00209952e-13 m = Xu_Mo # (53)
angstrom_star = 1.00001495e-10 = Å_star # (90)

#### DERIVED CONSTANTS ####

Expand Down
10 changes: 7 additions & 3 deletions pint/default_en.txt
Original file line number Diff line number Diff line change
Expand Up @@ -162,9 +162,6 @@ astronomical_unit = 149597870700 * meter = au # since Aug 2012
parsec = 1 / tansec * astronomical_unit = pc
nautical_mile = 1852 * meter = nmi
bohr = hbar / (alpha * m_e * c) = a_0 = a0 = bohr_radius = atomic_unit_of_length = a_u_length
x_unit_Cu = K_alpha_Cu_d_220 * d_220 / 1537.4 = Xu_Cu
x_unit_Mo = K_alpha_Mo_d_220 * d_220 / 707.831 = Xu_Mo
angstrom_star = K_alpha_W_d_220 * d_220 / 0.2090100 = Å_star
planck_length = (hbar * gravitational_constant / c ** 3) ** 0.5

# Mass
Expand Down Expand Up @@ -451,6 +448,9 @@ conventional_ohm_90 = R_K / R_K90 * ohm = Ω_90 = ohm_90
siemens = ampere / volt = S = mho
absiemens = 1e9 * siemens = abS = abmho

# Conductivity
[conductivity] = [conductance]/[length]

# Capacitance
[capacitance] = [charge] / [electric_potential]
farad = coulomb / volt = F
Expand Down Expand Up @@ -499,6 +499,10 @@ nuclear_magneton = e * hbar / (2 * m_p) = µ_N = mu_N
[refractive_index] = []
refractive_index_unit = [] = RIU

# Absorbance
[absorbance] = []
absorbance_unit = [] = AU

# Logaritmic Unit Definition
# Unit = scale; logbase; logfactor
# x_dB = [logfactor] * log( x_lin / [scale] ) / log( [logbase] )
Expand Down
12 changes: 6 additions & 6 deletions pint/facets/plain/qto.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,12 +110,12 @@ def to_compact(
)
return quantity

if (
quantity.unitless
or quantity.magnitude == 0
or math.isnan(quantity.magnitude)
or math.isinf(quantity.magnitude)
):
qm = (
quantity.magnitude
if not hasattr(quantity.magnitude, "nominal_value")
else quantity.magnitude.nominal_value
)
if quantity.unitless or qm == 0 or math.isnan(qm) or math.isinf(qm):
return quantity

SI_prefixes: dict[int, str] = {}
Expand Down
15 changes: 8 additions & 7 deletions pint/facets/plain/quantity.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
"""
pint.facets.plain.quantity
~~~~~~~~~~~~~~~~~~~~~~~~~
pint.facets.plain.quantity
~~~~~~~~~~~~~~~~~~~~~~~~~
:copyright: 2022 by Pint Authors, see AUTHORS for more details.
:license: BSD, see LICENSE for more details.
:copyright: 2022 by Pint Authors, see AUTHORS for more details.
:license: BSD, see LICENSE for more details.
"""

from __future__ import annotations
Expand All @@ -26,6 +26,7 @@
from ..._typing import Magnitude, QuantityOrUnitLike, Scalar, UnitLike
from ...compat import (
HAS_NUMPY,
Self,
_to_magnitude,
deprecated,
eq,
Expand Down Expand Up @@ -515,7 +516,7 @@ def ito(

def to(
self, other: QuantityOrUnitLike | None = None, *contexts, **ctx_kwargs
) -> PlainQuantity:
) -> Self:
"""Return PlainQuantity rescaled to different units.
Parameters
Expand Down Expand Up @@ -1288,8 +1289,8 @@ def __rpow__(self, other) -> PlainQuantity[MagnitudeT]:
def __abs__(self) -> PlainQuantity[MagnitudeT]:
return self.__class__(abs(self._magnitude), self._units)

def __round__(self, ndigits: int | None = 0) -> PlainQuantity[MagnitudeT]:
return self.__class__(round(self._magnitude, ndigits=ndigits), self._units)
def __round__(self, ndigits: int | None = None) -> PlainQuantity[int]:
return self.__class__(round(self._magnitude, ndigits), self._units)

def __pos__(self) -> PlainQuantity[MagnitudeT]:
return self.__class__(operator.pos(self._magnitude), self._units)
Expand Down
85 changes: 43 additions & 42 deletions pint/pint_convert.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,26 +91,47 @@ def _set(key: str, value):
# m_e: Electron mass
# m_p: Proton mass
# m_n: Neutron mass
R_i = (ureg._units["R_inf"].converter.scale, 0.0000000000021e7)
g_e = (ureg._units["g_e"].converter.scale, 0.00000000000035)
m_u = (ureg._units["m_u"].converter.scale, 0.00000000050e-27)
m_e = (ureg._units["m_e"].converter.scale, 0.00000000028e-30)
m_p = (ureg._units["m_p"].converter.scale, 0.00000000051e-27)
m_n = (ureg._units["m_n"].converter.scale, 0.00000000095e-27)
# x_Cu: Copper x unit
# x_Mo: Molybdenum x unit
# A_s: Angstrom star
R_i = (ureg._units["R_inf"].converter.scale, 0.0000000000012e7)
g_e = (ureg._units["g_e"].converter.scale, 0.00000000000036)
m_u = (ureg._units["m_u"].converter.scale, 0.00000000052e-27)
m_e = (ureg._units["m_e"].converter.scale, 0.0000000028e-31)
m_p = (ureg._units["m_p"].converter.scale, 0.00000000052e-27)
m_n = (ureg._units["m_n"].converter.scale, 0.00000000085e-27)
x_Cu = (ureg._units["x_unit_Cu"].converter.scale, 0.00000028e-13)
x_Mo = (ureg._units["x_unit_Mo"].converter.scale, 0.00000053e-13)
A_s = (ureg._units["angstrom_star"].converter.scale, 0.00000090e-10)
if args.corr:
# fmt: off
# Correlation matrix between measured constants (to be completed below)
# R_i g_e m_u m_e m_p m_n
# R_i g_e m_u m_e m_p m_n x_Cu x_Mo A_s
corr = [
[1.0, -0.00206, 0.00369, 0.00436, 0.00194, 0.00233], # R_i
[-0.00206, 1.0, 0.99029, 0.99490, 0.97560, 0.52445], # g_e
[0.00369, 0.99029, 1.0, 0.99536, 0.98516, 0.52959], # m_u
[0.00436, 0.99490, 0.99536, 1.0, 0.98058, 0.52714], # m_e
[0.00194, 0.97560, 0.98516, 0.98058, 1.0, 0.51521], # m_p
[0.00233, 0.52445, 0.52959, 0.52714, 0.51521, 1.0],
] # m_n
[ 1.00000, -0.00122, 0.00438, 0.00225, 0.00455, 0.00277, 0.00000, 0.00000, 0.00000], # R_i
[-0.00122, 1.00000, 0.97398, 0.97555, 0.97404, 0.59702, 0.00000, 0.00000, 0.00000], # g_e
[ 0.00438, 0.97398, 1.00000, 0.99839, 0.99965, 0.61279, 0.00000, 0.00000, 0.00000], # m_u
[ 0.00225, 0.97555, 0.99839, 1.00000, 0.99845, 0.61199, 0.00000, 0.00000, 0.00000], # m_e
[ 0.00455, 0.97404, 0.99965, 0.99845, 1.00000, 0.61281, 0.00000, 0.00000, 0.00000], # m_p
[ 0.00277, 0.59702, 0.61279, 0.61199, 0.61281, 1.00000,-0.00098,-0.00108,-0.00063], # m_n
[ 0.00000, 0.00000, 0.00000, 0.00000, 0.00000,-0.00098, 1.00000, 0.00067, 0.00039], # x_Cu
[ 0.00000, 0.00000, 0.00000, 0.00000, 0.00000,-0.00108, 0.00067, 1.00000, 0.00100], # x_Mo
[ 0.00000, 0.00000, 0.00000, 0.00000, 0.00000,-0.00063, 0.00039, 0.00100, 1.00000], # A_s
]
# fmt: on
try:
(R_i, g_e, m_u, m_e, m_p, m_n) = uncertainties.correlated_values_norm(
[R_i, g_e, m_u, m_e, m_p, m_n], corr
(
R_i,
g_e,
m_u,
m_e,
m_p,
m_n,
x_Cu,
x_Mo,
A_s,
) = uncertainties.correlated_values_norm(
[R_i, g_e, m_u, m_e, m_p, m_n, x_Cu, x_Mo, A_s], corr
)
except AttributeError:
raise Exception(
Expand All @@ -123,13 +144,19 @@ def _set(key: str, value):
m_e = uncertainties.ufloat(*m_e)
m_p = uncertainties.ufloat(*m_p)
m_n = uncertainties.ufloat(*m_n)
x_Cu = uncertainties.ufloat(*x_Cu)
x_Mo = uncertainties.ufloat(*x_Mo)
A_s = uncertainties.ufloat(*A_s)

_set("R_inf", R_i)
_set("g_e", g_e)
_set("m_u", m_u)
_set("m_e", m_e)
_set("m_p", m_p)
_set("m_n", m_n)
_set("x_unit_Cu", x_Cu)
_set("x_unit_Mo", x_Mo)
_set("angstrom_star", A_s)

# Measured constants with zero correlation
_set(
Expand All @@ -139,32 +166,6 @@ def _set(key: str, value):
),
)

_set(
"d_220",
uncertainties.ufloat(ureg._units["d_220"].converter.scale, 0.000000032e-10),
)

_set(
"K_alpha_Cu_d_220",
uncertainties.ufloat(
ureg._units["K_alpha_Cu_d_220"].converter.scale, 0.00000022
),
)

_set(
"K_alpha_Mo_d_220",
uncertainties.ufloat(
ureg._units["K_alpha_Mo_d_220"].converter.scale, 0.00000019
),
)

_set(
"K_alpha_W_d_220",
uncertainties.ufloat(
ureg._units["K_alpha_W_d_220"].converter.scale, 0.000000098
),
)

ureg._root_units_cache = {}
ureg._build_cache()

Expand Down
56 changes: 56 additions & 0 deletions pint/testing.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
"""
pint.testing
~~~~~~~~~~~~
Functions for testing whether pint quantities are equal.
:copyright: 2016 by Pint Authors, see AUTHORS for more details..
:license: BSD, see LICENSE for more details.
"""

from __future__ import annotations

import math
Expand Down Expand Up @@ -35,6 +45,25 @@ def _get_comparable_magnitudes(first, second, msg):


def assert_equal(first, second, msg: str | None = None) -> None:
"""
Assert that two quantities are equal
Parameters
----------
first
First quantity to compare
second
Second quantity to compare
msg
If supplied, message to show if the two quantities aren't equal.
Raises
------
AssertionError
The two quantities are not equal.
"""
if msg is None:
msg = f"Comparing {first!r} and {second!r}. "

Expand All @@ -60,6 +89,33 @@ def assert_equal(first, second, msg: str | None = None) -> None:
def assert_allclose(
first, second, rtol: float = 1e-07, atol: float = 0, msg: str | None = None
) -> None:
"""
Assert that two quantities are all close
Unlike numpy, this uses a symmetric check of closeness.
Parameters
----------
first
First quantity to compare
second
Second quantity to compare
rtol
Relative tolerance to use when checking for closeness.
atol
Absolute tolerance to use when checking for closeness.
msg
If supplied, message to show if the two quantities aren't equal.
Raises
------
AssertionError
The two quantities are not close to within the supplied tolerance.
"""
if msg is None:
try:
msg = f"Comparing {first!r} and {second!r}. "
Expand Down
Loading

0 comments on commit 4012c26

Please sign in to comment.