Skip to content

Commit 8974a1f

Browse files
committed
Rescale integral moment dofs to match lowest order point and integral variants
1 parent 12c5579 commit 8974a1f

File tree

6 files changed

+32
-27
lines changed

6 files changed

+32
-27
lines changed

FIAT/brezzi_douglas_marini.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def __init__(self, ref_el, degree, variant, interpolant_deg):
3030
# Facet nodes are \int_F v\cdot n p ds where p \in P_{q}
3131
# degree is q
3232
Q_ref = create_quadrature(facet, interpolant_deg + degree)
33-
Pq = polynomial_set.ONPolynomialSet(facet, degree)
33+
Pq = polynomial_set.ONPolynomialSet(facet, degree, scale="L2 piola")
3434
Pq_at_qpts = Pq.tabulate(Q_ref.get_points())[(0,)*(sd - 1)]
3535
for f in top[sd - 1]:
3636
cur = len(nodes)

FIAT/expansions.py

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -141,31 +141,36 @@ def xi_tetrahedron(eta):
141141

142142

143143
class ExpansionSet(object):
144-
def __new__(cls, ref_el, *args, **kwargs):
144+
def __new__(cls, *args, **kwargs):
145145
"""Returns an ExpansionSet instance appopriate for the given
146146
reference element."""
147147
if cls is not ExpansionSet:
148148
return super(ExpansionSet, cls).__new__(cls)
149+
ref_el = args[0]
149150
if ref_el.get_shape() == reference_element.POINT:
150-
return PointExpansionSet(ref_el)
151+
return PointExpansionSet(*args, **kwargs)
151152
elif ref_el.get_shape() == reference_element.LINE:
152-
return LineExpansionSet(ref_el)
153+
return LineExpansionSet(*args, **kwargs)
153154
elif ref_el.get_shape() == reference_element.TRIANGLE:
154-
return TriangleExpansionSet(ref_el)
155+
return TriangleExpansionSet(*args, **kwargs)
155156
elif ref_el.get_shape() == reference_element.TETRAHEDRON:
156-
return TetrahedronExpansionSet(ref_el)
157+
return TetrahedronExpansionSet(*args, **kwargs)
157158
else:
158159
raise ValueError("Invalid reference element type.")
159160

160-
def __init__(self, ref_el):
161+
def __init__(self, ref_el, scale=None):
162+
if isinstance(scale, str) and scale.lower() == "l2 piola":
163+
scale = 1.0 / ref_el.volume()
164+
elif scale is None:
165+
scale = math.sqrt(1.0 / ref_el.volume())
161166
self.ref_el = ref_el
167+
self.scale = scale
162168
dim = ref_el.get_spatial_dimension()
163169
self.base_ref_el = reference_element.default_simplex(dim)
164170
v1 = ref_el.get_vertices()
165171
v2 = self.base_ref_el.get_vertices()
166172
self.A, self.b = reference_element.make_affine_mapping(v1, v2)
167173
self.mapping = lambda x: numpy.dot(self.A, x) + self.b
168-
self.scale = numpy.sqrt(1.0 / ref_el.volume())
169174
self._dmats_cache = {}
170175

171176
def get_num_members(self, n):
@@ -266,10 +271,10 @@ def tabulate_jet(self, n, pts, order=1):
266271

267272
class PointExpansionSet(ExpansionSet):
268273
"""Evaluates the point basis on a point reference element."""
269-
def __init__(self, ref_el):
274+
def __init__(self, ref_el, **kwargs):
270275
if ref_el.get_spatial_dimension() != 0:
271276
raise ValueError("Must have a point")
272-
super(PointExpansionSet, self).__init__(ref_el)
277+
super(PointExpansionSet, self).__init__(ref_el, **kwargs)
273278

274279
def tabulate(self, n, pts):
275280
"""Returns a numpy array A[i,j] = phi_i(pts[j]) = 1.0."""
@@ -279,10 +284,10 @@ def tabulate(self, n, pts):
279284

