Source code for finat.ufl.restrictedelement
"""This module defines the UFL finite element classes."""
# Copyright (C) 2008-2016 Martin Sandve Alnæs
#
# This file was originally part of UFL (https://www.fenicsproject.org)
#
# SPDX-License-Identifier: LGPL-3.0-or-later
#
# Modified by Kristian B. Oelgaard
# Modified by Marie E. Rognes 2010, 2012
# Modified by Massimiliano Leoni, 2016
# Modified by Matthew Scroggs, 2023
from finat.ufl.finiteelementbase import FiniteElementBase
from ufl.sobolevspace import L2
valid_restriction_domains = ("interior", "facet", "face", "edge", "vertex", "reduced")
[docs]class RestrictedElement(FiniteElementBase):
"""Represents the restriction of a finite element to a type of cell entity."""
def __init__(self, element, restriction_domain):
"""Doc."""
if not isinstance(element, FiniteElementBase):
raise ValueError("Expecting a finite element instance.")
if restriction_domain not in valid_restriction_domains:
raise ValueError(f"Expecting one of the strings: {valid_restriction_domains}")
FiniteElementBase.__init__(self, "RestrictedElement", element.cell,
element.degree(),
element.quadrature_scheme(),
element.value_shape,
element.reference_value_shape)
self._element = element
self._restriction_domain = restriction_domain
def __repr__(self):
"""Doc."""
return f"RestrictedElement({repr(self._element)}, {repr(self._restriction_domain)})"
@property
def sobolev_space(self):
"""Doc."""
if self._restriction_domain == "interior":
return L2
else:
return self._element.sobolev_space
[docs] def is_cellwise_constant(self):
"""Return whether the basis functions of this element is spatially constant over each cell."""
return self._element.is_cellwise_constant()
def _is_linear(self):
"""Doc."""
return self._element._is_linear()
[docs] def sub_element(self):
"""Return the element which is restricted."""
return self._element
[docs] def mapping(self):
"""Doc."""
return self._element.mapping()
[docs] def restriction_domain(self):
"""Return the domain onto which the element is restricted."""
return self._restriction_domain
[docs] def reconstruct(self, **kwargs):
"""Doc."""
element = self._element.reconstruct(**kwargs)
return RestrictedElement(element, self._restriction_domain)
def __str__(self):
"""Format as string for pretty printing."""
return "<%s>|_{%s}" % (self._element, self._restriction_domain)
[docs] def shortstr(self):
"""Format as string for pretty printing."""
return "<%s>|_{%s}" % (self._element.shortstr(),
self._restriction_domain)
[docs] def symmetry(self):
r"""Return the symmetry dict, which is a mapping :math:`c_0 \\to c_1`.
meaning that component :math:`c_0` is represented by component
:math:`c_1`. A component is a tuple of one or more ints.
"""
return self._element.symmetry()
@property
def num_sub_elements(self):
"""Return number of sub elements."""
return self._element.num_sub_elements
@property
def sub_elements(self):
"""Return list of sub elements."""
return self._element.sub_elements
[docs] def num_restricted_sub_elements(self):
"""Return number of restricted sub elements."""
return 1
[docs] def restricted_sub_elements(self):
"""Return list of restricted sub elements."""
return (self._element,)
[docs] def variant(self):
"""Doc."""
return self._element.variant()