Source code for dopyqo.helpers.matrix_elements

from dataclasses import dataclass
import numpy as np
import dopyqo


[docs] @dataclass class MatrixElements: """Dataclass to store matrix elements""" h_pq_kin: np.ndarray | None = None """Kinetic energy part of the one-electron matrix elements""" h_pq_pp: np.ndarray | None = None """Pseudopotential part of the one-electron matrix elements""" h_pq_core: np.ndarray | None = None """Effective single-particle potential from the frozen core approximation part of the one-electron matrix elements""" h_pqrs: np.ndarray | None = None r"""Two-electron matrix elements (electron-electron interaction) defined as .. math:: h_{pqrs} = \iint \psi^*_p(r_1)\,\psi^*_q(r_2)\,\psi_r(r_2)\,\psi_s(r_1)\, \frac{1}{\lvert r_1 - r_2 \rvert}\,dr_1\,dr_2 """ h_pq_ewald: np.ndarray | None = None """Nuclear-nuclear interaction energy multiplied with the overlap matrix as one-electron matrix elements""" energy_frozen_core: float | None = None """Frozen core energy""" energy_ewald: float | None = None """Nuclear-nuclear interaction energy""" energy_e_self: float | None = None """Electron self-energy""" transform_matrix: np.ndarray | None = None """Transformation matrix to transform matrix elements into a different basis. Used for Wannier transformations""" @property def h_pq(self) -> np.ndarray: """One-electron matrix elements: h_pq = h_pq_kin + h_pq_pp + h_pq_core. h_pq is transformed with transform_matrix if transform_matrix is not None. Transformation is done with dopyqo.transform_one_body_matrix function. """ if self.h_pq_kin is None or self.h_pq_pp is None or self.h_pq_core is None: return None if self.transform_matrix is not None: return dopyqo.transform_one_body_matrix(self.h_pq_kin + self.h_pq_pp + self.h_pq_core, self.transform_matrix) return self.h_pq_kin + self.h_pq_pp + self.h_pq_core