280285
class LineExpansionSet(ExpansionSet):
281286
"""Evaluates the Legendre basis on a line reference element."""
282-
def __init__(self, ref_el):
287+
def __init__(self, ref_el, **kwargs):
283288
if ref_el.get_spatial_dimension() != 1:
284289
raise Exception("Must have a line")
285-
super(LineExpansionSet, self).__init__(ref_el)
290+
super(LineExpansionSet, self).__init__(ref_el, **kwargs)
286291

287292
def _tabulate(self, n, pts, order=0):
288293
"""Returns a tuple of (vals, derivs) such that
@@ -306,18 +311,18 @@ def _tabulate(self, n, pts, order=0):
306311
class TriangleExpansionSet(ExpansionSet):
307312
"""Evaluates the orthonormal Dubiner basis on a triangular
308313
reference element."""
309-
def __init__(self, ref_el):
314+
def __init__(self, ref_el, **kwargs):
310315
if ref_el.get_spatial_dimension() != 2:
311316
raise Exception("Must have a triangle")
312-
super(TriangleExpansionSet, self).__init__(ref_el)
317+
super(TriangleExpansionSet, self).__init__(ref_el, **kwargs)
313318

314319

315320
class TetrahedronExpansionSet(ExpansionSet):
316321
"""Collapsed orthonormal polynomial expansion on a tetrahedron."""
317-
def __init__(self, ref_el):
322+
def __init__(self, ref_el, **kwargs):
318323
if ref_el.get_spatial_dimension() != 3:
319324
raise Exception("Must be a tetrahedron")
320-
super(TetrahedronExpansionSet, self).__init__(ref_el)
325+
super(TetrahedronExpansionSet, self).__init__(ref_el, **kwargs)
321326

322327

323328
def polynomial_dimension(ref_el, degree):

FIAT/nedelec.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ def __init__(self, ref_el, degree, variant, interpolant_deg):
123123
if phi_deg >= 0:
124124
facet = ref_el.construct_subelement(dim)
125125
Q_ref = create_quadrature(facet, interpolant_deg + phi_deg)
126-
Pqmd = polynomial_set.ONPolynomialSet(facet, phi_deg, (dim,))
126+
Pqmd = polynomial_set.ONPolynomialSet(facet, phi_deg, (dim,), scale="L2 piola")
127127
Phis = Pqmd.tabulate(Q_ref.get_points())[(0,) * dim]
128128
Phis = numpy.transpose(Phis, (0, 2, 1))
129129

@@ -165,7 +165,7 @@ def __init__(self, ref_el, degree, variant, interpolant_deg):
165165
interpolant_deg = degree
166166
cur = len(nodes)
167167
Q = create_quadrature(ref_el, interpolant_deg + phi_deg)
168-
Pqmd = polynomial_set.ONPolynomialSet(ref_el, phi_deg)
168+
Pqmd = polynomial_set.ONPolynomialSet(ref_el, phi_deg, scale="L2 piola")
169169
Phis = Pqmd.tabulate(Q.get_points())[(0,) * dim]
170170
nodes.extend(functional.IntegralMoment(ref_el, Q, phi, (d,), (dim,))
171171
for d in range(dim) for phi in Phis)

FIAT/nedelec_second_kind.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ def _generate_facet_dofs(self, codim, cell, degree, offset, variant, interpolant
129129
ref_facet = cell.construct_subelement(codim)
130130
Q_ref = create_quadrature(ref_facet, interpolant_deg + rt_degree)
131131
if codim == 1:
132-
Phi = ONPolynomialSet(ref_facet, rt_degree, (codim,))
132+
Phi = ONPolynomialSet(ref_facet, rt_degree, (codim,), scale="L2 piola")
133133
else:
134134
# Construct Raviart-Thomas on the reference facet
135135
RT = RaviartThomas(ref_facet, rt_degree, variant)
@@ -149,10 +149,10 @@ def _generate_facet_dofs(self, codim, cell, degree, offset, variant, interpolant
149149
# Get the quadrature and Jacobian on this facet
150150
Q_facet = FacetQuadratureRule(cell, codim, facet, Q_ref)
151151
J = Q_facet.jacobian()
152-
detJ = Q_facet.jacobian_determinant()
152+
Jdet = Q_facet.jacobian_determinant()
153153

154154
# Map Phis -> phis (reference values to physical values)
155-
piola_map = J / detJ
155+
piola_map = J / Jdet
156156
phis = numpy.dot(Phis, piola_map.T)
157157
phis = numpy.transpose(phis, (0, 2, 1))
158158

FIAT/polynomial_set.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ class ONPolynomialSet(PolynomialSet):
120120
121121
"""
122122

