Source code for FIAT.discontinuous_raviart_thomas

# Copyright (C) 2008-2012 Robert C. Kirby (Texas Tech University)
#
# This file is part of FIAT (https://www.fenicsproject.org)
#
# SPDX-License-Identifier:    LGPL-3.0-or-later
#
# Modified by Jan Blechta 2014

from FIAT import dual_set, finite_element, functional
from FIAT.raviart_thomas import RTSpace


[docs] class DRTDualSet(dual_set.DualSet): """Dual basis for Raviart-Thomas elements consisting of point evaluation of normals on facets of codimension 1 and internal moments against polynomials. This is the discontinuous version where all nodes are topologically associated with the cell itself""" def __init__(self, ref_el, degree): entity_ids = {} nodes = [] sd = ref_el.get_spatial_dimension() t = ref_el.get_topology() # codimension 1 facets for i in range(len(t[sd - 1])): pts_cur = ref_el.make_points(sd - 1, i, sd + degree) for j in range(len(pts_cur)): pt_cur = pts_cur[j] f = functional.PointScaledNormalEvaluation(ref_el, i, pt_cur) nodes.append(f) # internal nodes. Let's just use points at a lattice if degree > 0: cpe = functional.ComponentPointEvaluation pts = ref_el.make_points(sd, 0, degree + sd) for d in range(sd): for i in range(len(pts)): l_cur = cpe(ref_el, d, (sd,), pts[i]) nodes.append(l_cur) # sets vertices (and in 3d, edges) to have no nodes for i in range(sd - 1): entity_ids[i] = {} for j in range(len(t[i])): entity_ids[i][j] = [] # set codimension 1 (edges 2d, faces 3d) to have no dofs entity_ids[sd - 1] = {} for i in range(len(t[sd - 1])): entity_ids[sd - 1][i] = [] # cell dofs entity_ids[sd] = {0: list(range(len(nodes)))} super(DRTDualSet, self).__init__(nodes, ref_el, entity_ids)
[docs] class DiscontinuousRaviartThomas(finite_element.CiarletElement): """The discontinuous Raviart-Thomas finite element""" def __init__(self, ref_el, q): degree = q - 1 poly_set = RTSpace(ref_el, degree) dual = DRTDualSet(ref_el, degree) super(DiscontinuousRaviartThomas, self).__init__(poly_set, dual, degree, mapping="contravariant piola")