Skip to content

Commit 9115573

Browse files
authored
Merge pull request #22 from mscroggs/bubble
Add bubble element
2 parents 55e3630 + 89d005e commit 9115573

File tree

4 files changed

+57
-6
lines changed

4 files changed

+57
-6
lines changed

symfem/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def create_element(cell_type, element_type, order):
9191
Nedelec2, N2curl, Raviart-Thomas, RT, N1div, dQ, NCE, RTCE,
9292
Qcurl, Q, NCF, RTCF, Qdiv, vector Q, vQ,
9393
Brezzi-Douglas-Marini, BDM, N2div, Morley, Hermite,
94-
Mardal-Tai-Winther, MTW, Argyris
94+
Mardal-Tai-Winther, MTW, Argyris, bubble
9595
order : int
9696
The order of the element.
9797
"""

symfem/elements/bubble.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"""Bubble elements on simplices."""
2+
3+
import sympy
4+
from itertools import product
5+
from ..core.symbolic import x
6+
from ..core.finite_element import FiniteElement
7+
from ..core.polynomials import polynomial_set
8+
from ..core.functionals import PointEvaluation
9+
10+
11+
class Bubble(FiniteElement):
12+
"""Bubble finite element."""
13+
14+
def __init__(self, reference, order):
15+
if reference.name == "interval":
16+
poly = [x[0] * (1 - x[0]) * p for p in polynomial_set(reference.tdim, 1, order - 2)]
17+
elif reference.name == "triangle":
18+
poly = [x[0] * x[1] * (1 - x[0] - x[1]) * p
19+
for p in polynomial_set(reference.tdim, 1, order - 3)]
20+
else:
21+
assert reference.name == "tetrahedron"
22+
poly = [x[0] * x[1] * x[2] * (1 - x[0] - x[1] - x[2]) * p
23+
for p in polynomial_set(reference.tdim, 1, order - 4)]
24+
25+
dofs = []
26+
for i in product(range(1, order), repeat=reference.tdim):
27+
if sum(i) < order:
28+
dofs.append(
29+
PointEvaluation(
30+
tuple(o + sum(sympy.Rational(a[j] * b, order)
31+
for a, b in zip(reference.axes, i))
32+
for j, o in enumerate(reference.origin)),
33+
entity_dim=reference.tdim))
34+
35+
super().__init__(
36+
reference, poly, dofs, reference.tdim, 1
37+
)
38+
39+
names = ["bubble"]
40+
references = ["interval", "triangle", "tetrahedron"]
41+
min_order = {"interval": 2, "triangle": 3, "tetrahedron": 4}

symfem/elements/q.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def __init__(self, reference, order):
4444
1)
4545

4646
names = ["Q"]
47-
references = ["quadrilateral", "hexahedron"]
47+
references = ["interval", "quadrilateral", "hexahedron"]
4848
min_order = 0
4949

5050

@@ -71,7 +71,7 @@ def __init__(self, reference, order):
7171
1)
7272

7373
names = ["dQ"]
74-
references = ["quadrilateral", "hexahedron"]
74+
references = ["interval", "quadrilateral", "hexahedron"]
7575
min_order = 0
7676

7777

test/test_all_elements.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,20 @@ def handler(signum, frame):
1313

1414
elements = []
1515
for e in _elementlist:
16-
min_o = e.min_order if hasattr(e, "min_order") else 0
17-
max_o = min(5, e.max_order) if hasattr(e, "max_order") else 5
1816
for r in e.references:
19-
for order in range(min_o, max_o + 1):
17+
if hasattr(e, "min_order"):
18+
min_o = e.min_order
19+
if isinstance(min_o, dict):
20+
min_o = min_o[r]
21+
else:
22+
min_o = 0
23+
if hasattr(e, "max_order"):
24+
max_o = e.max_order
25+
if isinstance(max_o, dict):
26+
max_o = max_o[r]
27+
else:
28+
max_o = 100
29+
for order in range(min_o, min(5, max_o) + 1):
2030
elements.append((r, e.names[0], order))
2131

2232

0 commit comments

Comments
 (0)