Source code for ufl.algorithms.elementtransformations

# -*- coding: utf-8 -*-
"""This module provides helper functions to
  - FFC/DOLFIN adaptive chain,
  - UFL algorithms taking care of underspecified DOLFIN expressions."""

# Copyright (C) 2012 Marie E. Rognes, 2015 Jan Blechta
#
# This file is part of UFL (https://www.fenicsproject.org)
#
# SPDX-License-Identifier:    LGPL-3.0-or-later

from ufl.log import error
from ufl.finiteelement import FiniteElement, VectorElement, TensorElement, \
    MixedElement, EnrichedElement, NodalEnrichedElement

__all__ = ['increase_order', 'tear']


[docs]def increase_order(element): "Return element of same family, but a polynomial degree higher." return _increase_degree(element, +1)
def change_regularity(element, family): """ For a given finite element, return the corresponding space specified by 'family'. """ return element.reconstruct(family=family)
[docs]def tear(element): "For a finite element, return the corresponding discontinuous element." return change_regularity(element, "DG")
def _increase_degree(element, degree_rise): if isinstance(element, (FiniteElement, VectorElement, TensorElement)): # Can't increase degree for reals if element.family() == "Real": return element return element.reconstruct(degree=(element.degree() + degree_rise)) elif isinstance(element, MixedElement): return MixedElement([_increase_degree(e, degree_rise) for e in element.sub_elements()]) elif isinstance(element, EnrichedElement): return EnrichedElement([_increase_degree(e, degree_rise) for e in element.sub_elements()]) elif isinstance(element, NodalEnrichedElement): return NodalEnrichedElement([_increase_degree(e, degree_rise) for e in element.sub_elements()]) else: error("Element reconstruction is only done to stay compatible" " with hacks in DOLFIN. Not expecting a %s" % repr(element))