Source code for custodian.qchem.utils

"""
This module contains utility functions that are useful for Q-Chem jobs.
"""

import math

import numpy as np


[docs]def perturb_coordinates(old_coords, negative_freq_vecs, molecule_perturb_scale, reversed_direction): """ Perturbs a structure along the imaginary mode vibrational frequency vectors old_coords (np.ndarray): Initial molecule coordinates negative_freq_vecs (list of np.ndarray): Vibrational frequency vectors corresponding to imaginary (negative) frequencies molecule_perturb_scale (float): Scaling factor for coordination modification. The perturbation vector will be multiplied by this factor. reversed_direction (bool): If True, then perturb in direction opposite of frequency modes. """ max_dis = max(math.sqrt(sum(x ** 2 for x in vec)) for vec in negative_freq_vecs) scale = molecule_perturb_scale / max_dis normalized_vecs = [[x * scale for x in vec] for vec in negative_freq_vecs] direction = 1.0 if reversed_direction: direction = -1.0 return [[c + v * direction for c, v in zip(coord, vec)] for coord, vec in zip(old_coords, normalized_vecs)]
[docs]def vector_list_diff(vecs1, vecs2): """ Calculates the summed difference of two vectors Typically this function is used to compare between the different atom-wise components of a vibrational frequency mode vector. vecs1 (np.ndarray): Collection of vectors to be compared. Typical dimension n x 3 vecs2 (np.ndarray): Collection of vectors to be compared. Typical dimension n x 3 """ diff = 0.0 if len(vecs1) != len(vecs2): raise AssertionError("ERROR: Vectors must be of equal length! Exiting...") for ii, vec1 in enumerate(vecs1): diff += np.linalg.norm(vecs2[ii] - vec1) return diff