@@ -53,13 +53,17 @@ def __init__(self, ref_el, degree, variant, interpolant_deg):
5353 # interior dofs
5454 q = degree - 6
5555 if q >= 0 :
56- Q = create_quadrature (ref_el , interpolant_deg + q )
57- Pq = polynomial_set .ONPolynomialSet (ref_el , q , scale = 1 )
58- phis = Pq .tabulate (Q .get_points ())[(0 ,) * sd ]
59- scale = ref_el .volume ()
60- cur = len (nodes )
61- nodes .extend (IntegralMoment (ref_el , Q , phi / scale ) for phi in phis )
62- entity_ids [sd ][0 ] = list (range (cur , len (nodes )))
56+ cell = ref_el .construct_subelement (sd )
57+ Q_ref = create_quadrature (cell , interpolant_deg + q )
58+ Pq = polynomial_set .ONPolynomialSet (cell , q , scale = 1 )
59+ Phis = Pq .tabulate (Q_ref .get_points ())[(0 ,) * sd ]
60+ for entity in sorted (top [sd ]):
61+ Q = FacetQuadratureRule (ref_el , sd , entity , Q_ref )
62+ scale = 1 / Q .jacobian_determinant ()
63+ phis = scale * Phis
64+ cur = len (nodes )
65+ nodes .extend (IntegralMoment (ref_el , Q , phi ) for phi in phis )
66+ entity_ids [sd ][entity ] = list (range (cur , len (nodes )))
6367
6468 elif variant == "point" :
6569 # edge dofs
@@ -77,9 +81,10 @@ def __init__(self, ref_el, degree, variant, interpolant_deg):
7781 # interior dofs
7882 if degree > 5 :
7983 cur = len (nodes )
80- internalpts = ref_el .make_points (2 , 0 , degree - 3 )
81- nodes .extend (PointEvaluation (ref_el , pt ) for pt in internalpts )
82- entity_ids [2 ][0 ] = list (range (cur , len (nodes )))
84+ for entity in sorted (top [sd ]):
85+ internalpts = ref_el .make_points (sd , entity , degree - 3 )
86+ nodes .extend (PointEvaluation (ref_el , pt ) for pt in internalpts )
87+ entity_ids [sd ][entity ] = list (range (cur , len (nodes )))
8388 else :
8489 raise ValueError ("Invalid variant for Argyris" )
8590 super ().__init__ (nodes , ref_el , entity_ids )
@@ -103,7 +108,9 @@ class Argyris(finite_element.CiarletElement):
103108
104109 def __init__ (self , ref_el , degree = 5 , variant = None ):
105110
106- variant , interpolant_deg = check_format_variant (variant , degree )
111+ splitting , variant , interpolant_deg = check_format_variant (variant , degree )
112+ if splitting is not None :
113+ raise NotImplementedError (f"{ type (self ).__name__ } is not implemented as a macroelement." )
107114
108115 poly_set = polynomial_set .ONPolynomialSet (ref_el , degree , variant = "bubble" )
109116 dual = ArgyrisDualSet (ref_el , degree , variant , interpolant_deg )
0 commit comments