Skip to content

Commit 12a2b18

Browse files
authored
Merge pull request #11 from mscroggs/regge
Regge
2 parents f79fa07 + f64434c commit 12a2b18

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed

symfem/functionals.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,37 @@ def entity_dim(self):
4747
name = "Point evaluation"
4848

4949

50+
class PointInnerProduct(BaseFunctional):
51+
"""An evaluation of an inner product at a point."""
52+
53+
def __init__(self, point, vec, entity_dim=None):
54+
self.point = point
55+
self.vec = vec
56+
self._entity_dim = entity_dim
57+
58+
def eval(self, function):
59+
"""Apply to the functional to a function."""
60+
v = subs(function, x, self.point)
61+
tdim = len(self.vec)
62+
return vdot(self.vec,
63+
tuple(vdot(v[tdim * i: tdim * (i + 1)], self.vec)
64+
for i in range(0, tdim)))
65+
66+
def dof_point(self):
67+
"""Get the location of the DOF in the cell."""
68+
return self.point
69+
70+
def dof_direction(self):
71+
"""Get the location of the DOF in the cell."""
72+
return self.vec
73+
74+
def entity_dim(self):
75+
"""Get the dimension of the entitiy this DOF is associated with."""
76+
return self._entity_dim
77+
78+
name = "Point inner product"
79+
80+
5081
class DotPointEvaluation(BaseFunctional):
5182
"""A point evaluation in a given direction."""
5283

symfem/simplex.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
TangentIntegralMoment,
1212
NormalIntegralMoment,
1313
IntegralMoment,
14+
PointInnerProduct
1415
)
1516

1617

@@ -229,3 +230,38 @@ def __init__(self, reference, order):
229230

230231
names = ["Crouzeix-Raviart", "CR"]
231232
min_order = 1
233+
234+
235+
class Regge(FiniteElement):
236+
"""A Regge element."""
237+
238+
def __init__(self, reference, order):
239+
assert reference.name in ["triangle", "tetrahedron"]
240+
if reference.tdim == 2:
241+
poly = [(p[0], p[1], p[1], p[2])
242+
for p in polynomial_set(reference.tdim, 3, order)]
243+
if reference.tdim == 3:
244+
poly = [(p[0], p[1], p[3], p[1], p[2], p[4], p[3], p[4], p[5])
245+
for p in polynomial_set(reference.tdim, 6, order)]
246+
247+
dofs = []
248+
for edim in range(1, 4):
249+
for vs in reference.sub_entities(edim):
250+
entity = reference.sub_entity_types[edim](
251+
vertices=tuple(reference.reference_vertices[i] for i in vs)
252+
)
253+
for i in product(range(1, order + 2), repeat=edim):
254+
if sum(i) < order + 2:
255+
for edge in entity.edges[::-1]:
256+
tangent = [b - a for a, b in zip(entity.vertices[edge[0]],
257+
entity.vertices[edge[1]])]
258+
dofs.append(PointInnerProduct(
259+
tuple(o + sum(sympy.Rational(a[j] * b, order + 2)
260+
for a, b in zip(entity.axes, i[::-1]))
261+
for j, o in enumerate(entity.origin)),
262+
tangent, entity_dim=edim))
263+
264+
super().__init__(reference, poly, dofs, reference.tdim, reference.tdim ** 2)
265+
266+
names = ["Regge"]
267+
min_order = 0

test/test_against_basix.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
("N2curl", "Nedelec 2nd kind H(curl)", range(1, 4)),
1111
("N1div", "Raviart-Thomas", range(1, 4)),
1212
("N2div", "Brezzi-Douglas-Marini", range(1, 4)),
13+
("Regge", "Regge", range(0, 4)),
1314
("Crouzeix-Raviart", "Crouzeix-Raviart", [1])],
1415
"tetrahedron": [("P", "Lagrange", range(1, 4)), ("dP", "Discontinuous Lagrange", range(1, 4)),
1516
("N1curl", "Nedelec 1st kind H(curl)", range(1, 3)),
1617
("N2curl", "Nedelec 2nd kind H(curl)", range(1, 3)),
1718
("N1div", "Raviart-Thomas", range(1, 3)),
1819
("N2div", "Brezzi-Douglas-Marini", range(1, 3)),
20+
("Regge", "Regge", range(0, 3)),
1921
("Crouzeix-Raviart", "Crouzeix-Raviart", [1])],
2022
"quadrilateral": [("Q", "Lagrange", range(1, 4)), ("dQ", "Discontinuous Lagrange", range(1, 4))],
2123
"hexahedron": [("Q", "Lagrange", range(1, 4)), ("dQ", "Discontinuous Lagrange", range(1, 4))]

0 commit comments

Comments
 (0)