def load_molecule_g98fchk(fn_freq, fn_ener=None, energy=None): """Load a molecule from Gaussian98 formatted checkpoint files. Arguments: | ``fn_freq`` -- The formatted checkpoint file of the frequency job. Optional arguments: | ``fn_ener`` -- The formatted checkpoint file of a single point computation for the energy. When not given, the energy is taken from the frequency job. | ``energy`` -- Override the energy from the formatted checkpoint file with the given value. """ fchk_freq = FCHKFile(fn_freq, ignore_errors=True, field_labels=[ "Cartesian Force Constants", "Total Energy", "Multiplicity", "Cartesian Gradient" ]) if fn_ener is None: fchk_ener = fchk_freq else: fchk_ener = FCHKFile(fn_ener, ignore_errors=True, field_labels=["Total Energy"]) masses = np.array([g98_masses[n - 1] for n in fchk_freq.molecule.numbers]) if energy is None: energy = fchk_ener.fields["Total Energy"] return Molecule( fchk_freq.molecule.numbers, fchk_freq.molecule.coordinates, masses, energy, np.reshape(np.array(fchk_freq.fields["Cartesian Gradient"]), (len(fchk_freq.molecule.numbers), 3)), fchk_freq.get_hessian(), fchk_freq.fields["Multiplicity"], None, # gaussian is very poor at computing the rotational symmetry number False, )
def load_molecule_g98fchk(fn_freq, fn_ener=None, energy=None): """Load a molecule from Gaussian98 formatted checkpoint files. Arguments: | ``fn_freq`` -- The formatted checkpoint file of the frequency job. Optional arguments: | ``fn_ener`` -- The formatted checkpoint file of a single point computation for the energy. When not given, the energy is taken from the frequency job. | ``energy`` -- Override the energy from the formatted checkpoint file with the given value. """ fchk_freq = FCHKFile(fn_freq, ignore_errors=True, field_labels=[ "Cartesian Force Constants", "Total Energy", "Multiplicity", "Cartesian Gradient" ]) if fn_ener is None: fchk_ener = fchk_freq else: fchk_ener = FCHKFile(fn_ener, ignore_errors=True, field_labels=[ "Total Energy" ]) masses = np.array([g98_masses[n-1] for n in fchk_freq.molecule.numbers]) if energy is None: energy = fchk_ener.fields["Total Energy"] return Molecule( fchk_freq.molecule.numbers, fchk_freq.molecule.coordinates, masses, energy, np.reshape(np.array(fchk_freq.fields["Cartesian Gradient"]), (len(fchk_freq.molecule.numbers),3)), fchk_freq.get_hessian(), fchk_freq.fields["Multiplicity"], None, # gaussian is very poor at computing the rotational symmetry number False, )
def load_molecule_g03fchk(fn_freq, fn_ener=None, fn_vdw=None, energy=None, fn_punch=None): """Load a molecule from Gaussian03 formatted checkpoint files. Arguments: | ``fn_freq`` -- the formatted checkpoint file of the frequency job Optional arguments: | ``fn_ener`` -- the formatted checkpoint file of a single point computation for the energy. When not given, the energy is taken from the frequency job. | ``fn_vdw`` -- An orca output file containing a Van der Waals correction for the energy. | ``energy`` -- Override the energy from the formatted checkpoint file with the given value. | ``punch`` -- A Gaussian derivatives punch file. When given, the gradient and the Hessian are read from this file instead. """ fchk_freq = FCHKFile(fn_freq, ignore_errors=True, field_labels=[ "Cartesian Force Constants", "Real atomic weights", "Total Energy", "Multiplicity", "Cartesian Gradient", "MicOpt", ]) if fn_ener is None: fchk_ener = fchk_freq else: fchk_ener = FCHKFile(fn_ener, ignore_errors=True, field_labels=[ "Total Energy" ]) if energy is None: energy = fchk_ener.fields["Total Energy"] vdw = 0 if fn_vdw is not None: from tamkin.io.dispersion import load_dftd_orca vdw = load_dftd_orca(fn_vdw) natom = fchk_freq.molecule.size if fchk_freq.molecule.size == 1 and \ "Cartesian Force Constants" not in fchk_freq.fields: gradient = np.zeros((1,3), float) hessian = np.zeros((3,3), float) elif fn_punch is None: gradient = fchk_freq.fields["Cartesian Gradient"].copy() gradient.shape = (natom, 3) hessian = fchk_freq.get_hessian() else: gradient = np.zeros((natom, 3), float) hessian = np.zeros((3*natom, 3*natom), float) iterator = iter_floats_file(fn_punch) for i in xrange(natom): for j in xrange(3): gradient[i,j] = iterator.next() for i in xrange(3*natom): for j in xrange(i+1): v = iterator.next() hessian[i,j] = v hessian[j,i] = v if "MicOpt" in fchk_freq.fields: fixed = (fchk_freq.fields["MicOpt"] == -2).nonzero()[0] if len(fixed) == 0: fixed = None else: fixed = None return Molecule( fchk_freq.molecule.numbers, fchk_freq.molecule.coordinates, fchk_freq.fields["Real atomic weights"]*amu, energy+vdw, gradient, hessian, fchk_freq.fields["Multiplicity"], None, # gaussian is very poor at computing the rotational symmetry number False, title=fchk_freq.title, fixed=fixed, )
ic.fill_jacobian_column(jacobian[:, j], coordinates) return jacobian # This if block is only executed when this file is ran as a program, and not # when it is loaded as a module. if __name__ == "__main__": # Load the formatted checkpoint file with the frequency computation. This # file also contains the atomic numbers and the coordinates of the atoms, # and therefore one can access the dopamine molecule object through # fchk.molecule. fchk = FCHKFile("dopamine.fchk") # Set the default graph for the construction of the internal coordinates: fchk.molecule.set_default_graph() # Setup a list of internal coordinates ics = setup_ics(fchk.molecule.graph) # Compute the Jacobian. J = compute_jacobian(ics, fchk.molecule.coordinates) # Compute the pseudo-inverse, using a loose threshold for the singular # values to filter out equivalent internal coordinates. Jinv = numpy.linalg.pinv(J, 1e-5) # Get the Hessian in Cartesian coordinates. H = fchk.get_hessian() # Transform to internal coordinates. K = numpy.dot(Jinv, numpy.dot(H, Jinv.transpose())) # Make a nice printout of K. print("The Hessian in internal coordinates in kcal/mol/angstrom**2") unit = kcalmol / angstrom**2 for row in K: print(" ".join("% 5.0f" % (v / unit) for v in row))
ic.fill_jacobian_column(jacobian[:,j], coordinates) return jacobian # This if block is only executed when this file is ran as a program, and not # when it is loaded as a module. if __name__ == "__main__": # Load the formatted checkpoint file with the frequency computation. This # file also contains the atomic numbers and the coordinates of the atoms, # and therefore one can access the dopamine molecule object through # fchk.molecule. fchk = FCHKFile("dopamine.fchk") # Set the default graph for the construction of the internal coordinates: fchk.molecule.set_default_graph() # Setup a list of internal coordinates ics = setup_ics(fchk.molecule.graph) # Compute the Jacobian. J = compute_jacobian(ics, fchk.molecule.coordinates) # Compute the pseudo-inverse, using a loose threshold for the singular # values to filter out equivalent internal coordinates. Jinv = numpy.linalg.pinv(J, 1e-5) # Get the Hessian in Cartesian coordinates. H = fchk.get_hessian() # Transform to internal coordinates. K = numpy.dot(Jinv, numpy.dot(H, Jinv.transpose())) # Make a nice printout of K. print "The Hessian in internal coordinates in kcal/mol/angstrom**2" unit = kcalmol/angstrom**2 for row in K: print " ".join("% 5.0f" % (v/unit) for v in row)