# ruff: noqa: N815, PIE796"""Unit systems and conversions.Defines a units system and returns a dictionary of conversion factors.Units are defined similar to https://docs.lammps.org/units.html."""fromenumimportEnumfrommathimportpi,sqrtfromtypingimportSelf
[docs]classBaseConstant(float,Enum):"""CODATA Recommended Values of the Fundamental Physical Constants: 2014. References: http://arxiv.org/pdf/1507.07956.pdf https://wiki.fysik.dtu.dk/ase/_modules/ase/units.html#create_units """def__new__(cls,value:float)->Self:"""Create new BaseConstant enum value."""returnfloat.__new__(cls,value)c=299792458.0# speed of light, m/smu0=4.0e-7*pi# permeability of vacuumgrav=6.67408e-11# gravitational constanth_planck=6.626070040e-34# Planck constant, J se=1.6021766208e-19# elementary chargem_e=9.10938356e-31# electron massm_p=1.672621898e-27# proton massn_av=6.022140857e23# Avogadro numberk_B=1.38064852e-23# Boltzmann constant, J/Kamu=1.660539040e-27# atomic mass unit, kg
bc=BaseConstant
[docs]classUnitConversion(float,Enum):"""Unit conversion factors between common unit systems."""def__new__(cls,value:float)->Self:"""Create new UnitConversion enum value."""returnfloat.__new__(cls,value)Ang_to_met=1e-10Ang2_to_met2=1e-10**2Ang3_to_met3=1e-10**3ps_to_s=1e-12fs_to_s=1e-15bar_to_pa=1e5atm_to_pa=101325pa_to_GPa=1e-9eV_per_Ang3_to_GPa=bc.e*1e21cal_to_J=4.184kcal_to_cal=1e3eV_to_J=bc.eBohr_to_Ang=0.529177210903Ang_to_Bohr=1.0/Bohr_to_AngHartree_to_eV=27.211386245988eV_to_Hartree=1.0/Hartree_to_eVe2_per_Ang_to_eV=14.399645478425668
uc=UnitConversion
[docs]classMetalUnits(float,Enum):"""Metal unit system using Angstroms, eV, amu, and proton charge."""def__new__(cls,value:float)->Self:"""Create new MetalUnits enum value."""returnfloat.__new__(cls,value)# Base unitsmass=1.0# Default mass in amudistance=1.0# Default distance in Angstromenergy=1.0# Default energy in eVcharge=1.0# Default charge in proton charge# Derived unitstime=sqrt(energy*bc.e/(bc.amu*uc.Ang2_to_met2))*uc.ps_to_s# picosecondsvelocity=distance/time# Ang/psforce=energy/distance# eV/Angtorque=energy# eVtemperature=bc.k_B/bc.e# Boltzmann in eV/Kpressure=uc.bar_to_pa*(energy*uc.Ang3_to_met3/bc.e)# barelectric_field=charge*distance# e*Ang
[docs]classRealUnits(float,Enum):"""Real unit system using Angstroms, kcal/mol, and proton charge."""def__new__(cls,value:float)->Self:"""Create new RealUnits enum value."""returnfloat.__new__(cls,value)# Base unitsmass=1.0# Default mass in grams/moldistance=1.0# Default distance in Angstromenergy=1.0# Default energy in kcal/molcharge=1.0# Default charge in proton charge# Derived unitstime=(sqrt(energy/(bc.amu*uc.Ang2_to_met2*bc.n_av/(uc.cal_to_J*uc.kcal_to_cal)))*uc.fs_to_s)# femtosecondsvelocity=distance/time# Ang/fsforce=energy/distance# kcal/mol/Angtorque=energy# kcal/moltemperature=bc.k_B*bc.n_av/uc.cal_to_J/uc.kcal_to_cal# kcal/mol Kpressure=(uc.Ang3_to_met3*(bc.n_av/(uc.cal_to_J*uc.kcal_to_cal))*uc.bar_to_pa)# barelectric_field=charge*distance# e*Ang
[docs]classUnitSystem:"""Container class for unit systems."""metal=MetalUnitsreal=RealUnits