Source code for finat.johnson_mercier

import FIAT
from gem import ListTensor

from finat.aw import _facet_transform
from finat.fiat_elements import FiatElement
from finat.physically_mapped import Citations, identity, PhysicallyMappedElement


[docs] class JohnsonMercier(PhysicallyMappedElement, FiatElement): # symmetric matrix valued def __init__(self, cell, degree=1, variant=None): if Citations is not None: Citations().register("Gopalakrishnan2024") self._indices = slice(None, None) super().__init__(FIAT.JohnsonMercier(cell, degree, variant=variant))
[docs] def basis_transformation(self, coordinate_mapping): numbf = self._element.space_dimension() ndof = self.space_dimension() V = identity(numbf, ndof) Vsub = _facet_transform(self.cell, 1, coordinate_mapping) Vsub = Vsub[:, self._indices] m, n = Vsub.shape V[:m, :n] = Vsub # Note: that the edge DOFs are scaled by edge lengths in FIAT implies # that they are already have the necessary rescaling to improve # conditioning. return ListTensor(V.T)