Skip to content

Commit 382be84

Browse files
authored
Add transition element (#103)
* check that the order is within allowable range * pass kwargs rather that every element taking a variant * default variant * remove variant test * remove variant from demo * Add transition element * add transition element to docstring
1 parent 128f13a commit 382be84

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+418
-273
lines changed

demo/custom_element.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
class CustomElement(CiarletElement):
99
"""Custom element on a quadrilateral."""
1010

11-
def __init__(self, reference, order, variant):
11+
def __init__(self, reference, order):
1212
zero = sympy.Integer(0)
1313
one = sympy.Integer(1)
1414
half = sympy.Rational(1, 2)

symfem/create.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ def create_reference(cell_type, vertices=None):
111111
raise ValueError(f"Unknown cell type: {cell_type}")
112112

113113

114-
def create_element(cell_type, element_type, order, variant="equispaced"):
114+
def create_element(cell_type, element_type, order, **kwargs):
115115
"""Make a finite element.
116116
117117
Parameters
@@ -172,19 +172,37 @@ def create_element(cell_type, element_type, order, variant="equispaced"):
172172
Bogner-Fox-Schmit, BFS,
173173
Fortin-Soulie, FS,
174174
Bernardi-Raugel,
175-
Wu-Xu
175+
Wu-Xu,
176+
transition
176177
order : int
177178
The order of the element.
178-
variant : str
179-
The arrangement type of the points used the define the space.
180-
181-
Supported values:
182-
equispaced, lobatto, radau, legendre
183179
"""
184180
reference = create_reference(cell_type)
185181

186182
if element_type in _elementmap:
187-
assert reference.name in _elementmap[element_type]
188-
return _elementmap[element_type][reference.name](reference, order, variant=variant)
183+
if reference.name not in _elementmap[element_type]:
184+
raise ValueError(f"{element_type} element cannot be created on a {reference.name}.")
185+
element_class = _elementmap[element_type][reference.name]
186+
if not _order_is_allowed(element_class, reference.name, order):
187+
raise ValueError(f"Order {order} {element_type} element cannot be created.")
188+
return element_class(reference, order, **kwargs)
189189

190190
raise ValueError(f"Unsupported element type: {element_type}")
191+
192+
193+
def _order_is_allowed(element_class, ref, order):
194+
if hasattr(element_class, "min_order"):
195+
if isinstance(element_class.min_order, dict):
196+
if ref in element_class.min_order:
197+
if order < element_class.min_order[ref]:
198+
return False
199+
elif order < element_class.min_order:
200+
return False
201+
if hasattr(element_class, "max_order"):
202+
if isinstance(element_class.max_order, dict):
203+
if ref in element_class.max_order:
204+
if order > element_class.max_order[ref]:
205+
return False
206+
elif order > element_class.max_order:
207+
return False
208+
return True

symfem/elements/argyris.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
class Argyris(CiarletElement):
1616
"""Argyris finite element."""
1717

18-
def __init__(self, reference, order, variant):
18+
def __init__(self, reference, order):
1919
from symfem import create_reference
2020
assert order == 5
2121
assert reference.name == "triangle"

symfem/elements/aw.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
class ArnoldWinther(CiarletElement):
1818
"""An Arnold-Winther element."""
1919

20-
def __init__(self, reference, order, variant):
20+
def __init__(self, reference, order, variant="equispaced"):
2121
from symfem import create_reference
2222
assert reference.name == "triangle"
2323
poly = [(p[0], p[1], p[1], p[2])

symfem/elements/bddm.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,13 @@ def bddf_polyset(reference, order):
3333
class BDDF(CiarletElement):
3434
"""Brezzi-Douglas-Duran-Fortin Hdiv finite element."""
3535

36-
def __init__(self, reference, order, variant):
36+
def __init__(self, reference, order, variant="equispaced"):
3737
poly = bddf_polyset(reference, order)
3838

3939
dofs = make_integral_moment_dofs(
4040
reference,
41-
facets=(NormalIntegralMoment, DiscontinuousLagrange, order),
42-
cells=(IntegralMoment, VectorDiscontinuousLagrange, order - 2),
43-
variant=variant
41+
facets=(NormalIntegralMoment, DiscontinuousLagrange, order, {"variant": variant}),
42+
cells=(IntegralMoment, VectorDiscontinuousLagrange, order - 2, {"variant": variant})
4443
)
4544

4645
super().__init__(reference, order, poly, dofs, reference.tdim, reference.tdim)

symfem/elements/bdfm.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,13 @@ def bdfm_polyset(reference, order):
4747
class BDFM(CiarletElement):
4848
"""Brezzi-Douglas-Fortin-Marini Hdiv finite element."""
4949

50-
def __init__(self, reference, order, variant):
50+
def __init__(self, reference, order, variant="equispaced"):
5151
poly = bdfm_polyset(reference, order)
5252

5353
dofs = make_integral_moment_dofs(
5454
reference,
55-
facets=(NormalIntegralMoment, DiscontinuousLagrange, order - 1),
56-
cells=(IntegralMoment, VectorDiscontinuousLagrange, order - 2),
57-
variant=variant
55+
facets=(NormalIntegralMoment, DiscontinuousLagrange, order - 1, {"variant": variant}),
56+
cells=(IntegralMoment, VectorDiscontinuousLagrange, order - 2, {"variant": variant}),
5857
)
5958

6059
super().__init__(reference, order, poly, dofs, reference.tdim, reference.tdim)

symfem/elements/bdm.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,13 @@
1515
class BDM(CiarletElement):
1616
"""Brezzi-Douglas-Marini Hdiv finite element."""
1717

18-
def __init__(self, reference, order, variant):
18+
def __init__(self, reference, order, variant="equispaced"):
1919
poly = polynomial_set(reference.tdim, reference.tdim, order)
2020

2121
dofs = make_integral_moment_dofs(
2222
reference,
23-
facets=(NormalIntegralMoment, DiscontinuousLagrange, order),
24-
cells=(IntegralMoment, NedelecFirstKind, order - 1),
25-
variant=variant
23+
facets=(NormalIntegralMoment, DiscontinuousLagrange, order, {"variant": variant}),
24+
cells=(IntegralMoment, NedelecFirstKind, order - 1, {"variant": variant}),
2625
)
2726

2827
super().__init__(reference, order, poly, dofs, reference.tdim, reference.tdim)

symfem/elements/bell.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
class Bell(CiarletElement):
1515
"""Bell finite element."""
1616

17-
def __init__(self, reference, order, variant):
17+
def __init__(self, reference, order, variant="equispaced"):
1818
assert reference.name == "triangle"
1919
assert order == 5
2020
dofs = []
@@ -27,8 +27,7 @@ def __init__(self, reference, order, variant):
2727
dofs.append(DerivativePointEvaluation(v, (0, 2), entity=(0, v_n)))
2828
dofs += make_integral_moment_dofs(
2929
reference,
30-
edges=(NormalDerivativeIntegralMoment, DiscontinuousLagrange, 0),
31-
variant=variant
30+
edges=(NormalDerivativeIntegralMoment, DiscontinuousLagrange, 0, {"variant": variant}),
3231
)
3332

3433
super().__init__(

symfem/elements/bernardi_raugel.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
class BernardiRaugel(CiarletElement):
1818
"""Bernardi-Raugel Hdiv finite element."""
1919

20-
def __init__(self, reference, order, variant):
20+
def __init__(self, reference, order):
2121
poly = polynomial_set(reference.tdim, reference.tdim, order)
2222

2323
p = Lagrange(reference, 1, variant="equispaced")
@@ -41,8 +41,8 @@ def __init__(self, reference, order, variant):
4141

4242
dofs += make_integral_moment_dofs(
4343
reference,
44-
facets=(NormalIntegralMoment, DiscontinuousLagrange, 0, "contravariant"),
45-
variant=variant
44+
facets=(NormalIntegralMoment, DiscontinuousLagrange, 0, "contravariant",
45+
{"variant": "equispaced"}),
4646
)
4747

4848
if order > 1:

symfem/elements/bernstein.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def bernstein_polynomials(n, d):
6868
class Bernstein(CiarletElement):
6969
"""Bernstein finite element."""
7070

71-
def __init__(self, reference, order, variant):
71+
def __init__(self, reference, order):
7272

7373
dofs = [
7474
IntegralAgainst(reference, p, entity=(reference.tdim, 0))

0 commit comments

Comments
 (0)