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
EV = 27.211386024367243
KCALPERMOL = 627.5096080305927
KJPERMOL = 2625.5002
BOHR = 0.52917721
MPROT = 1836.1526734252586
HBAR = 1.0
FS = 0.024188843
PS = 2.4188843000000002e-05
KELVIN = 315774.0
THZ = 41341.37378956075
NNEWTON = 82.387
CM1 = 219471.52
GMOL_AFS = 0.01191453911003844
KBAR = 294210.2648438959
ATM = 290362955.68112105
GPA = 29421.026484389593
DEBYE = 2.541746
FSC = 0.0072973525692838015
MOL = 6.02214129e+23
KCAL = 3.778951520392748e+26
KJ = 1.5811133161323258e+27
RY = 2.0
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