Source code for despasito.equations_of_state

"""

Create an EOS class from options taken from factory design pattern.

"""

# Add imports here
from importlib import import_module
import logging


class method_stat:

    def __init__(self, numba=True, cython=False, python=False):

        self.cython = cython
        self.python = python
        if self.cython or self.python:
            self.numba = False
        else:
            self.numba = numba

        if not any([numba, cython, python]):
            raise ValueError("Calculation type has not been specified.")

    def __str__(self):

        string = "Compilation: numba {}, cython {}, python {}".format(self.numba, self.cython, self.python)

        return string


logger = logging.getLogger(__name__)


[docs] def initiate_eos(eos="saft.gamma_mie", numba=True, cython=False, python=False, **kwargs): """ Interface between the user and our library of equations of state (EOS). Input the name of a desired EOS and available classes are automatically searched to allow easy implementation of new EOS. Parameters ---------- eos : str, Optional, default="saft.gamma_mie" Name of EOS, see :ref:`EOS-types` in the documentation for additional options. Input should be in the form EOSfamily.EOSname (e.g. saft.gamme_mie). numba : bool, Optional, default=False If True and available for chosen EOS, numba Just-In-Time compilation is used. cython : bool, Optional, default=False If True and available for chosen EOS, cython pre-compiled modules are used. python : bool, Optional, default=False If True and available for chosen EOS, pure python is used for everything, note that if association sites are present in the SAFT EOS, this is detrimentally slow kwargs Other keyword argument inputs for the desired EOS. See specific EOS documentation for required inputs. Returns ------- instance : obj An instance of the defined EOS class to be used in thermodynamic computations. """ kwargs["method_stat"] = method_stat(numba=numba, cython=cython, python=python) factory_families = ["saft"] # Eos families in this list have a general object with a factory to import # relevant modules logger.info("Using EOS: {}".format(eos)) try: eos_fam, eos_type = eos.split(".") except Exception: raise ValueError("Input should be in the form EOSfamily.EOSname (e.g. saft.gamme_mie).") class_name = "EosType" try: if eos_fam in factory_families: eos_module = import_module("." + eos_fam, package="despasito.equations_of_state." + eos_fam) kwargs["saft_name"] = eos_type else: eos_module = import_module("." + eos_type, package="despasito.equations_of_state." + eos_fam) eos_class = getattr(eos_module, class_name) except AttributeError: raise ImportError( "Based on your input, '{}', we expect the class, {}, in a module, {}," " found in the package, {}, which indicates the EOS family.".format(eos, class_name, eos_type, eos_fam) ) instance = eos_class(**kwargs) logger.info("Created {} Eos object".format(eos)) return instance