Exemple #1
0
def get_hessian(iterable):
    LR = ListReader(iterable)
    LR.go_by_keys("++ Symmetrized Mass Weighted Hessian ++")
    LR.get_next_lines(2)
    part = LR.get_all_by_keys(
        "* Projecting out translational and rotational degrees of freedom",
        "Mass Weighted Hessian Eigenvalues")
    temporary = []
    for line in part:
        try:
            [int(i) for i in line.replace("\n", "").split()[3]]
        except IndexError:
            pass
        except ValueError:
            if not "* Vibrational frequencies, " in line:
                if "averaged" in line:
                    print(1)
                temporary.append(
                    [float(i) for i in line.replace("\n", "").split()[1:]])
    ndim = int(math.sqrt((len(temporary) - 1) * 6 + len(temporary[-1])))
    hessian = np.zeros((ndim, ndim))
    for i in range(len(temporary)):
        for j in range(len(temporary[i])):
            index1 = (i // ndim) * 6
            index2 = (i % ndim)
            hessian[index1 + j, index2] = temporary[i][j]
    return np.array(hessian)
Exemple #2
0
 def get_force(self, lines) -> np.ndarray:
     LR = ListReader(lines)
     LR.go_by_keys(*self.stop_keys["force_start"])
     LR.get_next_lines(2)
     part = LR.get_all_by_keys(*self.stop_keys["force_end"])
     result = []
     for line in part:
         result.extend(map(float, line.replace("\n" , "").split()[2:]))
     return np.array(result)
Exemple #3
0
 def get_criteria(self, lines) -> dict:
     result = dict()
     LR = ListReader(lines)
     LR.go_by_keys(*self.stop_keys["crit_start"])
     part = LR.get_all_by_keys(*self.stop_keys["crit_end"])
     try:
         for line in part:
             result.update({line.split()[0] + " " + line.split()[1]: line.split()[2]})
         return result
     except:
         return np.nan
Exemple #4
0
 def get_MO(self, lines):
     LR = ListReader(lines)
     line = LR.go_by_keys(*self.stop_keys["pop_end"])
     coeff = []
     coeff.extend(map(float, line.replace("\n", "").split()[4:]))
     part = LR.get_all_if_keys(*self.stop_keys["pop_end"])
     for line in part:
         coeff.extend(map(float, line.replace("\n", "").split()[4:]))
     n_basis = len(coeff)
     MO = np.zeros((n_basis, n_basis))
     LR.get_next_lines(3)
     for i in range(int(n_basis/5)):
         part = LR.get_all_by_keys("Eigenvalues --")
         part = iter(part)
         j = 0
         for line in part:
             if j == n_basis:
                 break
             if len(line.split()) == 5:
                 break
             elif len(line.split()) == 9:
                 MO[i * 5: i * 5 + 5, j] = line.replace("\n", "").split()[4:]
             else:
                 MO[i * 5: i * 5 + 5, j] = line.replace("\n", "").split()[2:]
             j = j + 1
     last_orb = n_basis % 5
     part = LR.get_all_by_keys("orbital", "pop", "Density Matrix:")
     j = 0
     i = int(n_basis/5)
     res = n_basis % 5
     if res is not 0:
         for line in part:
             if len(line.split()) == last_orb + 4:
                 MO[i * 5: i * 5 + res, j] = line.replace("\n", "").split()[4:]
             else:
                 MO[i * 5: i * 5 + res, j] = line.replace("\n", "").split()[2:]
             j = j + 1
     for i in range(MO.shape[0]):
         for j in range(MO.shape[1]):
             MO[i, j] = float(MO[i, j])
     return coeff, MO
Exemple #5
0
def get_geometry_from_bagel(iterable):
    LR = ListReader(iterable)
    LR.go_by_keys("*** Geometry ***")
    LR.get_next_lines(1)
    part_of_file = LR.get_all_by_keys(
        " The gradients will be computed analytically.")
    coord = []
    for line in part_of_file:
        line = line.replace(",", "")
        if len(line.split()) < 4:
            break
        coord.extend([float(i) for i in line.split()[7:10]])
    LR.go_by_keys("* Nuclear energy gradient")
    LR.get_next_lines(1)
    part_of_file = LR.get_all_by_keys("* Gradient computed with")
    grads = []
    for line in part_of_file:
        line = line.replace("\n", "")
        if " x " in line or " y " in line or " z " in line:
            grads.append(float(line.replace("\n", "").split()[-1]))
    return np.array(coord), np.array(grads)
Exemple #6
0
 def get_coord(self, lines) -> tuple:
     LR = ListReader(lines)
     LR.go_by_keys(*self.stop_keys["opt_geom_start"])
     LR.go_by_keys("--------------------------")
     LR.get_next_lines(3)
     part = LR.get_all_by_keys(*self.stop_keys["opt_geom_end"])
     charges = []
     coords = []
     for line in part:
         charges.append(line.split()[1])
         coords.extend(map(float, line.replace("\n", "").split()[3:]))
     return charges, np.array(coords)
Exemple #7
0
 def get_hessian(self, lines):
     LR = ListReader(lines)
     LR.go_by_keys("The second derivative matrix:")
     LR.get_next_lines(1)
     part = LR.get_all_by_keys("ITU=  0")
     part1 = iter(part)
     n = 0
     for i in part1:
         try:
             _ = float(i.split()[1])
         except:
             break
         n = n + 1
     part = iter(part)
     hessian = np.zeros((n, n))
     i = 0
     shifts = int(n / 5)
     if n % 5 != 0:
         shifts = shifts + 1
     for j in range(shifts):
         for i in range(n - j*5):
             try:
                 line = next(part)
                 line = line.replace("\n", "")
                 l = i + 1
                 if l > 5:
                     l = 5
                 hessian[i + j*5, j*5: j*5 + l] = [x for x in map(float, line.split()[1:])]
             except StopIteration:
                 break
         try:
             next(part)
         except StopIteration:
             break
     for i in range(n):
         for j in range(i):
             hessian[j, i] = hessian[i, j]
     return hessian