# 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,sqrt
[docs]classBaseConstant:"""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 """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:"""Unit conversion class for different unit systems. Distance: Ang (Angstrom) met (meter) Time: ps (picosecond) s (second) fs (femtosecond) Pressure: atm (atmosphere) pa (pascal) bar (bar) GPa (GigaPascal) Energy: cal (calorie) kcal (kilocalorie) eV (electron volt) """# DistanceAng_to_met=1e-10Ang2_to_met2=Ang_to_met*Ang_to_metAng3_to_met3=Ang_to_met*Ang2_to_met2# Timeps_to_s=1e-12fs_to_s=1e-15# Pressurebar_to_pa=1e5atm_to_pa=101325pa_to_GPa=1e-9eV_per_Ang3_to_GPa=(bc.e/Ang3_to_met3)*pa_to_GPa# Energycal_to_J=4.184kcal_to_cal=1e3eV_to_J=bc.e
uc=UnitConversion
[docs]classMetalUnits(float,Enum):"""Metal unit system using Angstroms, eV, amu, and proton charge."""def__new__(cls,value:float)->"MetalUnits":"""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)->"RealUnits":"""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