Source code for goalie.utility

"""
Utility functions and classes for mesh adaptation.
"""

import os

import firedrake
import numpy as np


[docs] class AttrDict(dict): """ Dictionary that provides both ``self[key]`` and ``self.key`` access to members. **Disclaimer**: Copied from `stackoverflow <http://stackoverflow.com/questions/4984647/accessing-dict-keys-like-an-attribute-in-python>`__. """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.__dict__ = self
[docs] def effectivity_index(error_indicator, Je): r""" Compute the overestimation factor of some error estimator for the QoI error. Note that this is only typically used for simple steady-state problems with analytical solutions. :arg error_indicator: a :math:`\mathbb P0` error indicator which localises contributions to an error estimator to individual elements :type error_indicator: :class:`firedrake.function.Function` :arg Je: the error in the quantity of interest :type Je: :class:`float` :returns: the effectivity index :rtype: :class:`float` """ if not isinstance(error_indicator, firedrake.Function): raise ValueError("Error indicator must return a Function.") el = error_indicator.ufl_element() if not (el.family() == "Discontinuous Lagrange" and el.degree() == 0): raise ValueError("Error indicator must be P0.") eta = error_indicator.vector().gather().sum() return np.abs(eta / Je)
[docs] def create_directory(path, comm=firedrake.COMM_WORLD): """ Create a directory on disk. **Disclaimer**: Code copied from `Thetis <https://thetisproject.org>`__. :arg path: path to the directory :type path: :class:`str` :kwarg comm: MPI communicator :type comm: :class:`mpi4py.MPI.Intracomm` :returns: the path in absolute form :rtype path: :class:`str` """ if comm.rank == 0: if not os.path.exists(path): os.makedirs(path) comm.barrier() return path