From 44878e1e0698081e272b2c05f7ab0d553a0cd65c Mon Sep 17 00:00:00 2001 From: Dream Scatter <18372368+chakravala@users.noreply.github.com> Date: Sun, 18 Jul 2021 19:14:35 -0400 Subject: [PATCH 01/11] Initial commit --- LICENSE | 21 +++++++++++++++++++++ README.md | 2 ++ 2 files changed, 23 insertions(+) create mode 100644 LICENSE create mode 100644 README.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5de7351 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Dream Scatter + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0e42fc2 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# UnitSystems +Physical unit systems (Metric, English, Natural, etc...) From e4c7b8c8d43ea2d581eac20a56036bcbeb8acc89 Mon Sep 17 00:00:00 2001 From: Michael Reed <18372368+chakravala@users.noreply.github.com> Date: Sun, 18 Jul 2021 19:23:55 -0400 Subject: [PATCH 02/11] implemented UnitSystem in Wolfram language --- README.md | 8 + UnitSystems.wl | 586 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 594 insertions(+) create mode 100644 UnitSystems.wl diff --git a/README.md b/README.md index 0e42fc2..05e6576 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,10 @@ # UnitSystems + Physical unit systems (Metric, English, Natural, etc...) + +Documentation will be added soon. + +This code was previously implemented in Julia lanaguage: +https://github.com/chakravala/UnitSystems.jl + +https://geophysics.crucialflow.com/dev/units diff --git a/UnitSystems.wl b/UnitSystems.wl new file mode 100644 index 0000000..ca985e4 --- /dev/null +++ b/UnitSystems.wl @@ -0,0 +1,586 @@ +(* ::Package:: *) +(* This file is part of UnitSystems. It is licensed under the MIT license *) +(* UnitSystems Copyright (C) 2021 Michael Reed *) + +Unprotect[UnitSystem]; +ProtectedList = {Length, Area, Volume, Power, Entropy}; +UnitSystemsList = {Metric, SI2019, CODATA, Conventional, MTS, English, + EnglishUS, IAU, SI1976, Mixed, ESU2019, EMU2019, EMU, ESU, Gauss, + LorentzHeaviside, Thomson, Kennelly, Planck, PlanckGauss, Stoney, + Hartree, Rydberg, Schrodinger, Electronic, Natural, NaturalGauss, + QCD, QCDGauss, QCDoriginal}; +ConstantsList = {Hyperfine, LightSpeed, Planck, PlanckReduced, + ElectronMass, MolarMass, Boltzmann, Permeability, Rationalization, + Lorentz, LuminousEfficacy}; +PhysicsList = {AtomicMass, ProtonMass, PlanckMass, Newton, Einstein, + Hartree, Rydberg, Bohr, BohrReduced, ElectronRadius, Avogadro, + Universal, Stefan, RadiationDensity, Permittivity, Coulomb, Ampere, + BiotSavart, Charge, Faraday, Impedance, Conductance, Klitzing, + Josephson, MagneticFlux, Magneton}; +KinematicList = {Time, Length, Area, Volume, WaveNumber, + FuelEfficiency, Frequency, FrequencyDrift, Speed, Acceleration, + Jerk, Snap, VolumeFlow}; +MechanicalList = {Mass, MassFlow, LinearDensity, AreaDensity, Density, + SpecificVolume, Force, Stiffness, Pressure, Compressibility, + Viscosity, Diffusivity, RotationalInertia, Momentum, + AngularMomentum, Yank, Energy, SpecificEnergy, Action, Fluence, + Power, PowerDensity, Intensity, SpectralFlux, SoundExposure, + Impedance, SpecificImpedance, Admittance, Compliance, Inertance}; +ElectromagneticList = {Charge, ChargeDensity, LinearChargeDensity, + Exposure, Mobility, Capacitance, Inductance, Reluctance, Permeance, + Permittivity, Permeability, Susceptibility, + SpecificSusceptibility, DemagnetizingFactor, VectorPotential, + ElectricPotential, MagneticPotential, ElectricField, MagneticField, + ElectricFlux, MagneticFlux, ElectricFluxDensity, + MagneticFluxDensity, ElectricDipoleMoment, MagneticDipoleMoment, + ElectricPolarizability, MagneticPolarizability, MagneticMoment, + Magnetizability, Magnetization, SpecificMagnetization, Rigidity, + PoleStrength}; +ThermodynamicList = {Temperature, Entropy, SpecificEntropy, + VolumeHeatCapacity, ThermalConductivity, ThermalConductance, + ThermalResistance, ThermalExpansion, LapseRate}; +MolarList = {MolarMass, Molality, Mole, Molarity, MolarVolume, + MolarEntropy, MolarEnergy, MolarConductivity, MolarSusceptibility, + Catalysis, Specificity}; +PhotometricList = {LuminousFlux, Luminance, LuminousEnergy, + LuminousExposure, LuminousEfficacy}; +MechanicsList = Join[KinematicList, MechanicalList]; +ConvertList = + Join[MechanicsList, ElectromagneticList, ThermodynamicList, + MolarList, PhotometricList]; + +measure[x_] := x; +GravityCoupling[Coupling[\[Alpha]G_, ___]] := measure[\[Alpha]G]; +FineStructure[Coupling[_, \[Alpha]_, ___]] := measure[\[Alpha]]; +ElectronUnit[Coupling[_, _, \[Mu]eu_, ___]] := measure[\[Mu]eu]; +ProtonUnit[Coupling[_, _, _, \[Mu]pu_, ___]] := measure[\[Mu]pu]; +ProtonElectron[c_Coupling] := ProtonUnit[c]/ElectronUnit[c]; + +UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, \[Lambda]_] := + UnitSystem[kB, \[HBar], c, \[Mu]0, me, \[Lambda], 1]; +UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_] := + UnitSystem[kB, \[HBar], c, \[Mu]0, me, 1]; +Boltzmann[UnitSystem[kB_, ___]] := kB; +PlanckReduced[UnitSystem[_, \[HBar]_, ___]] := \[HBar]; +LightSpeed[UnitSystem[_, _, c_, ___]] := c; +Permeability[UnitSystem[_, _, _, \[Mu]0_, ___]] := \[Mu]0; +ElectronMass[UnitSystem[_, _, _, _, me_, ___]] := me; +Rationalization[UnitSystem[_, _, _, _, _, \[Lambda]_, ___]] := \[Lambda]; +Lorentz[UnitSystem[_, _, _, _, _, _, \[Alpha]L_, ___]] := \[Alpha]L; + +RationalizedQ[u_UnitSystem] := Rationalization[u] != 4 \[Pi] + +Universe[_] := StandardModel; +Unit[x_, y_ : 1] := x; +Mass[u_UnitSystem, s_UnitSystem] := ElectronMass[u, s]; +ElectronMass[h_?NumberQ] := R\[Infinity] 2 h \[Alpha]inv/c; +ElectronMass[h_?NumberQ, u_Coupling] := (R\[Infinity] 2 h)/(FineStructure[u]^2 c); +PlanckMass[u_UnitSystem, c_Coupling] := ElectronMass[u, c]/Sqrt[GravityCoupling[c]]; +Planck[u_UnitSystem, c_Coupling] := 2 \[Pi] PlanckReduced[u]; +Newton[u_UnitSystem, c_Coupling] := ( + LightSpeed[u, c] PlanckReduced[u, c])/PlanckMass[u, c]^2; +Charge[u_UnitSystem, c_Coupling] := Sqrt[2 Planck[u]/(Permeability[u]/FineStructure[u])/ + (LightSpeed[u] Rationalization[u] Lorentz[u]^2)]; + +Map[(#[u_UnitSystem] := #[u, Universe[u]]) &, {PlanckMass, Planck, Newton, Charge}]; +Map[(#[u_UnitSystem] := #[Universe[u]]) &, {GravityCoupling, + FineStructure, ElectronUnit, ProtonUnit, ProtonElectron}]; +Map[(#[u_UnitSystem, c_Coupling] := #[u]) &, {Boltzmann, + PlanckReduced, LightSpeed, Permeability, ElectronMass, MolarMass}]; +Map[(#[u_UnitSystem, s_UnitSystem] := Unit[#[s]/#[u]]) &, ConstantsList]; +Map[(If[! MemberQ[ProtectedList, #], + #[v_?NumberQ, u_UnitSystem] := #[v, u, Metric]; + #[v_?NumberQ, u_UnitSystem, s_UnitSystem] := + Module[{n = #[u, s]}, If[OneQ[v], v, v/u]]; + #[v_?NumberQ, + u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], + s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := v; + #[u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], + s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := 1; + If[!MemberQ[Join[ProtectedList, ConstantsList, {Permittivity, Charge, MagneticFlux, + Impedance, Conductance}], #], #[u_UnitSystem] := #[u, Metric], Nothing];, + UnitSystem /: #[v_?NumberQ, u_UnitSystem] := #[v, u, Metric]; + UnitSystem /: #[v_?NumberQ, u_UnitSystem, s_UnitSystem] := + Module[{n = #[u, s]}, If[OneQ[v], v, v/u]]; + UnitSystem /: #[v_?NumberQ, + u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], + s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := v; + UnitSystem /: #[ + u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], + s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := 1; + UnitSystem /: #[u_UnitSystem] := #[u, Metric];] + ) &, ConvertList]; + +g0 = 9.80665; +ft = 0.3048; +ftUS = 1200/3937; +lbm = g0/ft; +lbmUS = g0/ftUS; +slug = 0.45359237 lbm; +slugUS = 0.45359237 lbmUS; +rankine = 5/9; +kelvin = 9/5; +atm = 101325; + +kcalth = 4184; +kcal4 = 4204; +kcal10 = 4185.5; +kcal20 = 4182; +kcalm = 4190; +kcalit = 4186.8; +calth = kcalth/1000; +cal4 = kcal4/1000; +cal10 = kcal10/1000; +cal20 = kcal20/1000; +calm = kcalm/1000; +calit = kcalit/1000; +kcal = kcalth; +cal = kcal/1000; +(*calth = thermal calorie*) + +\[CapitalDelta]\[Nu]Cs = 9192631770.0; +Kcd = 683 555.016/555; +mP = 2.176434 10^-8; +NA = 6.02214076 10^23; +kB = 1.380649 10^-23; +h = 6.62607015 10^-34; +c = 299792458.; +e = 1.602176634 10^-19; +\[Mu]eu = 1/1822.888486209; +\[Mu]pu = 1.007276466621; +\[Alpha]inv = 137.035999084; +R\[Infinity] = 10973731.5681601; +me = ElectronMass[h]; +\[Mu]0 = 2 h/c/\[Alpha]inv/e^2 ;(*\[TildeTilde]4\[Pi]*(1e-7+5.5e-17),exact charge*) +ħ = h/2 \[Pi]; +\[Delta]\[Mu]0 = \[Mu]0 - 4 \[Pi] 10^-7; +\[Mu]pe = \[Mu]pu/\[Mu]eu; +Ru = NA kB; +\[Alpha]L = 0.01/c; +\[Alpha]G = (me/mP)^2; +RK1990 = 25812.807; +RK2014 = 25812.8074555; +KJ1990 = 4.835979 10^14; +KJ2014 = 4.835978525 10^14; +ħ1990 = 2/RK1990/KJ1990^2/\[Pi]; +ħ2014 = 2/RK2014/KJ2014^2/\[Pi]; +me1990 = ElectronMass[2 \[Pi] ħ1990]; +me2014 = ElectronMass[2 \[Pi] ħ2014]; + +StandardModel = Coupling[\[Alpha]G, 1/\[Alpha]inv, \[Mu]eu, \[Mu]pu]; +Gauss = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, 1, 1000 me, 4 \[Pi], 0.01/c]; +LorentzHeaviside = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, 1, 1000 me, 1, 0.01/c]; +Thomson = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, 1, 1000 me, 4 \[Pi], 1/2]; +Kennelly = UnitSystem[Ru me/\[Mu]eu/0.001, ħ, c, 10^-7, me, 4 \[Pi]]; +ESU = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, (100 c)^-2, 1000 me, 4 \[Pi]]; +ESU2019 = UnitSystem[10^7 kB, 10^7 ħ, 100 c, 10^3 \[Mu]0/c^2, 1000 me]; +EMU = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, 1, 1000 me, 4 \[Pi]]; +EMU2019 = UnitSystem[10^7 kB, 10^7 ħ, 100 c, 10^7 \[Mu]0, 1000 me]; +MTS = UnitSystem[10^6 Ru me/\[Mu]eu, 1000 ħ, c, 4 \[Pi]/10^4, me/1000]; +Mixed = UnitSystem[Ru me/\[Mu]eu/0.001, ħ, c, \[Mu]0, me]; +Metric = UnitSystem[Ru me/\[Mu]eu/0.001, ħ, c, 4 \[Pi] 10^-7, me]; +SI1976 = UnitSystem[8.31432 me/\[Mu]eu/0.001, ħ, c, 4 \[Pi] 10^-7, me]; +SI2019 = UnitSystem[kB, ħ, c, \[Mu]0, me]; +CODATA = UnitSystem[Ru me2014/\[Mu]eu/0.001, ħ2014, c, 2 RK2014/c/\[Alpha]inv, me2014]; +Conventional = + UnitSystem[Ru me1990/\[Mu]eu/0.001, ħ1990, c, 2 RK1990/c/\[Alpha]inv, me1990]; +English = + UnitSystem[kB rankine/slug/ft^2, ħ/slug/ft^2, c/ft, 4 \[Pi], me/slug]; +EnglishUS = + UnitSystem[(1000 Ru me/\[Mu]eu ) (rankine/slug/ftUS^2), + ħ/slug/ftUS^2, c/ftUS, 4 \[Pi], me/slug]; + +GMsun = 1.32712442099 10^20; +GMearth = 398600441.8 10^6; +GMjupiter = 1.26686534 10^17; +au = 149597870.7 10^3; +LD = 384402 10^3; +day = 60^2 24; +pc = au 648000/\[Pi]; +ly = 365.25 c day; +GG = c ħ/mP^2; +ms = GMsun/GG; +Js = ms au^2/day^2; +IAU = UnitSystem[Ru me/\[Mu]eu/0.001/Js, ħ/day/Js, day c/au, + 4 \[Pi] 10^-7 day^2/Js, me/ms]; + +mf = Mass[90/lbm, Metric, English]; +Jf = mf (201.168/14 day)^2; +FFF = UnitSystem[1000 Ru me/\[Mu]eu rankine/Jf, ħ/14 day/Jf, 14 day c/201.168, 0, me/mf]; +SI = SI2019; +MKS = Metric; +{CGS, CGS2019, CGSm, CGSe, HLU} = {Gauss, EMU2019, EMU, ESU, LorentzHeaviside}; + +mf = Mass[90/lbm, Metric, English]; +Jf = mf (201.168/14 day)^2; +FFF = UnitSystem[1000 Ru me/\[Mu]eu rankine/Jf, ħ/14 day/Jf, 14 day c/201.168, 0, me/mf]; +SI = SI2019; +MKS = Metric; +{CGS, CGS2019, CGSm, CGSe, HLU} = {Gauss, EMU2019, EMU, ESU, LorentzHeaviside}; + +(*Planck=UnitSystem[1,1,1,1,Sqrt[4\[Pi] \[Alpha]G]];*) + +PlanckGauss = UnitSystem[1, 1, 1, 4 \[Pi], Sqrt[\[Alpha]G]]; +Stoney = UnitSystem[1, \[Alpha]inv, 1, 4 \[Pi], Sqrt[\[Alpha]G \[Alpha]inv]]; +(*Hartree=UnitSystem[1,1,\[Alpha]inv,4\[Pi]/\[Alpha]inv^2,1]; +Rydberg=UnitSystem[1,1,2\[Alpha]inv,\[Pi]/\[Alpha]inv^2,1/2];*) + +Schrodinger = + UnitSystem[1, 1, \[Alpha]inv, 4 \[Pi]/\[Alpha]inv^2, + Sqrt[\[Alpha]G \[Alpha]inv]]; +Electronic = UnitSystem[1, \[Alpha]inv, 1, 4 \[Pi], 1]; +Natural = UnitSystem[1, 1, 1, 1, 1]; +NaturalGauss = UnitSystem[1, 1, 1, 4 \[Pi], 1]; +QCD = UnitSystem[1, 1, 1, 1, 1/\[Mu]pe]; +QCDGauss = UnitSystem[1, 1, 1, 4 \[Pi], 1/\[Mu]pe]; +QCDoriginal = UnitSystem[1, 1, 1, 4 \[Pi]/\[Alpha]inv, 1/\[Mu]pe]; + +ElectronMass[Planck, c_Coupling] := Sqrt[4 \[Pi] GravityCoupling[c]]; +ElectronMass[PlanckGauss, c_Coupling] := Sqrt[GravityCoupling[c]]; +ElectronMass[UnitSystem[_, _, _, _, Sqrt[\[Alpha]G \[Alpha]inv], ___], + c_Coupling] := Sqrt[GravityCoupling[c]/FineStructure[c];] +ElectronMass[UnitSystem[_, _, _, _, 1/\[Mu]pe, ___], c_Coupling] := 1/ProtonElectron[c]; +Permeability[UnitSystem[_, _, _, 4 \[Pi]/\[Alpha]inv^2, ___], + c_Coupling] := 4 \[Pi] FineStructure[c]^2; +Permeability[UnitSystem[_, _, _, \[Pi]/\[Alpha]inv^2, ___], + c_Coupling] := \[Pi] FineStructure[c]^2; +LightSpeed[UnitSystem[_, _, \[Alpha]inv, ___], c_Coupling] := 1/FineStructure[c]; +LightSpeed[UnitSystem[_, _, 2 \[Alpha]inv, ___], c_Coupling] := 2/FineStructure[c]; +PlanckReduced[UnitSystem[_, \[Alpha]inv, ___], c_Coupling] := 1/FineStructure[c]; + +ElectronMass[u : UnitSystem[_, _, c, _, me, ___], c_Coupling] := + ElectronMass[Planck[u], c]; +ElectronMass[UnitSystem[_, _, 100 c, _, 1000 me, ___], c_Coupling] := + 1000 ElectronMass[SI, c]; +ElectronMass[UnitSystem[_, _, c, _, me/1000, ___], c_Coupling] := ElectronMass[SI, c]/1000; +ElectronMass[u : UnitSystem[_, _, c, _, me2014, ___], c_Coupling] := + ElectronMass[Planck[u], c]; +ElectronMass[u : UnitSystem[_, _, c, \[Mu]0, me1990, ___], + c_Coupling] := ElectronMass[Planck[u], c]; +ElectronMass[UnitSystem[_, _, c/ftUS, _, me/slug, ___], c_Coupling] := + ElectronMass[SI, c]/slug; +Permeability[UnitSystem[_, _, _, \[Mu]0, ___], c_Coupling] := FineStructure[c] 2 h/c/e^2; +Permeability[ESU2019, u_Coupling] := 10^3 Permeability[SI, u]/c^2; +Permeability[EMU2019, c_Coupling] := 10^7 Permeability[SI, c]; +Permeability[CODATA, u_Coupling] := 2 RK2014 FineStructure[u]/c; +Permeability[Conventional, u_Coupling] := 2 RK1990 FineStructure[u]/c; + +MolarMass[UnitSystem[1, ___]] = 1; +MolarMass[u : UnitSystem[kB, ___]] := MolarMass[u, Universe[u]]; +MolarMass[u : UnitSystem[kB, ___], c_Coupling] := NA ElectronMass[u, c]/ElectronUnit[c]; +MolarMass[u : UnitSystem[10^7 kB, ___]] := MolarMass[u, Universe[u]]; +MolarMass[UnitSystem[10^7 kB, ___], c_Coupling] := 1000 MolarMass[SI2019, c]; +MolarMass[u : UnitSystem[10^3 kB, ___]] := MolarMass[u, Universe[u]]; +MolarMass[UnitSystem[10^3 kB, ___], c_Coupling] := MolarMass[SI2019, c]/1000; +MolarMass[UnitSystem[kB_, ___]] := MolarMass[CGS]/1000; +MolarMass[UnitSystem[Boltzmann[MTS], ___]] := MolarMass[CGS]/10^6; +MolarMass[UnitSystem[Boltzmann[CGS], ___]] := MolarMass[Natural]; +MolarMass[UnitSystem[Boltzmann[FFF], ___]] := MolarMass[Natural]; +MolarMass[u : UnitSystem[Boltzmann[English], ___]] := MolarMass[u, Universe[u]]; +MolarMass[u : UnitSystem[Boltzmann[English], ___], c_Coupling] := + 1000 MolarMass[SI2019, c]; +MolarMass[UnitSystem[Boltzmann[EnglishUS], ___]] := MolarMass[Natural]; +MolarMass[UnitSystem[Boltzmann[IAU], ___]] := 1/1000 ms; + +LuminousEfficacy[UnitSystem[1, ___]] = 1; +LuminousEfficacy[u : UnitSystem] := Power[Kcd, SI2019, u]; + +Kilograms[m_] := Kilograms[m, English]; +Kilograms[m_, u_UnitSystem] := Mass[m, Metric, u]; +Slugs[m_] := Slugs[m, Metric]; +Slugs[m_, u_UnitSystems] := Mass[m, English, u]; +Feet[d_] := Feet[d, Metric]; +Feet[d_, u_UnitSystem] := Length[d, English, u]; +Meters[d_] := Meters[d, English]; +Meters[d_, u_UnitSystem] := Length[d, Metric, u]; + +(* IAU to SI *) +UnitSystem /: + Length[u : UnitSystem[_, _, c, ___], + s : UnitSystem[_, _, day c/au, ___]] := Length[u, s, 1/au]; +Time[u : UnitSystem[_, _, c, ___], + s : UnitSystem[_, _, day c/au, ___]] := Time[u, s, 1/day]; +(* SI to IAU *) +UnitSystem /: + Length[u : UnitSystem[_, _, day c/au, ___], + s : UnitSystem[_, _, c, ___]] := Length[u, s, au]; +Time[u : UnitSystem[_, _, day c/au, ___], + s : UnitSystem[_, _, c, ___]] := Time[u, s, day]; +(* IAU to CGS *) +UnitSystem /: + Length[u : UnitSystem[_, _, 100 c, ___], + s : UnitSystem[_, _, day c/au, ___]] := Length[u, s, 1/au]; +Time[u : UnitSystem[_, _, 100 c, ___], + s : UnitSystem[_, _, day c/au, ___]] := Time[u, s, 1/day]; +(* CGS to IAU *) +UnitSystem /: + Length[u : UnitSystem[_, _, day c/au, ___], + s : UnitSystem[_, _, 100 c, ___]] := Length[u, s, au]; +Time[u : UnitSystem[_, _, day c/au, ___], + s : UnitSystem[_, _, 100 c, ___]] := Time[u, s, day]; +(* IAU to English *) +UnitSystem /: + Length[u : UnitSystem[_, _, c/ft, ___], + s : UnitSystem[_, _, day c/au, ___]] := Length[u, s, ft/au]; +Time[u : UnitSystem[_, _, c/ft, ___], + s : UnitSystem[_, _, day c/au, ___]] := Time[u, s, 1/day]; +(* English to IAU *) +UnitSystem /: + Length[u : UnitSystem[_, _, day c/au, ___], + s : UnitSystem[_, _, c/ft, ___]] := Length[u, s, au/ft]; +Time[u : UnitSystem[_, _, day c/au, ___], + s : UnitSystem[_, _, c/ft, ___]] := Time[u, s, day]; + +UnitSystem /: Length[u_UnitSystem, s_UnitSystem] := Length[u, s, 1]; +UnitSystem /: Length[u_UnitSystem, s_UnitSystem, l_] := + Unit[(PlanckReduced[s] ElectronMass[u] LightSpeed[ + u])/(PlanckReduced[u] ElectronMass[s] LightSpeed[s]), l]; +UnitSystem /: Area[u_UnitSystem, s_UnitSystem] := Unit[Length[u, s]^2]; +UnitSystem /: Volume[u_UnitSystem, s_UnitSystem] := Unit[Length[u, s]^3]; + +WaveNumber[u_UnitSystem, s_UnitSystem] := Unit[Length[s, u]]; +FuelEfficiency[u_UnitSystem, s_UnitSystem] := Area[s, u]; +Time[u_UnitSystem, s_UnitSystem] := Time[u, s, 1]; +Time[u_UnitSystem, s_UnitSystem, t_] := Unit[Length[u, s]/LightSpeed[u, s], 1]; +Frequency[u_UnitSystem, s_UnitSystem] := Time[s, u]; +FrequencyDrift[u_UnitSystem, s_UnitSystem] := Unit[Time[s, u]^2]; +Speed[u_UnitSystem, s_UnitSystem] := LightSpeed[u, s]; +Acceleration[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]]; +Jerk[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]^2]; +Snap[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]^3]; +VolumeFlow[u_UnitSystem, s_UnitSystem] := Unit[Area[u, s], Speed[u, s]]; +SpecificEnergy[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]^2]; + +Energy[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] SpecificEnergy[u, s]]; +UnitSystem /: Power[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Time[u, s]]; +Force[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Acceleration[u, s]]; +Pressure[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]/Time[u, s]^2]; + +Momentum[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Speed[u, s]]; +AngularMomentum[u_UnitSystem, s_UnitSystem] := Unit[Momentum[u, s] Length[u, s]]; +Yank[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Jerk[u, s]]; +AreaDensity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Area[u, s]]; +Density[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Volume[u, s]]; +SpecificVolume[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mass[u, s]]; +Action[u_UnitSystem, s_UnitSystem] := Unit[Momentum[u, s] Length[u, s]]; +Stiffness[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Area[u, s]]; +Intensity[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Area[u, s]]; +Diffusivity[u_UnitSystem, s_UnitSystem] := + Unit[(PlanckReduced[s] ElectronMass[u])/(PlanckReduced[u] ElectronMass[s])]; +Viscosity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]/Time[u, s]]; +LinearDensity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]]; +MassFlow[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Time[u, s]]; +SpectralFlux[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Length[u, s]]; +PowerDensity[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Volume[u, s]]; +Compressibility[u_UnitSystem, s_UnitSystem] := Pressure[s, u]; +Fluence[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Area[u, s]]; +RotationalInertia[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Area[u, s]]; + +SoundExposure[u_UnitSystem, s_UnitSystem] := Unit[Time[u, s] Pressure[u, s]^2]; +SpecificImpedance[u_UnitSystem, s_UnitSystem] := Unit[Pressure[u, s]/Speed[u, s]]; +Impedance[u_UnitSystem, s_UnitSystem] := Unit[SpecificImpedance[u, s]/Area[u, s]]; +Admittance[u_UnitSystem, s_UnitSystem] := Unit[Area[u, s]/SpecificImpedance[u, s]]; +Compliance[u_UnitSystem, s_UnitSystem] := Unit[Time[u, s]^2/Mass[u, s]]; +Inertance[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]^4]; + +(* Electromagnetic *) + +Voltage = ElectricPotential + +Charge[u_UnitSystem, s_UnitSystem] := + Unit[Sqrt[(PlanckReduced[s] Permeability[u] LightSpeed[ + u] Rationalization[u] Lorentz[u]^2)/(PlanckReduced[ + u] Permeability[s] LightSpeed[s] Rationalization[s] Lorentz[s]^2)]]; +Current[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Time[u, s]]; +ElectricPotential[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Charge[u, s]]; +Capacitance[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/ElectricPotential[u, s]]; +Resistance[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s]/Current[u, s]]; +Conductance[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s]/ElectricPotential[u, s]]; +MagneticFlux[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Lorentz[u, s]/Current[u, s]]; +MagneticFluxDensity[u_UnitSystem, s_UnitSystem] := + Unit[Mass[u, s]/Lorentz[u, s]/Current[u, s]/Time[u, s]^2]; +Inductance[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Area[u, s]/Charge[u, s]^2]; + +ElectricFluxDensity[u_UnitSystem, s_UnitSystem] := + Unit[Charge[u, s] Rationalization[u, s]/Area[u, s]]; +ChargeDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Volume[u, s]]; +CurrentDensity[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s]/Area[u, s]]; +Conductivity[u_UnitSystem, s_UnitSystem] := Unit[Conductance[u, s]/Length[u, s]]; +Permittivity[u_UnitSystem, s_UnitSystem] := + Unit[Capacitance[u, s] Rationalization[u, s]/Length[u, s]]; +ElectricField[u_UnitSystem, s_UnitSystem] := + Unit[ElectricPotential[u, s]/Length[u, s]]; +MagneticField[u_UnitSystem, s_UnitSystem] := + Unit[Current[u, s] Rationalization[u, s] Lorentz[u, s]/Length[u, s]]; +Exposure[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Mass[u, s]]; +Resistivity[u_UnitSystem, s_UnitSystem] := Unit[Resistance[u, s] Length[u, s]]; +LinearChargeDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Length[u, s]]; +MagneticDipoleMoment[u_UnitSystem, s_UnitSystem] := + Unit[Current[u, s] Lorentz[u, s] Area[u, s]]; +Mobility[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] Time[u, s]/Mass[u, s]]; +Reluctance[u_UnitSystem, s_UnitSystem] := + Unit[Rationalization[u, s] Lorentz[u, s]^2/Inductance[u, s]]; +VectorPotential[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s]/Length[u, s]]; +MagneticMoment[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s] Length[u, s]]; +Rigidity[u_UnitSystem, s_UnitSystem] := Unit[MagneticFluxDensity[u, s] Length[u, s]]; +Susceptibility[u_UnitSystem, s_UnitSystem] := Unit[Rationalization[s, u]]; + +(* WARNING unchecked: rigitidy, magneticmoment, vectorpotential, \ +mobility, linearchargedensity, exposure *) + +ElectricFlux[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s] Length[u, s]]; +ElectricDipoleMoment[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] Length[u, s]]; +MagneticPotential[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s] Reluctance[u, s]]; +PoleStrength[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/Length[u, s]]; +Permeance[u_UnitSystem, s_UnitSystem] := Reluctance[s, u]; +SpecificSusceptibility[u_UnitSystem, s_UnitSystem] := + Unit[MagneticDipoleMoment[u, s]/MagneticField[u, s]/Mass[u, s]]; +Magnetizability[u_UnitSystem, s_UnitSystem] := + Unit[MagneticMoment[u, s]/MagneticFluxDensity[u, s]]; +ElectricPolarizability[u_UnitSystem, s_UnitSystem] := + Unit[ElectricDipoleMoment[u, s]/ElectricField[u, s]]; +MagneticPolarizability[u_UnitSystem, s_UnitSystem] := + Unit[MagneticDipoleMoment[u, s]/MagneticField[u, s]]; +Magnetization[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[u, s]/Volume[u, s]]; + +SpecificMagnetization[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[s, u]/Mass[s, u]]; +DemagnetizingFactor[u_UnitSystem, s_UnitSystem] := Unit[Rationalization[u, s]]; + +(* Thermodynamic *) + +Moles[n_] := Moles[n, Metric]; +Moles[n_, u_UnitSystem] := n/Avogadro[u]; +Molecules[n_] := Molecules[n, Metric]; +Molecules[n_, u_UnitSystem] := n Avogadro[u]; + +Temperature[u_UnitSystem, s_UnitSystem] := + Unit[(Boltzmann[u] ElectronMass[s] LightSpeed[s]^2)/(Boltzmann[ + s] ElectronMass[u] LightSpeed[u]^2)]; +UnitSystem /: Entropy[u_UnitSystem, s_UnitSystem] := + Unit[Energy[u, s]/Temperature[u, s]]; +SpecificEntropy[u_UnitSystem, s_UnitSystem] := + Unit[SpecificEnergy[u, s]/Temperature[u, s]]; +VolumeHeatCapacity[u_UnitSystem, s_UnitSystem] := Unit[Entropy[u, s]/Volume[u, s]]; +ThermalConductivity[u_UnitSystem, s_UnitSystem] := + Unit[Force[u, s]/Time[u, s]/Temperature[u, s]]; +ThermalConductance[u_UnitSystem, s_UnitSystem] := + Unit[ThermalConductivity[u, s] Length[u, s]]; +ThermalResistance[u_UnitSystem, s_UnitSystem] := ThermalConductance[s, u]; +ThermalExpansion[u_UnitSystem, s_UnitSystem] := Temperature[s, u]; +LapseRate[u_UnitSystem, s_UnitSystem] := Unit[Temperature[u, s]/Length[u, s]]; + +Molality[u_UnitSystem, s_UnitSystem] := MolarMass[s, u]; +Mole[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Molality[u, s]]; +Molarity[u_UnitSystem, s_UnitSystem] := + Unit[Mole[u, s]/Volume[u, s]]; +MolarVolume[u_UnitSystem, s_UnitSystem] := + Unit[Volume[u, s]/Mole[u, s]]; +MolarEntropy[u_UnitSystem, s_UnitSystem] := + Unit[Entropy[u, s]/Mole[u, s]]; +MolarEnergy[u_UnitSystem, s_UnitSystem] := + Unit[Energy[u, s]/Mole[u, s]]; +MolarConductivity[u_UnitSystem, s_UnitSystem] := + Unit[Conductivity[u, s] Area[u, s]/Mole[u, s]]; +MolarSusceptibility[u_UnitSystem, s_UnitSystem] := + Unit[SpecificSusceptibility[u, s] MolarMass[u, s]]; +Catalysis[u_UnitSystem, s_UnitSystem] := Unit[Mole[u, s]/Time[u, s]]; +Specificity[u_UnitSystem, s_UnitSystem] := + Unit[Volume[u, s]/Mole[u, s]/Time[u, s]]; + +LuminousFlux[u_UnitSystem, s_UnitSystem] := + Unit[Frequency[u, + s]^2 (LuminousEfficacy[s] PlanckReduced[s])/(LuminousEfficacy[ + u] PlanckReduced[u])]; +Luminance[u_UnitSystem, s_UnitSystem] := + Unit[LuminousFlux[u, s]/Area[u, s]]; +LuminousEnergy[u_UnitSystem, s_UnitSystem] := + Unit[Frequency[u, + s] (LuminousEfficacy[s] PlanckReduced[s])/(LuminousEfficacy[ + u] PlanckReduced[u])]; +LuminousExposure[u_UnitSystem, s_UnitSystem] := + Unit[Luminance[u, s] Time[u, s]]; + +(* Physics *) + +Hyperfine[u_UnitSystem] := Frequency[\[CapitalDelta]\[Nu]Cs, u]; + +Map[(#[u_UnitSystem] := #[u, Universe[u]]) &, {Avogadro, AtomicMass, + ProtonMass, Einstein, Universal, Stefan, RadiationDensity, + Permittivity, Coulomb, BiotSavart, Impedance, Faraday, Josephson, + MagneticFlux, Klitzing, Conductance, Hartree, Rydberg, Bohr, + BohrReduced, ElectronRadius, Magneton}]; +Avogadro[u_UnitSystem, c_Coupling] := + MolarMass[u, c] ElectronUnit[c]/ElectronMass[u, c]; +AtomicMass[u_UnitSystem, c_Coupling] := ElectronMass[u, c]/ElectronUnit[c]; +ProtonMass[u_UnitSystem, c_Coupling] := ProtonElectron[c] ElectronMass[u, c]; +Einstein[u_UnitSystem, c_Coupling] := (8 \[Pi] Newton[u, c])/LightSpeed[u, c]^4; +Universal[u_UnitSystem, c_Coupling] := Boltzmann[u, c] Avogadro[u, c]; +Stefan[u_UnitSystem, c_Coupling] := (2 \[Pi]^5 Boltzmann[u, c]^4)/( + 15 Planck[u, c]^3 LightSpeed[u, c]^2); +RadiationDensity[u_UnitSystem, c_Coupling] := (4 Stefan[u, c])/LightSpeed[u, c]; +Permittivity[u_UnitSystem, c_Coupling] := + (1/Permeability[u, c]) (LightSpeed[u, c] Lorentz[u]^2); +Coulomb[u_UnitSystem, c_Coupling] := + Rationalization[u]/4 \[Pi]/ Permittivity[u]; +BiotSavart[u_UnitSystem, c_Coupling] := + Permeability[u, c] Lorentz[u] (Rationalization[u]/4 \[Pi]); +Ampere[u_UnitSystem] := Lorentz[u] BiotSavart[u]; +Impedance[u_UnitSystem, c_Coupling] := + +Permeability[u, c] LightSpeed[u, c] Rationalization[u] Lorentz[u]^2; +Faraday[u_UnitSystem, c_Coupling] := Charge[u, c] Avogadro[u, c]; +Josephson[u_UnitSystem, c_Coupling] := 2 Charge[u, c] Lorentz[u]/Planck[u, c]; +MagneticFlux[u_UnitSystem, c_Coupling] := 1/Josephson[u, c]; +Klitzing[u_UnitSystem, c_Coupling] := Planck[u, c]/Charge[u, c]^2; +Conductance[u_UnitSystem, c_Coupling] := (2 Charge[u, c]^2)/Planck[u, c]; +Hartree[u_UnitSystem, c_Coupling] := + ElectronMass[u, c] (LightSpeed[u, c] FineStructure[c])^2; +Rydberg[u_UnitSystem, c_Coupling] := Hartree[u, c]/(2 Planck[u, c])/LightSpeed[u, c]; +Bohr[u_UnitSystem, c_Coupling] := + PlanckReduced[u, c]/ElectronMass[u, c]/LightSpeed[u, c]/FineStructure[c]; +BohrReduced[u_UnitSystem, c_Coupling] := Bohr[u, c] (1 + 1/ProtonElectron[c]); +ElectronRadius[u_UnitSystem, c_Coupling] := + FineStructure[c] PlanckReduced[u, c]/ElectronMass[u, c]/LightSpeed[u, c]; +Magneton[u_UnitSystem, c_Coupling] := + Charge[u, c] PlanckReduced[u, c] Lorentz[u]/2 ElectronMass[u, c]; + +(* more *) + +\[Kappa] = Einstein[SI2019]; +\[Sigma] = Stefan[SI2019];(**) +\[Mu]B = Magneton[SI2019];(**) +\[CurlyEpsilon]0 = Permittivity[SI2019];(**) + +ke = Coulomb[SI2019];(**) +mp = ProtonMass[SI2019]; +mu = AtomicMass[SI2019]; +Mu = MolarMass[SI2019]; +\|01d509 = Faraday[SI2019];(**) +\[CapitalPhi]0 = MagneticFlux[SI2019];(**) +Z0 = Impedance[SI2019];(**) + +G0 = Conductance[SI2019];(**) +Eh = Hartree[SI2019]; +a0 = Bohr[SI2019]; +re = ElectronRadius[SI2019]; +RK = Klitzing[SI2019];(**) +KJ = Josephson[SI2019];(**) +{RH, Ry} = {R\[Infinity] mp/(me + mp), h c R\[Infinity]}; + +\[ScriptL]P = Length[PlanckGauss, SI2019]; +tP = Time[PlanckGauss, SI2019]; +TP = Temperature[PlanckGauss, SI2019]; + +lS = Length[Stoney, SI2019]; +tS = Time[Stoney, SI2019]; +mS = Mass[Stoney, SI2019]; +qS = Charge[Stoney, SI2019]; + +(*lA=Length[Hartree,SI2019]; +tA=Time[Hartree,SI2019]; +mA=Mass[Hartree,SI2019]; +qA=Charge[Hartree,SI2019];*) + +lQCD = Length[QCD, SI2019]; +tQCD = Time[QCD, SI2019]; +mQCD = Mass[QCD, SI2019]; From 54b5c69eca0d3615ab66cb850970b0b1691d515a Mon Sep 17 00:00:00 2001 From: Michael Reed <18372368+chakravala@users.noreply.github.com> Date: Wed, 3 Nov 2021 16:06:42 -0400 Subject: [PATCH 03/11] created PacletInfo.wl for UnitSystems --- UnitSystems.wl => Kernel/UnitSystems.wl | 0 PacletInfo.wl | 7 +++++++ 2 files changed, 7 insertions(+) rename UnitSystems.wl => Kernel/UnitSystems.wl (100%) create mode 100644 PacletInfo.wl diff --git a/UnitSystems.wl b/Kernel/UnitSystems.wl similarity index 100% rename from UnitSystems.wl rename to Kernel/UnitSystems.wl diff --git a/PacletInfo.wl b/PacletInfo.wl new file mode 100644 index 0000000..b9b4ad8 --- /dev/null +++ b/PacletInfo.wl @@ -0,0 +1,7 @@ +PacletObject[<| + "Name" -> "UnitSystems", + "Version" -> "0.1.0", + "Extensions" -> { + {"Kernel", "Root" -> "Kernel", "Context" -> "UnitSystems`"} + } +|>] From 3dd8732d18dd29990e232bde5d4603b4dcf8b85f Mon Sep 17 00:00:00 2001 From: Michael Reed <18372368+chakravala@users.noreply.github.com> Date: Fri, 21 Jan 2022 16:42:56 -0500 Subject: [PATCH 04/11] created Abstract unit system symbols --- Kernel/UnitSystems.wl | 88 +++++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 32 deletions(-) diff --git a/Kernel/UnitSystems.wl b/Kernel/UnitSystems.wl index ca985e4..e7ca51a 100644 --- a/Kernel/UnitSystems.wl +++ b/Kernel/UnitSystems.wl @@ -56,10 +56,10 @@ ElectronUnit[Coupling[_, _, \[Mu]eu_, ___]] := measure[\[Mu]eu]; ProtonUnit[Coupling[_, _, _, \[Mu]pu_, ___]] := measure[\[Mu]pu]; ProtonElectron[c_Coupling] := ProtonUnit[c]/ElectronUnit[c]; -UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, \[Lambda]_] := - UnitSystem[kB, \[HBar], c, \[Mu]0, me, \[Lambda], 1]; +(*UnitSystem[kB_, hbar_, c_, mu0_, me_, lambda_] := + UnitSystem[kB, hbar, c, mu0, me, lambda, 1]; UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_] := - UnitSystem[kB, \[HBar], c, \[Mu]0, me, 1]; + UnitSystem[kB, \[HBar], c, \[Mu]0, me, 1];*) Boltzmann[UnitSystem[kB_, ___]] := kB; PlanckReduced[UnitSystem[_, \[HBar]_, ___]] := \[HBar]; LightSpeed[UnitSystem[_, _, c_, ___]] := c; @@ -73,7 +73,7 @@ RationalizedQ[u_UnitSystem] := Rationalization[u] != 4 \[Pi] Universe[_] := StandardModel; Unit[x_, y_ : 1] := x; Mass[u_UnitSystem, s_UnitSystem] := ElectronMass[u, s]; -ElectronMass[h_?NumberQ] := R\[Infinity] 2 h \[Alpha]inv/c; +ElectronMass[h_?NumberQ] := R\[Infinity] 2 h \[Alpha]inv^2/c; ElectronMass[h_?NumberQ, u_Coupling] := (R\[Infinity] 2 h)/(FineStructure[u]^2 c); PlanckMass[u_UnitSystem, c_Coupling] := ElectronMass[u, c]/Sqrt[GravityCoupling[c]]; Planck[u_UnitSystem, c_Coupling] := 2 \[Pi] PlanckReduced[u]; @@ -152,7 +152,7 @@ e = 1.602176634 10^-19; R\[Infinity] = 10973731.5681601; me = ElectronMass[h]; \[Mu]0 = 2 h/c/\[Alpha]inv/e^2 ;(*\[TildeTilde]4\[Pi]*(1e-7+5.5e-17),exact charge*) -ħ = h/2 \[Pi]; +ħ = h/(2 Pi); \[Delta]\[Mu]0 = \[Mu]0 - 4 \[Pi] 10^-7; \[Mu]pe = \[Mu]pu/\[Mu]eu; Ru = NA kB; @@ -167,28 +167,35 @@ KJ2014 = 4.835978525 10^14; me1990 = ElectronMass[2 \[Pi] ħ1990]; me2014 = ElectronMass[2 \[Pi] ħ2014]; +AbstractUniverse = Coupling["\[Alpha]G", "\[Alpha]", "\[Mu]eu", "\[Mu]pu"] +AbstractUnits = UnitSystem["kB", "\[HBar]", "c", "\[Mu]0", "me", "\[Lambda]", "\[Alpha]L"] +AbstractUnits1 = UnitSystem["kB1", "\[HBar]1", "c1", "\[Mu]01", "me1", "\[Lambda]1", "\[Alpha]L1"] +AbstractUnits2 = UnitSystem["kB2", "\[HBar]2", "c2", "\[Mu]02", "me2", "\[Lambda]2", "\[Alpha]L2"] +AbstractMetric = UnitSystem[1000 "Ru" ("R\[Infinity]" 2 "h")/("\[Alpha]"^2 "c")/"\[Mu]eu", "h"/(2 Pi), "c", 4 \[Pi] 10^-7, ("R\[Infinity]" 2 "h")/("\[Alpha]"^2 "c"), 1, 1] +AbstractSI2019 = UnitSystem["kB", "h"/(2 Pi), "c", 2 "h" "\[Alpha]"/"c"/"e"^2, ("R\[Infinity]" 2 "h")/("\[Alpha]"^2 "c"), 1, 1] + StandardModel = Coupling[\[Alpha]G, 1/\[Alpha]inv, \[Mu]eu, \[Mu]pu]; Gauss = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, 1, 1000 me, 4 \[Pi], 0.01/c]; LorentzHeaviside = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, 1, 1000 me, 1, 0.01/c]; Thomson = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, 1, 1000 me, 4 \[Pi], 1/2]; -Kennelly = UnitSystem[Ru me/\[Mu]eu/0.001, ħ, c, 10^-7, me, 4 \[Pi]]; -ESU = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, (100 c)^-2, 1000 me, 4 \[Pi]]; -ESU2019 = UnitSystem[10^7 kB, 10^7 ħ, 100 c, 10^3 \[Mu]0/c^2, 1000 me]; -EMU = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, 1, 1000 me, 4 \[Pi]]; -EMU2019 = UnitSystem[10^7 kB, 10^7 ħ, 100 c, 10^7 \[Mu]0, 1000 me]; -MTS = UnitSystem[10^6 Ru me/\[Mu]eu, 1000 ħ, c, 4 \[Pi]/10^4, me/1000]; -Mixed = UnitSystem[Ru me/\[Mu]eu/0.001, ħ, c, \[Mu]0, me]; -Metric = UnitSystem[Ru me/\[Mu]eu/0.001, ħ, c, 4 \[Pi] 10^-7, me]; -SI1976 = UnitSystem[8.31432 me/\[Mu]eu/0.001, ħ, c, 4 \[Pi] 10^-7, me]; -SI2019 = UnitSystem[kB, ħ, c, \[Mu]0, me]; -CODATA = UnitSystem[Ru me2014/\[Mu]eu/0.001, ħ2014, c, 2 RK2014/c/\[Alpha]inv, me2014]; +Kennelly = UnitSystem[Ru me/\[Mu]eu/0.001, ħ, c, 10^-7, me, 4 \[Pi], 1]; +ESU = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, (100 c)^-2, 1000 me, 4 \[Pi], 1]; +ESU2019 = UnitSystem[10^7 kB, 10^7 ħ, 100 c, 10^3 \[Mu]0/c^2, 1000 me, 1, 1]; +EMU = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, 1, 1000 me, 4 \[Pi], 1]; +EMU2019 = UnitSystem[10^7 kB, 10^7 ħ, 100 c, 10^7 \[Mu]0, 1000 me, 1, 1]; +MTS = UnitSystem[10^6 Ru me/\[Mu]eu, 1000 ħ, c, 4 \[Pi]/10^4, me/1000, 1, 1]; +Mixed = UnitSystem[Ru me/\[Mu]eu/0.001, ħ, c, \[Mu]0, me, 1, 1]; +Metric = UnitSystem[Ru me/\[Mu]eu/0.001, ħ, c, 4 \[Pi] 10^-7, me, 1, 1]; +SI1976 = UnitSystem[8.31432 me/\[Mu]eu/0.001, ħ, c, 4 \[Pi] 10^-7, me, 1, 1]; +SI2019 = UnitSystem[kB, ħ, c, \[Mu]0, me, 1, 1]; +CODATA = UnitSystem[Ru me2014/\[Mu]eu/0.001, ħ2014, c, 2 RK2014/c/\[Alpha]inv, me2014,1,1]; Conventional = - UnitSystem[Ru me1990/\[Mu]eu/0.001, ħ1990, c, 2 RK1990/c/\[Alpha]inv, me1990]; + UnitSystem[Ru me1990/\[Mu]eu/0.001, ħ1990, c, 2 RK1990/c/\[Alpha]inv, me1990, 1, 1]; English = - UnitSystem[kB rankine/slug/ft^2, ħ/slug/ft^2, c/ft, 4 \[Pi], me/slug]; + UnitSystem[kB rankine/slug/ft^2, ħ/slug/ft^2, c/ft, 4 \[Pi], me/slug, 1, 1]; EnglishUS = UnitSystem[(1000 Ru me/\[Mu]eu ) (rankine/slug/ftUS^2), - ħ/slug/ftUS^2, c/ftUS, 4 \[Pi], me/slug]; + ħ/slug/ftUS^2, c/ftUS, 4 \[Pi], me/slug, 1, 1]; GMsun = 1.32712442099 10^20; GMearth = 398600441.8 10^6; @@ -206,34 +213,34 @@ IAU = UnitSystem[Ru me/\[Mu]eu/0.001/Js, ħ/day/Js, day c/au, mf = Mass[90/lbm, Metric, English]; Jf = mf (201.168/14 day)^2; -FFF = UnitSystem[1000 Ru me/\[Mu]eu rankine/Jf, ħ/14 day/Jf, 14 day c/201.168, 0, me/mf]; +FFF = UnitSystem[1000 Ru me/\[Mu]eu rankine/Jf, ħ/14 day/Jf, 14 day c/201.168, 0, me/mf, 1, 1]; SI = SI2019; MKS = Metric; {CGS, CGS2019, CGSm, CGSe, HLU} = {Gauss, EMU2019, EMU, ESU, LorentzHeaviside}; mf = Mass[90/lbm, Metric, English]; Jf = mf (201.168/14 day)^2; -FFF = UnitSystem[1000 Ru me/\[Mu]eu rankine/Jf, ħ/14 day/Jf, 14 day c/201.168, 0, me/mf]; +FFF = UnitSystem[1000 Ru me/\[Mu]eu rankine/Jf, ħ/14 day/Jf, 14 day c/201.168, 0, me/mf, 1, 1]; SI = SI2019; MKS = Metric; {CGS, CGS2019, CGSm, CGSe, HLU} = {Gauss, EMU2019, EMU, ESU, LorentzHeaviside}; (*Planck=UnitSystem[1,1,1,1,Sqrt[4\[Pi] \[Alpha]G]];*) -PlanckGauss = UnitSystem[1, 1, 1, 4 \[Pi], Sqrt[\[Alpha]G]]; -Stoney = UnitSystem[1, \[Alpha]inv, 1, 4 \[Pi], Sqrt[\[Alpha]G \[Alpha]inv]]; -(*Hartree=UnitSystem[1,1,\[Alpha]inv,4\[Pi]/\[Alpha]inv^2,1]; -Rydberg=UnitSystem[1,1,2\[Alpha]inv,\[Pi]/\[Alpha]inv^2,1/2];*) +PlanckGauss = UnitSystem[1, 1, 1, 4 \[Pi], Sqrt[\[Alpha]G], 1]; +Stoney = UnitSystem[1, \[Alpha]inv, 1, 4 \[Pi], Sqrt[\[Alpha]G \[Alpha]inv], 1, 1]; +(*Hartree=UnitSystem[1,1,\[Alpha]inv,4\[Pi]/\[Alpha]inv^2,1,1,1]; +Rydberg=UnitSystem[1,1,2\[Alpha]inv,\[Pi]/\[Alpha]inv^2,1/2,1,1];*) Schrodinger = UnitSystem[1, 1, \[Alpha]inv, 4 \[Pi]/\[Alpha]inv^2, - Sqrt[\[Alpha]G \[Alpha]inv]]; -Electronic = UnitSystem[1, \[Alpha]inv, 1, 4 \[Pi], 1]; -Natural = UnitSystem[1, 1, 1, 1, 1]; -NaturalGauss = UnitSystem[1, 1, 1, 4 \[Pi], 1]; -QCD = UnitSystem[1, 1, 1, 1, 1/\[Mu]pe]; -QCDGauss = UnitSystem[1, 1, 1, 4 \[Pi], 1/\[Mu]pe]; -QCDoriginal = UnitSystem[1, 1, 1, 4 \[Pi]/\[Alpha]inv, 1/\[Mu]pe]; + Sqrt[\[Alpha]G \[Alpha]inv], 1, 1]; +Electronic = UnitSystem[1, \[Alpha]inv, 1, 4 \[Pi], 1, 1, 1]; +Natural = UnitSystem[1, 1, 1, 1, 1, 1, 1]; +NaturalGauss = UnitSystem[1, 1, 1, 4 \[Pi], 1, 1, 1]; +QCD = UnitSystem[1, 1, 1, 1, 1/\[Mu]pe, 1, 1]; +QCDGauss = UnitSystem[1, 1, 1, 4 \[Pi], 1/\[Mu]pe, 1, 1]; +QCDoriginal = UnitSystem[1, 1, 1, 4 \[Pi]/\[Alpha]inv, 1/\[Mu]pe, 1, 1]; ElectronMass[Planck, c_Coupling] := Sqrt[4 \[Pi] GravityCoupling[c]]; ElectronMass[PlanckGauss, c_Coupling] := Sqrt[GravityCoupling[c]]; @@ -285,6 +292,23 @@ MolarMass[UnitSystem[Boltzmann[IAU], ___]] := 1/1000 ms; LuminousEfficacy[UnitSystem[1, ___]] = 1; LuminousEfficacy[u : UnitSystem] := Power[Kcd, SI2019, u]; +Universe[AbstractUnits] := AbstractUniverse; +Universe[AbstractUnits1] := AbstractUniverse; +Universe[AbstractUnits2] := AbstractUniverse; +Universe[AbstractSI2019] := AbstractUniverse; +Universe[AbstractMetric] := AbstractUniverse; + +MolarMass[AbstractUnits] = "Mu" +MolarMass[AbstractUnits1] = "Mu1" +MolarMass[AbstractUnits2] = "Mu2" +MolarMass[AbstractSI2019] = "NA" ElectronMass[AbstractSI2019]/ElectronUnit[AbstractUniverse] + +LuminousEfficacy[AbstractUnits] = "Kcd" +LuminousEfficacy[AbstractUnits1] = "Kcd1" +LuminousEfficacy[AbstractUnits2] = "Kcd2" +LuminousEfficacy[AbstractSI2019] = "Kcd" +LuminousEfficacy[AbstractMetric] = "Kcd" + Kilograms[m_] := Kilograms[m, English]; Kilograms[m_, u_UnitSystem] := Mass[m, Metric, u]; Slugs[m_] := Slugs[m, Metric]; From 57ad2def004e394650e0c28ead899820cb0fb5ce Mon Sep 17 00:00:00 2001 From: Michael Reed <18372368+chakravala@users.noreply.github.com> Date: Sun, 23 Jan 2022 15:06:31 -0500 Subject: [PATCH 05/11] upgraded unit abstractions --- Kernel/UnitSystems.wl | 416 ++++++++++++++++++++++++++---------------- 1 file changed, 260 insertions(+), 156 deletions(-) diff --git a/Kernel/UnitSystems.wl b/Kernel/UnitSystems.wl index e7ca51a..b990fe6 100644 --- a/Kernel/UnitSystems.wl +++ b/Kernel/UnitSystems.wl @@ -4,11 +4,11 @@ Unprotect[UnitSystem]; ProtectedList = {Length, Area, Volume, Power, Entropy}; -UnitSystemsList = {Metric, SI2019, CODATA, Conventional, MTS, English, - EnglishUS, IAU, SI1976, Mixed, ESU2019, EMU2019, EMU, ESU, Gauss, - LorentzHeaviside, Thomson, Kennelly, Planck, PlanckGauss, Stoney, - Hartree, Rydberg, Schrodinger, Electronic, Natural, NaturalGauss, - QCD, QCDGauss, QCDoriginal}; +UnitSystemsList = {"Metric", "SI2019", "CODATA", "Conventional", "MTS", "English", + "EnglishUS", "IAU", "SI1976", "Mixed", "ESU2019", "EMU2019", "EMU", "ESU", "Gauss", + "LorentzHeaviside", "Thomson", "Kennelly", "Planck", "PlanckGauss", "Stoney", + "Hartree", "Rydberg", "Schrodinger", "Electronic", "Natural", "NaturalGauss", + "QCD", "QCDGauss", "QCDoriginal"}; ConstantsList = {Hyperfine, LightSpeed, Planck, PlanckReduced, ElectronMass, MolarMass, Boltzmann, Permeability, Rationalization, Lorentz, LuminousEfficacy}; @@ -49,6 +49,14 @@ ConvertList = Join[MechanicsList, ElectromagneticList, ThermodynamicList, MolarList, PhotometricList]; +OneQ[1] := True +OneQ[-1] := False +OneQ[0] := False +OneQ[_] := False +OneQ[x_?NumberQ] := x == 1 +OneQ[True] := True +OneQ[False] := False + measure[x_] := x; GravityCoupling[Coupling[\[Alpha]G_, ___]] := measure[\[Alpha]G]; FineStructure[Coupling[_, \[Alpha]_, ___]] := measure[\[Alpha]]; @@ -70,13 +78,15 @@ Lorentz[UnitSystem[_, _, _, _, _, _, \[Alpha]L_, ___]] := \[Alpha]L; RationalizedQ[u_UnitSystem] := Rationalization[u] != 4 \[Pi] -Universe[_] := StandardModel; +(*Universe[_] = StandardModel*) +Universe[UnitSystem[_?NumericQ, ___]] := StandardModel +Universe[UnitSystem[_Around, ___]] := StandardModel Unit[x_, y_ : 1] := x; Mass[u_UnitSystem, s_UnitSystem] := ElectronMass[u, s]; -ElectronMass[h_?NumberQ] := R\[Infinity] 2 h \[Alpha]inv^2/c; -ElectronMass[h_?NumberQ, u_Coupling] := (R\[Infinity] 2 h)/(FineStructure[u]^2 c); +ElectronMass[h_?NumberQ] := UnitData[["R\[Infinity]"]] 2 h/UnitData[["\[Alpha]"]]^2/UnitData["c"]; +ElectronMass[h_?NumberQ, u_Coupling] := (UnitData[["R\[Infinity]"]] 2 h)/(FineStructure[u]^2 UnitData[["c"]]); PlanckMass[u_UnitSystem, c_Coupling] := ElectronMass[u, c]/Sqrt[GravityCoupling[c]]; -Planck[u_UnitSystem, c_Coupling] := 2 \[Pi] PlanckReduced[u]; +Planck[u_UnitSystem, c_Coupling] := 2 Pi PlanckReduced[u]; Newton[u_UnitSystem, c_Coupling] := ( LightSpeed[u, c] PlanckReduced[u, c])/PlanckMass[u, c]^2; Charge[u_UnitSystem, c_Coupling] := Sqrt[2 Planck[u]/(Permeability[u]/FineStructure[u])/ @@ -91,7 +101,7 @@ Map[(#[u_UnitSystem, s_UnitSystem] := Unit[#[s]/#[u]]) &, ConstantsList]; Map[(If[! MemberQ[ProtectedList, #], #[v_?NumberQ, u_UnitSystem] := #[v, u, Metric]; #[v_?NumberQ, u_UnitSystem, s_UnitSystem] := - Module[{n = #[u, s]}, If[OneQ[v], v, v/u]]; + Module[{n = #[u, s]}, If[OneQ[n], v, v/n]]; #[v_?NumberQ, u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := v; @@ -101,7 +111,7 @@ Map[(If[! MemberQ[ProtectedList, #], Impedance, Conductance}], #], #[u_UnitSystem] := #[u, Metric], Nothing];, UnitSystem /: #[v_?NumberQ, u_UnitSystem] := #[v, u, Metric]; UnitSystem /: #[v_?NumberQ, u_UnitSystem, s_UnitSystem] := - Module[{n = #[u, s]}, If[OneQ[v], v, v/u]]; + Module[{n = #[u, s]}, If[OneQ[n], v, v/n]]; UnitSystem /: #[v_?NumberQ, u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := v; @@ -111,136 +121,210 @@ Map[(If[! MemberQ[ProtectedList, #], UnitSystem /: #[u_UnitSystem] := #[u, Metric];] ) &, ConvertList]; -g0 = 9.80665; -ft = 0.3048; -ftUS = 1200/3937; -lbm = g0/ft; -lbmUS = g0/ftUS; -slug = 0.45359237 lbm; -slugUS = 0.45359237 lbmUS; -rankine = 5/9; -kelvin = 9/5; -atm = 101325; - -kcalth = 4184; -kcal4 = 4204; -kcal10 = 4185.5; -kcal20 = 4182; -kcalm = 4190; -kcalit = 4186.8; -calth = kcalth/1000; -cal4 = kcal4/1000; -cal10 = kcal10/1000; -cal20 = kcal20/1000; -calm = kcalm/1000; -calit = kcalit/1000; -kcal = kcalth; -cal = kcal/1000; -(*calth = thermal calorie*) - -\[CapitalDelta]\[Nu]Cs = 9192631770.0; -Kcd = 683 555.016/555; -mP = 2.176434 10^-8; -NA = 6.02214076 10^23; -kB = 1.380649 10^-23; -h = 6.62607015 10^-34; -c = 299792458.; -e = 1.602176634 10^-19; -\[Mu]eu = 1/1822.888486209; -\[Mu]pu = 1.007276466621; -\[Alpha]inv = 137.035999084; -R\[Infinity] = 10973731.5681601; -me = ElectronMass[h]; -\[Mu]0 = 2 h/c/\[Alpha]inv/e^2 ;(*\[TildeTilde]4\[Pi]*(1e-7+5.5e-17),exact charge*) -ħ = h/(2 Pi); -\[Delta]\[Mu]0 = \[Mu]0 - 4 \[Pi] 10^-7; -\[Mu]pe = \[Mu]pu/\[Mu]eu; -Ru = NA kB; -\[Alpha]L = 0.01/c; -\[Alpha]G = (me/mP)^2; -RK1990 = 25812.807; -RK2014 = 25812.8074555; -KJ1990 = 4.835979 10^14; -KJ2014 = 4.835978525 10^14; -ħ1990 = 2/RK1990/KJ1990^2/\[Pi]; -ħ2014 = 2/RK2014/KJ2014^2/\[Pi]; -me1990 = ElectronMass[2 \[Pi] ħ1990]; -me2014 = ElectronMass[2 \[Pi] ħ2014]; - -AbstractUniverse = Coupling["\[Alpha]G", "\[Alpha]", "\[Mu]eu", "\[Mu]pu"] +UnitData = <||> + +AbstractUnitData["lbm"] = "g0"/"ft" +AbstractUnitData["lbmUS"] = "g0"/"ftUS" +AbstractUnitData["slug"] = "lb" AbstractUnitData["lbm"] +AbstractUnitData["slugUS"] = "lb" AbstractUnitData["lbmUS"] + +AppendTo[UnitData, "g0" -> 9.80665] +AppendTo[UnitData, "ft" -> 3048/10000] +AppendTo[UnitData, "ftUS" -> 1200/3937] +AppendTo[UnitData, "lb" -> 0.45359237] +AppendTo[UnitData, "rankine" -> 5/9] +(*AppendTo[UnitData, "kelvin" -> 9/5] +AppendTo[UnitData, "atm" -> 101325] + +AppendTo[UnitData, "kcalth" -> 4184] +AppendTo[UnitData, "kcal4" -> 4204] +AppendTo[UnitData, "kcal10" -> 4185+1/2] +AppendTo[UnitData, "kcal20" -> 4182] +AppendTo[UnitData, "kcalm" -> 4190] +AppendTo[UnitData, "kcalit" -> 4186+8/10] +AppendTo[UnitData, "cal4" -> UnitData[["kcal4"]]/1000] +AppendTo[UnitData, "cal10" -> UnitData[["kcal10"]]/1000] +AppendTo[UnitData, "cal20" -> UnitData[["kcal20"]]/1000] +AppendTo[UnitData, "calm" -> UnitData[["kcalm"]]/1000] +AppendTo[UnitData, "calit" -> UnitData[["kcalit"]]/1000] +AppendTo[UnitData, "calth" -> UnitData[["kcalth"]]/1000] +AppendTo[UnitData, "kcal" -> UnitData[["kcalth"]]] +AppendTo[UnitData, "cal" -> UnitData[["kcal"]]/1000]*) +(*AppendTo[UnitData, "calth" -> thermal calorie*) + +AbstractUnitData["me"] = 2 "R\[Infinity]" "h"/"\[Alpha]"^2/"c" +AbstractUnitData["\[Mu]0"] = 2 "\[Alpha]" "h"/"c"/"e"^2 +AbstractUnitData["\[HBar]"] = "h"/(2 Pi) +AbstractUnitData["\[Delta]\[Mu]0"] = "\[Mu]0" - 4 Pi 10^-7 +AbstractUnitData["\[Mu]pe"] = "\[Mu]pu"/"\[Mu]eu" +AbstractUnitData["Ru"] = "NA" "kB" +AbstractUnitData["\[Alpha]L"] = 1/100/"c" +AbstractUnitData["\[Alpha]G"] = (AbstractUnitData["me"]/"mP")^2 +AbstractUnitData["\[HBar]1990"] = 2/"RK1990"/"KJ1990"^2/Pi +AbstractUnitData["\[HBar]2014"] = 2/"RK2014"/"KJ2014"^2/Pi +AbstractUnitData["me1990"] = 4 Pi "R\[Infinity]" AbstractUnitData["\[HBar]1990"]/"\[Alpha]"^2/"c" +AbstractUnitData["me2014"] = 4 Pi "R\[Infinity]" AbstractUnitData["\[HBar]2014"]/"\[Alpha]"^2/"c" + +AppendTo[UnitData, "\[CapitalDelta]\[Nu]Cs" -> 9192631770.0] +AppendTo[UnitData, "Kcd" -> 683 555.016/555] +AppendTo[UnitData, "mP" -> Around[2.176434 10^-8, 2.4 10^-13]] +AppendTo[UnitData, "NA" -> 6.02214076 10^23] +AppendTo[UnitData, "kB" -> 1.380649 10^-23] +AppendTo[UnitData, "h" -> 6.62607015 10^-34] +AppendTo[UnitData, "c" -> 299792458.] +AppendTo[UnitData, "e" -> 1.602176634 10^-19] +AppendTo[UnitData, "\[Mu]eu" -> 1/Around[1822.888486209, 5.3 10^-8]] +AppendTo[UnitData, "\[Mu]pu" -> Around[1.007276466621, 5.3 10^-11]] +AppendTo[UnitData, "\[Alpha]" -> 1/Around[137.035999084, 2.1 10^-8]] +AppendTo[UnitData, "R\[Infinity]" -> Around[10973731.5681601, 2.1 10^-5]] +AppendTo[UnitData, "RK1990" -> 25812.807] +AppendTo[UnitData, "RK2014" -> Around[25812.8074555, 5.9 10^-6]] +AppendTo[UnitData, "KJ1990" -> 4.835979 10^14] +AppendTo[UnitData, "KJ2014" -> Around[4.835978525 10^14, 3 10^6]] + +(*AppendTo[UnitData, "lbm" -> AbstractUnitData["lbm"]/.Normal[UnitData]] +AppendTo[UnitData, "lbmUS" -> AbstractUnitData["lbmUS"]/.Normal[UnitData]] +AppendTo[UnitData, "slug" -> 0.45359237 UnitData[["lbm"]]] +AppendTo[UnitData, "slugUS" -> 0.45359237 UnitData[["lbmUS"]]] +AppendTo[UnitData, "me" -> AbstractUnitData["me"]/.Normal[UnitData]] +AppendTo[UnitData, "\[Mu]0" -> AbstractUnitData["\[Mu]0"]/.Normal[UnitData]] (*\[TildeTilde]4\[Pi]*(1e-7+5.5e-17),exact charge*) +AppendTo[UnitData, "\[HBar]" -> AbstractUnitData["\[HBar]"]/.Normal[UnitData]] +AppendTo[UnitData, "\[Delta]\[Mu]0" -> AbstractUnitData["\[Delta]\[Mu]0"]/.Normal[UnitData]] +AppendTo[UnitData, "\[Mu]pe" -> AbstractUnitData["\[Mu]pe"]/.Normal[UnitData]] +AppendTo[UnitData, "Ru" -> AbstractUnitData["Ru"]/.Normal[UnitData]] +AppendTo[UnitData, "\[Alpha]L" -> AbstractUnitData["\[Alpha]L"]/.Normal[UnitData]] +AppendTo[UnitData, "\[Alpha]G" -> AbstractUnitData["\[Alpha]G"]/.Normal[UnitData]] +AppendTo[UnitData, "\[HBar]1990" -> AbstractUnitData["\[HBar]1990"]/.Normal[UnitData]] +AppendTo[UnitData, "\[HBar]2014" -> AbstractUnitData["\[HBar]2014"]/.Normal[UnitData]] +AppendTo[UnitData, "me1990" -> AbstractUnitData["me1990"]/.Normal[UnitData]] +AppendTo[UnitData, "me2014" -> AbstractUnitData["me2014"]/.Normal[UnitData]]*) + +Map[Set[Unevaluated[#],UnitData[ToString[#]]] &, {g0,ft,ftUS,lb,rankine,\[CapitalDelta]\[Nu]Cs,Kcd,mP,NA,kB,h,c,e,\[Mu]eu,\[Mu]pu,\[Alpha]inv,R\[Infinity],RK1990,RK2014,KJ1990,KJ2014}] +(*Map[Set[Unevaluated[#],UnitData[ToString[#]]] &, {lbm,lbmUS,slug,slugUS,kelvin,atm,kcalth,kcal4,kcla10,kcal20,kcalm,kcalit,calth,cal4,cal10,cal20,calm,calit,kcal,cal,me,\[Mu]0,\[HBar],\[Delta]\[Mu]0,\[Mu]pe,Ru,\[Alpha]L,\[Alpha]G,\[HBar]1990,\[HBar]2014,me1990,me2014}]*) + +AbstractUniverse = Coupling[AbstractUnitData["\[Alpha]G"], "\[Alpha]", "\[Mu]eu", "\[Mu]pu"] AbstractUnits = UnitSystem["kB", "\[HBar]", "c", "\[Mu]0", "me", "\[Lambda]", "\[Alpha]L"] AbstractUnits1 = UnitSystem["kB1", "\[HBar]1", "c1", "\[Mu]01", "me1", "\[Lambda]1", "\[Alpha]L1"] AbstractUnits2 = UnitSystem["kB2", "\[HBar]2", "c2", "\[Mu]02", "me2", "\[Lambda]2", "\[Alpha]L2"] -AbstractMetric = UnitSystem[1000 "Ru" ("R\[Infinity]" 2 "h")/("\[Alpha]"^2 "c")/"\[Mu]eu", "h"/(2 Pi), "c", 4 \[Pi] 10^-7, ("R\[Infinity]" 2 "h")/("\[Alpha]"^2 "c"), 1, 1] -AbstractSI2019 = UnitSystem["kB", "h"/(2 Pi), "c", 2 "h" "\[Alpha]"/"c"/"e"^2, ("R\[Infinity]" 2 "h")/("\[Alpha]"^2 "c"), 1, 1] - -StandardModel = Coupling[\[Alpha]G, 1/\[Alpha]inv, \[Mu]eu, \[Mu]pu]; -Gauss = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, 1, 1000 me, 4 \[Pi], 0.01/c]; -LorentzHeaviside = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, 1, 1000 me, 1, 0.01/c]; -Thomson = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, 1, 1000 me, 4 \[Pi], 1/2]; -Kennelly = UnitSystem[Ru me/\[Mu]eu/0.001, ħ, c, 10^-7, me, 4 \[Pi], 1]; -ESU = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, (100 c)^-2, 1000 me, 4 \[Pi], 1]; -ESU2019 = UnitSystem[10^7 kB, 10^7 ħ, 100 c, 10^3 \[Mu]0/c^2, 1000 me, 1, 1]; -EMU = UnitSystem[10^10 Ru me/\[Mu]eu, 10^7 ħ, 100 c, 1, 1000 me, 4 \[Pi], 1]; -EMU2019 = UnitSystem[10^7 kB, 10^7 ħ, 100 c, 10^7 \[Mu]0, 1000 me, 1, 1]; -MTS = UnitSystem[10^6 Ru me/\[Mu]eu, 1000 ħ, c, 4 \[Pi]/10^4, me/1000, 1, 1]; -Mixed = UnitSystem[Ru me/\[Mu]eu/0.001, ħ, c, \[Mu]0, me, 1, 1]; -Metric = UnitSystem[Ru me/\[Mu]eu/0.001, ħ, c, 4 \[Pi] 10^-7, me, 1, 1]; -SI1976 = UnitSystem[8.31432 me/\[Mu]eu/0.001, ħ, c, 4 \[Pi] 10^-7, me, 1, 1]; -SI2019 = UnitSystem[kB, ħ, c, \[Mu]0, me, 1, 1]; -CODATA = UnitSystem[Ru me2014/\[Mu]eu/0.001, ħ2014, c, 2 RK2014/c/\[Alpha]inv, me2014,1,1]; -Conventional = - UnitSystem[Ru me1990/\[Mu]eu/0.001, ħ1990, c, 2 RK1990/c/\[Alpha]inv, me1990, 1, 1]; -English = - UnitSystem[kB rankine/slug/ft^2, ħ/slug/ft^2, c/ft, 4 \[Pi], me/slug, 1, 1]; -EnglishUS = - UnitSystem[(1000 Ru me/\[Mu]eu ) (rankine/slug/ftUS^2), - ħ/slug/ftUS^2, c/ftUS, 4 \[Pi], me/slug, 1, 1]; - -GMsun = 1.32712442099 10^20; -GMearth = 398600441.8 10^6; -GMjupiter = 1.26686534 10^17; -au = 149597870.7 10^3; -LD = 384402 10^3; -day = 60^2 24; -pc = au 648000/\[Pi]; -ly = 365.25 c day; -GG = c ħ/mP^2; -ms = GMsun/GG; -Js = ms au^2/day^2; -IAU = UnitSystem[Ru me/\[Mu]eu/0.001/Js, ħ/day/Js, day c/au, - 4 \[Pi] 10^-7 day^2/Js, me/ms]; - -mf = Mass[90/lbm, Metric, English]; -Jf = mf (201.168/14 day)^2; -FFF = UnitSystem[1000 Ru me/\[Mu]eu rankine/Jf, ħ/14 day/Jf, 14 day c/201.168, 0, me/mf, 1, 1]; -SI = SI2019; -MKS = Metric; -{CGS, CGS2019, CGSm, CGSe, HLU} = {Gauss, EMU2019, EMU, ESU, LorentzHeaviside}; -mf = Mass[90/lbm, Metric, English]; -Jf = mf (201.168/14 day)^2; -FFF = UnitSystem[1000 Ru me/\[Mu]eu rankine/Jf, ħ/14 day/Jf, 14 day c/201.168, 0, me/mf, 1, 1]; -SI = SI2019; -MKS = Metric; +AbstractUnitSystem["Gauss"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 4 Pi, AbstractUnitData["\[Alpha]L"]] +AbstractUnitSystem["LorentzHeaviside"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 1, AbstractUnitData["\[Alpha]L"]] +AbstractUnitSystem["Thomson"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 4 Pi, 1/2]; +AbstractUnitSystem["Kennelly"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", 10^-7, AbstractUnitData["me"], 4 Pi, 1] +AbstractUnitSystem["ESU"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", (100 "c")^-2, 1000 AbstractUnitData["me"], 4 Pi, 1]; +AbstractUnitSystem["ESU2019"] = UnitSystem[10^7 "kB", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 10^3 AbstractUnitData["\[Mu]0"]/"c"^2, 1000 AbstractUnitData["me"], 1, 1] +AbstractUnitSystem["EMU"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 4 Pi, 1]; +AbstractUnitSystem["EMU2019"] = UnitSystem[10^7 "kB", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 10^7 AbstractUnitData["\[Mu]0"], 1000 AbstractUnitData["me"], 1, 1] +AbstractUnitSystem["MTS"] = UnitSystem[10^6 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 1000 AbstractUnitData["\[HBar]"], "c", 4 Pi/10^4, AbstractUnitData["me"]/1000, 1, 1]; +AbstractUnitSystem["Mixed"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", AbstractUnitData["\[Mu]0"], AbstractUnitData["me"], 1, 1]; +AbstractUnitSystem["Metric"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", 4 Pi 10^-7, AbstractUnitData["me"], 1, 1]; +AbstractUnitSystem["SI1976"] = UnitSystem[8314.32 AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", 4 Pi 10^-7, AbstractUnitData["me"], 1, 1]; +AbstractUnitSystem["SI2019"] = UnitSystem["kB", AbstractUnitData["\[HBar]"], "c", AbstractUnitData["\[Mu]0"], AbstractUnitData["me"], 1, 1]; +AbstractUnitSystem["CODATA"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me2014"]/"\[Mu]eu", AbstractUnitData["\[HBar]2014"], "c", 2 "\[Alpha]" AbstractUnitData["RK2014"]/"c", AbstractUnitData["me2014"],1,1]; +AbstractUnitSystem["Conventional"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me1990"]/"\[Mu]eu", AbstractUnitData["\[HBar]1990"], "c", 2 "\[Alpha]" AbstractUnitData["RK1990"]/"c", AbstractUnitData["me1990"], 1, 1]; +AbstractUnitSystem["English"] = UnitSystem["kB" "rankine"/AbstractUnitData["slug"]/"ft"^2, AbstractUnitData["\[HBar]"]/AbstractUnitData["slug"]/"ft"^2, "c"/"ft", 4 Pi, AbstractUnitData["me"]/AbstractUnitData["slug"], 1, 1]; +AbstractUnitSystem["EnglishUS"] = UnitSystem[(1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu" ) ("rankine"/AbstractUnitData["slugUS"]/"ftUS"^2), + AbstractUnitData["\[HBar]"]/AbstractUnitData["slugUS"]/"ftUS"^2, "c"/"ftUS", 4 Pi, AbstractUnitData["me"]/AbstractUnitData["slugUS"], 1, 1] + +AbstractUnitData["GG"] = "c" AbstractUnitData["\[HBar]"]/"mP"^2 +AbstractUnitData["ms"] = "GMsun"/AbstractUnitData["GG"] +AbstractUnitData["Js"] = AbstractUnitData["ms"] "au"^2/"day"^2; + +AppendTo[UnitData, "GMsun" -> Around[1.32712442099 10^20, 9 10^9]] +(*AppendTo[UnitData, "GMearth" -> Around[398600441.8 10^6, 8 10^5]] +AppendTo[UnitData, "GMjupiter" -> Around[1.26686534 10^17, 9 10^9]*) +AppendTo[UnitData, "au" -> 149597870.7 10^3] +(*AppendTo[UnitData, "LD" -> 384402 10^3]*) +AppendTo[UnitData, "day" -> 60^2 24] +(*AppendTo[UnitData, "pc" -> ("au" 648000/Pi)/.Normal[UnitData]] +AppendTo[UnitData, "ly" -> (365.25 "c" "day")/.Normal[UnitData]] +AppendTo[UnitData, "GG" -> AbstractUnitData["GG"]/.Normal[UnitData]] +AppendTo[UnitData, "ms" -> AbstractUnitData["ms"]/.Normal[UnitData]] +AppendTo[UnitData, "Js" -> AbstractUnitData["Js"]/.Normal[UnitData]]*) + +AbstractUnitSystem["IAU"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu"/AbstractUnitData["Js"], AbstractUnitData["\[HBar]"]/"day"/AbstractUnitData["Js"], "day" "c"/"au", + 4 Pi 10^-7 "day"^2/AbstractUnitData["Js"], AbstractUnitData["me"]/AbstractUnitData["ms"], 1, 1] + +AbstractUnitData["mf"] = 90/AbstractUnitData["lbm"]/Mass[AbstractUnitSystem["Metric"], AbstractUnitSystem["English"]] +AbstractUnitData["Jf"] = AbstractUnitData["mf"] (201.168/(14 "day"))^2 +AbstractUnitSystem["FFF"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu" "rankine"/AbstractUnitData["Jf"], AbstractUnitData["\[HBar]"]/(14 "day")/AbstractUnitData["Jf"], 14 "day" "c"/201.168, 0, AbstractUnitData["me"]/AbstractUnitData["mf"], 1, 1] + +AbstractMetric = AbstractUnitSystem["Metric"] +AbstractSI2019 = AbstractUnitSystem["SI2019"] +AbstractCGS = AbstractUnitSystem["Gauss"] +AbstractMTS = AbstractUnitSystem["MTS"] +AbstractEnglish = AbstractUnitSystem["English"] +AbstractEnglishUS = AbstractUnitSystem["EnglishUS"] +AbstractIAU = AbstractUnitSystem["IAU"] +AbstractFFF = AbstractUnitSystem["FFF"] + +Coupling["StandardModel"] = AbstractUniverse /. Normal[UnitData] +Map[(UnitSystem[#] = AbstractUnitSystem[#] /. Normal[UnitData]) &, +{"Gauss","LorentzHeaviside","Thomson","Kennelly","ESU","ESU2019","EMU","MTS","Mixed","Metric","SI1976","SI2019","CODATA","Conventional","English","EnglishUS","IAU","FFF"}] + +Map[Set[Unevaluated[#],UnitData[ToString[#]]] &, {GMsun, GMearth, GMjupiter, au, LD, day, pc, ly, GG, ms, Js, mf, Jf}] + +AbstractUnitSystem["Planck"] = UnitSystem[1,1,1,1,Sqrt[4 Pi AbstractUnitData["\[Alpha]G"]],1,1] + +AbstractUnitSystem["PlanckGauss"] = UnitSystem[1, 1, 1, 4 Pi, Sqrt[AbstractUnitData["\[Alpha]G"]], 1, 1] +AbstractUnitSystem["Stoney"] = UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"], 1, 1] +AbstractUnitSystem["Hartree"] = UnitSystem[1,1,1/"\[Alpha]",4 Pi "\[Alpha]"^2,1,1,1] +AbstractUnitSystem["Rydberg"] = UnitSystem[1,1,2/"\[Alpha]",Pi "\[Alpha]"^2,1/2,1,1] + +AbstractUnitSystem["Schrodinger"] = UnitSystem[1, 1, 1/"\[Alpha]", 4 Pi "\[Alpha]"^2, + Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"], 1, 1] +AbstractUnitSystem["Electronic"] = UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, 1, 1, 1] +AbstractUnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1, 1, 1, "1"] +AbstractUnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1, 1, 1, "1"] +AbstractUnitSystem["QCD"] = UnitSystem[1, 1, 1, 1, 1/AbstractUnitData["\[Mu]pe"], 1, 1] +AbstractUnitSystem["QCDGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1/AbstractUnitData["\[Mu]pe"], 1, 1] +AbstractUnitSystem["QCDoriginal"] = UnitSystem[1, 1, 1, 4 Pi "\[Alpha]", 1/AbstractUnitData["\[Mu]pe"], 1, 1] + +UnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1, 1, 1] +UnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1, 1, 1] + +Map[(UnitSystem[#] = AbstractUnitSystem[#] /. Normal[UnitData]) &, +{"Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","QCD","QCDGauss","QCDoriginal"}] + +StandardModel = Coupling["StandardModel"] +Gauss = UnitSystem["Gauss"] +LorentzHeaviside = UnitSystem["LorentzHeaviside"] +Thomson = UnitSystem["Thomson"] +Kennelly = UnitSystem["Kennelly"] +ESU = UnitSystem["ESU"] +ESU2019 = UnitSystem["ESU2019"] +EMU = UnitSystem["EMU"] +EMU2019 = UnitSystem["EMU2019"] +MTS = UnitSystem["MTS"] +Mixed = UnitSystem["Mixed"] +Metric = UnitSystem["Metric"] +SI1976 = UnitSystem["SI1976"] +SI2019 = UnitSystem["SI2019"] +CODATA = UnitSystem["CODATA"] +Conventional = UnitSystem["Conventional"] +English = UnitSystem["English"] +EnglishUS = UnitSystem["EnglishUS"] +IAU = UnitSystem["IAU"] +FFF = UnitSystem["FFF"] + +UnitSystem["SI"] = UnitSystem["SI2019"] +UnitSystem["MKS"] = UnitSystem["Metric"] +UnitSystem["CGS"] = UnitSystem["Gauss"] +UnitSystem["CGS2019"] = UnitSystem["EMU2019"] +UnitSystem["CGSm"] = UnitSystem["EMU"] +UnitSystem["CGSe"] = UnitSystem["ESU"] +UnitSystem["HLU"] = UnitSystem["LorentzHeaviside"] +{SI,MKS} = {SI2019, Metric} {CGS, CGS2019, CGSm, CGSe, HLU} = {Gauss, EMU2019, EMU, ESU, LorentzHeaviside}; -(*Planck=UnitSystem[1,1,1,1,Sqrt[4\[Pi] \[Alpha]G]];*) - -PlanckGauss = UnitSystem[1, 1, 1, 4 \[Pi], Sqrt[\[Alpha]G], 1]; -Stoney = UnitSystem[1, \[Alpha]inv, 1, 4 \[Pi], Sqrt[\[Alpha]G \[Alpha]inv], 1, 1]; -(*Hartree=UnitSystem[1,1,\[Alpha]inv,4\[Pi]/\[Alpha]inv^2,1,1,1]; -Rydberg=UnitSystem[1,1,2\[Alpha]inv,\[Pi]/\[Alpha]inv^2,1/2,1,1];*) - -Schrodinger = - UnitSystem[1, 1, \[Alpha]inv, 4 \[Pi]/\[Alpha]inv^2, - Sqrt[\[Alpha]G \[Alpha]inv], 1, 1]; -Electronic = UnitSystem[1, \[Alpha]inv, 1, 4 \[Pi], 1, 1, 1]; -Natural = UnitSystem[1, 1, 1, 1, 1, 1, 1]; -NaturalGauss = UnitSystem[1, 1, 1, 4 \[Pi], 1, 1, 1]; -QCD = UnitSystem[1, 1, 1, 1, 1/\[Mu]pe, 1, 1]; -QCDGauss = UnitSystem[1, 1, 1, 4 \[Pi], 1/\[Mu]pe, 1, 1]; -QCDoriginal = UnitSystem[1, 1, 1, 4 \[Pi]/\[Alpha]inv, 1/\[Mu]pe, 1, 1]; +PlanckGauss = UnitSystem["PlanckGauss"] +Stoney = UnitSystem["Stoney"] +Schrodinger = UnitSystem["Schrodinger"] +Electronic = UnitSystem["Electronic"] +Natural = UnitSystem["Natural"] +QCD = UnitSystem["QCD"] +QCDGauss = UnitSystem["QCDGauss"] +QCDoriginal = UnitSystem["QCDoriginal"] ElectronMass[Planck, c_Coupling] := Sqrt[4 \[Pi] GravityCoupling[c]]; ElectronMass[PlanckGauss, c_Coupling] := Sqrt[GravityCoupling[c]]; @@ -273,41 +357,60 @@ Permeability[CODATA, u_Coupling] := 2 RK2014 FineStructure[u]/c; Permeability[Conventional, u_Coupling] := 2 RK1990 FineStructure[u]/c; MolarMass[UnitSystem[1, ___]] = 1; -MolarMass[u : UnitSystem[kB, ___]] := MolarMass[u, Universe[u]]; -MolarMass[u : UnitSystem[kB, ___], c_Coupling] := NA ElectronMass[u, c]/ElectronUnit[c]; -MolarMass[u : UnitSystem[10^7 kB, ___]] := MolarMass[u, Universe[u]]; +MolarMass[u:UnitSystem[kB, ___]] := MolarMass[u, Universe[u]]; +MolarMass[u:UnitSystem[kB, ___], c_Coupling] := NA ElectronMass[u, c]/ElectronUnit[c]; +MolarMass[u:UnitSystem[10^7 kB, ___]] := MolarMass[u, Universe[u]]; MolarMass[UnitSystem[10^7 kB, ___], c_Coupling] := 1000 MolarMass[SI2019, c]; -MolarMass[u : UnitSystem[10^3 kB, ___]] := MolarMass[u, Universe[u]]; +MolarMass[u:UnitSystem[10^3 kB, ___]] := MolarMass[u, Universe[u]]; MolarMass[UnitSystem[10^3 kB, ___], c_Coupling] := MolarMass[SI2019, c]/1000; MolarMass[UnitSystem[kB_, ___]] := MolarMass[CGS]/1000; MolarMass[UnitSystem[Boltzmann[MTS], ___]] := MolarMass[CGS]/10^6; MolarMass[UnitSystem[Boltzmann[CGS], ___]] := MolarMass[Natural]; MolarMass[UnitSystem[Boltzmann[FFF], ___]] := MolarMass[Natural]; -MolarMass[u : UnitSystem[Boltzmann[English], ___]] := MolarMass[u, Universe[u]]; -MolarMass[u : UnitSystem[Boltzmann[English], ___], c_Coupling] := - 1000 MolarMass[SI2019, c]; +MolarMass[u:UnitSystem[Boltzmann[English], ___]] := MolarMass[u, Universe[u]]; +MolarMass[u:UnitSystem[Boltzmann[English], ___], c_Coupling] := 1000 MolarMass[SI2019,c] MolarMass[UnitSystem[Boltzmann[EnglishUS], ___]] := MolarMass[Natural]; MolarMass[UnitSystem[Boltzmann[IAU], ___]] := 1/1000 ms; -LuminousEfficacy[UnitSystem[1, ___]] = 1; -LuminousEfficacy[u : UnitSystem] := Power[Kcd, SI2019, u]; - -Universe[AbstractUnits] := AbstractUniverse; -Universe[AbstractUnits1] := AbstractUniverse; -Universe[AbstractUnits2] := AbstractUniverse; -Universe[AbstractSI2019] := AbstractUniverse; -Universe[AbstractMetric] := AbstractUniverse; +LuminousEfficacy[UnitSystem[1, ___]] = 1 +LuminousEfficacy[u : UnitSystem[_?NumericQ, ___]] := Power[Kcd, SI2019, u] + +Universe[_] = AbstractUniverse +(*Universe[AbstractUnits1] = AbstractUniverse +Universe[AbstractUnits2] = AbstractUniverse +Universe[UnitSystem["kB", ___]] = AbstractUniverse +Universe[UnitSystem[10^7 "kB", ___]] = AbstractUniverse +Universe[UnitSystem[10^3 "kB", ___]] = AbstractUniverse +Universe[UnitSystem[Boltzmann[AbstractUnitSystem["MTS"]], ___]] = AbstractUniverse +Universe[UnitSystem[Boltzmann[AbstractUnitSystem["CGS"]], ___]] = AbstractUniverse +(*Universe[UnitSystem[Boltzmann[AbstractUnitSystem["FFF"]], ___]] = AbstractUniverse*) +Universe[UnitSystem[Boltzmann[AbstractUnitSystem["English"]], ___]] = AbstractUniverse +Universe[UnitSystem[Boltzmann[AbstractUnitSystem["EnglishUS"]], ___]] = AbstractUniverse +Universe[UnitSystem[Boltzmann[AbstractUnitSytem["IAU"]], ___]] = AbstractUniverse*) +Map[(Universe[AbstractUnitSystem[#]] = AbstractUniverse) &, +{"Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","Natural","NaturalGauss","QCD","QCDGauss","QCDoriginal"}] MolarMass[AbstractUnits] = "Mu" MolarMass[AbstractUnits1] = "Mu1" MolarMass[AbstractUnits2] = "Mu2" -MolarMass[AbstractSI2019] = "NA" ElectronMass[AbstractSI2019]/ElectronUnit[AbstractUniverse] - -LuminousEfficacy[AbstractUnits] = "Kcd" +MolarMass[u : UnitSystem["kB", ___]] := MolarMass[u,Universe[u]] +MolarMass[u : UnitSystem["kB", ___], c_Coupling] := "NA" ElectronMass[AbstractUnitSystem["SI2019"],c]/ElectronUnit[c] +MolarMass[u : UnitSystem[10^7 "kB", ___]] := MolarMass[u, Universe[u]]; +MolarMass[UnitSystem[10^7 "kB", ___], c_Coupling] := 1000 MolarMass[AbstractUnitSystem["SI2019"], c]; +MolarMass[u : UnitSystem[10^3 "kB", ___]] := MolarMass[u, Universe[u]]; +MolarMass[UnitSystem[10^3 "kB", ___], c_Coupling] := MolarMass[AbstractSI2019, c]/1000; +MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["MTS"]], ___]] := MolarMass[CGS]/10^6; +MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["CGS"]], ___]] := MolarMass[Natural]; +(*MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["FFF"]], ___]] := MolarMass[Natural];*) +MolarMass[u : UnitSystem[Boltzmann[AbstractUnitSystem["English"]], ___]] := MolarMass[u, Universe[u]]; +MolarMass[u : UnitSystem[Boltzmann[AbstractUnitSystem["English"]], ___], c_Coupling] := + 1000 MolarMass[AbstractUnitSystem["SI2019"], c]; +MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["EnglishUS"]], ___]] := MolarMass[Natural]; +MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["IAU"]], ___]] := 1/1000 "ms"; + +LuminousEfficacy[_] = "Kcd" LuminousEfficacy[AbstractUnits1] = "Kcd1" LuminousEfficacy[AbstractUnits2] = "Kcd2" -LuminousEfficacy[AbstractSI2019] = "Kcd" -LuminousEfficacy[AbstractMetric] = "Kcd" Kilograms[m_] := Kilograms[m, English]; Kilograms[m_, u_UnitSystem] := Mass[m, Metric, u]; @@ -569,7 +672,7 @@ Magneton[u_UnitSystem, c_Coupling] := Charge[u, c] PlanckReduced[u, c] Lorentz[u]/2 ElectronMass[u, c]; (* more *) - +(* \[Kappa] = Einstein[SI2019]; \[Sigma] = Stefan[SI2019];(**) \[Mu]B = Magneton[SI2019];(**) @@ -608,3 +711,4 @@ qA=Charge[Hartree,SI2019];*) lQCD = Length[QCD, SI2019]; tQCD = Time[QCD, SI2019]; mQCD = Mass[QCD, SI2019]; +*) From 7dcce9cae3480f3d295c0f5a2b8e8ab034d134d3 Mon Sep 17 00:00:00 2001 From: Michael Reed <18372368+chakravala@users.noreply.github.com> Date: Mon, 24 Jan 2022 16:52:48 -0500 Subject: [PATCH 06/11] revised UnitSystem specifications --- Kernel/UnitSystems.wl | 505 +++++++++++++++++++++--------------------- 1 file changed, 247 insertions(+), 258 deletions(-) diff --git a/Kernel/UnitSystems.wl b/Kernel/UnitSystems.wl index b990fe6..3e0dd8a 100644 --- a/Kernel/UnitSystems.wl +++ b/Kernel/UnitSystems.wl @@ -76,15 +76,17 @@ ElectronMass[UnitSystem[_, _, _, _, me_, ___]] := me; Rationalization[UnitSystem[_, _, _, _, _, \[Lambda]_, ___]] := \[Lambda]; Lorentz[UnitSystem[_, _, _, _, _, _, \[Alpha]L_, ___]] := \[Alpha]L; -RationalizedQ[u_UnitSystem] := Rationalization[u] != 4 \[Pi] +Lorentz[_UnitSystem] := 1 +Rationalization[_UnitSystem] := 1 +RationalizedQ[u_UnitSystem] := Rationalization[u] != 4 Pi (*Universe[_] = StandardModel*) Universe[UnitSystem[_?NumericQ, ___]] := StandardModel Universe[UnitSystem[_Around, ___]] := StandardModel Unit[x_, y_ : 1] := x; Mass[u_UnitSystem, s_UnitSystem] := ElectronMass[u, s]; -ElectronMass[h_?NumberQ] := UnitData[["R\[Infinity]"]] 2 h/UnitData[["\[Alpha]"]]^2/UnitData["c"]; -ElectronMass[h_?NumberQ, u_Coupling] := (UnitData[["R\[Infinity]"]] 2 h)/(FineStructure[u]^2 UnitData[["c"]]); +ElectronMass[h_?NumberQ] := UnitData["R\[Infinity]"] 2 h/UnitData["\[Alpha]"]^2/UnitData["c"]; +ElectronMass[h_?NumberQ, u_Coupling] := (UnitData["R\[Infinity]"] 2 h)/(FineStructure[u]^2 UnitData["c"]); PlanckMass[u_UnitSystem, c_Coupling] := ElectronMass[u, c]/Sqrt[GravityCoupling[c]]; Planck[u_UnitSystem, c_Coupling] := 2 Pi PlanckReduced[u]; Newton[u_UnitSystem, c_Coupling] := ( @@ -123,11 +125,6 @@ Map[(If[! MemberQ[ProtectedList, #], UnitData = <||> -AbstractUnitData["lbm"] = "g0"/"ft" -AbstractUnitData["lbmUS"] = "g0"/"ftUS" -AbstractUnitData["slug"] = "lb" AbstractUnitData["lbm"] -AbstractUnitData["slugUS"] = "lb" AbstractUnitData["lbmUS"] - AppendTo[UnitData, "g0" -> 9.80665] AppendTo[UnitData, "ft" -> 3048/10000] AppendTo[UnitData, "ftUS" -> 1200/3937] @@ -152,19 +149,6 @@ AppendTo[UnitData, "kcal" -> UnitData[["kcalth"]]] AppendTo[UnitData, "cal" -> UnitData[["kcal"]]/1000]*) (*AppendTo[UnitData, "calth" -> thermal calorie*) -AbstractUnitData["me"] = 2 "R\[Infinity]" "h"/"\[Alpha]"^2/"c" -AbstractUnitData["\[Mu]0"] = 2 "\[Alpha]" "h"/"c"/"e"^2 -AbstractUnitData["\[HBar]"] = "h"/(2 Pi) -AbstractUnitData["\[Delta]\[Mu]0"] = "\[Mu]0" - 4 Pi 10^-7 -AbstractUnitData["\[Mu]pe"] = "\[Mu]pu"/"\[Mu]eu" -AbstractUnitData["Ru"] = "NA" "kB" -AbstractUnitData["\[Alpha]L"] = 1/100/"c" -AbstractUnitData["\[Alpha]G"] = (AbstractUnitData["me"]/"mP")^2 -AbstractUnitData["\[HBar]1990"] = 2/"RK1990"/"KJ1990"^2/Pi -AbstractUnitData["\[HBar]2014"] = 2/"RK2014"/"KJ2014"^2/Pi -AbstractUnitData["me1990"] = 4 Pi "R\[Infinity]" AbstractUnitData["\[HBar]1990"]/"\[Alpha]"^2/"c" -AbstractUnitData["me2014"] = 4 Pi "R\[Infinity]" AbstractUnitData["\[HBar]2014"]/"\[Alpha]"^2/"c" - AppendTo[UnitData, "\[CapitalDelta]\[Nu]Cs" -> 9192631770.0] AppendTo[UnitData, "Kcd" -> 683 555.016/555] AppendTo[UnitData, "mP" -> Around[2.176434 10^-8, 2.4 10^-13]] @@ -181,74 +165,119 @@ AppendTo[UnitData, "RK1990" -> 25812.807] AppendTo[UnitData, "RK2014" -> Around[25812.8074555, 5.9 10^-6]] AppendTo[UnitData, "KJ1990" -> 4.835979 10^14] AppendTo[UnitData, "KJ2014" -> Around[4.835978525 10^14, 3 10^6]] +AppendTo[UnitData, "GMsun" -> Around[1.32712442099 10^20, 9 10^9]] +AppendTo[UnitData, "day" -> 60^2 24] +AppendTo[UnitData, "au" -> 149597870.7 10^3] -(*AppendTo[UnitData, "lbm" -> AbstractUnitData["lbm"]/.Normal[UnitData]] -AppendTo[UnitData, "lbmUS" -> AbstractUnitData["lbmUS"]/.Normal[UnitData]] -AppendTo[UnitData, "slug" -> 0.45359237 UnitData[["lbm"]]] -AppendTo[UnitData, "slugUS" -> 0.45359237 UnitData[["lbmUS"]]] -AppendTo[UnitData, "me" -> AbstractUnitData["me"]/.Normal[UnitData]] -AppendTo[UnitData, "\[Mu]0" -> AbstractUnitData["\[Mu]0"]/.Normal[UnitData]] (*\[TildeTilde]4\[Pi]*(1e-7+5.5e-17),exact charge*) -AppendTo[UnitData, "\[HBar]" -> AbstractUnitData["\[HBar]"]/.Normal[UnitData]] -AppendTo[UnitData, "\[Delta]\[Mu]0" -> AbstractUnitData["\[Delta]\[Mu]0"]/.Normal[UnitData]] -AppendTo[UnitData, "\[Mu]pe" -> AbstractUnitData["\[Mu]pe"]/.Normal[UnitData]] -AppendTo[UnitData, "Ru" -> AbstractUnitData["Ru"]/.Normal[UnitData]] -AppendTo[UnitData, "\[Alpha]L" -> AbstractUnitData["\[Alpha]L"]/.Normal[UnitData]] -AppendTo[UnitData, "\[Alpha]G" -> AbstractUnitData["\[Alpha]G"]/.Normal[UnitData]] -AppendTo[UnitData, "\[HBar]1990" -> AbstractUnitData["\[HBar]1990"]/.Normal[UnitData]] -AppendTo[UnitData, "\[HBar]2014" -> AbstractUnitData["\[HBar]2014"]/.Normal[UnitData]] -AppendTo[UnitData, "me1990" -> AbstractUnitData["me1990"]/.Normal[UnitData]] -AppendTo[UnitData, "me2014" -> AbstractUnitData["me2014"]/.Normal[UnitData]]*) - -Map[Set[Unevaluated[#],UnitData[ToString[#]]] &, {g0,ft,ftUS,lb,rankine,\[CapitalDelta]\[Nu]Cs,Kcd,mP,NA,kB,h,c,e,\[Mu]eu,\[Mu]pu,\[Alpha]inv,R\[Infinity],RK1990,RK2014,KJ1990,KJ2014}] -(*Map[Set[Unevaluated[#],UnitData[ToString[#]]] &, {lbm,lbmUS,slug,slugUS,kelvin,atm,kcalth,kcal4,kcla10,kcal20,kcalm,kcalit,calth,cal4,cal10,cal20,calm,calit,kcal,cal,me,\[Mu]0,\[HBar],\[Delta]\[Mu]0,\[Mu]pe,Ru,\[Alpha]L,\[Alpha]G,\[HBar]1990,\[HBar]2014,me1990,me2014}]*) - -AbstractUniverse = Coupling[AbstractUnitData["\[Alpha]G"], "\[Alpha]", "\[Mu]eu", "\[Mu]pu"] -AbstractUnits = UnitSystem["kB", "\[HBar]", "c", "\[Mu]0", "me", "\[Lambda]", "\[Alpha]L"] -AbstractUnits1 = UnitSystem["kB1", "\[HBar]1", "c1", "\[Mu]01", "me1", "\[Lambda]1", "\[Alpha]L1"] -AbstractUnits2 = UnitSystem["kB2", "\[HBar]2", "c2", "\[Mu]02", "me2", "\[Lambda]2", "\[Alpha]L2"] - -AbstractUnitSystem["Gauss"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 4 Pi, AbstractUnitData["\[Alpha]L"]] -AbstractUnitSystem["LorentzHeaviside"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 1, AbstractUnitData["\[Alpha]L"]] -AbstractUnitSystem["Thomson"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 4 Pi, 1/2]; -AbstractUnitSystem["Kennelly"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", 10^-7, AbstractUnitData["me"], 4 Pi, 1] -AbstractUnitSystem["ESU"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", (100 "c")^-2, 1000 AbstractUnitData["me"], 4 Pi, 1]; -AbstractUnitSystem["ESU2019"] = UnitSystem[10^7 "kB", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 10^3 AbstractUnitData["\[Mu]0"]/"c"^2, 1000 AbstractUnitData["me"], 1, 1] -AbstractUnitSystem["EMU"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 4 Pi, 1]; -AbstractUnitSystem["EMU2019"] = UnitSystem[10^7 "kB", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 10^7 AbstractUnitData["\[Mu]0"], 1000 AbstractUnitData["me"], 1, 1] -AbstractUnitSystem["MTS"] = UnitSystem[10^6 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 1000 AbstractUnitData["\[HBar]"], "c", 4 Pi/10^4, AbstractUnitData["me"]/1000, 1, 1]; -AbstractUnitSystem["Mixed"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", AbstractUnitData["\[Mu]0"], AbstractUnitData["me"], 1, 1]; -AbstractUnitSystem["Metric"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", 4 Pi 10^-7, AbstractUnitData["me"], 1, 1]; -AbstractUnitSystem["SI1976"] = UnitSystem[8314.32 AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", 4 Pi 10^-7, AbstractUnitData["me"], 1, 1]; -AbstractUnitSystem["SI2019"] = UnitSystem["kB", AbstractUnitData["\[HBar]"], "c", AbstractUnitData["\[Mu]0"], AbstractUnitData["me"], 1, 1]; -AbstractUnitSystem["CODATA"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me2014"]/"\[Mu]eu", AbstractUnitData["\[HBar]2014"], "c", 2 "\[Alpha]" AbstractUnitData["RK2014"]/"c", AbstractUnitData["me2014"],1,1]; -AbstractUnitSystem["Conventional"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me1990"]/"\[Mu]eu", AbstractUnitData["\[HBar]1990"], "c", 2 "\[Alpha]" AbstractUnitData["RK1990"]/"c", AbstractUnitData["me1990"], 1, 1]; -AbstractUnitSystem["English"] = UnitSystem["kB" "rankine"/AbstractUnitData["slug"]/"ft"^2, AbstractUnitData["\[HBar]"]/AbstractUnitData["slug"]/"ft"^2, "c"/"ft", 4 Pi, AbstractUnitData["me"]/AbstractUnitData["slug"], 1, 1]; -AbstractUnitSystem["EnglishUS"] = UnitSystem[(1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu" ) ("rankine"/AbstractUnitData["slugUS"]/"ftUS"^2), - AbstractUnitData["\[HBar]"]/AbstractUnitData["slugUS"]/"ftUS"^2, "c"/"ftUS", 4 Pi, AbstractUnitData["me"]/AbstractUnitData["slugUS"], 1, 1] - +AbstractUnitData["lbm"] = "g0"/"ft" +AbstractUnitData["lbmUS"] = "g0"/"ftUS" +AbstractUnitData["slug"] = "lb" AbstractUnitData["lbm"] +AbstractUnitData["slugUS"] = "lb" AbstractUnitData["lbmUS"] +AbstractUnitData["me"] = 2 "R\[Infinity]" "h"/"\[Alpha]"^2/"c" +AbstractUnitData["\[Mu]0"] = 2 "\[Alpha]" "h"/"c"/"e"^2 +AbstractUnitData["\[HBar]"] = "h"/(2 Pi) +AbstractUnitData["\[Delta]\[Mu]0"] = "\[Mu]0" - 4 Pi 10^-7 +AbstractUnitData["\[Mu]pe"] = "\[Mu]pu"/"\[Mu]eu" +AbstractUnitData["Ru"] = "NA" "kB" +AbstractUnitData["\[Alpha]L"] = 1/100/"c" +AbstractUnitData["\[Alpha]G"] = (AbstractUnitData["me"]/"mP")^2 +AbstractUnitData["\[HBar]1990"] = 2/"RK1990"/"KJ1990"^2/Pi +AbstractUnitData["\[HBar]2014"] = 2/"RK2014"/"KJ2014"^2/Pi +AbstractUnitData["me1990"] = 4 Pi "R\[Infinity]" AbstractUnitData["\[HBar]1990"]/"\[Alpha]"^2/"c" +AbstractUnitData["me2014"] = 4 Pi "R\[Infinity]" AbstractUnitData["\[HBar]2014"]/"\[Alpha]"^2/"c" AbstractUnitData["GG"] = "c" AbstractUnitData["\[HBar]"]/"mP"^2 AbstractUnitData["ms"] = "GMsun"/AbstractUnitData["GG"] AbstractUnitData["Js"] = AbstractUnitData["ms"] "au"^2/"day"^2; +AbstractUnitData["mf"] = 90/AbstractUnitData["lbm"]/Mass[AbstractUnitSystem["Metric"], AbstractUnitSystem["English"]] +AbstractUnitData["Jf"] = AbstractUnitData["mf"] (201.168/(14 "day"))^2 -AppendTo[UnitData, "GMsun" -> Around[1.32712442099 10^20, 9 10^9]] +EvalUnitData[x] := AbstractUnitData[x]/.Normal[UnitData] + +(*AppendTo[UnitData, "lbm" -> EvalUnitData["lbm"]] +AppendTo[UnitData, "lbmUS" -> EvalUnitData["lbmUS"]] +AppendTo[UnitData, "slug" -> EvalUnitData["slug"]] +AppendTo[UnitData, "slugUS" -> EvalUnitData["slugUS"]] +AppendTo[UnitData, "me" -> EvalUnitData["me"]] +AppendTo[UnitData, "\[Mu]0" -> EvalUnitData["\[Mu]0"]] (*\[TildeTilde]4\[Pi]*(1e-7+5.5e-17),exact charge*) +AppendTo[UnitData, "\[HBar]" -> EvalUnitData["\[HBar]"]] +AppendTo[UnitData, "\[Delta]\[Mu]0" -> EvalUnitData["\[Delta]\[Mu]0"]] +AppendTo[UnitData, "\[Mu]pe" -> EvalUnitData["\[Mu]pe"]] +AppendTo[UnitData, "Ru" -> EvalUnitData["Ru"]] +AppendTo[UnitData, "\[Alpha]L" -> EvalUnitData["\[Alpha]L"]] +AppendTo[UnitData, "\[Alpha]G" -> EvalUnitData["\[Alpha]G"]] +AppendTo[UnitData, "\[HBar]1990" -> EvalUnitData["\[HBar]1990"]] +AppendTo[UnitData, "\[HBar]2014" -> EvalUnitData["\[HBar]2014"]] +AppendTo[UnitData, "me1990" -> EvalUnitData["me1990"]] +AppendTo[UnitData, "me2014" -> EvalUnitData["me2014"]]*) (*AppendTo[UnitData, "GMearth" -> Around[398600441.8 10^6, 8 10^5]] AppendTo[UnitData, "GMjupiter" -> Around[1.26686534 10^17, 9 10^9]*) -AppendTo[UnitData, "au" -> 149597870.7 10^3] (*AppendTo[UnitData, "LD" -> 384402 10^3]*) -AppendTo[UnitData, "day" -> 60^2 24] (*AppendTo[UnitData, "pc" -> ("au" 648000/Pi)/.Normal[UnitData]] AppendTo[UnitData, "ly" -> (365.25 "c" "day")/.Normal[UnitData]] -AppendTo[UnitData, "GG" -> AbstractUnitData["GG"]/.Normal[UnitData]] -AppendTo[UnitData, "ms" -> AbstractUnitData["ms"]/.Normal[UnitData]] -AppendTo[UnitData, "Js" -> AbstractUnitData["Js"]/.Normal[UnitData]]*) +AppendTo[UnitData, "GG" -> EvalUnitData["GG"]] +AppendTo[UnitData, "ms" -> EvalUnitData["ms"]] +AppendTo[UnitData, "Js" -> EvalUnitData["Js"]]*) +Coupling["AbstractCoupling"] = Coupling["\[Alpha]G", "\[Alpha]", "\[Mu]eu", "\[Mu]pu"] +Coupling["AbstractUniverse"] = Coupling[AbstractUnitData["\[Alpha]G"], "\[Alpha]", "\[Mu]eu", "\[Mu]pu"] +Coupling["StandardModel"] = Coupling["AbstractUniverse"] /. Normal[UnitData] + +AbstractUnitSystem["AbstractUnits"] = UnitSystem["kB", "\[HBar]", "c", "\[Mu]0", "me", "\[Lambda]", "\[Alpha]L"] +AbstractUnitSystem["AbstractUnits1"] = UnitSystem["kB1", "\[HBar]1", "c1", "\[Mu]01", "me1", "\[Lambda]1", "\[Alpha]L1"] +AbstractUnitSystem["AbstractUnits2"] = UnitSystem["kB2", "\[HBar]2", "c2", "\[Mu]02", "me2", "\[Lambda]2", "\[Alpha]L2"] + +AbstractUnitSystem["Gauss"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 4 Pi, AbstractUnitData["\[Alpha]L"]] +AbstractUnitSystem["LorentzHeaviside"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 1, AbstractUnitData["\[Alpha]L"]] +AbstractUnitSystem["Thomson"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 4 Pi, 1/2]; +AbstractUnitSystem["Kennelly"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", 10^-7, AbstractUnitData["me"], 4 Pi] +AbstractUnitSystem["ESU"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", (100 "c")^-2, 1000 AbstractUnitData["me"], 4 Pi]; +AbstractUnitSystem["ESU2019"] = UnitSystem[10^7 "kB", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 10^3 AbstractUnitData["\[Mu]0"]/"c"^2, 1000 AbstractUnitData["me"]] +AbstractUnitSystem["EMU"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 4 Pi]; +AbstractUnitSystem["EMU2019"] = UnitSystem[10^7 "kB", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 10^7 AbstractUnitData["\[Mu]0"], 1000 AbstractUnitData["me"]] +AbstractUnitSystem["MTS"] = UnitSystem[10^6 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 1000 AbstractUnitData["\[HBar]"], "c", 4 Pi/10^4, AbstractUnitData["me"]/1000]; +AbstractUnitSystem["Mixed"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", AbstractUnitData["\[Mu]0"], AbstractUnitData["me"]]; +AbstractUnitSystem["Metric"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", 4 Pi 10^-7, AbstractUnitData["me"]]; +AbstractUnitSystem["SI1976"] = UnitSystem[8314.32 AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", 4 Pi 10^-7, AbstractUnitData["me"]]; +AbstractUnitSystem["SI2019"] = UnitSystem["kB", AbstractUnitData["\[HBar]"], "c", AbstractUnitData["\[Mu]0"], AbstractUnitData["me"]]; + +AbstractUnitSystem["CODATA"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me2014"]/"\[Mu]eu", AbstractUnitData["\[HBar]2014"], "c", 2 "\[Alpha]" AbstractUnitData["RK2014"]/"c", AbstractUnitData["me2014"]]; +AbstractUnitSystem["Conventional"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me1990"]/"\[Mu]eu", AbstractUnitData["\[HBar]1990"], "c", 2 "\[Alpha]" AbstractUnitData["RK1990"]/"c", AbstractUnitData["me1990"]]; +AbstractUnitSystem["English"] = UnitSystem["kB" "rankine"/AbstractUnitData["slug"]/"ft"^2, AbstractUnitData["\[HBar]"]/AbstractUnitData["slug"]/"ft"^2, "c"/"ft", 4 Pi, AbstractUnitData["me"]/AbstractUnitData["slug"]]; +AbstractUnitSystem["EnglishUS"] = UnitSystem[(1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu" ) ("rankine"/AbstractUnitData["slugUS"]/"ftUS"^2), + AbstractUnitData["\[HBar]"]/AbstractUnitData["slugUS"]/"ftUS"^2, "c"/"ftUS", 4 Pi, AbstractUnitData["me"]/AbstractUnitData["slugUS"]] AbstractUnitSystem["IAU"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu"/AbstractUnitData["Js"], AbstractUnitData["\[HBar]"]/"day"/AbstractUnitData["Js"], "day" "c"/"au", - 4 Pi 10^-7 "day"^2/AbstractUnitData["Js"], AbstractUnitData["me"]/AbstractUnitData["ms"], 1, 1] + 4 Pi 10^-7 "day"^2/AbstractUnitData["Js"], AbstractUnitData["me"]/AbstractUnitData["ms"]] +AbstractUnitSystem["FFF"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu" "rankine"/AbstractUnitData["Jf"], AbstractUnitData["\[HBar]"]/(14 "day")/AbstractUnitData["Jf"], 14 "day" "c"/201.168, 0, AbstractUnitData["me"]/AbstractUnitData["mf"]] -AbstractUnitData["mf"] = 90/AbstractUnitData["lbm"]/Mass[AbstractUnitSystem["Metric"], AbstractUnitSystem["English"]] -AbstractUnitData["Jf"] = AbstractUnitData["mf"] (201.168/(14 "day"))^2 -AbstractUnitSystem["FFF"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu" "rankine"/AbstractUnitData["Jf"], AbstractUnitData["\[HBar]"]/(14 "day")/AbstractUnitData["Jf"], 14 "day" "c"/201.168, 0, AbstractUnitData["me"]/AbstractUnitData["mf"], 1, 1] +AbstractUnitSystem["Planck"] = UnitSystem[1,1,1,1,Sqrt[4 Pi AbstractUnitData["\[Alpha]G"]],1,1] +AbstractUnitSystem["PlanckGauss"] = UnitSystem[1, 1, 1, 4 Pi, Sqrt[AbstractUnitData["\[Alpha]G"]]] +AbstractUnitSystem["Stoney"] = UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"]] +AbstractUnitSystem["Hartree"] = UnitSystem[1,1,1/"\[Alpha]",4 Pi "\[Alpha]"^2,1] +AbstractUnitSystem["Rydberg"] = UnitSystem[1,1,2/"\[Alpha]",Pi "\[Alpha]"^2,1/2] +AbstractUnitSystem["Schrodinger"] = UnitSystem[1, 1, 1/"\[Alpha]", 4 Pi "\[Alpha]"^2, Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"]] +AbstractUnitSystem["Electronic"] = UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, 1] +AbstractUnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1, 1, 1, "1"] +AbstractUnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1, 1, 1, "1"] +AbstractUnitSystem["QCD"] = UnitSystem[1, 1, 1, 1, 1/AbstractUnitData["\[Mu]pe"]] +AbstractUnitSystem["QCDGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1/AbstractUnitData["\[Mu]pe"]] +AbstractUnitSystem["QCDoriginal"] = UnitSystem[1, 1, 1, 4 Pi "\[Alpha]", 1/AbstractUnitData["\[Mu]pe"]] +UnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1] +UnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1] +Map[(UnitSystem[#] = AbstractUnitSystem[#] /. Normal[UnitData]) &, +{"AbstractUnits","AbstractUnits1","AbstractUnits2","Gauss","LorentzHeaviside","Thomson","Kennelly","ESU","ESU2019","EMU","EMU2019","MTS","Mixed","Metric","SI1976","SI2019","CODATA","Conventional","English","EnglishUS","IAU","FFF","Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","QCD","QCDGauss","QCDoriginal"}] + +(*Map[Set[Unevaluated[#],UnitData[ToString[#]]] &, {g0,ft,ftUS,lb,rankine,\[CapitalDelta]\[Nu]Cs,Kcd,mP,NA,kB,h,c,e,\[Mu]eu,\[Mu]pu,\[Alpha]inv,R\[Infinity],RK1990,RK2014,KJ1990,KJ2014}]*) +(*Map[Set[Unevaluated[#],UnitData[ToString[#]]] &, {lbm,lbmUS,slug,slugUS,kelvin,atm,kcalth,kcal4,kcla10,kcal20,kcalm,kcalit,calth,cal4,cal10,cal20,calm,calit,kcal,cal,me,\[Mu]0,\[HBar],\[Delta]\[Mu]0,\[Mu]pe,Ru,\[Alpha]L,\[Alpha]G,\[HBar]1990,\[HBar]2014,me1990,me2014}]*) +(*Map[Set[Unevaluated[#],UnitData[ToString[#]]] &, {GMsun, GMearth, GMjupiter, au, LD, day, pc, ly, GG, ms, Js, mf, Jf}]*) + +StandardModel = Coupling["StandardModel"] +AbstractCoupling = Coupling["AbstractCoupling"] +AbstractUniverse = Coupling["AbstractUniverse"] + +AbstractUnits = AbstractUnitSystem["AbstractUnits"] +AbstractUnits1 = AbstractUnitSystem["AbstractUnits1"] +AbstractUnits2 = AbstractUnitSystem["AbstractUnits2"] AbstractMetric = AbstractUnitSystem["Metric"] AbstractSI2019 = AbstractUnitSystem["SI2019"] AbstractCGS = AbstractUnitSystem["Gauss"] @@ -258,35 +287,6 @@ AbstractEnglishUS = AbstractUnitSystem["EnglishUS"] AbstractIAU = AbstractUnitSystem["IAU"] AbstractFFF = AbstractUnitSystem["FFF"] -Coupling["StandardModel"] = AbstractUniverse /. Normal[UnitData] -Map[(UnitSystem[#] = AbstractUnitSystem[#] /. Normal[UnitData]) &, -{"Gauss","LorentzHeaviside","Thomson","Kennelly","ESU","ESU2019","EMU","MTS","Mixed","Metric","SI1976","SI2019","CODATA","Conventional","English","EnglishUS","IAU","FFF"}] - -Map[Set[Unevaluated[#],UnitData[ToString[#]]] &, {GMsun, GMearth, GMjupiter, au, LD, day, pc, ly, GG, ms, Js, mf, Jf}] - -AbstractUnitSystem["Planck"] = UnitSystem[1,1,1,1,Sqrt[4 Pi AbstractUnitData["\[Alpha]G"]],1,1] - -AbstractUnitSystem["PlanckGauss"] = UnitSystem[1, 1, 1, 4 Pi, Sqrt[AbstractUnitData["\[Alpha]G"]], 1, 1] -AbstractUnitSystem["Stoney"] = UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"], 1, 1] -AbstractUnitSystem["Hartree"] = UnitSystem[1,1,1/"\[Alpha]",4 Pi "\[Alpha]"^2,1,1,1] -AbstractUnitSystem["Rydberg"] = UnitSystem[1,1,2/"\[Alpha]",Pi "\[Alpha]"^2,1/2,1,1] - -AbstractUnitSystem["Schrodinger"] = UnitSystem[1, 1, 1/"\[Alpha]", 4 Pi "\[Alpha]"^2, - Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"], 1, 1] -AbstractUnitSystem["Electronic"] = UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, 1, 1, 1] -AbstractUnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1, 1, 1, "1"] -AbstractUnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1, 1, 1, "1"] -AbstractUnitSystem["QCD"] = UnitSystem[1, 1, 1, 1, 1/AbstractUnitData["\[Mu]pe"], 1, 1] -AbstractUnitSystem["QCDGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1/AbstractUnitData["\[Mu]pe"], 1, 1] -AbstractUnitSystem["QCDoriginal"] = UnitSystem[1, 1, 1, 4 Pi "\[Alpha]", 1/AbstractUnitData["\[Mu]pe"], 1, 1] - -UnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1, 1, 1] -UnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1, 1, 1] - -Map[(UnitSystem[#] = AbstractUnitSystem[#] /. Normal[UnitData]) &, -{"Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","QCD","QCDGauss","QCDoriginal"}] - -StandardModel = Coupling["StandardModel"] Gauss = UnitSystem["Gauss"] LorentzHeaviside = UnitSystem["LorentzHeaviside"] Thomson = UnitSystem["Thomson"] @@ -300,6 +300,7 @@ Mixed = UnitSystem["Mixed"] Metric = UnitSystem["Metric"] SI1976 = UnitSystem["SI1976"] SI2019 = UnitSystem["SI2019"] + CODATA = UnitSystem["CODATA"] Conventional = UnitSystem["Conventional"] English = UnitSystem["English"] @@ -307,16 +308,6 @@ EnglishUS = UnitSystem["EnglishUS"] IAU = UnitSystem["IAU"] FFF = UnitSystem["FFF"] -UnitSystem["SI"] = UnitSystem["SI2019"] -UnitSystem["MKS"] = UnitSystem["Metric"] -UnitSystem["CGS"] = UnitSystem["Gauss"] -UnitSystem["CGS2019"] = UnitSystem["EMU2019"] -UnitSystem["CGSm"] = UnitSystem["EMU"] -UnitSystem["CGSe"] = UnitSystem["ESU"] -UnitSystem["HLU"] = UnitSystem["LorentzHeaviside"] -{SI,MKS} = {SI2019, Metric} -{CGS, CGS2019, CGSm, CGSe, HLU} = {Gauss, EMU2019, EMU, ESU, LorentzHeaviside}; - PlanckGauss = UnitSystem["PlanckGauss"] Stoney = UnitSystem["Stoney"] Schrodinger = UnitSystem["Schrodinger"] @@ -326,137 +317,135 @@ QCD = UnitSystem["QCD"] QCDGauss = UnitSystem["QCDGauss"] QCDoriginal = UnitSystem["QCDoriginal"] -ElectronMass[Planck, c_Coupling] := Sqrt[4 \[Pi] GravityCoupling[c]]; -ElectronMass[PlanckGauss, c_Coupling] := Sqrt[GravityCoupling[c]]; -ElectronMass[UnitSystem[_, _, _, _, Sqrt[\[Alpha]G \[Alpha]inv], ___], - c_Coupling] := Sqrt[GravityCoupling[c]/FineStructure[c];] -ElectronMass[UnitSystem[_, _, _, _, 1/\[Mu]pe, ___], c_Coupling] := 1/ProtonElectron[c]; -Permeability[UnitSystem[_, _, _, 4 \[Pi]/\[Alpha]inv^2, ___], - c_Coupling] := 4 \[Pi] FineStructure[c]^2; -Permeability[UnitSystem[_, _, _, \[Pi]/\[Alpha]inv^2, ___], - c_Coupling] := \[Pi] FineStructure[c]^2; -LightSpeed[UnitSystem[_, _, \[Alpha]inv, ___], c_Coupling] := 1/FineStructure[c]; -LightSpeed[UnitSystem[_, _, 2 \[Alpha]inv, ___], c_Coupling] := 2/FineStructure[c]; -PlanckReduced[UnitSystem[_, \[Alpha]inv, ___], c_Coupling] := 1/FineStructure[c]; - -ElectronMass[u : UnitSystem[_, _, c, _, me, ___], c_Coupling] := - ElectronMass[Planck[u], c]; -ElectronMass[UnitSystem[_, _, 100 c, _, 1000 me, ___], c_Coupling] := - 1000 ElectronMass[SI, c]; -ElectronMass[UnitSystem[_, _, c, _, me/1000, ___], c_Coupling] := ElectronMass[SI, c]/1000; -ElectronMass[u : UnitSystem[_, _, c, _, me2014, ___], c_Coupling] := - ElectronMass[Planck[u], c]; -ElectronMass[u : UnitSystem[_, _, c, \[Mu]0, me1990, ___], - c_Coupling] := ElectronMass[Planck[u], c]; -ElectronMass[UnitSystem[_, _, c/ftUS, _, me/slug, ___], c_Coupling] := - ElectronMass[SI, c]/slug; -Permeability[UnitSystem[_, _, _, \[Mu]0, ___], c_Coupling] := FineStructure[c] 2 h/c/e^2; -Permeability[ESU2019, u_Coupling] := 10^3 Permeability[SI, u]/c^2; -Permeability[EMU2019, c_Coupling] := 10^7 Permeability[SI, c]; -Permeability[CODATA, u_Coupling] := 2 RK2014 FineStructure[u]/c; -Permeability[Conventional, u_Coupling] := 2 RK1990 FineStructure[u]/c; +{SI,MKS,CGS, CGS2019, CGSm, CGSe, HLU} = {SI2019, Metric, Gauss, EMU2019, EMU, ESU, LorentzHeaviside} +AbstractUnitSystem["SI"] := AbstractUnitSystem["SI2019"] +AbstractUnitSystem["MKS"] := AbstractUnitSystem["Metric"] +AbstractUnitSystem["CGS"] := AbstractUnitSystem["Gauss"] +AbstractUnitSystem["CGS2019"] := AbstractUnitSystem["EMU2019"] +AbstractUnitSystem["CGSm"] := AbstractUnitSystem["EMU"] +AbstractUnitSystem["CGSe"] := AbstractUnitSystem["ESU"] +AbstractUnitSystem["HLU"] := AbstractUnitSystem["LorentzHeaviside"] +UnitSystem["SI"] := UnitSystem["SI2019"] +UnitSystem["MKS"] := UnitSystem["Metric"] +UnitSystem["CGS"] := UnitSystem["Gauss"] +UnitSystem["CGS2019"] := UnitSystem["EMU2019"] +UnitSystem["CGSm"] := UnitSystem["EMU"] +UnitSystem["CGSe"] := UnitSystem["ESU"] +UnitSystem["HLU"] := UnitSystem["LorentzHeaviside"] + +ElectronMass[UnitSystem["Planck"], c_Coupling] := Sqrt[4 Pi GravityCoupling[c]]; +ElectronMass[UnitSystem["PlanckGauss"], c_Coupling] := Sqrt[GravityCoupling[c]]; +ElectronMass[UnitSystem[_, _, _, _, Sqrt[EvalUnitData["\[Alpha]G"]/UnitData["\[Alpha]"]], ___], c_Coupling] := Sqrt[GravityCoupling[c]/FineStructure[c];] +ElectronMass[UnitSystem[_, _, _, _, 1/UnitData["\[Mu]pe"], ___], c_Coupling] := 1/ProtonElectron[c]; +Permeability[UnitSystem[_, _, _, 4 Pi UnitData["\[Alpha]"]^2, ___], c_Coupling] := 4 Pi FineStructure[c]^2; +Permeability[UnitSystem[_, _, _, Pi UnitData["\[Alpha]"]^2, ___], c_Coupling] := Pi FineStructure[c]^2; +LightSpeed[UnitSystem[_, _, 1/UnitData["\[Alpha]"], ___], c_Coupling] := 1/FineStructure[c]; +LightSpeed[UnitSystem[_, _, 2/UnitData["\[Alpha]"], ___], c_Coupling] := 2/FineStructure[c]; +PlanckReduced[UnitSystem[_, 1/UnitData["\[Alpha]"], ___], c_Coupling] := 1/FineStructure[c]; + +ElectronMass[u : UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me"], ___], c_Coupling] := ElectronMass[Planck[u], c]; +ElectronMass[UnitSystem[_, _, 100 UnitData["c"], _, 1000 EvalUnitData["me"], ___], c_Coupling] := 1000 ElectronMass[UnitSystem["SI2019"], c]; +ElectronMass[UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me"]/1000, ___], c_Coupling] := ElectronMass[UnitSystem["SI2019"], c]/1000; +ElectronMass[u : UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me2014"], ___], c_Coupling] := ElectronMass[Planck[u], c]; +ElectronMass[u : UnitSystem[_, _, UnitData["c"], EvalUnitData["\[Mu]0"], EvalUnitData["me1990"], ___], c_Coupling] := ElectronMass[Planck[u], c]; +ElectronMass[UnitSystem[_, _, UnitData["c"]/UnitData["ftUS"], _, EvalUnitData["me"]/EvalUnitData["slug"], ___], c_Coupling] := ElectronMass[UnitSystem["SI2019"], c]/EvalUnitData["slug"]; +Permeability[UnitSystem[_, _, _, EvalUnitData["\[Mu]0"], ___], c_Coupling] := FineStructure[c] 2 UnitData["h"]/UnitData["c"]/UnitData["e"]^2; +Permeability[UnitSystem["ESU2019"], u_Coupling] := 10^3 Permeability[UnitSystem["SI2019"], u]/UnitData["c"]^2; +Permeability[UnitSystem["EMU2019"], u_Coupling] := 10^7 Permeability[UnitSystem["SI2019"], u]; +Permeability[UnitSystem["CODATA"], u_Coupling] := 2 UnitData["RK2014"] FineStructure[u]/UnitData["c"]; +Permeability[UnitSystem["Conventional"], u_Coupling] := 2 UnitData["RK1990"] FineStructure[u]/UnitData["c"]; MolarMass[UnitSystem[1, ___]] = 1; -MolarMass[u:UnitSystem[kB, ___]] := MolarMass[u, Universe[u]]; -MolarMass[u:UnitSystem[kB, ___], c_Coupling] := NA ElectronMass[u, c]/ElectronUnit[c]; -MolarMass[u:UnitSystem[10^7 kB, ___]] := MolarMass[u, Universe[u]]; -MolarMass[UnitSystem[10^7 kB, ___], c_Coupling] := 1000 MolarMass[SI2019, c]; -MolarMass[u:UnitSystem[10^3 kB, ___]] := MolarMass[u, Universe[u]]; -MolarMass[UnitSystem[10^3 kB, ___], c_Coupling] := MolarMass[SI2019, c]/1000; -MolarMass[UnitSystem[kB_, ___]] := MolarMass[CGS]/1000; -MolarMass[UnitSystem[Boltzmann[MTS], ___]] := MolarMass[CGS]/10^6; -MolarMass[UnitSystem[Boltzmann[CGS], ___]] := MolarMass[Natural]; -MolarMass[UnitSystem[Boltzmann[FFF], ___]] := MolarMass[Natural]; -MolarMass[u:UnitSystem[Boltzmann[English], ___]] := MolarMass[u, Universe[u]]; -MolarMass[u:UnitSystem[Boltzmann[English], ___], c_Coupling] := 1000 MolarMass[SI2019,c] -MolarMass[UnitSystem[Boltzmann[EnglishUS], ___]] := MolarMass[Natural]; -MolarMass[UnitSystem[Boltzmann[IAU], ___]] := 1/1000 ms; +MolarMass[u:UnitSystem[UnitData["kB"], ___]] := MolarMass[u, Universe[u]]; +MolarMass[u:UnitSystem[UnitData["kB"], ___], c_Coupling] := UnitData["NA"] ElectronMass[u, c]/ElectronUnit[c]; +MolarMass[u:UnitSystem[10^7 UnitData["kB"], ___]] := MolarMass[u, Universe[u]]; +MolarMass[UnitSystem[10^7 UnitData["kB"], ___], c_Coupling] := 1000 MolarMass[UnitSystem["SI2019"], c]; +MolarMass[u:UnitSystem[10^3 UnitData["kB"], ___]] := MolarMass[u, Universe[u]]; +MolarMass[UnitSystem[10^3 UnitData["kB"], ___], c_Coupling] := MolarMass[UnitSystem["SI2019"], c]/1000; +MolarMass[UnitSystem[kB_, ___]] := MolarMass[UnitSystem["CGS"]]/1000; +MolarMass[UnitSystem[Boltzmann[UnitSystem["MTS"]], ___]] := MolarMass[UnitSystem["CGS"]]/10^6; +MolarMass[UnitSystem[Boltzmann[UnitSystem["CGS"]], ___]] := MolarMass[UnitSystem["Natural"]]; +MolarMass[UnitSystem[Boltzmann[UnitSystem["FFF"]], ___]] := MolarMass[UnitSystem["Natural"]]; +MolarMass[u:UnitSystem[Boltzmann[UnitSystem["English"]], ___]] := MolarMass[u, Universe[u]]; +MolarMass[u:UnitSystem[Boltzmann[UnitSystem["English"]], ___], c_Coupling] := 1000 MolarMass[UnitSystem["SI2019"],c] +MolarMass[UnitSystem[Boltzmann[UnitSystem["EnglishUS"]], ___]] := MolarMass[UnitSystem["Natural"]]; +MolarMass[UnitSystem[Boltzmann[UnitSystem["IAU"]], ___]] = EvalUnitData["ms"]/1000; LuminousEfficacy[UnitSystem[1, ___]] = 1 -LuminousEfficacy[u : UnitSystem[_?NumericQ, ___]] := Power[Kcd, SI2019, u] - -Universe[_] = AbstractUniverse -(*Universe[AbstractUnits1] = AbstractUniverse -Universe[AbstractUnits2] = AbstractUniverse -Universe[UnitSystem["kB", ___]] = AbstractUniverse -Universe[UnitSystem[10^7 "kB", ___]] = AbstractUniverse -Universe[UnitSystem[10^3 "kB", ___]] = AbstractUniverse -Universe[UnitSystem[Boltzmann[AbstractUnitSystem["MTS"]], ___]] = AbstractUniverse -Universe[UnitSystem[Boltzmann[AbstractUnitSystem["CGS"]], ___]] = AbstractUniverse -(*Universe[UnitSystem[Boltzmann[AbstractUnitSystem["FFF"]], ___]] = AbstractUniverse*) -Universe[UnitSystem[Boltzmann[AbstractUnitSystem["English"]], ___]] = AbstractUniverse -Universe[UnitSystem[Boltzmann[AbstractUnitSystem["EnglishUS"]], ___]] = AbstractUniverse -Universe[UnitSystem[Boltzmann[AbstractUnitSytem["IAU"]], ___]] = AbstractUniverse*) -Map[(Universe[AbstractUnitSystem[#]] = AbstractUniverse) &, -{"Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","Natural","NaturalGauss","QCD","QCDGauss","QCDoriginal"}] - -MolarMass[AbstractUnits] = "Mu" -MolarMass[AbstractUnits1] = "Mu1" -MolarMass[AbstractUnits2] = "Mu2" +LuminousEfficacy[u : UnitSystem[_?NumericQ, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] +LuminousEfficacy[u : UnitSystem[_Around, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] + +Universe[_] = Coupling["AbstractUniverse"] + +MolarMass[AbstractUnitSystem["AbstractUnits"]] = "Mu" +MolarMass[AbstractUnitSystem["AbstractUnits1"]] = "Mu1" +MolarMass[AbstractUnitSytem["AbstractUnits2"]] = "Mu2" MolarMass[u : UnitSystem["kB", ___]] := MolarMass[u,Universe[u]] MolarMass[u : UnitSystem["kB", ___], c_Coupling] := "NA" ElectronMass[AbstractUnitSystem["SI2019"],c]/ElectronUnit[c] MolarMass[u : UnitSystem[10^7 "kB", ___]] := MolarMass[u, Universe[u]]; MolarMass[UnitSystem[10^7 "kB", ___], c_Coupling] := 1000 MolarMass[AbstractUnitSystem["SI2019"], c]; MolarMass[u : UnitSystem[10^3 "kB", ___]] := MolarMass[u, Universe[u]]; -MolarMass[UnitSystem[10^3 "kB", ___], c_Coupling] := MolarMass[AbstractSI2019, c]/1000; -MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["MTS"]], ___]] := MolarMass[CGS]/10^6; -MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["CGS"]], ___]] := MolarMass[Natural]; -(*MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["FFF"]], ___]] := MolarMass[Natural];*) +MolarMass[UnitSystem[10^3 "kB", ___], c_Coupling] := MolarMass[AbstractUnitSystem["SI2019"], c]/1000; +MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["MTS"]], ___]] := MolarMass[UnitSystem["CGS"]]/10^6; +MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["CGS"]], ___]] := MolarMass[UnitSystem["Natural"]]; +MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["FFF"]], ___]] := MolarMass[UnitSystem["Natural"]]; MolarMass[u : UnitSystem[Boltzmann[AbstractUnitSystem["English"]], ___]] := MolarMass[u, Universe[u]]; MolarMass[u : UnitSystem[Boltzmann[AbstractUnitSystem["English"]], ___], c_Coupling] := 1000 MolarMass[AbstractUnitSystem["SI2019"], c]; -MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["EnglishUS"]], ___]] := MolarMass[Natural]; -MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["IAU"]], ___]] := 1/1000 "ms"; - -LuminousEfficacy[_] = "Kcd" -LuminousEfficacy[AbstractUnits1] = "Kcd1" -LuminousEfficacy[AbstractUnits2] = "Kcd2" - -Kilograms[m_] := Kilograms[m, English]; -Kilograms[m_, u_UnitSystem] := Mass[m, Metric, u]; -Slugs[m_] := Slugs[m, Metric]; -Slugs[m_, u_UnitSystems] := Mass[m, English, u]; -Feet[d_] := Feet[d, Metric]; -Feet[d_, u_UnitSystem] := Length[d, English, u]; -Meters[d_] := Meters[d, English]; -Meters[d_, u_UnitSystem] := Length[d, Metric, u]; +MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["EnglishUS"]], ___]] := MolarMass[UnitSystem["Natural"]]; +MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["IAU"]], ___]] := 1/1000 AbstractUnitData["ms"]; + +LuminousEfficacy[AbstractUnitSystem["AbstractUnits1"]] = "Kcd1" +LuminousEfficacy[AbstractUnitSystem["AbstractUnits2"]] = "Kcd2" +LuminousEfficacy[u_UnitSystem] := Power["Kcd", AbstractUnitSystem["SI2019"], u] + +AbstractUnitData["Mu"] = MolarMass[AbstractUnitSystem["SI2019"]] + +Kilograms[m_] := Kilograms[m, UnitSystem["English"]]; +Kilograms[m_, u_UnitSystem] := Mass[m, UnitSystem["Metric"], u]; +Slugs[m_] := Slugs[m, UnitSystem["Metric"]]; +Slugs[m_, u_UnitSystems] := Mass[m, UnitSystem["English"], u]; +Feet[d_] := Feet[d, UnitSystem["Metric"]]; +Feet[d_, u_UnitSystem] := Length[d, UnitSystem["English"], u]; +Meters[d_] := Meters[d, UnitSystem["English"]]; +Meters[d_, u_UnitSystem] := Length[d, UnitSystem["Metric"], u]; (* IAU to SI *) UnitSystem /: - Length[u : UnitSystem[_, _, c, ___], - s : UnitSystem[_, _, day c/au, ___]] := Length[u, s, 1/au]; -Time[u : UnitSystem[_, _, c, ___], - s : UnitSystem[_, _, day c/au, ___]] := Time[u, s, 1/day]; + Length[u : UnitSystem[_, _, UnitData["c"], ___], + s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Length[u, s, 1/UnitData["au"]]; +Time[u : UnitSystem[_, _, UnitData["c"], ___], + s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Time[u, s, 1/UnitData["day"]]; (* SI to IAU *) UnitSystem /: - Length[u : UnitSystem[_, _, day c/au, ___], - s : UnitSystem[_, _, c, ___]] := Length[u, s, au]; -Time[u : UnitSystem[_, _, day c/au, ___], - s : UnitSystem[_, _, c, ___]] := Time[u, s, day]; + Length[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], + s : UnitSystem[_, _, UnitData["c"], ___]] := Length[u, s, UnitData["au"]]; +Time[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], + s : UnitSystem[_, _, UnitData["c"], ___]] := Time[u, s, UnitData["day"]]; (* IAU to CGS *) UnitSystem /: - Length[u : UnitSystem[_, _, 100 c, ___], - s : UnitSystem[_, _, day c/au, ___]] := Length[u, s, 1/au]; -Time[u : UnitSystem[_, _, 100 c, ___], - s : UnitSystem[_, _, day c/au, ___]] := Time[u, s, 1/day]; + Length[u : UnitSystem[_, _, 100 UnitData["c"], ___], + s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Length[u, s, 1/UnitData["au"]]; +Time[u : UnitSystem[_, _, 100 UnitData["c"], ___], + s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Time[u, s, 1/UnitData["day"]]; (* CGS to IAU *) UnitSystem /: - Length[u : UnitSystem[_, _, day c/au, ___], - s : UnitSystem[_, _, 100 c, ___]] := Length[u, s, au]; -Time[u : UnitSystem[_, _, day c/au, ___], - s : UnitSystem[_, _, 100 c, ___]] := Time[u, s, day]; + Length[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], + s : UnitSystem[_, _, 100 UnitData["c"], ___]] := Length[u, s, UnitData["au"]]; +Time[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], + s : UnitSystem[_, _, 100 UnitData["c"], ___]] := Time[u, s, UnitData["day"]]; (* IAU to English *) UnitSystem /: - Length[u : UnitSystem[_, _, c/ft, ___], - s : UnitSystem[_, _, day c/au, ___]] := Length[u, s, ft/au]; -Time[u : UnitSystem[_, _, c/ft, ___], - s : UnitSystem[_, _, day c/au, ___]] := Time[u, s, 1/day]; + Length[u : UnitSystem[_, _, UnitData["c"]/UnitData["ft"], ___], + s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Length[u, s, UnitData["ft"]/UnitData["au"]]; +Time[u : UnitSystem[_, _, UnitData["c"]/UnitData["ft"], ___], + s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Time[u, s, 1/UnitData["day"]]; (* English to IAU *) UnitSystem /: - Length[u : UnitSystem[_, _, day c/au, ___], - s : UnitSystem[_, _, c/ft, ___]] := Length[u, s, au/ft]; -Time[u : UnitSystem[_, _, day c/au, ___], - s : UnitSystem[_, _, c/ft, ___]] := Time[u, s, day]; + Length[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], + s : UnitSystem[_, _, UnitData["c"]/UnitData["ft"], ___]] := Length[u, s, UnitData["au"]/UnitData["ft"]]; +Time[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], + s : UnitSystem[_, _, UnitData["c"]/UnitData["ft"], ___]] := Time[u, s, UnitData["day"]]; UnitSystem /: Length[u_UnitSystem, s_UnitSystem] := Length[u, s, 1]; UnitSystem /: Length[u_UnitSystem, s_UnitSystem, l_] := @@ -629,7 +618,7 @@ LuminousExposure[u_UnitSystem, s_UnitSystem] := (* Physics *) -Hyperfine[u_UnitSystem] := Frequency[\[CapitalDelta]\[Nu]Cs, u]; +Hyperfine[u_UnitSystem] := Frequency[UnitData["\[CapitalDelta]\[Nu]Cs"], u]; Map[(#[u_UnitSystem] := #[u, Universe[u]]) &, {Avogadro, AtomicMass, ProtonMass, Einstein, Universal, Stefan, RadiationDensity, @@ -640,17 +629,17 @@ Avogadro[u_UnitSystem, c_Coupling] := MolarMass[u, c] ElectronUnit[c]/ElectronMass[u, c]; AtomicMass[u_UnitSystem, c_Coupling] := ElectronMass[u, c]/ElectronUnit[c]; ProtonMass[u_UnitSystem, c_Coupling] := ProtonElectron[c] ElectronMass[u, c]; -Einstein[u_UnitSystem, c_Coupling] := (8 \[Pi] Newton[u, c])/LightSpeed[u, c]^4; +Einstein[u_UnitSystem, c_Coupling] := (8 Pi Newton[u, c])/LightSpeed[u, c]^4; Universal[u_UnitSystem, c_Coupling] := Boltzmann[u, c] Avogadro[u, c]; -Stefan[u_UnitSystem, c_Coupling] := (2 \[Pi]^5 Boltzmann[u, c]^4)/( +Stefan[u_UnitSystem, c_Coupling] := (2 Pi^5 Boltzmann[u, c]^4)/( 15 Planck[u, c]^3 LightSpeed[u, c]^2); RadiationDensity[u_UnitSystem, c_Coupling] := (4 Stefan[u, c])/LightSpeed[u, c]; Permittivity[u_UnitSystem, c_Coupling] := (1/Permeability[u, c]) (LightSpeed[u, c] Lorentz[u]^2); Coulomb[u_UnitSystem, c_Coupling] := - Rationalization[u]/4 \[Pi]/ Permittivity[u]; + Rationalization[u]/(4 Pi)/ Permittivity[u]; BiotSavart[u_UnitSystem, c_Coupling] := - Permeability[u, c] Lorentz[u] (Rationalization[u]/4 \[Pi]); + Permeability[u, c] Lorentz[u] (Rationalization[u]/(4 Pi)); Ampere[u_UnitSystem] := Lorentz[u] BiotSavart[u]; Impedance[u_UnitSystem, c_Coupling] := @@ -673,42 +662,42 @@ Magneton[u_UnitSystem, c_Coupling] := (* more *) (* -\[Kappa] = Einstein[SI2019]; -\[Sigma] = Stefan[SI2019];(**) -\[Mu]B = Magneton[SI2019];(**) -\[CurlyEpsilon]0 = Permittivity[SI2019];(**) - -ke = Coulomb[SI2019];(**) -mp = ProtonMass[SI2019]; -mu = AtomicMass[SI2019]; -Mu = MolarMass[SI2019]; -\|01d509 = Faraday[SI2019];(**) -\[CapitalPhi]0 = MagneticFlux[SI2019];(**) -Z0 = Impedance[SI2019];(**) - -G0 = Conductance[SI2019];(**) -Eh = Hartree[SI2019]; -a0 = Bohr[SI2019]; -re = ElectronRadius[SI2019]; -RK = Klitzing[SI2019];(**) -KJ = Josephson[SI2019];(**) +\[Kappa] = Einstein[UnitSystem["SI2019"]]; +\[Sigma] = Stefan[UnitSystem["SI2019"]];(**) +\[Mu]B = Magneton[UnitSystem["SI2019"]];(**) +\[CurlyEpsilon]0 = Permittivity[UnitSystem["SI2019"]];(**) + +ke = Coulomb[UnitSystem["SI2019"]];(**) +mp = ProtonMass[UnitSystem["SI2019"]]; +mu = AtomicMass[UnitSystem["SI2019"]]; +Mu = MolarMass[UnitSytem["SI2019"]]; +\|01d509 = Faraday[UnitSystem["SI2019"]];(**) +\[CapitalPhi]0 = MagneticFlux[UnitSystem["SI2019"]];(**) +Z0 = Impedance[UnitSystem["SI2019"]];(**) + +G0 = Conductance[UnitSystem["SI2019"]];(**) +Eh = Hartree[UnitSystem["SI2019"]]; +a0 = Bohr[UnitSystem["SI2019"]]; +re = ElectronRadius[UnitSystem["SI2019"]]; +RK = Klitzing[UnitSystem["SI2019"]];(**) +KJ = Josephson[UnitSystem["SI2019"]];(**) {RH, Ry} = {R\[Infinity] mp/(me + mp), h c R\[Infinity]}; -\[ScriptL]P = Length[PlanckGauss, SI2019]; -tP = Time[PlanckGauss, SI2019]; -TP = Temperature[PlanckGauss, SI2019]; +\[ScriptL]P = Length[UnitSystem["PlanckGauss"], UnitSystem["SI2019"]]; +tP = Time[UnitSystem["PlanckGauss"], UnitSystem["SI2019"]]; +TP = Temperature[UnitSystem["PlanckGauss"], UnitSystem["SI2019"]]; -lS = Length[Stoney, SI2019]; -tS = Time[Stoney, SI2019]; -mS = Mass[Stoney, SI2019]; -qS = Charge[Stoney, SI2019]; +lS = Length[UnitSystem["Stoney"], UnitSystem["SI2019"]]; +tS = Time[UnitSystem["Stoney"], UnitSystem["SI2019"]]; +mS = Mass[UnitSystem["Stoney"], UnitSystem["SI2019"]]; +qS = Charge[UnitSystem["Stoney"], UnitSystem["SI2019"]]; -(*lA=Length[Hartree,SI2019]; -tA=Time[Hartree,SI2019]; -mA=Mass[Hartree,SI2019]; -qA=Charge[Hartree,SI2019];*) +(*lA=Length[UnitSystem["Hartree"],UnitSystem["SI2019"]]; +tA=Time[UnitSystem["Hartree"],UnitSystem["SI2019"]]; +mA=Mass[UnitSystem["Hartree"],UnitSystem["SI2019"]]; +qA=Charge[UnitSystem["Hartree"],UnitSystem["SI2019"]];*) -lQCD = Length[QCD, SI2019]; -tQCD = Time[QCD, SI2019]; -mQCD = Mass[QCD, SI2019]; +lQCD = Length[UnitSystem["QCD"], UnitSystem["SI2019"]]; +tQCD = Time[UnitSystem["QCD"], UnitSystem["SI2019"]]; +mQCD = Mass[UnitSystem["QCD"], UnitSystem["SI2019"]]; *) From fe6f43865f67e82bfaec50ae0f79842cfcc24873 Mon Sep 17 00:00:00 2001 From: Michael Reed <18372368+chakravala@users.noreply.github.com> Date: Wed, 26 Jan 2022 15:51:46 -0500 Subject: [PATCH 07/11] enhanced String-UnitSystem interface --- Kernel/UnitSystems.wl | 840 ++++++++++++++++++++++-------------------- 1 file changed, 441 insertions(+), 399 deletions(-) diff --git a/Kernel/UnitSystems.wl b/Kernel/UnitSystems.wl index 3e0dd8a..7d0ee94 100644 --- a/Kernel/UnitSystems.wl +++ b/Kernel/UnitSystems.wl @@ -5,18 +5,23 @@ Unprotect[UnitSystem]; ProtectedList = {Length, Area, Volume, Power, Entropy}; UnitSystemsList = {"Metric", "SI2019", "CODATA", "Conventional", "MTS", "English", - "EnglishUS", "IAU", "SI1976", "Mixed", "ESU2019", "EMU2019", "EMU", "ESU", "Gauss", - "LorentzHeaviside", "Thomson", "Kennelly", "Planck", "PlanckGauss", "Stoney", - "Hartree", "Rydberg", "Schrodinger", "Electronic", "Natural", "NaturalGauss", - "QCD", "QCDGauss", "QCDoriginal"}; -ConstantsList = {Hyperfine, LightSpeed, Planck, PlanckReduced, - ElectronMass, MolarMass, Boltzmann, Permeability, Rationalization, - Lorentz, LuminousEfficacy}; -PhysicsList = {AtomicMass, ProtonMass, PlanckMass, Newton, Einstein, - Hartree, Rydberg, Bohr, BohrReduced, ElectronRadius, Avogadro, - Universal, Stefan, RadiationDensity, Permittivity, Coulomb, Ampere, - BiotSavart, Charge, Faraday, Impedance, Conductance, Klitzing, - Josephson, MagneticFlux, Magneton}; + "EnglishUS", "FFF", "IAU", "SI1976", "Mixed", "ESU2019", "EMU2019", "EMU", "ESU", + "Gauss", "LorentzHeaviside", "Thomson", "Kennelly", "Planck", "PlanckGauss", "Stoney", + "Hartree", "Rydberg", "Schrodinger", "Electronic", "Natural", "NaturalGauss", + "QCD", "QCDGauss", "QCDoriginal", "Hubble", "Cosmological", "CosmologicalQuantum"}; +ConstantsList = {Cesium133HyperfineSplittingFrequency, SpeedOfLight, + PlanckConstant, ReducedPlanckConstant, ElectronMass, + MolarMassConstant, BoltzmannConstant, MagneticConstant, RationalizationConstant, + LorentzConstant, MonochromaticRadiation540THzLuminousEfficacy}; +PhysicsList = {AtomicMassConstant, ProtonMass, PlanckMass, + GravitationalConstant, EinsteinConstantSpeedOfLightToTheFourth, + HartreeEnergy, RydbergConstant, BohrRadius, + RelativisticBohrRadius, ClassicalElectronRadius, + AvogadroConstant, MolarGasConstant, StefanBoltzmannConstant, + RadiationConstant, ElectricConstant, CoulombConstant, AmpereConstant, + BiotSavartConstant, ElementaryCharge, FaradayConstant, VacuumImpedance, + ConductanceQuantum, VonKlitzingConstant, JosephsonConstant, + MagneticFluxQuantum, BohrMagneton}; KinematicList = {Time, Length, Area, Volume, WaveNumber, FuelEfficiency, Frequency, FrequencyDrift, Speed, Acceleration, Jerk, Snap, VolumeFlow}; @@ -28,7 +33,7 @@ MechanicalList = {Mass, MassFlow, LinearDensity, AreaDensity, Density, Impedance, SpecificImpedance, Admittance, Compliance, Inertance}; ElectromagneticList = {Charge, ChargeDensity, LinearChargeDensity, Exposure, Mobility, Capacitance, Inductance, Reluctance, Permeance, - Permittivity, Permeability, Susceptibility, + Permittivity, Permeability, Susceptibility, Current, Conductance, SpecificSusceptibility, DemagnetizingFactor, VectorPotential, ElectricPotential, MagneticPotential, ElectricField, MagneticField, ElectricFlux, MagneticFlux, ElectricFluxDensity, @@ -58,166 +63,81 @@ OneQ[True] := True OneQ[False] := False measure[x_] := x; -GravityCoupling[Coupling[\[Alpha]G_, ___]] := measure[\[Alpha]G]; -FineStructure[Coupling[_, \[Alpha]_, ___]] := measure[\[Alpha]]; -ElectronUnit[Coupling[_, _, \[Mu]eu_, ___]] := measure[\[Mu]eu]; -ProtonUnit[Coupling[_, _, _, \[Mu]pu_, ___]] := measure[\[Mu]pu]; -ProtonElectron[c_Coupling] := ProtonUnit[c]/ElectronUnit[c]; - -(*UnitSystem[kB_, hbar_, c_, mu0_, me_, lambda_] := - UnitSystem[kB, hbar, c, mu0, me, lambda, 1]; -UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_] := - UnitSystem[kB, \[HBar], c, \[Mu]0, me, 1];*) -Boltzmann[UnitSystem[kB_, ___]] := kB; -PlanckReduced[UnitSystem[_, \[HBar]_, ___]] := \[HBar]; -LightSpeed[UnitSystem[_, _, c_, ___]] := c; -Permeability[UnitSystem[_, _, _, \[Mu]0_, ___]] := \[Mu]0; +GravitationalCouplingConstantElectronElectron[Coupling[\[Alpha]G_, ___]] := measure[\[Alpha]G]; +FineStructureConstant[Coupling[_, \[Alpha]_, ___]] := measure[\[Alpha]]; +ElectronRelativeAtomicMass[Coupling[_, _, \[Mu]eu_, ___]] := measure[\[Mu]eu]; +ProtonRelativeAtomicMass[Coupling[_, _, _, \[Mu]pu_, ___]] := measure[\[Mu]pu]; +ProtonElectronMassRatio[c_Coupling] := ProtonRelativeAtomicMass[c]/ElectronRelativeAtomicMass[c]; + +BoltzmannConstant[UnitSystem[kB_, ___]] := kB; +ReducedPlanckConstant[UnitSystem[_, \[HBar]_, ___]] := \[HBar]; +SpeedOfLight[UnitSystem[_, _, c_, ___]] := c; +MagneticConstant[UnitSystem[_, _, _, \[Mu]0_, ___]] := \[Mu]0; ElectronMass[UnitSystem[_, _, _, _, me_, ___]] := me; -Rationalization[UnitSystem[_, _, _, _, _, \[Lambda]_, ___]] := \[Lambda]; -Lorentz[UnitSystem[_, _, _, _, _, _, \[Alpha]L_, ___]] := \[Alpha]L; +RationalizationConstant[UnitSystem[_, _, _, _, _, \[Lambda]_, ___]] := \[Lambda]; +LorentzConstant[UnitSystem[_, _, _, _, _, _, \[Alpha]L_, ___]] := \[Alpha]L; -Lorentz[_UnitSystem] := 1 -Rationalization[_UnitSystem] := 1 -RationalizedQ[u_UnitSystem] := Rationalization[u] != 4 Pi +LorentzConstant[_UnitSystem] := 1 +RationalizationConstant[_UnitSystem] := 1 +RationalizedQ[u_UnitSystem] := RationalizationConstant[u] != 4 Pi +RationalizedQ[u_String] := RationalizedQ[UnitSystem[u]] -(*Universe[_] = StandardModel*) Universe[UnitSystem[_?NumericQ, ___]] := StandardModel Universe[UnitSystem[_Around, ___]] := StandardModel -Unit[x_, y_ : 1] := x; -Mass[u_UnitSystem, s_UnitSystem] := ElectronMass[u, s]; -ElectronMass[h_?NumberQ] := UnitData["R\[Infinity]"] 2 h/UnitData["\[Alpha]"]^2/UnitData["c"]; -ElectronMass[h_?NumberQ, u_Coupling] := (UnitData["R\[Infinity]"] 2 h)/(FineStructure[u]^2 UnitData["c"]); -PlanckMass[u_UnitSystem, c_Coupling] := ElectronMass[u, c]/Sqrt[GravityCoupling[c]]; -Planck[u_UnitSystem, c_Coupling] := 2 Pi PlanckReduced[u]; -Newton[u_UnitSystem, c_Coupling] := ( - LightSpeed[u, c] PlanckReduced[u, c])/PlanckMass[u, c]^2; -Charge[u_UnitSystem, c_Coupling] := Sqrt[2 Planck[u]/(Permeability[u]/FineStructure[u])/ - (LightSpeed[u] Rationalization[u] Lorentz[u]^2)]; - -Map[(#[u_UnitSystem] := #[u, Universe[u]]) &, {PlanckMass, Planck, Newton, Charge}]; -Map[(#[u_UnitSystem] := #[Universe[u]]) &, {GravityCoupling, - FineStructure, ElectronUnit, ProtonUnit, ProtonElectron}]; -Map[(#[u_UnitSystem, c_Coupling] := #[u]) &, {Boltzmann, - PlanckReduced, LightSpeed, Permeability, ElectronMass, MolarMass}]; -Map[(#[u_UnitSystem, s_UnitSystem] := Unit[#[s]/#[u]]) &, ConstantsList]; -Map[(If[! MemberQ[ProtectedList, #], - #[v_?NumberQ, u_UnitSystem] := #[v, u, Metric]; - #[v_?NumberQ, u_UnitSystem, s_UnitSystem] := - Module[{n = #[u, s]}, If[OneQ[n], v, v/n]]; - #[v_?NumberQ, - u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], - s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := v; - #[u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], - s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := 1; - If[!MemberQ[Join[ProtectedList, ConstantsList, {Permittivity, Charge, MagneticFlux, - Impedance, Conductance}], #], #[u_UnitSystem] := #[u, Metric], Nothing];, - UnitSystem /: #[v_?NumberQ, u_UnitSystem] := #[v, u, Metric]; - UnitSystem /: #[v_?NumberQ, u_UnitSystem, s_UnitSystem] := - Module[{n = #[u, s]}, If[OneQ[n], v, v/n]]; - UnitSystem /: #[v_?NumberQ, - u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], - s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := v; - UnitSystem /: #[ - u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], - s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := 1; - UnitSystem /: #[u_UnitSystem] := #[u, Metric];] - ) &, ConvertList]; +Unit[x_, y_ : 1] := PowerExpand[x]; UnitData = <||> -AppendTo[UnitData, "g0" -> 9.80665] +AppendTo[UnitData, "g0" -> 980665/10^5] AppendTo[UnitData, "ft" -> 3048/10000] AppendTo[UnitData, "ftUS" -> 1200/3937] -AppendTo[UnitData, "lb" -> 0.45359237] +AppendTo[UnitData, "lb" -> 45359237/10^8] AppendTo[UnitData, "rankine" -> 5/9] -(*AppendTo[UnitData, "kelvin" -> 9/5] -AppendTo[UnitData, "atm" -> 101325] - -AppendTo[UnitData, "kcalth" -> 4184] -AppendTo[UnitData, "kcal4" -> 4204] -AppendTo[UnitData, "kcal10" -> 4185+1/2] -AppendTo[UnitData, "kcal20" -> 4182] -AppendTo[UnitData, "kcalm" -> 4190] -AppendTo[UnitData, "kcalit" -> 4186+8/10] -AppendTo[UnitData, "cal4" -> UnitData[["kcal4"]]/1000] -AppendTo[UnitData, "cal10" -> UnitData[["kcal10"]]/1000] -AppendTo[UnitData, "cal20" -> UnitData[["kcal20"]]/1000] -AppendTo[UnitData, "calm" -> UnitData[["kcalm"]]/1000] -AppendTo[UnitData, "calit" -> UnitData[["kcalit"]]/1000] -AppendTo[UnitData, "calth" -> UnitData[["kcalth"]]/1000] -AppendTo[UnitData, "kcal" -> UnitData[["kcalth"]]] -AppendTo[UnitData, "cal" -> UnitData[["kcal"]]/1000]*) -(*AppendTo[UnitData, "calth" -> thermal calorie*) - -AppendTo[UnitData, "\[CapitalDelta]\[Nu]Cs" -> 9192631770.0] -AppendTo[UnitData, "Kcd" -> 683 555.016/555] -AppendTo[UnitData, "mP" -> Around[2.176434 10^-8, 2.4 10^-13]] -AppendTo[UnitData, "NA" -> 6.02214076 10^23] -AppendTo[UnitData, "kB" -> 1.380649 10^-23] -AppendTo[UnitData, "h" -> 6.62607015 10^-34] -AppendTo[UnitData, "c" -> 299792458.] -AppendTo[UnitData, "e" -> 1.602176634 10^-19] -AppendTo[UnitData, "\[Mu]eu" -> 1/Around[1822.888486209, 5.3 10^-8]] -AppendTo[UnitData, "\[Mu]pu" -> Around[1.007276466621, 5.3 10^-11]] -AppendTo[UnitData, "\[Alpha]" -> 1/Around[137.035999084, 2.1 10^-8]] -AppendTo[UnitData, "R\[Infinity]" -> Around[10973731.5681601, 2.1 10^-5]] -AppendTo[UnitData, "RK1990" -> 25812.807] -AppendTo[UnitData, "RK2014" -> Around[25812.8074555, 5.9 10^-6]] -AppendTo[UnitData, "KJ1990" -> 4.835979 10^14] +AppendTo[UnitData, "\[CapitalDelta]\[Nu]Cs" -> 9192631770] +AppendTo[UnitData, "Kcd" -> 683 555016/555000] +AppendTo[UnitData, "mP" -> Around[2.176434/10^8, 24/10^14]] +AppendTo[UnitData, "NA" -> 602214076 10^15] +AppendTo[UnitData, "kB" -> 1380649/10^29] +AppendTo[UnitData, "h" -> 662607015/10^42] +AppendTo[UnitData, "c" -> 299792458] +AppendTo[UnitData, "e" -> 1602176634/10^28] +AppendTo[UnitData, "\[Mu]eu" -> 1/Around[1822.888486209, 53/10^9]] +AppendTo[UnitData, "\[Mu]pu" -> Around[1.007276466621, 53/10^12]] +AppendTo[UnitData, "\[Alpha]" -> 1/Around[137.035999084, 21/10^9]] +AppendTo[UnitData, "R\[Infinity]" -> Around[10973731.5681601, 21/10^6]] +AppendTo[UnitData, "RK1990" -> 25812807/1000] +AppendTo[UnitData, "RK2014" -> Around[25812.8074555, 59/10^7]] +AppendTo[UnitData, "KJ1990" -> 4835979 10^8] AppendTo[UnitData, "KJ2014" -> Around[4.835978525 10^14, 3 10^6]] AppendTo[UnitData, "GMsun" -> Around[1.32712442099 10^20, 9 10^9]] AppendTo[UnitData, "day" -> 60^2 24] -AppendTo[UnitData, "au" -> 149597870.7 10^3] +AppendTo[UnitData, "au" -> 149597870700] +AppendTo[UnitData, "fur" -> 201168/1000] +AppendTo[UnitData, "H0" -> Around[67.66, 0.42]] +AppendTo[UnitData, "\[CapitalOmega]\[CapitalLambda]" -> Around[0.6889, 0.0056]] -AbstractUnitData["lbm"] = "g0"/"ft" -AbstractUnitData["lbmUS"] = "g0"/"ftUS" -AbstractUnitData["slug"] = "lb" AbstractUnitData["lbm"] -AbstractUnitData["slugUS"] = "lb" AbstractUnitData["lbmUS"] +AbstractUnitData["slug"] = "lb" "g0"/"ft" +AbstractUnitData["slugUS"] = "lb" "g0"/"ftUS" +AbstractUnitData["Ru"] = "NA" "kB" AbstractUnitData["me"] = 2 "R\[Infinity]" "h"/"\[Alpha]"^2/"c" -AbstractUnitData["\[Mu]0"] = 2 "\[Alpha]" "h"/"c"/"e"^2 +AbstractUnitData["\[Mu]0"] = 2 "\[Alpha]" "h"/"c"/"e"^2 (*\[TildeTilde]4\[Pi]*(1e-7+5.5e-17),exact charge*) AbstractUnitData["\[HBar]"] = "h"/(2 Pi) -AbstractUnitData["\[Delta]\[Mu]0"] = "\[Mu]0" - 4 Pi 10^-7 AbstractUnitData["\[Mu]pe"] = "\[Mu]pu"/"\[Mu]eu" -AbstractUnitData["Ru"] = "NA" "kB" -AbstractUnitData["\[Alpha]L"] = 1/100/"c" AbstractUnitData["\[Alpha]G"] = (AbstractUnitData["me"]/"mP")^2 -AbstractUnitData["\[HBar]1990"] = 2/"RK1990"/"KJ1990"^2/Pi -AbstractUnitData["\[HBar]2014"] = 2/"RK2014"/"KJ2014"^2/Pi -AbstractUnitData["me1990"] = 4 Pi "R\[Infinity]" AbstractUnitData["\[HBar]1990"]/"\[Alpha]"^2/"c" -AbstractUnitData["me2014"] = 4 Pi "R\[Infinity]" AbstractUnitData["\[HBar]2014"]/"\[Alpha]"^2/"c" AbstractUnitData["GG"] = "c" AbstractUnitData["\[HBar]"]/"mP"^2 -AbstractUnitData["ms"] = "GMsun"/AbstractUnitData["GG"] -AbstractUnitData["Js"] = AbstractUnitData["ms"] "au"^2/"day"^2; -AbstractUnitData["mf"] = 90/AbstractUnitData["lbm"]/Mass[AbstractUnitSystem["Metric"], AbstractUnitSystem["English"]] -AbstractUnitData["Jf"] = AbstractUnitData["mf"] (201.168/(14 "day"))^2 +AbstractUnitData["pc"] = "au" 3*60^3/Pi +AbstractUnitData["th"] = 1000 AbstractUnitData["pc"]/"H0" +AbstractUnitData["\[CapitalLambda]"] = 3 (1/AbstractUnitData["th"]/"c")^2 "\[CapitalOmega]\[CapitalLambda]" +AbstractUnitData["lc"] = PowerExpand[2 Sqrt[2 Pi/AbstractUnitData["\[CapitalLambda]"]]] +AbstractUnitData["mc"] = PowerExpand["c"^2/(2 Sqrt[2 Pi AbstractUnitData["\[CapitalLambda]"]] AbstractUnitData["GG"])] +AbstractUnitData["\[Rho]\[CapitalLambda]"] = "c"^4 AbstractUnitData["\[CapitalLambda]"]/(8 Pi AbstractUnitData["GG"]) +AbstractUnitData["lcq"] = PowerExpand[("c" AbstractUnitData["\[HBar]"]/AbstractUnitData["\[Rho]\[CapitalLambda]"])^(1/4)] +AbstractUnitData["mcq"] = PowerExpand[(AbstractUnitData["\[HBar]"]^3 AbstractUnitData["\[Rho]\[CapitalLambda]"]/"c"^5)^(1/4)] +AbstractUnitData["ecq"] = PowerExpand[("c"^3 AbstractUnitData["\[HBar]"]^3 AbstractUnitData["\[Rho]\[CapitalLambda]"])^(1/4)] +AbstractUnitData["tcq"] = PowerExpand[AbstractUnitData["lcq"] Sqrt[AbstractUnitData["mcq"]/AbstractUnitData["ecq"]]] EvalUnitData[x] := AbstractUnitData[x]/.Normal[UnitData] -(*AppendTo[UnitData, "lbm" -> EvalUnitData["lbm"]] -AppendTo[UnitData, "lbmUS" -> EvalUnitData["lbmUS"]] -AppendTo[UnitData, "slug" -> EvalUnitData["slug"]] -AppendTo[UnitData, "slugUS" -> EvalUnitData["slugUS"]] -AppendTo[UnitData, "me" -> EvalUnitData["me"]] -AppendTo[UnitData, "\[Mu]0" -> EvalUnitData["\[Mu]0"]] (*\[TildeTilde]4\[Pi]*(1e-7+5.5e-17),exact charge*) -AppendTo[UnitData, "\[HBar]" -> EvalUnitData["\[HBar]"]] -AppendTo[UnitData, "\[Delta]\[Mu]0" -> EvalUnitData["\[Delta]\[Mu]0"]] -AppendTo[UnitData, "\[Mu]pe" -> EvalUnitData["\[Mu]pe"]] -AppendTo[UnitData, "Ru" -> EvalUnitData["Ru"]] -AppendTo[UnitData, "\[Alpha]L" -> EvalUnitData["\[Alpha]L"]] -AppendTo[UnitData, "\[Alpha]G" -> EvalUnitData["\[Alpha]G"]] -AppendTo[UnitData, "\[HBar]1990" -> EvalUnitData["\[HBar]1990"]] -AppendTo[UnitData, "\[HBar]2014" -> EvalUnitData["\[HBar]2014"]] -AppendTo[UnitData, "me1990" -> EvalUnitData["me1990"]] -AppendTo[UnitData, "me2014" -> EvalUnitData["me2014"]]*) -(*AppendTo[UnitData, "GMearth" -> Around[398600441.8 10^6, 8 10^5]] -AppendTo[UnitData, "GMjupiter" -> Around[1.26686534 10^17, 9 10^9]*) -(*AppendTo[UnitData, "LD" -> 384402 10^3]*) -(*AppendTo[UnitData, "pc" -> ("au" 648000/Pi)/.Normal[UnitData]] -AppendTo[UnitData, "ly" -> (365.25 "c" "day")/.Normal[UnitData]] -AppendTo[UnitData, "GG" -> EvalUnitData["GG"]] -AppendTo[UnitData, "ms" -> EvalUnitData["ms"]] -AppendTo[UnitData, "Js" -> EvalUnitData["Js"]]*) - Coupling["AbstractCoupling"] = Coupling["\[Alpha]G", "\[Alpha]", "\[Mu]eu", "\[Mu]pu"] Coupling["AbstractUniverse"] = Coupling[AbstractUnitData["\[Alpha]G"], "\[Alpha]", "\[Mu]eu", "\[Mu]pu"] Coupling["StandardModel"] = Coupling["AbstractUniverse"] /. Normal[UnitData] @@ -225,36 +145,65 @@ Coupling["StandardModel"] = Coupling["AbstractUniverse"] /. Normal[UnitData] AbstractUnitSystem["AbstractUnits"] = UnitSystem["kB", "\[HBar]", "c", "\[Mu]0", "me", "\[Lambda]", "\[Alpha]L"] AbstractUnitSystem["AbstractUnits1"] = UnitSystem["kB1", "\[HBar]1", "c1", "\[Mu]01", "me1", "\[Lambda]1", "\[Alpha]L1"] AbstractUnitSystem["AbstractUnits2"] = UnitSystem["kB2", "\[HBar]2", "c2", "\[Mu]02", "me2", "\[Lambda]2", "\[Alpha]L2"] - -AbstractUnitSystem["Gauss"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 4 Pi, AbstractUnitData["\[Alpha]L"]] -AbstractUnitSystem["LorentzHeaviside"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 1, AbstractUnitData["\[Alpha]L"]] -AbstractUnitSystem["Thomson"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 4 Pi, 1/2]; -AbstractUnitSystem["Kennelly"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", 10^-7, AbstractUnitData["me"], 4 Pi] -AbstractUnitSystem["ESU"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", (100 "c")^-2, 1000 AbstractUnitData["me"], 4 Pi]; -AbstractUnitSystem["ESU2019"] = UnitSystem[10^7 "kB", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 10^3 AbstractUnitData["\[Mu]0"]/"c"^2, 1000 AbstractUnitData["me"]] -AbstractUnitSystem["EMU"] = UnitSystem[10^10 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 1, 1000 AbstractUnitData["me"], 4 Pi]; -AbstractUnitSystem["EMU2019"] = UnitSystem[10^7 "kB", 10^7 AbstractUnitData["\[HBar]"], 100 "c", 10^7 AbstractUnitData["\[Mu]0"], 1000 AbstractUnitData["me"]] -AbstractUnitSystem["MTS"] = UnitSystem[10^6 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", 1000 AbstractUnitData["\[HBar]"], "c", 4 Pi/10^4, AbstractUnitData["me"]/1000]; -AbstractUnitSystem["Mixed"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", AbstractUnitData["\[Mu]0"], AbstractUnitData["me"]]; -AbstractUnitSystem["Metric"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", 4 Pi 10^-7, AbstractUnitData["me"]]; -AbstractUnitSystem["SI1976"] = UnitSystem[8314.32 AbstractUnitData["me"]/"\[Mu]eu", AbstractUnitData["\[HBar]"], "c", 4 Pi 10^-7, AbstractUnitData["me"]]; AbstractUnitSystem["SI2019"] = UnitSystem["kB", AbstractUnitData["\[HBar]"], "c", AbstractUnitData["\[Mu]0"], AbstractUnitData["me"]]; -AbstractUnitSystem["CODATA"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me2014"]/"\[Mu]eu", AbstractUnitData["\[HBar]2014"], "c", 2 "\[Alpha]" AbstractUnitData["RK2014"]/"c", AbstractUnitData["me2014"]]; -AbstractUnitSystem["Conventional"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me1990"]/"\[Mu]eu", AbstractUnitData["\[HBar]1990"], "c", 2 "\[Alpha]" AbstractUnitData["RK1990"]/"c", AbstractUnitData["me1990"]]; -AbstractUnitSystem["English"] = UnitSystem["kB" "rankine"/AbstractUnitData["slug"]/"ft"^2, AbstractUnitData["\[HBar]"]/AbstractUnitData["slug"]/"ft"^2, "c"/"ft", 4 Pi, AbstractUnitData["me"]/AbstractUnitData["slug"]]; -AbstractUnitSystem["EnglishUS"] = UnitSystem[(1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu" ) ("rankine"/AbstractUnitData["slugUS"]/"ftUS"^2), - AbstractUnitData["\[HBar]"]/AbstractUnitData["slugUS"]/"ftUS"^2, "c"/"ftUS", 4 Pi, AbstractUnitData["me"]/AbstractUnitData["slugUS"]] -AbstractUnitSystem["IAU"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu"/AbstractUnitData["Js"], AbstractUnitData["\[HBar]"]/"day"/AbstractUnitData["Js"], "day" "c"/"au", - 4 Pi 10^-7 "day"^2/AbstractUnitData["Js"], AbstractUnitData["me"]/AbstractUnitData["ms"]] -AbstractUnitSystem["FFF"] = UnitSystem[1000 AbstractUnitData["Ru"] AbstractUnitData["me"]/"\[Mu]eu" "rankine"/AbstractUnitData["Jf"], AbstractUnitData["\[HBar]"]/(14 "day")/AbstractUnitData["Jf"], 14 "day" "c"/201.168, 0, AbstractUnitData["me"]/AbstractUnitData["mf"]] - -AbstractUnitSystem["Planck"] = UnitSystem[1,1,1,1,Sqrt[4 Pi AbstractUnitData["\[Alpha]G"]],1,1] -AbstractUnitSystem["PlanckGauss"] = UnitSystem[1, 1, 1, 4 Pi, Sqrt[AbstractUnitData["\[Alpha]G"]]] -AbstractUnitSystem["Stoney"] = UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"]] +DeriveMetric[ru_, perm_] := DeriveMetric[ru, perm, AbstractUnitData["\[HBar]"], AbstractUnitData["me"]]; +DeriveMetric[ru_, perm_, hbar_, mass_] := UnitSystem[ru mass/"\[Mu]eu", hbar, "c", perm, mass]; + +AbstractUnitSystem["Metric"] = DeriveMetric[1000 AbstractUnitData["Ru"], 4 Pi/10^7] +AbstractUnitSystem["SI1976"] = DeriveMetric[831432/100, 4 Pi/10^7] + +DeriveCODATA[klitz_, joseph_] := DeriveCODATA[klitz, Nothing, 2/klitz/joseph^2/Pi] +DeriveCODATA[klitz_, _, hbar_] := DeriveCODATA[klitz, Nothing, hbar, 4 Pi "R\[Infinity]" hbar/"\[Alpha]"^2/"c"] +DeriveCODATA[klitz_, _, hbar_, mass_] := DeriveMetric[1000 AbstractUnitData["Ru"], 2 "\[Alpha]" klitz/"c", hbar, mass] + +AbstractUnitSystem["CODATA"] = DeriveCODATA["RK2014", "KJ2014"]; +AbstractUnitSystem["Conventional"] = DeriveCODATA["RK1990", "KJ1990"]; + +DeriveGaussSystem[u_, perm_, ratio_] := DeriveGaussSystem[u, perm, ratio, 1] +DeriveGaussSystem[u_, perm_, ratio_, lorentz_] := DeriveGaussSystem[u, perm, ratio, lorentz, 1/100, 1/1000] +DeriveGaussSystem[u_, perm_, ratio_, lorentz_, length_, mass_] := + DeriveGaussSystem[u, perm, ratio, lorentz, length, mass, PowerExpand[mass length^2]] +DeriveGaussSystem[u_, perm_, ratio_, 1, length_, mass_, energy_] := + UnitSystem[BoltzmannConstant[u]/energy, ReducedPlanckConstant[u]/energy, SpeedOfLight[u]/length, perm, ElectronMass[u]/mass, ratio] +DeriveGaussSystem[u_, perm_, ratio_, lorentz_, length_, mass_, energy_] := + UnitSystem[BoltzmannConstant[u]/energy, ReducedPlanckConstant[u]/energy, SpeedOfLight[u]/length, perm, ElectronMass[u]/mass, ratio, lorentz] + +AbstractUnitSystem["Gauss"] = DeriveGaussSystem["AbstractMetric",1,4 Pi,1/100/"c"] +AbstractUnitSystem["LorentzHeaviside"] = DeriveGaussSystem["AbstractMetric",1,1,1/100/"c"] +AbstractUnitSystem["Thomson"] = DeriveGaussSystem["AbstractMetric",1,4 Pi,1/2] +AbstractUnitSystem["Kennelly"] = DeriveGaussSystem["AbstractMetric",10^-7,4 Pi,1,1,1] +AbstractUnitSystem["ESU"] = DeriveGaussSystem["AbstractMetric",(100 "c")^-2,4 Pi] +AbstractUnitSystem["EMU"] = DeriveGaussSystem["AbstractMetric",1,4 Pi] + +DeriveEnergySystem[u_, time_, length_, mass_] := DeriveTempSystem[u, time, length, mass, 1] +DeriveEnergySystem[u_, time_, length_, mass_, energy_] := + DeriveTempSystem[u, time, length, mass, 1, PowerExpand[MagneticConstant[u] time^2/energy], energy] +DeriveTempSystem[u_, time_, length_, mass_, temp_] := Module[{energy = PowerExpand[mass length^2/time^2]}, + DeriveTempSystem[u, time, length, mass, temp, PowerExpand[MagneticConstant[u] time^2/energy]]] +DeriveTempSystem[u_, time_, length_, mass_, temp_, perm_] := + DeriveTempSystem[u, time, length, mass, temp, perm, PowerExpand[mass length^2/time^2]] +DeriveTempSystem[u_, time_, length_, mass_, temp_, perm_, energy_] := + UnitSystem[BoltzmannConstant[u] temp/energy, ReducedPlanckConstant[u]/time/energy, time SpeedOfLight[u]/length, perm, ElectronMass[u]/mass] + +AbstractUnitSystem["MTS"] = DeriveEnergySystem["AbstractMetric", 1, 1, 1000] +AbstractUnitSystem["EMU2019"] = DeriveEnergySystem["AbstractSI2019", 1, 1/100, 1/1000] +AbstractUnitSystem["ESU2019"] = DeriveTempSystem["AbstractSI2019", 1, 1/100, 1/1000, 1, 1000 AbstractUnitData["\[Mu]0"]/"c"^2] +AbstractUnitSystem["Mixed"] = DeriveTempSystem["AbstractMetric", 1, 1, 1, 1, AbstractUnitData["\[Mu]0"]] +AbstractUnitSystem["English"] = DeriveTempSystem["AbstractSI2019", 1, "ft", AbstractUnitData["slug"], "rankine", 4 Pi] +AbstractUnitSystem["EnglishUS"] = DeriveTempSystem["AbstractMetric", 1, "ftUS", AbstractUnitData["slugUS"], "rankine", 4 Pi] +AbstractUnitSystem["FFF"] = DeriveTempSystem["AbstractMetric", 14 "day", "fur", 90 "lb", "rankine", 0] +AbstractUnitSystem["IAU"] = DeriveEnergySystem["AbstractMetric", "day", "au", "GMsun"/AbstractUnitData["GG"]] +AbstractUnitSystem["Hubble"] = DeriveEnergySystem["AbstractMetric", AbstractUnitData["th"], "c" AbstractUnitData["th"], 1] +AbstractUnitSystem["Cosmological"] = DeriveEnergySystem["AbstractMetric", AbstractUnitData["lc"]/"c", AbstractUnitData["lc"], AbstractUnitData["mc"]] +AbstractUnitSystem["CosmologicalQuantum"] = DeriveEnergySystem["AbstractMetric", AbstractUnitData["tcq"], AbstractUnitData["lcq"], AbstractUnitData["mcq"], AbstractUnitData["ecq"]] + +AbstractUnitSystem["Planck"] = UnitSystem[1, 1, 1, 1, PowerExpand[Sqrt[4 Pi AbstractUnitData["\[Alpha]G"]]]] +AbstractUnitSystem["PlanckGauss"] = UnitSystem[1, 1, 1, 4 Pi, PowerExpand[Sqrt[AbstractUnitData["\[Alpha]G"]]]] +AbstractUnitSystem["Stoney"] = UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, PowerExpand[Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"]]] AbstractUnitSystem["Hartree"] = UnitSystem[1,1,1/"\[Alpha]",4 Pi "\[Alpha]"^2,1] AbstractUnitSystem["Rydberg"] = UnitSystem[1,1,2/"\[Alpha]",Pi "\[Alpha]"^2,1/2] -AbstractUnitSystem["Schrodinger"] = UnitSystem[1, 1, 1/"\[Alpha]", 4 Pi "\[Alpha]"^2, Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"]] +AbstractUnitSystem["Schrodinger"] = UnitSystem[1, 1, 1/"\[Alpha]", 4 Pi "\[Alpha]"^2, PowerExpand[Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"]]] AbstractUnitSystem["Electronic"] = UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, 1] AbstractUnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1, 1, 1, "1"] AbstractUnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1, 1, 1, "1"] @@ -265,11 +214,7 @@ AbstractUnitSystem["QCDoriginal"] = UnitSystem[1, 1, 1, 4 Pi "\[Alpha]", 1/Abstr UnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1] UnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1] Map[(UnitSystem[#] = AbstractUnitSystem[#] /. Normal[UnitData]) &, -{"AbstractUnits","AbstractUnits1","AbstractUnits2","Gauss","LorentzHeaviside","Thomson","Kennelly","ESU","ESU2019","EMU","EMU2019","MTS","Mixed","Metric","SI1976","SI2019","CODATA","Conventional","English","EnglishUS","IAU","FFF","Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","QCD","QCDGauss","QCDoriginal"}] - -(*Map[Set[Unevaluated[#],UnitData[ToString[#]]] &, {g0,ft,ftUS,lb,rankine,\[CapitalDelta]\[Nu]Cs,Kcd,mP,NA,kB,h,c,e,\[Mu]eu,\[Mu]pu,\[Alpha]inv,R\[Infinity],RK1990,RK2014,KJ1990,KJ2014}]*) -(*Map[Set[Unevaluated[#],UnitData[ToString[#]]] &, {lbm,lbmUS,slug,slugUS,kelvin,atm,kcalth,kcal4,kcla10,kcal20,kcalm,kcalit,calth,cal4,cal10,cal20,calm,calit,kcal,cal,me,\[Mu]0,\[HBar],\[Delta]\[Mu]0,\[Mu]pe,Ru,\[Alpha]L,\[Alpha]G,\[HBar]1990,\[HBar]2014,me1990,me2014}]*) -(*Map[Set[Unevaluated[#],UnitData[ToString[#]]] &, {GMsun, GMearth, GMjupiter, au, LD, day, pc, ly, GG, ms, Js, mf, Jf}]*) +{"AbstractUnits","AbstractUnits1","AbstractUnits2","Gauss","LorentzHeaviside","Thomson","Kennelly","ESU","ESU2019","EMU","EMU2019","MTS","Mixed","Metric","SI1976","SI2019","CODATA","Conventional","English","EnglishUS","IAU","FFF","Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","QCD","QCDGauss","QCDoriginal","Hubble","Cosmological","CosmologicalQuantum"}] StandardModel = Coupling["StandardModel"] AbstractCoupling = Coupling["AbstractCoupling"] @@ -307,6 +252,9 @@ English = UnitSystem["English"] EnglishUS = UnitSystem["EnglishUS"] IAU = UnitSystem["IAU"] FFF = UnitSystem["FFF"] +Hubble = UnitSystem["Hubble"] +Cosmological = UnitSystem["Cosmological"] +CosmologicalQuantum = UnitSystem["CosmologicalQuantum"] PlanckGauss = UnitSystem["PlanckGauss"] Stoney = UnitSystem["Stoney"] @@ -325,6 +273,9 @@ AbstractUnitSystem["CGS2019"] := AbstractUnitSystem["EMU2019"] AbstractUnitSystem["CGSm"] := AbstractUnitSystem["EMU"] AbstractUnitSystem["CGSe"] := AbstractUnitSystem["ESU"] AbstractUnitSystem["HLU"] := AbstractUnitSystem["LorentzHeaviside"] +UnitSystem["AbstractUnits"] := AbstractUnitSystem["AbstractUnits"] +UnitSystem["AbstractUnits1"] := AbstractUnitSystem["AbstractUnits1"] +UnitSystem["AbstractUnits2"] := AbstractUnitSystem["AbstractUnits2"] UnitSystem["SI"] := UnitSystem["SI2019"] UnitSystem["MKS"] := UnitSystem["Metric"] UnitSystem["CGS"] := UnitSystem["Gauss"] @@ -333,82 +284,136 @@ UnitSystem["CGSm"] := UnitSystem["EMU"] UnitSystem["CGSe"] := UnitSystem["ESU"] UnitSystem["HLU"] := UnitSystem["LorentzHeaviside"] -ElectronMass[UnitSystem["Planck"], c_Coupling] := Sqrt[4 Pi GravityCoupling[c]]; -ElectronMass[UnitSystem["PlanckGauss"], c_Coupling] := Sqrt[GravityCoupling[c]]; -ElectronMass[UnitSystem[_, _, _, _, Sqrt[EvalUnitData["\[Alpha]G"]/UnitData["\[Alpha]"]], ___], c_Coupling] := Sqrt[GravityCoupling[c]/FineStructure[c];] -ElectronMass[UnitSystem[_, _, _, _, 1/UnitData["\[Mu]pe"], ___], c_Coupling] := 1/ProtonElectron[c]; -Permeability[UnitSystem[_, _, _, 4 Pi UnitData["\[Alpha]"]^2, ___], c_Coupling] := 4 Pi FineStructure[c]^2; -Permeability[UnitSystem[_, _, _, Pi UnitData["\[Alpha]"]^2, ___], c_Coupling] := Pi FineStructure[c]^2; -LightSpeed[UnitSystem[_, _, 1/UnitData["\[Alpha]"], ___], c_Coupling] := 1/FineStructure[c]; -LightSpeed[UnitSystem[_, _, 2/UnitData["\[Alpha]"], ___], c_Coupling] := 2/FineStructure[c]; +UnitSystem[u_String] := AbstractUnitSystem[StringDelete[u, "Abstract"]] /; StringStartsQ[u, "Abstract"] +Coupling[c_String] := Universe[UnitSystem[c]] + +Map[(#[u_UnitSystem] := #[u, Universe[u]]) &, {PlanckMass, PlanckConstant, GravitationalConstant, ElementaryCharge}]; +Map[(#[u_UnitSystem] := #[Universe[u]]) &, {GravitationalCouplingConstantElectronElectron, FineStructureConstant, ElectronRelativeAtomicMass, ProtonRelativeAtomicMass, ProtonElectronMassRatio}]; +Map[(#[u_UnitSystem, c_Coupling] := #[u]) &, {BoltzmannConstant, ReducedPlanckConstant, SpeedOfLight, MagneticConstant, ElectronMass, MolarMassConstant}]; +Map[(#[u_UnitSystem, s_UnitSystem] := Unit[#[s]/#[u]]) &, ConstantsList]; +Map[Unprotect, ProtectedList] +Map[(If[!MemberQ[ProtectedList, #], + #[v_?NumberQ, u_String] := #[v, UnitSystem[u]]; + #[v_?NumberQ, u_String, s_String] := #[v, UnitSystem[u], UnitSystem[s]]; + #[u_String] := #[UnitSystem[u]]; + #[u_String, s_String] := #[UnitSystem[u], UnitSystem[s]]; + #[v_?NumberQ, u_UnitSystem] := #[v, u, UnitSystem["Metric"]]; + #[v_?NumberQ, u_UnitSystem, s_UnitSystem] := + Module[{n = #[u, s]}, If[OneQ[n], v, v/n]]; + #[v_?NumberQ, + u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], + s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := v; + #[ + u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], + s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := 1; + #[u_UnitSystem] := #[u, UnitSystem["Metric"]];, + #[v_?NumberQ, u_String] := #[v, UnitSystem[u]]; + #[v_?NumberQ, u_String, s_String] := #[v, UnitSystem[u], UnitSystem[s]]; + #[u_String] := #[UnitSystem[u]]; + #[u_String, s_String] := #[UnitSystem[u], UnitSystem[s]]; + UnitSystem /: #[v_?NumberQ, u_UnitSystem] := #[v, u, UnitSystem["Metric"]]; + UnitSystem /: #[v_?NumberQ, u_UnitSystem, s_UnitSystem] := + Module[{n = #[u, s]}, If[OneQ[n], v, v/n]]; + UnitSystem /: #[v_?NumberQ, + u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], + s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := v; + UnitSystem /: #[ + u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], + s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := 1; + UnitSystem /: #[u_UnitSystem] := #[u, UnitSystem["Metric"]];] +) &, ConvertList]; +Map[Protect, ProtectedList] + +Mass[u_UnitSystem, s_UnitSystem] := ElectronMass[u, s]; +ElectronMass[h_?NumberQ] := UnitData["R\[Infinity]"] 2 h/UnitData["\[Alpha]"]^2/UnitData["c"]; +ElectronMass[h_?NumberQ, u_Coupling] := (UnitData["R\[Infinity]"] 2 h)/(FineStructureConstant[u]^2 UnitData["c"]); +PlanckMass[u_UnitSystem, c_Coupling] := PowerExpand[ElectronMass[u, c]/Sqrt[GravitationalCouplingConstantElectronElectron[c]]] +PlanckConstant[u_UnitSystem, c_Coupling] := 2 Pi ReducedPlanckConstant[u]; +GravitationalConstant[u_UnitSystem, c_Coupling] := PowerExpand[(SpeedOfLight[u, c] ReducedPlanckConstant[u, c])/PlanckMass[u, c]^2] +ElementaryCharge[u_UnitSystem, c_Coupling] := PowerExpand[Sqrt[2 PlanckConstant[u]/(MagneticConstant[u]/FineStructureConstant[u])/(SpeedOfLight[u] RationalizationConstant[u] LorentzConstant[u]^2)]] + +ElectronMass[UnitSystem["Planck"], c_Coupling] := PowerExpand[Sqrt[4 Pi GravityCoupling[c]]] +ElectronMass[UnitSystem["PlanckGauss"], c_Coupling] := Sqrt[GravitationalCouplingConstantElectronElectron[c]]; +ElectronMass[UnitSystem[_, _, _, _, Sqrt[EvalUnitData["\[Alpha]G"]/UnitData["\[Alpha]"]], ___], c_Coupling] := PowerExpand[Sqrt[GravitationalCouplingConstantElectronElectron[c]/FineStructureConstant[c]]] +ElectronMass[UnitSystem[_, _, _, _, 1/UnitData["\[Mu]pe"], ___], c_Coupling] := 1/ProtonElectronMassRatio[c]; +MagneticConstant[UnitSystem[_, _, _, 4 Pi UnitData["\[Alpha]"]^2, ___], c_Coupling] := 4 Pi FineStructureConstant[c]^2; +MagneticConstant[UnitSystem[_, _, _, Pi UnitData["\[Alpha]"]^2, ___], c_Coupling] := Pi FineStructureConstant[c]^2; +SpeedOfLight[UnitSystem[_, _, 1/UnitData["\[Alpha]"], ___], c_Coupling] := 1/FineStructureConstant[c]; +SpeedOfLight[UnitSystem[_, _, 2/UnitData["\[Alpha]"], ___], c_Coupling] := 2/FineStructureConstant[c]; PlanckReduced[UnitSystem[_, 1/UnitData["\[Alpha]"], ___], c_Coupling] := 1/FineStructure[c]; -ElectronMass[u : UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me"], ___], c_Coupling] := ElectronMass[Planck[u], c]; +ElectronMass[u : UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me"], ___], c_Coupling] := ElectronMass[PlanckConstant[u], c]; ElectronMass[UnitSystem[_, _, 100 UnitData["c"], _, 1000 EvalUnitData["me"], ___], c_Coupling] := 1000 ElectronMass[UnitSystem["SI2019"], c]; ElectronMass[UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me"]/1000, ___], c_Coupling] := ElectronMass[UnitSystem["SI2019"], c]/1000; -ElectronMass[u : UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me2014"], ___], c_Coupling] := ElectronMass[Planck[u], c]; -ElectronMass[u : UnitSystem[_, _, UnitData["c"], EvalUnitData["\[Mu]0"], EvalUnitData["me1990"], ___], c_Coupling] := ElectronMass[Planck[u], c]; +ElectronMass[u : UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me2014"], ___], c_Coupling] := ElectronMass[PlanckConstant[u], c]; +ElectronMass[u : UnitSystem[_, _, UnitData["c"], EvalUnitData["\[Mu]0"], EvalUnitData["me1990"], ___], c_Coupling] := ElectronMass[PlanckConstant[u], c]; ElectronMass[UnitSystem[_, _, UnitData["c"]/UnitData["ftUS"], _, EvalUnitData["me"]/EvalUnitData["slug"], ___], c_Coupling] := ElectronMass[UnitSystem["SI2019"], c]/EvalUnitData["slug"]; -Permeability[UnitSystem[_, _, _, EvalUnitData["\[Mu]0"], ___], c_Coupling] := FineStructure[c] 2 UnitData["h"]/UnitData["c"]/UnitData["e"]^2; -Permeability[UnitSystem["ESU2019"], u_Coupling] := 10^3 Permeability[UnitSystem["SI2019"], u]/UnitData["c"]^2; -Permeability[UnitSystem["EMU2019"], u_Coupling] := 10^7 Permeability[UnitSystem["SI2019"], u]; -Permeability[UnitSystem["CODATA"], u_Coupling] := 2 UnitData["RK2014"] FineStructure[u]/UnitData["c"]; -Permeability[UnitSystem["Conventional"], u_Coupling] := 2 UnitData["RK1990"] FineStructure[u]/UnitData["c"]; - -MolarMass[UnitSystem[1, ___]] = 1; -MolarMass[u:UnitSystem[UnitData["kB"], ___]] := MolarMass[u, Universe[u]]; -MolarMass[u:UnitSystem[UnitData["kB"], ___], c_Coupling] := UnitData["NA"] ElectronMass[u, c]/ElectronUnit[c]; -MolarMass[u:UnitSystem[10^7 UnitData["kB"], ___]] := MolarMass[u, Universe[u]]; -MolarMass[UnitSystem[10^7 UnitData["kB"], ___], c_Coupling] := 1000 MolarMass[UnitSystem["SI2019"], c]; -MolarMass[u:UnitSystem[10^3 UnitData["kB"], ___]] := MolarMass[u, Universe[u]]; -MolarMass[UnitSystem[10^3 UnitData["kB"], ___], c_Coupling] := MolarMass[UnitSystem["SI2019"], c]/1000; -MolarMass[UnitSystem[kB_, ___]] := MolarMass[UnitSystem["CGS"]]/1000; -MolarMass[UnitSystem[Boltzmann[UnitSystem["MTS"]], ___]] := MolarMass[UnitSystem["CGS"]]/10^6; -MolarMass[UnitSystem[Boltzmann[UnitSystem["CGS"]], ___]] := MolarMass[UnitSystem["Natural"]]; -MolarMass[UnitSystem[Boltzmann[UnitSystem["FFF"]], ___]] := MolarMass[UnitSystem["Natural"]]; -MolarMass[u:UnitSystem[Boltzmann[UnitSystem["English"]], ___]] := MolarMass[u, Universe[u]]; -MolarMass[u:UnitSystem[Boltzmann[UnitSystem["English"]], ___], c_Coupling] := 1000 MolarMass[UnitSystem["SI2019"],c] -MolarMass[UnitSystem[Boltzmann[UnitSystem["EnglishUS"]], ___]] := MolarMass[UnitSystem["Natural"]]; -MolarMass[UnitSystem[Boltzmann[UnitSystem["IAU"]], ___]] = EvalUnitData["ms"]/1000; - -LuminousEfficacy[UnitSystem[1, ___]] = 1 -LuminousEfficacy[u : UnitSystem[_?NumericQ, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] -LuminousEfficacy[u : UnitSystem[_Around, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] +MagneticConstant[UnitSystem[_, _, _, EvalUnitData["\[Mu]0"], ___], c_Coupling] := FineStructureConstant[c] 2 UnitData["h"]/UnitData["c"]/UnitData["e"]^2; +MagneticConstant[UnitSystem["ESU2019"], u_Coupling] := 10^3 MagneticConstant[UnitSystem["SI2019"], u]/UnitData["c"]^2; +MagneticConstant[UnitSystem["EMU2019"], u_Coupling] := 10^7 MagneticConstant[UnitSystem["SI2019"], u]; +MagneticConstant[UnitSystem["CODATA"], u_Coupling] := 2 UnitData["RK2014"] FineStructureConstant[u]/UnitData["c"]; +MagneticConstant[UnitSystem["Conventional"], u_Coupling] := 2 UnitData["RK1990"] FineStructureConstant[u]/UnitData["c"]; + +MolarMassConstant[UnitSystem[1, ___]] = 1; +MolarMassConstant[u:UnitSystem[UnitData["kB"], ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[u:UnitSystem[UnitData["kB"], ___], c_Coupling] := UnitData["NA"] ElectronMass[u, c]/ElectronRelativeAtomicMass[c]; +MolarMassConstant[u:UnitSystem[10^7 UnitData["kB"], ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[UnitSystem[10^7 UnitData["kB"], ___], c_Coupling] := 1000 MolarMassConstant[UnitSystem["SI2019"], c]; +MolarMassConstant[u:UnitSystem[10^3 UnitData["kB"], ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[UnitSystem[10^3 UnitData["kB"], ___], c_Coupling] := MolarMassConstant[UnitSystem["SI2019"], c]/1000; +MolarMassConstant[UnitSystem[kB_, ___]] := MolarMassConstant["CGS"]/1000; +MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["MTS"]], ___]] := MolarMassConstant["CGS"]/10^6; +MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["CGS"]], ___]] := MolarMassConstant["Natural"]; +MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["FFF"]], ___]] := MolarMassConstant["Natural"]; +MolarMassConstant[u:UnitSystem[BoltzmannConstant[UnitSystem["English"]], ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[u:UnitSystem[BoltzmannConstant[UnitSystem["English"]], ___], c_Coupling] := 1000 MolarMassConstant[UnitSystem["SI2019"],c] +MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["EnglishUS"]], ___]] := MolarMassConstant["Natural"]; +MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["IAU"]], ___]] = EvalUnitData["ms"]/1000; + +MonochromaticRadiation540THzLuminousEfficacy[UnitSystem[1, ___]] = 1 +MonochromaticRadiation540THzLuminousEfficacy[u : UnitSystem[_?NumericQ, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] +MonochromaticRadiation540THzLuminousEfficacy[u : UnitSystem[_Around, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] Universe[_] = Coupling["AbstractUniverse"] - -MolarMass[AbstractUnitSystem["AbstractUnits"]] = "Mu" -MolarMass[AbstractUnitSystem["AbstractUnits1"]] = "Mu1" -MolarMass[AbstractUnitSytem["AbstractUnits2"]] = "Mu2" -MolarMass[u : UnitSystem["kB", ___]] := MolarMass[u,Universe[u]] -MolarMass[u : UnitSystem["kB", ___], c_Coupling] := "NA" ElectronMass[AbstractUnitSystem["SI2019"],c]/ElectronUnit[c] -MolarMass[u : UnitSystem[10^7 "kB", ___]] := MolarMass[u, Universe[u]]; -MolarMass[UnitSystem[10^7 "kB", ___], c_Coupling] := 1000 MolarMass[AbstractUnitSystem["SI2019"], c]; -MolarMass[u : UnitSystem[10^3 "kB", ___]] := MolarMass[u, Universe[u]]; -MolarMass[UnitSystem[10^3 "kB", ___], c_Coupling] := MolarMass[AbstractUnitSystem["SI2019"], c]/1000; -MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["MTS"]], ___]] := MolarMass[UnitSystem["CGS"]]/10^6; -MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["CGS"]], ___]] := MolarMass[UnitSystem["Natural"]]; -MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["FFF"]], ___]] := MolarMass[UnitSystem["Natural"]]; -MolarMass[u : UnitSystem[Boltzmann[AbstractUnitSystem["English"]], ___]] := MolarMass[u, Universe[u]]; -MolarMass[u : UnitSystem[Boltzmann[AbstractUnitSystem["English"]], ___], c_Coupling] := - 1000 MolarMass[AbstractUnitSystem["SI2019"], c]; -MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["EnglishUS"]], ___]] := MolarMass[UnitSystem["Natural"]]; -MolarMass[UnitSystem[Boltzmann[AbstractUnitSystem["IAU"]], ___]] := 1/1000 AbstractUnitData["ms"]; - -LuminousEfficacy[AbstractUnitSystem["AbstractUnits1"]] = "Kcd1" -LuminousEfficacy[AbstractUnitSystem["AbstractUnits2"]] = "Kcd2" -LuminousEfficacy[u_UnitSystem] := Power["Kcd", AbstractUnitSystem["SI2019"], u] - -AbstractUnitData["Mu"] = MolarMass[AbstractUnitSystem["SI2019"]] - -Kilograms[m_] := Kilograms[m, UnitSystem["English"]]; +Universe[c_String] := Coupling[c] +Map[(Universe[AbstractUnitSystem[#]] := Coupling["AbstractUniverse"]) &, +{"Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","Natural","NaturalGauss","QCD","QCDGauss","QCDoriginal"}] + +MolarMassConstant[AbstractUnitSystem["AbstractUnits"]] = "Mu" +MolarMassConstant[AbstractUnitSystem["AbstractUnits1"]] = "Mu1" +MolarMassConstant[AbstractUnitSystem["AbstractUnits2"]] = "Mu2" +MolarMassConstant[u : UnitSystem["kB", ___]] := MolarMassConstant[u,Universe[u]] +MolarMassConstant[u : UnitSystem["kB", ___], c_Coupling] := "NA" ElectronMass[AbstractUnitSystem["SI2019"],c]/ElectronRelativeAtomicMass[c] +MolarMassConstant[u : UnitSystem[10^7 "kB", ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[UnitSystem[10^7 "kB", ___], c_Coupling] := 1000 MolarMassConstant[AbstractUnitSystem["SI2019"], c]; +MolarMassConstant[u : UnitSystem[10^3 "kB", ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[UnitSystem[10^3 "kB", ___], c_Coupling] := MolarMassConstant[AbstractUnitSystem["SI2019"], c]/1000; +MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["MTS"]], ___]] := MolarMassConstant["CGS"]/10^6; +MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["CGS"]], ___]] := MolarMassConstant["Natural"]; +MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["FFF"]], ___]] := MolarMassConstant["Natural"]; +MolarMassConstant[u : UnitSystem[BoltzmannConstant[AbstractUnitSystem["English"]], ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[u : UnitSystem[BoltzmannConstant[AbstractUnitSystem["English"]], ___], c_Coupling] := 1000 MolarMassConstant[AbstractUnitSystem["SI2019"], c]; +MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["EnglishUS"]], ___]] := MolarMassConstant["Natural"]; +MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["IAU"]], ___]] := 1/1000 AbstractUnitData["ms"]; + +MonochromaticRadiation540THzLuminousEfficacy[AbstractUnitSystem["AbstractUnits1"]] = "Kcd1" +MonochromaticRadiation540THzLuminousEfficacy[AbstractUnitSystem["AbstractUnits2"]] = "Kcd2" +MonochromaticRadiation540THzLuminousEfficacy[u_UnitSystem] := Power["Kcd", AbstractUnitSystem["SI2019"], u] + +AbstractUnitData["Mu"] = MolarMassConstant[AbstractUnitSystem["SI2019"]] + +Kilograms[m_] := Kilograms[m, "English"]; Kilograms[m_, u_UnitSystem] := Mass[m, UnitSystem["Metric"], u]; -Slugs[m_] := Slugs[m, UnitSystem["Metric"]]; +Kilograms[m_, u_String] := Mass[m, UnitSystem[u]]; +Slugs[m_] := Slugs[m, "Metric"]; Slugs[m_, u_UnitSystems] := Mass[m, UnitSystem["English"], u]; -Feet[d_] := Feet[d, UnitSystem["Metric"]]; +Slugs[m_, u_String] := Mass[m, UnitSystem[u]]; +Feet[d_] := Feet[d, "Metric"]; Feet[d_, u_UnitSystem] := Length[d, UnitSystem["English"], u]; -Meters[d_] := Meters[d, UnitSystem["English"]]; +Feet[d_, u_String] := Length[d, UnitSystem[u]]; +Meters[d_] := Meters[d, "English"]; Meters[d_, u_UnitSystem] := Length[d, UnitSystem["Metric"], u]; +Meters[d_, u_String] := Length[d, UnitSystem[u]]; (* IAU to SI *) UnitSystem /: @@ -449,18 +454,18 @@ Time[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], UnitSystem /: Length[u_UnitSystem, s_UnitSystem] := Length[u, s, 1]; UnitSystem /: Length[u_UnitSystem, s_UnitSystem, l_] := - Unit[(PlanckReduced[s] ElectronMass[u] LightSpeed[ - u])/(PlanckReduced[u] ElectronMass[s] LightSpeed[s]), l]; + Unit[(ReducedPlanckConstant[s] ElectronMass[u] SpeedOfLight[ + u])/(ReducedPlanckConstant[u] ElectronMass[s] SpeedOfLight[s]), l]; UnitSystem /: Area[u_UnitSystem, s_UnitSystem] := Unit[Length[u, s]^2]; UnitSystem /: Volume[u_UnitSystem, s_UnitSystem] := Unit[Length[u, s]^3]; WaveNumber[u_UnitSystem, s_UnitSystem] := Unit[Length[s, u]]; FuelEfficiency[u_UnitSystem, s_UnitSystem] := Area[s, u]; Time[u_UnitSystem, s_UnitSystem] := Time[u, s, 1]; -Time[u_UnitSystem, s_UnitSystem, t_] := Unit[Length[u, s]/LightSpeed[u, s], 1]; +Time[u_UnitSystem, s_UnitSystem, t_] := Unit[Length[u, s]/SpeedOfLight[u, s], 1]; Frequency[u_UnitSystem, s_UnitSystem] := Time[s, u]; FrequencyDrift[u_UnitSystem, s_UnitSystem] := Unit[Time[s, u]^2]; -Speed[u_UnitSystem, s_UnitSystem] := LightSpeed[u, s]; +Speed[u_UnitSystem, s_UnitSystem] := SpeedOfLight[u, s]; Acceleration[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]]; Jerk[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]^2]; Snap[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]^3]; @@ -481,8 +486,7 @@ SpecificVolume[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mass[u, s]]; Action[u_UnitSystem, s_UnitSystem] := Unit[Momentum[u, s] Length[u, s]]; Stiffness[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Area[u, s]]; Intensity[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Area[u, s]]; -Diffusivity[u_UnitSystem, s_UnitSystem] := - Unit[(PlanckReduced[s] ElectronMass[u])/(PlanckReduced[u] ElectronMass[s])]; +Diffusivity[u_UnitSystem, s_UnitSystem] := Unit[(ReducedPlanckConstant[s] ElectronMass[u])/(ReducedPlanckConstant[u] ElectronMass[s])]; Viscosity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]/Time[u, s]]; LinearDensity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]]; MassFlow[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Time[u, s]]; @@ -504,42 +508,36 @@ Inertance[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]^4]; Voltage = ElectricPotential Charge[u_UnitSystem, s_UnitSystem] := - Unit[Sqrt[(PlanckReduced[s] Permeability[u] LightSpeed[ - u] Rationalization[u] Lorentz[u]^2)/(PlanckReduced[ - u] Permeability[s] LightSpeed[s] Rationalization[s] Lorentz[s]^2)]]; + Unit[Sqrt[(ReducedPlanckConstant[s] MagneticConstant[u] SpeedOfLight[ + u] RationalizationConstant[u] LorentzConstant[u]^2)/(ReducedPlanckConstant[ + u] MagneticConstant[s] SpeedOfLight[s] RationalizationConstant[s] LorentzConstant[s]^2)]]; Current[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Time[u, s]]; ElectricPotential[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Charge[u, s]]; Capacitance[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/ElectricPotential[u, s]]; Resistance[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s]/Current[u, s]]; Conductance[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s]/ElectricPotential[u, s]]; -MagneticFlux[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Lorentz[u, s]/Current[u, s]]; +MagneticFlux[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/LorentzConstant[u, s]/Current[u, s]]; MagneticFluxDensity[u_UnitSystem, s_UnitSystem] := - Unit[Mass[u, s]/Lorentz[u, s]/Current[u, s]/Time[u, s]^2]; + Unit[Mass[u, s]/LorentzConstant[u, s]/Current[u, s]/Time[u, s]^2]; Inductance[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Area[u, s]/Charge[u, s]^2]; -ElectricFluxDensity[u_UnitSystem, s_UnitSystem] := - Unit[Charge[u, s] Rationalization[u, s]/Area[u, s]]; +ElectricFluxDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] RationalizationConstant[u, s]/Area[u, s]]; ChargeDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Volume[u, s]]; CurrentDensity[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s]/Area[u, s]]; Conductivity[u_UnitSystem, s_UnitSystem] := Unit[Conductance[u, s]/Length[u, s]]; -Permittivity[u_UnitSystem, s_UnitSystem] := - Unit[Capacitance[u, s] Rationalization[u, s]/Length[u, s]]; -ElectricField[u_UnitSystem, s_UnitSystem] := - Unit[ElectricPotential[u, s]/Length[u, s]]; -MagneticField[u_UnitSystem, s_UnitSystem] := - Unit[Current[u, s] Rationalization[u, s] Lorentz[u, s]/Length[u, s]]; +Permittivity[u_UnitSystem, s_UnitSystem] := Unit[Capacitance[u, s] RationalizationConstant[u, s]/Length[u, s]]; +ElectricField[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s]/Length[u, s]]; +MagneticField[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s] RationalizationConstant[u, s] LorentzConstant[u, s]/Length[u, s]]; Exposure[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Mass[u, s]]; Resistivity[u_UnitSystem, s_UnitSystem] := Unit[Resistance[u, s] Length[u, s]]; LinearChargeDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Length[u, s]]; -MagneticDipoleMoment[u_UnitSystem, s_UnitSystem] := - Unit[Current[u, s] Lorentz[u, s] Area[u, s]]; +MagneticDipoleMoment[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s] LorentzConstant[u, s] Area[u, s]]; Mobility[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] Time[u, s]/Mass[u, s]]; -Reluctance[u_UnitSystem, s_UnitSystem] := - Unit[Rationalization[u, s] Lorentz[u, s]^2/Inductance[u, s]]; +Reluctance[u_UnitSystem, s_UnitSystem] := Unit[RationalizationConstant[u, s] LorentzConstant[u, s]^2/Inductance[u, s]]; VectorPotential[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s]/Length[u, s]]; MagneticMoment[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s] Length[u, s]]; Rigidity[u_UnitSystem, s_UnitSystem] := Unit[MagneticFluxDensity[u, s] Length[u, s]]; -Susceptibility[u_UnitSystem, s_UnitSystem] := Unit[Rationalization[s, u]]; +Susceptibility[u_UnitSystem, s_UnitSystem] := Unit[RationalizationConstant[s, u]]; (* WARNING unchecked: rigitidy, magneticmoment, vectorpotential, \ mobility, linearchargedensity, exposure *) @@ -549,14 +547,10 @@ ElectricDipoleMoment[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] Length[u, MagneticPotential[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s] Reluctance[u, s]]; PoleStrength[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/Length[u, s]]; Permeance[u_UnitSystem, s_UnitSystem] := Reluctance[s, u]; -SpecificSusceptibility[u_UnitSystem, s_UnitSystem] := - Unit[MagneticDipoleMoment[u, s]/MagneticField[u, s]/Mass[u, s]]; -Magnetizability[u_UnitSystem, s_UnitSystem] := - Unit[MagneticMoment[u, s]/MagneticFluxDensity[u, s]]; -ElectricPolarizability[u_UnitSystem, s_UnitSystem] := - Unit[ElectricDipoleMoment[u, s]/ElectricField[u, s]]; -MagneticPolarizability[u_UnitSystem, s_UnitSystem] := - Unit[MagneticDipoleMoment[u, s]/MagneticField[u, s]]; +SpecificSusceptibility[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/MagneticField[u, s]/Mass[u, s]]; +Magnetizability[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[u, s]/MagneticFluxDensity[u, s]]; +ElectricPolarizability[u_UnitSystem, s_UnitSystem] := Unit[ElectricDipoleMoment[u, s]/ElectricField[u, s]]; +MagneticPolarizability[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/MagneticField[u, s]]; Magnetization[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[u, s]/Volume[u, s]]; SpecificMagnetization[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[s, u]/Mass[s, u]]; @@ -564,140 +558,188 @@ DemagnetizingFactor[u_UnitSystem, s_UnitSystem] := Unit[Rationalization[u, s]]; (* Thermodynamic *) -Moles[n_] := Moles[n, Metric]; -Moles[n_, u_UnitSystem] := n/Avogadro[u]; -Molecules[n_] := Molecules[n, Metric]; -Molecules[n_, u_UnitSystem] := n Avogadro[u]; +Moles[n_] := Moles[n, "Metric"]; +Moles[n_, u_UnitSystem] := n/AvogadroConstant[u]; +Moles[n_, u_String] := Moles[n, UnitSystem[u]]; +Molecules[n_] := Molecules[n, "Metric"]; +Molecules[n_, u_UnitSystem] := n AvogadroConstant[u]; +Molecules[n_, u_String] := Molecules[n, UnitSystem[u]]; Temperature[u_UnitSystem, s_UnitSystem] := - Unit[(Boltzmann[u] ElectronMass[s] LightSpeed[s]^2)/(Boltzmann[ - s] ElectronMass[u] LightSpeed[u]^2)]; -UnitSystem /: Entropy[u_UnitSystem, s_UnitSystem] := - Unit[Energy[u, s]/Temperature[u, s]]; -SpecificEntropy[u_UnitSystem, s_UnitSystem] := - Unit[SpecificEnergy[u, s]/Temperature[u, s]]; + Unit[(BoltzmannConstant[u] ElectronMass[s] SpeedOfLight[s]^2)/(BoltzmannConstant[ + s] ElectronMass[u] SpeedOfLight[u]^2)]; +UnitSystem /: Entropy[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Temperature[u, s]]; +SpecificEntropy[u_UnitSystem, s_UnitSystem] := Unit[SpecificEnergy[u, s]/Temperature[u, s]]; VolumeHeatCapacity[u_UnitSystem, s_UnitSystem] := Unit[Entropy[u, s]/Volume[u, s]]; -ThermalConductivity[u_UnitSystem, s_UnitSystem] := - Unit[Force[u, s]/Time[u, s]/Temperature[u, s]]; -ThermalConductance[u_UnitSystem, s_UnitSystem] := - Unit[ThermalConductivity[u, s] Length[u, s]]; +ThermalConductivity[u_UnitSystem, s_UnitSystem] := Unit[Force[u, s]/Time[u, s]/Temperature[u, s]]; +ThermalConductance[u_UnitSystem, s_UnitSystem] := Unit[ThermalConductivity[u, s] Length[u, s]]; ThermalResistance[u_UnitSystem, s_UnitSystem] := ThermalConductance[s, u]; ThermalExpansion[u_UnitSystem, s_UnitSystem] := Temperature[s, u]; LapseRate[u_UnitSystem, s_UnitSystem] := Unit[Temperature[u, s]/Length[u, s]]; -Molality[u_UnitSystem, s_UnitSystem] := MolarMass[s, u]; +Molality[u_UnitSystem, s_UnitSystem] := MolarMassConstant[s, u]; Mole[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Molality[u, s]]; -Molarity[u_UnitSystem, s_UnitSystem] := - Unit[Mole[u, s]/Volume[u, s]]; -MolarVolume[u_UnitSystem, s_UnitSystem] := - Unit[Volume[u, s]/Mole[u, s]]; -MolarEntropy[u_UnitSystem, s_UnitSystem] := - Unit[Entropy[u, s]/Mole[u, s]]; -MolarEnergy[u_UnitSystem, s_UnitSystem] := - Unit[Energy[u, s]/Mole[u, s]]; -MolarConductivity[u_UnitSystem, s_UnitSystem] := - Unit[Conductivity[u, s] Area[u, s]/Mole[u, s]]; -MolarSusceptibility[u_UnitSystem, s_UnitSystem] := - Unit[SpecificSusceptibility[u, s] MolarMass[u, s]]; +Molarity[u_UnitSystem, s_UnitSystem] := Unit[Mole[u, s]/Volume[u, s]]; +MolarVolume[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mole[u, s]]; +MolarEntropy[u_UnitSystem, s_UnitSystem] := Unit[Entropy[u, s]/Mole[u, s]]; +MolarEnergy[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Mole[u, s]]; +MolarConductivity[u_UnitSystem, s_UnitSystem] := Unit[Conductivity[u, s] Area[u, s]/Mole[u, s]]; +MolarSusceptibility[u_UnitSystem, s_UnitSystem] := Unit[SpecificSusceptibility[u, s] MolarMass[u, s]]; Catalysis[u_UnitSystem, s_UnitSystem] := Unit[Mole[u, s]/Time[u, s]]; -Specificity[u_UnitSystem, s_UnitSystem] := - Unit[Volume[u, s]/Mole[u, s]/Time[u, s]]; - -LuminousFlux[u_UnitSystem, s_UnitSystem] := - Unit[Frequency[u, - s]^2 (LuminousEfficacy[s] PlanckReduced[s])/(LuminousEfficacy[ - u] PlanckReduced[u])]; -Luminance[u_UnitSystem, s_UnitSystem] := - Unit[LuminousFlux[u, s]/Area[u, s]]; -LuminousEnergy[u_UnitSystem, s_UnitSystem] := - Unit[Frequency[u, - s] (LuminousEfficacy[s] PlanckReduced[s])/(LuminousEfficacy[ - u] PlanckReduced[u])]; -LuminousExposure[u_UnitSystem, s_UnitSystem] := - Unit[Luminance[u, s] Time[u, s]]; +Specificity[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mole[u, s]/Time[u, s]]; + +LuminousFlux[u_UnitSystem, s_UnitSystem] := Unit[Frequency[u, s]^2 (MonochromaticRadiation540THzLuminousEfficacy[s] ReducedPlanckConstant[s])/(MonochromaticRadiation540THzLuminousEfficacy[u] ReducedPlanckConstant[u])]; +Luminance[u_UnitSystem, s_UnitSystem] := Unit[LuminousFlux[u, s]/Area[u, s]]; +LuminousEnergy[u_UnitSystem, s_UnitSystem] := Unit[Frequency[u, s] (MonochromaticRadiation540THzLuminousEfficacy[s] ReducedPlanckConstant[s])/(MonochromaticRadiation540THzLuminousEfficacy[u] ReducedPlanckConstant[u])]; +LuminousExposure[u_UnitSystem, s_UnitSystem] := Unit[Luminance[u, s] Time[u, s]]; (* Physics *) -Hyperfine[u_UnitSystem] := Frequency[UnitData["\[CapitalDelta]\[Nu]Cs"], u]; - -Map[(#[u_UnitSystem] := #[u, Universe[u]]) &, {Avogadro, AtomicMass, - ProtonMass, Einstein, Universal, Stefan, RadiationDensity, - Permittivity, Coulomb, BiotSavart, Impedance, Faraday, Josephson, - MagneticFlux, Klitzing, Conductance, Hartree, Rydberg, Bohr, - BohrReduced, ElectronRadius, Magneton}]; -Avogadro[u_UnitSystem, c_Coupling] := - MolarMass[u, c] ElectronUnit[c]/ElectronMass[u, c]; -AtomicMass[u_UnitSystem, c_Coupling] := ElectronMass[u, c]/ElectronUnit[c]; -ProtonMass[u_UnitSystem, c_Coupling] := ProtonElectron[c] ElectronMass[u, c]; -Einstein[u_UnitSystem, c_Coupling] := (8 Pi Newton[u, c])/LightSpeed[u, c]^4; -Universal[u_UnitSystem, c_Coupling] := Boltzmann[u, c] Avogadro[u, c]; -Stefan[u_UnitSystem, c_Coupling] := (2 Pi^5 Boltzmann[u, c]^4)/( - 15 Planck[u, c]^3 LightSpeed[u, c]^2); -RadiationDensity[u_UnitSystem, c_Coupling] := (4 Stefan[u, c])/LightSpeed[u, c]; -Permittivity[u_UnitSystem, c_Coupling] := - (1/Permeability[u, c]) (LightSpeed[u, c] Lorentz[u]^2); -Coulomb[u_UnitSystem, c_Coupling] := - Rationalization[u]/(4 Pi)/ Permittivity[u]; -BiotSavart[u_UnitSystem, c_Coupling] := - Permeability[u, c] Lorentz[u] (Rationalization[u]/(4 Pi)); -Ampere[u_UnitSystem] := Lorentz[u] BiotSavart[u]; -Impedance[u_UnitSystem, c_Coupling] := - -Permeability[u, c] LightSpeed[u, c] Rationalization[u] Lorentz[u]^2; -Faraday[u_UnitSystem, c_Coupling] := Charge[u, c] Avogadro[u, c]; -Josephson[u_UnitSystem, c_Coupling] := 2 Charge[u, c] Lorentz[u]/Planck[u, c]; -MagneticFlux[u_UnitSystem, c_Coupling] := 1/Josephson[u, c]; -Klitzing[u_UnitSystem, c_Coupling] := Planck[u, c]/Charge[u, c]^2; -Conductance[u_UnitSystem, c_Coupling] := (2 Charge[u, c]^2)/Planck[u, c]; -Hartree[u_UnitSystem, c_Coupling] := - ElectronMass[u, c] (LightSpeed[u, c] FineStructure[c])^2; -Rydberg[u_UnitSystem, c_Coupling] := Hartree[u, c]/(2 Planck[u, c])/LightSpeed[u, c]; -Bohr[u_UnitSystem, c_Coupling] := - PlanckReduced[u, c]/ElectronMass[u, c]/LightSpeed[u, c]/FineStructure[c]; -BohrReduced[u_UnitSystem, c_Coupling] := Bohr[u, c] (1 + 1/ProtonElectron[c]); -ElectronRadius[u_UnitSystem, c_Coupling] := - FineStructure[c] PlanckReduced[u, c]/ElectronMass[u, c]/LightSpeed[u, c]; -Magneton[u_UnitSystem, c_Coupling] := - Charge[u, c] PlanckReduced[u, c] Lorentz[u]/2 ElectronMass[u, c]; +Cesium133HyperfineSplittingFrequency[u_UnitSystem] := Frequency[UnitData["\[CapitalDelta]\[Nu]Cs"], u]; + +Map[(#[u_UnitSystem] := #[u, Universe[u]]) &, {AvogadroConstant, AtomicMassConstant, ProtonMass, EinsteinConstantSpeedOfLightToTheFourth, MolarGasConstant, StefanBoltzmannConstant, RadiationConstant, ElectricConstant, CoulombConstant, BiotSavartConstant, VacuumImpedance, FaradayConstant, JosephsonConstant, MagneticFluxQuantum, VonKlitzingConstant, ConductanceQuantum, HartreeEnergy, RydbergConstant, BohrRadius, RelativisticBohrRadius, ClassicalElectronRadius, BohrMagneton}]; +AvogadroConstant[u_UnitSystem, c_Coupling] := MolarMassConstant[u, c] ElectronRelativeAtomicMass[c]/ElectronMass[u, c]; +AtomicMassConstant[u_UnitSystem, c_Coupling] := ElectronMass[u, c]/ElectronRelativeAtomicMass[c]; +ProtonMass[u_UnitSystem, c_Coupling] := ProtonElectronMassRatio[c] ElectronMass[u, c]; +EinsteinConstantSpeedOfLightToTheFourth[u_UnitSystem, c_Coupling] := (8 Pi GravitationalConstant[u, c])/SpeedOfLight[u, c]^4; +MolarGasConstant[u_UnitSystem, c_Coupling] := BoltzmannConstant[u, c] AvogadroConstant[u, c]; +StefanBoltzmannConstant[u_UnitSystem, c_Coupling] := (2 Pi^5 BoltzmannConstant[u, c]^4)/(15 PlanckConstant[u, c]^3 SpeedOfLight[u, c]^2); +RadiationConstant[u_UnitSystem, c_Coupling] := (4 StefanBoltzmannConstant[u, c])/SpeedOfLight[u, c]; +ElectricConstant[u_UnitSystem, c_Coupling] := (1/MagneticConstant[u, c]) (SpeedOfLight[u, c] LorentzConstant[u]^2); +CoulombConstant[u_UnitSystem, c_Coupling] := RationalizationConstant[u]/(4 Pi)/ ElectricConstant[u]; +BiotSavartConstant[u_UnitSystem, c_Coupling] := MagneticConstant[u, c] LorentzConstant[u] (RationalizationConstant[u]/(4 Pi)); +AmpereConstant[u_UnitSystem] := LorentzConstant[u] BiotSavartConstant[u]; +VacuumImpedance[u_UnitSystem, c_Coupling] := MagneticConstant[u, c] SpeedOfLight[u, c] RationalizationConstant[u] LorentzConstant[u]^2; +FaradayConstant[u_UnitSystem, c_Coupling] := ElementaryCharge[u, c] AvogadroConstant[u, c]; +JosephsonConstant[u_UnitSystem, c_Coupling] := 2 ElementaryCharge[u, c] LorentzConstant[u]/PlanckConstant[u, c]; +MagneticFluxQuantum[u_UnitSystem, c_Coupling] := 1/JosephsonConstant[u, c]; +VonKlitzingConstant[u_UnitSystem, c_Coupling] := PlanckConstant[u, c]/ElementaryCharge[u, c]^2; +ConductanceQuantum[u_UnitSystem, c_Coupling] := (2 ElementaryCharge[u, c]^2)/PlanckConstant[u, c]; +HartreeEnergy[u_UnitSystem, c_Coupling] := ElectronMass[u, c] (SpeedOfLight[u, c] FineStructureConstant[c])^2; +RydbergConstant[u_UnitSystem, c_Coupling] := HartreeEnergy[u, c]/(2 PlanckConstant[u, c])/SpeedOfLight[u, c]; +BohrRadius[u_UnitSystem, c_Coupling] := ReducedPlanckConstant[u, c]/ElectronMass[u, c]/SpeedOfLight[u, c]/FineStructureConstant[c]; +RelativisticBohrRadius[u_UnitSystem, c_Coupling] := BohrRadius[u, c] (1 + 1/ProtonElectronMassRatio[c]); +ClassicalElectronRadius[u_UnitSystem, c_Coupling] := FineStructureConstant[c] ReducedPlanckConstant[u, c]/ElectronMass[u, c]/SpeedOfLight[u, c]; +BohrMagneton[u_UnitSystem, c_Coupling] := ElementaryCharge[u, c] ReducedPlanckConstant[u, c] LorentzConstant[u]/2 ElectronMass[u, c]; + +Map[( + #[u_String, c_String] := #[UnitSystem[u], Coupling[c]]; + #[u_String] := #[UnitSystem[u]] +) &, Join[ConstantsList, PhysicsList]] + +Map[(#[c_String] := #[Coupling[c]]) &, {GravitationalCouplingConstantElectronElectron, FineStructureConstant, ElectronRelativeAtomicMass, ProtonRelativeAtomicMass, ProtonElectronMassRatio}] + +Map[(symbol[ToString[#]] = #) &, Join[ConstantsList, PhysicsList, {GravitationalCouplingConstantElectronElectron, FineStructureConstant, ElectronRelativeAtomicMass, ProtonRelativeAtomicMass, ProtonElectronMassRatio}]] + +Coupling /: Entity["PhysicalConstant", x_][c_Coupling] := symbol[x][c] +UnitSystem /: Entity["PhysicalConstant", x_][u_UnitSystem] := symbol[x][u] +UnitSystem /: Entity["PhysicalConstant", x_][u_UnitSystem, c_Coupling] := symbol[x][u, c] +(u_UnitSystem)[Entity["PhysicalConstant", x_]] := symbol[x][u] +(u_UnitSystem)[x_String] := symbol[x][u] +(c_Coupling)[Entity["PhysicalConstant", x_]] := symbol[x][c] +(c_Coupling)[x_String] := symbol[x][c] + +UnitConstant[x_Symbol, u_] := x[u] +UnitConstant[x_String, u_] := UnitConstant[symbol[x], u] +UnitConstant[x_Symbol, u_, c_] := x[u, c] +UnitConstant[x_String, u_, c_] := UnitConstant[symbol[x], u, c] + +Map[(convert[ToString[#]] = #) &, ConvertList] + +ConvertUnit[x_Symbol, u_] := x[u] +ConvertUnit[x_String, u_] := convert[x][u] +ConvertUnit[x_Symbol, a_, b_] := x[a, b] +ConvertUnit[x_String, a_, b_] := convert[x][a, b] +ConvertUnit[x_Symbol, v_, u_, s_] := x[v, u, s] +ConvertUnit[x_String, v_, u_, s_] := convert[x][v, u, s] (* more *) + +DerivedUnits = <| +"NaturalUnitOfEnergy" -> Energy["AbstractNatural","AbstractSI2019"], +"NaturalUnitOfLength" -> Length["AbstractNatural","AbstractSI2019"], +"NaturalUnitOfMomentum" -> Momentum["AbstractNatural","AbstractSI2019"], +"NaturalUnitOfTime" -> Time["AbstractNatural","AbstractSI2019"], +"PlanckArea" -> Area[UnitSystem["AbstractPlanckGauss"],UnitSystem["AbstractSI2019"]] +"PlanckFrequency" -> Frequency["AbstractPlanckGauss","AbstractSI2019"], +"PlanckLength" -> Length["AbstractPlanckGauss","AbstractSI2019"], +"PlanckMassDensity" -> Density["AbstractPlanckGauss","AbstractSI2019"], +"PlanckTemperature" -> Temperature["AbstractPlanckGauss","AbstractSI2019"], +"PlanckTime" -> Time["AbstractPlanckGauss","AbstractSI2019"], +"PlanckVolume" -> Volume[UnitSystem["AbstractPlanckGauss"],UnitSystem["AbstractSI2019"]], +"AtomicUnitOfElectricConductance" -> Conductance["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfElectricChargeDensity" -> ChargeDensity["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfElectricCurrent" -> Current["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfElectricFieldStrength" -> ElectricField["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfElectricPermittivity" -> ElectricConstant["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfElectricPolarizability" -> ElectricPolarizability["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfElectricPotential" -> ElectricPotential["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfForce" -> Force["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfFrequency" -> Frequency["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfMagneticFlux" -> MagneticFlux["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfMagneticFluxDensity" -> MagneticFluxDensity["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfMagneticMoment" -> MagneticDipoleMoment["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfMomentum" -> Momentum["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfPressure" -> Pressure["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfTemperature" -> Temperature["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfTime" -> Time["AbstractHartree","AbstractSI2019"], +"AtomicUnitOfVelocity" -> Speed["AbstractHartree","AbstractSI2019"], +"RydbergEnergy" -> Energy["AbstractRydberg","AbstractSI2019"], +"SolarMass" -> Mass["AbstractIAU","AbstractSI2019"], +"AstronomicalUnit" -> Length["AbstractIAU","AbstractSI2019"], +"CosmologicalNaturalLength" -> Length["AbstractCosmological","AbstractSI2019"], +"CosmologicalNaturalMass" -> Mass["AbstractCosmological","AbstractSI2019"], +"CosmologicalNaturalTime" -> Time["AbstractCosmological","AbstractSI2019"], +"CosmologicalQuantumPointLength" -> Length["AbstractCosmologicalQuantum","AbstractSI2019"], +"CosmologicalQuantumPointMass" -> Mass["AbstractCosmologicalQuantum","AbstractSI2019"], +"CosmologicalQuantumPointEnergy" -> Energy["AbstractCosmologicalQuantum","AbstractSI2019"], +"HubbleLength" -> Length["AbstractHubble","AbstractSI2019"], +"HubbleTime" -> Time["AbstractHubble","AbstractSI2019"], +"HubbleVolume" -> Volume[UnitSystem["AbstractHubble"],UnitSystem["AbstractSI2019"]] +|> + (* -\[Kappa] = Einstein[UnitSystem["SI2019"]]; -\[Sigma] = Stefan[UnitSystem["SI2019"]];(**) -\[Mu]B = Magneton[UnitSystem["SI2019"]];(**) -\[CurlyEpsilon]0 = Permittivity[UnitSystem["SI2019"]];(**) - -ke = Coulomb[UnitSystem["SI2019"]];(**) -mp = ProtonMass[UnitSystem["SI2019"]]; -mu = AtomicMass[UnitSystem["SI2019"]]; -Mu = MolarMass[UnitSytem["SI2019"]]; -\|01d509 = Faraday[UnitSystem["SI2019"]];(**) -\[CapitalPhi]0 = MagneticFlux[UnitSystem["SI2019"]];(**) -Z0 = Impedance[UnitSystem["SI2019"]];(**) - -G0 = Conductance[UnitSystem["SI2019"]];(**) -Eh = Hartree[UnitSystem["SI2019"]]; -a0 = Bohr[UnitSystem["SI2019"]]; -re = ElectronRadius[UnitSystem["SI2019"]]; -RK = Klitzing[UnitSystem["SI2019"]];(**) -KJ = Josephson[UnitSystem["SI2019"]];(**) -{RH, Ry} = {R\[Infinity] mp/(me + mp), h c R\[Infinity]}; - -\[ScriptL]P = Length[UnitSystem["PlanckGauss"], UnitSystem["SI2019"]]; -tP = Time[UnitSystem["PlanckGauss"], UnitSystem["SI2019"]]; -TP = Temperature[UnitSystem["PlanckGauss"], UnitSystem["SI2019"]]; - -lS = Length[UnitSystem["Stoney"], UnitSystem["SI2019"]]; -tS = Time[UnitSystem["Stoney"], UnitSystem["SI2019"]]; -mS = Mass[UnitSystem["Stoney"], UnitSystem["SI2019"]]; -qS = Charge[UnitSystem["Stoney"], UnitSystem["SI2019"]]; - -(*lA=Length[UnitSystem["Hartree"],UnitSystem["SI2019"]]; -tA=Time[UnitSystem["Hartree"],UnitSystem["SI2019"]]; -mA=Mass[UnitSystem["Hartree"],UnitSystem["SI2019"]]; -qA=Charge[UnitSystem["Hartree"],UnitSystem["SI2019"]];*) - -lQCD = Length[UnitSystem["QCD"], UnitSystem["SI2019"]]; -tQCD = Time[UnitSystem["QCD"], UnitSystem["SI2019"]]; -mQCD = Mass[UnitSystem["QCD"], UnitSystem["SI2019"]]; +"AtomicUnitOfLength" -> Length[UnitSystem["Hartree"],UnitSystem["SI2019"]]; +"lS" -> Length[UnitSystem["Stoney"], UnitSystem["SI2019"]]; +"tS" -> Time[UnitSystem["Stoney"], UnitSystem["SI2019"]]; +"mS" -> Mass[UnitSystem["Stoney"], UnitSystem["SI2019"]]; +"lQCD" -> Length[UnitSystem["QCD"], UnitSystem["SI2019"]]; +"tQCD" -> Time[UnitSystem["QCD"], UnitSystem["SI2019"]]; +"mQCD" -> Mass[UnitSystem["QCD"], UnitSystem["SI2019"]]; *) + +(*ConstantsList = {Hyperfine, LightSpeed, Planck, PlanckReduced, + ElectronMass, MolarMass, Boltzmann, Permeability, Rationalization, + Lorentz, LuminousEfficacy}; +PhysicsList = {AtomicMass, ProtonMass, PlanckMass, Newton, Einstein, + Hartree, Rydberg, Bohr, BohrReduced, ElectronRadius, Avogadro, + Universal, Stefan, RadiationDensity, Permittivity, Coulomb, Ampere, + BiotSavart, Charge, Faraday, Impedance, Conductance, Klitzing, + Josephson, MagneticFlux, Magneton};*) + +(*AppendTo[UnitData, "kelvin" -> 9/5] +AppendTo[UnitData, "atm" -> 101325] +AppendTo[UnitData, "kcalth" -> 4184] +AppendTo[UnitData, "kcal4" -> 4204] +AppendTo[UnitData, "kcal10" -> 4185+1/2] +AppendTo[UnitData, "kcal20" -> 4182] +AppendTo[UnitData, "kcalm" -> 4190] +AppendTo[UnitData, "kcalit" -> 4186+8/10] +AppendTo[UnitData, "cal4" -> UnitData[["kcal4"]]/1000] +AppendTo[UnitData, "cal10" -> UnitData[["kcal10"]]/1000] +AppendTo[UnitData, "cal20" -> UnitData[["kcal20"]]/1000] +AppendTo[UnitData, "calm" -> UnitData[["kcalm"]]/1000] +AppendTo[UnitData, "calit" -> UnitData[["kcalit"]]/1000] +AppendTo[UnitData, "calth" -> UnitData[["kcalth"]]/1000] +AppendTo[UnitData, "kcal" -> UnitData[["kcalth"]]] +AppendTo[UnitData, "cal" -> UnitData[["kcal"]]/1000] +AppendTo[UnitData, "calth" -> thermal calorie +AppendTo[UnitData, "GMearth" -> Around[398600441.8 10^6, 8 10^5]] +AppendTo[UnitData, "GMjupiter" -> Around[1.26686534 10^17, 9 10^9] +AppendTo[UnitData, "LD" -> 384402 10^3] +AppendTo[UnitData, "ly" -> (365.25 "c" "day")/.Normal[UnitData]]*) + +UnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1] +UnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1] +Map[(UnitSystem[#] = AbstractUnitSystem[#] /. Normal[UnitData]) &, +{"AbstractUnits","AbstractUnits1","AbstractUnits2","Gauss","LorentzHeaviside","Thomson","Kennelly","ESU","ESU2019","EMU","EMU2019","MTS","Mixed","Metric","SI1976","SI2019","CODATA","Conventional","English","EnglishUS","IAU","FFF","Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","QCD","QCDGauss","QCDoriginal","Hubble","Cosmological","CosmologicalQuantum"}]; From c7440c2f3292a553bc065e6d79ae6beb9a89f1bc Mon Sep 17 00:00:00 2001 From: Michael Reed <18372368+chakravala@users.noreply.github.com> Date: Thu, 27 Jan 2022 00:08:18 -0500 Subject: [PATCH 08/11] implemented UnitSystem entities --- Kernel/UnitSystems.wl | 811 +++++++++++------------------------------- Kernel/physics.wl | 296 +++++++++++++++ Kernel/systems.wl | 159 +++++++++ 3 files changed, 654 insertions(+), 612 deletions(-) create mode 100644 Kernel/physics.wl create mode 100644 Kernel/systems.wl diff --git a/Kernel/UnitSystems.wl b/Kernel/UnitSystems.wl index 7d0ee94..c27ec34 100644 --- a/Kernel/UnitSystems.wl +++ b/Kernel/UnitSystems.wl @@ -9,11 +9,12 @@ UnitSystemsList = {"Metric", "SI2019", "CODATA", "Conventional", "MTS", "English "Gauss", "LorentzHeaviside", "Thomson", "Kennelly", "Planck", "PlanckGauss", "Stoney", "Hartree", "Rydberg", "Schrodinger", "Electronic", "Natural", "NaturalGauss", "QCD", "QCDGauss", "QCDoriginal", "Hubble", "Cosmological", "CosmologicalQuantum"}; -ConstantsList = {Cesium133HyperfineSplittingFrequency, SpeedOfLight, +DimensionlessList = {GravitationalCouplingConstantElectronElectron, FineStructureConstant, ElectronRelativeAtomicMass, ProtonRelativeAtomicMass, ProtonElectronMassRatio, UniverseDarkEnergyMassDensity} +ConstantsList = {Cesium133HyperfineSplittingFrequency, HubbleParameter, SpeedOfLight, PlanckConstant, ReducedPlanckConstant, ElectronMass, MolarMassConstant, BoltzmannConstant, MagneticConstant, RationalizationConstant, LorentzConstant, MonochromaticRadiation540THzLuminousEfficacy}; -PhysicsList = {AtomicMassConstant, ProtonMass, PlanckMass, +PhysicsList = {CosmologicalConstant, AtomicMassConstant, ProtonMass, PlanckMass, GravitationalConstant, EinsteinConstantSpeedOfLightToTheFourth, HartreeEnergy, RydbergConstant, BohrRadius, RelativisticBohrRadius, ClassicalElectronRadius, @@ -54,19 +55,12 @@ ConvertList = Join[MechanicsList, ElectromagneticList, ThermodynamicList, MolarList, PhotometricList]; -OneQ[1] := True -OneQ[-1] := False -OneQ[0] := False -OneQ[_] := False -OneQ[x_?NumberQ] := x == 1 -OneQ[True] := True -OneQ[False] := False - measure[x_] := x; GravitationalCouplingConstantElectronElectron[Coupling[\[Alpha]G_, ___]] := measure[\[Alpha]G]; FineStructureConstant[Coupling[_, \[Alpha]_, ___]] := measure[\[Alpha]]; ElectronRelativeAtomicMass[Coupling[_, _, \[Mu]eu_, ___]] := measure[\[Mu]eu]; ProtonRelativeAtomicMass[Coupling[_, _, _, \[Mu]pu_, ___]] := measure[\[Mu]pu]; +UniverseDarkEnergyMassDensity[Coupling[_, _, _, _, OL_, ___]] := measure[OL]; ProtonElectronMassRatio[c_Coupling] := ProtonRelativeAtomicMass[c]/ElectronRelativeAtomicMass[c]; BoltzmannConstant[UnitSystem[kB_, ___]] := kB; @@ -82,631 +76,200 @@ RationalizationConstant[_UnitSystem] := 1 RationalizedQ[u_UnitSystem] := RationalizationConstant[u] != 4 Pi RationalizedQ[u_String] := RationalizedQ[UnitSystem[u]] -Universe[UnitSystem[_?NumericQ, ___]] := StandardModel -Universe[UnitSystem[_Around, ___]] := StandardModel +Universe[UnitSystem[_?NumericQ, ___]] := Coupling["StandardModel"] +Universe[UnitSystem[_Around, ___]] := Coupling["StandardModel"] Unit[x_, y_ : 1] := PowerExpand[x]; -UnitData = <||> - -AppendTo[UnitData, "g0" -> 980665/10^5] -AppendTo[UnitData, "ft" -> 3048/10000] -AppendTo[UnitData, "ftUS" -> 1200/3937] -AppendTo[UnitData, "lb" -> 45359237/10^8] -AppendTo[UnitData, "rankine" -> 5/9] -AppendTo[UnitData, "\[CapitalDelta]\[Nu]Cs" -> 9192631770] -AppendTo[UnitData, "Kcd" -> 683 555016/555000] -AppendTo[UnitData, "mP" -> Around[2.176434/10^8, 24/10^14]] -AppendTo[UnitData, "NA" -> 602214076 10^15] -AppendTo[UnitData, "kB" -> 1380649/10^29] -AppendTo[UnitData, "h" -> 662607015/10^42] -AppendTo[UnitData, "c" -> 299792458] -AppendTo[UnitData, "e" -> 1602176634/10^28] -AppendTo[UnitData, "\[Mu]eu" -> 1/Around[1822.888486209, 53/10^9]] -AppendTo[UnitData, "\[Mu]pu" -> Around[1.007276466621, 53/10^12]] -AppendTo[UnitData, "\[Alpha]" -> 1/Around[137.035999084, 21/10^9]] -AppendTo[UnitData, "R\[Infinity]" -> Around[10973731.5681601, 21/10^6]] -AppendTo[UnitData, "RK1990" -> 25812807/1000] -AppendTo[UnitData, "RK2014" -> Around[25812.8074555, 59/10^7]] -AppendTo[UnitData, "KJ1990" -> 4835979 10^8] -AppendTo[UnitData, "KJ2014" -> Around[4.835978525 10^14, 3 10^6]] -AppendTo[UnitData, "GMsun" -> Around[1.32712442099 10^20, 9 10^9]] -AppendTo[UnitData, "day" -> 60^2 24] -AppendTo[UnitData, "au" -> 149597870700] -AppendTo[UnitData, "fur" -> 201168/1000] -AppendTo[UnitData, "H0" -> Around[67.66, 0.42]] -AppendTo[UnitData, "\[CapitalOmega]\[CapitalLambda]" -> Around[0.6889, 0.0056]] - -AbstractUnitData["slug"] = "lb" "g0"/"ft" -AbstractUnitData["slugUS"] = "lb" "g0"/"ftUS" -AbstractUnitData["Ru"] = "NA" "kB" -AbstractUnitData["me"] = 2 "R\[Infinity]" "h"/"\[Alpha]"^2/"c" -AbstractUnitData["\[Mu]0"] = 2 "\[Alpha]" "h"/"c"/"e"^2 (*\[TildeTilde]4\[Pi]*(1e-7+5.5e-17),exact charge*) -AbstractUnitData["\[HBar]"] = "h"/(2 Pi) -AbstractUnitData["\[Mu]pe"] = "\[Mu]pu"/"\[Mu]eu" -AbstractUnitData["\[Alpha]G"] = (AbstractUnitData["me"]/"mP")^2 -AbstractUnitData["GG"] = "c" AbstractUnitData["\[HBar]"]/"mP"^2 -AbstractUnitData["pc"] = "au" 3*60^3/Pi -AbstractUnitData["th"] = 1000 AbstractUnitData["pc"]/"H0" -AbstractUnitData["\[CapitalLambda]"] = 3 (1/AbstractUnitData["th"]/"c")^2 "\[CapitalOmega]\[CapitalLambda]" -AbstractUnitData["lc"] = PowerExpand[2 Sqrt[2 Pi/AbstractUnitData["\[CapitalLambda]"]]] -AbstractUnitData["mc"] = PowerExpand["c"^2/(2 Sqrt[2 Pi AbstractUnitData["\[CapitalLambda]"]] AbstractUnitData["GG"])] -AbstractUnitData["\[Rho]\[CapitalLambda]"] = "c"^4 AbstractUnitData["\[CapitalLambda]"]/(8 Pi AbstractUnitData["GG"]) -AbstractUnitData["lcq"] = PowerExpand[("c" AbstractUnitData["\[HBar]"]/AbstractUnitData["\[Rho]\[CapitalLambda]"])^(1/4)] -AbstractUnitData["mcq"] = PowerExpand[(AbstractUnitData["\[HBar]"]^3 AbstractUnitData["\[Rho]\[CapitalLambda]"]/"c"^5)^(1/4)] -AbstractUnitData["ecq"] = PowerExpand[("c"^3 AbstractUnitData["\[HBar]"]^3 AbstractUnitData["\[Rho]\[CapitalLambda]"])^(1/4)] -AbstractUnitData["tcq"] = PowerExpand[AbstractUnitData["lcq"] Sqrt[AbstractUnitData["mcq"]/AbstractUnitData["ecq"]]] - -EvalUnitData[x] := AbstractUnitData[x]/.Normal[UnitData] - -Coupling["AbstractCoupling"] = Coupling["\[Alpha]G", "\[Alpha]", "\[Mu]eu", "\[Mu]pu"] -Coupling["AbstractUniverse"] = Coupling[AbstractUnitData["\[Alpha]G"], "\[Alpha]", "\[Mu]eu", "\[Mu]pu"] -Coupling["StandardModel"] = Coupling["AbstractUniverse"] /. Normal[UnitData] - -AbstractUnitSystem["AbstractUnits"] = UnitSystem["kB", "\[HBar]", "c", "\[Mu]0", "me", "\[Lambda]", "\[Alpha]L"] -AbstractUnitSystem["AbstractUnits1"] = UnitSystem["kB1", "\[HBar]1", "c1", "\[Mu]01", "me1", "\[Lambda]1", "\[Alpha]L1"] -AbstractUnitSystem["AbstractUnits2"] = UnitSystem["kB2", "\[HBar]2", "c2", "\[Mu]02", "me2", "\[Lambda]2", "\[Alpha]L2"] -AbstractUnitSystem["SI2019"] = UnitSystem["kB", AbstractUnitData["\[HBar]"], "c", AbstractUnitData["\[Mu]0"], AbstractUnitData["me"]]; - -DeriveMetric[ru_, perm_] := DeriveMetric[ru, perm, AbstractUnitData["\[HBar]"], AbstractUnitData["me"]]; -DeriveMetric[ru_, perm_, hbar_, mass_] := UnitSystem[ru mass/"\[Mu]eu", hbar, "c", perm, mass]; - -AbstractUnitSystem["Metric"] = DeriveMetric[1000 AbstractUnitData["Ru"], 4 Pi/10^7] -AbstractUnitSystem["SI1976"] = DeriveMetric[831432/100, 4 Pi/10^7] - -DeriveCODATA[klitz_, joseph_] := DeriveCODATA[klitz, Nothing, 2/klitz/joseph^2/Pi] -DeriveCODATA[klitz_, _, hbar_] := DeriveCODATA[klitz, Nothing, hbar, 4 Pi "R\[Infinity]" hbar/"\[Alpha]"^2/"c"] -DeriveCODATA[klitz_, _, hbar_, mass_] := DeriveMetric[1000 AbstractUnitData["Ru"], 2 "\[Alpha]" klitz/"c", hbar, mass] - -AbstractUnitSystem["CODATA"] = DeriveCODATA["RK2014", "KJ2014"]; -AbstractUnitSystem["Conventional"] = DeriveCODATA["RK1990", "KJ1990"]; - -DeriveGaussSystem[u_, perm_, ratio_] := DeriveGaussSystem[u, perm, ratio, 1] -DeriveGaussSystem[u_, perm_, ratio_, lorentz_] := DeriveGaussSystem[u, perm, ratio, lorentz, 1/100, 1/1000] -DeriveGaussSystem[u_, perm_, ratio_, lorentz_, length_, mass_] := - DeriveGaussSystem[u, perm, ratio, lorentz, length, mass, PowerExpand[mass length^2]] -DeriveGaussSystem[u_, perm_, ratio_, 1, length_, mass_, energy_] := - UnitSystem[BoltzmannConstant[u]/energy, ReducedPlanckConstant[u]/energy, SpeedOfLight[u]/length, perm, ElectronMass[u]/mass, ratio] -DeriveGaussSystem[u_, perm_, ratio_, lorentz_, length_, mass_, energy_] := - UnitSystem[BoltzmannConstant[u]/energy, ReducedPlanckConstant[u]/energy, SpeedOfLight[u]/length, perm, ElectronMass[u]/mass, ratio, lorentz] - -AbstractUnitSystem["Gauss"] = DeriveGaussSystem["AbstractMetric",1,4 Pi,1/100/"c"] -AbstractUnitSystem["LorentzHeaviside"] = DeriveGaussSystem["AbstractMetric",1,1,1/100/"c"] -AbstractUnitSystem["Thomson"] = DeriveGaussSystem["AbstractMetric",1,4 Pi,1/2] -AbstractUnitSystem["Kennelly"] = DeriveGaussSystem["AbstractMetric",10^-7,4 Pi,1,1,1] -AbstractUnitSystem["ESU"] = DeriveGaussSystem["AbstractMetric",(100 "c")^-2,4 Pi] -AbstractUnitSystem["EMU"] = DeriveGaussSystem["AbstractMetric",1,4 Pi] - -DeriveEnergySystem[u_, time_, length_, mass_] := DeriveTempSystem[u, time, length, mass, 1] -DeriveEnergySystem[u_, time_, length_, mass_, energy_] := - DeriveTempSystem[u, time, length, mass, 1, PowerExpand[MagneticConstant[u] time^2/energy], energy] -DeriveTempSystem[u_, time_, length_, mass_, temp_] := Module[{energy = PowerExpand[mass length^2/time^2]}, - DeriveTempSystem[u, time, length, mass, temp, PowerExpand[MagneticConstant[u] time^2/energy]]] -DeriveTempSystem[u_, time_, length_, mass_, temp_, perm_] := - DeriveTempSystem[u, time, length, mass, temp, perm, PowerExpand[mass length^2/time^2]] -DeriveTempSystem[u_, time_, length_, mass_, temp_, perm_, energy_] := - UnitSystem[BoltzmannConstant[u] temp/energy, ReducedPlanckConstant[u]/time/energy, time SpeedOfLight[u]/length, perm, ElectronMass[u]/mass] - -AbstractUnitSystem["MTS"] = DeriveEnergySystem["AbstractMetric", 1, 1, 1000] -AbstractUnitSystem["EMU2019"] = DeriveEnergySystem["AbstractSI2019", 1, 1/100, 1/1000] -AbstractUnitSystem["ESU2019"] = DeriveTempSystem["AbstractSI2019", 1, 1/100, 1/1000, 1, 1000 AbstractUnitData["\[Mu]0"]/"c"^2] -AbstractUnitSystem["Mixed"] = DeriveTempSystem["AbstractMetric", 1, 1, 1, 1, AbstractUnitData["\[Mu]0"]] -AbstractUnitSystem["English"] = DeriveTempSystem["AbstractSI2019", 1, "ft", AbstractUnitData["slug"], "rankine", 4 Pi] -AbstractUnitSystem["EnglishUS"] = DeriveTempSystem["AbstractMetric", 1, "ftUS", AbstractUnitData["slugUS"], "rankine", 4 Pi] -AbstractUnitSystem["FFF"] = DeriveTempSystem["AbstractMetric", 14 "day", "fur", 90 "lb", "rankine", 0] -AbstractUnitSystem["IAU"] = DeriveEnergySystem["AbstractMetric", "day", "au", "GMsun"/AbstractUnitData["GG"]] -AbstractUnitSystem["Hubble"] = DeriveEnergySystem["AbstractMetric", AbstractUnitData["th"], "c" AbstractUnitData["th"], 1] -AbstractUnitSystem["Cosmological"] = DeriveEnergySystem["AbstractMetric", AbstractUnitData["lc"]/"c", AbstractUnitData["lc"], AbstractUnitData["mc"]] -AbstractUnitSystem["CosmologicalQuantum"] = DeriveEnergySystem["AbstractMetric", AbstractUnitData["tcq"], AbstractUnitData["lcq"], AbstractUnitData["mcq"], AbstractUnitData["ecq"]] - -AbstractUnitSystem["Planck"] = UnitSystem[1, 1, 1, 1, PowerExpand[Sqrt[4 Pi AbstractUnitData["\[Alpha]G"]]]] -AbstractUnitSystem["PlanckGauss"] = UnitSystem[1, 1, 1, 4 Pi, PowerExpand[Sqrt[AbstractUnitData["\[Alpha]G"]]]] -AbstractUnitSystem["Stoney"] = UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, PowerExpand[Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"]]] -AbstractUnitSystem["Hartree"] = UnitSystem[1,1,1/"\[Alpha]",4 Pi "\[Alpha]"^2,1] -AbstractUnitSystem["Rydberg"] = UnitSystem[1,1,2/"\[Alpha]",Pi "\[Alpha]"^2,1/2] -AbstractUnitSystem["Schrodinger"] = UnitSystem[1, 1, 1/"\[Alpha]", 4 Pi "\[Alpha]"^2, PowerExpand[Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"]]] -AbstractUnitSystem["Electronic"] = UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, 1] -AbstractUnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1, 1, 1, "1"] -AbstractUnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1, 1, 1, "1"] -AbstractUnitSystem["QCD"] = UnitSystem[1, 1, 1, 1, 1/AbstractUnitData["\[Mu]pe"]] -AbstractUnitSystem["QCDGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1/AbstractUnitData["\[Mu]pe"]] -AbstractUnitSystem["QCDoriginal"] = UnitSystem[1, 1, 1, 4 Pi "\[Alpha]", 1/AbstractUnitData["\[Mu]pe"]] - -UnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1] -UnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1] -Map[(UnitSystem[#] = AbstractUnitSystem[#] /. Normal[UnitData]) &, -{"AbstractUnits","AbstractUnits1","AbstractUnits2","Gauss","LorentzHeaviside","Thomson","Kennelly","ESU","ESU2019","EMU","EMU2019","MTS","Mixed","Metric","SI1976","SI2019","CODATA","Conventional","English","EnglishUS","IAU","FFF","Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","QCD","QCDGauss","QCDoriginal","Hubble","Cosmological","CosmologicalQuantum"}] +UnitSystem[u_String] := AbstractUnitSystem[StringDelete[u, "Abstract"]] /; StringStartsQ[u, "Abstract"] +Coupling[c_String] := Universe[UnitSystem[c]] -StandardModel = Coupling["StandardModel"] -AbstractCoupling = Coupling["AbstractCoupling"] -AbstractUniverse = Coupling["AbstractUniverse"] +UnitSystemQ[u_String] := UnitSystemQ[UnitSystem[u]] +UnitSystemQ[UnitSystem[_,__]] := True +UnitSystemQ[_] := False +AbstractUnitSystemQ[u_String] := UnitSystemQ[UnitSystem[u]] +AbstractUnitSystemQ[u:UnitSystem[_,__]] := MemberQ[Values[AbstractUnitSystem],u] +AbstractUnitSystemQ[_] := False +MatchSystem[u_,s_] := If[AbstractUnitSystemQ[u], AbstractUnitSystem[s], UnitSystem[s]] +DefaultSystem[u_] := MatchSystem[u, "SI2019"] -AbstractUnits = AbstractUnitSystem["AbstractUnits"] -AbstractUnits1 = AbstractUnitSystem["AbstractUnits1"] -AbstractUnits2 = AbstractUnitSystem["AbstractUnits2"] -AbstractMetric = AbstractUnitSystem["Metric"] -AbstractSI2019 = AbstractUnitSystem["SI2019"] -AbstractCGS = AbstractUnitSystem["Gauss"] -AbstractMTS = AbstractUnitSystem["MTS"] -AbstractEnglish = AbstractUnitSystem["English"] -AbstractEnglishUS = AbstractUnitSystem["EnglishUS"] -AbstractIAU = AbstractUnitSystem["IAU"] -AbstractFFF = AbstractUnitSystem["FFF"] +Map[( + #[u_String, c_String] := #[UnitSystem[u], Coupling[c]]; + #[u_String] := #[UnitSystem[u]] +) &, Join[ConstantsList, PhysicsList]] -Gauss = UnitSystem["Gauss"] -LorentzHeaviside = UnitSystem["LorentzHeaviside"] -Thomson = UnitSystem["Thomson"] -Kennelly = UnitSystem["Kennelly"] -ESU = UnitSystem["ESU"] -ESU2019 = UnitSystem["ESU2019"] -EMU = UnitSystem["EMU"] -EMU2019 = UnitSystem["EMU2019"] -MTS = UnitSystem["MTS"] -Mixed = UnitSystem["Mixed"] -Metric = UnitSystem["Metric"] -SI1976 = UnitSystem["SI1976"] -SI2019 = UnitSystem["SI2019"] +Map[(#[c_String] := #[Coupling[c]]) &, DimensionlessList] -CODATA = UnitSystem["CODATA"] -Conventional = UnitSystem["Conventional"] -English = UnitSystem["English"] -EnglishUS = UnitSystem["EnglishUS"] -IAU = UnitSystem["IAU"] -FFF = UnitSystem["FFF"] -Hubble = UnitSystem["Hubble"] -Cosmological = UnitSystem["Cosmological"] -CosmologicalQuantum = UnitSystem["CosmologicalQuantum"] +Get["UnitSystems`systems`"] -PlanckGauss = UnitSystem["PlanckGauss"] -Stoney = UnitSystem["Stoney"] -Schrodinger = UnitSystem["Schrodinger"] -Electronic = UnitSystem["Electronic"] -Natural = UnitSystem["Natural"] -QCD = UnitSystem["QCD"] -QCDGauss = UnitSystem["QCDGauss"] -QCDoriginal = UnitSystem["QCDoriginal"] +EntityUnregister["UnitSystem"] +CreateEntity[u_String] := u -> <| + "Abstract" :> AbstractUnitSystem[u], "Value" :> UnitSystem[u]|> +EntityRegister[EntityStore["UnitSystem" -> <| + "Entities" -> Association[Map[CreateEntity, UnitSystemsList]]|>]] -{SI,MKS,CGS, CGS2019, CGSm, CGSe, HLU} = {SI2019, Metric, Gauss, EMU2019, EMU, ESU, LorentzHeaviside} -AbstractUnitSystem["SI"] := AbstractUnitSystem["SI2019"] -AbstractUnitSystem["MKS"] := AbstractUnitSystem["Metric"] -AbstractUnitSystem["CGS"] := AbstractUnitSystem["Gauss"] -AbstractUnitSystem["CGS2019"] := AbstractUnitSystem["EMU2019"] -AbstractUnitSystem["CGSm"] := AbstractUnitSystem["EMU"] -AbstractUnitSystem["CGSe"] := AbstractUnitSystem["ESU"] -AbstractUnitSystem["HLU"] := AbstractUnitSystem["LorentzHeaviside"] -UnitSystem["AbstractUnits"] := AbstractUnitSystem["AbstractUnits"] -UnitSystem["AbstractUnits1"] := AbstractUnitSystem["AbstractUnits1"] -UnitSystem["AbstractUnits2"] := AbstractUnitSystem["AbstractUnits2"] -UnitSystem["SI"] := UnitSystem["SI2019"] -UnitSystem["MKS"] := UnitSystem["Metric"] -UnitSystem["CGS"] := UnitSystem["Gauss"] -UnitSystem["CGS2019"] := UnitSystem["EMU2019"] -UnitSystem["CGSm"] := UnitSystem["EMU"] -UnitSystem["CGSe"] := UnitSystem["ESU"] -UnitSystem["HLU"] := UnitSystem["LorentzHeaviside"] +Universe[_] = Coupling["AbstractUniverse"] +Universe[c_String] := Coupling[c] +Map[(Universe[AbstractUnitSystem[#]] := Coupling["AbstractUniverse"]) &, +{"Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","Natural","NaturalGauss","QCD","QCDGauss","QCDoriginal"}] -UnitSystem[u_String] := AbstractUnitSystem[StringDelete[u, "Abstract"]] /; StringStartsQ[u, "Abstract"] -Coupling[c_String] := Universe[UnitSystem[c]] +OneQ[1] := True; OneQ[-1] := False; OneQ[True] := True +OneQ[0] := False; OneQ[_] := False; OneQ[False] := False +OneQ[x_?NumberQ] := x == 1 Map[(#[u_UnitSystem] := #[u, Universe[u]]) &, {PlanckMass, PlanckConstant, GravitationalConstant, ElementaryCharge}]; -Map[(#[u_UnitSystem] := #[Universe[u]]) &, {GravitationalCouplingConstantElectronElectron, FineStructureConstant, ElectronRelativeAtomicMass, ProtonRelativeAtomicMass, ProtonElectronMassRatio}]; +Map[(#[u_UnitSystem] := #[Universe[u]]) &, DimensionlessList]; Map[(#[u_UnitSystem, c_Coupling] := #[u]) &, {BoltzmannConstant, ReducedPlanckConstant, SpeedOfLight, MagneticConstant, ElectronMass, MolarMassConstant}]; Map[(#[u_UnitSystem, s_UnitSystem] := Unit[#[s]/#[u]]) &, ConstantsList]; Map[Unprotect, ProtectedList] Map[(If[!MemberQ[ProtectedList, #], - #[v_?NumberQ, u_String] := #[v, UnitSystem[u]]; - #[v_?NumberQ, u_String, s_String] := #[v, UnitSystem[u], UnitSystem[s]]; + #[v_, u_String] := #[v, UnitSystem[u]]; + #[v_, u_String, s_String] := #[v, UnitSystem[u], UnitSystem[s]]; #[u_String] := #[UnitSystem[u]]; #[u_String, s_String] := #[UnitSystem[u], UnitSystem[s]]; - #[v_?NumberQ, u_UnitSystem] := #[v, u, UnitSystem["Metric"]]; - #[v_?NumberQ, u_UnitSystem, s_UnitSystem] := + #[v_, u_UnitSystem] := #[v, u, DefaultSystem[u]]; + #[v_, u_UnitSystem, s_UnitSystem] := Module[{n = #[u, s]}, If[OneQ[n], v, v/n]]; - #[v_?NumberQ, + #[v_, u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := v; #[ u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := 1; - #[u_UnitSystem] := #[u, UnitSystem["Metric"]];, - #[v_?NumberQ, u_String] := #[v, UnitSystem[u]]; - #[v_?NumberQ, u_String, s_String] := #[v, UnitSystem[u], UnitSystem[s]]; + #[u_UnitSystem] := #[u, DefaultSystem[u]];, + #[v_, u_String] := #[v, UnitSystem[u]]; + #[v_, u_String, s_String] := #[v, UnitSystem[u], UnitSystem[s]]; #[u_String] := #[UnitSystem[u]]; #[u_String, s_String] := #[UnitSystem[u], UnitSystem[s]]; - UnitSystem /: #[v_?NumberQ, u_UnitSystem] := #[v, u, UnitSystem["Metric"]]; - UnitSystem /: #[v_?NumberQ, u_UnitSystem, s_UnitSystem] := + UnitSystem /: #[v_, u_UnitSystem] := #[v, u, DefaultSystem[u]]; + UnitSystem /: #[v_, u_UnitSystem, s_UnitSystem] := Module[{n = #[u, s]}, If[OneQ[n], v, v/n]]; - UnitSystem /: #[v_?NumberQ, + UnitSystem /: #[v_, u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := v; UnitSystem /: #[ u : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___], s : UnitSystem[kB_, \[HBar]_, c_, \[Mu]0_, me_, ___]] := 1; - UnitSystem /: #[u_UnitSystem] := #[u, UnitSystem["Metric"]];] + UnitSystem /: #[u_UnitSystem] := #[u, DefaultSystem[u]];] ) &, ConvertList]; Map[Protect, ProtectedList] -Mass[u_UnitSystem, s_UnitSystem] := ElectronMass[u, s]; -ElectronMass[h_?NumberQ] := UnitData["R\[Infinity]"] 2 h/UnitData["\[Alpha]"]^2/UnitData["c"]; -ElectronMass[h_?NumberQ, u_Coupling] := (UnitData["R\[Infinity]"] 2 h)/(FineStructureConstant[u]^2 UnitData["c"]); -PlanckMass[u_UnitSystem, c_Coupling] := PowerExpand[ElectronMass[u, c]/Sqrt[GravitationalCouplingConstantElectronElectron[c]]] -PlanckConstant[u_UnitSystem, c_Coupling] := 2 Pi ReducedPlanckConstant[u]; -GravitationalConstant[u_UnitSystem, c_Coupling] := PowerExpand[(SpeedOfLight[u, c] ReducedPlanckConstant[u, c])/PlanckMass[u, c]^2] -ElementaryCharge[u_UnitSystem, c_Coupling] := PowerExpand[Sqrt[2 PlanckConstant[u]/(MagneticConstant[u]/FineStructureConstant[u])/(SpeedOfLight[u] RationalizationConstant[u] LorentzConstant[u]^2)]] - -ElectronMass[UnitSystem["Planck"], c_Coupling] := PowerExpand[Sqrt[4 Pi GravityCoupling[c]]] -ElectronMass[UnitSystem["PlanckGauss"], c_Coupling] := Sqrt[GravitationalCouplingConstantElectronElectron[c]]; -ElectronMass[UnitSystem[_, _, _, _, Sqrt[EvalUnitData["\[Alpha]G"]/UnitData["\[Alpha]"]], ___], c_Coupling] := PowerExpand[Sqrt[GravitationalCouplingConstantElectronElectron[c]/FineStructureConstant[c]]] -ElectronMass[UnitSystem[_, _, _, _, 1/UnitData["\[Mu]pe"], ___], c_Coupling] := 1/ProtonElectronMassRatio[c]; -MagneticConstant[UnitSystem[_, _, _, 4 Pi UnitData["\[Alpha]"]^2, ___], c_Coupling] := 4 Pi FineStructureConstant[c]^2; -MagneticConstant[UnitSystem[_, _, _, Pi UnitData["\[Alpha]"]^2, ___], c_Coupling] := Pi FineStructureConstant[c]^2; -SpeedOfLight[UnitSystem[_, _, 1/UnitData["\[Alpha]"], ___], c_Coupling] := 1/FineStructureConstant[c]; -SpeedOfLight[UnitSystem[_, _, 2/UnitData["\[Alpha]"], ___], c_Coupling] := 2/FineStructureConstant[c]; -PlanckReduced[UnitSystem[_, 1/UnitData["\[Alpha]"], ___], c_Coupling] := 1/FineStructure[c]; - -ElectronMass[u : UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me"], ___], c_Coupling] := ElectronMass[PlanckConstant[u], c]; -ElectronMass[UnitSystem[_, _, 100 UnitData["c"], _, 1000 EvalUnitData["me"], ___], c_Coupling] := 1000 ElectronMass[UnitSystem["SI2019"], c]; -ElectronMass[UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me"]/1000, ___], c_Coupling] := ElectronMass[UnitSystem["SI2019"], c]/1000; -ElectronMass[u : UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me2014"], ___], c_Coupling] := ElectronMass[PlanckConstant[u], c]; -ElectronMass[u : UnitSystem[_, _, UnitData["c"], EvalUnitData["\[Mu]0"], EvalUnitData["me1990"], ___], c_Coupling] := ElectronMass[PlanckConstant[u], c]; -ElectronMass[UnitSystem[_, _, UnitData["c"]/UnitData["ftUS"], _, EvalUnitData["me"]/EvalUnitData["slug"], ___], c_Coupling] := ElectronMass[UnitSystem["SI2019"], c]/EvalUnitData["slug"]; -MagneticConstant[UnitSystem[_, _, _, EvalUnitData["\[Mu]0"], ___], c_Coupling] := FineStructureConstant[c] 2 UnitData["h"]/UnitData["c"]/UnitData["e"]^2; -MagneticConstant[UnitSystem["ESU2019"], u_Coupling] := 10^3 MagneticConstant[UnitSystem["SI2019"], u]/UnitData["c"]^2; -MagneticConstant[UnitSystem["EMU2019"], u_Coupling] := 10^7 MagneticConstant[UnitSystem["SI2019"], u]; -MagneticConstant[UnitSystem["CODATA"], u_Coupling] := 2 UnitData["RK2014"] FineStructureConstant[u]/UnitData["c"]; -MagneticConstant[UnitSystem["Conventional"], u_Coupling] := 2 UnitData["RK1990"] FineStructureConstant[u]/UnitData["c"]; - -MolarMassConstant[UnitSystem[1, ___]] = 1; -MolarMassConstant[u:UnitSystem[UnitData["kB"], ___]] := MolarMassConstant[u, Universe[u]]; -MolarMassConstant[u:UnitSystem[UnitData["kB"], ___], c_Coupling] := UnitData["NA"] ElectronMass[u, c]/ElectronRelativeAtomicMass[c]; -MolarMassConstant[u:UnitSystem[10^7 UnitData["kB"], ___]] := MolarMassConstant[u, Universe[u]]; -MolarMassConstant[UnitSystem[10^7 UnitData["kB"], ___], c_Coupling] := 1000 MolarMassConstant[UnitSystem["SI2019"], c]; -MolarMassConstant[u:UnitSystem[10^3 UnitData["kB"], ___]] := MolarMassConstant[u, Universe[u]]; -MolarMassConstant[UnitSystem[10^3 UnitData["kB"], ___], c_Coupling] := MolarMassConstant[UnitSystem["SI2019"], c]/1000; -MolarMassConstant[UnitSystem[kB_, ___]] := MolarMassConstant["CGS"]/1000; -MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["MTS"]], ___]] := MolarMassConstant["CGS"]/10^6; -MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["CGS"]], ___]] := MolarMassConstant["Natural"]; -MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["FFF"]], ___]] := MolarMassConstant["Natural"]; -MolarMassConstant[u:UnitSystem[BoltzmannConstant[UnitSystem["English"]], ___]] := MolarMassConstant[u, Universe[u]]; -MolarMassConstant[u:UnitSystem[BoltzmannConstant[UnitSystem["English"]], ___], c_Coupling] := 1000 MolarMassConstant[UnitSystem["SI2019"],c] -MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["EnglishUS"]], ___]] := MolarMassConstant["Natural"]; -MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["IAU"]], ___]] = EvalUnitData["ms"]/1000; - -MonochromaticRadiation540THzLuminousEfficacy[UnitSystem[1, ___]] = 1 -MonochromaticRadiation540THzLuminousEfficacy[u : UnitSystem[_?NumericQ, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] -MonochromaticRadiation540THzLuminousEfficacy[u : UnitSystem[_Around, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] - -Universe[_] = Coupling["AbstractUniverse"] -Universe[c_String] := Coupling[c] -Map[(Universe[AbstractUnitSystem[#]] := Coupling["AbstractUniverse"]) &, -{"Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","Natural","NaturalGauss","QCD","QCDGauss","QCDoriginal"}] - -MolarMassConstant[AbstractUnitSystem["AbstractUnits"]] = "Mu" -MolarMassConstant[AbstractUnitSystem["AbstractUnits1"]] = "Mu1" -MolarMassConstant[AbstractUnitSystem["AbstractUnits2"]] = "Mu2" -MolarMassConstant[u : UnitSystem["kB", ___]] := MolarMassConstant[u,Universe[u]] -MolarMassConstant[u : UnitSystem["kB", ___], c_Coupling] := "NA" ElectronMass[AbstractUnitSystem["SI2019"],c]/ElectronRelativeAtomicMass[c] -MolarMassConstant[u : UnitSystem[10^7 "kB", ___]] := MolarMassConstant[u, Universe[u]]; -MolarMassConstant[UnitSystem[10^7 "kB", ___], c_Coupling] := 1000 MolarMassConstant[AbstractUnitSystem["SI2019"], c]; -MolarMassConstant[u : UnitSystem[10^3 "kB", ___]] := MolarMassConstant[u, Universe[u]]; -MolarMassConstant[UnitSystem[10^3 "kB", ___], c_Coupling] := MolarMassConstant[AbstractUnitSystem["SI2019"], c]/1000; -MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["MTS"]], ___]] := MolarMassConstant["CGS"]/10^6; -MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["CGS"]], ___]] := MolarMassConstant["Natural"]; -MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["FFF"]], ___]] := MolarMassConstant["Natural"]; -MolarMassConstant[u : UnitSystem[BoltzmannConstant[AbstractUnitSystem["English"]], ___]] := MolarMassConstant[u, Universe[u]]; -MolarMassConstant[u : UnitSystem[BoltzmannConstant[AbstractUnitSystem["English"]], ___], c_Coupling] := 1000 MolarMassConstant[AbstractUnitSystem["SI2019"], c]; -MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["EnglishUS"]], ___]] := MolarMassConstant["Natural"]; -MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["IAU"]], ___]] := 1/1000 AbstractUnitData["ms"]; - -MonochromaticRadiation540THzLuminousEfficacy[AbstractUnitSystem["AbstractUnits1"]] = "Kcd1" -MonochromaticRadiation540THzLuminousEfficacy[AbstractUnitSystem["AbstractUnits2"]] = "Kcd2" -MonochromaticRadiation540THzLuminousEfficacy[u_UnitSystem] := Power["Kcd", AbstractUnitSystem["SI2019"], u] - -AbstractUnitData["Mu"] = MolarMassConstant[AbstractUnitSystem["SI2019"]] - -Kilograms[m_] := Kilograms[m, "English"]; -Kilograms[m_, u_UnitSystem] := Mass[m, UnitSystem["Metric"], u]; -Kilograms[m_, u_String] := Mass[m, UnitSystem[u]]; -Slugs[m_] := Slugs[m, "Metric"]; -Slugs[m_, u_UnitSystems] := Mass[m, UnitSystem["English"], u]; -Slugs[m_, u_String] := Mass[m, UnitSystem[u]]; -Feet[d_] := Feet[d, "Metric"]; -Feet[d_, u_UnitSystem] := Length[d, UnitSystem["English"], u]; -Feet[d_, u_String] := Length[d, UnitSystem[u]]; -Meters[d_] := Meters[d, "English"]; -Meters[d_, u_UnitSystem] := Length[d, UnitSystem["Metric"], u]; -Meters[d_, u_String] := Length[d, UnitSystem[u]]; - -(* IAU to SI *) -UnitSystem /: - Length[u : UnitSystem[_, _, UnitData["c"], ___], - s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Length[u, s, 1/UnitData["au"]]; -Time[u : UnitSystem[_, _, UnitData["c"], ___], - s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Time[u, s, 1/UnitData["day"]]; -(* SI to IAU *) -UnitSystem /: - Length[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], - s : UnitSystem[_, _, UnitData["c"], ___]] := Length[u, s, UnitData["au"]]; -Time[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], - s : UnitSystem[_, _, UnitData["c"], ___]] := Time[u, s, UnitData["day"]]; -(* IAU to CGS *) -UnitSystem /: - Length[u : UnitSystem[_, _, 100 UnitData["c"], ___], - s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Length[u, s, 1/UnitData["au"]]; -Time[u : UnitSystem[_, _, 100 UnitData["c"], ___], - s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Time[u, s, 1/UnitData["day"]]; -(* CGS to IAU *) -UnitSystem /: - Length[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], - s : UnitSystem[_, _, 100 UnitData["c"], ___]] := Length[u, s, UnitData["au"]]; -Time[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], - s : UnitSystem[_, _, 100 UnitData["c"], ___]] := Time[u, s, UnitData["day"]]; -(* IAU to English *) -UnitSystem /: - Length[u : UnitSystem[_, _, UnitData["c"]/UnitData["ft"], ___], - s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Length[u, s, UnitData["ft"]/UnitData["au"]]; -Time[u : UnitSystem[_, _, UnitData["c"]/UnitData["ft"], ___], - s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Time[u, s, 1/UnitData["day"]]; -(* English to IAU *) -UnitSystem /: - Length[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], - s : UnitSystem[_, _, UnitData["c"]/UnitData["ft"], ___]] := Length[u, s, UnitData["au"]/UnitData["ft"]]; -Time[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], - s : UnitSystem[_, _, UnitData["c"]/UnitData["ft"], ___]] := Time[u, s, UnitData["day"]]; - -UnitSystem /: Length[u_UnitSystem, s_UnitSystem] := Length[u, s, 1]; -UnitSystem /: Length[u_UnitSystem, s_UnitSystem, l_] := - Unit[(ReducedPlanckConstant[s] ElectronMass[u] SpeedOfLight[ - u])/(ReducedPlanckConstant[u] ElectronMass[s] SpeedOfLight[s]), l]; -UnitSystem /: Area[u_UnitSystem, s_UnitSystem] := Unit[Length[u, s]^2]; -UnitSystem /: Volume[u_UnitSystem, s_UnitSystem] := Unit[Length[u, s]^3]; - -WaveNumber[u_UnitSystem, s_UnitSystem] := Unit[Length[s, u]]; -FuelEfficiency[u_UnitSystem, s_UnitSystem] := Area[s, u]; -Time[u_UnitSystem, s_UnitSystem] := Time[u, s, 1]; -Time[u_UnitSystem, s_UnitSystem, t_] := Unit[Length[u, s]/SpeedOfLight[u, s], 1]; -Frequency[u_UnitSystem, s_UnitSystem] := Time[s, u]; -FrequencyDrift[u_UnitSystem, s_UnitSystem] := Unit[Time[s, u]^2]; -Speed[u_UnitSystem, s_UnitSystem] := SpeedOfLight[u, s]; -Acceleration[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]]; -Jerk[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]^2]; -Snap[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]^3]; -VolumeFlow[u_UnitSystem, s_UnitSystem] := Unit[Area[u, s], Speed[u, s]]; -SpecificEnergy[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]^2]; - -Energy[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] SpecificEnergy[u, s]]; -UnitSystem /: Power[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Time[u, s]]; -Force[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Acceleration[u, s]]; -Pressure[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]/Time[u, s]^2]; - -Momentum[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Speed[u, s]]; -AngularMomentum[u_UnitSystem, s_UnitSystem] := Unit[Momentum[u, s] Length[u, s]]; -Yank[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Jerk[u, s]]; -AreaDensity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Area[u, s]]; -Density[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Volume[u, s]]; -SpecificVolume[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mass[u, s]]; -Action[u_UnitSystem, s_UnitSystem] := Unit[Momentum[u, s] Length[u, s]]; -Stiffness[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Area[u, s]]; -Intensity[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Area[u, s]]; -Diffusivity[u_UnitSystem, s_UnitSystem] := Unit[(ReducedPlanckConstant[s] ElectronMass[u])/(ReducedPlanckConstant[u] ElectronMass[s])]; -Viscosity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]/Time[u, s]]; -LinearDensity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]]; -MassFlow[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Time[u, s]]; -SpectralFlux[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Length[u, s]]; -PowerDensity[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Volume[u, s]]; -Compressibility[u_UnitSystem, s_UnitSystem] := Pressure[s, u]; -Fluence[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Area[u, s]]; -RotationalInertia[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Area[u, s]]; - -SoundExposure[u_UnitSystem, s_UnitSystem] := Unit[Time[u, s] Pressure[u, s]^2]; -SpecificImpedance[u_UnitSystem, s_UnitSystem] := Unit[Pressure[u, s]/Speed[u, s]]; -Impedance[u_UnitSystem, s_UnitSystem] := Unit[SpecificImpedance[u, s]/Area[u, s]]; -Admittance[u_UnitSystem, s_UnitSystem] := Unit[Area[u, s]/SpecificImpedance[u, s]]; -Compliance[u_UnitSystem, s_UnitSystem] := Unit[Time[u, s]^2/Mass[u, s]]; -Inertance[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]^4]; - -(* Electromagnetic *) - -Voltage = ElectricPotential - -Charge[u_UnitSystem, s_UnitSystem] := - Unit[Sqrt[(ReducedPlanckConstant[s] MagneticConstant[u] SpeedOfLight[ - u] RationalizationConstant[u] LorentzConstant[u]^2)/(ReducedPlanckConstant[ - u] MagneticConstant[s] SpeedOfLight[s] RationalizationConstant[s] LorentzConstant[s]^2)]]; -Current[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Time[u, s]]; -ElectricPotential[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Charge[u, s]]; -Capacitance[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/ElectricPotential[u, s]]; -Resistance[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s]/Current[u, s]]; -Conductance[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s]/ElectricPotential[u, s]]; -MagneticFlux[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/LorentzConstant[u, s]/Current[u, s]]; -MagneticFluxDensity[u_UnitSystem, s_UnitSystem] := - Unit[Mass[u, s]/LorentzConstant[u, s]/Current[u, s]/Time[u, s]^2]; -Inductance[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Area[u, s]/Charge[u, s]^2]; - -ElectricFluxDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] RationalizationConstant[u, s]/Area[u, s]]; -ChargeDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Volume[u, s]]; -CurrentDensity[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s]/Area[u, s]]; -Conductivity[u_UnitSystem, s_UnitSystem] := Unit[Conductance[u, s]/Length[u, s]]; -Permittivity[u_UnitSystem, s_UnitSystem] := Unit[Capacitance[u, s] RationalizationConstant[u, s]/Length[u, s]]; -ElectricField[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s]/Length[u, s]]; -MagneticField[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s] RationalizationConstant[u, s] LorentzConstant[u, s]/Length[u, s]]; -Exposure[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Mass[u, s]]; -Resistivity[u_UnitSystem, s_UnitSystem] := Unit[Resistance[u, s] Length[u, s]]; -LinearChargeDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Length[u, s]]; -MagneticDipoleMoment[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s] LorentzConstant[u, s] Area[u, s]]; -Mobility[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] Time[u, s]/Mass[u, s]]; -Reluctance[u_UnitSystem, s_UnitSystem] := Unit[RationalizationConstant[u, s] LorentzConstant[u, s]^2/Inductance[u, s]]; -VectorPotential[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s]/Length[u, s]]; -MagneticMoment[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s] Length[u, s]]; -Rigidity[u_UnitSystem, s_UnitSystem] := Unit[MagneticFluxDensity[u, s] Length[u, s]]; -Susceptibility[u_UnitSystem, s_UnitSystem] := Unit[RationalizationConstant[s, u]]; - -(* WARNING unchecked: rigitidy, magneticmoment, vectorpotential, \ -mobility, linearchargedensity, exposure *) - -ElectricFlux[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s] Length[u, s]]; -ElectricDipoleMoment[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] Length[u, s]]; -MagneticPotential[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s] Reluctance[u, s]]; -PoleStrength[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/Length[u, s]]; -Permeance[u_UnitSystem, s_UnitSystem] := Reluctance[s, u]; -SpecificSusceptibility[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/MagneticField[u, s]/Mass[u, s]]; -Magnetizability[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[u, s]/MagneticFluxDensity[u, s]]; -ElectricPolarizability[u_UnitSystem, s_UnitSystem] := Unit[ElectricDipoleMoment[u, s]/ElectricField[u, s]]; -MagneticPolarizability[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/MagneticField[u, s]]; -Magnetization[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[u, s]/Volume[u, s]]; - -SpecificMagnetization[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[s, u]/Mass[s, u]]; -DemagnetizingFactor[u_UnitSystem, s_UnitSystem] := Unit[Rationalization[u, s]]; - -(* Thermodynamic *) - -Moles[n_] := Moles[n, "Metric"]; -Moles[n_, u_UnitSystem] := n/AvogadroConstant[u]; -Moles[n_, u_String] := Moles[n, UnitSystem[u]]; -Molecules[n_] := Molecules[n, "Metric"]; -Molecules[n_, u_UnitSystem] := n AvogadroConstant[u]; -Molecules[n_, u_String] := Molecules[n, UnitSystem[u]]; - -Temperature[u_UnitSystem, s_UnitSystem] := - Unit[(BoltzmannConstant[u] ElectronMass[s] SpeedOfLight[s]^2)/(BoltzmannConstant[ - s] ElectronMass[u] SpeedOfLight[u]^2)]; -UnitSystem /: Entropy[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Temperature[u, s]]; -SpecificEntropy[u_UnitSystem, s_UnitSystem] := Unit[SpecificEnergy[u, s]/Temperature[u, s]]; -VolumeHeatCapacity[u_UnitSystem, s_UnitSystem] := Unit[Entropy[u, s]/Volume[u, s]]; -ThermalConductivity[u_UnitSystem, s_UnitSystem] := Unit[Force[u, s]/Time[u, s]/Temperature[u, s]]; -ThermalConductance[u_UnitSystem, s_UnitSystem] := Unit[ThermalConductivity[u, s] Length[u, s]]; -ThermalResistance[u_UnitSystem, s_UnitSystem] := ThermalConductance[s, u]; -ThermalExpansion[u_UnitSystem, s_UnitSystem] := Temperature[s, u]; -LapseRate[u_UnitSystem, s_UnitSystem] := Unit[Temperature[u, s]/Length[u, s]]; - -Molality[u_UnitSystem, s_UnitSystem] := MolarMassConstant[s, u]; -Mole[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Molality[u, s]]; -Molarity[u_UnitSystem, s_UnitSystem] := Unit[Mole[u, s]/Volume[u, s]]; -MolarVolume[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mole[u, s]]; -MolarEntropy[u_UnitSystem, s_UnitSystem] := Unit[Entropy[u, s]/Mole[u, s]]; -MolarEnergy[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Mole[u, s]]; -MolarConductivity[u_UnitSystem, s_UnitSystem] := Unit[Conductivity[u, s] Area[u, s]/Mole[u, s]]; -MolarSusceptibility[u_UnitSystem, s_UnitSystem] := Unit[SpecificSusceptibility[u, s] MolarMass[u, s]]; -Catalysis[u_UnitSystem, s_UnitSystem] := Unit[Mole[u, s]/Time[u, s]]; -Specificity[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mole[u, s]/Time[u, s]]; - -LuminousFlux[u_UnitSystem, s_UnitSystem] := Unit[Frequency[u, s]^2 (MonochromaticRadiation540THzLuminousEfficacy[s] ReducedPlanckConstant[s])/(MonochromaticRadiation540THzLuminousEfficacy[u] ReducedPlanckConstant[u])]; -Luminance[u_UnitSystem, s_UnitSystem] := Unit[LuminousFlux[u, s]/Area[u, s]]; -LuminousEnergy[u_UnitSystem, s_UnitSystem] := Unit[Frequency[u, s] (MonochromaticRadiation540THzLuminousEfficacy[s] ReducedPlanckConstant[s])/(MonochromaticRadiation540THzLuminousEfficacy[u] ReducedPlanckConstant[u])]; -LuminousExposure[u_UnitSystem, s_UnitSystem] := Unit[Luminance[u, s] Time[u, s]]; - -(* Physics *) - -Cesium133HyperfineSplittingFrequency[u_UnitSystem] := Frequency[UnitData["\[CapitalDelta]\[Nu]Cs"], u]; - -Map[(#[u_UnitSystem] := #[u, Universe[u]]) &, {AvogadroConstant, AtomicMassConstant, ProtonMass, EinsteinConstantSpeedOfLightToTheFourth, MolarGasConstant, StefanBoltzmannConstant, RadiationConstant, ElectricConstant, CoulombConstant, BiotSavartConstant, VacuumImpedance, FaradayConstant, JosephsonConstant, MagneticFluxQuantum, VonKlitzingConstant, ConductanceQuantum, HartreeEnergy, RydbergConstant, BohrRadius, RelativisticBohrRadius, ClassicalElectronRadius, BohrMagneton}]; -AvogadroConstant[u_UnitSystem, c_Coupling] := MolarMassConstant[u, c] ElectronRelativeAtomicMass[c]/ElectronMass[u, c]; -AtomicMassConstant[u_UnitSystem, c_Coupling] := ElectronMass[u, c]/ElectronRelativeAtomicMass[c]; -ProtonMass[u_UnitSystem, c_Coupling] := ProtonElectronMassRatio[c] ElectronMass[u, c]; -EinsteinConstantSpeedOfLightToTheFourth[u_UnitSystem, c_Coupling] := (8 Pi GravitationalConstant[u, c])/SpeedOfLight[u, c]^4; -MolarGasConstant[u_UnitSystem, c_Coupling] := BoltzmannConstant[u, c] AvogadroConstant[u, c]; -StefanBoltzmannConstant[u_UnitSystem, c_Coupling] := (2 Pi^5 BoltzmannConstant[u, c]^4)/(15 PlanckConstant[u, c]^3 SpeedOfLight[u, c]^2); -RadiationConstant[u_UnitSystem, c_Coupling] := (4 StefanBoltzmannConstant[u, c])/SpeedOfLight[u, c]; -ElectricConstant[u_UnitSystem, c_Coupling] := (1/MagneticConstant[u, c]) (SpeedOfLight[u, c] LorentzConstant[u]^2); -CoulombConstant[u_UnitSystem, c_Coupling] := RationalizationConstant[u]/(4 Pi)/ ElectricConstant[u]; -BiotSavartConstant[u_UnitSystem, c_Coupling] := MagneticConstant[u, c] LorentzConstant[u] (RationalizationConstant[u]/(4 Pi)); -AmpereConstant[u_UnitSystem] := LorentzConstant[u] BiotSavartConstant[u]; -VacuumImpedance[u_UnitSystem, c_Coupling] := MagneticConstant[u, c] SpeedOfLight[u, c] RationalizationConstant[u] LorentzConstant[u]^2; -FaradayConstant[u_UnitSystem, c_Coupling] := ElementaryCharge[u, c] AvogadroConstant[u, c]; -JosephsonConstant[u_UnitSystem, c_Coupling] := 2 ElementaryCharge[u, c] LorentzConstant[u]/PlanckConstant[u, c]; -MagneticFluxQuantum[u_UnitSystem, c_Coupling] := 1/JosephsonConstant[u, c]; -VonKlitzingConstant[u_UnitSystem, c_Coupling] := PlanckConstant[u, c]/ElementaryCharge[u, c]^2; -ConductanceQuantum[u_UnitSystem, c_Coupling] := (2 ElementaryCharge[u, c]^2)/PlanckConstant[u, c]; -HartreeEnergy[u_UnitSystem, c_Coupling] := ElectronMass[u, c] (SpeedOfLight[u, c] FineStructureConstant[c])^2; -RydbergConstant[u_UnitSystem, c_Coupling] := HartreeEnergy[u, c]/(2 PlanckConstant[u, c])/SpeedOfLight[u, c]; -BohrRadius[u_UnitSystem, c_Coupling] := ReducedPlanckConstant[u, c]/ElectronMass[u, c]/SpeedOfLight[u, c]/FineStructureConstant[c]; -RelativisticBohrRadius[u_UnitSystem, c_Coupling] := BohrRadius[u, c] (1 + 1/ProtonElectronMassRatio[c]); -ClassicalElectronRadius[u_UnitSystem, c_Coupling] := FineStructureConstant[c] ReducedPlanckConstant[u, c]/ElectronMass[u, c]/SpeedOfLight[u, c]; -BohrMagneton[u_UnitSystem, c_Coupling] := ElementaryCharge[u, c] ReducedPlanckConstant[u, c] LorentzConstant[u]/2 ElectronMass[u, c]; - -Map[( - #[u_String, c_String] := #[UnitSystem[u], Coupling[c]]; - #[u_String] := #[UnitSystem[u]] -) &, Join[ConstantsList, PhysicsList]] - -Map[(#[c_String] := #[Coupling[c]]) &, {GravitationalCouplingConstantElectronElectron, FineStructureConstant, ElectronRelativeAtomicMass, ProtonRelativeAtomicMass, ProtonElectronMassRatio}] - -Map[(symbol[ToString[#]] = #) &, Join[ConstantsList, PhysicsList, {GravitationalCouplingConstantElectronElectron, FineStructureConstant, ElectronRelativeAtomicMass, ProtonRelativeAtomicMass, ProtonElectronMassRatio}]] +Get["UnitSystems`physics`"] -Coupling /: Entity["PhysicalConstant", x_][c_Coupling] := symbol[x][c] -UnitSystem /: Entity["PhysicalConstant", x_][u_UnitSystem] := symbol[x][u] -UnitSystem /: Entity["PhysicalConstant", x_][u_UnitSystem, c_Coupling] := symbol[x][u, c] -(u_UnitSystem)[Entity["PhysicalConstant", x_]] := symbol[x][u] -(u_UnitSystem)[x_String] := symbol[x][u] -(c_Coupling)[Entity["PhysicalConstant", x_]] := symbol[x][c] -(c_Coupling)[x_String] := symbol[x][c] +symbol = Association[Map[Rule[ToString[#],#] &, Join[ConstantsList, PhysicsList, DimensionlessList]]] UnitConstant[x_Symbol, u_] := x[u] UnitConstant[x_String, u_] := UnitConstant[symbol[x], u] UnitConstant[x_Symbol, u_, c_] := x[u, c] UnitConstant[x_String, u_, c_] := UnitConstant[symbol[x], u, c] -Map[(convert[ToString[#]] = #) &, ConvertList] +(u_UnitSystem)[Entity["PhysicalConstant", x_]] := UnitConstant[x, u] +(u_UnitSystem)[x_String] := UnitConstant[x, u] +(c_Coupling)[Entity["PhysicalConstant", x_]] := UnitConstant[x, c] +(c_Coupling)[x_String] := UnitConstant[x, c] +Coupling /: Entity["PhysicalConstant", x_][c_Coupling] := UnitConstant[x, c] +UnitSystem /: Entity["PhysicalConstant", x_][u_UnitSystem] := UnitConstant[x, u] +UnitSystem /: Entity["PhysicalConstant", x_][u_UnitSystem, c_Coupling] := UnitConstant[x, u, c] + +Unprotect[Entity] +Entity["UnitSystem", u_][Entity["PhysicalConstant", x_]] := UnitConstant[x, u] +Entity["PhysicalConstant", x_][Entity["UnitSystem", u_]] := UnitConstant[x, u] +Entity["PhysicalConstant", x_][Entity["UnitSystem", u_], c_] := UnitConstant[x, u, c] +Protect[Entity] + +convert = Association[Map[Rule[ToString[#],#] &, ConvertList]] ConvertUnit[x_Symbol, u_] := x[u] -ConvertUnit[x_String, u_] := convert[x][u] +ConvertUnit[x_String, u_] := ConvertUnit[convert[x], u] ConvertUnit[x_Symbol, a_, b_] := x[a, b] -ConvertUnit[x_String, a_, b_] := convert[x][a, b] +ConvertUnit[x_String, a_, b_] := ConvertUnit[convert[x], a, b] ConvertUnit[x_Symbol, v_, u_, s_] := x[v, u, s] -ConvertUnit[x_String, v_, u_, s_] := convert[x][v, u, s] +ConvertUnit[x_String, v_, u_, s_] := ConvertUnit[convert[x], v, u, s] (* more *) +{"Density" -> "MassDensity", +"Conductance" -> "ElectricConductance", +"ChargeDensity" -> "ElectricChargeDensity", +"Current" -> "ElectricCurrent", +"ElectricField" -> "ElectricFieldStrength", +"Permittivity" -> "ElectricPermittivity", +"MagneticDipoleMoment" -> "MagneticMoment", +"Speed" -> "Velocity"} + DerivedUnits = <| -"NaturalUnitOfEnergy" -> Energy["AbstractNatural","AbstractSI2019"], -"NaturalUnitOfLength" -> Length["AbstractNatural","AbstractSI2019"], -"NaturalUnitOfMomentum" -> Momentum["AbstractNatural","AbstractSI2019"], -"NaturalUnitOfTime" -> Time["AbstractNatural","AbstractSI2019"], -"PlanckArea" -> Area[UnitSystem["AbstractPlanckGauss"],UnitSystem["AbstractSI2019"]] -"PlanckFrequency" -> Frequency["AbstractPlanckGauss","AbstractSI2019"], -"PlanckLength" -> Length["AbstractPlanckGauss","AbstractSI2019"], -"PlanckMassDensity" -> Density["AbstractPlanckGauss","AbstractSI2019"], -"PlanckTemperature" -> Temperature["AbstractPlanckGauss","AbstractSI2019"], -"PlanckTime" -> Time["AbstractPlanckGauss","AbstractSI2019"], -"PlanckVolume" -> Volume[UnitSystem["AbstractPlanckGauss"],UnitSystem["AbstractSI2019"]], -"AtomicUnitOfElectricConductance" -> Conductance["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfElectricChargeDensity" -> ChargeDensity["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfElectricCurrent" -> Current["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfElectricFieldStrength" -> ElectricField["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfElectricPermittivity" -> ElectricConstant["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfElectricPolarizability" -> ElectricPolarizability["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfElectricPotential" -> ElectricPotential["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfForce" -> Force["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfFrequency" -> Frequency["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfMagneticFlux" -> MagneticFlux["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfMagneticFluxDensity" -> MagneticFluxDensity["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfMagneticMoment" -> MagneticDipoleMoment["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfMomentum" -> Momentum["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfPressure" -> Pressure["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfTemperature" -> Temperature["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfTime" -> Time["AbstractHartree","AbstractSI2019"], -"AtomicUnitOfVelocity" -> Speed["AbstractHartree","AbstractSI2019"], -"RydbergEnergy" -> Energy["AbstractRydberg","AbstractSI2019"], -"SolarMass" -> Mass["AbstractIAU","AbstractSI2019"], -"AstronomicalUnit" -> Length["AbstractIAU","AbstractSI2019"], -"CosmologicalNaturalLength" -> Length["AbstractCosmological","AbstractSI2019"], -"CosmologicalNaturalMass" -> Mass["AbstractCosmological","AbstractSI2019"], -"CosmologicalNaturalTime" -> Time["AbstractCosmological","AbstractSI2019"], -"CosmologicalQuantumPointLength" -> Length["AbstractCosmologicalQuantum","AbstractSI2019"], -"CosmologicalQuantumPointMass" -> Mass["AbstractCosmologicalQuantum","AbstractSI2019"], -"CosmologicalQuantumPointEnergy" -> Energy["AbstractCosmologicalQuantum","AbstractSI2019"], -"HubbleLength" -> Length["AbstractHubble","AbstractSI2019"], -"HubbleTime" -> Time["AbstractHubble","AbstractSI2019"], -"HubbleVolume" -> Volume[UnitSystem["AbstractHubble"],UnitSystem["AbstractSI2019"]] -|> - -(* -"AtomicUnitOfLength" -> Length[UnitSystem["Hartree"],UnitSystem["SI2019"]]; -"lS" -> Length[UnitSystem["Stoney"], UnitSystem["SI2019"]]; -"tS" -> Time[UnitSystem["Stoney"], UnitSystem["SI2019"]]; -"mS" -> Mass[UnitSystem["Stoney"], UnitSystem["SI2019"]]; -"lQCD" -> Length[UnitSystem["QCD"], UnitSystem["SI2019"]]; -"tQCD" -> Time[UnitSystem["QCD"], UnitSystem["SI2019"]]; -"mQCD" -> Mass[UnitSystem["QCD"], UnitSystem["SI2019"]]; -*) +"NaturalUnitOfEnergy" -> Energy["AbstractNatural"], +"NaturalUnitOfLength" -> Length["AbstractNatural"], +"NaturalUnitOfMomentum" -> Momentum["AbstractNatural"], +"NaturalUnitOfTime" -> Time["AbstractNatural"], +"PlanckArea" -> Area[UnitSystem["AbstractPlanckGauss"]], +"PlanckFrequency" -> Frequency["AbstractPlanckGauss"], +"PlanckLength" -> Length["AbstractPlanckGauss"], +"PlanckMassDensity" -> Density["AbstractPlanckGauss"], +"PlanckTemperature" -> Temperature["AbstractPlanckGauss"], +"PlanckTime" -> Time["AbstractPlanckGauss"], +"PlanckVolume" -> Volume[UnitSystem["AbstractPlanckGauss"]], +"AtomicUnitOfElectricConductance" -> Conductance["AbstractHartree"], +"AtomicUnitOfElectricChargeDensity" -> ChargeDensity["AbstractHartree"], +"AtomicUnitOfElectricCurrent" -> Current["AbstractHartree"], +"AtomicUnitOfElectricFieldStrength" -> ElectricField["AbstractHartree"], +"AtomicUnitOfElectricPermittivity" -> Permittivity["AbstractHartree"], +"AtomicUnitOfElectricPolarizability" -> ElectricPolarizability["AbstractHartree"], +"AtomicUnitOfElectricPotential" -> ElectricPotential["AbstractHartree"], +"AtomicUnitOfForce" -> Force["AbstractHartree"], +"AtomicUnitOfFrequency" -> Frequency["AbstractHartree"], +"AtomicUnitOfMagneticFlux" -> MagneticFlux["AbstractHartree"], +"AtomicUnitOfMagneticFluxDensity" -> MagneticFluxDensity["AbstractHartree"], +"AtomicUnitOfMagneticMoment" -> MagneticDipoleMoment["AbstractHartree"], +"AtomicUnitOfMomentum" -> Momentum["AbstractHartree"], +"AtomicUnitOfPressure" -> Pressure["AbstractHartree"], +"AtomicUnitOfTemperature" -> Temperature["AbstractHartree"], +"AtomicUnitOfTime" -> Time["AbstractHartree"], +"AtomicUnitOfVelocity" -> Speed["AbstractHartree"], +"RydbergEnergy" -> Energy["AbstractRydberg"], +"SolarMass" -> Mass["AbstractIAU"], +"AstronomicalUnit" -> Length["AbstractIAU"], +"CosmologicalNaturalLength" -> Length["AbstractCosmological"], +"CosmologicalNaturalMass" -> Mass["AbstractCosmological"], +"CosmologicalNaturalTime" -> Time["AbstractCosmological"], +"CosmologicalQuantumPointLength" -> Length["AbstractCosmologicalQuantum"], +"CosmologicalQuantumPointMass" -> Mass["AbstractCosmologicalQuantum"], +"CosmologicalQuantumPointEnergy" -> Energy["AbstractCosmologicalQuantum"], +"HubbleLength" -> Length["AbstractHubble"], +"HubbleTime" -> Time["AbstractHubble"], +"HubbleVolume" -> Volume[UnitSystem["AbstractHubble"]]|>; + +(*AppendTo[DerivedUnits, { +"AtomicUnitOfLength" -> Length["AbstractHartree"], +"lS" -> Length["AbstractStoney"], +"tS" -> Time["AbstractStoney"], +"mS" -> Mass["AbstractStoney"], +"lQCD" -> Length["AbstractQCD"], +"tQCD" -> Time["AbstractQCD"], +"mQCD" -> Mass["AbstractQCD"]}]*) + +(*AppendTo[UnitData, { +"GMearth" -> Around[398600441.8 10^6, 8 10^5], +"GMjupiter" -> Around[1.26686534 10^17, 9 10^9], +"LD" -> 384402 10^3, +"kelvin" -> 9/5, +"atm" -> 101325, +"kcalth" -> 4184, +"kcal4" -> 4204, +"kcal10" -> 4185+1/2, +"kcal20" -> 4182, +"kcalm" -> 4190, +"kcalit" -> 4186+8/10}] +AppendTo[AbstractUnitData, { +"cal4" -> "kcal4"/1000, +"cal10" -> "kcal10"/1000, +"cal20" -> "kcal20"/1000, +"calm" -> "kcalm"/1000, +"calit" -> "kcalit"/1000, +"calth" -> "kcalth"/1000, +"kcal" -> "kcalth", +"cal" -> "kcalth"/1000, +"calth" -> "kcalth"/1000, +"ly" -> 36525/100 "c" "day"}]*) (*ConstantsList = {Hyperfine, LightSpeed, Planck, PlanckReduced, ElectronMass, MolarMass, Boltzmann, Permeability, Rationalization, @@ -717,29 +280,53 @@ PhysicsList = {AtomicMass, ProtonMass, PlanckMass, Newton, Einstein, BiotSavart, Charge, Faraday, Impedance, Conductance, Klitzing, Josephson, MagneticFlux, Magneton};*) -(*AppendTo[UnitData, "kelvin" -> 9/5] -AppendTo[UnitData, "atm" -> 101325] -AppendTo[UnitData, "kcalth" -> 4184] -AppendTo[UnitData, "kcal4" -> 4204] -AppendTo[UnitData, "kcal10" -> 4185+1/2] -AppendTo[UnitData, "kcal20" -> 4182] -AppendTo[UnitData, "kcalm" -> 4190] -AppendTo[UnitData, "kcalit" -> 4186+8/10] -AppendTo[UnitData, "cal4" -> UnitData[["kcal4"]]/1000] -AppendTo[UnitData, "cal10" -> UnitData[["kcal10"]]/1000] -AppendTo[UnitData, "cal20" -> UnitData[["kcal20"]]/1000] -AppendTo[UnitData, "calm" -> UnitData[["kcalm"]]/1000] -AppendTo[UnitData, "calit" -> UnitData[["kcalit"]]/1000] -AppendTo[UnitData, "calth" -> UnitData[["kcalth"]]/1000] -AppendTo[UnitData, "kcal" -> UnitData[["kcalth"]]] -AppendTo[UnitData, "cal" -> UnitData[["kcal"]]/1000] -AppendTo[UnitData, "calth" -> thermal calorie -AppendTo[UnitData, "GMearth" -> Around[398600441.8 10^6, 8 10^5]] -AppendTo[UnitData, "GMjupiter" -> Around[1.26686534 10^17, 9 10^9] -AppendTo[UnitData, "LD" -> 384402 10^3] -AppendTo[UnitData, "ly" -> (365.25 "c" "day")/.Normal[UnitData]]*) - -UnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1] -UnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1] -Map[(UnitSystem[#] = AbstractUnitSystem[#] /. Normal[UnitData]) &, -{"AbstractUnits","AbstractUnits1","AbstractUnits2","Gauss","LorentzHeaviside","Thomson","Kennelly","ESU","ESU2019","EMU","EMU2019","MTS","Mixed","Metric","SI1976","SI2019","CODATA","Conventional","English","EnglishUS","IAU","FFF","Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","QCD","QCDGauss","QCDoriginal","Hubble","Cosmological","CosmologicalQuantum"}]; +StandardModel = Coupling["StandardModel"] +AbstractCoupling = Coupling["AbstractCoupling"] +AbstractUniverse = Coupling["AbstractUniverse"] + +AbstractUnits = AbstractUnitSystem["AbstractUnits"] +AbstractUnits1 = AbstractUnitSystem["AbstractUnits1"] +AbstractUnits2 = AbstractUnitSystem["AbstractUnits2"] +AbstractMetric = AbstractUnitSystem["Metric"] +AbstractSI2019 = AbstractUnitSystem["SI2019"] +AbstractCGS = AbstractUnitSystem["Gauss"] +AbstractMTS = AbstractUnitSystem["MTS"] +AbstractEnglish = AbstractUnitSystem["English"] +AbstractEnglishUS = AbstractUnitSystem["EnglishUS"] +AbstractIAU = AbstractUnitSystem["IAU"] +AbstractFFF = AbstractUnitSystem["FFF"] + +Gauss = UnitSystem["Gauss"] +LorentzHeaviside = UnitSystem["LorentzHeaviside"] +Thomson = UnitSystem["Thomson"] +Kennelly = UnitSystem["Kennelly"] +ESU = UnitSystem["ESU"] +ESU2019 = UnitSystem["ESU2019"] +EMU = UnitSystem["EMU"] +EMU2019 = UnitSystem["EMU2019"] +MTS = UnitSystem["MTS"] +Mixed = UnitSystem["Mixed"] +Metric = UnitSystem["Metric"] +SI1976 = UnitSystem["SI1976"] +SI2019 = UnitSystem["SI2019"] + +CODATA = UnitSystem["CODATA"] +Conventional = UnitSystem["Conventional"] +English = UnitSystem["English"] +EnglishUS = UnitSystem["EnglishUS"] +IAU = UnitSystem["IAU"] +FFF = UnitSystem["FFF"] +Hubble = UnitSystem["Hubble"] +Cosmological = UnitSystem["Cosmological"] +CosmologicalQuantum = UnitSystem["CosmologicalQuantum"] + +PlanckGauss = UnitSystem["PlanckGauss"] +Stoney = UnitSystem["Stoney"] +Schrodinger = UnitSystem["Schrodinger"] +Electronic = UnitSystem["Electronic"] +Natural = UnitSystem["Natural"] +QCD = UnitSystem["QCD"] +QCDGauss = UnitSystem["QCDGauss"] +QCDoriginal = UnitSystem["QCDoriginal"] + +{SI,MKS,CGS, CGS2019, CGSm, CGSe, HLU} = {SI2019, Metric, Gauss, EMU2019, EMU, ESU, LorentzHeaviside}; diff --git a/Kernel/physics.wl b/Kernel/physics.wl new file mode 100644 index 0000000..bc880e0 --- /dev/null +++ b/Kernel/physics.wl @@ -0,0 +1,296 @@ + +(* This file is part of UnitSystems. It is licensed under the MIT license *) +(* UnitSystems Copyright (C) 2022 Michael Reed *) + +ElectronMass[h_?NumberQ] := UnitData["R\[Infinity]"] 2 h/UnitData["\[Alpha]"]^2/UnitData["c"]; +ElectronMass[h_?NumberQ, u_Coupling] := (UnitData["R\[Infinity]"] 2 h)/(FineStructureConstant[u]^2 UnitData["c"]); +PlanckMass[u_UnitSystem, c_Coupling] := PowerExpand[ElectronMass[u, c]/Sqrt[GravitationalCouplingConstantElectronElectron[c]]] +PlanckConstant[u_UnitSystem, c_Coupling] := 2 Pi ReducedPlanckConstant[u]; +GravitationalConstant[u_UnitSystem, c_Coupling] := PowerExpand[(SpeedOfLight[u, c] ReducedPlanckConstant[u, c])/PlanckMass[u, c]^2] +ElementaryCharge[u_UnitSystem, c_Coupling] := PowerExpand[Sqrt[2 PlanckConstant[u]/(MagneticConstant[u]/FineStructureConstant[u])/(SpeedOfLight[u] RationalizationConstant[u] LorentzConstant[u]^2)]] + +ElectronMass[UnitSystem["Planck"], c_Coupling] := PowerExpand[Sqrt[4 Pi GravityCoupling[c]]] +ElectronMass[UnitSystem["PlanckGauss"], c_Coupling] := Sqrt[GravitationalCouplingConstantElectronElectron[c]]; +ElectronMass[UnitSystem[_, _, _, _, Sqrt[EvalUnitData["\[Alpha]G"]/UnitData["\[Alpha]"]], ___], c_Coupling] := PowerExpand[Sqrt[GravitationalCouplingConstantElectronElectron[c]/FineStructureConstant[c]]] +ElectronMass[UnitSystem[_, _, _, _, 1/UnitData["\[Mu]pe"], ___], c_Coupling] := 1/ProtonElectronMassRatio[c]; +MagneticConstant[UnitSystem[_, _, _, 4 Pi UnitData["\[Alpha]"]^2, ___], c_Coupling] := 4 Pi FineStructureConstant[c]^2; +MagneticConstant[UnitSystem[_, _, _, Pi UnitData["\[Alpha]"]^2, ___], c_Coupling] := Pi FineStructureConstant[c]^2; +SpeedOfLight[UnitSystem[_, _, 1/UnitData["\[Alpha]"], ___], c_Coupling] := 1/FineStructureConstant[c]; +SpeedOfLight[UnitSystem[_, _, 2/UnitData["\[Alpha]"], ___], c_Coupling] := 2/FineStructureConstant[c]; +PlanckReduced[UnitSystem[_, 1/UnitData["\[Alpha]"], ___], c_Coupling] := 1/FineStructure[c]; + +ElectronMass[u : UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me"], ___], c_Coupling] := ElectronMass[PlanckConstant[u], c]; +ElectronMass[UnitSystem[_, _, 100 UnitData["c"], _, 1000 EvalUnitData["me"], ___], c_Coupling] := 1000 ElectronMass[UnitSystem["SI2019"], c]; +ElectronMass[UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me"]/1000, ___], c_Coupling] := ElectronMass[UnitSystem["SI2019"], c]/1000; +ElectronMass[u : UnitSystem[_, _, UnitData["c"], _, EvalUnitData["me2014"], ___], c_Coupling] := ElectronMass[PlanckConstant[u], c]; +ElectronMass[u : UnitSystem[_, _, UnitData["c"], EvalUnitData["\[Mu]0"], EvalUnitData["me1990"], ___], c_Coupling] := ElectronMass[PlanckConstant[u], c]; +ElectronMass[UnitSystem[_, _, UnitData["c"]/UnitData["ftUS"], _, EvalUnitData["me"]/EvalUnitData["slug"], ___], c_Coupling] := ElectronMass[UnitSystem["SI2019"], c]/EvalUnitData["slug"]; + +MagneticConstant[UnitSystem[_, _, _, EvalUnitData["\[Mu]0"], ___], c_Coupling] := FineStructureConstant[c] 2 UnitData["h"]/UnitData["c"]/UnitData["e"]^2; +MagneticConstant[UnitSystem["ESU2019"], u_Coupling] := 10^3 MagneticConstant[UnitSystem["SI2019"], u]/UnitData["c"]^2; +MagneticConstant[UnitSystem["EMU2019"], u_Coupling] := 10^7 MagneticConstant[UnitSystem["SI2019"], u]; +MagneticConstant[UnitSystem["CODATA"], u_Coupling] := 2 UnitData["RK2014"] FineStructureConstant[u]/UnitData["c"]; +MagneticConstant[UnitSystem["Conventional"], u_Coupling] := 2 UnitData["RK1990"] FineStructureConstant[u]/UnitData["c"]; + +MolarMassConstant[UnitSystem[1, ___]] = 1; +MolarMassConstant[u:UnitSystem[UnitData["kB"], ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[u:UnitSystem[UnitData["kB"], ___], c_Coupling] := UnitData["NA"] ElectronMass[u, c]/ElectronRelativeAtomicMass[c]; +MolarMassConstant[u:UnitSystem[10^7 UnitData["kB"], ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[UnitSystem[10^7 UnitData["kB"], ___], c_Coupling] := 1000 MolarMassConstant[UnitSystem["SI2019"], c]; +MolarMassConstant[u:UnitSystem[10^3 UnitData["kB"], ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[UnitSystem[10^3 UnitData["kB"], ___], c_Coupling] := MolarMassConstant[UnitSystem["SI2019"], c]/1000; +MolarMassConstant[UnitSystem[kB_, ___]] := MolarMassConstant["CGS"]/1000; +MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["MTS"]], ___]] := MolarMassConstant["CGS"]/10^6; +MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["CGS"]], ___]] := MolarMassConstant["Natural"]; +MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["FFF"]], ___]] := MolarMassConstant["Natural"]; +MolarMassConstant[u:UnitSystem[BoltzmannConstant[UnitSystem["English"]], ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[u:UnitSystem[BoltzmannConstant[UnitSystem["English"]], ___], c_Coupling] := 1000 MolarMassConstant[UnitSystem["SI2019"],c] +MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["EnglishUS"]], ___]] := MolarMassConstant["Natural"]; +MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["IAU"]], ___]] = EvalUnitData["ms"]/1000; + +MolarMassConstant[AbstractUnitSystem["AbstractUnits"]] = "Mu" +MolarMassConstant[AbstractUnitSystem["AbstractUnits1"]] = "Mu1" +MolarMassConstant[AbstractUnitSystem["AbstractUnits2"]] = "Mu2" +MolarMassConstant[u : UnitSystem["kB", ___]] := MolarMassConstant[u,Universe[u]] +MolarMassConstant[u : UnitSystem["kB", ___], c_Coupling] := "NA" ElectronMass[AbstractUnitSystem["SI2019"],c]/ElectronRelativeAtomicMass[c] +MolarMassConstant[u : UnitSystem[10^7 "kB", ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[UnitSystem[10^7 "kB", ___], c_Coupling] := 1000 MolarMassConstant[AbstractUnitSystem["SI2019"], c]; +MolarMassConstant[u : UnitSystem[10^3 "kB", ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[UnitSystem[10^3 "kB", ___], c_Coupling] := MolarMassConstant[AbstractUnitSystem["SI2019"], c]/1000; +MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["MTS"]], ___]] := MolarMassConstant["CGS"]/10^6; +MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["CGS"]], ___]] := MolarMassConstant["Natural"]; +MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["FFF"]], ___]] := MolarMassConstant["Natural"]; +MolarMassConstant[u : UnitSystem[BoltzmannConstant[AbstractUnitSystem["English"]], ___]] := MolarMassConstant[u, Universe[u]]; +MolarMassConstant[u : UnitSystem[BoltzmannConstant[AbstractUnitSystem["English"]], ___], c_Coupling] := 1000 MolarMassConstant[AbstractUnitSystem["SI2019"], c]; +MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["EnglishUS"]], ___]] := MolarMassConstant["Natural"]; +MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["IAU"]], ___]] := 1/1000 AbstractUnitData["ms"]; + +MonochromaticRadiation540THzLuminousEfficacy[UnitSystem[1, ___]] = 1 +MonochromaticRadiation540THzLuminousEfficacy[u : UnitSystem[_?NumericQ, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] +MonochromaticRadiation540THzLuminousEfficacy[u : UnitSystem[_Around, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] +MonochromaticRadiation540THzLuminousEfficacy[AbstractUnitSystem["AbstractUnits1"]] = "Kcd1" +MonochromaticRadiation540THzLuminousEfficacy[AbstractUnitSystem["AbstractUnits2"]] = "Kcd2" +MonochromaticRadiation540THzLuminousEfficacy[u_UnitSystem] := Power["Kcd", AbstractUnitSystem["SI2019"], u] + +Kilograms[m_] := Kilograms[m, "English"]; +Kilograms[m_, u_UnitSystem] := Mass[m, UnitSystem["Metric"], u]; +Kilograms[m_, u_String] := Mass[m, UnitSystem[u]]; +Slugs[m_] := Slugs[m, "Metric"]; +Slugs[m_, u_UnitSystems] := Mass[m, UnitSystem["English"], u]; +Slugs[m_, u_String] := Mass[m, UnitSystem[u]]; +Feet[d_] := Feet[d, "Metric"]; +Feet[d_, u_UnitSystem] := Length[d, UnitSystem["English"], u]; +Feet[d_, u_String] := Length[d, UnitSystem[u]]; +Meters[d_] := Meters[d, "English"]; +Meters[d_, u_UnitSystem] := Length[d, UnitSystem["Metric"], u]; +Meters[d_, u_String] := Length[d, UnitSystem[u]]; + +(* IAU to SI *) +UnitSystem /: + Length[u : UnitSystem[_, _, UnitData["c"], ___], + s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Length[u, s, 1/UnitData["au"]]; +Time[u : UnitSystem[_, _, UnitData["c"], ___], + s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Time[u, s, 1/UnitData["day"]]; +(* SI to IAU *) +UnitSystem /: + Length[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], + s : UnitSystem[_, _, UnitData["c"], ___]] := Length[u, s, UnitData["au"]]; +Time[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], + s : UnitSystem[_, _, UnitData["c"], ___]] := Time[u, s, UnitData["day"]]; +(* IAU to CGS *) +UnitSystem /: + Length[u : UnitSystem[_, _, 100 UnitData["c"], ___], + s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Length[u, s, 1/UnitData["au"]]; +Time[u : UnitSystem[_, _, 100 UnitData["c"], ___], + s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Time[u, s, 1/UnitData["day"]]; +(* CGS to IAU *) +UnitSystem /: + Length[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], + s : UnitSystem[_, _, 100 UnitData["c"], ___]] := Length[u, s, UnitData["au"]]; +Time[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], + s : UnitSystem[_, _, 100 UnitData["c"], ___]] := Time[u, s, UnitData["day"]]; +(* IAU to English *) +UnitSystem /: + Length[u : UnitSystem[_, _, UnitData["c"]/UnitData["ft"], ___], + s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Length[u, s, UnitData["ft"]/UnitData["au"]]; +Time[u : UnitSystem[_, _, UnitData["c"]/UnitData["ft"], ___], + s : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___]] := Time[u, s, 1/UnitData["day"]]; +(* English to IAU *) +UnitSystem /: + Length[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], + s : UnitSystem[_, _, UnitData["c"]/UnitData["ft"], ___]] := Length[u, s, UnitData["au"]/UnitData["ft"]]; +Time[u : UnitSystem[_, _, UnitData["day"] UnitData["c"]/UnitData["au"], ___], + s : UnitSystem[_, _, UnitData["c"]/UnitData["ft"], ___]] := Time[u, s, UnitData["day"]]; + +UnitSystem /: Length[u_UnitSystem, s_UnitSystem] := Length[u, s, 1]; +UnitSystem /: Length[u_UnitSystem, s_UnitSystem, l_] := + Unit[(ReducedPlanckConstant[s] ElectronMass[u] SpeedOfLight[ + u])/(ReducedPlanckConstant[u] ElectronMass[s] SpeedOfLight[s]), l]; +UnitSystem /: Area[u_UnitSystem, s_UnitSystem] := Unit[Length[u, s]^2]; +UnitSystem /: Volume[u_UnitSystem, s_UnitSystem] := Unit[Length[u, s]^3]; + +WaveNumber[u_UnitSystem, s_UnitSystem] := Unit[Length[s, u]]; +FuelEfficiency[u_UnitSystem, s_UnitSystem] := Area[s, u]; +Time[u_UnitSystem, s_UnitSystem] := Time[u, s, 1]; +Time[u_UnitSystem, s_UnitSystem, t_] := Unit[Length[u, s]/SpeedOfLight[u, s], 1]; +Frequency[u_UnitSystem, s_UnitSystem] := Time[s, u]; +FrequencyDrift[u_UnitSystem, s_UnitSystem] := Unit[Time[s, u]^2]; +Speed[u_UnitSystem, s_UnitSystem] := SpeedOfLight[u, s]; +Acceleration[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]]; +Jerk[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]^2]; +Snap[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]^3]; +VolumeFlow[u_UnitSystem, s_UnitSystem] := Unit[Area[u, s], Speed[u, s]]; +SpecificEnergy[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]^2]; + +Mass[u_UnitSystem, s_UnitSystem] := ElectronMass[u, s]; +Energy[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] SpecificEnergy[u, s]]; +UnitSystem /: Power[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Time[u, s]]; +Force[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Acceleration[u, s]]; +Pressure[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]/Time[u, s]^2]; + +Momentum[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Speed[u, s]]; +AngularMomentum[u_UnitSystem, s_UnitSystem] := Unit[Momentum[u, s] Length[u, s]]; +Yank[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Jerk[u, s]]; +AreaDensity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Area[u, s]]; +Density[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Volume[u, s]]; +SpecificVolume[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mass[u, s]]; +Action[u_UnitSystem, s_UnitSystem] := Unit[Momentum[u, s] Length[u, s]]; +Stiffness[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Area[u, s]]; +Intensity[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Area[u, s]]; +Diffusivity[u_UnitSystem, s_UnitSystem] := Unit[(ReducedPlanckConstant[s] ElectronMass[u])/(ReducedPlanckConstant[u] ElectronMass[s])]; +Viscosity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]/Time[u, s]]; +LinearDensity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]]; +MassFlow[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Time[u, s]]; +SpectralFlux[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Length[u, s]]; +PowerDensity[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Volume[u, s]]; +Compressibility[u_UnitSystem, s_UnitSystem] := Pressure[s, u]; +Fluence[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Area[u, s]]; +RotationalInertia[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Area[u, s]]; + +SoundExposure[u_UnitSystem, s_UnitSystem] := Unit[Time[u, s] Pressure[u, s]^2]; +SpecificImpedance[u_UnitSystem, s_UnitSystem] := Unit[Pressure[u, s]/Speed[u, s]]; +Impedance[u_UnitSystem, s_UnitSystem] := Unit[SpecificImpedance[u, s]/Area[u, s]]; +Admittance[u_UnitSystem, s_UnitSystem] := Unit[Area[u, s]/SpecificImpedance[u, s]]; +Compliance[u_UnitSystem, s_UnitSystem] := Unit[Time[u, s]^2/Mass[u, s]]; +Inertance[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]^4]; + +(* Electromagnetic *) + +Voltage = ElectricPotential + +Charge[u_UnitSystem, s_UnitSystem] := + Unit[Sqrt[(ReducedPlanckConstant[s] MagneticConstant[u] SpeedOfLight[ + u] RationalizationConstant[u] LorentzConstant[u]^2)/(ReducedPlanckConstant[ + u] MagneticConstant[s] SpeedOfLight[s] RationalizationConstant[s] LorentzConstant[s]^2)]]; +Current[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Time[u, s]]; +ElectricPotential[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Charge[u, s]]; +Capacitance[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/ElectricPotential[u, s]]; +Resistance[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s]/Current[u, s]]; +Conductance[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s]/ElectricPotential[u, s]]; +MagneticFlux[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/LorentzConstant[u, s]/Current[u, s]]; +MagneticFluxDensity[u_UnitSystem, s_UnitSystem] := + Unit[Mass[u, s]/LorentzConstant[u, s]/Current[u, s]/Time[u, s]^2]; +Inductance[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Area[u, s]/Charge[u, s]^2]; + +ElectricFluxDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] RationalizationConstant[u, s]/Area[u, s]]; +ChargeDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Volume[u, s]]; +CurrentDensity[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s]/Area[u, s]]; +Conductivity[u_UnitSystem, s_UnitSystem] := Unit[Conductance[u, s]/Length[u, s]]; +Permittivity[u_UnitSystem, s_UnitSystem] := Unit[Capacitance[u, s] RationalizationConstant[u, s]/Length[u, s]]; +ElectricField[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s]/Length[u, s]]; +MagneticField[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s] RationalizationConstant[u, s] LorentzConstant[u, s]/Length[u, s]]; +Exposure[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Mass[u, s]]; +Resistivity[u_UnitSystem, s_UnitSystem] := Unit[Resistance[u, s] Length[u, s]]; +LinearChargeDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Length[u, s]]; +MagneticDipoleMoment[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s] LorentzConstant[u, s] Area[u, s]]; +Mobility[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] Time[u, s]/Mass[u, s]]; +Reluctance[u_UnitSystem, s_UnitSystem] := Unit[RationalizationConstant[u, s] LorentzConstant[u, s]^2/Inductance[u, s]]; +VectorPotential[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s]/Length[u, s]]; +MagneticMoment[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s] Length[u, s]]; +Rigidity[u_UnitSystem, s_UnitSystem] := Unit[MagneticFluxDensity[u, s] Length[u, s]]; +Susceptibility[u_UnitSystem, s_UnitSystem] := Unit[RationalizationConstant[s, u]]; + +(* WARNING unchecked: rigitidy, magneticmoment, vectorpotential, \ +mobility, linearchargedensity, exposure *) + +ElectricFlux[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s] Length[u, s]]; +ElectricDipoleMoment[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] Length[u, s]]; +MagneticPotential[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s] Reluctance[u, s]]; +PoleStrength[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/Length[u, s]]; +Permeance[u_UnitSystem, s_UnitSystem] := Reluctance[s, u]; +SpecificSusceptibility[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/MagneticField[u, s]/Mass[u, s]]; +Magnetizability[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[u, s]/MagneticFluxDensity[u, s]]; +ElectricPolarizability[u_UnitSystem, s_UnitSystem] := Unit[ElectricDipoleMoment[u, s]/ElectricField[u, s]]; +MagneticPolarizability[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/MagneticField[u, s]]; +Magnetization[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[u, s]/Volume[u, s]]; + +SpecificMagnetization[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[s, u]/Mass[s, u]]; +DemagnetizingFactor[u_UnitSystem, s_UnitSystem] := Unit[Rationalization[u, s]]; + +(* Thermodynamic *) + +Moles[n_] := Moles[n, "Metric"]; +Moles[n_, u_UnitSystem] := n/AvogadroConstant[u]; +Moles[n_, u_String] := Moles[n, UnitSystem[u]]; +Molecules[n_] := Molecules[n, "Metric"]; +Molecules[n_, u_UnitSystem] := n AvogadroConstant[u]; +Molecules[n_, u_String] := Molecules[n, UnitSystem[u]]; + +Temperature[u_UnitSystem, s_UnitSystem] := + Unit[(BoltzmannConstant[u] ElectronMass[s] SpeedOfLight[s]^2)/(BoltzmannConstant[ + s] ElectronMass[u] SpeedOfLight[u]^2)]; +UnitSystem /: Entropy[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Temperature[u, s]]; +SpecificEntropy[u_UnitSystem, s_UnitSystem] := Unit[SpecificEnergy[u, s]/Temperature[u, s]]; +VolumeHeatCapacity[u_UnitSystem, s_UnitSystem] := Unit[Entropy[u, s]/Volume[u, s]]; +ThermalConductivity[u_UnitSystem, s_UnitSystem] := Unit[Force[u, s]/Time[u, s]/Temperature[u, s]]; +ThermalConductance[u_UnitSystem, s_UnitSystem] := Unit[ThermalConductivity[u, s] Length[u, s]]; +ThermalResistance[u_UnitSystem, s_UnitSystem] := ThermalConductance[s, u]; +ThermalExpansion[u_UnitSystem, s_UnitSystem] := Temperature[s, u]; +LapseRate[u_UnitSystem, s_UnitSystem] := Unit[Temperature[u, s]/Length[u, s]]; + +Molality[u_UnitSystem, s_UnitSystem] := MolarMassConstant[s, u]; +Mole[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Molality[u, s]]; +Molarity[u_UnitSystem, s_UnitSystem] := Unit[Mole[u, s]/Volume[u, s]]; +MolarVolume[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mole[u, s]]; +MolarEntropy[u_UnitSystem, s_UnitSystem] := Unit[Entropy[u, s]/Mole[u, s]]; +MolarEnergy[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Mole[u, s]]; +MolarConductivity[u_UnitSystem, s_UnitSystem] := Unit[Conductivity[u, s] Area[u, s]/Mole[u, s]]; +MolarSusceptibility[u_UnitSystem, s_UnitSystem] := Unit[SpecificSusceptibility[u, s] MolarMass[u, s]]; +Catalysis[u_UnitSystem, s_UnitSystem] := Unit[Mole[u, s]/Time[u, s]]; +Specificity[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mole[u, s]/Time[u, s]]; + +LuminousFlux[u_UnitSystem, s_UnitSystem] := Unit[Frequency[u, s]^2 (MonochromaticRadiation540THzLuminousEfficacy[s] ReducedPlanckConstant[s])/(MonochromaticRadiation540THzLuminousEfficacy[u] ReducedPlanckConstant[u])]; +Luminance[u_UnitSystem, s_UnitSystem] := Unit[LuminousFlux[u, s]/Area[u, s]]; +LuminousEnergy[u_UnitSystem, s_UnitSystem] := Unit[Frequency[u, s] (MonochromaticRadiation540THzLuminousEfficacy[s] ReducedPlanckConstant[s])/(MonochromaticRadiation540THzLuminousEfficacy[u] ReducedPlanckConstant[u])]; +LuminousExposure[u_UnitSystem, s_UnitSystem] := Unit[Luminance[u, s] Time[u, s]]; + +(* Physics *) + +Cesium133HyperfineSplittingFrequency[u_UnitSystem] := Frequency[UnitData["\[CapitalDelta]\[Nu]Cs"], u]; +HubbleParameter[u_UnitSystem] := Time[u, MatchSystem[u,"Hubble"]] + +Map[(#[u_UnitSystem] := #[u, Universe[u]]) &, {CosmologicalConstant, AvogadroConstant, AtomicMassConstant, ProtonMass, EinsteinConstantSpeedOfLightToTheFourth, MolarGasConstant, StefanBoltzmannConstant, RadiationConstant, ElectricConstant, CoulombConstant, BiotSavartConstant, VacuumImpedance, FaradayConstant, JosephsonConstant, MagneticFluxQuantum, VonKlitzingConstant, ConductanceQuantum, HartreeEnergy, RydbergConstant, BohrRadius, RelativisticBohrRadius, ClassicalElectronRadius, BohrMagneton}]; +CosmologicalConstant[u_UnitSystem, c_Coupling] := 3 UniverseDarkEnergyMassDensity[c] (HubbleParameter[u]/SpeedOfLight[u, c])^2 +AvogadroConstant[u_UnitSystem, c_Coupling] := MolarMassConstant[u, c] ElectronRelativeAtomicMass[c]/ElectronMass[u, c]; +AtomicMassConstant[u_UnitSystem, c_Coupling] := ElectronMass[u, c]/ElectronRelativeAtomicMass[c]; +ProtonMass[u_UnitSystem, c_Coupling] := ProtonElectronMassRatio[c] ElectronMass[u, c]; +EinsteinConstantSpeedOfLightToTheFourth[u_UnitSystem, c_Coupling] := (8 Pi GravitationalConstant[u, c])/SpeedOfLight[u, c]^4; +MolarGasConstant[u_UnitSystem, c_Coupling] := BoltzmannConstant[u, c] AvogadroConstant[u, c]; +StefanBoltzmannConstant[u_UnitSystem, c_Coupling] := (2 Pi^5 BoltzmannConstant[u, c]^4)/(15 PlanckConstant[u, c]^3 SpeedOfLight[u, c]^2); +RadiationConstant[u_UnitSystem, c_Coupling] := (4 StefanBoltzmannConstant[u, c])/SpeedOfLight[u, c]; +ElectricConstant[u_UnitSystem, c_Coupling] := (1/MagneticConstant[u, c]) (SpeedOfLight[u, c] LorentzConstant[u]^2); +CoulombConstant[u_UnitSystem, c_Coupling] := RationalizationConstant[u]/(4 Pi)/ ElectricConstant[u]; +BiotSavartConstant[u_UnitSystem, c_Coupling] := MagneticConstant[u, c] LorentzConstant[u] (RationalizationConstant[u]/(4 Pi)); +AmpereConstant[u_UnitSystem] := LorentzConstant[u] BiotSavartConstant[u]; +VacuumImpedance[u_UnitSystem, c_Coupling] := MagneticConstant[u, c] SpeedOfLight[u, c] RationalizationConstant[u] LorentzConstant[u]^2; +FaradayConstant[u_UnitSystem, c_Coupling] := ElementaryCharge[u, c] AvogadroConstant[u, c]; +JosephsonConstant[u_UnitSystem, c_Coupling] := 2 ElementaryCharge[u, c] LorentzConstant[u]/PlanckConstant[u, c]; +MagneticFluxQuantum[u_UnitSystem, c_Coupling] := 1/JosephsonConstant[u, c]; +VonKlitzingConstant[u_UnitSystem, c_Coupling] := PlanckConstant[u, c]/ElementaryCharge[u, c]^2; +ConductanceQuantum[u_UnitSystem, c_Coupling] := (2 ElementaryCharge[u, c]^2)/PlanckConstant[u, c]; +HartreeEnergy[u_UnitSystem, c_Coupling] := ElectronMass[u, c] (SpeedOfLight[u, c] FineStructureConstant[c])^2; +RydbergConstant[u_UnitSystem, c_Coupling] := HartreeEnergy[u, c]/(2 PlanckConstant[u, c])/SpeedOfLight[u, c]; +BohrRadius[u_UnitSystem, c_Coupling] := ReducedPlanckConstant[u, c]/ElectronMass[u, c]/SpeedOfLight[u, c]/FineStructureConstant[c]; +RelativisticBohrRadius[u_UnitSystem, c_Coupling] := BohrRadius[u, c] (1 + 1/ProtonElectronMassRatio[c]); +ClassicalElectronRadius[u_UnitSystem, c_Coupling] := FineStructureConstant[c] ReducedPlanckConstant[u, c]/ElectronMass[u, c]/SpeedOfLight[u, c]; +BohrMagneton[u_UnitSystem, c_Coupling] := ElementaryCharge[u, c] ReducedPlanckConstant[u, c] LorentzConstant[u]/2 ElectronMass[u, c]; diff --git a/Kernel/systems.wl b/Kernel/systems.wl new file mode 100644 index 0000000..45f388f --- /dev/null +++ b/Kernel/systems.wl @@ -0,0 +1,159 @@ + +(* This file is part of UnitSystems. It is licensed under the MIT license *) +(* UnitSystems Copyright (C) 2021 Michael Reed *) + +UnitData = <| +"g0" -> 980665/10^5, +"ft" -> 3048/10000, +"ftUS" -> 1200/3937, +"lb" -> 45359237/10^8, +"rankine" -> 5/9, +"\[CapitalDelta]\[Nu]Cs" -> 9192631770, +"Kcd" -> 683 555016/555000, +"mP" -> Around[2.176434/10^8, 24/10^14], +"NA" -> 602214076 10^15, +"kB" -> 1380649/10^29, +"h" -> 662607015/10^42, +"c" -> 299792458, +"e" -> 1602176634/10^28, +"\[Mu]eu" -> 1/Around[1822.888486209, 53/10^9], +"\[Mu]pu" -> Around[1.007276466621, 53/10^12], +"\[Alpha]" -> 1/Around[137.035999084, 21/10^9], +"R\[Infinity]" -> Around[10973731.5681601, 21/10^6], +"RK1990" -> 25812807/1000, +"RK2014" -> Around[25812.8074555, 59/10^7], +"KJ1990" -> 4835979 10^8, +"KJ2014" -> Around[4.835978525 10^14, 3 10^6], +"GMsun" -> Around[1.32712442099 10^20, 9 10^9], +"day" -> 60^2 24, +"au" -> 149597870700, +"fur" -> 201168/1000, +"H0" -> Around[67.66, 0.42], +"\[CapitalOmega]\[CapitalLambda]" -> Around[0.6889, 0.0056]|> + +AbstractUnitData = <||> +AppendTo[AbstractUnitData, "slug" -> "lb" "g0"/"ft"] +AppendTo[AbstractUnitData, "slugUS" -> "lb" "g0"/"ftUS"] +AppendTo[AbstractUnitData, "Ru" -> "NA" "kB"] +AppendTo[AbstractUnitData, "me" -> 2 "R\[Infinity]" "h"/"\[Alpha]"^2/"c"] +AppendTo[AbstractUnitData, "\[Mu]0" -> 2 "\[Alpha]" "h"/"c"/"e"^2] +AppendTo[AbstractUnitData, "\[HBar]" -> "h"/(2 Pi)] +AppendTo[AbstractUnitData, "\[Mu]pe" -> "\[Mu]pu"/"\[Mu]eu"] +AppendTo[AbstractUnitData, "\[Alpha]G" -> (AbstractUnitData["me"]/"mP")^2] +AppendTo[AbstractUnitData, "G" -> "c" AbstractUnitData["\[HBar]"]/"mP"^2] +AppendTo[AbstractUnitData, "Mu" -> "NA" AbstractUnitData["me"]/"\[Mu]eu"] +AppendTo[AbstractUnitData, "pc" -> "au" 3*60^3/Pi] +AppendTo[AbstractUnitData, "th" -> 1000 AbstractUnitData["pc"]/"H0"] +AppendTo[AbstractUnitData, "\[CapitalLambda]" -> 3 (1/AbstractUnitData["th"]/"c")^2 "\[CapitalOmega]\[CapitalLambda]"] +AppendTo[AbstractUnitData, "lc" -> PowerExpand[2 Sqrt[2 Pi/AbstractUnitData["\[CapitalLambda]"]]]] +AppendTo[AbstractUnitData, "mc" -> PowerExpand["c"^2/(2 Sqrt[2 Pi AbstractUnitData["\[CapitalLambda]"]] AbstractUnitData["G"])]] +AppendTo[AbstractUnitData, "\[Rho]\[CapitalLambda]" -> "c"^4 AbstractUnitData["\[CapitalLambda]"]/(8 Pi AbstractUnitData["G"])] +AppendTo[AbstractUnitData, "lcq" -> PowerExpand[("c" AbstractUnitData["\[HBar]"]/AbstractUnitData["\[Rho]\[CapitalLambda]"])^(1/4)]] +AppendTo[AbstractUnitData, "mcq" -> PowerExpand[(AbstractUnitData["\[HBar]"]^3 AbstractUnitData["\[Rho]\[CapitalLambda]"]/"c"^5)^(1/4)]] +AppendTo[AbstractUnitData, "ecq" -> PowerExpand[("c"^3 AbstractUnitData["\[HBar]"]^3 AbstractUnitData["\[Rho]\[CapitalLambda]"])^(1/4)]] +AppendTo[AbstractUnitData, "tcq" -> PowerExpand[AbstractUnitData["lcq"] Sqrt[AbstractUnitData["mcq"]/AbstractUnitData["ecq"]]]] + +EvalUnitData[x] := AbstractUnitData[x]/.Normal[UnitData] + +Coupling["AbstractCoupling"] = Coupling["\[Alpha]G", "\[Alpha]", "\[Mu]eu", "\[Mu]pu", "\[CapitalOmega]\[CapitalLambda]"] +Coupling["AbstractUniverse"] = Coupling[AbstractUnitData["\[Alpha]G"], "\[Alpha]", "\[Mu]eu", "\[Mu]pu", "\[CapitalOmega]\[CapitalLambda]"] +Coupling["StandardModel"] = Coupling["AbstractUniverse"] /. Normal[UnitData] + +AbstractUnitSystem = <| +"AbstractUnits" -> UnitSystem["kB","\[HBar]","c","\[Mu]0","me","\[Lambda]","\[Alpha]L"], +"AbstractUnits1" -> UnitSystem["kB1", "\[HBar]1", "c1", "\[Mu]01", "me1", "\[Lambda]1", "\[Alpha]L1"], +"AbstractUnits2" -> UnitSystem["kB2", "\[HBar]2", "c2", "\[Mu]02", "me2", "\[Lambda]2", "\[Alpha]L2"], +"SI2019" -> UnitSystem["kB", AbstractUnitData["\[HBar]"], "c", AbstractUnitData["\[Mu]0"], AbstractUnitData["me"]]|> + +DeriveMetric[ru_, perm_] := DeriveMetric[ru, perm, AbstractUnitData["\[HBar]"], AbstractUnitData["me"]]; +DeriveMetric[ru_, perm_, hbar_, mass_] := UnitSystem[ru mass/"\[Mu]eu", hbar, "c", perm, mass]; + +AppendTo[AbstractUnitSystem, { +"Metric" -> DeriveMetric[1000 AbstractUnitData["Ru"], 4 Pi/10^7], +"SI1976" -> DeriveMetric[831432/100, 4 Pi/10^7]}] + +DeriveCODATA[klitz_, joseph_] := DeriveCODATA[klitz, Nothing, 2/klitz/joseph^2/Pi] +DeriveCODATA[klitz_, _, hbar_] := DeriveCODATA[klitz, Nothing, hbar, 4 Pi "R\[Infinity]" hbar/"\[Alpha]"^2/"c"] +DeriveCODATA[klitz_, _, hbar_, mass_] := DeriveMetric[1000 AbstractUnitData["Ru"], 2 "\[Alpha]" klitz/"c", hbar, mass] + +AppendTo[AbstractUnitSystem, { +"CODATA" -> DeriveCODATA["RK2014", "KJ2014"], +"Conventional" -> DeriveCODATA["RK1990", "KJ1990"]}] + +DeriveGaussSystem[u_, perm_, ratio_] := DeriveGaussSystem[u, perm, ratio, 1] +DeriveGaussSystem[u_, perm_, ratio_, lorentz_] := DeriveGaussSystem[u, perm, ratio, lorentz, 1/100, 1/1000] +DeriveGaussSystem[u_, perm_, ratio_, lorentz_, length_, mass_] := + DeriveGaussSystem[u, perm, ratio, lorentz, length, mass, PowerExpand[mass length^2]] +DeriveGaussSystem[u_, perm_, ratio_, 1, length_, mass_, energy_] := + UnitSystem[BoltzmannConstant[u]/energy, ReducedPlanckConstant[u]/energy, SpeedOfLight[u]/length, perm, ElectronMass[u]/mass, ratio] +DeriveGaussSystem[u_, perm_, ratio_, lorentz_, length_, mass_, energy_] := + UnitSystem[BoltzmannConstant[u]/energy, ReducedPlanckConstant[u]/energy, SpeedOfLight[u]/length, perm, ElectronMass[u]/mass, ratio, lorentz] + +AppendTo[AbstractUnitSystem, { +"Gauss" -> DeriveGaussSystem["AbstractMetric", 1, 4 Pi, 1/100/"c"], +"LorentzHeaviside" -> DeriveGaussSystem["AbstractMetric", 1, 1, 1/100/"c"], +"Thomson" -> DeriveGaussSystem["AbstractMetric", 1, 4 Pi, 1/2], +"Kennelly" -> DeriveGaussSystem["AbstractMetric", 10^-7, 4 Pi, 1, 1, 1], +"ESU" -> DeriveGaussSystem["AbstractMetric", (100 "c")^-2, 4 Pi], +"EMU" -> DeriveGaussSystem["AbstractMetric", 1, 4 Pi]}] + +DeriveEnergySystem[u_, time_, length_, mass_] := DeriveTempSystem[u, time, length, mass, 1] +DeriveEnergySystem[u_, time_, length_, mass_, energy_] := + DeriveTempSystem[u, time, length, mass, 1, PowerExpand[MagneticConstant[u] time^2/energy], energy] +DeriveTempSystem[u_, time_, length_, mass_, temp_] := Module[{energy = PowerExpand[mass length^2/time^2]}, + DeriveTempSystem[u, time, length, mass, temp, PowerExpand[MagneticConstant[u] time^2/energy]]] +DeriveTempSystem[u_, time_, length_, mass_, temp_, perm_] := + DeriveTempSystem[u, time, length, mass, temp, perm, PowerExpand[mass length^2/time^2]] +DeriveTempSystem[u_, time_, length_, mass_, temp_, perm_, energy_] := + UnitSystem[BoltzmannConstant[u] temp/energy, ReducedPlanckConstant[u]/time/energy, time SpeedOfLight[u]/length, perm, ElectronMass[u]/mass] + +AppendTo[AbstractUnitSystem, { +"MTS" -> DeriveEnergySystem["AbstractMetric", 1, 1, 1000], +"EMU2019" -> DeriveEnergySystem["AbstractSI2019", 1, 1/100, 1/1000], +"ESU2019" -> DeriveTempSystem["AbstractSI2019", 1, 1/100, 1/1000, 1, 1000 AbstractUnitData["\[Mu]0"]/"c"^2], +"Mixed" -> DeriveTempSystem["AbstractMetric", 1, 1, 1, 1, AbstractUnitData["\[Mu]0"]], +"English" -> DeriveTempSystem["AbstractSI2019", 1, "ft", AbstractUnitData["slug"], "rankine", 4 Pi], +"EnglishUS" -> DeriveTempSystem["AbstractMetric", 1, "ftUS", AbstractUnitData["slugUS"], "rankine", 4 Pi], +"FFF" -> DeriveTempSystem["AbstractMetric", 14 "day", "fur", 90 "lb", "rankine", 0], +"IAU" -> DeriveEnergySystem["AbstractMetric", "day", "au", "GMsun"/AbstractUnitData["G"]], +"Hubble" -> DeriveEnergySystem["AbstractMetric", AbstractUnitData["th"], "c" AbstractUnitData["th"], 1], +"Cosmological" -> DeriveEnergySystem["AbstractMetric", AbstractUnitData["lc"]/"c", AbstractUnitData["lc"], AbstractUnitData["mc"]], +"CosmologicalQuantum" -> DeriveEnergySystem["AbstractMetric", AbstractUnitData["tcq"], AbstractUnitData["lcq"], AbstractUnitData["mcq"], AbstractUnitData["ecq"]]}] + +AppendTo[AbstractUnitSystem, { +"Planck" -> UnitSystem[1, 1, 1, 1, PowerExpand[Sqrt[4 Pi AbstractUnitData["\[Alpha]G"]]]], +"PlanckGauss" -> UnitSystem[1, 1, 1, 4 Pi, PowerExpand[Sqrt[AbstractUnitData["\[Alpha]G"]]]], +"Stoney" -> UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, PowerExpand[Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"]]], +"Hartree" -> UnitSystem[1,1,1/"\[Alpha]",4 Pi "\[Alpha]"^2,1], +"Rydberg" -> UnitSystem[1,1,2/"\[Alpha]",Pi "\[Alpha]"^2,1/2], +"Schrodinger" -> UnitSystem[1, 1, 1/"\[Alpha]", 4 Pi "\[Alpha]"^2, PowerExpand[Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"]]], +"Electronic" -> UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, 1], +"Natural" -> UnitSystem[1, 1, 1, 1, 1, 1, 1, "1"], +"NaturalGauss" -> UnitSystem[1, 1, 1, 4 Pi, 1, 1, 1, "1"], +"QCD" -> UnitSystem[1, 1, 1, 1, 1/AbstractUnitData["\[Mu]pe"]], +"QCDGauss" -> UnitSystem[1, 1, 1, 4 Pi, 1/AbstractUnitData["\[Mu]pe"]], +"QCDoriginal" -> UnitSystem[1, 1, 1, 4 Pi "\[Alpha]", 1/AbstractUnitData["\[Mu]pe"]]}] + +AppendTo[AbstractUnitSystem, { +"SI" :> AbstractUnitSystem["SI2019"], +"MKS" :> AbstractUnitSystem["Metric"], +"CGS" :> AbstractUnitSystem["Gauss"], +"CGS2019" :> AbstractUnitSystem["EMU2019"], +"CGSm" :> AbstractUnitSystem["EMU"], +"CGSe" :> AbstractUnitSystem["ESU"], +"HLU" :> AbstractUnitSystem["LorentzHeaviside"]}] + +UnitSystem["AbstractUnits"] := AbstractUnitSystem["AbstractUnits"] +UnitSystem["AbstractUnits1"] := AbstractUnitSystem["AbstractUnits1"] +UnitSystem["AbstractUnits2"] := AbstractUnitSystem["AbstractUnits2"] +UnitSystem["SI"] := UnitSystem["SI2019"] +UnitSystem["MKS"] := UnitSystem["Metric"] +UnitSystem["CGS"] := UnitSystem["Gauss"] +UnitSystem["CGS2019"] := UnitSystem["EMU2019"] +UnitSystem["CGSm"] := UnitSystem["EMU"] +UnitSystem["CGSe"] := UnitSystem["ESU"] +UnitSystem["HLU"] := UnitSystem["LorentzHeaviside"] +UnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1] +UnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1] +Map[(UnitSystem[#] = AbstractUnitSystem[#] /. Normal[UnitData]) &, +{"Gauss","LorentzHeaviside","Thomson","Kennelly","ESU","ESU2019","EMU","EMU2019","MTS","Mixed","Metric","SI1976","SI2019","CODATA","Conventional","English","EnglishUS","IAU","FFF","Planck","PlanckGauss","Stoney","Hartree","Rydberg","Schrodinger","Electronic","QCD","QCDGauss","QCDoriginal","Hubble","Cosmological","CosmologicalQuantum"}] From c677bfd038f1cd803fc95f43842d010990de5451 Mon Sep 17 00:00:00 2001 From: Michael Reed <18372368+chakravala@users.noreply.github.com> Date: Thu, 27 Jan 2022 17:45:53 -0500 Subject: [PATCH 09/11] improved UnitSystem derivation methods --- Kernel/UnitSystems.wl | 47 ++++++++++++--- Kernel/physics.wl | 5 +- Kernel/systems.wl | 135 ++++++++++++++++++++++++------------------ 3 files changed, 120 insertions(+), 67 deletions(-) diff --git a/Kernel/UnitSystems.wl b/Kernel/UnitSystems.wl index c27ec34..cd06b52 100644 --- a/Kernel/UnitSystems.wl +++ b/Kernel/UnitSystems.wl @@ -10,11 +10,11 @@ UnitSystemsList = {"Metric", "SI2019", "CODATA", "Conventional", "MTS", "English "Hartree", "Rydberg", "Schrodinger", "Electronic", "Natural", "NaturalGauss", "QCD", "QCDGauss", "QCDoriginal", "Hubble", "Cosmological", "CosmologicalQuantum"}; DimensionlessList = {GravitationalCouplingConstantElectronElectron, FineStructureConstant, ElectronRelativeAtomicMass, ProtonRelativeAtomicMass, ProtonElectronMassRatio, UniverseDarkEnergyMassDensity} -ConstantsList = {Cesium133HyperfineSplittingFrequency, HubbleParameter, SpeedOfLight, - PlanckConstant, ReducedPlanckConstant, ElectronMass, +ConstantsList = {SpeedOfLight, PlanckConstant, ReducedPlanckConstant, ElectronMass, MolarMassConstant, BoltzmannConstant, MagneticConstant, RationalizationConstant, LorentzConstant, MonochromaticRadiation540THzLuminousEfficacy}; -PhysicsList = {CosmologicalConstant, AtomicMassConstant, ProtonMass, PlanckMass, +PhysicsList = {Cesium133HyperfineSplittingFrequency, HubbleParameter, + CosmologicalConstant, AtomicMassConstant, ProtonMass, PlanckMass, GravitationalConstant, EinsteinConstantSpeedOfLightToTheFourth, HartreeEnergy, RydbergConstant, BohrRadius, RelativisticBohrRadius, ClassicalElectronRadius, @@ -83,10 +83,7 @@ Unit[x_, y_ : 1] := PowerExpand[x]; UnitSystem[u_String] := AbstractUnitSystem[StringDelete[u, "Abstract"]] /; StringStartsQ[u, "Abstract"] Coupling[c_String] := Universe[UnitSystem[c]] -UnitSystemQ[u_String] := UnitSystemQ[UnitSystem[u]] -UnitSystemQ[UnitSystem[_,__]] := True -UnitSystemQ[_] := False -AbstractUnitSystemQ[u_String] := UnitSystemQ[UnitSystem[u]] +AbstractUnitSystemQ[u_String] := StringStartsQ[u, "Abstract"] AbstractUnitSystemQ[u:UnitSystem[_,__]] := MemberQ[Values[AbstractUnitSystem],u] AbstractUnitSystemQ[_] := False MatchSystem[u_,s_] := If[AbstractUnitSystemQ[u], AbstractUnitSystem[s], UnitSystem[s]] @@ -116,10 +113,17 @@ OneQ[1] := True; OneQ[-1] := False; OneQ[True] := True OneQ[0] := False; OneQ[_] := False; OneQ[False] := False OneQ[x_?NumberQ] := x == 1 +CouplingSystem[u_String] := CouplingSystem[UnitSystem[u]] +CouplingSystem[UnitSystem[u_String]] := Coupling[u] +CouplingSystem[u_UnitSystem] := u + Map[(#[u_UnitSystem] := #[u, Universe[u]]) &, {PlanckMass, PlanckConstant, GravitationalConstant, ElementaryCharge}]; Map[(#[u_UnitSystem] := #[Universe[u]]) &, DimensionlessList]; Map[(#[u_UnitSystem, c_Coupling] := #[u]) &, {BoltzmannConstant, ReducedPlanckConstant, SpeedOfLight, MagneticConstant, ElectronMass, MolarMassConstant}]; -Map[(#[u_UnitSystem, s_UnitSystem] := Unit[#[s]/#[u]]) &, ConstantsList]; +Map[( + #[u_UnitSystem, s_UnitSystem] := Unit[#[s]/#[u]]; + #[u_String, s_String] := #[UnitSystem[u], CouplingSystem[s]]; +) &, Join[ConstantsList,PhysicsList]] Map[Unprotect, ProtectedList] Map[(If[!MemberQ[ProtectedList, #], #[v_, u_String] := #[v, UnitSystem[u]]; @@ -184,6 +188,33 @@ ConvertUnit[x_Symbol, a_, b_] := x[a, b] ConvertUnit[x_String, a_, b_] := ConvertUnit[convert[x], a, b] ConvertUnit[x_Symbol, v_, u_, s_] := x[v, u, s] ConvertUnit[x_String, v_, u_, s_] := ConvertUnit[convert[x], v, u, s] +ConvertUnit[Area, u_String] := Area[UnitSystem[u],DefaultSystem[u]] +ConvertUnit[Area, u_UnitSystem] := Area[u,DefaultSystem[u]] +ConvertUnit[Area, u_String, s_String] := Area[UnitSystem[u],UnitSystem[s]] +ConvertUnit[Area, v_, u_String] := Area[v, UnitSystem[u],DefaultSystem[u]] +ConvertUnit[Area, v_, u_String, s_String] := Area[v, UnitSystem[u],UnitSystem[s]] +ConvertUnit[Volume, u_String] := Volume[UnitSystem[u],DefaultSystem[u]] +ConvertUnit[Volume, u_UnitSystem] := Volume[u,DefaultSystem[u]] +ConvertUnit[Volume, u_String, s_String] := Volume[UnitSystem[u],UnitSystem[s]] +ConvertUnit[Volume, u_UnitSystem, s_UnitSystem] := Volume[u, s] +ConvertUnit[Volume, v_, u_UnitSystem] := Volume[v, u,DefaultSystem[u]] +ConvertUnit[Volume, v_, u_String] := Volume[v, UnitSystem[u],DefaultSystem[u]] +ConvertUnit[Volume, v_, u_String, s_String] := Volume[v, UnitSystem[u],UnitSystem[s]] +ConvertUnit[Entropy, u_String] := Entropy[UnitSystem[u],DefaultSystem[u]] +ConvertUnit[Entropy, u_UnitSystem] := Entropy[u,DefaultSystem[u]] +ConvertUnit[Entropy, u_String, s_String] := Entropy[UnitSystem[u], UnitSystem[s]] +ConvertUnit[Entropy, u_UnitSystem, s_UnitSystem] := Entropy[u, s] +ConvertUnit[Entropy, v_, u_String] := Entropy[v, UnitSystem[u], DefaultSystem[u]] +ConvertUnit[Entropy, v_, u_UnitSystem] := Entropy[v, UnitSystem[u], DefaultSystem[u]] +ConvertUnit[Entropy, v_, u_String, s_String] := Entropy[v, UnitSystem[u], UnitSystem[s]] + +CompareBase[a_, b_] := CompareUnits[a, b, ConstantsList] +CompareDerived[a_, b_] := CompareUnits[a, b, PhysicsList] +CompareConstants[a_, b_] := CompareUnits[a, b, Join[ConstantsList, PhysicsList]] +ComparePhysics[a_, b_] := CompareUnits[a, b, ConvertList] +CompareUnits[a_, b_] := CompareUnits[a, b, Join[ConstantsList, PhysicsList, ConvertList]] +CompareUnits[a_String, b_String, c_] := CompareUnits[UnitSystem[a], UnitSystem[b], c] +CompareUnits[a_, b_, c_] := Association[Map[ToString[#] -> #[a, b] &, c]] (* more *) diff --git a/Kernel/physics.wl b/Kernel/physics.wl index bc880e0..e750809 100644 --- a/Kernel/physics.wl +++ b/Kernel/physics.wl @@ -178,6 +178,7 @@ Inertance[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]^4]; Voltage = ElectricPotential +Permeability[u_UnitSystem, s_UnitSystem] := Unit[MagneticConstant[u, s]]; Charge[u_UnitSystem, s_UnitSystem] := Unit[Sqrt[(ReducedPlanckConstant[s] MagneticConstant[u] SpeedOfLight[ u] RationalizationConstant[u] LorentzConstant[u]^2)/(ReducedPlanckConstant[ @@ -225,7 +226,7 @@ MagneticPolarizability[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[ Magnetization[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[u, s]/Volume[u, s]]; SpecificMagnetization[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[s, u]/Mass[s, u]]; -DemagnetizingFactor[u_UnitSystem, s_UnitSystem] := Unit[Rationalization[u, s]]; +DemagnetizingFactor[u_UnitSystem, s_UnitSystem] := Unit[RationalizationConstant[u, s]]; (* Thermodynamic *) @@ -248,6 +249,7 @@ ThermalResistance[u_UnitSystem, s_UnitSystem] := ThermalConductance[s, u]; ThermalExpansion[u_UnitSystem, s_UnitSystem] := Temperature[s, u]; LapseRate[u_UnitSystem, s_UnitSystem] := Unit[Temperature[u, s]/Length[u, s]]; +MolarMass[u_UnitSystem, s_UnitSystem] := Unit[MolarMassConstant[u, s]]; Molality[u_UnitSystem, s_UnitSystem] := MolarMassConstant[s, u]; Mole[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Molality[u, s]]; Molarity[u_UnitSystem, s_UnitSystem] := Unit[Mole[u, s]/Volume[u, s]]; @@ -259,6 +261,7 @@ MolarSusceptibility[u_UnitSystem, s_UnitSystem] := Unit[SpecificSusceptibility[u Catalysis[u_UnitSystem, s_UnitSystem] := Unit[Mole[u, s]/Time[u, s]]; Specificity[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mole[u, s]/Time[u, s]]; +LuminousEfficacy[u_UnitSystem, s_UnitSystem] := Unit[MonochromaticRadiation540THzLuminousEfficacy[u, s]]; LuminousFlux[u_UnitSystem, s_UnitSystem] := Unit[Frequency[u, s]^2 (MonochromaticRadiation540THzLuminousEfficacy[s] ReducedPlanckConstant[s])/(MonochromaticRadiation540THzLuminousEfficacy[u] ReducedPlanckConstant[u])]; Luminance[u_UnitSystem, s_UnitSystem] := Unit[LuminousFlux[u, s]/Area[u, s]]; LuminousEnergy[u_UnitSystem, s_UnitSystem] := Unit[Frequency[u, s] (MonochromaticRadiation540THzLuminousEfficacy[s] ReducedPlanckConstant[s])/(MonochromaticRadiation540THzLuminousEfficacy[u] ReducedPlanckConstant[u])]; diff --git a/Kernel/systems.wl b/Kernel/systems.wl index 45f388f..8b31dec 100644 --- a/Kernel/systems.wl +++ b/Kernel/systems.wl @@ -59,68 +59,89 @@ Coupling["AbstractCoupling"] = Coupling["\[Alpha]G", "\[Alpha]", "\[Mu]eu", "\[M Coupling["AbstractUniverse"] = Coupling[AbstractUnitData["\[Alpha]G"], "\[Alpha]", "\[Mu]eu", "\[Mu]pu", "\[CapitalOmega]\[CapitalLambda]"] Coupling["StandardModel"] = Coupling["AbstractUniverse"] /. Normal[UnitData] -AbstractUnitSystem = <| -"AbstractUnits" -> UnitSystem["kB","\[HBar]","c","\[Mu]0","me","\[Lambda]","\[Alpha]L"], -"AbstractUnits1" -> UnitSystem["kB1", "\[HBar]1", "c1", "\[Mu]01", "me1", "\[Lambda]1", "\[Alpha]L1"], -"AbstractUnits2" -> UnitSystem["kB2", "\[HBar]2", "c2", "\[Mu]02", "me2", "\[Lambda]2", "\[Alpha]L2"], -"SI2019" -> UnitSystem["kB", AbstractUnitData["\[HBar]"], "c", AbstractUnitData["\[Mu]0"], AbstractUnitData["me"]]|> - -DeriveMetric[ru_, perm_] := DeriveMetric[ru, perm, AbstractUnitData["\[HBar]"], AbstractUnitData["me"]]; -DeriveMetric[ru_, perm_, hbar_, mass_] := UnitSystem[ru mass/"\[Mu]eu", hbar, "c", perm, mass]; - -AppendTo[AbstractUnitSystem, { -"Metric" -> DeriveMetric[1000 AbstractUnitData["Ru"], 4 Pi/10^7], -"SI1976" -> DeriveMetric[831432/100, 4 Pi/10^7]}] - -DeriveCODATA[klitz_, joseph_] := DeriveCODATA[klitz, Nothing, 2/klitz/joseph^2/Pi] -DeriveCODATA[klitz_, _, hbar_] := DeriveCODATA[klitz, Nothing, hbar, 4 Pi "R\[Infinity]" hbar/"\[Alpha]"^2/"c"] -DeriveCODATA[klitz_, _, hbar_, mass_] := DeriveMetric[1000 AbstractUnitData["Ru"], 2 "\[Alpha]" klitz/"c", hbar, mass] - -AppendTo[AbstractUnitSystem, { -"CODATA" -> DeriveCODATA["RK2014", "KJ2014"], -"Conventional" -> DeriveCODATA["RK1990", "KJ1990"]}] - -DeriveGaussSystem[u_, perm_, ratio_] := DeriveGaussSystem[u, perm, ratio, 1] -DeriveGaussSystem[u_, perm_, ratio_, lorentz_] := DeriveGaussSystem[u, perm, ratio, lorentz, 1/100, 1/1000] -DeriveGaussSystem[u_, perm_, ratio_, lorentz_, length_, mass_] := - DeriveGaussSystem[u, perm, ratio, lorentz, length, mass, PowerExpand[mass length^2]] -DeriveGaussSystem[u_, perm_, ratio_, 1, length_, mass_, energy_] := +MetricSystem[mu_, perm_] := MetricSystem[mu, perm, AbstractUnitData["Ru"]]; +MetricSystem[mu_, perm_, ru_] := MetricSystem[mu, perm, ru, AbstractUnitData["\[HBar]"], AbstractUnitData["me"]]; +MetricSystem[mu_, perm_, ru_, hbar_, mass_] := UnitSystem[ru mass/mu/"\[Mu]eu", hbar, "c", perm, mass]; + +MetricSystem["SI2019"] := MetricSystem[AbstractUnitData["Mu"], AbstractUnitData["\[Mu]0"]] +MetricSystem["Metric"] := MetricSystem[1/1000, 4 Pi/10^7] +MetricSystem["SI1976"] := MetricSystem[1/1000, 4 Pi/10^7, 831432/10^5] + +ConventionalSystem[klitz_, joseph_] := ConventionalSystem[klitz, Nothing, 2/klitz/joseph^2/Pi] +ConventionalSystem[klitz_, _, hbar_] := ConventionalSystem[klitz, Nothing, hbar, 4 Pi "R\[Infinity]" hbar/"\[Alpha]"^2/"c"] +ConventionalSystem[klitz_, _, hbar_, mass_] := MetricSystem[1/1000, 2 "\[Alpha]" klitz/"c", AbstractUnitData["Ru"], hbar, mass] + +ConventionalSystem["CODATA"] := ConventionalSystem["RK2014", "KJ2014"] +ConventionalSystem["Conventional"] := ConventionalSystem["RK1990", "KJ1990"] + +GaussSystem[u_String] := ($Failed /; False) +GaussSystem[perm_, u__] := GaussSystem["AbstractMetric", perm, u] +GaussSystem[u_String, perm_, ratio_] := GaussSystem[u, perm, ratio, 1] +GaussSystem[u_String, perm_, ratio_, lorentz_] := GaussSystem[u, perm, ratio, lorentz, 1/100, 1/1000] +GaussSystem[u_String, perm_, ratio_, lorentz_, length_, mass_] := + GaussSystem[u, perm, ratio, lorentz, length, mass, PowerExpand[mass length^2]] +GaussSystem[u_String, perm_, ratio_, 1, length_, mass_, energy_] := UnitSystem[BoltzmannConstant[u]/energy, ReducedPlanckConstant[u]/energy, SpeedOfLight[u]/length, perm, ElectronMass[u]/mass, ratio] -DeriveGaussSystem[u_, perm_, ratio_, lorentz_, length_, mass_, energy_] := +GaussSystem[u_String, perm_, ratio_, lorentz_, length_, mass_, energy_] := UnitSystem[BoltzmannConstant[u]/energy, ReducedPlanckConstant[u]/energy, SpeedOfLight[u]/length, perm, ElectronMass[u]/mass, ratio, lorentz] -AppendTo[AbstractUnitSystem, { -"Gauss" -> DeriveGaussSystem["AbstractMetric", 1, 4 Pi, 1/100/"c"], -"LorentzHeaviside" -> DeriveGaussSystem["AbstractMetric", 1, 1, 1/100/"c"], -"Thomson" -> DeriveGaussSystem["AbstractMetric", 1, 4 Pi, 1/2], -"Kennelly" -> DeriveGaussSystem["AbstractMetric", 10^-7, 4 Pi, 1, 1, 1], -"ESU" -> DeriveGaussSystem["AbstractMetric", (100 "c")^-2, 4 Pi], -"EMU" -> DeriveGaussSystem["AbstractMetric", 1, 4 Pi]}] - -DeriveEnergySystem[u_, time_, length_, mass_] := DeriveTempSystem[u, time, length, mass, 1] -DeriveEnergySystem[u_, time_, length_, mass_, energy_] := - DeriveTempSystem[u, time, length, mass, 1, PowerExpand[MagneticConstant[u] time^2/energy], energy] -DeriveTempSystem[u_, time_, length_, mass_, temp_] := Module[{energy = PowerExpand[mass length^2/time^2]}, - DeriveTempSystem[u, time, length, mass, temp, PowerExpand[MagneticConstant[u] time^2/energy]]] -DeriveTempSystem[u_, time_, length_, mass_, temp_, perm_] := - DeriveTempSystem[u, time, length, mass, temp, perm, PowerExpand[mass length^2/time^2]] -DeriveTempSystem[u_, time_, length_, mass_, temp_, perm_, energy_] := +GaussSystem["Gauss"] := GaussSystem[1, 4 Pi, 1/100/"c"] +GaussSystem["LorentzHeaviside"] := GaussSystem[1, 1, 1/100/"c"] +GaussSystem["Thomson"] := GaussSystem[1, 4 Pi, 1/2] +GaussSystem["Kennelly"] := GaussSystem[10^-7, 4 Pi, 1, 1, 1] +GaussSystem["ESU"] := GaussSystem[(100 "c")^-2, 4 Pi] +GaussSystem["EMU"] := GaussSystem[1, 4 Pi] + +EnergySystem[u_, time_, length_, mass_] := EntropySystem[u, time, length, mass, 1] +EnergySystem[u_, time_, length_, mass_, energy_] := + EntropySystem[u, time, length, mass, 1, PowerExpand[MagneticConstant[u] time^2/energy], energy] +EntropySystem[u_, time_, length_, mass_, temp_] := Module[{energy = PowerExpand[mass length^2/time^2]}, + EntropySystem[u, time, length, mass, temp, PowerExpand[MagneticConstant[u] time^2/energy]]] +EntropySystem[u_, time_, length_, mass_, temp_, perm_] := + EntropySystem[u, time, length, mass, temp, perm, PowerExpand[mass length^2/time^2]] +EntropySystem[u_, time_, length_, mass_, temp_, perm_, energy_] := UnitSystem[BoltzmannConstant[u] temp/energy, ReducedPlanckConstant[u]/time/energy, time SpeedOfLight[u]/length, perm, ElectronMass[u]/mass] -AppendTo[AbstractUnitSystem, { -"MTS" -> DeriveEnergySystem["AbstractMetric", 1, 1, 1000], -"EMU2019" -> DeriveEnergySystem["AbstractSI2019", 1, 1/100, 1/1000], -"ESU2019" -> DeriveTempSystem["AbstractSI2019", 1, 1/100, 1/1000, 1, 1000 AbstractUnitData["\[Mu]0"]/"c"^2], -"Mixed" -> DeriveTempSystem["AbstractMetric", 1, 1, 1, 1, AbstractUnitData["\[Mu]0"]], -"English" -> DeriveTempSystem["AbstractSI2019", 1, "ft", AbstractUnitData["slug"], "rankine", 4 Pi], -"EnglishUS" -> DeriveTempSystem["AbstractMetric", 1, "ftUS", AbstractUnitData["slugUS"], "rankine", 4 Pi], -"FFF" -> DeriveTempSystem["AbstractMetric", 14 "day", "fur", 90 "lb", "rankine", 0], -"IAU" -> DeriveEnergySystem["AbstractMetric", "day", "au", "GMsun"/AbstractUnitData["G"]], -"Hubble" -> DeriveEnergySystem["AbstractMetric", AbstractUnitData["th"], "c" AbstractUnitData["th"], 1], -"Cosmological" -> DeriveEnergySystem["AbstractMetric", AbstractUnitData["lc"]/"c", AbstractUnitData["lc"], AbstractUnitData["mc"]], -"CosmologicalQuantum" -> DeriveEnergySystem["AbstractMetric", AbstractUnitData["tcq"], AbstractUnitData["lcq"], AbstractUnitData["mcq"], AbstractUnitData["ecq"]]}] +EnergySystem["MTS"] := EnergySystem["AbstractMetric", 1, 1, 1000] +EnergySystem["IAU"] := EnergySystem["AbstractMetric", "day", "au", "GMsun"/AbstractUnitData["G"]] +EnergySystem["Hubble"] := EnergySystem["AbstractMetric", AbstractUnitData["th"], "c" AbstractUnitData["th"], 1] +EnergySystem["Cosmological"] := EnergySystem["AbstractMetric", AbstractUnitData["lc"]/"c", AbstractUnitData["lc"], AbstractUnitData["mc"]] +EnergySystem["CosmologicalQuantum"] := EnergySystem["AbstractMetric", AbstractUnitData["tcq"], AbstractUnitData["lcq"], AbstractUnitData["mcq"], AbstractUnitData["ecq"]] +EnergySystem["EMU2019"] := EnergySystem["AbstractSI2019", 1, 1/100, 1/1000] +EntropySystem["ESU2019"] := EntropySystem["AbstractSI2019", 1, 1/100, 1/1000, 1, 1000 AbstractUnitData["\[Mu]0"]/"c"^2] +EntropySystem["Mixed"] := EntropySystem["AbstractMetric", 1, 1, 1, 1, AbstractUnitData["\[Mu]0"]] +EntropySystem["English"] := EntropySystem["AbstractSI2019", 1, "ft", AbstractUnitData["slug"], "rankine", 4 Pi] +EntropySystem["EnglishUS"] := EntropySystem["AbstractMetric", 1, "ftUS", AbstractUnitData["slugUS"], "rankine", 4 Pi] +EntropySystem["FFF"] := EntropySystem["AbstractMetric", 14 "day", "fur", 90 "lb", "rankine", 0] + +AbstractUnitSystem = <| +"AbstractUnits" -> UnitSystem["kB","\[HBar]","c","\[Mu]0","me","\[Lambda]","\[Alpha]L"], +"AbstractUnits1" -> UnitSystem["kB1", "\[HBar]1", "c1", "\[Mu]01", "me1", "\[Lambda]1", "\[Alpha]L1"], +"AbstractUnits2" -> UnitSystem["kB2", "\[HBar]2", "c2", "\[Mu]02", "me2", "\[Lambda]2", "\[Alpha]L2"], +"SI2019" -> MetricSystem["SI2019"], +"Metric" -> MetricSystem["Metric"], +"SI1976" -> MetricSystem["SI1976"], +"CODATA" -> ConventionalSystem["CODATA"], +"Conventional" -> ConventionalSystem["Conventional"]|> AppendTo[AbstractUnitSystem, { +"Gauss" -> GaussSystem["Gauss"], +"LorentzHeaviside" -> GaussSystem["LorentzHeaviside"], +"Thomson" -> GaussSystem["Thomson"], +"Kennelly" -> GaussSystem["Kennelly"], +"ESU" -> GaussSystem["ESU"], +"EMU" -> GaussSystem["EMU"], +"MTS" -> EnergySystem["MTS"], +"IAU" -> EnergySystem["IAU"], +"Hubble" -> EnergySystem["Hubble"], +"Cosmological" -> EnergySystem["Cosmological"], +"CosmologicalQuantum" -> EnergySystem["CosmologicalQuantum"], +"EMU2019" -> EnergySystem["EMU2019"], +"ESU2019" -> EntropySystem["ESU2019"], +"Mixed" -> EntropySystem["Mixed"], +"English" -> EntropySystem["English"], +"EnglishUS" -> EntropySystem["EnglishUS"], +"FFF" -> EntropySystem["FFF"], "Planck" -> UnitSystem[1, 1, 1, 1, PowerExpand[Sqrt[4 Pi AbstractUnitData["\[Alpha]G"]]]], "PlanckGauss" -> UnitSystem[1, 1, 1, 4 Pi, PowerExpand[Sqrt[AbstractUnitData["\[Alpha]G"]]]], "Stoney" -> UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, PowerExpand[Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"]]], @@ -132,9 +153,7 @@ AppendTo[AbstractUnitSystem, { "NaturalGauss" -> UnitSystem[1, 1, 1, 4 Pi, 1, 1, 1, "1"], "QCD" -> UnitSystem[1, 1, 1, 1, 1/AbstractUnitData["\[Mu]pe"]], "QCDGauss" -> UnitSystem[1, 1, 1, 4 Pi, 1/AbstractUnitData["\[Mu]pe"]], -"QCDoriginal" -> UnitSystem[1, 1, 1, 4 Pi "\[Alpha]", 1/AbstractUnitData["\[Mu]pe"]]}] - -AppendTo[AbstractUnitSystem, { +"QCDoriginal" -> UnitSystem[1, 1, 1, 4 Pi "\[Alpha]", 1/AbstractUnitData["\[Mu]pe"]], "SI" :> AbstractUnitSystem["SI2019"], "MKS" :> AbstractUnitSystem["Metric"], "CGS" :> AbstractUnitSystem["Gauss"], From 300f1d3c4d6af84e62134f1b1dd1dacc3d118db6 Mon Sep 17 00:00:00 2001 From: Michael Reed <18372368+chakravala@users.noreply.github.com> Date: Fri, 28 Jan 2022 10:11:55 -0500 Subject: [PATCH 10/11] implemented International System of Quantities --- Kernel/UnitSystems.wl | 123 +++++++++++++++++++------------------ Kernel/physics.wl | 139 +++++++++++++++++++++--------------------- Kernel/systems.wl | 25 +++++--- 3 files changed, 149 insertions(+), 138 deletions(-) diff --git a/Kernel/UnitSystems.wl b/Kernel/UnitSystems.wl index cd06b52..98ac6eb 100644 --- a/Kernel/UnitSystems.wl +++ b/Kernel/UnitSystems.wl @@ -3,7 +3,7 @@ (* UnitSystems Copyright (C) 2021 Michael Reed *) Unprotect[UnitSystem]; -ProtectedList = {Length, Area, Volume, Power, Entropy}; +ProtectedList = {Length, Area, Volume, Power, Entropy, MomentOfInertia}; UnitSystemsList = {"Metric", "SI2019", "CODATA", "Conventional", "MTS", "English", "EnglishUS", "FFF", "IAU", "SI1976", "Mixed", "ESU2019", "EMU2019", "EMU", "ESU", "Gauss", "LorentzHeaviside", "Thomson", "Kennelly", "Planck", "PlanckGauss", "Stoney", @@ -23,36 +23,36 @@ PhysicsList = {Cesium133HyperfineSplittingFrequency, HubbleParameter, BiotSavartConstant, ElementaryCharge, FaradayConstant, VacuumImpedance, ConductanceQuantum, VonKlitzingConstant, JosephsonConstant, MagneticFluxQuantum, BohrMagneton}; -KinematicList = {Time, Length, Area, Volume, WaveNumber, - FuelEfficiency, Frequency, FrequencyDrift, Speed, Acceleration, - Jerk, Snap, VolumeFlow}; -MechanicalList = {Mass, MassFlow, LinearDensity, AreaDensity, Density, - SpecificVolume, Force, Stiffness, Pressure, Compressibility, - Viscosity, Diffusivity, RotationalInertia, Momentum, - AngularMomentum, Yank, Energy, SpecificEnergy, Action, Fluence, - Power, PowerDensity, Intensity, SpectralFlux, SoundExposure, - Impedance, SpecificImpedance, Admittance, Compliance, Inertance}; -ElectromagneticList = {Charge, ChargeDensity, LinearChargeDensity, - Exposure, Mobility, Capacitance, Inductance, Reluctance, Permeance, - Permittivity, Permeability, Susceptibility, Current, Conductance, - SpecificSusceptibility, DemagnetizingFactor, VectorPotential, - ElectricPotential, MagneticPotential, ElectricField, MagneticField, - ElectricFlux, MagneticFlux, ElectricFluxDensity, - MagneticFluxDensity, ElectricDipoleMoment, MagneticDipoleMoment, - ElectricPolarizability, MagneticPolarizability, MagneticMoment, - Magnetizability, Magnetization, SpecificMagnetization, Rigidity, - PoleStrength}; -ThermodynamicList = {Temperature, Entropy, SpecificEntropy, - VolumeHeatCapacity, ThermalConductivity, ThermalConductance, - ThermalResistance, ThermalExpansion, LapseRate}; -MolarList = {MolarMass, Molality, Mole, Molarity, MolarVolume, - MolarEntropy, MolarEnergy, MolarConductivity, MolarSusceptibility, +KinematicList = {Time, Length, Area, Volume, Wavenumber, + FuelEconomy, Frequency, FrequencyDrift, Speed, Acceleration, + Jerk, Snap, VolumeFlowRate}; +MechanicalList = {Mass, MassFlowRate, LinearMassDensity, MassPerArea, MassDensity, + SpecificVolume, Force, Stiffness, Pressure, Compressibility, + DynamicViscosity, KinematicViscosity, MomentOfInertia, Momentum, + AngularMomentum, ForceOnsetRate, Energy, SpecificEnergy, Action, EnergyPerArea, + Power, PowerDensity, Irradiance, PowerGradient, SoundExposure, + AcousticImpedance, SpecificAcousticImpedance, Admittance, Compliance, Inertance}; +ElectromagneticList = {ElectricCharge, ElectricChargeDensity, LinearElectricChargeDensity, + ElectricChargePerMass, ElectricalMobility, ElectricCapacitance, MagneticInductance, MagneticReluctance, MagneticPermeance, + ElectricPermittivity, MagneticPermeability, MagneticSusceptibility, ElectricCurrent, ElectricConductance, + SpecificSusceptibility, DemagnetizationFactor, MagneticVectorPotential, + ElectricPotential, MagnetomotiveForce, ElectricFieldStrength, MagneticFieldStrength, + ElectricFlux, MagneticFlux, ElectricFluxDensity, + MagneticFluxDensity, ElectricDipoleMoment, MagneticDipoleMoment, + ElectricPolarizability, MagneticPolarizability, MagneticMoment, + Magnetizability, Magnetization, SpecificMagnetization, MagneticRigidity, + MagneticPoleStrength}; +ThermodynamicList = {Temperature, Entropy, SpecificEntropy, + EntropyPerVolume, ThermalConductivity, ThermalConductance, + ThermalResistance, ThermalExpansion, TemperatureGradient}; +MolarList = {MolarMass, Molality, Amount, AmountConcentration, MolarVolume, + MolarEntropy, MolarEnergy, MolarConductivity, MolarMagneticSusceptibility, Catalysis, Specificity}; -PhotometricList = {LuminousFlux, Luminance, LuminousEnergy, - LuminousExposure, LuminousEfficacy}; +PhotometricList = {LuminousFlux, Luminance, LuminousEnergy, + LuminousExposure, LuminousEfficacyOfRadiation}; MechanicsList = Join[KinematicList, MechanicalList]; -ConvertList = - Join[MechanicsList, ElectromagneticList, ThermodynamicList, +ConvertList = + Join[MechanicsList, ElectromagneticList, ThermodynamicList, MolarList, PhotometricList]; measure[x_] := x; @@ -63,6 +63,7 @@ ProtonRelativeAtomicMass[Coupling[_, _, _, \[Mu]pu_, ___]] := measure[\[Mu]pu]; UniverseDarkEnergyMassDensity[Coupling[_, _, _, _, OL_, ___]] := measure[OL]; ProtonElectronMassRatio[c_Coupling] := ProtonRelativeAtomicMass[c]/ElectronRelativeAtomicMass[c]; +UnitSystem[u_UnitSystem] := u BoltzmannConstant[UnitSystem[kB_, ___]] := kB; ReducedPlanckConstant[UnitSystem[_, \[HBar]_, ___]] := \[HBar]; SpeedOfLight[UnitSystem[_, _, c_, ___]] := c; @@ -98,12 +99,6 @@ Map[(#[c_String] := #[Coupling[c]]) &, DimensionlessList] Get["UnitSystems`systems`"] -EntityUnregister["UnitSystem"] -CreateEntity[u_String] := u -> <| - "Abstract" :> AbstractUnitSystem[u], "Value" :> UnitSystem[u]|> -EntityRegister[EntityStore["UnitSystem" -> <| - "Entities" -> Association[Map[CreateEntity, UnitSystemsList]]|>]] - Universe[_] = Coupling["AbstractUniverse"] Universe[c_String] := Coupling[c] Map[(Universe[AbstractUnitSystem[#]] := Coupling["AbstractUniverse"]) &, @@ -178,6 +173,7 @@ Unprotect[Entity] Entity["UnitSystem", u_][Entity["PhysicalConstant", x_]] := UnitConstant[x, u] Entity["PhysicalConstant", x_][Entity["UnitSystem", u_]] := UnitConstant[x, u] Entity["PhysicalConstant", x_][Entity["UnitSystem", u_], c_] := UnitConstant[x, u, c] +Entity["UnitSystem", u_][Entity["UnitSystem", s_]] := ComparePhysics[AbstractUnitSystem[u], AbstractUnitSystem[s]] Protect[Entity] convert = Association[Map[Rule[ToString[#],#] &, ConvertList]] @@ -188,44 +184,51 @@ ConvertUnit[x_Symbol, a_, b_] := x[a, b] ConvertUnit[x_String, a_, b_] := ConvertUnit[convert[x], a, b] ConvertUnit[x_Symbol, v_, u_, s_] := x[v, u, s] ConvertUnit[x_String, v_, u_, s_] := ConvertUnit[convert[x], v, u, s] -ConvertUnit[Area, u_String] := Area[UnitSystem[u],DefaultSystem[u]] -ConvertUnit[Area, u_UnitSystem] := Area[u,DefaultSystem[u]] +ConvertUnit[Area, u_] := Area[UnitSystem[u],DefaultSystem[u]] ConvertUnit[Area, u_String, s_String] := Area[UnitSystem[u],UnitSystem[s]] +ConvertUnit[Area, u_UnitSystem, s_UnitSystem] := Area[u ,s] ConvertUnit[Area, v_, u_String] := Area[v, UnitSystem[u],DefaultSystem[u]] ConvertUnit[Area, v_, u_String, s_String] := Area[v, UnitSystem[u],UnitSystem[s]] -ConvertUnit[Volume, u_String] := Volume[UnitSystem[u],DefaultSystem[u]] -ConvertUnit[Volume, u_UnitSystem] := Volume[u,DefaultSystem[u]] +ConvertUnit[Volume, u_] := Volume[UnitSystem[u],DefaultSystem[u]] ConvertUnit[Volume, u_String, s_String] := Volume[UnitSystem[u],UnitSystem[s]] ConvertUnit[Volume, u_UnitSystem, s_UnitSystem] := Volume[u, s] -ConvertUnit[Volume, v_, u_UnitSystem] := Volume[v, u,DefaultSystem[u]] -ConvertUnit[Volume, v_, u_String] := Volume[v, UnitSystem[u],DefaultSystem[u]] +ConvertUnit[Volume, v_, u_] := Volume[v, UnitSystem[u],DefaultSystem[u]] ConvertUnit[Volume, v_, u_String, s_String] := Volume[v, UnitSystem[u],UnitSystem[s]] -ConvertUnit[Entropy, u_String] := Entropy[UnitSystem[u],DefaultSystem[u]] -ConvertUnit[Entropy, u_UnitSystem] := Entropy[u,DefaultSystem[u]] +ConvertUnit[Entropy, u_] := Entropy[UnitSystem[u],DefaultSystem[u]] ConvertUnit[Entropy, u_String, s_String] := Entropy[UnitSystem[u], UnitSystem[s]] ConvertUnit[Entropy, u_UnitSystem, s_UnitSystem] := Entropy[u, s] -ConvertUnit[Entropy, v_, u_String] := Entropy[v, UnitSystem[u], DefaultSystem[u]] -ConvertUnit[Entropy, v_, u_UnitSystem] := Entropy[v, UnitSystem[u], DefaultSystem[u]] +ConvertUnit[Entropy, v_, u_] := Entropy[v, UnitSystem[u], DefaultSystem[u]] ConvertUnit[Entropy, v_, u_String, s_String] := Entropy[v, UnitSystem[u], UnitSystem[s]] +ConvertUnit[MomentOfInertia, u_] := MomentOfInertia[UnitSystem[u],DefaultSystem[u]] +ConvertUnit[MomentOfInertia, u_String, s_String] := MomentOfInertia[UnitSystem[u],UnitSystem[s]] +ConvertUnit[MomentOfInertia, u_UnitSystem, s_UnitSystem] := MomentOfInertia[u ,s] +ConvertUnit[MomentOfInertia, v_, u_String] := MomentOfInertia[v, UnitSystem[u],DefaultSystem[u]] +ConvertUnit[MomentOfInertia, v_, u_String, s_String] := MomentOfInertia[v, UnitSystem[u],UnitSystem[s]] CompareBase[a_, b_] := CompareUnits[a, b, ConstantsList] CompareDerived[a_, b_] := CompareUnits[a, b, PhysicsList] CompareConstants[a_, b_] := CompareUnits[a, b, Join[ConstantsList, PhysicsList]] ComparePhysics[a_, b_] := CompareUnits[a, b, ConvertList] CompareUnits[a_, b_] := CompareUnits[a, b, Join[ConstantsList, PhysicsList, ConvertList]] +CompareUnits[a_String, b_, c_] := CompareUnits[UnitSystem[a], b, c] +CompareUnits[a_, b_String, c_] := CompareUnits[a, UnitSystem[b], c] CompareUnits[a_String, b_String, c_] := CompareUnits[UnitSystem[a], UnitSystem[b], c] CompareUnits[a_, b_, c_] := Association[Map[ToString[#] -> #[a, b] &, c]] -(* more *) +DerivedConstants[u_] := DerivedConstants[u, Join[ConstantsList, PhysicsList]] +DerivedConstants[u_, l_] := Association[Map[ToString[#] -> #[u] &, l]] +DerivedConstants[u_String, l_] := If[AbstractUnitSystemQ[u], DerivedConstants[UnitSystem[u],l], Association@Normal[DerivedConstants[StringJoin["Abstract",u],l]/.Normal[UnitData]]] -{"Density" -> "MassDensity", -"Conductance" -> "ElectricConductance", -"ChargeDensity" -> "ElectricChargeDensity", -"Current" -> "ElectricCurrent", -"ElectricField" -> "ElectricFieldStrength", -"Permittivity" -> "ElectricPermittivity", -"MagneticDipoleMoment" -> "MagneticMoment", -"Speed" -> "Velocity"} +EntityUnregister["UnitSystem"] +CreateEntity[u_String] := u -> <| + "Abstract" :> AbstractUnitSystem[u], + "Value" :> UnitSystem[u], + "Derived" :> DerivedConstants[AbstractUnitSystem[u]], + "Constants" :> DerivedConstants[u]|> +EntityRegister[EntityStore["UnitSystem" -> <| + "Entities" -> Association[Map[CreateEntity, UnitSystemsList]]|>]] + +(* more *) DerivedUnits = <| "NaturalUnitOfEnergy" -> Energy["AbstractNatural"], @@ -235,15 +238,15 @@ DerivedUnits = <| "PlanckArea" -> Area[UnitSystem["AbstractPlanckGauss"]], "PlanckFrequency" -> Frequency["AbstractPlanckGauss"], "PlanckLength" -> Length["AbstractPlanckGauss"], -"PlanckMassDensity" -> Density["AbstractPlanckGauss"], +"PlanckMassDensity" -> MassDensity["AbstractPlanckGauss"], "PlanckTemperature" -> Temperature["AbstractPlanckGauss"], "PlanckTime" -> Time["AbstractPlanckGauss"], "PlanckVolume" -> Volume[UnitSystem["AbstractPlanckGauss"]], -"AtomicUnitOfElectricConductance" -> Conductance["AbstractHartree"], -"AtomicUnitOfElectricChargeDensity" -> ChargeDensity["AbstractHartree"], -"AtomicUnitOfElectricCurrent" -> Current["AbstractHartree"], -"AtomicUnitOfElectricFieldStrength" -> ElectricField["AbstractHartree"], -"AtomicUnitOfElectricPermittivity" -> Permittivity["AbstractHartree"], +"AtomicUnitOfElectricConductance" -> ElectricConductance["AbstractHartree"], +"AtomicUnitOfElectricElectricChargeDensity" -> ElectricChargeDensity["AbstractHartree"], +"AtomicUnitOfElectricElectricCurrent" -> ElectricCurrent["AbstractHartree"], +"AtomicUnitOfElectricFieldStrengthStrength" -> ElectricFieldStrength["AbstractHartree"], +"AtomicUnitOfElectricElectricPermittivity" -> ElectricPermittivity["AbstractHartree"], "AtomicUnitOfElectricPolarizability" -> ElectricPolarizability["AbstractHartree"], "AtomicUnitOfElectricPotential" -> ElectricPotential["AbstractHartree"], "AtomicUnitOfForce" -> Force["AbstractHartree"], diff --git a/Kernel/physics.wl b/Kernel/physics.wl index e750809..eb40107 100644 --- a/Kernel/physics.wl +++ b/Kernel/physics.wl @@ -9,7 +9,7 @@ PlanckConstant[u_UnitSystem, c_Coupling] := 2 Pi ReducedPlanckConstant[u]; GravitationalConstant[u_UnitSystem, c_Coupling] := PowerExpand[(SpeedOfLight[u, c] ReducedPlanckConstant[u, c])/PlanckMass[u, c]^2] ElementaryCharge[u_UnitSystem, c_Coupling] := PowerExpand[Sqrt[2 PlanckConstant[u]/(MagneticConstant[u]/FineStructureConstant[u])/(SpeedOfLight[u] RationalizationConstant[u] LorentzConstant[u]^2)]] -ElectronMass[UnitSystem["Planck"], c_Coupling] := PowerExpand[Sqrt[4 Pi GravityCoupling[c]]] +ElectronMass[UnitSystem["Planck"], c_Coupling] := PowerExpand[Sqrt[4 Pi GravitationalCouplingConstantElectronElectron[c]]] ElectronMass[UnitSystem["PlanckGauss"], c_Coupling] := Sqrt[GravitationalCouplingConstantElectronElectron[c]]; ElectronMass[UnitSystem[_, _, _, _, Sqrt[EvalUnitData["\[Alpha]G"]/UnitData["\[Alpha]"]], ___], c_Coupling] := PowerExpand[Sqrt[GravitationalCouplingConstantElectronElectron[c]/FineStructureConstant[c]]] ElectronMass[UnitSystem[_, _, _, _, 1/UnitData["\[Mu]pe"], ___], c_Coupling] := 1/ProtonElectronMassRatio[c]; @@ -33,6 +33,8 @@ MagneticConstant[UnitSystem["CODATA"], u_Coupling] := 2 UnitData["RK2014"] FineS MagneticConstant[UnitSystem["Conventional"], u_Coupling] := 2 UnitData["RK1990"] FineStructureConstant[u]/UnitData["c"]; MolarMassConstant[UnitSystem[1, ___]] = 1; +MolarMassConstant[UnitSystem["DimensionalUnits"]] = "M"/"N"; +MolarMassConstant[UnitSystem["DimensionalUnits"], c_Coupling] = "M"/"N"; MolarMassConstant[u:UnitSystem[UnitData["kB"], ___]] := MolarMassConstant[u, Universe[u]]; MolarMassConstant[u:UnitSystem[UnitData["kB"], ___], c_Coupling] := UnitData["NA"] ElectronMass[u, c]/ElectronRelativeAtomicMass[c]; MolarMassConstant[u:UnitSystem[10^7 UnitData["kB"], ___]] := MolarMassConstant[u, Universe[u]]; @@ -46,7 +48,7 @@ MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["FFF"]], ___]] := Mola MolarMassConstant[u:UnitSystem[BoltzmannConstant[UnitSystem["English"]], ___]] := MolarMassConstant[u, Universe[u]]; MolarMassConstant[u:UnitSystem[BoltzmannConstant[UnitSystem["English"]], ___], c_Coupling] := 1000 MolarMassConstant[UnitSystem["SI2019"],c] MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["EnglishUS"]], ___]] := MolarMassConstant["Natural"]; -MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["IAU"]], ___]] = EvalUnitData["ms"]/1000; +MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["IAU"]], ___]] := Mass["IAU"]/1000; MolarMassConstant[AbstractUnitSystem["AbstractUnits"]] = "Mu" MolarMassConstant[AbstractUnitSystem["AbstractUnits1"]] = "Mu1" @@ -63,9 +65,10 @@ MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["FFF"]], ___]] MolarMassConstant[u : UnitSystem[BoltzmannConstant[AbstractUnitSystem["English"]], ___]] := MolarMassConstant[u, Universe[u]]; MolarMassConstant[u : UnitSystem[BoltzmannConstant[AbstractUnitSystem["English"]], ___], c_Coupling] := 1000 MolarMassConstant[AbstractUnitSystem["SI2019"], c]; MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["EnglishUS"]], ___]] := MolarMassConstant["Natural"]; -MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["IAU"]], ___]] := 1/1000 AbstractUnitData["ms"]; +MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["IAU"]], ___]] := 1/1000 Mass["AbstractIAU"]; MonochromaticRadiation540THzLuminousEfficacy[UnitSystem[1, ___]] = 1 +MonochromaticRadiation540THzLuminousEfficacy[UnitSystem["DimensionalUnits"]] = "J" "T"^3/"M"/"L"^2 MonochromaticRadiation540THzLuminousEfficacy[u : UnitSystem[_?NumericQ, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] MonochromaticRadiation540THzLuminousEfficacy[u : UnitSystem[_Around, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] MonochromaticRadiation540THzLuminousEfficacy[AbstractUnitSystem["AbstractUnits1"]] = "Kcd1" @@ -129,8 +132,8 @@ UnitSystem /: Length[u_UnitSystem, s_UnitSystem, l_] := UnitSystem /: Area[u_UnitSystem, s_UnitSystem] := Unit[Length[u, s]^2]; UnitSystem /: Volume[u_UnitSystem, s_UnitSystem] := Unit[Length[u, s]^3]; -WaveNumber[u_UnitSystem, s_UnitSystem] := Unit[Length[s, u]]; -FuelEfficiency[u_UnitSystem, s_UnitSystem] := Area[s, u]; +Wavenumber[u_UnitSystem, s_UnitSystem] := Unit[Length[s, u]]; +FuelEconomy[u_UnitSystem, s_UnitSystem] := Area[s, u]; Time[u_UnitSystem, s_UnitSystem] := Time[u, s, 1]; Time[u_UnitSystem, s_UnitSystem, t_] := Unit[Length[u, s]/SpeedOfLight[u, s], 1]; Frequency[u_UnitSystem, s_UnitSystem] := Time[s, u]; @@ -139,7 +142,7 @@ Speed[u_UnitSystem, s_UnitSystem] := SpeedOfLight[u, s]; Acceleration[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]]; Jerk[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]^2]; Snap[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]/Time[u, s]^3]; -VolumeFlow[u_UnitSystem, s_UnitSystem] := Unit[Area[u, s], Speed[u, s]]; +VolumeFlowRate[u_UnitSystem, s_UnitSystem] := Unit[Area[u, s], Speed[u, s]]; SpecificEnergy[u_UnitSystem, s_UnitSystem] := Unit[Speed[u, s]^2]; Mass[u_UnitSystem, s_UnitSystem] := ElectronMass[u, s]; @@ -150,83 +153,81 @@ Pressure[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]/Time[u, s]^ Momentum[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Speed[u, s]]; AngularMomentum[u_UnitSystem, s_UnitSystem] := Unit[Momentum[u, s] Length[u, s]]; -Yank[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Jerk[u, s]]; -AreaDensity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Area[u, s]]; -Density[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Volume[u, s]]; +ForceOnsetRate[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Jerk[u, s]]; +MassPerArea[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Area[u, s]]; +MassDensity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Volume[u, s]]; SpecificVolume[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mass[u, s]]; Action[u_UnitSystem, s_UnitSystem] := Unit[Momentum[u, s] Length[u, s]]; Stiffness[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Area[u, s]]; -Intensity[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Area[u, s]]; -Diffusivity[u_UnitSystem, s_UnitSystem] := Unit[(ReducedPlanckConstant[s] ElectronMass[u])/(ReducedPlanckConstant[u] ElectronMass[s])]; -Viscosity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]/Time[u, s]]; -LinearDensity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]]; -MassFlow[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Time[u, s]]; -SpectralFlux[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Length[u, s]]; +Irradiance[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Area[u, s]]; +KinematicViscosity[u_UnitSystem, s_UnitSystem] := Unit[(ReducedPlanckConstant[s] ElectronMass[u])/(ReducedPlanckConstant[u] ElectronMass[s])]; +DynamicViscosity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]/Time[u, s]]; +LinearMassDensity[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]]; +MassFlowRate[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Time[u, s]]; +PowerGradient[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Length[u, s]]; PowerDensity[u_UnitSystem, s_UnitSystem] := Unit[Power[u, s]/Volume[u, s]]; Compressibility[u_UnitSystem, s_UnitSystem] := Pressure[s, u]; -Fluence[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Area[u, s]]; -RotationalInertia[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Area[u, s]]; +EnergyPerArea[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Area[u, s]]; +UnitSystem /: MomentOfInertia[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Area[u, s]]; SoundExposure[u_UnitSystem, s_UnitSystem] := Unit[Time[u, s] Pressure[u, s]^2]; -SpecificImpedance[u_UnitSystem, s_UnitSystem] := Unit[Pressure[u, s]/Speed[u, s]]; -Impedance[u_UnitSystem, s_UnitSystem] := Unit[SpecificImpedance[u, s]/Area[u, s]]; -Admittance[u_UnitSystem, s_UnitSystem] := Unit[Area[u, s]/SpecificImpedance[u, s]]; +SpecificAcousticImpedance[u_UnitSystem, s_UnitSystem] := Unit[Pressure[u, s]/Speed[u, s]]; +AcousticImpedance[u_UnitSystem, s_UnitSystem] := Unit[SpecificAcousticImpedance[u, s]/Area[u, s]]; +Admittance[u_UnitSystem, s_UnitSystem] := Unit[Area[u, s]/SpecificAcousticImpedance[u, s]]; Compliance[u_UnitSystem, s_UnitSystem] := Unit[Time[u, s]^2/Mass[u, s]]; Inertance[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s]/Length[u, s]^4]; (* Electromagnetic *) -Voltage = ElectricPotential - -Permeability[u_UnitSystem, s_UnitSystem] := Unit[MagneticConstant[u, s]]; -Charge[u_UnitSystem, s_UnitSystem] := +MagneticPermeability[u_UnitSystem, s_UnitSystem] := Unit[MagneticConstant[u, s]]; +ElectricCharge[u_UnitSystem, s_UnitSystem] := Unit[Sqrt[(ReducedPlanckConstant[s] MagneticConstant[u] SpeedOfLight[ u] RationalizationConstant[u] LorentzConstant[u]^2)/(ReducedPlanckConstant[ u] MagneticConstant[s] SpeedOfLight[s] RationalizationConstant[s] LorentzConstant[s]^2)]]; -Current[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Time[u, s]]; -ElectricPotential[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Charge[u, s]]; -Capacitance[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/ElectricPotential[u, s]]; -Resistance[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s]/Current[u, s]]; -Conductance[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s]/ElectricPotential[u, s]]; -MagneticFlux[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/LorentzConstant[u, s]/Current[u, s]]; +ElectricCurrent[u_UnitSystem, s_UnitSystem] := Unit[ElectricCharge[u, s]/Time[u, s]]; +ElectricPotential[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/ElectricCharge[u, s]]; +ElectricCapacitance[u_UnitSystem, s_UnitSystem] := Unit[ElectricCharge[u, s]/ElectricPotential[u, s]]; +Resistance[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s]/ElectricCurrent[u, s]]; +ElectricConductance[u_UnitSystem, s_UnitSystem] := Unit[ElectricCurrent[u, s]/ElectricPotential[u, s]]; +MagneticFlux[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/LorentzConstant[u, s]/ElectricCurrent[u, s]]; MagneticFluxDensity[u_UnitSystem, s_UnitSystem] := - Unit[Mass[u, s]/LorentzConstant[u, s]/Current[u, s]/Time[u, s]^2]; -Inductance[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Area[u, s]/Charge[u, s]^2]; + Unit[Mass[u, s]/LorentzConstant[u, s]/ElectricCurrent[u, s]/Time[u, s]^2]; +MagneticInductance[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Area[u, s]/ElectricCharge[u, s]^2]; -ElectricFluxDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] RationalizationConstant[u, s]/Area[u, s]]; -ChargeDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Volume[u, s]]; -CurrentDensity[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s]/Area[u, s]]; -Conductivity[u_UnitSystem, s_UnitSystem] := Unit[Conductance[u, s]/Length[u, s]]; -Permittivity[u_UnitSystem, s_UnitSystem] := Unit[Capacitance[u, s] RationalizationConstant[u, s]/Length[u, s]]; -ElectricField[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s]/Length[u, s]]; -MagneticField[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s] RationalizationConstant[u, s] LorentzConstant[u, s]/Length[u, s]]; -Exposure[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Mass[u, s]]; +ElectricFluxDensity[u_UnitSystem, s_UnitSystem] := Unit[ElectricCharge[u, s] RationalizationConstant[u, s]/Area[u, s]]; +ElectricChargeDensity[u_UnitSystem, s_UnitSystem] := Unit[ElectricCharge[u, s]/Volume[u, s]]; +ElectricCurrentDensity[u_UnitSystem, s_UnitSystem] := Unit[ElectricCurrent[u, s]/Area[u, s]]; +Conductivity[u_UnitSystem, s_UnitSystem] := Unit[ElectricConductance[u, s]/Length[u, s]]; +ElectricPermittivity[u_UnitSystem, s_UnitSystem] := Unit[ElectricCapacitance[u, s] RationalizationConstant[u, s]/Length[u, s]]; +ElectricFieldStrength[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s]/Length[u, s]]; +MagneticFieldStrength[u_UnitSystem, s_UnitSystem] := Unit[ElectricCurrent[u, s] RationalizationConstant[u, s] LorentzConstant[u, s]/Length[u, s]]; +ElectricChargePerMass[u_UnitSystem, s_UnitSystem] := Unit[ElectricCharge[u, s]/Mass[u, s]]; Resistivity[u_UnitSystem, s_UnitSystem] := Unit[Resistance[u, s] Length[u, s]]; -LinearChargeDensity[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s]/Length[u, s]]; -MagneticDipoleMoment[u_UnitSystem, s_UnitSystem] := Unit[Current[u, s] LorentzConstant[u, s] Area[u, s]]; -Mobility[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] Time[u, s]/Mass[u, s]]; -Reluctance[u_UnitSystem, s_UnitSystem] := Unit[RationalizationConstant[u, s] LorentzConstant[u, s]^2/Inductance[u, s]]; -VectorPotential[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s]/Length[u, s]]; +LinearElectricChargeDensity[u_UnitSystem, s_UnitSystem] := Unit[ElectricCharge[u, s]/Length[u, s]]; +MagneticDipoleMoment[u_UnitSystem, s_UnitSystem] := Unit[ElectricCurrent[u, s] LorentzConstant[u, s] Area[u, s]]; +ElectricalMobility[u_UnitSystem, s_UnitSystem] := Unit[ElectricCharge[u, s] Time[u, s]/Mass[u, s]]; +MagneticReluctance[u_UnitSystem, s_UnitSystem] := Unit[RationalizationConstant[u, s] LorentzConstant[u, s]^2/MagneticInductance[u, s]]; +MagneticVectorPotential[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s]/Length[u, s]]; MagneticMoment[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s] Length[u, s]]; -Rigidity[u_UnitSystem, s_UnitSystem] := Unit[MagneticFluxDensity[u, s] Length[u, s]]; -Susceptibility[u_UnitSystem, s_UnitSystem] := Unit[RationalizationConstant[s, u]]; +MagneticRigidity[u_UnitSystem, s_UnitSystem] := Unit[MagneticFluxDensity[u, s] Length[u, s]]; +MagneticSusceptibility[u_UnitSystem, s_UnitSystem] := Unit[RationalizationConstant[s, u]]; (* WARNING unchecked: rigitidy, magneticmoment, vectorpotential, \ mobility, linearchargedensity, exposure *) ElectricFlux[u_UnitSystem, s_UnitSystem] := Unit[ElectricPotential[u, s] Length[u, s]]; -ElectricDipoleMoment[u_UnitSystem, s_UnitSystem] := Unit[Charge[u, s] Length[u, s]]; -MagneticPotential[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s] Reluctance[u, s]]; -PoleStrength[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/Length[u, s]]; -Permeance[u_UnitSystem, s_UnitSystem] := Reluctance[s, u]; -SpecificSusceptibility[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/MagneticField[u, s]/Mass[u, s]]; +ElectricDipoleMoment[u_UnitSystem, s_UnitSystem] := Unit[ElectricCharge[u, s] Length[u, s]]; +MagnetomotiveForce[u_UnitSystem, s_UnitSystem] := Unit[MagneticFlux[u, s] MagneticReluctance[u, s]]; +MagneticPoleStrength[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/Length[u, s]]; +MagneticPermeance[u_UnitSystem, s_UnitSystem] := MagneticReluctance[s, u]; +SpecificSusceptibility[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/MagneticFieldStrength[u, s]/Mass[u, s]]; Magnetizability[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[u, s]/MagneticFluxDensity[u, s]]; -ElectricPolarizability[u_UnitSystem, s_UnitSystem] := Unit[ElectricDipoleMoment[u, s]/ElectricField[u, s]]; -MagneticPolarizability[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/MagneticField[u, s]]; +ElectricPolarizability[u_UnitSystem, s_UnitSystem] := Unit[ElectricDipoleMoment[u, s]/ElectricFieldStrength[u, s]]; +MagneticPolarizability[u_UnitSystem, s_UnitSystem] := Unit[MagneticDipoleMoment[u, s]/MagneticFieldStrength[u, s]]; Magnetization[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[u, s]/Volume[u, s]]; SpecificMagnetization[u_UnitSystem, s_UnitSystem] := Unit[MagneticMoment[s, u]/Mass[s, u]]; -DemagnetizingFactor[u_UnitSystem, s_UnitSystem] := Unit[RationalizationConstant[u, s]]; +DemagnetizationFactor[u_UnitSystem, s_UnitSystem] := Unit[RationalizationConstant[u, s]]; (* Thermodynamic *) @@ -242,26 +243,26 @@ Temperature[u_UnitSystem, s_UnitSystem] := s] ElectronMass[u] SpeedOfLight[u]^2)]; UnitSystem /: Entropy[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Temperature[u, s]]; SpecificEntropy[u_UnitSystem, s_UnitSystem] := Unit[SpecificEnergy[u, s]/Temperature[u, s]]; -VolumeHeatCapacity[u_UnitSystem, s_UnitSystem] := Unit[Entropy[u, s]/Volume[u, s]]; +EntropyPerVolume[u_UnitSystem, s_UnitSystem] := Unit[Entropy[u, s]/Volume[u, s]]; ThermalConductivity[u_UnitSystem, s_UnitSystem] := Unit[Force[u, s]/Time[u, s]/Temperature[u, s]]; ThermalConductance[u_UnitSystem, s_UnitSystem] := Unit[ThermalConductivity[u, s] Length[u, s]]; ThermalResistance[u_UnitSystem, s_UnitSystem] := ThermalConductance[s, u]; ThermalExpansion[u_UnitSystem, s_UnitSystem] := Temperature[s, u]; -LapseRate[u_UnitSystem, s_UnitSystem] := Unit[Temperature[u, s]/Length[u, s]]; +TemperatureGradient[u_UnitSystem, s_UnitSystem] := Unit[Temperature[u, s]/Length[u, s]]; MolarMass[u_UnitSystem, s_UnitSystem] := Unit[MolarMassConstant[u, s]]; Molality[u_UnitSystem, s_UnitSystem] := MolarMassConstant[s, u]; -Mole[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Molality[u, s]]; -Molarity[u_UnitSystem, s_UnitSystem] := Unit[Mole[u, s]/Volume[u, s]]; -MolarVolume[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mole[u, s]]; -MolarEntropy[u_UnitSystem, s_UnitSystem] := Unit[Entropy[u, s]/Mole[u, s]]; -MolarEnergy[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Mole[u, s]]; -MolarConductivity[u_UnitSystem, s_UnitSystem] := Unit[Conductivity[u, s] Area[u, s]/Mole[u, s]]; -MolarSusceptibility[u_UnitSystem, s_UnitSystem] := Unit[SpecificSusceptibility[u, s] MolarMass[u, s]]; -Catalysis[u_UnitSystem, s_UnitSystem] := Unit[Mole[u, s]/Time[u, s]]; -Specificity[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Mole[u, s]/Time[u, s]]; +Amount[u_UnitSystem, s_UnitSystem] := Unit[Mass[u, s] Molality[u, s]]; +AmountConcentration[u_UnitSystem, s_UnitSystem] := Unit[Amount[u, s]/Volume[u, s]]; +MolarVolume[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Amount[u, s]]; +MolarEntropy[u_UnitSystem, s_UnitSystem] := Unit[Entropy[u, s]/Amount[u, s]]; +MolarEnergy[u_UnitSystem, s_UnitSystem] := Unit[Energy[u, s]/Amount[u, s]]; +MolarConductivity[u_UnitSystem, s_UnitSystem] := Unit[Conductivity[u, s] Area[u, s]/Amount[u, s]]; +MolarMagneticSusceptibility[u_UnitSystem, s_UnitSystem] := Unit[SpecificSusceptibility[u, s] MolarMass[u, s]]; +Catalysis[u_UnitSystem, s_UnitSystem] := Unit[Amount[u, s]/Time[u, s]]; +Specificity[u_UnitSystem, s_UnitSystem] := Unit[Volume[u, s]/Amount[u, s]/Time[u, s]]; -LuminousEfficacy[u_UnitSystem, s_UnitSystem] := Unit[MonochromaticRadiation540THzLuminousEfficacy[u, s]]; +LuminousEfficacyOfRadiation[u_UnitSystem, s_UnitSystem] := Unit[MonochromaticRadiation540THzLuminousEfficacy[u, s]]; LuminousFlux[u_UnitSystem, s_UnitSystem] := Unit[Frequency[u, s]^2 (MonochromaticRadiation540THzLuminousEfficacy[s] ReducedPlanckConstant[s])/(MonochromaticRadiation540THzLuminousEfficacy[u] ReducedPlanckConstant[u])]; Luminance[u_UnitSystem, s_UnitSystem] := Unit[LuminousFlux[u, s]/Area[u, s]]; LuminousEnergy[u_UnitSystem, s_UnitSystem] := Unit[Frequency[u, s] (MonochromaticRadiation540THzLuminousEfficacy[s] ReducedPlanckConstant[s])/(MonochromaticRadiation540THzLuminousEfficacy[u] ReducedPlanckConstant[u])]; @@ -269,7 +270,9 @@ LuminousExposure[u_UnitSystem, s_UnitSystem] := Unit[Luminance[u, s] Time[u, s]] (* Physics *) -Cesium133HyperfineSplittingFrequency[u_UnitSystem] := Frequency[UnitData["\[CapitalDelta]\[Nu]Cs"], u]; +Cesium133HyperfineSplittingFrequency[u : UnitSystem[_?NumberQ, ___]] := Frequency[If[AbstractUnitSystemQ[u], "\[CapitalDelta]\[Nu]Cs", UnitData["\[CapitalDelta]\[Nu]Cs"]], u]; +Cesium133HyperfineSplittingFrequency[u : UnitSystem[_Around, ___]] := Frequency[UnitData["\[CapitalDelta]\[Nu]Cs"], u]; +Cesium133HyperfineSplittingFrequency[u_UnitSystem] := Frequency["\[CapitalDelta]\[Nu]Cs", u]; HubbleParameter[u_UnitSystem] := Time[u, MatchSystem[u,"Hubble"]] Map[(#[u_UnitSystem] := #[u, Universe[u]]) &, {CosmologicalConstant, AvogadroConstant, AtomicMassConstant, ProtonMass, EinsteinConstantSpeedOfLightToTheFourth, MolarGasConstant, StefanBoltzmannConstant, RadiationConstant, ElectricConstant, CoulombConstant, BiotSavartConstant, VacuumImpedance, FaradayConstant, JosephsonConstant, MagneticFluxQuantum, VonKlitzingConstant, ConductanceQuantum, HartreeEnergy, RydbergConstant, BohrRadius, RelativisticBohrRadius, ClassicalElectronRadius, BohrMagneton}]; diff --git a/Kernel/systems.wl b/Kernel/systems.wl index 8b31dec..3746c9d 100644 --- a/Kernel/systems.wl +++ b/Kernel/systems.wl @@ -31,18 +31,19 @@ UnitData = <| "H0" -> Around[67.66, 0.42], "\[CapitalOmega]\[CapitalLambda]" -> Around[0.6889, 0.0056]|> -AbstractUnitData = <||> -AppendTo[AbstractUnitData, "slug" -> "lb" "g0"/"ft"] -AppendTo[AbstractUnitData, "slugUS" -> "lb" "g0"/"ftUS"] -AppendTo[AbstractUnitData, "Ru" -> "NA" "kB"] -AppendTo[AbstractUnitData, "me" -> 2 "R\[Infinity]" "h"/"\[Alpha]"^2/"c"] -AppendTo[AbstractUnitData, "\[Mu]0" -> 2 "\[Alpha]" "h"/"c"/"e"^2] -AppendTo[AbstractUnitData, "\[HBar]" -> "h"/(2 Pi)] -AppendTo[AbstractUnitData, "\[Mu]pe" -> "\[Mu]pu"/"\[Mu]eu"] +AbstractUnitData = <| +"slug" -> "lb" "g0"/"ft", +"slugUS" -> "lb" "g0"/"ftUS", +"Ru" -> "NA" "kB", +"me" -> 2 "R\[Infinity]" "h"/"\[Alpha]"^2/"c", +"\[Mu]0" -> 2 "\[Alpha]" "h"/"c"/"e"^2, +"\[HBar]" -> "h"/(2 Pi), +"\[Mu]pe" -> "\[Mu]pu"/"\[Mu]eu", +"pc" -> "au" 3*60^3/Pi|> + AppendTo[AbstractUnitData, "\[Alpha]G" -> (AbstractUnitData["me"]/"mP")^2] AppendTo[AbstractUnitData, "G" -> "c" AbstractUnitData["\[HBar]"]/"mP"^2] AppendTo[AbstractUnitData, "Mu" -> "NA" AbstractUnitData["me"]/"\[Mu]eu"] -AppendTo[AbstractUnitData, "pc" -> "au" 3*60^3/Pi] AppendTo[AbstractUnitData, "th" -> 1000 AbstractUnitData["pc"]/"H0"] AppendTo[AbstractUnitData, "\[CapitalLambda]" -> 3 (1/AbstractUnitData["th"]/"c")^2 "\[CapitalOmega]\[CapitalLambda]"] AppendTo[AbstractUnitData, "lc" -> PowerExpand[2 Sqrt[2 Pi/AbstractUnitData["\[CapitalLambda]"]]]] @@ -118,6 +119,7 @@ AbstractUnitSystem = <| "AbstractUnits" -> UnitSystem["kB","\[HBar]","c","\[Mu]0","me","\[Lambda]","\[Alpha]L"], "AbstractUnits1" -> UnitSystem["kB1", "\[HBar]1", "c1", "\[Mu]01", "me1", "\[Lambda]1", "\[Alpha]L1"], "AbstractUnits2" -> UnitSystem["kB2", "\[HBar]2", "c2", "\[Mu]02", "me2", "\[Lambda]2", "\[Alpha]L2"], +"DimensionalUnits" -> UnitSystem["M" "L"^2/"T"^2/"\[CapitalTheta]", "M" "L"^2/"T", "L"/"T", "M" "L"/"T"^2/"I"^2, "M"], "SI2019" -> MetricSystem["SI2019"], "Metric" -> MetricSystem["Metric"], "SI1976" -> MetricSystem["SI1976"], @@ -160,11 +162,13 @@ AppendTo[AbstractUnitSystem, { "CGS2019" :> AbstractUnitSystem["EMU2019"], "CGSm" :> AbstractUnitSystem["EMU"], "CGSe" :> AbstractUnitSystem["ESU"], -"HLU" :> AbstractUnitSystem["LorentzHeaviside"]}] +"HLU" :> AbstractUnitSystem["LorentzHeaviside"], +"ISQ" :> AbstractUnitSystem["DimensionalUnits"]}] UnitSystem["AbstractUnits"] := AbstractUnitSystem["AbstractUnits"] UnitSystem["AbstractUnits1"] := AbstractUnitSystem["AbstractUnits1"] UnitSystem["AbstractUnits2"] := AbstractUnitSystem["AbstractUnits2"] +UnitSystem["DimensionalUnits"] := AbstractUnitSystem["DimensionalUnits"] UnitSystem["SI"] := UnitSystem["SI2019"] UnitSystem["MKS"] := UnitSystem["Metric"] UnitSystem["CGS"] := UnitSystem["Gauss"] @@ -172,6 +176,7 @@ UnitSystem["CGS2019"] := UnitSystem["EMU2019"] UnitSystem["CGSm"] := UnitSystem["EMU"] UnitSystem["CGSe"] := UnitSystem["ESU"] UnitSystem["HLU"] := UnitSystem["LorentzHeaviside"] +UnitSystem["ISQ"] := UnitSystem["DimensionalUnits"] UnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1] UnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1] Map[(UnitSystem[#] = AbstractUnitSystem[#] /. Normal[UnitData]) &, From ef659aa0795c4f4a09cc73b6ff33b33a19f3578a Mon Sep 17 00:00:00 2001 From: Michael Reed <18372368+chakravala@users.noreply.github.com> Date: Tue, 1 Feb 2022 15:17:53 -0500 Subject: [PATCH 11/11] generalized dimensional unit analysis --- Kernel/UnitSystems.wl | 14 ++++-- Kernel/physics.wl | 12 +++-- Kernel/systems.wl | 114 +++++++++++++++++++++++------------------- 3 files changed, 81 insertions(+), 59 deletions(-) diff --git a/Kernel/UnitSystems.wl b/Kernel/UnitSystems.wl index 98ac6eb..b96377e 100644 --- a/Kernel/UnitSystems.wl +++ b/Kernel/UnitSystems.wl @@ -81,7 +81,7 @@ Universe[UnitSystem[_?NumericQ, ___]] := Coupling["StandardModel"] Universe[UnitSystem[_Around, ___]] := Coupling["StandardModel"] Unit[x_, y_ : 1] := PowerExpand[x]; -UnitSystem[u_String] := AbstractUnitSystem[StringDelete[u, "Abstract"]] /; StringStartsQ[u, "Abstract"] +UnitSystem[u_String] := If[AbstractUnitSystemQ[u], AbstractUnitSystem[StringDelete[u, "Abstract"]], DimensionSystem[StringDelete[u, "Dimension"]]] /; AbstractUnitSystemQ[u] || StringStartsQ[u, "Dimension"] Coupling[c_String] := Universe[UnitSystem[c]] AbstractUnitSystemQ[u_String] := StringStartsQ[u, "Abstract"] @@ -214,6 +214,12 @@ CompareUnits[a_String, b_, c_] := CompareUnits[UnitSystem[a], b, c] CompareUnits[a_, b_String, c_] := CompareUnits[a, UnitSystem[b], c] CompareUnits[a_String, b_String, c_] := CompareUnits[UnitSystem[a], UnitSystem[b], c] CompareUnits[a_, b_, c_] := Association[Map[ToString[#] -> #[a, b] &, c]] +DimensionUnits[u_, l_] := CompareUnits["AbstractNatural",DimensionSystem[u], l] +DimensionUnits[u_] := DimensionUnits[u, Join[ConstantsList, PhysicsList, ConvertList]] +DimensionPhysics[u_] := DimensionUnits[u, ConvertList] +DimensionConstants[u_] := DimensionUnits[u, Join[ConstantsList, PhysicsList]] +DimensionDerived[u_] := DimensionUnits[u, PhysicsList] +DimensionBase[u_] := DimensionUnits[u, ConstantsList] DerivedConstants[u_] := DerivedConstants[u, Join[ConstantsList, PhysicsList]] DerivedConstants[u_, l_] := Association[Map[ToString[#] -> #[u] &, l]] @@ -222,9 +228,11 @@ DerivedConstants[u_String, l_] := If[AbstractUnitSystemQ[u], DerivedConstants[Un EntityUnregister["UnitSystem"] CreateEntity[u_String] := u -> <| "Abstract" :> AbstractUnitSystem[u], + "Dimensions" :> DimensionSystem[u], "Value" :> UnitSystem[u], - "Derived" :> DerivedConstants[AbstractUnitSystem[u]], - "Constants" :> DerivedConstants[u]|> + "Formulas" :> DerivedConstants[AbstractUnitSystem[u]], + "Constants" :> DerivedConstants[u], + "Quantities" :> DimensionPhysics[u]|> EntityRegister[EntityStore["UnitSystem" -> <| "Entities" -> Association[Map[CreateEntity, UnitSystemsList]]|>]] diff --git a/Kernel/physics.wl b/Kernel/physics.wl index eb40107..0a78643 100644 --- a/Kernel/physics.wl +++ b/Kernel/physics.wl @@ -33,8 +33,8 @@ MagneticConstant[UnitSystem["CODATA"], u_Coupling] := 2 UnitData["RK2014"] FineS MagneticConstant[UnitSystem["Conventional"], u_Coupling] := 2 UnitData["RK1990"] FineStructureConstant[u]/UnitData["c"]; MolarMassConstant[UnitSystem[1, ___]] = 1; -MolarMassConstant[UnitSystem["DimensionalUnits"]] = "M"/"N"; -MolarMassConstant[UnitSystem["DimensionalUnits"], c_Coupling] = "M"/"N"; +MolarMassConstant[_?DimensionSystemQ] = "M"/"N"; +MolarMassConstant[_?DimensionSystemQ, c_Coupling] = "M"/"N"; MolarMassConstant[u:UnitSystem[UnitData["kB"], ___]] := MolarMassConstant[u, Universe[u]]; MolarMassConstant[u:UnitSystem[UnitData["kB"], ___], c_Coupling] := UnitData["NA"] ElectronMass[u, c]/ElectronRelativeAtomicMass[c]; MolarMassConstant[u:UnitSystem[10^7 UnitData["kB"], ___]] := MolarMassConstant[u, Universe[u]]; @@ -50,6 +50,10 @@ MolarMassConstant[u:UnitSystem[BoltzmannConstant[UnitSystem["English"]], ___], c MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["EnglishUS"]], ___]] := MolarMassConstant["Natural"]; MolarMassConstant[UnitSystem[BoltzmannConstant[UnitSystem["IAU"]], ___]] := Mass["IAU"]/1000; +MolarMassConstant[DimensionSystem["EMU"]] := MolarMassConstant["Natural"]; +MolarMassConstant[DimensionSystem["ESU"]] := MolarMassConstant["Natural"]; +MolarMassConstant[DimensionSystem["Gauss"]] := MolarMassConstant["Natural"]; + MolarMassConstant[AbstractUnitSystem["AbstractUnits"]] = "Mu" MolarMassConstant[AbstractUnitSystem["AbstractUnits1"]] = "Mu1" MolarMassConstant[AbstractUnitSystem["AbstractUnits2"]] = "Mu2" @@ -68,7 +72,7 @@ MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["EnglishUS"]], MolarMassConstant[UnitSystem[BoltzmannConstant[AbstractUnitSystem["IAU"]], ___]] := 1/1000 Mass["AbstractIAU"]; MonochromaticRadiation540THzLuminousEfficacy[UnitSystem[1, ___]] = 1 -MonochromaticRadiation540THzLuminousEfficacy[UnitSystem["DimensionalUnits"]] = "J" "T"^3/"M"/"L"^2 +MonochromaticRadiation540THzLuminousEfficacy[_?DimensionSystemQ] = "J" "T"^3/"M"/"L"^2 MonochromaticRadiation540THzLuminousEfficacy[u : UnitSystem[_?NumericQ, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] MonochromaticRadiation540THzLuminousEfficacy[u : UnitSystem[_Around, ___]] := Power[UnitData["Kcd"], UnitSystem["SI2019"], u] MonochromaticRadiation540THzLuminousEfficacy[AbstractUnitSystem["AbstractUnits1"]] = "Kcd1" @@ -284,7 +288,7 @@ EinsteinConstantSpeedOfLightToTheFourth[u_UnitSystem, c_Coupling] := (8 Pi Gravi MolarGasConstant[u_UnitSystem, c_Coupling] := BoltzmannConstant[u, c] AvogadroConstant[u, c]; StefanBoltzmannConstant[u_UnitSystem, c_Coupling] := (2 Pi^5 BoltzmannConstant[u, c]^4)/(15 PlanckConstant[u, c]^3 SpeedOfLight[u, c]^2); RadiationConstant[u_UnitSystem, c_Coupling] := (4 StefanBoltzmannConstant[u, c])/SpeedOfLight[u, c]; -ElectricConstant[u_UnitSystem, c_Coupling] := (1/MagneticConstant[u, c]) (SpeedOfLight[u, c] LorentzConstant[u]^2); +ElectricConstant[u_UnitSystem, c_Coupling] := 1/(MagneticConstant[u, c] (SpeedOfLight[u, c] LorentzConstant[u])^2); CoulombConstant[u_UnitSystem, c_Coupling] := RationalizationConstant[u]/(4 Pi)/ ElectricConstant[u]; BiotSavartConstant[u_UnitSystem, c_Coupling] := MagneticConstant[u, c] LorentzConstant[u] (RationalizationConstant[u]/(4 Pi)); AmpereConstant[u_UnitSystem] := LorentzConstant[u] BiotSavartConstant[u]; diff --git a/Kernel/systems.wl b/Kernel/systems.wl index 3746c9d..162b13e 100644 --- a/Kernel/systems.wl +++ b/Kernel/systems.wl @@ -68,9 +68,8 @@ MetricSystem["SI2019"] := MetricSystem[AbstractUnitData["Mu"], AbstractUnitData[ MetricSystem["Metric"] := MetricSystem[1/1000, 4 Pi/10^7] MetricSystem["SI1976"] := MetricSystem[1/1000, 4 Pi/10^7, 831432/10^5] -ConventionalSystem[klitz_, joseph_] := ConventionalSystem[klitz, Nothing, 2/klitz/joseph^2/Pi] -ConventionalSystem[klitz_, _, hbar_] := ConventionalSystem[klitz, Nothing, hbar, 4 Pi "R\[Infinity]" hbar/"\[Alpha]"^2/"c"] -ConventionalSystem[klitz_, _, hbar_, mass_] := MetricSystem[1/1000, 2 "\[Alpha]" klitz/"c", AbstractUnitData["Ru"], hbar, mass] +ConventionalSystem[klitz_, joseph_] := Module[{hbar = 2/klitz/joseph^2/Pi}, + MetricSystem[1/1000, 2 "\[Alpha]" klitz/"c", AbstractUnitData["Ru"], hbar, 4 Pi "R\[Infinity]" hbar/"\[Alpha]"^2/"c"]] ConventionalSystem["CODATA"] := ConventionalSystem["RK2014", "KJ2014"] ConventionalSystem["Conventional"] := ConventionalSystem["RK1990", "KJ1990"] @@ -81,17 +80,17 @@ GaussSystem[u_String, perm_, ratio_] := GaussSystem[u, perm, ratio, 1] GaussSystem[u_String, perm_, ratio_, lorentz_] := GaussSystem[u, perm, ratio, lorentz, 1/100, 1/1000] GaussSystem[u_String, perm_, ratio_, lorentz_, length_, mass_] := GaussSystem[u, perm, ratio, lorentz, length, mass, PowerExpand[mass length^2]] -GaussSystem[u_String, perm_, ratio_, 1, length_, mass_, energy_] := - UnitSystem[BoltzmannConstant[u]/energy, ReducedPlanckConstant[u]/energy, SpeedOfLight[u]/length, perm, ElectronMass[u]/mass, ratio] GaussSystem[u_String, perm_, ratio_, lorentz_, length_, mass_, energy_] := - UnitSystem[BoltzmannConstant[u]/energy, ReducedPlanckConstant[u]/energy, SpeedOfLight[u]/length, perm, ElectronMass[u]/mass, ratio, lorentz] + UnitSystem[Sequence@@GaussSystem[u, perm, ratio, 1, length, mass, energy], lorentz] +GaussSystem[u_String, perm_, ratio_, 1, length_, mass_, energy_] := + UnitSystem[Sequence@@EntropySystem[u, 1, length, mass, 1, perm, energy], ratio] +GaussSystem["EMU"] := GaussSystem[1, 4 Pi] +GaussSystem["ESU"] := GaussSystem[(100 "c")^-2, 4 Pi] GaussSystem["Gauss"] := GaussSystem[1, 4 Pi, 1/100/"c"] GaussSystem["LorentzHeaviside"] := GaussSystem[1, 1, 1/100/"c"] GaussSystem["Thomson"] := GaussSystem[1, 4 Pi, 1/2] GaussSystem["Kennelly"] := GaussSystem[10^-7, 4 Pi, 1, 1, 1] -GaussSystem["ESU"] := GaussSystem[(100 "c")^-2, 4 Pi] -GaussSystem["EMU"] := GaussSystem[1, 4 Pi] EnergySystem[u_, time_, length_, mass_] := EntropySystem[u, time, length, mass, 1] EnergySystem[u_, time_, length_, mass_, energy_] := @@ -103,47 +102,67 @@ EntropySystem[u_, time_, length_, mass_, temp_, perm_] := EntropySystem[u_, time_, length_, mass_, temp_, perm_, energy_] := UnitSystem[BoltzmannConstant[u] temp/energy, ReducedPlanckConstant[u]/time/energy, time SpeedOfLight[u]/length, perm, ElectronMass[u]/mass] -EnergySystem["MTS"] := EnergySystem["AbstractMetric", 1, 1, 1000] -EnergySystem["IAU"] := EnergySystem["AbstractMetric", "day", "au", "GMsun"/AbstractUnitData["G"]] -EnergySystem["Hubble"] := EnergySystem["AbstractMetric", AbstractUnitData["th"], "c" AbstractUnitData["th"], 1] -EnergySystem["Cosmological"] := EnergySystem["AbstractMetric", AbstractUnitData["lc"]/"c", AbstractUnitData["lc"], AbstractUnitData["mc"]] -EnergySystem["CosmologicalQuantum"] := EnergySystem["AbstractMetric", AbstractUnitData["tcq"], AbstractUnitData["lcq"], AbstractUnitData["mcq"], AbstractUnitData["ecq"]] -EnergySystem["EMU2019"] := EnergySystem["AbstractSI2019", 1, 1/100, 1/1000] +EntropySystem["MTS"] := EnergySystem["AbstractMetric", 1, 1, 1000] +EntropySystem["IAU"] := EnergySystem["AbstractMetric", "day", "au", "GMsun"/AbstractUnitData["G"]] +EntropySystem["Hubble"] := EnergySystem["AbstractMetric", AbstractUnitData["th"], "c" AbstractUnitData["th"], 1] +EntropySystem["Cosmological"] := EnergySystem["AbstractMetric", AbstractUnitData["lc"]/"c", AbstractUnitData["lc"], AbstractUnitData["mc"]] +EntropySystem["CosmologicalQuantum"] := EnergySystem["AbstractMetric", AbstractUnitData["tcq"], AbstractUnitData["lcq"], AbstractUnitData["mcq"], AbstractUnitData["ecq"]] +EntropySystem["EMU2019"] := EnergySystem["AbstractSI2019", 1, 1/100, 1/1000] EntropySystem["ESU2019"] := EntropySystem["AbstractSI2019", 1, 1/100, 1/1000, 1, 1000 AbstractUnitData["\[Mu]0"]/"c"^2] EntropySystem["Mixed"] := EntropySystem["AbstractMetric", 1, 1, 1, 1, AbstractUnitData["\[Mu]0"]] EntropySystem["English"] := EntropySystem["AbstractSI2019", 1, "ft", AbstractUnitData["slug"], "rankine", 4 Pi] EntropySystem["EnglishUS"] := EntropySystem["AbstractMetric", 1, "ftUS", AbstractUnitData["slugUS"], "rankine", 4 Pi] EntropySystem["FFF"] := EntropySystem["AbstractMetric", 14 "day", "fur", 90 "lb", "rankine", 0] +DimensionSystemQ[_] := False +DimensionSystemQ[UnitSystem[_, _, _, _, "M", ___]] := True +DimensionSystem[mu_, lore_] := UnitSystem[Sequence@@DimensionSystem[mu], 1, lore] +DimensionSystem[mu_] := UnitSystem["M" "L"^2/"T"^2/"\[CapitalTheta]", "M" "L"^2/"T", "L"/"T", mu, "M"] + +DimensionSystem[u_String] := If[AbstractUnitSystemQ[u], DimensionSystem[StringDelete[u, "Abstract"]], DimensionSystem["M" "L"/"T"^2/"I"^2]] +DimensionSystem["ISQES"] := DimensionSystem["T"/"L"^2/"I"^2] +DimensionSystem["EMU"] := DimensionSystem[1] +DimensionSystem["ESU"] := DimensionSystem["T"^2/"L"^2] +DimensionSystem["Gauss"] := DimensionSystem[1, "T"/"L"] +DimensionSystem["Stoney"] := DimensionSystem["ISQEM"] //. {"\[CapitalTheta]" -> "M" "L"^2/"T"^2, "T" -> "L"} +DimensionSystem["Electronic"] := DimensionSystem["Stoney"] /. "M" -> 1 +DimensionSystem["PlanckGauss"] := DimensionSystem["Stoney"] /. "L" -> 1/"M" +DimensionSystem["Planck"] := DimensionSystem["PlanckGauss"] /. "I" -> "M" +DimensionSystem["Natural"] := DimensionSystem["Planck"] /. "M" -> 1 +DimensionSystem["NaturalGauss"] := DimensionSystem["PlanckGauss"] /. "M" -> 1 +DimensionSystem["Rydberg"] := DimensionSystem["ISQEM"] //. {"\[CapitalTheta]" -> "M" "L"^2/"T"^2, "T" -> "L"^2 "M"} +DimensionSystem["Hartree"] := DimensionSystem["Rydberg"] /. "M" -> 1 +DimensionSystem["Hubble"] := DimensionSystem["ISQEM"] /. "T" -> "L" +DimensionSystem["CosmologicalQuantum"] := DimensionSystem["Hubble"] /. "L" -> 1/"M" +DimensionSystem["ESU2019"] := DimensionSystem["ISQES"] +DimensionSystem["LorentzHeaviside"] := DimensionSystem["Gauss"] +DimensionSystem["HLU"] := DimensionSystem["Gauss"] +DimensionSystem["CGS"] := DimensionSystem["Gauss"] +DimensionSystem["CGSm"] := DimensionSystem["EMU"] +DimensionSystem["CGSe"] := DimensionSystem["ESU"] +DimensionSystem["Thomson"] := DimensionSystem["EMU"] +DimensionSystem["Kennelly"] := DimensionSystem["EMU"] +DimensionSystem["Schrodinger"] := DimensionSystem["Rydberg"] +DimensionSystem["QCD"] := DimensionSystem["Planck"] +DimensionSystem["QCDGauss"] := DimensionSystem["PlanckGauss"] +DimensionSystem["QCDoriginal"] := DimensionSystem["PlanckGauss"] +DimensionSystem["Cosmological"] := DimensionSystem["Hubble"] + AbstractUnitSystem = <| "AbstractUnits" -> UnitSystem["kB","\[HBar]","c","\[Mu]0","me","\[Lambda]","\[Alpha]L"], "AbstractUnits1" -> UnitSystem["kB1", "\[HBar]1", "c1", "\[Mu]01", "me1", "\[Lambda]1", "\[Alpha]L1"], -"AbstractUnits2" -> UnitSystem["kB2", "\[HBar]2", "c2", "\[Mu]02", "me2", "\[Lambda]2", "\[Alpha]L2"], -"DimensionalUnits" -> UnitSystem["M" "L"^2/"T"^2/"\[CapitalTheta]", "M" "L"^2/"T", "L"/"T", "M" "L"/"T"^2/"I"^2, "M"], -"SI2019" -> MetricSystem["SI2019"], -"Metric" -> MetricSystem["Metric"], -"SI1976" -> MetricSystem["SI1976"], -"CODATA" -> ConventionalSystem["CODATA"], -"Conventional" -> ConventionalSystem["Conventional"]|> +"AbstractUnits2" -> UnitSystem["kB2", "\[HBar]2", "c2", "\[Mu]02", "me2", "\[Lambda]2", "\[Alpha]L2"]|> + +AppendTo[AbstractUnitSystem, Map[(StringJoin["Dimension",#] -> DimensionSystem[#]) &, +{"ISQEM", "ISQES", "EMU", "ESU", "Gauss", "Stoney", "Electronic", "PlanckGauss", "Planck", "Natural", "NaturalGauss", "Rydberg", "Hartree", "Hubble", "CosmologicalQuantum"}]] + +AppendSystems[f_, l_] := AppendTo[AbstractUnitSystem, Map[(# -> f[#]) &, l]] +AppendSystems[MetricSystem, {"Metric", "SI2019", "SI1976"}] +AppendSystems[ConventionalSystem, {"CODATA", "Conventional"}] +AppendSystems[GaussSystem, {"EMU", "ESU", "Gauss", "LorentzHeaviside", "Thomson", "Kennelly"}] +AppendSystems[EntropySystem, {"MTS", "IAU", "Hubble", "Cosmological", "CosmologicalQuantum", "EMU2019", "ESU2019", "Mixed", "English", "EnglishUS", "FFF"}] AppendTo[AbstractUnitSystem, { -"Gauss" -> GaussSystem["Gauss"], -"LorentzHeaviside" -> GaussSystem["LorentzHeaviside"], -"Thomson" -> GaussSystem["Thomson"], -"Kennelly" -> GaussSystem["Kennelly"], -"ESU" -> GaussSystem["ESU"], -"EMU" -> GaussSystem["EMU"], -"MTS" -> EnergySystem["MTS"], -"IAU" -> EnergySystem["IAU"], -"Hubble" -> EnergySystem["Hubble"], -"Cosmological" -> EnergySystem["Cosmological"], -"CosmologicalQuantum" -> EnergySystem["CosmologicalQuantum"], -"EMU2019" -> EnergySystem["EMU2019"], -"ESU2019" -> EntropySystem["ESU2019"], -"Mixed" -> EntropySystem["Mixed"], -"English" -> EntropySystem["English"], -"EnglishUS" -> EntropySystem["EnglishUS"], -"FFF" -> EntropySystem["FFF"], "Planck" -> UnitSystem[1, 1, 1, 1, PowerExpand[Sqrt[4 Pi AbstractUnitData["\[Alpha]G"]]]], "PlanckGauss" -> UnitSystem[1, 1, 1, 4 Pi, PowerExpand[Sqrt[AbstractUnitData["\[Alpha]G"]]]], "Stoney" -> UnitSystem[1, 1/"\[Alpha]", 1, 4 Pi, PowerExpand[Sqrt[AbstractUnitData["\[Alpha]G"]/"\[Alpha]"]]], @@ -163,20 +182,11 @@ AppendTo[AbstractUnitSystem, { "CGSm" :> AbstractUnitSystem["EMU"], "CGSe" :> AbstractUnitSystem["ESU"], "HLU" :> AbstractUnitSystem["LorentzHeaviside"], -"ISQ" :> AbstractUnitSystem["DimensionalUnits"]}] - -UnitSystem["AbstractUnits"] := AbstractUnitSystem["AbstractUnits"] -UnitSystem["AbstractUnits1"] := AbstractUnitSystem["AbstractUnits1"] -UnitSystem["AbstractUnits2"] := AbstractUnitSystem["AbstractUnits2"] -UnitSystem["DimensionalUnits"] := AbstractUnitSystem["DimensionalUnits"] -UnitSystem["SI"] := UnitSystem["SI2019"] -UnitSystem["MKS"] := UnitSystem["Metric"] -UnitSystem["CGS"] := UnitSystem["Gauss"] -UnitSystem["CGS2019"] := UnitSystem["EMU2019"] -UnitSystem["CGSm"] := UnitSystem["EMU"] -UnitSystem["CGSe"] := UnitSystem["ESU"] -UnitSystem["HLU"] := UnitSystem["LorentzHeaviside"] -UnitSystem["ISQ"] := UnitSystem["DimensionalUnits"] +"ISQ" :> AbstractUnitSystem["DimensionISQ"], +"DimensionISQ" :> AbstractUnitSystem["DimensionISQEM"]}] + +Map[(UnitSystem[#] := AbstractUnitSystem[#]) &, +{"AbstractUnits","AbstractUnits1","AbstractUnits2","ISQ","SI","MKS","CGS","CGS2019","CGSm","CGSe","HLU"}] UnitSystem["Natural"] = UnitSystem[1, 1, 1, 1, 1] UnitSystem["NaturalGauss"] = UnitSystem[1, 1, 1, 4 Pi, 1] Map[(UnitSystem[#] = AbstractUnitSystem[#] /. Normal[UnitData]) &,