Source code for finat.cube
from __future__ import absolute_import, division, print_function
from FIAT.reference_element import (UFCHexahedron, UFCQuadrilateral,
compute_unflattening_map, flatten_entities,
flatten_permutations)
from FIAT.tensor_product import FlattenedDimensions as FIAT_FlattenedDimensions
from gem.utils import cached_property
from finat.finiteelementbase import FiniteElementBase
[docs]class FlattenedDimensions(FiniteElementBase):
"""Class for elements on quadrilaterals and hexahedra. Wraps a tensor
product element on a tensor product cell, and flattens its entity
dimensions."""
def __init__(self, element):
super(FlattenedDimensions, self).__init__()
self.product = element
self._unflatten = compute_unflattening_map(element.cell.get_topology())
[docs] @cached_property
def cell(self):
dim = self.product.cell.get_spatial_dimension()
if dim == 2:
return UFCQuadrilateral()
elif dim == 3:
return UFCHexahedron()
else:
raise NotImplementedError("Cannot guess cell for spatial dimension %s" % dim)
@property
def complex(self):
return self.product.complex
@property
def degree(self):
unique_degree, = set(self.product.degree)
return unique_degree
@property
def formdegree(self):
return self.product.formdegree
@cached_property
def _entity_dofs(self):
return flatten_entities(self.product.entity_dofs())
@cached_property
def _entity_support_dofs(self):
return flatten_entities(self.product.entity_support_dofs())
[docs] def entity_dofs(self):
return self._entity_dofs
[docs] @cached_property
def entity_permutations(self):
return flatten_permutations(self.product.entity_permutations)
[docs] def space_dimension(self):
return self.product.space_dimension()
[docs] @cached_property
def fiat_equivalent(self):
return FIAT_FlattenedDimensions(self.product.fiat_equivalent)
[docs] def basis_evaluation(self, order, ps, entity=None, coordinate_mapping=None):
"""Return code for evaluating the element at known points on the
reference element.
:param order: return derivatives up to this order.
:param ps: the point set object.
:param entity: the cell entity on which to tabulate.
"""
if entity is None:
entity = (self.cell.get_spatial_dimension(), 0)
return self.product.basis_evaluation(order, ps, self._unflatten[entity])
[docs] def point_evaluation(self, order, point, entity=None):
if entity is None:
entity = (self.cell.get_spatial_dimension(), 0)
return self.product.point_evaluation(order, point, self._unflatten[entity])
@property
def dual_basis(self):
return self.product.dual_basis
@property
def index_shape(self):
return self.product.index_shape
@property
def value_shape(self):
return self.product.value_shape
@property
def mapping(self):
return self.product.mapping