Source code for saoovqe.molecule
"""Module containing implementation of a class EMolecule for dealing with the chemical system and its geometry."""
import numpy as np
from mendeleev import element
from qiskit_nature.second_q.formats.molecule_info import MoleculeInfo
from qiskit_nature.units import DistanceUnit
import psi4
[docs]
class EMolecule(MoleculeInfo):
"""
Class containing information about the chemical system.
"""
# TODO Is this class necessary or should be removed?
def __init__(
self,
symbols,
coords,
multiplicity=1,
charge=0,
degrees_of_freedom=None,
masses=None,
):
self._geometry = [[symbol, coord] for symbol, coord in zip(symbols, coords)]
super().__init__(
self._geometry,
multiplicity,
charge,
DistanceUnit.ANGSTROM,
degrees_of_freedom,
masses,
)
self._n_atoms = len(self._geometry)
self._nuclear_repulsion_energy_gradient = None
self._geometry_str = "\n".join(
f"{atom[0]} " + " ".join(str(x) for x in atom[1]) for atom in self._geometry
)
# TODO is this necessary?
self._geometry_str += "\nsymmetry c1\nnocom\nnoreorient\n"
self._psi4_molecule = psi4.geometry(self._geometry_str, "PSI4 Molecule")
@property
def geometry(self):
"""Geometry in a list form."""
return self._geometry
@property
def n_atoms(self):
"""Number of atoms"""
return self._n_atoms
@property
def geometry_str(self):
"""Geometry in a text-string form"""
return self._geometry_str
@property
def psi4_molecule(self):
"""Psi4 instance of Molecule class"""
return self._psi4_molecule
def _get_nuclear_repulsion_energy_gradient(self):
de = []
for i in range(self._n_atoms):
entry = [0.0, 0.0, 0.0]
for j in range(self._n_atoms):
if i != j:
atom1 = self._geometry[i]
coord1 = atom1[1]
atom2 = self._geometry[j]
coord2 = atom2[1]
tmp = np.norm(coord1, coord2) ** 3.0
# Atomic numbers
zi = element(atom1[0]).atomic_number
zj = element(atom2[0]).atomic_number
# x-coordinates
entry[0] -= (coord1[0] - coord2[0]) * zi * zj / tmp
# y-coordinates
entry[1] -= (coord1[1] - coord2[1]) * zi * zj / tmp
# z-coordinates
entry[2] -= (coord1[2] - coord2[2]) * zi * zj / tmp
de.append(entry)
return de