fennol.utils.atomic_units
1from numpy import pi 2 3 4class AtomicUnits: 5 EV = 27.211386024367243 # Hartree to eV 6 KCALPERMOL = 627.5096080305927 # Hartree to kcal/mol 7 KJPERMOL = 2625.5002 # Hartree to kJ/mol 8 BOHR = 0.52917721 # Bohr to Angstrom 9 MPROT = 1836.1526734252586 # proton mass 10 HBAR = 1.0 # Planck's constant 11 FS = 2.4188843e-2 # AU time to femtoseconds 12 PS = FS / 1000 # AU time to picoseconds 13 KELVIN = 3.15774e5 # Hartree to Kelvin 14 THZ = 1000.0 / FS # AU frequency to THz 15 NNEWTON = 82.387 # AU Force to nNewton 16 CM1 = 219471.52 # Hartree to cm-1 17 GMOL_AFS = BOHR / (MPROT * FS) # AU momentum to (g/mol).A/fs 18 KBAR = 294210.2648438959 # Hartree/bohr**3 to kbar 19 ATM = KBAR * 1000.0 / 1.01325 # Hartree/bohr**3 to atm 20 GPA = 0.1 * KBAR # Hartree/bohr**3 to GPa 21 DEBYE = 2.541746 # e.Bohr to Debye 22 FSC = 1.0 / 137.035999084 # Fine structure constant 23 MOL = 6.02214129e+23 24 KCAL = KCALPERMOL * MOL 25 KJ = KJPERMOL * MOL 26 RY = 2. # Hartree to Rydberg 27 28 mapping = { 29 "1": 1.0, 30 "AU": 1.0, 31 "HA":1.0, 32 "EV": EV, 33 "MEV": 1.0e3 * EV, # milli electronvolt 34 "KCALPERMOL": KCALPERMOL, 35 "KJPERMOL": KJPERMOL, 36 "ANGSTROM": BOHR, 37 "BOHR": 1.0 / BOHR, 38 "AMU": 1.0 / MPROT, 39 "FEMTOSECONDS": FS, 40 "FS": FS, 41 "PICOSECONDS": FS / 1000.0, 42 "PS": FS / 1000.0, 43 "KELVIN": KELVIN, 44 "K": KELVIN, 45 "THZ": THZ, 46 "TRADHZ": THZ / (2 * pi), 47 "CM-1": CM1, 48 "CM1": CM1, 49 "GMOLAFS": GMOL_AFS, 50 "KBAR": KBAR, 51 "ATM": ATM, 52 "GPA": GPA, 53 "DEBYE": DEBYE, 54 "FSC": FSC, 55 "MOL": MOL, 56 "MOLE": MOL, 57 "KCAL": KCAL, 58 "KJ": KJ, 59 "RY": RY, 60 } 61 62 @staticmethod 63 def get_multiplier(unit_string): 64 unit_string = unit_string.upper().strip() 65 66 multiplier = 1.0 67 68 unit_start = 0 69 unit_stop = 0 70 in_power = False 71 power_start = 0 72 power_stop = 0 73 tmp_power = 1.0 74 for i in range(len(unit_string)): 75 current_char = unit_string[i] 76 # print(current_char) 77 if current_char == "^": 78 if in_power: 79 print("Error: Syntax error in unit '" + unit_string + "' !") 80 raise ValueError 81 82 in_power = True 83 unit_stop = i - 1 84 if unit_stop - unit_start < 0: 85 print("Error: Syntax error in unit '" + unit_string + "' !") 86 raise ValueError 87 88 elif current_char == "{": 89 if not in_power: 90 print("Error: Syntax error in unit '" + unit_string + "' !") 91 raise ValueError 92 93 if i + 1 >= len(unit_string): 94 print("Error: Syntax error in unit '" + unit_string + "' !") 95 raise ValueError 96 97 power_start = i + 1 98 99 elif current_char == "}": 100 if not in_power: 101 print("Error: Syntax error in unit '" + unit_string + "' !") 102 raise ValueError 103 104 in_power = False 105 power_stop = i - 1 106 107 if power_stop - power_start < 0: 108 print("Error: Syntax error in unit '" + unit_string + "' !") 109 raise ValueError 110 else: 111 tmp_power_read = int(unit_string[power_start : power_stop + 1]) 112 tmp_power = tmp_power * tmp_power_read 113 114 unit_substring = unit_string[unit_start : unit_stop + 1] 115 tmp_unit = AtomicUnits.mapping[unit_substring] 116 117 multiplier = multiplier * (tmp_unit**tmp_power) 118 119 power_start = 0 120 power_stop = 0 121 unit_start = i + 1 122 unit_stop = 0 123 124 elif current_char == "*": 125 if in_power: 126 print("Error: Syntax error in unit '" + unit_string + "' !") 127 raise ValueError 128 129 if unit_start == i: 130 unit_start = i + 1 131 tmp_power = 1.0 132 continue 133 134 unit_stop = i - 1 135 if unit_stop - unit_start < 0: 136 print("Error: Syntax error in unit '" + unit_string + "' !") 137 raise ValueError 138 139 unit_substring = unit_string[unit_start : unit_stop + 1] 140 tmp_unit = AtomicUnits.mapping[unit_substring] 141 multiplier = multiplier * (tmp_unit**tmp_power) 142 143 unit_start = i + 1 144 unit_stop = 0 145 tmp_power = 1.0 146 147 elif current_char == "/": 148 if in_power: 149 print("Error: Syntax error in unit '" + unit_string + "' !") 150 raise ValueError 151 152 if unit_start == i: 153 unit_start = i + 1 154 tmp_power = -1.0 155 continue 156 157 unit_stop = i - 1 158 if unit_stop - unit_start < 0: 159 print("Error: Syntax error in unit '" + unit_string + "' !") 160 raise ValueError 161 162 unit_substring = unit_string[unit_start : unit_stop + 1] 163 tmp_unit = AtomicUnits.mapping[unit_substring] 164 multiplier = multiplier * (tmp_unit**tmp_power) 165 166 unit_start = i + 1 167 unit_stop = 0 168 tmp_power = -1.0 169 170 else: 171 if i + 1 >= len(unit_string): 172 if in_power: 173 print("Error: Syntax error in unit '" + unit_string + "' !") 174 raise ValueError 175 176 unit_stop = i 177 if unit_stop - unit_start < 0: 178 print("Error: Syntax error in unit '" + unit_string + "' !") 179 raise ValueError 180 181 unit_substring = unit_string[unit_start : unit_stop + 1] 182 tmp_unit = AtomicUnits.mapping[unit_substring] 183 multiplier = multiplier * (tmp_unit**tmp_power) 184 185 return multiplier
class
AtomicUnits:
5class AtomicUnits: 6 EV = 27.211386024367243 # Hartree to eV 7 KCALPERMOL = 627.5096080305927 # Hartree to kcal/mol 8 KJPERMOL = 2625.5002 # Hartree to kJ/mol 9 BOHR = 0.52917721 # Bohr to Angstrom 10 MPROT = 1836.1526734252586 # proton mass 11 HBAR = 1.0 # Planck's constant 12 FS = 2.4188843e-2 # AU time to femtoseconds 13 PS = FS / 1000 # AU time to picoseconds 14 KELVIN = 3.15774e5 # Hartree to Kelvin 15 THZ = 1000.0 / FS # AU frequency to THz 16 NNEWTON = 82.387 # AU Force to nNewton 17 CM1 = 219471.52 # Hartree to cm-1 18 GMOL_AFS = BOHR / (MPROT * FS) # AU momentum to (g/mol).A/fs 19 KBAR = 294210.2648438959 # Hartree/bohr**3 to kbar 20 ATM = KBAR * 1000.0 / 1.01325 # Hartree/bohr**3 to atm 21 GPA = 0.1 * KBAR # Hartree/bohr**3 to GPa 22 DEBYE = 2.541746 # e.Bohr to Debye 23 FSC = 1.0 / 137.035999084 # Fine structure constant 24 MOL = 6.02214129e+23 25 KCAL = KCALPERMOL * MOL 26 KJ = KJPERMOL * MOL 27 RY = 2. # Hartree to Rydberg 28 29 mapping = { 30 "1": 1.0, 31 "AU": 1.0, 32 "HA":1.0, 33 "EV": EV, 34 "MEV": 1.0e3 * EV, # milli electronvolt 35 "KCALPERMOL": KCALPERMOL, 36 "KJPERMOL": KJPERMOL, 37 "ANGSTROM": BOHR, 38 "BOHR": 1.0 / BOHR, 39 "AMU": 1.0 / MPROT, 40 "FEMTOSECONDS": FS, 41 "FS": FS, 42 "PICOSECONDS": FS / 1000.0, 43 "PS": FS / 1000.0, 44 "KELVIN": KELVIN, 45 "K": KELVIN, 46 "THZ": THZ, 47 "TRADHZ": THZ / (2 * pi), 48 "CM-1": CM1, 49 "CM1": CM1, 50 "GMOLAFS": GMOL_AFS, 51 "KBAR": KBAR, 52 "ATM": ATM, 53 "GPA": GPA, 54 "DEBYE": DEBYE, 55 "FSC": FSC, 56 "MOL": MOL, 57 "MOLE": MOL, 58 "KCAL": KCAL, 59 "KJ": KJ, 60 "RY": RY, 61 } 62 63 @staticmethod 64 def get_multiplier(unit_string): 65 unit_string = unit_string.upper().strip() 66 67 multiplier = 1.0 68 69 unit_start = 0 70 unit_stop = 0 71 in_power = False 72 power_start = 0 73 power_stop = 0 74 tmp_power = 1.0 75 for i in range(len(unit_string)): 76 current_char = unit_string[i] 77 # print(current_char) 78 if current_char == "^": 79 if in_power: 80 print("Error: Syntax error in unit '" + unit_string + "' !") 81 raise ValueError 82 83 in_power = True 84 unit_stop = i - 1 85 if unit_stop - unit_start < 0: 86 print("Error: Syntax error in unit '" + unit_string + "' !") 87 raise ValueError 88 89 elif current_char == "{": 90 if not in_power: 91 print("Error: Syntax error in unit '" + unit_string + "' !") 92 raise ValueError 93 94 if i + 1 >= len(unit_string): 95 print("Error: Syntax error in unit '" + unit_string + "' !") 96 raise ValueError 97 98 power_start = i + 1 99 100 elif current_char == "}": 101 if not in_power: 102 print("Error: Syntax error in unit '" + unit_string + "' !") 103 raise ValueError 104 105 in_power = False 106 power_stop = i - 1 107 108 if power_stop - power_start < 0: 109 print("Error: Syntax error in unit '" + unit_string + "' !") 110 raise ValueError 111 else: 112 tmp_power_read = int(unit_string[power_start : power_stop + 1]) 113 tmp_power = tmp_power * tmp_power_read 114 115 unit_substring = unit_string[unit_start : unit_stop + 1] 116 tmp_unit = AtomicUnits.mapping[unit_substring] 117 118 multiplier = multiplier * (tmp_unit**tmp_power) 119 120 power_start = 0 121 power_stop = 0 122 unit_start = i + 1 123 unit_stop = 0 124 125 elif current_char == "*": 126 if in_power: 127 print("Error: Syntax error in unit '" + unit_string + "' !") 128 raise ValueError 129 130 if unit_start == i: 131 unit_start = i + 1 132 tmp_power = 1.0 133 continue 134 135 unit_stop = i - 1 136 if unit_stop - unit_start < 0: 137 print("Error: Syntax error in unit '" + unit_string + "' !") 138 raise ValueError 139 140 unit_substring = unit_string[unit_start : unit_stop + 1] 141 tmp_unit = AtomicUnits.mapping[unit_substring] 142 multiplier = multiplier * (tmp_unit**tmp_power) 143 144 unit_start = i + 1 145 unit_stop = 0 146 tmp_power = 1.0 147 148 elif current_char == "/": 149 if in_power: 150 print("Error: Syntax error in unit '" + unit_string + "' !") 151 raise ValueError 152 153 if unit_start == i: 154 unit_start = i + 1 155 tmp_power = -1.0 156 continue 157 158 unit_stop = i - 1 159 if unit_stop - unit_start < 0: 160 print("Error: Syntax error in unit '" + unit_string + "' !") 161 raise ValueError 162 163 unit_substring = unit_string[unit_start : unit_stop + 1] 164 tmp_unit = AtomicUnits.mapping[unit_substring] 165 multiplier = multiplier * (tmp_unit**tmp_power) 166 167 unit_start = i + 1 168 unit_stop = 0 169 tmp_power = -1.0 170 171 else: 172 if i + 1 >= len(unit_string): 173 if in_power: 174 print("Error: Syntax error in unit '" + unit_string + "' !") 175 raise ValueError 176 177 unit_stop = i 178 if unit_stop - unit_start < 0: 179 print("Error: Syntax error in unit '" + unit_string + "' !") 180 raise ValueError 181 182 unit_substring = unit_string[unit_start : unit_stop + 1] 183 tmp_unit = AtomicUnits.mapping[unit_substring] 184 multiplier = multiplier * (tmp_unit**tmp_power) 185 186 return multiplier
mapping =
{'1': 1.0, 'AU': 1.0, 'HA': 1.0, 'EV': 27.211386024367243, 'MEV': 27211.386024367242, 'KCALPERMOL': 627.5096080305927, 'KJPERMOL': 2625.5002, 'ANGSTROM': 0.52917721, 'BOHR': 1.8897261278504418, 'AMU': 0.0005446170214890387, 'FEMTOSECONDS': 0.024188843, 'FS': 0.024188843, 'PICOSECONDS': 2.4188843000000002e-05, 'PS': 2.4188843000000002e-05, 'KELVIN': 315774.0, 'K': 315774.0, 'THZ': 41341.37378956075, 'TRADHZ': 6579.683992818314, 'CM-1': 219471.52, 'CM1': 219471.52, 'GMOLAFS': 0.01191453911003844, 'KBAR': 294210.2648438959, 'ATM': 290362955.68112105, 'GPA': 29421.026484389593, 'DEBYE': 2.541746, 'FSC': 0.0072973525692838015, 'MOL': 6.02214129e+23, 'MOLE': 6.02214129e+23, 'KCAL': 3.778951520392748e+26, 'KJ': 1.5811133161323258e+27, 'RY': 2.0}
@staticmethod
def
get_multiplier(unit_string):
63 @staticmethod 64 def get_multiplier(unit_string): 65 unit_string = unit_string.upper().strip() 66 67 multiplier = 1.0 68 69 unit_start = 0 70 unit_stop = 0 71 in_power = False 72 power_start = 0 73 power_stop = 0 74 tmp_power = 1.0 75 for i in range(len(unit_string)): 76 current_char = unit_string[i] 77 # print(current_char) 78 if current_char == "^": 79 if in_power: 80 print("Error: Syntax error in unit '" + unit_string + "' !") 81 raise ValueError 82 83 in_power = True 84 unit_stop = i - 1 85 if unit_stop - unit_start < 0: 86 print("Error: Syntax error in unit '" + unit_string + "' !") 87 raise ValueError 88 89 elif current_char == "{": 90 if not in_power: 91 print("Error: Syntax error in unit '" + unit_string + "' !") 92 raise ValueError 93 94 if i + 1 >= len(unit_string): 95 print("Error: Syntax error in unit '" + unit_string + "' !") 96 raise ValueError 97 98 power_start = i + 1 99 100 elif current_char == "}": 101 if not in_power: 102 print("Error: Syntax error in unit '" + unit_string + "' !") 103 raise ValueError 104 105 in_power = False 106 power_stop = i - 1 107 108 if power_stop - power_start < 0: 109 print("Error: Syntax error in unit '" + unit_string + "' !") 110 raise ValueError 111 else: 112 tmp_power_read = int(unit_string[power_start : power_stop + 1]) 113 tmp_power = tmp_power * tmp_power_read 114 115 unit_substring = unit_string[unit_start : unit_stop + 1] 116 tmp_unit = AtomicUnits.mapping[unit_substring] 117 118 multiplier = multiplier * (tmp_unit**tmp_power) 119 120 power_start = 0 121 power_stop = 0 122 unit_start = i + 1 123 unit_stop = 0 124 125 elif current_char == "*": 126 if in_power: 127 print("Error: Syntax error in unit '" + unit_string + "' !") 128 raise ValueError 129 130 if unit_start == i: 131 unit_start = i + 1 132 tmp_power = 1.0 133 continue 134 135 unit_stop = i - 1 136 if unit_stop - unit_start < 0: 137 print("Error: Syntax error in unit '" + unit_string + "' !") 138 raise ValueError 139 140 unit_substring = unit_string[unit_start : unit_stop + 1] 141 tmp_unit = AtomicUnits.mapping[unit_substring] 142 multiplier = multiplier * (tmp_unit**tmp_power) 143 144 unit_start = i + 1 145 unit_stop = 0 146 tmp_power = 1.0 147 148 elif current_char == "/": 149 if in_power: 150 print("Error: Syntax error in unit '" + unit_string + "' !") 151 raise ValueError 152 153 if unit_start == i: 154 unit_start = i + 1 155 tmp_power = -1.0 156 continue 157 158 unit_stop = i - 1 159 if unit_stop - unit_start < 0: 160 print("Error: Syntax error in unit '" + unit_string + "' !") 161 raise ValueError 162 163 unit_substring = unit_string[unit_start : unit_stop + 1] 164 tmp_unit = AtomicUnits.mapping[unit_substring] 165 multiplier = multiplier * (tmp_unit**tmp_power) 166 167 unit_start = i + 1 168 unit_stop = 0 169 tmp_power = -1.0 170 171 else: 172 if i + 1 >= len(unit_string): 173 if in_power: 174 print("Error: Syntax error in unit '" + unit_string + "' !") 175 raise ValueError 176 177 unit_stop = i 178 if unit_stop - unit_start < 0: 179 print("Error: Syntax error in unit '" + unit_string + "' !") 180 raise ValueError 181 182 unit_substring = unit_string[unit_start : unit_stop + 1] 183 tmp_unit = AtomicUnits.mapping[unit_substring] 184 multiplier = multiplier * (tmp_unit**tmp_power) 185 186 return multiplier