Source code for pysisyphus.io.hessian

import numpy as np 
import h5py

from pysisyphus.Geometry import Geometry
from pysisyphus.helpers_pure import eigval_to_wavenumber


[docs] def save_hessian(h5_fn, geom, cart_hessian=None, energy=None, mult=None): if cart_hessian is None: cart_hessian = geom.cart_hessian if energy is None: energy = geom.energy if mult is None: mult = geom.calculator.mult if len(geom.atoms) > 1: proj_hessian = geom.eckart_projection(geom.mass_weigh_hessian(cart_hessian)) else: proj_hessian = cart_hessian eigvals, _ = np.linalg.eigh(proj_hessian) vibfreqs = eigval_to_wavenumber(eigvals) masses = geom.masses atoms = geom.atoms coords3d = geom.coords3d with h5py.File(h5_fn, "w") as handle: handle.create_dataset("hessian", data=cart_hessian) handle.create_dataset("vibfreqs", data=vibfreqs) handle.create_dataset("masses", data=masses) handle.create_dataset("coords3d", data=coords3d) handle.attrs["atoms"] = [atom.lower() for atom in atoms] handle.attrs["energy"] = energy handle.attrs["mult"] = mult
[docs] def save_third_deriv(h5_fn, geom, third_deriv_result, H_mw, H_proj): with h5py.File(h5_fn, "w") as handle: for key, value in third_deriv_result._asdict().items(): handle.create_dataset(key, data=value) handle.create_dataset("coords3d", data=geom.coords3d) handle.create_dataset("masses", data=geom.masses) handle.create_dataset("H_mw", data=H_mw) handle.create_dataset("H_proj", data=H_proj) handle.attrs["atoms"] = [atom.lower() for atom in geom.atoms]
[docs] def geom_from_hessian(h5_fn, **geom_kwargs): with h5py.File(h5_fn, "r") as handle: atoms = [atom.capitalize() for atom in handle.attrs["atoms"]] coords3d = handle["coords3d"][:] energy = handle.attrs["energy"] cart_hessian = handle["hessian"][:] geom = Geometry(atoms=atoms, coords=coords3d, **geom_kwargs) geom.cart_hessian = cart_hessian geom.energy = energy return geom