Source code for mdsuite.experiment.run

"""
This program and the accompanying materials are made available under the terms of the
Eclipse Public License v2.0 which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-v20.html
SPDX-License-Identifier: EPL-2.0

Copyright Contributors to the Zincware Project.

Description: Collection of calculators / transformations for exp.run
"""
from __future__ import annotations

import functools
from typing import TYPE_CHECKING, Any, List, Type, Union

from mdsuite.calculators import (
    AngularDistributionFunction,  # SpatialDistributionFunction,
)
from mdsuite.calculators import (  # StructureFactor,
    CoordinationNumbers,
    EinsteinDiffusionCoefficients,
    EinsteinDistinctDiffusionCoefficients,
    EinsteinHelfandIonicConductivity,
    EinsteinHelfandThermalConductivity,
    EinsteinHelfandThermalKinaci,
    GreenKuboDiffusionCoefficients,
    GreenKuboDistinctDiffusionCoefficients,
    GreenKuboIonicConductivity,
    GreenKuboThermalConductivity,
    GreenKuboViscosity,
    GreenKuboViscosityFlux,
    KirkwoodBuffIntegral,
    NernstEinsteinIonicConductivity,
    PotentialOfMeanForce,
    RadialDistributionFunction,
)
from mdsuite.transformations import (
    CoordinateUnwrapper,
    CoordinateWrapper,
    IntegratedHeatCurrent,
    IonicCurrent,
    KinaciIntegratedHeatCurrent,
    MolecularMap,
    MomentumFlux,
    ScaleCoordinates,
    ThermalFlux,
    Transformations,
    TranslationalDipoleMoment,
    UnwrapViaIndices,
    VelocityFromPositions,
)

if TYPE_CHECKING:
    from mdsuite.experiment import Experiment


