Source code for FIAT.P0
# Copyright (C) 2005 The University of Chicago
#
# This file is part of FIAT (https://www.fenicsproject.org)
#
# SPDX-License-Identifier: LGPL-3.0-or-later
#
# Written by Robert C. Kirby
# Modified by Andrew T. T. McRae (Imperial College London)
#
# This work is partially supported by the US Department of Energy
# under award number DE-FG02-04ER25650
from FIAT import dual_set, functional, polynomial_set, finite_element
import numpy
[docs]
class P0Dual(dual_set.DualSet):
def __init__(self, ref_el):
entity_ids = {}
entity_permutations = {}
sd = ref_el.get_dimension()
top = ref_el.get_topology()
if sd == 0:
pts = [tuple() for entity in sorted(top[sd])]
else:
pts = [tuple(numpy.average(ref_el.get_vertices_of_subcomplex(top[sd][entity]), 0))
for entity in sorted(top[sd])]
nodes = [functional.PointEvaluation(ref_el, pt) for pt in pts]
for dim in sorted(top):
entity_ids[dim] = {}
entity_permutations[dim] = {}
sym_size = ref_el.symmetry_group_size(dim)
num_points = 1 if dim == sd else 0
if isinstance(dim, tuple):
assert isinstance(sym_size, tuple)
perms = {o: list(range(num_points)) for o in numpy.ndindex(sym_size)}
else:
perms = {o: list(range(num_points)) for o in range(sym_size)}
for entity in sorted(top[dim]):
entity_ids[dim][entity] = [entity] if dim == sd else []
entity_permutations[dim][entity] = perms
super().__init__(nodes, ref_el, entity_ids, entity_permutations)
[docs]
class P0(finite_element.CiarletElement):
def __init__(self, ref_el):
poly_set = polynomial_set.ONPolynomialSet(ref_el, 0)
dual = P0Dual(ref_el)
degree = 0
formdegree = ref_el.get_spatial_dimension() # n-form
super().__init__(poly_set, dual, degree, formdegree)