123-
def __init__(self, ref_el, degree, shape=tuple()):
123+
def __init__(self, ref_el, degree, shape=tuple(), scale=None):
124124

125125
if shape == tuple():
126126
num_components = 1
@@ -130,7 +130,7 @@ def __init__(self, ref_el, degree, shape=tuple()):
130130
num_exp_functions = expansions.polynomial_dimension(ref_el, degree)
131131
num_members = num_components * num_exp_functions
132132
embedded_degree = degree
133-
expansion_set = expansions.ExpansionSet(ref_el)
133+
expansion_set = expansions.ExpansionSet(ref_el, scale=scale)
134134

135135
# set up coefficients
136136
if shape == tuple():
@@ -211,7 +211,7 @@ class ONSymTensorPolynomialSet(PolynomialSet):
211211
212212
"""
213213

214-
def __init__(self, ref_el, degree, size=None):
214+
def __init__(self, ref_el, degree, size=None, scale=None):
215215

216216
sd = ref_el.get_spatial_dimension()
217217
if size is None:
@@ -222,7 +222,7 @@ def __init__(self, ref_el, degree, size=None):
222222
num_components = size * (size + 1) // 2
223223
num_members = num_components * num_exp_functions
224224
embedded_degree = degree
225-
expansion_set = expansions.ExpansionSet(ref_el)
225+
expansion_set = expansions.ExpansionSet(ref_el, scale=scale)
226226

227227
# set up coefficients for symmetric tensors
228228
coeffs_shape = (num_members, *shape, num_exp_functions)

FIAT/raviart_thomas.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def __init__(self, ref_el, degree, variant, interpolant_deg):
7575
# Facet nodes are \int_F v\cdot n p ds where p \in P_{q-1}
7676
# degree is q - 1
7777
Q_ref = create_quadrature(facet, interpolant_deg + degree - 1)
78-
Pq = polynomial_set.ONPolynomialSet(facet, degree - 1)
78+
Pq = polynomial_set.ONPolynomialSet(facet, degree - 1, scale="L2 piola")
7979
Pq_at_qpts = Pq.tabulate(Q_ref.get_points())[(0,)*(sd - 1)]
8080
for f in top[sd - 1]:
8181
cur = len(nodes)
@@ -91,7 +91,7 @@ def __init__(self, ref_el, degree, variant, interpolant_deg):
9191
if degree > 1:
9292
cur = len(nodes)
9393
Q = create_quadrature(ref_el, interpolant_deg + degree - 2)
94-
Pkm1 = polynomial_set.ONPolynomialSet(ref_el, degree - 2)
94+
Pkm1 = polynomial_set.ONPolynomialSet(ref_el, degree - 2, scale="L2 piola")
9595
Pkm1_at_qpts = Pkm1.tabulate(Q.get_points())[(0,) * sd]
9696
nodes.extend(functional.IntegralMoment(ref_el, Q, phi, (d,), (sd,))
9797
for d in range(sd)

0 commit comments

Comments
 (0)