@@ -47,77 +47,68 @@ class NedelecSecondKindDual(DualSet):
4747 def __init__ (self , cell , degree , variant , interpolant_deg ):
4848
4949 # Define degrees of freedom
50- ( dofs , ids ) = self .generate_degrees_of_freedom (cell , degree , variant , interpolant_deg )
50+ nodes = self .generate_degrees_of_freedom (cell , degree , variant , interpolant_deg )
5151 # Call init of super-class
52- super ().__init__ (dofs , cell , ids )
52+ super ().__init__ (nodes , cell )
5353
5454 def generate_degrees_of_freedom (self , cell , degree , variant , interpolant_deg ):
55- "Generate dofs and geometry-to-dof maps (ids). "
55+ """ Generate degrees of freedom for each entity."" "
5656
57- dofs = []
58- ids = {}
57+ nodes = {}
5958
6059 # Extract spatial dimension and topology
6160 d = cell .get_spatial_dimension ()
6261 assert (d in (2 , 3 )), "Second kind Nedelecs only implemented in 2/3D."
6362
6463 # Zero vertex-based degrees of freedom
65- ids [0 ] = {i : [] for i in sorted (cell .topology [0 ])}
64+ nodes [0 ] = {i : [] for i in sorted (cell .topology [0 ])}
6665
6766 # (degree+1) degrees of freedom per entity of codimension 1 (edges)
68- (edge_dofs , ids [1 ]) = self ._generate_edge_dofs (cell , degree , 0 , variant , interpolant_deg )
69- dofs .extend (edge_dofs )
67+ nodes [1 ] = self ._generate_edge_dofs (cell , degree , variant , interpolant_deg )
7068
7169 # Include face degrees of freedom if 3D
7270 if d == 3 :
73- face_dofs , ids [d - 1 ] = self ._generate_facet_dofs (d - 1 , cell , degree ,
74- len (dofs ), variant , interpolant_deg )
75- dofs .extend (face_dofs )
71+ nodes [d - 1 ] = self ._generate_facet_dofs (d - 1 , cell , degree ,
72+ variant , interpolant_deg )
7673
7774 # Varying degrees of freedom (possibly zero) per cell
78- cell_dofs , ids [d ] = self ._generate_facet_dofs (d , cell , degree , len (dofs ), variant , interpolant_deg )
79- dofs .extend (cell_dofs )
75+ nodes [d ] = self ._generate_facet_dofs (d , cell , degree , variant , interpolant_deg )
8076
81- return ( dofs , ids )
77+ return nodes
8278
83- def _generate_edge_dofs (self , cell , degree , offset , variant , interpolant_deg ):
79+ def _generate_edge_dofs (self , cell , degree , variant , interpolant_deg ):
8480 """Generate degrees of freedom (dofs) for entities of
8581 codimension 1 (edges)."""
8682
8783 if variant == "integral" :
88- return self ._generate_facet_dofs (1 , cell , degree , offset , variant , interpolant_deg )
84+ return self ._generate_facet_dofs (1 , cell , degree , variant , interpolant_deg )
8985
9086 # (degree+1) tangential component point evaluation degrees of
9187 # freedom per entity of codimension 1 (edges)
92- dofs = []
93- ids = {}
88+ top = cell . get_topology ()
89+ nodes = {entity : [] for entity in top [ 1 ] }
9490 if variant == "point" :
95- for edge in range ( len ( cell . get_topology () [1 ])) :
91+ for edge in top [1 ]:
9692
9793 # Create points for evaluation of tangential components
9894 points = cell .make_points (1 , edge , degree + 2 )
9995
10096 # A tangential component evaluation for each point
101- dofs .extend (Tangent (cell , edge , point ) for point in points )
97+ nodes [ edge ] .extend (Tangent (cell , edge , point ) for point in points )
10298
103- # Associate these dofs with this edge
104- i = len (points ) * edge
105- ids [edge ] = list (range (offset + i , offset + i + len (points )))
99+ return nodes
106100
107- return (dofs , ids )
108-
109- def _generate_facet_dofs (self , dim , cell , degree , offset , variant , interpolant_deg ):
101+ def _generate_facet_dofs (self , dim , cell , degree , variant , interpolant_deg ):
110102 """Generate degrees of freedom (dofs) for facets."""
111103
112- # Initialize empty dofs and identifiers (ids)
113- num_facets = len (cell .get_topology ()[dim ])
114- dofs = []
115- ids = {i : [] for i in range (num_facets )}
104+ # Initialize empty dofs
105+ top = cell .get_topology ()
106+ nodes = {entity : [] for entity in top [dim ]}
116107
117108 # Return empty info if not applicable
118109 rt_degree = degree - dim + 1
119110 if rt_degree < 1 :
120- return ( dofs , ids )
111+ return nodes
121112
122113 if interpolant_deg is None :
123114 interpolant_deg = degree
@@ -136,21 +127,16 @@ def _generate_facet_dofs(self, dim, cell, degree, offset, variant, interpolant_d
136127 mapping , = set (RT .mapping ())
137128
138129 # Evaluate basis functions at reference quadrature points
139- Phis = Phi .tabulate (Q_ref .get_points ())[(0 ,) * dim ]
140- ells = FacetIntegralMomentBlock (cell , Q_ref , Phis , mapping = mapping )
130+ ells = FacetIntegralMomentBlock (cell , Q_ref , Phi , mapping = mapping )
141131
142132 # Iterate over the facets
143- for entity in range (num_facets ):
144- cur = offset + len (dofs )
133+ for entity in top [dim ]:
145134 # Construct degrees of freedom as integral moments on this cell,
146135 # using the face quadrature weighted against the values
147136 # of the (physical) Raviart--Thomas'es on the face
148- dofs .extend (ells .nodes (dim , entity ))
149-
150- # Assign identifiers (num RTs per face + previous edge dofs)
151- ids [entity ].extend (range (cur , offset + len (dofs )))
137+ nodes [entity ].append (ells )
152138
153- return ( dofs , ids )
139+ return nodes
154140
155141
156142class NedelecSecondKind (CiarletElement ):
0 commit comments