Source code for qmmm_pme.hamiltonians.qm_hamiltonian

#! /usr/bin/env python3
"""A module defining the :class:`QMHamiltonian` class.
"""
from __future__ import annotations

from dataclasses import asdict
from dataclasses import dataclass
from typing import TYPE_CHECKING

from .hamiltonian import MMHamiltonianInterface
from .hamiltonian import QMHamiltonianInterface
from .qmmm_hamiltonian import QMMMHamiltonian
from qmmm_pme.calculators import StandaloneCalculator
from qmmm_pme.interfaces import qm_factories
from qmmm_pme.interfaces import QMSettings

if TYPE_CHECKING:
    from qmmm_pme import System
    from .mm_hamiltonian import MMHamiltonian


[docs]@dataclass class QMHamiltonian(QMHamiltonianInterface): """A wrapper class to store settings for QM calculations. :param basis_set: |basis_set| :param functional: |functional| :param charge: |charge| :param spin: |spin| :param quadrature_spherical: |quadrature_spherical| :param quadrature_radial: |quadrature_radial| :param scf_type: |scf_type| :param read_guess: |read_guess| :param reference_energy: |reference_energy| """ basis_set: str functional: str charge: int spin: int quadrature_spherical: int = 302 quadrature_radial: int = 75 scf_type: str = "df" read_guess: bool = True reference_energy: float | int | None = None
[docs] def build_calculator(self, system: System) -> StandaloneCalculator: qm_atoms = self.parse_atoms(system) system.topology.qm_atoms.update(qm_atoms) settings = QMSettings(system=system, **asdict(self)) interface = qm_factories[self.system_type](settings) calculator = StandaloneCalculator(system=system, interface=interface) return calculator
def __add__(self, other: MMHamiltonian) -> QMMMHamiltonian: if not isinstance(other, MMHamiltonianInterface): raise TypeError("...") return QMMMHamiltonian(self, other) def __str__(self) -> str: return "H^{QM}" + super().__str__()