|  | 
|  | 1 | +"""Arbogast-Correa elements on quadrilaterals. | 
|  | 2 | +
 | 
|  | 3 | +This element's definition appears in https://epubs.siam.org/doi/10.1137/15M1013705 | 
|  | 4 | +(Arbogast, Correa, 2016) | 
|  | 5 | +""" | 
|  | 6 | + | 
|  | 7 | +from ..finite_element import CiarletElement | 
|  | 8 | +from ..moments import make_integral_moment_dofs | 
|  | 9 | +from ..polynomials import polynomial_set, Hdiv_serendipity | 
|  | 10 | +from ..functionals import NormalIntegralMoment, IntegralAgainst | 
|  | 11 | +from .dpc import DPC | 
|  | 12 | +from ..symbolic import x | 
|  | 13 | + | 
|  | 14 | + | 
|  | 15 | +class AC(CiarletElement): | 
|  | 16 | +    """Arbogast-Correa Hdiv finite element.""" | 
|  | 17 | + | 
|  | 18 | +    def __init__(self, reference, order, variant="equispaced"): | 
|  | 19 | +        poly = polynomial_set(reference.tdim, reference.tdim, order) | 
|  | 20 | +        if order == 0: | 
|  | 21 | +            poly += [(x[0], 0), (0, x[1])] | 
|  | 22 | +        else: | 
|  | 23 | +            poly += Hdiv_serendipity(reference.tdim, reference.tdim, order) | 
|  | 24 | +            poly += [(x[0] ** (i + 1) * x[1] ** (order - i), x[0] ** i * x[1] ** (1 + order - i)) | 
|  | 25 | +                     for i in range(order + 1)] | 
|  | 26 | + | 
|  | 27 | +        dofs = make_integral_moment_dofs( | 
|  | 28 | +            reference, | 
|  | 29 | +            facets=(NormalIntegralMoment, DPC, order, {"variant": variant}), | 
|  | 30 | +        ) | 
|  | 31 | + | 
|  | 32 | +        for i in range(order + 1): | 
|  | 33 | +            for j in range(order + 1 - i): | 
|  | 34 | +                if i + j > 0: | 
|  | 35 | +                    f = (i * x[0] ** (i - 1) * x[1] ** j, j * x[0] ** i * x[1] ** (j - 1)) | 
|  | 36 | +                    dofs.append(IntegralAgainst(reference, f, entity=(2, 0), | 
|  | 37 | +                                                mapping="contravariant")) | 
|  | 38 | + | 
|  | 39 | +        for i in range(1, order - 1): | 
|  | 40 | +            for j in range(1, order - i): | 
|  | 41 | +                f = ( | 
|  | 42 | +                    x[0] ** i * (1 - x[0]) * x[1] ** (j - 1) * (j * (1 - x[1]) - x[1]), | 
|  | 43 | +                    -x[0] ** (i - 1) * (i * (1 - x[0]) - x[0]) * x[1] ** j * (1 - x[1]) | 
|  | 44 | +                ) | 
|  | 45 | +                dofs.append(IntegralAgainst(reference, f, entity=(2, 0), | 
|  | 46 | +                                            mapping="contravariant")) | 
|  | 47 | + | 
|  | 48 | +        super().__init__(reference, order, poly, dofs, reference.tdim, reference.tdim) | 
|  | 49 | +        self.variant = variant | 
|  | 50 | + | 
|  | 51 | +    def init_kwargs(self): | 
|  | 52 | +        """Return the kwargs used to create this element.""" | 
|  | 53 | +        return {"variant": self.variant} | 
|  | 54 | + | 
|  | 55 | +    names = ["Arbogast-Correa", "AC", "AC full", "Arbogast-Correa full"] | 
|  | 56 | +    references = ["quadrilateral"] | 
|  | 57 | +    min_order = 0 | 
|  | 58 | +    continuity = "H(div)" | 
0 commit comments