Source code for dpdata.plugins.psi4
import numpy as np
from dpdata.format import Format
from dpdata.psi4.input import write_psi4_input
from dpdata.psi4.output import read_psi4_output
from dpdata.unit import EnergyConversion, ForceConversion
energy_convert = EnergyConversion("hartree", "eV").value()
force_convert = ForceConversion("hartree/bohr", "eV/angstrom").value()
[docs]
@Format.register("psi4/out")
class PSI4OutFormat(Format):
"""Psi4 output.
Note that both the energy and the gradient should be
printed into the output file.
"""
[docs]
def from_labeled_system(self, file_name: str, **kwargs) -> dict:
"""Read from Psi4 output.
Parameters
----------
file_name : str
file name
**kwargs
keyword arguments
Returns
-------
dict
system data
"""
symbols, coord, energy, forces = read_psi4_output(file_name)
atom_names, atom_types, atom_numbs = np.unique(
symbols, return_inverse=True, return_counts=True
)
natoms = coord.shape[0]
return {
"atom_types": atom_types,
"atom_names": list(atom_names),
"atom_numbs": list(atom_numbs),
"coords": (coord).reshape((1, natoms, 3)),
"energies": np.array([energy * energy_convert]),
"forces": (forces * force_convert).reshape((1, natoms, 3)),
"cells": np.zeros((1, 3, 3)),
"orig": np.zeros(3),
"nopbc": True,
}
[docs]
@Format.register("psi4/inp")
class PSI4InputFormat(Format):
"""Psi4 input file."""
[docs]
def to_system(
self,
data: dict,
file_name: str,
method: str,
basis: str,
charge: int = 0,
multiplicity: int = 1,
frame_idx=0,
**kwargs,
):
"""Write PSI4 input.
Parameters
----------
data : dict
system data
file_name : str
file name
method : str
computational method
basis : str
basis set; see https://psicode.org/psi4manual/master/basissets_tables.html
charge : int, default=0
charge of system
multiplicity : int, default=1
multiplicity of system
frame_idx : int, default=0
The index of the frame to dump
**kwargs
keyword arguments
"""
types = np.array(data["atom_names"])[data["atom_types"]]
with open(file_name, "w") as fout:
fout.write(
write_psi4_input(
types=types,
coords=data["coords"][frame_idx],
method=method,
basis=basis,
charge=charge,
multiplicity=multiplicity,
)
)