"""
set unit styles that have a compatibility between LAMMPS
"""
[docs]def get_style_map(style):
"""get a map of measurements to units for different LAMMPS styles
Parameters
----------
style : str
the LAMMPS style (e.g. 'real' or 'metal')
Returns
-------
dict:
map of measurement name (e.g. 'mass') to units (e.g. 'grams/mole')
"""
units_map = {
'real': {
'mass': 'grams/mole',
'distance': 'Angstroms',
'time': 'femtoseconds',
'energy': 'Kcal/mole',
'velocity': 'Angstroms/femtosecond',
'force': 'Kcal/mole-Angstrom',
'torque': 'Kcal/mole',
'temperature': 'Kelvin',
'pressure': 'atmospheres',
'dynamic_viscosity': 'Poise',
'charge': 'e', # multiple of electron charge (1.0 is a proton)
'dipole': 'charge*Angstroms',
'electric field': 'volts/Angstrom',
'density': 'gram/cm^dim',
},
'metal': {
'mass': 'grams/mole',
'distance': 'Angstroms',
'time': 'picoseconds',
'energy': 'eV',
'velocity': 'Angstroms/picosecond',
'force': 'eV/Angstrom',
'torque': 'eV',
'temperature': 'Kelvin',
'pressure': 'bars',
'dynamic_viscosity': 'Poise',
'charge': 'e', # multiple of electron charge (1.0 is a proton)
'dipole': 'charge*Angstroms',
'electric field': 'volts/Angstrom',
'density': 'gram/cm^dim',
},
'si': {
'mass': 'kilograms',
'distance': 'meters',
'time': 'seconds',
'energy': 'Joules',
'velocity': 'meters/second',
'force': 'Newtons',
'torque': 'Newton-meters',
'temperature': 'Kelvin',
'pressure': 'Pascals',
'dynamic_viscosity': 'Pascal*second',
'charge': 'Coulombs', # (1.6021765e-19 is a proton)
'dipole': 'Coulombs*meters',
'electric field': 'volts/meter',
'density': 'kilograms/meter^dim',
},
'cgs': {
'mass': 'grams',
'distance': 'centimeters',
'time': 'seconds',
'energy': 'ergs',
'velocity': 'centimeters/second',
'force': 'dynes',
'torque': 'dyne-centimeters',
'temperature': 'Kelvin',
'pressure': 'dyne/cm^2', # or barye': '1.0e-6 bars
'dynamic_viscosity': 'Poise',
'charge': 'statcoulombs', # or esu (4.8032044e-10 is a proton)
'dipole': 'statcoul-cm', #: '10^18 debye
'electric_field': 'statvolt/cm', # or dyne/esu
'density': 'grams/cm^dim',
},
'electron': {
'mass': 'amu',
'distance': 'Bohr',
'time': 'femtoseconds',
'energy': 'Hartrees',
'velocity': 'Bohr/atu', # [1.03275e-15 seconds]
'force': 'Hartrees/Bohr',
'temperature': 'Kelvin',
'pressure': 'Pascals',
'charge': 'e', # multiple of electron charge (1.0 is a proton)
'dipole_moment': 'Debye',
'electric_field': 'volts/cm',
},
'micro': {
'mass': 'picograms',
'distance': 'micrometers',
'time': 'microseconds',
'energy': 'picogram-micrometer^2/microsecond^2',
'velocity': 'micrometers/microsecond',
'force': 'picogram-micrometer/microsecond^2',
'torque': 'picogram-micrometer^2/microsecond^2',
'temperature': 'Kelvin',
'pressure': 'picogram/(micrometer-microsecond^2)',
'dynamic_viscosity': 'picogram/(micrometer-microsecond)',
'charge': 'picocoulombs', # (1.6021765e-7 is a proton)
'dipole': 'picocoulomb-micrometer',
'electric field': 'volt/micrometer',
'density': 'picograms/micrometer^dim',
},
'nano': {
'mass': 'attograms',
'distance': 'nanometers',
'time': 'nanoseconds',
'energy': 'attogram-nanometer^2/nanosecond^2',
'velocity': 'nanometers/nanosecond',
'force': 'attogram-nanometer/nanosecond^2',
'torque': 'attogram-nanometer^2/nanosecond^2',
'temperature': 'Kelvin',
'pressure': 'attogram/(nanometer-nanosecond^2)',
'dynamic_viscosity': 'attogram/(nanometer-nanosecond)',
'charge': 'e', # multiple of electron charge (1.0 is a proton)
'dipole': 'charge-nanometer',
'electric_field': 'volt/nanometer',
'density': 'attograms/nanometer^dim'
}
}
return units_map[style]
[docs]def get_pressure(pressure, style):
# allowed GPa/kPa/MPa/Pa/atm/Nm-2/kbar
punits = get_style_map(style)['pressure']
if punits == 'atmospheres':
return pressure, 'atm'
elif punits == 'bar':
return pressure / 1000., 'kbar'
elif punits == 'Pascals':
return pressure, 'Pa'
else:
raise ValueError('units not allowed: {}'.format(punits))
# def get_energy(energy, style):
# # allowed eV, kcal, kjmol
# eunits = _UNITS_DICT[style]['energy']
#
# if eunits == 'eV':
# return energy, 'eV'
# elif eunits == 'Kcal/mole':
#
# else:
# raise ValueError('units not allowed: {}'.format(eunits))
[docs]def get_units_dict(style, quantities):
"""
:param style: the unit style set in the lammps input
:type style: str
:param quantities: the quantities to get units for
:type quantities: list
:return:
"""
out_dict = {}
for quantity in quantities:
units = get_style_map(style)[quantity]
if units == "bar":
units = 'kbar'
if quantity == 'energy':
units = 'eV'
out_dict[quantity + "_units"] = units
return out_dict