Skip to content

Commit 17eae0d

Browse files
authored
Merge pull request #204 from firedrakeproject/pbrubeck/merge-release-to-main
DO NOT SQUASH: merge release to main
2 parents 924e0c5 + 5882c8a commit 17eae0d

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

finat/quadrature.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
from FIAT.reference_element import LINE, QUADRILATERAL, TENSORPRODUCT
1010
from gem.utils import safe_repr
1111

12-
from finat.point_set import GaussLegendrePointSet, KMVPointSet, PointSet, TensorPointSet
12+
from finat.point_set import (GaussLegendrePointSet, GaussLobattoLegendrePointSet,
13+
KMVPointSet, PointSet, TensorPointSet)
1314

1415

1516
def make_quadrature(ref_el, degree, scheme="default"):
@@ -43,7 +44,13 @@ def make_quadrature(ref_el, degree, scheme="default"):
4344
if degree < 0:
4445
raise ValueError("Need positive degree, not %d" % degree)
4546

46-
if ref_el.get_shape() == LINE and not ref_el.is_macrocell():
47+
if scheme.lower() in {"kmv", "lump"}:
48+
fiat_rule = fiat_scheme(ref_el, degree, "KMV")
49+
if ref_el.get_shape() == LINE:
50+
point_set = GaussLobattoLegendrePointSet(fiat_rule.get_points())
51+
else:
52+
point_set = KMVPointSet(fiat_rule.get_points())
53+
elif ref_el.get_shape() == LINE and not ref_el.is_macrocell():
4754
# FIAT uses Gauss-Legendre line quadature, however, since we
4855
# symbolically label it as such, we wish not to risk attaching
4956
# the wrong label in case FIAT changes. So we explicitly ask
@@ -53,10 +60,7 @@ def make_quadrature(ref_el, degree, scheme="default"):
5360
point_set = GaussLegendrePointSet(fiat_rule.get_points())
5461
else:
5562
fiat_rule = fiat_scheme(ref_el, degree, scheme)
56-
if scheme.lower() == "kmv":
57-
point_set = KMVPointSet(fiat_rule.get_points())
58-
else:
59-
point_set = PointSet(fiat_rule.get_points())
63+
point_set = PointSet(fiat_rule.get_points())
6064

6165
return QuadratureRule(point_set, fiat_rule.get_weights(), ref_el=ref_el, io_ornt_map_tuple=fiat_rule._intrinsic_orientation_permutation_map_tuple)
6266

finat/ufl/elementlist.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,15 @@ def canonical_element_description(family, cell, order, form_degree):
463463
raise ValueError(f"Invalid value rank {value_rank}.")
464464

465465
embedded_degree = order
466-
if any(bubble in family for bubble in ("Guzman-Neilan", "Bernardi-Raugel")):
466+
if family == "Kong-Mulder-Veldhuizen":
467+
if order == 1:
468+
bump = 0
469+
elif tdim == 2 and order < 5:
470+
bump = 1
471+
else:
472+
bump = 2
473+
embedded_degree += bump
474+
elif any(bubble in family for bubble in ("Guzman-Neilan", "Bernardi-Raugel")):
467475
embedded_degree = tdim
476+
468477
return family, short_name, order, reference_value_shape, sobolev_space, mapping, embedded_degree

test/finat/test_create_finat_element.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,17 @@ def test_quadrilateral_variant_spectral_dq_l2():
141141
assert isinstance(element.product.factors[1], finat.GaussLegendre)
142142

143143

144+
@pytest.mark.parametrize("cell, degree",
145+
[(ufl.triangle, p) for p in range(1, 7)]
146+
+ [(ufl.tetrahedron, p) for p in range(1, 4)])
147+
def test_kmv(cell, degree):
148+
ufl_element = finat.ufl.FiniteElement('KMV', cell, degree)
149+
finat_element = create_element(ufl_element)
150+
assert ufl_element.degree() == degree
151+
assert ufl_element.embedded_superdegree == finat_element.degree
152+
assert (finat_element.degree > degree) or (degree == 1)
153+
154+
144155
def test_cache_hit(ufl_element):
145156
A = create_element(ufl_element)
146157
B = create_element(ufl_element)

0 commit comments

Comments
 (0)