Source code for irksome.integrated_lagrange

from FIAT import finite_element, dual_set, functional
from FIAT.reference_element import LINE
from FIAT.barycentric_interpolation import LagrangePolynomialSet, get_lagrange_points


[docs] class IntegratedLagrangeDualSet(dual_set.DualSet): """The dual basis for 1D Integrated Lagrange elements.""" def __init__(self, ref_el, points): entity_ids = {0: {0: [0], 1: []}, 1: {0: list(range(1, len(points)+1))}} dpts = list(points) dpts.sort() pt, = ref_el.make_points(0, 0, 1) if pt in dpts: basis_pt = ((dpts[0][0] + dpts[1][0])/2,) else: basis_pt = pt self.points = [basis_pt, *dpts] self.points.sort() nodes = [] nodes.append(functional.PointEvaluation(ref_el, pt)) nodes.extend(functional.PointDerivative(ref_el, pt, (1,)) for pt in dpts) super().__init__(nodes, ref_el, entity_ids)
[docs] class IntegratedLagrange(finite_element.CiarletElement): """1D element with derivate DOFs on quadrature points.""" def __init__(self, element): ref_el = element.get_reference_element() if ref_el.shape != LINE: raise ValueError(f"{type(self).__name__} only defined in one dimension.") degree = element.degree() + 1 points = get_lagrange_points(element.dual_basis()) dual = IntegratedLagrangeDualSet(ref_el, points) poly_set = LagrangePolynomialSet(ref_el, dual.points) super().__init__(poly_set, dual, degree)