Coverage for /builds/ase/ase/ase/calculators/lammps/unitconvert.py: 100.00%
14 statements
« prev ^ index » next coverage.py v7.5.3, created at 2025-08-02 00:12 +0000
« prev ^ index » next coverage.py v7.5.3, created at 2025-08-02 00:12 +0000
1# fmt: off
3"""LAMMPS has the options to use several internal units (which can be different
4from the ones used in ase). Mapping is therefore necessary.
6See: https://lammps.sandia.gov/doc/units.html
7 """
9from ase import units
11from . import unitconvert_constants as u
13# !TODO add reduced Lennard-Jones units?
15# NOTE: We assume a three-dimensional simulation here!
16DIM = 3.0
18UNITSETS = {}
20UNITSETS["ASE"] = dict(
21 mass=1.0 / units.kg,
22 distance=1.0 / units.m,
23 time=1.0 / units.second,
24 energy=1.0 / units.J,
25 velocity=units.second / units.m,
26 force=units.m / units.J,
27 pressure=1.0 / units.Pascal,
28 charge=1.0 / units.C,
29)
31UNITSETS["real"] = dict(
32 mass=u.gram_per_mole_si,
33 distance=u.angstrom_si,
34 time=u.femtosecond_si,
35 energy=u.kcal_per_mole_si,
36 velocity=u.angstrom_per_femtosecond_si,
37 force=u.kcal_per_mole_angstrom_si,
38 torque=u.kcal_per_mole_si,
39 temperature=u.kelvin_si,
40 pressure=u.atmosphere_si,
41 dynamic_viscosity=u.poise_si,
42 charge=u.e_si,
43 dipole=u.electron_angstrom_si,
44 electric_field=u.volt_per_angstrom_si,
45 density=u.gram_si / u.centimeter_si ** DIM,
46)
48UNITSETS["metal"] = dict(
49 mass=u.gram_per_mole_si,
50 distance=u.angstrom_si,
51 time=u.picosecond_si,
52 energy=u.ev_si,
53 velocity=u.angstrom_per_picosecond_si,
54 force=u.ev_per_angstrom_si,
55 torque=u.ev_si,
56 temperature=u.kelvin_si,
57 pressure=u.bar_si,
58 dynamic_viscosity=u.poise_si,
59 charge=u.e_si,
60 dipole=u.electron_angstrom_si,
61 electric_field=u.volt_per_angstrom_si,
62 density=u.gram_si / u.centimeter_si ** DIM,
63)
65UNITSETS["si"] = dict(
66 mass=u.kilogram_si,
67 distance=u.meter_si,
68 time=u.second_si,
69 energy=u.joule_si,
70 velocity=u.meter_per_second_si,
71 force=u.newton_si,
72 torque=u.joule_si,
73 temperature=u.kelvin_si,
74 pressure=u.pascal_si,
75 dynamic_viscosity=u.pascal_si * u.second_si,
76 charge=u.coulomb_si,
77 dipole=u.coulomb_meter_si,
78 electric_field=u.volt_per_meter_si,
79 density=u.kilogram_si / u.meter_si ** DIM,
80)
82UNITSETS["cgs"] = dict(
83 mass=u.gram_si,
84 distance=u.centimeter_si,
85 time=u.second_si,
86 energy=u.erg_si,
87 velocity=u.centimeter_per_second_si,
88 force=u.dyne_si,
89 torque=u.dyne_centimeter_si,
90 temperature=u.kelvin_si,
91 pressure=u.dyne_per_centimetersq_si, # or barye =u. 1.0e-6 bars
92 dynamic_viscosity=u.poise_si,
93 charge=u.statcoulomb_si, # or esu (4.8032044e-10 is a proton)
94 dipole=u.statcoulomb_centimeter_si, # =u. 10^18 debye,
95 electric_field=u.statvolt_per_centimeter_si, # or dyne / esu
96 density=u.gram_si / (u.centimeter_si ** DIM),
97)
99UNITSETS["electron"] = dict(
100 mass=u.amu_si,
101 distance=u.bohr_si,
102 time=u.femtosecond_si,
103 energy=u.hartree_si,
104 velocity=u.bohr_per_atu_si,
105 force=u.hartree_per_bohr_si,
106 temperature=u.kelvin_si,
107 pressure=u.pascal_si,
108 charge=u.e_si, # multiple of electron charge (1.0 is a proton)
109 dipole=u.debye_si,
110 electric_field=u.volt_per_centimeter_si,
111)
113UNITSETS["micro"] = dict(
114 mass=u.picogram_si,
115 distance=u.micrometer_si,
116 time=u.microsecond_si,
117 energy=u.picogram_micrometersq_per_microsecondsq_si,
118 velocity=u.micrometer_per_microsecond_si,
119 force=u.picogram_micrometer_per_microsecondsq_si,
120 torque=u.picogram_micrometersq_per_microsecondsq_si,
121 temperature=u.kelvin_si,
122 pressure=u.picogram_per_micrometer_microsecondsq_si,
123 dynamic_viscosity=u.picogram_per_micrometer_microsecond_si,
124 charge=u.picocoulomb_si, # (1.6021765e-7 is a proton),
125 dipole=u.picocoulomb_micrometer_si,
126 electric_field=u.volt_per_micrometer_si,
127 density=u.picogram_si / (u.micrometer_si) ** DIM,
128)
130UNITSETS["nano"] = dict(
131 mass=u.attogram_si,
132 distance=u.nanometer_si,
133 time=u.nanosecond_si,
134 energy=u.attogram_nanometersq_per_nanosecondsq_si,
135 velocity=u.nanometer_per_nanosecond_si,
136 force=u.attogram_nanometer_per_nanosecondsq_si,
137 torque=u.attogram_nanometersq_per_nanosecondsq_si,
138 temperature=u.kelvin_si,
139 pressure=u.attogram_per_nanometer_nanosecondsq_si,
140 dynamic_viscosity=u.attogram_per_nanometer_nanosecond_si,
141 charge=u.e_si, # multiple of electron charge (1.0 is a proton)
142 dipole=u.electron_nanometer_si,
143 electric_field=u.volt_si / u.nanometer_si,
144 density=u.attogram_si / u.nanometer_si ** DIM,
145)
148def convert(value, quantity, fromunits, tounits):
149 """Convert units between LAMMPS and ASE.
151 :param value: converted value
152 :param quantity: mass, distance, time, energy, velocity, force, torque,
153 temperature, pressure, dynamic_viscosity, charge, dipole,
154 electric_field or density
155 :param fromunits: ASE, metal, real or other (see lammps docs).
156 :param tounits: ASE, metal, real or other
157 :returns: converted value
158 :rtype:
159 """
160 return UNITSETS[fromunits][quantity] / UNITSETS[tounits][quantity] * value