1111
1212from FIAT import dual_set , finite_element , functional , quadrature
1313from FIAT .barycentric_interpolation import LagrangePolynomialSet
14- from FIAT .hierarchical import IntegratedLegendre
15- from FIAT .orientation_utils import make_entity_permutations_simplex
14+ from FIAT .polynomial_set import ONPolynomialSet
1615from FIAT .P0 import P0Dual
1716from FIAT .reference_element import LINE
1817
@@ -48,15 +47,17 @@ class FDMDual(dual_set.DualSet):
4847 def __init__ (self , ref_el , degree , bc_order = 1 , formdegree = 0 , orthogonalize = False ):
4948 # Define the generalized eigenproblem on a reference element
5049 embedded_degree = degree + formdegree
51- embedded = IntegratedLegendre (ref_el , embedded_degree )
52- edim = embedded .space_dimension ()
53- self .embedded = embedded
50+ P = ONPolynomialSet (ref_el , embedded_degree , variant = "bubble" )
51+ Pdim = len (P )
52+ # Apply even / odd reordering on edge bubbles
53+ P = P .take ([0 , 1 , * range (2 , Pdim , 2 ), * range (3 , Pdim , 2 )])
54+ self .poly_set = P
5455
5556 vertices = ref_el .get_vertices ()
5657 if bc_order == 1 and formdegree == 0 :
57- rule = quadrature .GaussLobattoLegendreQuadratureLineRule (ref_el , edim + 1 )
58+ rule = quadrature .GaussLobattoLegendreQuadratureLineRule (ref_el , Pdim + 1 )
5859 else :
59- rule = quadrature .GaussLegendreQuadratureLineRule (ref_el , edim )
60+ rule = quadrature .GaussLegendreQuadratureLineRule (ref_el , Pdim )
6061 self .rule = rule
6162
6263 solve_eig = sym_eig
@@ -65,21 +66,21 @@ def __init__(self, ref_el, degree, bc_order=1, formdegree=0, orthogonalize=False
6566
6667 # Tabulate the BC nodes
6768 if bc_order == 0 :
68- C = numpy .empty ((0 , edim ), "d" )
69+ C = numpy .empty ((0 , Pdim ), "d" )
6970 else :
70- constraints = embedded .tabulate (bc_order - 1 , vertices )
71+ constraints = P .tabulate (vertices , bc_order - 1 )
7172 C = numpy .transpose (numpy .column_stack (list (constraints .values ())))
7273 bdof = slice (None , C .shape [0 ])
7374 idof = slice (C .shape [0 ], None )
7475
7576 # Tabulate the basis that splits the DOFs into interior and bcs
76- E = numpy .eye (edim )
77+ E = numpy .eye (Pdim )
7778 E [bdof , idof ] = - C [:, idof ]
7879 E [bdof , :] = numpy .linalg .solve (C [:, bdof ], E [bdof , :])
7980
8081 # Assemble the constrained Galerkin matrices on the reference cell
8182 k = max (1 , bc_order )
82- phi = embedded .tabulate (k , rule .get_points ())
83+ phi = P .tabulate (rule .get_points (), k )
8384 wts = rule .get_weights ()
8485 E0 = numpy .dot (E .T , phi [(0 , )])
8586 Ek = numpy .dot (E .T , phi [(k , )])
@@ -131,16 +132,10 @@ def __init__(self, ref_el, degree, bc_order=1, formdegree=0, orthogonalize=False
131132 if len (bc_nodes ) > 0 :
132133 entity_ids = {0 : {0 : [0 ], 1 : [1 ]},
133134 1 : {0 : list (range (2 , degree + 1 ))}}
134- entity_permutations = {}
135- entity_permutations [0 ] = {0 : {0 : [0 ]}, 1 : {0 : [0 ]}}
136- entity_permutations [1 ] = {0 : make_entity_permutations_simplex (1 , degree - 1 )}
137135 else :
138136 entity_ids = {0 : {0 : [], 1 : []},
139137 1 : {0 : list (range (0 , degree + 1 ))}}
140- entity_permutations = {}
141- entity_permutations [0 ] = {0 : {0 : []}, 1 : {0 : []}}
142- entity_permutations [1 ] = {0 : make_entity_permutations_simplex (1 , degree + 1 )}
143- super ().__init__ (nodes , ref_el , entity_ids , entity_permutations )
138+ super ().__init__ (nodes , ref_el , entity_ids )
144139
145140
146141class FDMFiniteElement (finite_element .CiarletElement ):
@@ -167,7 +162,7 @@ def __init__(self, ref_el, degree):
167162 dual = FDMDual (ref_el , degree , bc_order = self ._bc_order ,
168163 formdegree = self ._formdegree , orthogonalize = self ._orthogonalize )
169164 if self ._formdegree == 0 :
170- poly_set = dual .embedded . poly_set
165+ poly_set = dual .poly_set
171166 else :
172167 lr = quadrature .GaussLegendreQuadratureLineRule (ref_el , degree + 1 )
173168 poly_set = LagrangePolynomialSet (ref_el , lr .get_points ())
0 commit comments