[docs]class RunComputation: """Collection of all calculators that can be used by an experiment""" def __init__( self, experiment: Experiment = None, experiments: List[Experiment] = None ): """Collection of all calculators Parameters ---------- experiment: Experiment Experiment to run the computations for experiments: List[Experiment] A list of experiments passed by running the computation from the project class """ self.experiment = experiment self.experiments = experiments self.kwargs = {"experiment": experiment, "experiments": experiments}
[docs] def exp_wrapper(self, func): # preparation for https://github.com/zincware/MDSuite/issues/404 # currently this does nothing @functools.wraps(func) def wrapper(*args, **kwargs): func_instance = func(*args, **kwargs) # self.experiment._run(func_instance) return func_instance return wrapper
[docs] def transformation_wrapper(self, func: Union[Type[Transformations], Any]): """Run the transformation for every selected experiment Parameters ---------- func: a transformation to be attached to the experiment/s """ @functools.wraps(func.run_transformation) def wrapper(*args, **kwargs): if self.experiments is None: self.experiments = [self.experiment] for experiment in self.experiments: func_instance = func() # attach the transformation to the experiment experiment.cls_transformation_run(func_instance, *args, **kwargs) return wrapper
####################### ### Transformations ### ####################### @property def CoordinateWrapper(self) -> Type[CoordinateWrapper]: return self.transformation_wrapper(CoordinateWrapper) @property def CoordinateUnwrapper(self) -> Type[CoordinateUnwrapper]: return self.transformation_wrapper(CoordinateUnwrapper) @property def IntegratedHeatCurrent(self) -> Type[IntegratedHeatCurrent]: return self.transformation_wrapper(IntegratedHeatCurrent) @property def IonicCurrent(self) -> Type[IonicCurrent]: return self.transformation_wrapper(IonicCurrent) @property def KinaciIntegratedHeatCurrent(self) -> Type[KinaciIntegratedHeatCurrent]: return self.transformation_wrapper(KinaciIntegratedHeatCurrent) @property def MolecularMap(self) -> Type[MolecularMap]: return self.transformation_wrapper(MolecularMap) @property def MomentumFlux(self) -> Type[MomentumFlux]: return self.transformation_wrapper(MomentumFlux) @property def ScaleCoordinates(self) -> Type[ScaleCoordinates]: return self.transformation_wrapper(ScaleCoordinates) @property def ThermalFlux(self) -> Type[ThermalFlux]: return self.transformation_wrapper(ThermalFlux) @property def TranslationalDipoleMoment(self) -> Type[TranslationalDipoleMoment]: return self.transformation_wrapper(TranslationalDipoleMoment) @property def UnwrapViaIndices(self) -> Type[UnwrapViaIndices]: return self.transformation_wrapper(UnwrapViaIndices) @property def VelocityFromPositions(self) -> Type[VelocityFromPositions]: return self.transformation_wrapper(VelocityFromPositions) ##################### #### Calculators #### ##################### @property def AngularDistributionFunction(self) -> AngularDistributionFunction: return self.exp_wrapper(AngularDistributionFunction)(**self.kwargs) @property def CoordinationNumbers(self) -> CoordinationNumbers: return self.exp_wrapper(CoordinationNumbers)(**self.kwargs) @property def EinsteinDiffusionCoefficients(self) -> EinsteinDiffusionCoefficients: return self.exp_wrapper(EinsteinDiffusionCoefficients)(**self.kwargs) @property def EinsteinDistinctDiffusionCoefficients( self, ) -> EinsteinDistinctDiffusionCoefficients: return self.exp_wrapper(EinsteinDistinctDiffusionCoefficients)(**self.kwargs) @property def EinsteinHelfandIonicConductivity(self) -> EinsteinHelfandIonicConductivity: return self.exp_wrapper(EinsteinHelfandIonicConductivity)(**self.kwargs) @property def EinsteinHelfandThermalKinaci(self) -> EinsteinHelfandThermalKinaci: return self.exp_wrapper(EinsteinHelfandThermalKinaci)(**self.kwargs) @property def GreenKuboViscosityFlux(self) -> GreenKuboViscosityFlux: return self.exp_wrapper(GreenKuboViscosityFlux)(**self.kwargs) @property def GreenKuboDistinctDiffusionCoefficients( self, ) -> GreenKuboDistinctDiffusionCoefficients: return self.exp_wrapper(GreenKuboDistinctDiffusionCoefficients)(**self.kwargs) @property def GreenKuboIonicConductivity(self) -> GreenKuboIonicConductivity: return self.exp_wrapper(GreenKuboIonicConductivity)(**self.kwargs) @property def GreenKuboDiffusionCoefficients(self) -> GreenKuboDiffusionCoefficients: return self.exp_wrapper(GreenKuboDiffusionCoefficients)(**self.kwargs) @property def GreenKuboThermalConductivity(self) -> GreenKuboThermalConductivity: return self.exp_wrapper(GreenKuboThermalConductivity)(**self.kwargs) @property def GreenKuboViscosity(self) -> GreenKuboViscosity: return self.exp_wrapper(GreenKuboViscosity)(**self.kwargs) @property def KirkwoodBuffIntegral(self) -> KirkwoodBuffIntegral: return self.exp_wrapper(KirkwoodBuffIntegral)(**self.kwargs) @property def NernstEinsteinIonicConductivity(self) -> NernstEinsteinIonicConductivity: return self.exp_wrapper(NernstEinsteinIonicConductivity)(**self.kwargs) @property def PotentialOfMeanForce(self) -> PotentialOfMeanForce: return self.exp_wrapper(PotentialOfMeanForce)(**self.kwargs) @property def RadialDistributionFunction(self) -> RadialDistributionFunction: return self.exp_wrapper(RadialDistributionFunction)(**self.kwargs) # @property # def StructureFactor(self) -> StructureFactor: # return self.exp_wrapper(StructureFactor)(**self.kwargs) @property def EinsteinHelfandThermalConductivity(self) -> EinsteinHelfandThermalConductivity: return self.exp_wrapper(EinsteinHelfandThermalConductivity)(**self.kwargs)
# @property # def SpatialDistributionFunction(self) -> SpatialDistributionFunction: # return self.exp_wrapper(SpatialDistributionFunction)(**self.kwargs)