Source code for chemfit.scme_factories
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from pathlib import Path
from typing import Any
from ase import Atoms
from .scme_setup import (
arrange_water_in_ohh_order,
check_water_is_in_ohh_order,
setup_calculator,
)
[docs]
class SCMECalculatorFactory:
[docs]
def __init__(
self,
default_scme_params: dict[str, Any],
path_to_scme_expansions: Path | None,
parametrization_key: str | None,
) -> None:
"""Create an SCME calculator."""
self.default_scme_params = default_scme_params
self.path_to_scme_expansions = path_to_scme_expansions
self.parametrization_key = parametrization_key
[docs]
def __call__(self, atoms: Atoms) -> Any:
# Attach a fresh copy of default SCME parameters to this Atoms object
if not check_water_is_in_ohh_order(atoms=atoms):
atoms = arrange_water_in_ohh_order(atoms)
setup_calculator(
atoms,
params=self.default_scme_params,
parametrization_key=self.parametrization_key,
path_to_scme_expansions=self.path_to_scme_expansions,
)
[docs]
class SCMEParameterApplier:
[docs]
def __call__(self, atoms: Atoms, params: dict[str, Any]) -> None:
"""Assign SCME parameter values to the attached calculator."""
assert atoms.calc is not None
atoms.calc.apply_params(params)