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

1# fmt: off 

2 

3"""LAMMPS has the options to use several internal units (which can be different 

4from the ones used in ase). Mapping is therefore necessary. 

5 

6See: https://lammps.sandia.gov/doc/units.html 

7 """ 

8 

9from ase import units 

10 

11from . import unitconvert_constants as u 

12 

13# !TODO add reduced Lennard-Jones units? 

14 

15# NOTE: We assume a three-dimensional simulation here! 

16DIM = 3.0 

17 

18UNITSETS = {} 

19 

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) 

30 

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) 

47 

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) 

64 

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) 

81 

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) 

98 

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) 

112 

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) 

129 

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) 

146 

147 

148def convert(value, quantity, fromunits, tounits): 

149 """Convert units between LAMMPS and ASE. 

150 

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