Source code for FIAT.quadrature_element
# -*- coding: utf-8 -*-
# Copyright (C) 2007-2016 Kristian B. Oelgaard
# Copyright (C) 2017 Miklós Homolya
#
# This file is part of FIAT (https://www.fenicsproject.org)
#
# SPDX-License-Identifier: LGPL-3.0-or-later
#
# Modified by Garth N. Wells 2006-2009
import numpy
from FIAT.dual_set import DualSet
from FIAT.finite_element import FiniteElement
from FIAT.functional import PointEvaluation
[docs]
class QuadratureElement(FiniteElement):
"""A set of quadrature points pretending to be a finite element."""
def __init__(self, ref_el, points, weights=None):
# Create entity dofs.
entity_dofs = {dim: {entity: [] for entity in entities}
for dim, entities in ref_el.get_topology().items()}
entity_dofs[ref_el.get_dimension()] = {0: list(range(len(points)))}
# The dual nodes are PointEvaluations at the quadrature points.
# FIXME: KBO: Check if this gives expected results for code like evaluate_dof.
nodes = [PointEvaluation(ref_el, tuple(point)) for point in points]
# Construct the dual set
dual = DualSet(nodes, ref_el, entity_dofs)
super(QuadratureElement, self).__init__(ref_el, dual, order=None)
self._points = points # save the quadrature points & weights
self._weights = weights
[docs]
def value_shape(self):
"The QuadratureElement is scalar valued"
return ()
[docs]
def tabulate(self, order, points, entity=None):
"""Return the identity matrix of size (num_quad_points, num_quad_points),
in a format that monomialintegration and monomialtabulation understands."""
if entity is not None and entity != (self.ref_el.get_dimension(), 0):
raise ValueError('QuadratureElement does not "tabulate" on subentities.')
# Derivatives are not defined on a QuadratureElement
if order:
raise ValueError("Derivatives are not defined on a QuadratureElement.")
# Check that incoming points are equal to the quadrature points.
if len(points) != len(self._points) or abs(numpy.array(points) - self._points).max() > 1e-12:
raise AssertionError("Mismatch of quadrature points!")
# Return the identity matrix of size len(self._points).
values = numpy.eye(len(self._points))
dim = self.ref_el.get_spatial_dimension()
return {(0,) * dim: values}
[docs]
@staticmethod
def is_nodal():
# No polynomial basis, but still nodal.
return True