From fadbf7075ea8764d5363ffd401f7f8581848747a Mon Sep 17 00:00:00 2001 From: Jellby Date: Sun, 15 Dec 2024 13:27:37 +0100 Subject: [PATCH] CODATA 2022 update (#2049) --- CHANGES | 1 + pint/constants_en.txt | 21 +++++------ pint/default_en.txt | 3 -- pint/pint_convert.py | 85 ++++++++++++++++++++++--------------------- 4 files changed, 54 insertions(+), 56 deletions(-) diff --git a/CHANGES b/CHANGES index e592ac1d6..6b3752f03 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Pint Changelog - Add docs to the functions in ``pint.testing`` (PR #2070) - Fix round function returning float instead of int (#2081) +- Update constants to CODATA 2022 recommended values. (#2049) 0.24.4 (2024-11-07) diff --git a/pint/constants_en.txt b/pint/constants_en.txt index 9babc8fa2..2f6fcfb50 100644 --- a/pint/constants_en.txt +++ b/pint/constants_en.txt @@ -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 #### diff --git a/pint/default_en.txt b/pint/default_en.txt index 4250a48cb..bbac09bed 100644 --- a/pint/default_en.txt +++ b/pint/default_en.txt @@ -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 diff --git a/pint/pint_convert.py b/pint/pint_convert.py index 0934588b8..dd830718c 100644 --- a/pint/pint_convert.py +++ b/pint/pint_convert.py @@ -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( @@ -123,6 +144,9 @@ 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) @@ -130,6 +154,9 @@ def _set(key: str, value): _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( @@ -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()