Source code for goalie.options

from .utility import AttrDict

__all__ = [
    "AdaptParameters",
    "GoalOrientedAdaptParameters",
]


[docs] class AdaptParameters(AttrDict): """ A class for holding parameters associated with adaptive mesh fixed point iteration loops. """ def __init__(self, parameters=None): """ :arg parameters: parameters to set :type parameters: :class:`dict` with :class:`str` keys and values which may take various types """ parameters = parameters or {} self["miniter"] = 3 # Minimum iteration count self["maxiter"] = 35 # Maximum iteration count self["element_rtol"] = 0.001 # Relative tolerance for element count self["drop_out_converged"] = False # Drop out converged subintervals? if not isinstance(parameters, dict): raise TypeError( "Expected 'parameters' keyword argument to be a dictionary, not of" f" type '{parameters.__class__.__name__}'." ) for key in parameters: if key not in self: raise AttributeError( f"{self.__class__.__name__} does not have '{key}' attribute." ) super().__init__(parameters) self._check_type("miniter", int) self._check_type("maxiter", int) self._check_type("element_rtol", (float, int)) self._check_type("drop_out_converged", bool) def _check_type(self, key, expected): """ Check that a given parameter is of the expected type. :arg key: the parameter label :type key: :class:`str` :arg expected: the expected type :type expected: :class:`type` """ if not isinstance(self[key], expected): if isinstance(expected, tuple): name = "' or '".join([e.__name__ for e in expected]) else: name = expected.__name__ raise TypeError( f"Expected attribute '{key}' to be of type '{name}', not" f" '{type(self[key]).__name__}'." ) def _check_value(self, key, possibilities): """ Check that a given parameter takes one of the possible values. :arg key: the parameter label :type key: :class:`str` :arg possibilities: all possible values for the parameter :type possibilities: :class:`list` """ value = self[key] if value not in possibilities: raise ValueError( f"Unsupported value '{value}' for '{key}'. Choose from {possibilities}." ) def __str__(self): return str(dict(self.items())) def __repr__(self): d = ", ".join([f"{key}={value}" for key, value in self.items()]) return f"{type(self).__name__}({d})"
[docs] class GoalOrientedAdaptParameters(AdaptParameters): """ A class for holding parameters associated with goal-oriented adaptive mesh fixed point iteration loops. """ def __init__(self, parameters=None): """ :arg parameters: parameters to set :type parameters: :class:`dict` with :class:`str` keys and values which may take various types """ parameters = parameters or {} self["qoi_rtol"] = 0.001 # Relative tolerance for QoI self["estimator_rtol"] = 0.001 # Relative tolerance for estimator self["convergence_criteria"] = "any" # Mode for convergence checking super().__init__(parameters=parameters) self._check_type("qoi_rtol", (float, int)) self._check_type("estimator_rtol", (float, int)) self._check_type("convergence_criteria", str) self._check_value("convergence_criteria", ["all", "any"])