From 2793f550d88ef44fdb70d3193912019de5fa0a87 Mon Sep 17 00:00:00 2001 From: Matthew Scroggs Date: Wed, 17 Jun 2026 08:41:21 +0100 Subject: [PATCH 1/9] add test that asserts reference cell numbering follows DefElement conventions --- test/test_cell.py | 47 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/test/test_cell.py b/test/test_cell.py index 3748d4bec..173b666fa 100644 --- a/test/test_cell.py +++ b/test/test_cell.py @@ -7,21 +7,22 @@ import basix -cells = ["triangle", "quadrilateral", "tetrahedron", "hexahedron", "pyramid", "prism"] - - -@pytest.mark.parametrize("cell", cells) -def test_volume(cell): +cells = ["interval", "triangle", "quadrilateral", "tetrahedron", "hexahedron", "pyramid", "prism"] + + +@pytest.mark.parametrize(("cell", "volume"), [ + ("point", 0), + ("interval", 1), + ("triangle", 1 / 2), + ("quadrilateral", 1), + ("tetrahedron", 1 / 6), + ("hexahedron", 1), + ("pyramid", 1 / 3), + ("prism", 1 / 2), +]) +def test_volume(cell, volume): cell_type = getattr(basix.CellType, cell) - volumes = { - "triangle": 1 / 2, - "quadrilateral": 1, - "tetrahedron": 1 / 6, - "hexahedron": 1, - "pyramid": 1 / 3, - "prism": 1 / 2, - } - assert np.isclose(basix.cell.volume(cell_type), volumes[cell]) + assert np.isclose(basix.cell.volume(cell_type), volume) @pytest.mark.parametrize("cell", cells) @@ -141,3 +142,21 @@ def test_edge_jacobian_3D_simplex(cell): points = geom[edge] reference_edge_jacobian = (points[1:2, :] - points[0:1, :]).T np.testing.assert_allclose(reference_edge_jacobian, edge_jacobian[i]) + + +@pytest.mark.parametrize("cell", cells) +def test_cell_ordering_conventions(cell): + cell_type = getattr(basix.CellType, cell) + + # Assert that points in geometry are ordered following a consistent convention + geometry = basix.geometry(cell_type) + for i, pt in enumerate(geometry): + for pt2 in geometry[i + 1:]: + assert tuple(pt[::-1]) < tuple(pt2[::-1]) + + # Assert that entities in topology are ordered following a consistent convention + topology = basix.topology(cell_type) + for entities in topology: + for i, e in enumerate(entities): + for e2 in entities[i + 1:]: + assert tuple(e) < tuple(e2) From cfc46f0eb263edacb68ea45e0330435e7937dc20 Mon Sep 17 00:00:00 2001 From: Matthew Scroggs Date: Wed, 17 Jun 2026 08:50:38 +0100 Subject: [PATCH 2/9] update convention for triangle cell --- cpp/basix/cell.cpp | 6 +++--- test/test_cell.py | 40 ++++++++++++++++++++++------------------ test/test_numba.py | 1 - 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/cpp/basix/cell.cpp b/cpp/basix/cell.cpp index 0c2db4851..ae0d99037 100644 --- a/cpp/basix/cell.cpp +++ b/cpp/basix/cell.cpp @@ -63,7 +63,7 @@ std::vector>> cell::topology(cell::type celltype) // Vertices t[0] = {{0}, {1}, {2}}; // Edges - t[1] = {{1, 2}, {0, 2}, {0, 1}}; + t[1] = {{0, 1}, {0, 2}, {1, 2}}; // Cell t[2] = {{0, 1, 2}}; return t; @@ -159,9 +159,9 @@ cell::sub_entity_connectivity(cell::type celltype) { std::vector>>> t(3); // Vertices - t[0] = {{{0}, {1, 2}, {0}}, {{1}, {0, 2}, {0}}, {{2}, {0, 1}, {0}}}; + t[0] = {{{0}, {0, 1}, {0}}, {{1}, {0, 2}, {0}}, {{2}, {1, 2}, {0}}}; // Edges - t[1] = {{{1, 2}, {0}, {0}}, {{0, 2}, {1}, {0}}, {{0, 1}, {2}, {0}}}; + t[1] = {{{0, 1}, {0}, {0}}, {{0, 2}, {1}, {0}}, {{1, 2}, {2}, {0}}}; // Face t[2] = {{{0, 1, 2}, {0, 1, 2}, {0}}}; return t; diff --git a/test/test_cell.py b/test/test_cell.py index 173b666fa..a16e321ad 100644 --- a/test/test_cell.py +++ b/test/test_cell.py @@ -10,16 +10,19 @@ cells = ["interval", "triangle", "quadrilateral", "tetrahedron", "hexahedron", "pyramid", "prism"] -@pytest.mark.parametrize(("cell", "volume"), [ - ("point", 0), - ("interval", 1), - ("triangle", 1 / 2), - ("quadrilateral", 1), - ("tetrahedron", 1 / 6), - ("hexahedron", 1), - ("pyramid", 1 / 3), - ("prism", 1 / 2), -]) +@pytest.mark.parametrize( + ("cell", "volume"), + [ + ("point", 0), + ("interval", 1), + ("triangle", 1 / 2), + ("quadrilateral", 1), + ("tetrahedron", 1 / 6), + ("hexahedron", 1), + ("pyramid", 1 / 3), + ("prism", 1 / 2), + ], +) def test_volume(cell, volume): cell_type = getattr(basix.CellType, cell) assert np.isclose(basix.cell.volume(cell_type), volume) @@ -95,12 +98,12 @@ def test_sub_entity_type(): def test_facet_jacobians_2D_simplex(): cell = basix.cell.CellType.triangle facet_jacobian = basix.cell.facet_jacobians(cell) + facets = basix.cell.topology(cell)[1] reference_vertices = np.array([[0.0, 0.0], [1.0, 0.0], [0.0, 1.0]]) mask = np.zeros(3, dtype=np.bool_) - for i in range(3): - mask[:] = True - mask[i] = False + for i, edge in enumerate(facets): + mask[:] = [j in edge for j in range(3)] facet = reference_vertices[mask] reference_facet_jacobian = -facet[0:1, :].T + facet[1:2, :].T @@ -110,15 +113,16 @@ def test_facet_jacobians_2D_simplex(): def test_facet_jacobians_3D_simplex(): cell = basix.cell.CellType.tetrahedron facet_jacobian = basix.cell.facet_jacobians(cell) + facets = basix.cell.topology(cell)[2] reference_vertices = np.array( [[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]] ) mask = np.zeros(4, dtype=np.bool_) - for i in range(4): - mask[:] = True - mask[i] = False + for i, edge in enumerate(facets): + mask[:] = [j in edge for j in range(4)] facet = reference_vertices[mask] + print(facet) reference_facet_jacobian = np.array([-facet[0] + facet[1], -facet[0] + facet[2]]).T np.testing.assert_allclose(reference_facet_jacobian, facet_jacobian[i]) @@ -151,12 +155,12 @@ def test_cell_ordering_conventions(cell): # Assert that points in geometry are ordered following a consistent convention geometry = basix.geometry(cell_type) for i, pt in enumerate(geometry): - for pt2 in geometry[i + 1:]: + for pt2 in geometry[i + 1 :]: assert tuple(pt[::-1]) < tuple(pt2[::-1]) # Assert that entities in topology are ordered following a consistent convention topology = basix.topology(cell_type) for entities in topology: for i, e in enumerate(entities): - for e2 in entities[i + 1:]: + for e2 in entities[i + 1 :]: assert tuple(e) < tuple(e2) diff --git a/test/test_numba.py b/test/test_numba.py index 6661fc628..48ee5b10d 100644 --- a/test/test_numba.py +++ b/test/test_numba.py @@ -37,7 +37,6 @@ ) @pytest.mark.parametrize("block_size", [1, 2, 4]) def test_dof_transformations(cell, element, degree, element_args, block_size): - transform_functions = { CellType.triangle: numba_helpers.T_apply_triangle, CellType.quadrilateral: numba_helpers.T_apply_quadrilateral, From 5bbb919f7330eaae2424c45f8e88ce02a3bb5fa1 Mon Sep 17 00:00:00 2001 From: Matthew Scroggs Date: Wed, 17 Jun 2026 08:56:09 +0100 Subject: [PATCH 3/9] update convention for tets --- cpp/basix/cell.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/cpp/basix/cell.cpp b/cpp/basix/cell.cpp index ae0d99037..eb5bc1f84 100644 --- a/cpp/basix/cell.cpp +++ b/cpp/basix/cell.cpp @@ -85,9 +85,9 @@ std::vector>> cell::topology(cell::type celltype) // Vertices t[0] = {{0}, {1}, {2}, {3}}; // Edges - t[1] = {{2, 3}, {1, 3}, {1, 2}, {0, 3}, {0, 2}, {0, 1}}; + t[1] = {{0, 1}, {0, 2}, {0, 3}, {1, 2}, {1, 3}, {2, 3}}; // Faces - t[2] = {{1, 2, 3}, {0, 2, 3}, {0, 1, 3}, {0, 1, 2}}; + t[2] = {{0, 1, 2}, {0, 1, 3}, {0, 2, 3}, {1, 2, 3}}; // Cell t[3] = {{0, 1, 2, 3}}; return t; @@ -187,21 +187,21 @@ cell::sub_entity_connectivity(cell::type celltype) { std::vector>>> t(4); // Vertices - t[0] = {{{0}, {3, 4, 5}, {1, 2, 3}, {0}}, - {{1}, {1, 2, 5}, {0, 2, 3}, {0}}, - {{2}, {0, 2, 4}, {0, 1, 3}, {0}}, - {{3}, {0, 1, 3}, {0, 1, 2}, {0}}}; + t[0] = {{{0}, {0, 1, 2}, {0, 1, 2}, {0}}, + {{1}, {0, 3, 4}, {0, 1, 3}, {0}}, + {{2}, {1, 3, 5}, {0, 2, 3}, {0}}, + {{3}, {2, 4, 5}, {1, 2, 3}, {0}}}; // Edges t[1] = { - {{2, 3}, {0}, {0, 1}, {0}}, {{1, 3}, {1}, {0, 2}, {0}}, - {{1, 2}, {2}, {0, 3}, {0}}, {{0, 3}, {3}, {1, 2}, {0}}, - {{0, 2}, {4}, {1, 3}, {0}}, {{0, 1}, {5}, {2, 3}, {0}}, + {{0, 1}, {0}, {0, 1}, {0}}, {{0, 2}, {1}, {0, 2}, {0}}, + {{0, 3}, {2}, {1, 2}, {0}}, {{1, 2}, {3}, {0, 3}, {0}}, + {{1, 3}, {4}, {1, 3}, {0}}, {{2, 3}, {5}, {2, 3}, {0}}, }; // Faces - t[2] = {{{1, 2, 3}, {0, 1, 2}, {0}, {0}}, - {{0, 2, 3}, {0, 3, 4}, {1}, {0}}, - {{0, 1, 3}, {1, 3, 5}, {2}, {0}}, - {{0, 1, 2}, {2, 4, 5}, {3}, {0}}}; + t[2] = {{{0, 1, 2}, {0, 1, 3}, {0}, {0}}, + {{0, 1, 3}, {0, 2, 4}, {1}, {0}}, + {{0, 2, 3}, {1, 2, 5}, {2}, {0}}, + {{1, 2, 3}, {3, 4, 5}, {3}, {0}}}; // Volume t[3] = {{{0, 1, 2, 3}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3}, {0}}}; return t; From bbf719919aa48497ee77a00a3728bd3e31f01609 Mon Sep 17 00:00:00 2001 From: Matthew Scroggs Date: Wed, 17 Jun 2026 13:00:08 +0100 Subject: [PATCH 4/9] updating tests --- cpp/basix/dof-transformations.cpp | 35 +- test/test_bernstein.py | 12 +- test/test_continuity.py | 8 +- test/test_custom_element.py | 10 +- test/test_dof_transformations.py | 32 +- test/test_lagrange.py | 544 +++++++++--------- test/test_nedelec.py | 896 +++--------------------------- test/test_nedelec_second_kind.py | 381 +------------ test/test_rt.py | 891 ++--------------------------- 9 files changed, 501 insertions(+), 2308 deletions(-) diff --git a/cpp/basix/dof-transformations.cpp b/cpp/basix/dof-transformations.cpp index c398740f1..a8df682d9 100644 --- a/cpp/basix/dof-transformations.cpp +++ b/cpp/basix/dof-transformations.cpp @@ -85,13 +85,15 @@ mapinfo_t get_mapinfo(cell::type cell_type) { mapinfo_t mapinfo; auto& data = mapinfo.try_emplace(cell::type::interval).first->second; - auto map = [](auto pt) -> std::array { return {pt[1], pt[0], 0}; }; + auto map = [](auto pt) -> std::array { + return {1 - pt[0], pt[1], 0}; + }; mdex::mdarray> J( - md::extents{}, {0., 1., 1., 0.}); + md::extents{}, {-1., 0., 0., 1.}); T detJ = -1; mdex::mdarray> K( - md::extents{}, {0., 1., 1., 0.}); + md::extents{}, {-1., 0., 0., 1.}); data.push_back(std::tuple(map, J, detJ, K)); return mapinfo; } @@ -115,45 +117,48 @@ mapinfo_t get_mapinfo(cell::type cell_type) mapinfo_t mapinfo; { auto& data = mapinfo.try_emplace(cell::type::interval).first->second; - auto map - = [](auto pt) -> std::array { return {pt[0], pt[2], pt[1]}; }; + auto map = [](auto pt) -> std::array { + return {1 - pt[0], pt[1], pt[2]}; + }; mdex::mdarray> J( md::extents{}, - {1., 0., 0., 0., 0., 1., 0., 1., 0.}); + {-1., 0., 0., 0., 1., 0., 0., 0., 1.}); T detJ = -1.0; mdex::mdarray> K( md::extents{}, - {1., 0., 0., 0., 0., 1., 0., 1., 0.}); + {-1., 0., 0., 0., 1., 0., 0., 0., 1.}); data.push_back(std::tuple(map, J, detJ, K)); } { auto& data = mapinfo.try_emplace(cell::type::triangle).first->second; { - auto map - = [](auto pt) -> std::array { return {pt[2], pt[0], pt[1]}; }; + auto map = [](auto pt) -> std::array { + return {1 - pt[0] - pt[1], pt[0], pt[2]}; + }; mdex::mdarray> J( md::extents{}, - {0., 1., 0., 0., 0., 1., 1., 0., 0.}); + {-1., 1., 0., -1., 0., 0., 0., 0., 1.}); T detJ = 1.0; mdex::mdarray> K( md::extents{}, - {0., 0., 1., 1., 0., 0., 0., 1., 0.}); + {0., -1., 0., 1., -1., 0., 0., 0., 1.}); data.push_back(std::tuple(map, J, detJ, K)); } { - auto map - = [](auto pt) -> std::array { return {pt[0], pt[2], pt[1]}; }; + auto map = [](auto pt) -> std::array { + return {pt[1], pt[0], pt[2]}; + }; mdex::mdarray> J( md::extents{}, - {1., 0., 0., 0., 0., 1., 0., 1., 0.}); + {0., 1., 0., 1., 0., 0., 0., 0., 1.}); T detJ = -1.0; mdex::mdarray> K( md::extents{}, - {1., 0., 0., 0., 0., 1., 0., 1., 0.}); + {0., 1., 0., 1., 0., 0., 0., 0., 1.}); data.push_back(std::tuple(map, J, detJ, K)); } } diff --git a/test/test_bernstein.py b/test/test_bernstein.py index 3b3a15225..72dd90a59 100644 --- a/test/test_bernstein.py +++ b/test/test_bernstein.py @@ -106,21 +106,21 @@ def get_bernstein_polynomials_entity_order(celltype, degree): (1 - x - y) ** 2, x**2, y**2, - 2 * x * y, - 2 * y * (1 - x - y), 2 * x * (1 - x - y), + 2 * y * (1 - x - y), + 2 * x * y, ] if degree == 3: return [ (1 - x - y) ** 3, x**3, y**3, - 3 * x**2 * y, - 3 * x * y**2, - 3 * y * (1 - x - y) ** 2, - 3 * y**2 * (1 - x - y), 3 * x * (1 - x - y) ** 2, 3 * x**2 * (1 - x - y), + 3 * y * (1 - x - y) ** 2, + 3 * y**2 * (1 - x - y), + 3 * x**2 * y, + 3 * x * y**2, 6 * x * y * (1 - x - y), ] raise NotImplementedError() diff --git a/test/test_continuity.py b/test/test_continuity.py index 5797466db..162c0ee12 100644 --- a/test/test_continuity.py +++ b/test/test_continuity.py @@ -72,7 +72,7 @@ def test_continuity_interval_facet(degree, element, variant): [ np.array([0, 0]), np.array([1, 0]), - {basix.CellType.triangle: 2, basix.CellType.quadrilateral: 0}, + {basix.CellType.triangle: 0, basix.CellType.quadrilateral: 0}, ], [ np.array([0, 0]), @@ -114,19 +114,19 @@ def test_continuity_triangle_facet(degree, element, variant): np.array([0, 0, 0]), np.array([1, 0, 0]), np.array([0, 1, 0]), - {basix.CellType.tetrahedron: 3, basix.CellType.prism: 0}, + {basix.CellType.tetrahedron: 0, basix.CellType.prism: 0}, ], [ np.array([0, 0, 0]), np.array([1, 0, 0]), np.array([0, 0, 1]), - {basix.CellType.tetrahedron: 2, basix.CellType.pyramid: 1}, + {basix.CellType.tetrahedron: 1, basix.CellType.pyramid: 1}, ], [ np.array([0, 0, 0]), np.array([0, 1, 0]), np.array([0, 0, 1]), - {basix.CellType.tetrahedron: 1, basix.CellType.pyramid: 2}, + {basix.CellType.tetrahedron: 2, basix.CellType.pyramid: 2}, ], ] diff --git a/test/test_custom_element.py b/test/test_custom_element.py index fe41c460d..9e5347973 100644 --- a/test/test_custom_element.py +++ b/test/test_custom_element.py @@ -88,9 +88,9 @@ def test_lagrange_custom_triangle_degree4(): x = [ [np.array([[0.0, 0.0]]), np.array([[1.0, 0.0]]), np.array([[0.0, 1.0]])], [ - np.array([[0.75, 0.25], [0.5, 0.5], [0.25, 0.75]]), - np.array([[0.0, 0.25], [0.0, 0.5], [0.0, 0.75]]), np.array([[0.25, 0.0], [0.5, 0.0], [0.75, 0.0]]), + np.array([[0.0, 0.25], [0.0, 0.5], [0.0, 0.75]]), + np.array([[0.75, 0.25], [0.5, 0.5], [0.25, 0.75]]), ], [np.array([[0.25, 0.25], [0.5, 0.25], [0.25, 0.5]])], [], @@ -195,15 +195,15 @@ def test_raviart_thomas_triangle_degree1(): x = [[], [], [], []] for _ in range(3): x[0].append(np.zeros((0, 2))) - x[1].append(np.array([[1 - p[0], p[0]] for p in pts])) - x[1].append(np.array([[0, p[0]] for p in pts])) x[1].append(np.array([[p[0], 0] for p in pts])) + x[1].append(np.array([[0, p[0]] for p in pts])) + x[1].append(np.array([[1 - p[0], p[0]] for p in pts])) x[2].append(np.zeros((0, 2))) M = [[], [], [], []] for _ in range(3): M[0].append(np.zeros((0, 2, 0, 1))) - for normal in [[-1, -1], [-1, 0], [0, 1]]: + for normal in [[0, 1], [-1, 0], [-1, -1]]: mat = np.empty((1, 2, len(wts), 1)) mat[0, 0, :, 0] = normal[0] * wts mat[0, 1, :, 0] = normal[1] * wts diff --git a/test/test_dof_transformations.py b/test/test_dof_transformations.py index 9463254e2..2854b9680 100644 --- a/test/test_dof_transformations.py +++ b/test/test_dof_transformations.py @@ -144,10 +144,10 @@ def test_transformation_of_tabulated_data_triangle(element_type, degree, element points = np.array([[i / N, j / N] for i in range(N + 1) for j in range(N + 1 - i)]) values = e.tabulate(0, points)[0] - start = sum(e.num_entity_dofs[0]) - ndofs = e.num_entity_dofs[1][0] + start = sum(e.num_entity_dofs[0]) + sum(e.num_entity_dofs[1][:2]) + ndofs = e.num_entity_dofs[1][2] if ndofs != 0: - # Check that the 0th transformation undoes the effect of reflecting edge 0 + # Check that the 2nd transformation undoes the effect of reflecting edge 2 reflected_points = np.array([[p[1], p[0]] for p in points]) reflected_values = e.tabulate(0, reflected_points)[0] @@ -161,7 +161,7 @@ def test_transformation_of_tabulated_data_triangle(element_type, degree, element i_slice = i[:, d] j_slice = j[:, d] assert np.allclose( - (bt[0].dot(i_slice))[start : start + ndofs], j_slice[start : start + ndofs] + (bt[2].dot(i_slice))[start : start + ndofs], j_slice[start : start + ndofs] ) @@ -211,11 +211,11 @@ def test_transformation_of_tabulated_data_tetrahedron(element_type, degree, elem ) values = e.tabulate(0, points)[0] - start = sum(e.num_entity_dofs[0]) - ndofs = e.num_entity_dofs[1][0] + start = sum(e.num_entity_dofs[0]) + sum(e.num_entity_dofs[1][:5]) + ndofs = e.num_entity_dofs[1][5] if ndofs != 0: - # Check that the 0th transformation undoes the effect of - # reflecting edge 0 + # Check that the 5th transformation undoes the effect of + # reflecting edge 5 reflected_points = np.array([[p[0], p[2], p[1]] for p in points]) reflected_values = e.tabulate(0, reflected_points)[0] _J = np.array([[1, 0, 0], [0, 0, 1], [0, 1, 0]]) @@ -228,14 +228,14 @@ def test_transformation_of_tabulated_data_tetrahedron(element_type, degree, elem i_slice = i[:, d] j_slice = j[:, d] assert np.allclose( - (bt[0].dot(i_slice))[start : start + ndofs], j_slice[start : start + ndofs] + (bt[5].dot(i_slice))[start : start + ndofs], j_slice[start : start + ndofs] ) - start = sum(e.num_entity_dofs[0]) + sum(e.num_entity_dofs[1]) - ndofs = e.num_entity_dofs[2][0] + start = sum(e.num_entity_dofs[0]) + sum(e.num_entity_dofs[1]) + sum(e.num_entity_dofs[2][:3]) + ndofs = e.num_entity_dofs[2][3] if ndofs != 0: - # Check that the 6th transformation undoes the effect of - # rotating face 0 + # Check that the 12th transformation undoes the effect of + # rotating face 3 rotated_points = np.array([[p[2], p[0], p[1]] for p in points]) rotated_values = e.tabulate(0, rotated_points)[0] @@ -249,11 +249,11 @@ def test_transformation_of_tabulated_data_tetrahedron(element_type, degree, elem i_slice = i[:, d] j_slice = j[:, d] assert np.allclose( - bt[6].dot(i_slice)[start : start + ndofs], j_slice[start : start + ndofs] + bt[12].dot(i_slice)[start : start + ndofs], j_slice[start : start + ndofs] ) if ndofs != 0: - # Check that the 7th transformation undoes the effect of reflecting face 0 + # Check that the 13th transformation undoes the effect of reflecting face 3 reflected_points = np.array([[p[0], p[2], p[1]] for p in points]) reflected_values = e.tabulate(0, reflected_points)[0] _J = np.array([[1, 0, 0], [0, 0, 1], [0, 1, 0]]) @@ -266,7 +266,7 @@ def test_transformation_of_tabulated_data_tetrahedron(element_type, degree, elem i_slice = i[:, d] j_slice = j[:, d] assert np.allclose( - (bt[7].dot(i_slice))[start : start + ndofs], j_slice[start : start + ndofs] + (bt[13].dot(i_slice))[start : start + ndofs], j_slice[start : start + ndofs] ) diff --git a/test/test_lagrange.py b/test/test_lagrange.py index 4c7a2caf8..88bd3b0a6 100644 --- a/test/test_lagrange.py +++ b/test/test_lagrange.py @@ -65,9 +65,9 @@ def sympy_lagrange(celltype, n): 2 * x**2 + 4 * x * y - 3 * x + 2 * y**2 - 3 * y + 1, 2 * x**2 - x, 2 * y**2 - y, - 4 * x * y, - -4 * x * y - 4 * y**2 + 4 * y, -4 * x**2 - 4 * x * y + 4 * x, + -4 * x * y - 4 * y**2 + 4 * y, + 4 * x * y, ] if n == 3: return [ @@ -83,15 +83,6 @@ def sympy_lagrange(celltype, n): + 1, 9 * x**3 / 2 - 9 * x**2 / 2 + x, 9 * y**3 / 2 - 9 * y**2 / 2 + y, - 27 * x**2 * y / 2 - 9 * x * y / 2, - 27 * x * y**2 / 2 - 9 * x * y / 2, - 27 * x**2 * y / 2 - + 27 * x * y**2 - - 45 * x * y / 2 - + 27 * y**3 / 2 - - 45 * y**2 / 2 - + 9 * y, - -27 * x * y**2 / 2 + 9 * x * y / 2 - 27 * y**3 / 2 + 18 * y**2 - 9 * y / 2, 27 * x**3 / 2 + 27 * x**2 * y - 45 * x**2 / 2 @@ -99,6 +90,15 @@ def sympy_lagrange(celltype, n): - 45 * x * y / 2 + 9 * x, -27 * x**3 / 2 - 27 * x**2 * y / 2 + 18 * x**2 + 9 * x * y / 2 - 9 * x / 2, + 27 * x**2 * y / 2 + + 27 * x * y**2 + - 45 * x * y / 2 + + 27 * y**3 / 2 + - 45 * y**2 / 2 + + 9 * y, + -27 * x * y**2 / 2 + 9 * x * y / 2 - 27 * y**3 / 2 + 18 * y**2 - 9 * y / 2, + 27 * x**2 * y / 2 - 9 * x * y / 2, + 27 * x * y**2 / 2 - 9 * x * y / 2, -27 * x**2 * y - 27 * x * y**2 + 27 * x * y, ] if n == 4: @@ -120,35 +120,6 @@ def sympy_lagrange(celltype, n): + 1, 32 * x**4 / 3 - 16 * x**3 + 22 * x**2 / 3 - x, 32 * y**4 / 3 - 16 * y**3 + 22 * y**2 / 3 - y, - 128 * x**3 * y / 3 - 32 * x**2 * y + 16 * x * y / 3, - 64 * x**2 * y**2 - 16 * x**2 * y - 16 * x * y**2 + 4 * x * y, - 128 * x * y**3 / 3 - 32 * x * y**2 + 16 * x * y / 3, - -128 * x**3 * y / 3 - - 128 * x**2 * y**2 - + 96 * x**2 * y - - 128 * x * y**3 - + 192 * x * y**2 - - 208 * x * y / 3 - - 128 * y**4 / 3 - + 96 * y**3 - - 208 * y**2 / 3 - + 16 * y, - 64 * x**2 * y**2 - - 16 * x**2 * y - + 128 * x * y**3 - - 144 * x * y**2 - + 28 * x * y - + 64 * y**4 - - 128 * y**3 - + 76 * y**2 - - 12 * y, - -128 * x * y**3 / 3 - + 32 * x * y**2 - - 16 * x * y / 3 - - 128 * y**4 / 3 - + 224 * y**3 / 3 - - 112 * y**2 / 3 - + 16 * y / 3, -128 * x**4 / 3 - 128 * x**3 * y + 96 * x**3 @@ -175,6 +146,35 @@ def sympy_lagrange(celltype, n): - 112 * x**2 / 3 - 16 * x * y / 3 + 16 * x / 3, + -128 * x**3 * y / 3 + - 128 * x**2 * y**2 + + 96 * x**2 * y + - 128 * x * y**3 + + 192 * x * y**2 + - 208 * x * y / 3 + - 128 * y**4 / 3 + + 96 * y**3 + - 208 * y**2 / 3 + + 16 * y, + 64 * x**2 * y**2 + - 16 * x**2 * y + + 128 * x * y**3 + - 144 * x * y**2 + + 28 * x * y + + 64 * y**4 + - 128 * y**3 + + 76 * y**2 + - 12 * y, + -128 * x * y**3 / 3 + + 32 * x * y**2 + - 16 * x * y / 3 + - 128 * y**4 / 3 + + 224 * y**3 / 3 + - 112 * y**2 / 3 + + 16 * y / 3, + 128 * x**3 * y / 3 - 32 * x**2 * y + 16 * x * y / 3, + 64 * x**2 * y**2 - 16 * x**2 * y - 16 * x * y**2 + 4 * x * y, + 128 * x * y**3 / 3 - 32 * x * y**2 + 16 * x * y / 3, 128 * x**3 * y + 256 * x**2 * y**2 - 224 * x**2 * y @@ -209,20 +209,56 @@ def sympy_lagrange(celltype, n): + 1, 625 * x**5 / 24 - 625 * x**4 / 12 + 875 * x**3 / 24 - 125 * x**2 / 12 + x, 625 * y**5 / 24 - 625 * y**4 / 12 + 875 * y**3 / 24 - 125 * y**2 / 12 + y, - 3125 * x**4 * y / 24 - 625 * x**3 * y / 4 + 1375 * x**2 * y / 24 - 25 * x * y / 4, - 3125 * x**3 * y**2 / 12 - - 625 * x**3 * y / 12 + 3125 * x**5 / 24 + + 3125 * x**4 * y / 6 + - 4375 * x**4 / 12 + + 3125 * x**3 * y**2 / 4 + - 4375 * x**3 * y / 4 + + 8875 * x**3 / 24 + + 3125 * x**2 * y**3 / 6 + - 4375 * x**2 * y**2 / 4 + + 8875 * x**2 * y / 12 + - 1925 * x**2 / 12 + + 3125 * x * y**4 / 24 + - 4375 * x * y**3 / 12 + + 8875 * x * y**2 / 24 + - 1925 * x * y / 12 + + 25 * x, + -3125 * x**5 / 12 + - 3125 * x**4 * y / 4 + + 8125 * x**4 / 12 + - 3125 * x**3 * y**2 / 4 + + 5625 * x**3 * y / 4 + - 7375 * x**3 / 12 + - 3125 * x**2 * y**3 / 12 + + 3125 * x**2 * y**2 / 4 + - 8875 * x**2 * y / 12 + + 2675 * x**2 / 12 + + 625 * x * y**3 / 12 + - 125 * x * y**2 + + 1175 * x * y / 12 + - 25 * x, + 3125 * x**5 / 12 + + 3125 * x**4 * y / 6 + - 625 * x**4 + + 3125 * x**3 * y**2 / 12 + - 3125 * x**3 * y / 4 + + 6125 * x**3 / 12 - 625 * x**2 * y**2 / 4 - + 125 * x**2 * y / 4 + + 3875 * x**2 * y / 12 + - 325 * x**2 / 2 + 125 * x * y**2 / 6 - - 25 * x * y / 6, - 3125 * x**2 * y**3 / 12 - - 625 * x**2 * y**2 / 4 - + 125 * x**2 * y / 6 - - 625 * x * y**3 / 12 - + 125 * x * y**2 / 4 - - 25 * x * y / 6, - 3125 * x * y**4 / 24 - 625 * x * y**3 / 4 + 1375 * x * y**2 / 24 - 25 * x * y / 4, + - 75 * x * y / 2 + + 50 * x / 3, + -3125 * x**5 / 24 + - 3125 * x**4 * y / 24 + + 6875 * x**4 / 24 + + 625 * x**3 * y / 4 + - 5125 * x**3 / 24 + - 1375 * x**2 * y / 24 + + 1525 * x**2 / 24 + + 25 * x * y / 4 + - 25 * x / 4, 3125 * x**4 * y / 24 + 3125 * x**3 * y**2 / 6 - 4375 * x**3 * y / 12 @@ -273,56 +309,20 @@ def sympy_lagrange(celltype, n): - 5125 * y**3 / 24 + 1525 * y**2 / 24 - 25 * y / 4, - 3125 * x**5 / 24 - + 3125 * x**4 * y / 6 - - 4375 * x**4 / 12 - + 3125 * x**3 * y**2 / 4 - - 4375 * x**3 * y / 4 - + 8875 * x**3 / 24 - + 3125 * x**2 * y**3 / 6 - - 4375 * x**2 * y**2 / 4 - + 8875 * x**2 * y / 12 - - 1925 * x**2 / 12 - + 3125 * x * y**4 / 24 - - 4375 * x * y**3 / 12 - + 8875 * x * y**2 / 24 - - 1925 * x * y / 12 - + 25 * x, - -3125 * x**5 / 12 - - 3125 * x**4 * y / 4 - + 8125 * x**4 / 12 - - 3125 * x**3 * y**2 / 4 - + 5625 * x**3 * y / 4 - - 7375 * x**3 / 12 - - 3125 * x**2 * y**3 / 12 - + 3125 * x**2 * y**2 / 4 - - 8875 * x**2 * y / 12 - + 2675 * x**2 / 12 - + 625 * x * y**3 / 12 - - 125 * x * y**2 - + 1175 * x * y / 12 - - 25 * x, - 3125 * x**5 / 12 - + 3125 * x**4 * y / 6 - - 625 * x**4 - + 3125 * x**3 * y**2 / 12 - - 3125 * x**3 * y / 4 - + 6125 * x**3 / 12 + 3125 * x**4 * y / 24 - 625 * x**3 * y / 4 + 1375 * x**2 * y / 24 - 25 * x * y / 4, + 3125 * x**3 * y**2 / 12 + - 625 * x**3 * y / 12 - 625 * x**2 * y**2 / 4 - + 3875 * x**2 * y / 12 - - 325 * x**2 / 2 + + 125 * x**2 * y / 4 + 125 * x * y**2 / 6 - - 75 * x * y / 2 - + 50 * x / 3, - -3125 * x**5 / 24 - - 3125 * x**4 * y / 24 - + 6875 * x**4 / 24 - + 625 * x**3 * y / 4 - - 5125 * x**3 / 24 - - 1375 * x**2 * y / 24 - + 1525 * x**2 / 24 - + 25 * x * y / 4 - - 25 * x / 4, + - 25 * x * y / 6, + 3125 * x**2 * y**3 / 12 + - 625 * x**2 * y**2 / 4 + + 125 * x**2 * y / 6 + - 625 * x * y**3 / 12 + + 125 * x * y**2 / 4 + - 25 * x * y / 6, + 3125 * x * y**4 / 24 - 625 * x * y**3 / 4 + 1375 * x * y**2 / 24 - 25 * x * y / 4, -3125 * x**4 * y / 6 - 3125 * x**3 * y**2 / 2 + 1250 * x**3 * y @@ -392,12 +392,12 @@ def sympy_lagrange(celltype, n): 2 * x**2 - x, 2 * y**2 - y, 2 * z**2 - z, - 4 * y * z, - 4 * x * z, - 4 * x * y, - -4 * x * z - 4 * y * z - 4 * z**2 + 4 * z, - -4 * x * y - 4 * y**2 - 4 * y * z + 4 * y, -4 * x**2 - 4 * x * y - 4 * x * z + 4 * x, + -4 * x * y - 4 * y**2 - 4 * y * z + 4 * y, + -4 * x * z - 4 * y * z - 4 * z**2 + 4 * z, + 4 * x * y, + 4 * x * z, + 4 * y * z, ] if n == 3: return [ @@ -424,29 +424,23 @@ def sympy_lagrange(celltype, n): 9 * x**3 / 2 - 9 * x**2 / 2 + x, 9 * y**3 / 2 - 9 * y**2 / 2 + y, 9 * z**3 / 2 - 9 * z**2 / 2 + z, - 27 * y**2 * z / 2 - 9 * y * z / 2, - 27 * y * z**2 / 2 - 9 * y * z / 2, - 27 * x**2 * z / 2 - 9 * x * z / 2, - 27 * x * z**2 / 2 - 9 * x * z / 2, - 27 * x**2 * y / 2 - 9 * x * y / 2, - 27 * x * y**2 / 2 - 9 * x * y / 2, - 27 * x**2 * z / 2 + 27 * x**3 / 2 + + 27 * x**2 * y + + 27 * x**2 * z + - 45 * x**2 / 2 + + 27 * x * y**2 / 2 + 27 * x * y * z - + 27 * x * z**2 + - 45 * x * y / 2 + + 27 * x * z**2 / 2 - 45 * x * z / 2 - + 27 * y**2 * z / 2 - + 27 * y * z**2 - - 45 * y * z / 2 - + 27 * z**3 / 2 - - 45 * z**2 / 2 - + 9 * z, - -27 * x * z**2 / 2 + + 9 * x, + -27 * x**3 / 2 + - 27 * x**2 * y / 2 + - 27 * x**2 * z / 2 + + 18 * x**2 + + 9 * x * y / 2 + 9 * x * z / 2 - - 27 * y * z**2 / 2 - + 9 * y * z / 2 - - 27 * z**3 / 2 - + 18 * z**2 - - 9 * z / 2, + - 9 * x / 2, 27 * x**2 * y / 2 + 27 * x * y**2 + 27 * x * y * z @@ -464,27 +458,33 @@ def sympy_lagrange(celltype, n): + 18 * y**2 + 9 * y * z / 2 - 9 * y / 2, - 27 * x**3 / 2 - + 27 * x**2 * y - + 27 * x**2 * z - - 45 * x**2 / 2 - + 27 * x * y**2 / 2 + 27 * x**2 * z / 2 + 27 * x * y * z - - 45 * x * y / 2 - + 27 * x * z**2 / 2 + + 27 * x * z**2 - 45 * x * z / 2 - + 9 * x, - -27 * x**3 / 2 - - 27 * x**2 * y / 2 - - 27 * x**2 * z / 2 - + 18 * x**2 - + 9 * x * y / 2 + + 27 * y**2 * z / 2 + + 27 * y * z**2 + - 45 * y * z / 2 + + 27 * z**3 / 2 + - 45 * z**2 / 2 + + 9 * z, + -27 * x * z**2 / 2 + 9 * x * z / 2 - - 9 * x / 2, - 27 * x * y * z, - -27 * x * y * z - 27 * y**2 * z - 27 * y * z**2 + 27 * y * z, - -27 * x**2 * z - 27 * x * y * z - 27 * x * z**2 + 27 * x * z, + - 27 * y * z**2 / 2 + + 9 * y * z / 2 + - 27 * z**3 / 2 + + 18 * z**2 + - 9 * z / 2, + 27 * x**2 * y / 2 - 9 * x * y / 2, + 27 * x * y**2 / 2 - 9 * x * y / 2, + 27 * x**2 * z / 2 - 9 * x * z / 2, + 27 * x * z**2 / 2 - 9 * x * z / 2, + 27 * y**2 * z / 2 - 9 * y * z / 2, + 27 * y * z**2 / 2 - 9 * y * z / 2, -27 * x**2 * y - 27 * x * y**2 - 27 * x * y * z + 27 * x * y, + -27 * x**2 * z - 27 * x * y * z - 27 * x * z**2 + 27 * x * z, + -27 * x * y * z - 27 * y**2 * z - 27 * y * z**2 + 27 * y * z, + 27 * x * y * z, ] if n == 4: return [ @@ -526,61 +526,52 @@ def sympy_lagrange(celltype, n): 32 * x**4 / 3 - 16 * x**3 + 22 * x**2 / 3 - x, 32 * y**4 / 3 - 16 * y**3 + 22 * y**2 / 3 - y, 32 * z**4 / 3 - 16 * z**3 + 22 * z**2 / 3 - z, - 128 * y**3 * z / 3 - 32 * y**2 * z + 16 * y * z / 3, - 64 * y**2 * z**2 - 16 * y**2 * z - 16 * y * z**2 + 4 * y * z, - 128 * y * z**3 / 3 - 32 * y * z**2 + 16 * y * z / 3, - 128 * x**3 * z / 3 - 32 * x**2 * z + 16 * x * z / 3, - 64 * x**2 * z**2 - 16 * x**2 * z - 16 * x * z**2 + 4 * x * z, - 128 * x * z**3 / 3 - 32 * x * z**2 + 16 * x * z / 3, - 128 * x**3 * y / 3 - 32 * x**2 * y + 16 * x * y / 3, - 64 * x**2 * y**2 - 16 * x**2 * y - 16 * x * y**2 + 4 * x * y, - 128 * x * y**3 / 3 - 32 * x * y**2 + 16 * x * y / 3, - -128 * x**3 * z / 3 - - 128 * x**2 * y * z + -128 * x**4 / 3 + - 128 * x**3 * y + - 128 * x**3 * z + + 96 * x**3 + - 128 * x**2 * y**2 + - 256 * x**2 * y * z + + 192 * x**2 * y - 128 * x**2 * z**2 - + 96 * x**2 * z + + 192 * x**2 * z + - 208 * x**2 / 3 + - 128 * x * y**3 / 3 - 128 * x * y**2 * z - - 256 * x * y * z**2 + + 96 * x * y**2 + - 128 * x * y * z**2 + 192 * x * y * z - - 128 * x * z**3 - + 192 * x * z**2 + - 208 * x * y / 3 + - 128 * x * z**3 / 3 + + 96 * x * z**2 - 208 * x * z / 3 - - 128 * y**3 * z / 3 - - 128 * y**2 * z**2 - + 96 * y**2 * z - - 128 * y * z**3 - + 192 * y * z**2 - - 208 * y * z / 3 - - 128 * z**4 / 3 - + 96 * z**3 - - 208 * z**2 / 3 - + 16 * z, - 64 * x**2 * z**2 - - 16 * x**2 * z - + 128 * x * y * z**2 + + 16 * x, + 64 * x**4 + + 128 * x**3 * y + + 128 * x**3 * z + - 128 * x**3 + + 64 * x**2 * y**2 + + 128 * x**2 * y * z + - 144 * x**2 * y + + 64 * x**2 * z**2 + - 144 * x**2 * z + + 76 * x**2 + - 16 * x * y**2 - 32 * x * y * z - + 128 * x * z**3 - - 144 * x * z**2 + + 28 * x * y + - 16 * x * z**2 + 28 * x * z - + 64 * y**2 * z**2 - - 16 * y**2 * z - + 128 * y * z**3 - - 144 * y * z**2 - + 28 * y * z - + 64 * z**4 - - 128 * z**3 - + 76 * z**2 - - 12 * z, - -128 * x * z**3 / 3 - + 32 * x * z**2 + - 12 * x, + -128 * x**4 / 3 + - 128 * x**3 * y / 3 + - 128 * x**3 * z / 3 + + 224 * x**3 / 3 + + 32 * x**2 * y + + 32 * x**2 * z + - 112 * x**2 / 3 + - 16 * x * y / 3 - 16 * x * z / 3 - - 128 * y * z**3 / 3 - + 32 * y * z**2 - - 16 * y * z / 3 - - 128 * z**4 / 3 - + 224 * z**3 / 3 - - 112 * z**2 / 3 - + 16 * z / 3, + + 16 * x / 3, -128 * x**3 * y / 3 - 128 * x**2 * y**2 - 128 * x**2 * y * z @@ -627,79 +618,85 @@ def sympy_lagrange(celltype, n): - 112 * y**2 / 3 - 16 * y * z / 3 + 16 * y / 3, - -128 * x**4 / 3 - - 128 * x**3 * y - - 128 * x**3 * z - + 96 * x**3 - - 128 * x**2 * y**2 - - 256 * x**2 * y * z - + 192 * x**2 * y + -128 * x**3 * z / 3 + - 128 * x**2 * y * z - 128 * x**2 * z**2 - + 192 * x**2 * z - - 208 * x**2 / 3 - - 128 * x * y**3 / 3 + + 96 * x**2 * z - 128 * x * y**2 * z - + 96 * x * y**2 - - 128 * x * y * z**2 + - 256 * x * y * z**2 + 192 * x * y * z - - 208 * x * y / 3 - - 128 * x * z**3 / 3 - + 96 * x * z**2 + - 128 * x * z**3 + + 192 * x * z**2 - 208 * x * z / 3 - + 16 * x, - 64 * x**4 - + 128 * x**3 * y - + 128 * x**3 * z - - 128 * x**3 - + 64 * x**2 * y**2 - + 128 * x**2 * y * z - - 144 * x**2 * y - + 64 * x**2 * z**2 - - 144 * x**2 * z - + 76 * x**2 - - 16 * x * y**2 + - 128 * y**3 * z / 3 + - 128 * y**2 * z**2 + + 96 * y**2 * z + - 128 * y * z**3 + + 192 * y * z**2 + - 208 * y * z / 3 + - 128 * z**4 / 3 + + 96 * z**3 + - 208 * z**2 / 3 + + 16 * z, + 64 * x**2 * z**2 + - 16 * x**2 * z + + 128 * x * y * z**2 - 32 * x * y * z - + 28 * x * y - - 16 * x * z**2 + + 128 * x * z**3 + - 144 * x * z**2 + 28 * x * z - - 12 * x, - -128 * x**4 / 3 - - 128 * x**3 * y / 3 - - 128 * x**3 * z / 3 - + 224 * x**3 / 3 - + 32 * x**2 * y - + 32 * x**2 * z - - 112 * x**2 / 3 - - 16 * x * y / 3 + + 64 * y**2 * z**2 + - 16 * y**2 * z + + 128 * y * z**3 + - 144 * y * z**2 + + 28 * y * z + + 64 * z**4 + - 128 * z**3 + + 76 * z**2 + - 12 * z, + -128 * x * z**3 / 3 + + 32 * x * z**2 - 16 * x * z / 3 - + 16 * x / 3, - 128 * x**2 * y * z - 32 * x * y * z, - 128 * x * y**2 * z - 32 * x * y * z, - 128 * x * y * z**2 - 32 * x * y * z, - 128 * x**2 * y * z + - 128 * y * z**3 / 3 + + 32 * y * z**2 + - 16 * y * z / 3 + - 128 * z**4 / 3 + + 224 * z**3 / 3 + - 112 * z**2 / 3 + + 16 * z / 3, + 128 * x**3 * y / 3 - 32 * x**2 * y + 16 * x * y / 3, + 64 * x**2 * y**2 - 16 * x**2 * y - 16 * x * y**2 + 4 * x * y, + 128 * x * y**3 / 3 - 32 * x * y**2 + 16 * x * y / 3, + 128 * x**3 * z / 3 - 32 * x**2 * z + 16 * x * z / 3, + 64 * x**2 * z**2 - 16 * x**2 * z - 16 * x * z**2 + 4 * x * z, + 128 * x * z**3 / 3 - 32 * x * z**2 + 16 * x * z / 3, + 128 * y**3 * z / 3 - 32 * y**2 * z + 16 * y * z / 3, + 64 * y**2 * z**2 - 16 * y**2 * z - 16 * y * z**2 + 4 * y * z, + 128 * y * z**3 / 3 - 32 * y * z**2 + 16 * y * z / 3, + 128 * x**3 * y + + 256 * x**2 * y**2 + + 256 * x**2 * y * z + - 224 * x**2 * y + + 128 * x * y**3 + 256 * x * y**2 * z - + 256 * x * y * z**2 + - 224 * x * y**2 + + 128 * x * y * z**2 - 224 * x * y * z - + 128 * y**3 * z - + 256 * y**2 * z**2 - - 224 * y**2 * z - + 128 * y * z**3 - - 224 * y * z**2 - + 96 * y * z, - -128 * x * y**2 * z + + 96 * x * y, + -128 * x**3 * y + - 128 * x**2 * y**2 + - 128 * x**2 * y * z + + 160 * x**2 * y + + 32 * x * y**2 + 32 * x * y * z - - 128 * y**3 * z - - 128 * y**2 * z**2 - + 160 * y**2 * z - + 32 * y * z**2 - - 32 * y * z, - -128 * x * y * z**2 + - 32 * x * y, + -128 * x**2 * y**2 + + 32 * x**2 * y + - 128 * x * y**3 + - 128 * x * y**2 * z + + 160 * x * y**2 + 32 * x * y * z - - 128 * y**2 * z**2 - + 32 * y**2 * z - - 128 * y * z**3 - + 160 * y * z**2 - - 32 * y * z, + - 32 * x * y, 128 * x**3 * z + 256 * x**2 * y * z + 256 * x**2 * z**2 @@ -724,30 +721,33 @@ def sympy_lagrange(celltype, n): - 128 * x * z**3 + 160 * x * z**2 - 32 * x * z, - 128 * x**3 * y - + 256 * x**2 * y**2 - + 256 * x**2 * y * z - - 224 * x**2 * y - + 128 * x * y**3 + 128 * x**2 * y * z + 256 * x * y**2 * z - - 224 * x * y**2 - + 128 * x * y * z**2 + + 256 * x * y * z**2 - 224 * x * y * z - + 96 * x * y, - -128 * x**3 * y - - 128 * x**2 * y**2 - - 128 * x**2 * y * z - + 160 * x**2 * y - + 32 * x * y**2 + + 128 * y**3 * z + + 256 * y**2 * z**2 + - 224 * y**2 * z + + 128 * y * z**3 + - 224 * y * z**2 + + 96 * y * z, + -128 * x * y**2 * z + 32 * x * y * z - - 32 * x * y, - -128 * x**2 * y**2 - + 32 * x**2 * y - - 128 * x * y**3 - - 128 * x * y**2 * z - + 160 * x * y**2 + - 128 * y**3 * z + - 128 * y**2 * z**2 + + 160 * y**2 * z + + 32 * y * z**2 + - 32 * y * z, + -128 * x * y * z**2 + 32 * x * y * z - - 32 * x * y, + - 128 * y**2 * z**2 + + 32 * y**2 * z + - 128 * y * z**3 + + 160 * y * z**2 + - 32 * y * z, + 128 * x**2 * y * z - 32 * x * y * z, + 128 * x * y**2 * z - 32 * x * y * z, + 128 * x * y * z**2 - 32 * x * y * z, -256 * x**2 * y * z - 256 * x * y**2 * z - 256 * x * y * z**2 + 256 * x * y * z, ] diff --git a/test/test_nedelec.py b/test/test_nedelec.py index 916cecb12..173aad951 100644 --- a/test/test_nedelec.py +++ b/test/test_nedelec.py @@ -21,35 +21,51 @@ def sympy_nedelec(celltype, n): if celltype == basix.CellType.triangle: if n == 1: - return [[-y, x], [y, 1 - x], [1 - y, x]] + return [[1 - y, x], [y, 1 - x], [-y, x]] if n == 2: return [ - [-8 * x * y + 2 * y, 8 * x**2 - 4 * x], - [-8 * y**2 + 4 * y, 8 * x * y - 2 * x], - [-8 * x * y - 8 * y**2 + 6 * y, 8 * x**2 + 8 * x * y - 12 * x - 6 * y + 4], - [8 * y**2 - 4 * y, -8 * x * y + 2 * x + 6 * y - 2], [8 * x * y - 6 * x + 8 * y**2 - 12 * y + 4, -8 * x**2 - 8 * x * y + 6 * x], [-8 * x * y + 6 * x + 2 * y - 2, 8 * x**2 - 4 * x], + [-8 * x * y - 8 * y**2 + 6 * y, 8 * x**2 + 8 * x * y - 12 * x - 6 * y + 4], + [8 * y**2 - 4 * y, -8 * x * y + 2 * x + 6 * y - 2], + [-8 * x * y + 2 * y, 8 * x**2 - 4 * x], + [-8 * y**2 + 4 * y, 8 * x * y - 2 * x], [-8 * x * y - 16 * y**2 + 16 * y, 8 * x**2 + 16 * x * y - 8 * x], [16 * x * y + 8 * y**2 - 8 * y, -16 * x**2 - 8 * x * y + 16 * x], ] if n == 3: return [ - [-45 * x**2 * y + 30 * x * y - 3 * y, 45 * x**3 - 45 * x**2 + 9 * x], - [-45 * y**3 + 45 * y**2 - 9 * y, 45 * x * y**2 - 30 * x * y + 3 * x], [ - -45 * x**2 * y / 4 - - 45 * x * y**2 - + 45 * x * y / 2 + -45 * x**2 * y + + 30 * x**2 + - 90 * x * y**2 + + 120 * x * y + - 36 * x + - 45 * y**3 + + 90 * y**2 + - 54 * y + + 9, + 45 * x**3 + 90 * x**2 * y - 60 * x**2 + 45 * x * y**2 - 60 * x * y + 18 * x, + ], + [ + -45 * x**2 * y + 30 * x**2 + 30 * x * y - 24 * x - 3 * y + 3, + 45 * x**3 - 45 * x**2 + 9 * x, + ], + [ + 45 * x**2 * y / 2 + - 15 * x**2 + + 45 * x * y**2 / 2 + - 75 * x * y / 2 + + 15 * x - 45 * y**3 / 4 - + 75 * y**2 / 4 - - 6 * y, - 45 * x**3 / 4 - + 45 * x**2 * y - - 75 * x**2 / 4 + + 15 * y**2 + - 9 * y / 4 + - 3 / 2, + -45 * x**3 / 2 + - 45 * x**2 * y / 2 + + 105 * x**2 / 4 + 45 * x * y**2 / 4 - - 45 * x * y / 2 - + 6 * x, + - 21 * x / 4, ], [ 45 * x**2 * y + 90 * x * y**2 - 60 * x * y + 45 * y**3 - 60 * y**2 + 18 * y, @@ -83,37 +99,21 @@ def sympy_nedelec(celltype, n): + 15 * y - 3 / 2, ], + [-45 * x**2 * y + 30 * x * y - 3 * y, 45 * x**3 - 45 * x**2 + 9 * x], + [-45 * y**3 + 45 * y**2 - 9 * y, 45 * x * y**2 - 30 * x * y + 3 * x], [ - -45 * x**2 * y - + 30 * x**2 - - 90 * x * y**2 - + 120 * x * y - - 36 * x - - 45 * y**3 - + 90 * y**2 - - 54 * y - + 9, - 45 * x**3 + 90 * x**2 * y - 60 * x**2 + 45 * x * y**2 - 60 * x * y + 18 * x, - ], - [ - -45 * x**2 * y + 30 * x**2 + 30 * x * y - 24 * x - 3 * y + 3, - 45 * x**3 - 45 * x**2 + 9 * x, - ], - [ - 45 * x**2 * y / 2 - - 15 * x**2 - + 45 * x * y**2 / 2 - - 75 * x * y / 2 - + 15 * x + -45 * x**2 * y / 4 + - 45 * x * y**2 + + 45 * x * y / 2 - 45 * y**3 / 4 - + 15 * y**2 - - 9 * y / 4 - - 3 / 2, - -45 * x**3 / 2 - - 45 * x**2 * y / 2 - + 105 * x**2 / 4 + + 75 * y**2 / 4 + - 6 * y, + 45 * x**3 / 4 + + 45 * x**2 * y + - 75 * x**2 / 4 + 45 * x * y**2 / 4 - - 21 * x / 4, + - 45 * x * y / 2 + + 6 * x, ], [ 90 * x**2 * y @@ -163,38 +163,32 @@ def sympy_nedelec(celltype, n): if celltype == basix.CellType.tetrahedron: if n == 1: return [ - [0, -z, y], - [-z, 0, x], - [-y, x, 0], - [z, z, -x - y + 1], - [y, -x - z + 1, y], [-y - z + 1, x, x], + [y, -x - z + 1, y], + [z, z, -x - y + 1], + [-y, x, 0], + [-z, 0, x], + [0, -z, y], ] if n == 2: return [ - [0, -8 * y * z + 2 * z, 8 * y**2 - 4 * y], - [0, -8 * z**2 + 4 * z, 8 * y * z - 2 * y], - [-8 * x * z + 2 * z, 0, 8 * x**2 - 4 * x], - [-8 * z**2 + 4 * z, 0, 8 * x * z - 2 * x], - [-8 * x * y + 2 * y, 8 * x**2 - 4 * x, 0], - [-8 * y**2 + 4 * y, 8 * x * y - 2 * x, 0], [ - -8 * x * z - 8 * y * z - 8 * z**2 + 6 * z, - -8 * x * z - 8 * y * z - 8 * z**2 + 6 * z, - 8 * x**2 - + 16 * x * y + 8 * x * y + 8 * x * z - - 12 * x + - 6 * x + 8 * y**2 - + 8 * y * z + + 16 * y * z - 12 * y - - 6 * z + + 8 * z**2 + - 12 * z + 4, + -8 * x**2 - 8 * x * y - 8 * x * z + 6 * x, + -8 * x**2 - 8 * x * y - 8 * x * z + 6 * x, ], [ - 8 * z**2 - 4 * z, - 8 * z**2 - 4 * z, - -8 * x * z + 2 * x - 8 * y * z + 2 * y + 6 * z - 2, + -8 * x * y - 8 * x * z + 6 * x + 2 * y + 2 * z - 2, + 8 * x**2 - 4 * x, + 8 * x**2 - 4 * x, ], [ -8 * x * y - 8 * y**2 - 8 * y * z + 6 * y, @@ -215,45 +209,29 @@ def sympy_nedelec(celltype, n): 8 * y**2 - 4 * y, ], [ - 8 * x * y + -8 * x * z - 8 * y * z - 8 * z**2 + 6 * z, + -8 * x * z - 8 * y * z - 8 * z**2 + 6 * z, + 8 * x**2 + + 16 * x * y + 8 * x * z - - 6 * x + - 12 * x + 8 * y**2 - + 16 * y * z + + 8 * y * z - 12 * y - + 8 * z**2 - - 12 * z + - 6 * z + 4, - -8 * x**2 - 8 * x * y - 8 * x * z + 6 * x, - -8 * x**2 - 8 * x * y - 8 * x * z + 6 * x, - ], - [ - -8 * x * y - 8 * x * z + 6 * x + 2 * y + 2 * z - 2, - 8 * x**2 - 4 * x, - 8 * x**2 - 4 * x, - ], - [-8 * y * z, 16 * x * z, -8 * x * y], - [-8 * y * z, -8 * x * z, 16 * x * y], - [ - 8 * y * z, - -16 * x * z - 8 * y * z - 16 * z**2 + 16 * z, - 8 * x * y + 8 * y**2 + 16 * y * z - 8 * y, ], [ - 8 * y * z, - 8 * x * z + 16 * y * z + 8 * z**2 - 8 * z, - -16 * x * y - 16 * y**2 - 8 * y * z + 16 * y, - ], - [ - -8 * x * z - 16 * y * z - 16 * z**2 + 16 * z, - 8 * x * z, - 8 * x**2 + 8 * x * y + 16 * x * z - 8 * x, - ], - [ - 16 * x * z + 8 * y * z + 8 * z**2 - 8 * z, - 8 * x * z, - -16 * x**2 - 16 * x * y - 8 * x * z + 16 * x, + 8 * z**2 - 4 * z, + 8 * z**2 - 4 * z, + -8 * x * z + 2 * x - 8 * y * z + 2 * y + 6 * z - 2, ], + [-8 * x * y + 2 * y, 8 * x**2 - 4 * x, 0], + [-8 * y**2 + 4 * y, 8 * x * y - 2 * x, 0], + [-8 * x * z + 2 * z, 0, 8 * x**2 - 4 * x], + [-8 * z**2 + 4 * z, 0, 8 * x * z - 2 * x], + [0, -8 * y * z + 2 * z, 8 * y**2 - 4 * y], + [0, -8 * z**2 + 4 * z, 8 * y * z - 2 * y], [ -8 * x * y - 16 * y**2 - 16 * y * z + 16 * y, 8 * x**2 + 16 * x * y + 8 * x * z - 8 * x, @@ -264,720 +242,28 @@ def sympy_nedelec(celltype, n): -16 * x**2 - 8 * x * y - 16 * x * z + 16 * x, 8 * x * y, ], - ] - if n == 3: - return [ - [0, -45 * y**2 * z + 30 * y * z - 3 * z, 45 * y**3 - 45 * y**2 + 9 * y], - [0, -45 * z**3 + 45 * z**2 - 9 * z, 45 * y * z**2 - 30 * y * z + 3 * y], [ - 0, - -45 * y**2 * z / 4 - - 45 * y * z**2 - + 45 * y * z / 2 - - 45 * z**3 / 4 - + 75 * z**2 / 4 - - 6 * z, - 45 * y**3 / 4 - + 45 * y**2 * z - - 75 * y**2 / 4 - + 45 * y * z**2 / 4 - - 45 * y * z / 2 - + 6 * y, - ], - [-45 * x**2 * z + 30 * x * z - 3 * z, 0, 45 * x**3 - 45 * x**2 + 9 * x], - [-45 * z**3 + 45 * z**2 - 9 * z, 0, 45 * x * z**2 - 30 * x * z + 3 * x], - [ - -45 * x**2 * z / 4 - - 45 * x * z**2 - + 45 * x * z / 2 - - 45 * z**3 / 4 - + 75 * z**2 / 4 - - 6 * z, - 0, - 45 * x**3 / 4 - + 45 * x**2 * z - - 75 * x**2 / 4 - + 45 * x * z**2 / 4 - - 45 * x * z / 2 - + 6 * x, - ], - [-45 * x**2 * y + 30 * x * y - 3 * y, 45 * x**3 - 45 * x**2 + 9 * x, 0], - [-45 * y**3 + 45 * y**2 - 9 * y, 45 * x * y**2 - 30 * x * y + 3 * x, 0], - [ - -45 * x**2 * y / 4 - - 45 * x * y**2 - + 45 * x * y / 2 - - 45 * y**3 / 4 - + 75 * y**2 / 4 - - 6 * y, - 45 * x**3 / 4 - + 45 * x**2 * y - - 75 * x**2 / 4 - + 45 * x * y**2 / 4 - - 45 * x * y / 2 - + 6 * x, - 0, - ], - [ - 45 * x**2 * z - + 90 * x * y * z - + 90 * x * z**2 - - 60 * x * z - + 45 * y**2 * z - + 90 * y * z**2 - - 60 * y * z - + 45 * z**3 - - 60 * z**2 - + 18 * z, - 45 * x**2 * z - + 90 * x * y * z - + 90 * x * z**2 - - 60 * x * z - + 45 * y**2 * z - + 90 * y * z**2 - - 60 * y * z - + 45 * z**3 - - 60 * z**2 - + 18 * z, - -45 * x**3 - - 135 * x**2 * y - - 90 * x**2 * z - + 90 * x**2 - - 135 * x * y**2 - - 180 * x * y * z - + 180 * x * y - - 45 * x * z**2 - + 120 * x * z - - 54 * x - - 45 * y**3 - - 90 * y**2 * z - + 90 * y**2 - - 45 * y * z**2 - + 120 * y * z - - 54 * y - + 30 * z**2 - - 36 * z - + 9, - ], - [ - 45 * z**3 - 45 * z**2 + 9 * z, - 45 * z**3 - 45 * z**2 + 9 * z, - -45 * x * z**2 - + 30 * x * z - - 3 * x - - 45 * y * z**2 - + 30 * y * z - - 3 * y - + 30 * z**2 - - 24 * z - + 3, - ], - [ - 45 * x**2 * z / 4 - + 45 * x * y * z / 2 - - 45 * x * z**2 / 2 - + 45 * y**2 * z / 4 - - 45 * y * z**2 / 2 - - 45 * z**3 / 2 - + 105 * z**2 / 4 - - 21 * z / 4, - 45 * x**2 * z / 4 - + 45 * x * y * z / 2 - - 45 * x * z**2 / 2 - + 45 * y**2 * z / 4 - - 45 * y * z**2 / 2 - - 45 * z**3 / 2 - + 105 * z**2 / 4 - - 21 * z / 4, - -45 * x**3 / 4 - - 135 * x**2 * y / 4 - + 45 * x**2 * z / 2 - + 15 * x**2 - - 135 * x * y**2 / 4 - + 45 * x * y * z - + 30 * x * y - + 45 * x * z**2 / 2 - - 75 * x * z / 2 - - 9 * x / 4 - - 45 * y**3 / 4 - + 45 * y**2 * z / 2 - + 15 * y**2 - + 45 * y * z**2 / 2 - - 75 * y * z / 2 - - 9 * y / 4 - - 15 * z**2 - + 15 * z - - 3 / 2, - ], - [ - 45 * x**2 * y - + 90 * x * y**2 - + 90 * x * y * z - - 60 * x * y - + 45 * y**3 - + 90 * y**2 * z - - 60 * y**2 - + 45 * y * z**2 - - 60 * y * z - + 18 * y, - -45 * x**3 - - 90 * x**2 * y - - 135 * x**2 * z - + 90 * x**2 - - 45 * x * y**2 - - 180 * x * y * z - + 120 * x * y - - 135 * x * z**2 - + 180 * x * z - - 54 * x - - 45 * y**2 * z - + 30 * y**2 - - 90 * y * z**2 - + 120 * y * z - - 36 * y - - 45 * z**3 - + 90 * z**2 - - 54 * z - + 9, - 45 * x**2 * y - + 90 * x * y**2 - + 90 * x * y * z - - 60 * x * y - + 45 * y**3 - + 90 * y**2 * z - - 60 * y**2 - + 45 * y * z**2 - - 60 * y * z - + 18 * y, - ], - [ - 45 * y**3 - 45 * y**2 + 9 * y, - -45 * x * y**2 - + 30 * x * y - - 3 * x - - 45 * y**2 * z - + 30 * y**2 - + 30 * y * z - - 24 * y - - 3 * z - + 3, - 45 * y**3 - 45 * y**2 + 9 * y, - ], - [ - 45 * x**2 * y / 4 - - 45 * x * y**2 / 2 - + 45 * x * y * z / 2 - - 45 * y**3 / 2 - - 45 * y**2 * z / 2 - + 105 * y**2 / 4 - + 45 * y * z**2 / 4 - - 21 * y / 4, - -45 * x**3 / 4 - + 45 * x**2 * y / 2 - - 135 * x**2 * z / 4 - + 15 * x**2 - + 45 * x * y**2 / 2 - + 45 * x * y * z - - 75 * x * y / 2 - - 135 * x * z**2 / 4 - + 30 * x * z - - 9 * x / 4 - + 45 * y**2 * z / 2 - - 15 * y**2 - + 45 * y * z**2 / 2 - - 75 * y * z / 2 - + 15 * y - - 45 * z**3 / 4 - + 15 * z**2 - - 9 * z / 4 - - 3 / 2, - 45 * x**2 * y / 4 - - 45 * x * y**2 / 2 - + 45 * x * y * z / 2 - - 45 * y**3 / 2 - - 45 * y**2 * z / 2 - + 105 * y**2 / 4 - + 45 * y * z**2 / 4 - - 21 * y / 4, - ], - [ - -45 * x**2 * y - - 45 * x**2 * z - + 30 * x**2 - - 90 * x * y**2 - - 180 * x * y * z - + 120 * x * y - - 90 * x * z**2 - + 120 * x * z - - 36 * x - - 45 * y**3 - - 135 * y**2 * z - + 90 * y**2 - - 135 * y * z**2 - + 180 * y * z - - 54 * y - - 45 * z**3 - + 90 * z**2 - - 54 * z - + 9, - 45 * x**3 - + 90 * x**2 * y - + 90 * x**2 * z - - 60 * x**2 - + 45 * x * y**2 - + 90 * x * y * z - - 60 * x * y - + 45 * x * z**2 - - 60 * x * z - + 18 * x, - 45 * x**3 - + 90 * x**2 * y - + 90 * x**2 * z - - 60 * x**2 - + 45 * x * y**2 - + 90 * x * y * z - - 60 * x * y - + 45 * x * z**2 - - 60 * x * z - + 18 * x, - ], - [ - -45 * x**2 * y - - 45 * x**2 * z - + 30 * x**2 - + 30 * x * y - + 30 * x * z - - 24 * x - - 3 * y - - 3 * z - + 3, - 45 * x**3 - 45 * x**2 + 9 * x, - 45 * x**3 - 45 * x**2 + 9 * x, - ], - [ - 45 * x**2 * y / 2 - + 45 * x**2 * z / 2 - - 15 * x**2 - + 45 * x * y**2 / 2 - + 45 * x * y * z - - 75 * x * y / 2 - + 45 * x * z**2 / 2 - - 75 * x * z / 2 - + 15 * x - - 45 * y**3 / 4 - - 135 * y**2 * z / 4 - + 15 * y**2 - - 135 * y * z**2 / 4 - + 30 * y * z - - 9 * y / 4 - - 45 * z**3 / 4 - + 15 * z**2 - - 9 * z / 4 - - 3 / 2, - -45 * x**3 / 2 - - 45 * x**2 * y / 2 - - 45 * x**2 * z / 2 - + 105 * x**2 / 4 - + 45 * x * y**2 / 4 - + 45 * x * y * z / 2 - + 45 * x * z**2 / 4 - - 21 * x / 4, - -45 * x**3 / 2 - - 45 * x**2 * y / 2 - - 45 * x**2 * z / 2 - + 105 * x**2 / 4 - + 45 * x * y**2 / 4 - + 45 * x * y * z / 2 - + 45 * x * z**2 / 4 - - 21 * x / 4, - ], - [ - -180 * x * y * z + 30 * y * z, - 270 * x**2 * z - 90 * x * z, - -90 * x**2 * y + 30 * x * y, - ], - [ - -180 * x * y * z + 30 * y * z, - -90 * x**2 * z + 30 * x * z, - 270 * x**2 * y - 90 * x * y, - ], - [ - -180 * y**2 * z + 60 * y * z, - 360 * x * y * z - 60 * x * z, - -180 * x * y**2 + 60 * x * y, - ], - [ - -90 * y**2 * z + 30 * y * z, - -180 * x * y * z + 30 * x * z, - 270 * x * y**2 - 90 * x * y, - ], - [ - -90 * y * z**2 + 30 * y * z, - 270 * x * z**2 - 90 * x * z, - -180 * x * y * z + 30 * x * y, - ], - [ - -180 * y * z**2 + 60 * y * z, - -180 * x * z**2 + 60 * x * z, - 360 * x * y * z - 60 * x * y, - ], - [ - -180 * x * y * z - 180 * y**2 * z - 180 * y * z**2 + 150 * y * z, - 270 * x**2 * z - + 360 * x * y * z - + 540 * x * z**2 - - 450 * x * z - + 90 * y**2 * z - + 360 * y * z**2 - - 300 * y * z - + 270 * z**3 - - 450 * z**2 - + 180 * z, - -90 * x**2 * y - - 180 * x * y**2 - - 360 * x * y * z - + 150 * x * y - - 90 * y**3 - - 360 * y**2 * z - + 150 * y**2 - - 270 * y * z**2 - + 300 * y * z - - 60 * y, - ], - [ - -180 * x * y * z - 180 * y**2 * z - 180 * y * z**2 + 150 * y * z, - -90 * x**2 * z - - 360 * x * y * z - - 180 * x * z**2 - + 150 * x * z - - 270 * y**2 * z - - 360 * y * z**2 - + 300 * y * z - - 90 * z**3 - + 150 * z**2 - - 60 * z, - 270 * x**2 * y - + 540 * x * y**2 - + 360 * x * y * z - - 450 * x * y - + 270 * y**3 - + 360 * y**2 * z - - 450 * y**2 - + 90 * y * z**2 - - 300 * y * z - + 180 * y, - ], - [ - 180 * y**2 * z - 60 * y * z, - -360 * x * y * z - + 60 * x * z - - 180 * y**2 * z - - 360 * y * z**2 - + 360 * y * z - + 60 * z**2 - - 60 * z, - 180 * x * y**2 - - 60 * x * y - + 180 * y**3 - + 360 * y**2 * z - - 240 * y**2 - - 120 * y * z - + 60 * y, - ], - [ - 90 * y**2 * z - 30 * y * z, - 180 * x * y * z - - 30 * x * z - + 270 * y**2 * z - + 180 * y * z**2 - - 240 * y * z - - 30 * z**2 - + 30 * z, - -270 * x * y**2 - + 90 * x * y - - 270 * y**3 - - 180 * y**2 * z - + 360 * y**2 - + 60 * y * z - - 90 * y, - ], - [ - 90 * y * z**2 - 30 * y * z, - -270 * x * z**2 - + 90 * x * z - - 180 * y * z**2 - + 60 * y * z - - 270 * z**3 - + 360 * z**2 - - 90 * z, - 180 * x * y * z - - 30 * x * y - + 180 * y**2 * z - - 30 * y**2 - + 270 * y * z**2 - - 240 * y * z - + 30 * y, - ], - [ - 180 * y * z**2 - 60 * y * z, - 180 * x * z**2 - - 60 * x * z - + 360 * y * z**2 - - 120 * y * z - + 180 * z**3 - - 240 * z**2 - + 60 * z, - -360 * x * y * z - + 60 * x * y - - 360 * y**2 * z - + 60 * y**2 - - 180 * y * z**2 - + 360 * y * z - - 60 * y, - ], - [ - 90 * x**2 * z - + 360 * x * y * z - + 360 * x * z**2 - - 300 * x * z - + 270 * y**2 * z - + 540 * y * z**2 - - 450 * y * z - + 270 * z**3 - - 450 * z**2 - + 180 * z, - -180 * x**2 * z - 180 * x * y * z - 180 * x * z**2 + 150 * x * z, - -90 * x**3 - - 180 * x**2 * y - - 360 * x**2 * z - + 150 * x**2 - - 90 * x * y**2 - - 360 * x * y * z - + 150 * x * y - - 270 * x * z**2 - + 300 * x * z - - 60 * x, - ], - [ - -270 * x**2 * z - - 360 * x * y * z - - 360 * x * z**2 - + 300 * x * z - - 90 * y**2 * z - - 180 * y * z**2 - + 150 * y * z - - 90 * z**3 - + 150 * z**2 - - 60 * z, - -180 * x**2 * z - 180 * x * y * z - 180 * x * z**2 + 150 * x * z, - 270 * x**3 - + 540 * x**2 * y - + 360 * x**2 * z - - 450 * x**2 - + 270 * x * y**2 - + 360 * x * y * z - - 450 * x * y - + 90 * x * z**2 - - 300 * x * z - + 180 * x, - ], - [ - -180 * x**2 * z - - 360 * x * y * z - - 360 * x * z**2 - + 360 * x * z - + 60 * y * z - + 60 * z**2 - - 60 * z, - 180 * x**2 * z - 60 * x * z, - 180 * x**3 - + 180 * x**2 * y - + 360 * x**2 * z - - 240 * x**2 - - 60 * x * y - - 120 * x * z - + 60 * x, - ], - [ - 270 * x**2 * z - + 180 * x * y * z - + 180 * x * z**2 - - 240 * x * z - - 30 * y * z - - 30 * z**2 - + 30 * z, - 90 * x**2 * z - 30 * x * z, - -270 * x**3 - - 270 * x**2 * y - - 180 * x**2 * z - + 360 * x**2 - + 90 * x * y - + 60 * x * z - - 90 * x, - ], - [ - -180 * x * z**2 - + 60 * x * z - - 270 * y * z**2 - + 90 * y * z - - 270 * z**3 - + 360 * z**2 - - 90 * z, - 90 * x * z**2 - 30 * x * z, - 180 * x**2 * z - - 30 * x**2 - + 180 * x * y * z - - 30 * x * y - + 270 * x * z**2 - - 240 * x * z - + 30 * x, - ], - [ - 360 * x * z**2 - - 120 * x * z - + 180 * y * z**2 - - 60 * y * z - + 180 * z**3 - - 240 * z**2 - + 60 * z, - 180 * x * z**2 - 60 * x * z, - -360 * x**2 * z - + 60 * x**2 - - 360 * x * y * z - + 60 * x * y - - 180 * x * z**2 - + 360 * x * z - - 60 * x, - ], - [ - 90 * x**2 * y - + 360 * x * y**2 - + 360 * x * y * z - - 300 * x * y - + 270 * y**3 - + 540 * y**2 * z - - 450 * y**2 - + 270 * y * z**2 - - 450 * y * z - + 180 * y, - -90 * x**3 - - 360 * x**2 * y - - 180 * x**2 * z - + 150 * x**2 - - 270 * x * y**2 - - 360 * x * y * z - + 300 * x * y - - 90 * x * z**2 - + 150 * x * z - - 60 * x, - -180 * x**2 * y - 180 * x * y**2 - 180 * x * y * z + 150 * x * y, - ], - [ - -270 * x**2 * y - - 360 * x * y**2 - - 360 * x * y * z - + 300 * x * y - - 90 * y**3 - - 180 * y**2 * z - + 150 * y**2 - - 90 * y * z**2 - + 150 * y * z - - 60 * y, - 270 * x**3 - + 360 * x**2 * y - + 540 * x**2 * z - - 450 * x**2 - + 90 * x * y**2 - + 360 * x * y * z - - 300 * x * y - + 270 * x * z**2 - - 450 * x * z - + 180 * x, - -180 * x**2 * y - 180 * x * y**2 - 180 * x * y * z + 150 * x * y, - ], - [ - -180 * x**2 * y - - 360 * x * y**2 - - 360 * x * y * z - + 360 * x * y - + 60 * y**2 - + 60 * y * z - - 60 * y, - 180 * x**3 - + 360 * x**2 * y - + 180 * x**2 * z - - 240 * x**2 - - 120 * x * y - - 60 * x * z - + 60 * x, - 180 * x**2 * y - 60 * x * y, - ], - [ - 270 * x**2 * y - + 180 * x * y**2 - + 180 * x * y * z - - 240 * x * y - - 30 * y**2 - - 30 * y * z - + 30 * y, - -270 * x**3 - - 180 * x**2 * y - - 270 * x**2 * z - + 360 * x**2 - + 60 * x * y - + 90 * x * z - - 90 * x, - 90 * x**2 * y - 30 * x * y, - ], - [ - -180 * x * y**2 - + 60 * x * y - - 270 * y**3 - - 270 * y**2 * z - + 360 * y**2 - + 90 * y * z - - 90 * y, - 180 * x**2 * y - - 30 * x**2 - + 270 * x * y**2 - + 180 * x * y * z - - 240 * x * y - - 30 * x * z - + 30 * x, - 90 * x * y**2 - 30 * x * y, - ], - [ - 360 * x * y**2 - - 120 * x * y - + 180 * y**3 - + 180 * y**2 * z - - 240 * y**2 - - 60 * y * z - + 60 * y, - -360 * x**2 * y - + 60 * x**2 - - 180 * x * y**2 - - 360 * x * y * z - + 360 * x * y - + 60 * x * z - - 60 * x, - 180 * x * y**2 - 60 * x * y, + -8 * x * z - 16 * y * z - 16 * z**2 + 16 * z, + 8 * x * z, + 8 * x**2 + 8 * x * y + 16 * x * z - 8 * x, ], [ - -360 * x * y * z - 540 * y**2 * z - 540 * y * z**2 + 540 * y * z, - 180 * x**2 * z + 360 * x * y * z + 180 * x * z**2 - 180 * x * z, - 180 * x**2 * y + 180 * x * y**2 + 360 * x * y * z - 180 * x * y, + 16 * x * z + 8 * y * z + 8 * z**2 - 8 * z, + 8 * x * z, + -16 * x**2 - 16 * x * y - 8 * x * z + 16 * x, ], [ - 360 * x * y * z + 180 * y**2 * z + 180 * y * z**2 - 180 * y * z, - -540 * x**2 * z - 360 * x * y * z - 540 * x * z**2 + 540 * x * z, - 180 * x**2 * y + 180 * x * y**2 + 360 * x * y * z - 180 * x * y, + 8 * y * z, + -16 * x * z - 8 * y * z - 16 * z**2 + 16 * z, + 8 * x * y + 8 * y**2 + 16 * y * z - 8 * y, ], [ - 360 * x * y * z + 180 * y**2 * z + 180 * y * z**2 - 180 * y * z, - 180 * x**2 * z + 360 * x * y * z + 180 * x * z**2 - 180 * x * z, - -540 * x**2 * y - 540 * x * y**2 - 360 * x * y * z + 540 * x * y, + 8 * y * z, + 8 * x * z + 16 * y * z + 8 * z**2 - 8 * z, + -16 * x * y - 16 * y**2 - 8 * y * z + 16 * y, ], + [-8 * y * z, 16 * x * z, -8 * x * y], + [-8 * y * z, -8 * x * z, 16 * x * y], ] raise NotImplementedError @@ -1008,7 +294,7 @@ def test_tri(degree): assert np.isclose(wtab[basix.index(kx, ky)], wsym).all() -@pytest.mark.parametrize("degree", [1, 2, 3]) +@pytest.mark.parametrize("degree", [1, 2]) def test_tet(degree): celltype = basix.CellType.tetrahedron g = sympy_nedelec(celltype, degree) diff --git a/test/test_nedelec_second_kind.py b/test/test_nedelec_second_kind.py index cba452335..71cc07ca6 100644 --- a/test/test_nedelec_second_kind.py +++ b/test/test_nedelec_second_kind.py @@ -22,27 +22,15 @@ def sympy_nedelec(celltype, n): if celltype == basix.CellType.triangle: if n == 1: return [ - [2 * y, 4 * x], - [-4 * y, -2 * x], - [-2 * y, -4 * x - 6 * y + 4], - [4 * y, 2 * x + 6 * y - 2], [-6 * x - 4 * y + 4, -2 * x], [6 * x + 2 * y - 2, 4 * x], + [-2 * y, -4 * x - 6 * y + 4], + [4 * y, 2 * x + 6 * y - 2], + [2 * y, 4 * x], + [-4 * y, -2 * x], ] if n == 2: return [ - [12 * x * y - 3 * y, 18 * x**2 - 9 * x], - [-18 * y**2 + 9 * y, -12 * x * y + 3 * x], - [-9 * x * y - 3 * y**2 / 2 + 3 * y, 3 * x**2 / 2 + 9 * x * y - 3 * x], - [ - 12 * x * y + 12 * y**2 - 9 * y, - 18 * x**2 + 48 * x * y - 27 * x + 30 * y**2 - 36 * y + 9, - ], - [18 * y**2 - 9 * y, 12 * x * y - 3 * x + 30 * y**2 - 24 * y + 3], - [ - -9 * x * y - 15 * y**2 / 2 + 6 * y, - 3 * x**2 / 2 - 15 * x * y - 15 * y**2 + 15 * y - 3 / 2, - ], [ 30 * x**2 + 48 * x * y - 36 * x + 18 * y**2 - 27 * y + 9, 12 * x**2 + 12 * x * y - 9 * x, @@ -52,358 +40,43 @@ def sympy_nedelec(celltype, n): -15 * x**2 - 15 * x * y + 15 * x + 3 * y**2 / 2 - 3 / 2, -15 * x**2 / 2 - 9 * x * y + 6 * x, ], - [-48 * x * y - 12 * y**2 + 12 * y, -12 * x**2 - 48 * x * y + 12 * x], - [48 * x * y + 36 * y**2 - 36 * y, 12 * x**2 + 24 * x * y - 12 * x], - [-24 * x * y - 12 * y**2 + 12 * y, -36 * x**2 - 48 * x * y + 36 * x], - ] - if n == 3: - return [ - [60 * x**2 * y - 40 * x * y + 4 * y, 80 * x**3 - 80 * x**2 + 16 * x], - [-80 * y**3 + 80 * y**2 - 16 * y, -60 * x * y**2 + 40 * x * y - 4 * x], - [ - -320 * x**2 * y / 9 - - 80 * x * y**2 / 9 - + 80 * x * y / 3 - + 40 * y**3 / 27 - - 8 * y / 3, - 400 * x**3 / 27 - + 640 * x**2 * y / 9 - - 80 * x**2 / 3 - + 220 * x * y**2 / 9 - - 40 * x * y - + 28 * x / 3, - ], - [ - -220 * x**2 * y / 9 - - 640 * x * y**2 / 9 - + 40 * x * y - - 400 * y**3 / 27 - + 80 * y**2 / 3 - - 28 * y / 3, - -40 * x**3 / 27 - + 80 * x**2 * y / 9 - + 320 * x * y**2 / 9 - - 80 * x * y / 3 - + 8 * x / 3, - ], - [ - -60 * x**2 * y - 120 * x * y**2 + 80 * x * y - 60 * y**3 + 80 * y**2 - 24 * y, - -80 * x**3 - - 300 * x**2 * y - + 160 * x**2 - - 360 * x * y**2 - + 400 * x * y - - 96 * x - - 140 * y**3 - + 240 * y**2 - - 120 * y - + 16, - ], - [ - 80 * y**3 - 80 * y**2 + 16 * y, - 60 * x * y**2 - 40 * x * y + 4 * x + 140 * y**3 - 180 * y**2 + 60 * y - 4, - ], [ - 320 * x**2 * y / 9 - + 560 * x * y**2 / 9 - - 400 * x * y / 9 - + 680 * y**3 / 27 - - 320 * y**2 / 9 - + 104 * y / 9, - -400 * x**3 / 27 - + 560 * x**2 * y / 9 - + 160 * x**2 / 9 - + 1220 * x * y**2 / 9 - - 1000 * x * y / 9 - - 4 * x / 9 - + 1540 * y**3 / 27 - - 860 * y**2 / 9 - + 380 * y / 9 - - 68 / 27, - ], - [ - 220 * x**2 * y / 9 - - 200 * x * y**2 / 9 - - 80 * x * y / 9 - - 860 * y**3 / 27 - + 320 * y**2 / 9 - - 56 * y / 9, - 40 * x**3 / 27 - + 340 * x**2 * y / 9 - - 40 * x**2 / 9 - - 320 * x * y**2 / 9 - - 80 * x * y / 9 - + 16 * x / 9 - - 1540 * y**3 / 27 - + 680 * y**2 / 9 - - 200 * y / 9 - + 32 / 27, - ], - [ - -140 * x**3 - - 360 * x**2 * y - + 240 * x**2 - - 300 * x * y**2 - + 400 * x * y - - 120 * x - - 80 * y**3 - + 160 * y**2 - - 96 * y - + 16, - -60 * x**3 - 120 * x**2 * y + 80 * x**2 - 60 * x * y**2 + 80 * x * y - 24 * x, - ], - [ - 140 * x**3 + 60 * x**2 * y - 180 * x**2 - 40 * x * y + 60 * x + 4 * y - 4, - 80 * x**3 - 80 * x**2 + 16 * x, - ], - [ - 1540 * x**3 / 27 - + 1220 * x**2 * y / 9 - - 860 * x**2 / 9 - + 560 * x * y**2 / 9 - - 1000 * x * y / 9 - + 380 * x / 9 - - 400 * y**3 / 27 - + 160 * y**2 / 9 - - 4 * y / 9 - - 68 / 27, - 680 * x**3 / 27 - + 560 * x**2 * y / 9 - - 320 * x**2 / 9 - + 320 * x * y**2 / 9 - - 400 * x * y / 9 - + 104 * x / 9, - ], - [ - -1540 * x**3 / 27 - - 320 * x**2 * y / 9 - + 680 * x**2 / 9 - + 340 * x * y**2 / 9 - - 80 * x * y / 9 - - 200 * x / 9 - + 40 * y**3 / 27 - - 40 * y**2 / 9 - + 16 * y / 9 - + 32 / 27, - -860 * x**3 / 27 - - 200 * x**2 * y / 9 - + 320 * x**2 / 9 - + 220 * x * y**2 / 9 - - 80 * x * y / 9 - - 56 * x / 9, - ], - [ - -240 * x**2 * y - 180 * x * y**2 + 180 * x * y - 20 * y**3 + 40 * y**2 - 20 * y, - -40 * x**3 - 240 * x**2 * y + 60 * x**2 - 120 * x * y**2 + 140 * x * y - 20 * x, - ], - [ - -120 * x**2 * y - 240 * x * y**2 + 140 * x * y - 40 * y**3 + 60 * y**2 - 20 * y, - -20 * x**3 - 180 * x**2 * y + 40 * x**2 - 240 * x * y**2 + 180 * x * y - 20 * x, - ], - [ - -240 * x**2 * y - - 300 * x * y**2 - + 300 * x * y - - 80 * y**3 - + 160 * y**2 - - 80 * y, - -40 * x**3 - 120 * x**2 * y + 60 * x**2 - 60 * x * y**2 + 80 * x * y - 20 * x, - ], - [ - -120 * x**2 * y + 100 * x * y + 80 * y**3 - 80 * y**2, - -20 * x**3 + 20 * x**2 + 60 * x * y**2 - 40 * x * y, - ], - [ - 60 * x**2 * y + 120 * x * y**2 - 80 * x * y + 40 * y**3 - 60 * y**2 + 20 * y, - 80 * x**3 + 300 * x**2 * y - 160 * x**2 + 240 * x * y**2 - 300 * x * y + 80 * x, - ], - [ - -60 * x**2 * y + 40 * x * y + 20 * y**3 - 20 * y**2, - -80 * x**3 + 80 * x**2 + 120 * x * y**2 - 100 * x * y, - ], - [ - -15 * x**2 * y - 30 * x * y**2 + 20 * x * y - 5 * y**2 + 5 * y, - 15 * x**3 + 30 * x**2 * y - 20 * x**2 - 10 * x * y + 5 * x, + 12 * x * y + 12 * y**2 - 9 * y, + 18 * x**2 + 48 * x * y - 27 * x + 30 * y**2 - 36 * y + 9, ], + [18 * y**2 - 9 * y, 12 * x * y - 3 * x + 30 * y**2 - 24 * y + 3], [ - 30 * x * y**2 - 10 * x * y + 15 * y**3 - 20 * y**2 + 5 * y, - -30 * x**2 * y - 5 * x**2 - 15 * x * y**2 + 20 * x * y + 5 * x, + -9 * x * y - 15 * y**2 / 2 + 6 * y, + 3 * x**2 / 2 - 15 * x * y - 15 * y**2 + 15 * y - 3 / 2, ], + [12 * x * y - 3 * y, 18 * x**2 - 9 * x], + [-18 * y**2 + 9 * y, -12 * x * y + 3 * x], + [-9 * x * y - 3 * y**2 / 2 + 3 * y, 3 * x**2 / 2 + 9 * x * y - 3 * x], + [-24 * x * y - 12 * y**2 + 12 * y, -36 * x**2 - 48 * x * y + 36 * x], + [48 * x * y + 36 * y**2 - 36 * y, 12 * x**2 + 24 * x * y - 12 * x], + [-48 * x * y - 12 * y**2 + 12 * y, -12 * x**2 - 48 * x * y + 12 * x], ] if celltype == basix.CellType.tetrahedron: if n == 1: return [ - [0, 2 * z, 4 * y], - [0, -4 * z, -2 * y], - [2 * z, 0, 4 * x], - [-4 * z, 0, -2 * x], - [2 * y, 4 * x, 0], - [-4 * y, -2 * x, 0], - [-2 * z, -2 * z, -4 * x - 4 * y - 6 * z + 4], - [4 * z, 4 * z, 2 * x + 2 * y + 6 * z - 2], - [-2 * y, -4 * x - 6 * y - 4 * z + 4, -2 * y], - [4 * y, 2 * x + 6 * y + 2 * z - 2, 4 * y], [-6 * x - 4 * y - 4 * z + 4, -2 * x, -2 * x], [6 * x + 2 * y + 2 * z - 2, 4 * x, 4 * x], - ] - if n == 2: - return [ - [0, 12 * y * z - 3 * z, 18 * y**2 - 9 * y], - [0, -18 * z**2 + 9 * z, -12 * y * z + 3 * y], - [0, -9 * y * z - 3 * z**2 / 2 + 3 * z, 3 * y**2 / 2 + 9 * y * z - 3 * y], - [12 * x * z - 3 * z, 0, 18 * x**2 - 9 * x], - [-18 * z**2 + 9 * z, 0, -12 * x * z + 3 * x], - [-9 * x * z - 3 * z**2 / 2 + 3 * z, 0, 3 * x**2 / 2 + 9 * x * z - 3 * x], - [12 * x * y - 3 * y, 18 * x**2 - 9 * x, 0], - [-18 * y**2 + 9 * y, -12 * x * y + 3 * x, 0], - [-9 * x * y - 3 * y**2 / 2 + 3 * y, 3 * x**2 / 2 + 9 * x * y - 3 * x, 0], - [ - 12 * x * z + 12 * y * z + 12 * z**2 - 9 * z, - 12 * x * z + 12 * y * z + 12 * z**2 - 9 * z, - 18 * x**2 - + 36 * x * y - + 48 * x * z - - 27 * x - + 18 * y**2 - + 48 * y * z - - 27 * y - + 30 * z**2 - - 36 * z - + 9, - ], - [ - 18 * z**2 - 9 * z, - 18 * z**2 - 9 * z, - 12 * x * z - 3 * x + 12 * y * z - 3 * y + 30 * z**2 - 24 * z + 3, - ], - [ - -9 * x * z - 9 * y * z - 15 * z**2 / 2 + 6 * z, - -9 * x * z - 9 * y * z - 15 * z**2 / 2 + 6 * z, - 3 * x**2 / 2 - + 3 * x * y - - 15 * x * z - + 3 * y**2 / 2 - - 15 * y * z - - 15 * z**2 - + 15 * z - - 3 / 2, - ], - [ - 12 * x * y + 12 * y**2 + 12 * y * z - 9 * y, - 18 * x**2 - + 48 * x * y - + 36 * x * z - - 27 * x - + 30 * y**2 - + 48 * y * z - - 36 * y - + 18 * z**2 - - 27 * z - + 9, - 12 * x * y + 12 * y**2 + 12 * y * z - 9 * y, - ], - [ - 18 * y**2 - 9 * y, - 12 * x * y - 3 * x + 30 * y**2 + 12 * y * z - 24 * y - 3 * z + 3, - 18 * y**2 - 9 * y, - ], - [ - -9 * x * y - 15 * y**2 / 2 - 9 * y * z + 6 * y, - 3 * x**2 / 2 - - 15 * x * y - + 3 * x * z - - 15 * y**2 - - 15 * y * z - + 15 * y - + 3 * z**2 / 2 - - 3 / 2, - -9 * x * y - 15 * y**2 / 2 - 9 * y * z + 6 * y, - ], - [ - 30 * x**2 - + 48 * x * y - + 48 * x * z - - 36 * x - + 18 * y**2 - + 36 * y * z - - 27 * y - + 18 * z**2 - - 27 * z - + 9, - 12 * x**2 + 12 * x * y + 12 * x * z - 9 * x, - 12 * x**2 + 12 * x * y + 12 * x * z - 9 * x, - ], - [ - 30 * x**2 + 12 * x * y + 12 * x * z - 24 * x - 3 * y - 3 * z + 3, - 18 * x**2 - 9 * x, - 18 * x**2 - 9 * x, - ], - [ - -15 * x**2 - - 15 * x * y - - 15 * x * z - + 15 * x - + 3 * y**2 / 2 - + 3 * y * z - + 3 * z**2 / 2 - - 3 / 2, - -15 * x**2 / 2 - 9 * x * y - 9 * x * z + 6 * x, - -15 * x**2 / 2 - 9 * x * y - 9 * x * z + 6 * x, - ], - [36 * y * z, 12 * x * z, 12 * x * y], - [-12 * y * z, -36 * x * z, -12 * x * y], - [12 * y * z, 12 * x * z, 36 * x * y], - [ - -36 * y * z, - -12 * x * z - 48 * y * z - 12 * z**2 + 12 * z, - -12 * x * y - 12 * y**2 - 48 * y * z + 12 * y, - ], - [ - 12 * y * z, - 36 * x * z + 48 * y * z + 36 * z**2 - 36 * z, - 12 * x * y + 12 * y**2 + 24 * y * z - 12 * y, - ], - [ - -12 * y * z, - -12 * x * z - 24 * y * z - 12 * z**2 + 12 * z, - -36 * x * y - 36 * y**2 - 48 * y * z + 36 * y, - ], - [ - -48 * x * z - 12 * y * z - 12 * z**2 + 12 * z, - -36 * x * z, - -12 * x**2 - 12 * x * y - 48 * x * z + 12 * x, - ], - [ - 48 * x * z + 36 * y * z + 36 * z**2 - 36 * z, - 12 * x * z, - 12 * x**2 + 12 * x * y + 24 * x * z - 12 * x, - ], - [ - -24 * x * z - 12 * y * z - 12 * z**2 + 12 * z, - -12 * x * z, - -36 * x**2 - 36 * x * y - 48 * x * z + 36 * x, - ], - [ - -48 * x * y - 12 * y**2 - 12 * y * z + 12 * y, - -12 * x**2 - 48 * x * y - 12 * x * z + 12 * x, - -36 * x * y, - ], - [ - 48 * x * y + 36 * y**2 + 36 * y * z - 36 * y, - 12 * x**2 + 24 * x * y + 12 * x * z - 12 * x, - 12 * x * y, - ], - [ - -24 * x * y - 12 * y**2 - 12 * y * z + 12 * y, - -36 * x**2 - 48 * x * y - 36 * x * z + 36 * x, - -12 * x * y, - ], + [-2 * y, -4 * x - 6 * y - 4 * z + 4, -2 * y], + [4 * y, 2 * x + 6 * y + 2 * z - 2, 4 * y], + [-2 * z, -2 * z, -4 * x - 4 * y - 6 * z + 4], + [4 * z, 4 * z, 2 * x + 2 * y + 6 * z - 2], + [2 * y, 4 * x, 0], + [-4 * y, -2 * x, 0], + [2 * z, 0, 4 * x], + [-4 * z, 0, -2 * x], + [0, 2 * z, 4 * y], + [0, -4 * z, -2 * y], ] raise NotImplementedError -@pytest.mark.parametrize("degree", [1, 2, 3]) +@pytest.mark.parametrize("degree", [1, 2]) def test_tri(degree): celltype = basix.CellType.triangle g = sympy_nedelec(celltype, degree) @@ -426,7 +99,7 @@ def test_tri(degree): assert np.isclose(wtab[basix.index(kx, ky)], wsym).all() -@pytest.mark.parametrize("degree", [1, 2]) +@pytest.mark.parametrize("degree", [1]) def test_tet(degree): celltype = basix.CellType.tetrahedron g = sympy_nedelec(celltype, degree) diff --git a/test/test_rt.py b/test/test_rt.py index 9fe6e85c5..2088e83ed 100644 --- a/test/test_rt.py +++ b/test/test_rt.py @@ -21,35 +21,51 @@ def sympy_rt(celltype, n): if celltype == basix.CellType.triangle: if n == 1: - return [[-x, -y], [x - 1, y], [-x, 1 - y]] + return [[-x, 1 - y], [x - 1, y], [-x, -y]] if n == 2: return [ - [-8 * x**2 + 4 * x, -8 * x * y + 2 * y], - [-8 * x * y + 2 * x, -8 * y**2 + 4 * y], - [-8 * x**2 - 8 * x * y + 12 * x + 6 * y - 4, -8 * x * y - 8 * y**2 + 6 * y], - [8 * x * y - 2 * x - 6 * y + 2, 8 * y**2 - 4 * y], [8 * x**2 + 8 * x * y - 6 * x, 8 * x * y - 6 * x + 8 * y**2 - 12 * y + 4], [-8 * x**2 + 4 * x, -8 * x * y + 6 * x + 2 * y - 2], + [-8 * x**2 - 8 * x * y + 12 * x + 6 * y - 4, -8 * x * y - 8 * y**2 + 6 * y], + [8 * x * y - 2 * x - 6 * y + 2, 8 * y**2 - 4 * y], + [-8 * x**2 + 4 * x, -8 * x * y + 2 * y], + [-8 * x * y + 2 * x, -8 * y**2 + 4 * y], [-16 * x**2 - 8 * x * y + 16 * x, -16 * x * y - 8 * y**2 + 8 * y], [-8 * x**2 - 16 * x * y + 8 * x, -8 * x * y - 16 * y**2 + 16 * y], ] if n == 3: return [ - [-45 * x**3 + 45 * x**2 - 9 * x, -45 * x**2 * y + 30 * x * y - 3 * y], - [-45 * x * y**2 + 30 * x * y - 3 * x, -45 * y**3 + 45 * y**2 - 9 * y], [ - -45 * x**3 / 4 - - 45 * x**2 * y - + 75 * x**2 / 4 + -45 * x**3 - 90 * x**2 * y + 60 * x**2 - 45 * x * y**2 + 60 * x * y - 18 * x, + -45 * x**2 * y + + 30 * x**2 + - 90 * x * y**2 + + 120 * x * y + - 36 * x + - 45 * y**3 + + 90 * y**2 + - 54 * y + + 9, + ], + [ + -45 * x**3 + 45 * x**2 - 9 * x, + -45 * x**2 * y + 30 * x**2 + 30 * x * y - 24 * x - 3 * y + 3, + ], + [ + 45 * x**3 / 2 + + 45 * x**2 * y / 2 + - 105 * x**2 / 4 - 45 * x * y**2 / 4 - + 45 * x * y / 2 - - 6 * x, - -45 * x**2 * y / 4 - - 45 * x * y**2 - + 45 * x * y / 2 + + 21 * x / 4, + 45 * x**2 * y / 2 + - 15 * x**2 + + 45 * x * y**2 / 2 + - 75 * x * y / 2 + + 15 * x - 45 * y**3 / 4 - + 75 * y**2 / 4 - - 6 * y, + + 15 * y**2 + - 9 * y / 4 + - 3 / 2, ], [ 45 * x**3 @@ -83,37 +99,21 @@ def sympy_rt(celltype, n): + 105 * y**2 / 4 - 21 * y / 4, ], + [-45 * x**3 + 45 * x**2 - 9 * x, -45 * x**2 * y + 30 * x * y - 3 * y], + [-45 * x * y**2 + 30 * x * y - 3 * x, -45 * y**3 + 45 * y**2 - 9 * y], [ - -45 * x**3 - 90 * x**2 * y + 60 * x**2 - 45 * x * y**2 + 60 * x * y - 18 * x, - -45 * x**2 * y - + 30 * x**2 - - 90 * x * y**2 - + 120 * x * y - - 36 * x - - 45 * y**3 - + 90 * y**2 - - 54 * y - + 9, - ], - [ - -45 * x**3 + 45 * x**2 - 9 * x, - -45 * x**2 * y + 30 * x**2 + 30 * x * y - 24 * x - 3 * y + 3, - ], - [ - 45 * x**3 / 2 - + 45 * x**2 * y / 2 - - 105 * x**2 / 4 + -45 * x**3 / 4 + - 45 * x**2 * y + + 75 * x**2 / 4 - 45 * x * y**2 / 4 - + 21 * x / 4, - 45 * x**2 * y / 2 - - 15 * x**2 - + 45 * x * y**2 / 2 - - 75 * x * y / 2 - + 15 * x + + 45 * x * y / 2 + - 6 * x, + -45 * x**2 * y / 4 + - 45 * x * y**2 + + 45 * x * y / 2 - 45 * y**3 / 4 - + 15 * y**2 - - 9 * y / 4 - - 3 / 2, + + 75 * y**2 / 4 + - 6 * y, ], [ 270 * x**3 @@ -153,23 +153,20 @@ def sympy_rt(celltype, n): if celltype == basix.CellType.tetrahedron: if n == 1: return [ - [2 * x, 2 * y, 2 * z], - [2 - 2 * x, -2 * y, -2 * z], - [2 * x, 2 * y - 2, 2 * z], [-2 * x, -2 * y, 2 - 2 * z], + [2 * x, 2 * y - 2, 2 * z], + [2 - 2 * x, -2 * y, -2 * z], + [2 * x, 2 * y, 2 * z], ] if n == 2: return [ - [30 * x**2 - 12 * x, 30 * x * y - 6 * y, 30 * x * z - 6 * z], - [30 * x * y - 6 * x, 30 * y**2 - 12 * y, 30 * y * z - 6 * z], - [30 * x * z - 6 * x, 30 * y * z - 6 * y, 30 * z**2 - 12 * z], [ - 30 * x**2 + 30 * x * y + 30 * x * z - 48 * x - 24 * y - 24 * z + 18, + 30 * x**2 + 30 * x * y + 30 * x * z - 24 * x, 30 * x * y + 30 * y**2 + 30 * y * z - 24 * y, - 30 * x * z + 30 * y * z + 30 * z**2 - 24 * z, + 30 * x * z - 24 * x + 30 * y * z - 24 * y + 30 * z**2 - 48 * z + 18, ], - [-30 * x * y + 6 * x + 24 * y - 6, -30 * y**2 + 12 * y, -30 * y * z + 6 * z], - [-30 * x * z + 6 * x + 24 * z - 6, -30 * y * z + 6 * y, -30 * z**2 + 12 * z], + [-30 * x**2 + 12 * x, -30 * x * y + 6 * y, -30 * x * z + 24 * x + 6 * z - 6], + [-30 * x * y + 6 * x, -30 * y**2 + 12 * y, -30 * y * z + 24 * y + 6 * z - 6], [ -30 * x**2 - 30 * x * y - 30 * x * z + 24 * x, -30 * x * y + 24 * x - 30 * y**2 - 30 * y * z + 48 * y + 24 * z - 18, @@ -178,12 +175,15 @@ def sympy_rt(celltype, n): [30 * x**2 - 12 * x, 30 * x * y - 24 * x - 6 * y + 6, 30 * x * z - 6 * z], [30 * x * z - 6 * x, 30 * y * z - 6 * y - 24 * z + 6, 30 * z**2 - 12 * z], [ - 30 * x**2 + 30 * x * y + 30 * x * z - 24 * x, + 30 * x**2 + 30 * x * y + 30 * x * z - 48 * x - 24 * y - 24 * z + 18, 30 * x * y + 30 * y**2 + 30 * y * z - 24 * y, - 30 * x * z - 24 * x + 30 * y * z - 24 * y + 30 * z**2 - 48 * z + 18, + 30 * x * z + 30 * y * z + 30 * z**2 - 24 * z, ], - [-30 * x**2 + 12 * x, -30 * x * y + 6 * y, -30 * x * z + 24 * x + 6 * z - 6], - [-30 * x * y + 6 * x, -30 * y**2 + 12 * y, -30 * y * z + 24 * y + 6 * z - 6], + [-30 * x * y + 6 * x + 24 * y - 6, -30 * y**2 + 12 * y, -30 * y * z + 6 * z], + [-30 * x * z + 6 * x + 24 * z - 6, -30 * y * z + 6 * y, -30 * z**2 + 12 * z], + [30 * x**2 - 12 * x, 30 * x * y - 6 * y, 30 * x * z - 6 * z], + [30 * x * y - 6 * x, 30 * y**2 - 12 * y, 30 * y * z - 6 * z], + [30 * x * z - 6 * x, 30 * y * z - 6 * y, 30 * z**2 - 12 * z], [ -60 * x**2 - 30 * x * y - 30 * x * z + 60 * x, -60 * x * y - 30 * y**2 - 30 * y * z + 30 * y, @@ -200,777 +200,6 @@ def sympy_rt(celltype, n): -30 * x * z - 30 * y * z - 60 * z**2 + 60 * z, ], ] - if n == 3: - return [ - [ - 252 * x**3 - 216 * x**2 + 36 * x, - 252 * x**2 * y - 144 * x * y + 12 * y, - 252 * x**2 * z - 144 * x * z + 12 * z, - ], - [ - 252 * x * y**2 - 144 * x * y + 12 * x, - 252 * y**3 - 216 * y**2 + 36 * y, - 252 * y**2 * z - 144 * y * z + 12 * z, - ], - [ - 252 * x * z**2 - 144 * x * z + 12 * x, - 252 * y * z**2 - 144 * y * z + 12 * y, - 252 * z**3 - 216 * z**2 + 36 * z, - ], - [ - 63 * x * y**2 - + 252 * x * y * z - - 72 * x * y - + 63 * x * z**2 - - 72 * x * z - + 12 * x, - 63 * y**3 + 252 * y**2 * z - 90 * y**2 + 63 * y * z**2 - 108 * y * z + 24 * y, - 63 * y**2 * z + 252 * y * z**2 - 108 * y * z + 63 * z**3 - 90 * z**2 + 24 * z, - ], - [ - 63 * x**3 + 252 * x**2 * z - 90 * x**2 + 63 * x * z**2 - 108 * x * z + 24 * x, - 63 * x**2 * y - + 252 * x * y * z - - 72 * x * y - + 63 * y * z**2 - - 72 * y * z - + 12 * y, - 63 * x**2 * z + 252 * x * z**2 - 108 * x * z + 63 * z**3 - 90 * z**2 + 24 * z, - ], - [ - 63 * x**3 + 252 * x**2 * y - 90 * x**2 + 63 * x * y**2 - 108 * x * y + 24 * x, - 63 * x**2 * y + 252 * x * y**2 - 108 * x * y + 63 * y**3 - 90 * y**2 + 24 * y, - 63 * x**2 * z - + 252 * x * y * z - - 72 * x * z - + 63 * y**2 * z - - 72 * y * z - + 12 * z, - ], - [ - -252 * x**3 - - 504 * x**2 * y - - 504 * x**2 * z - + 540 * x**2 - - 252 * x * y**2 - - 504 * x * y * z - + 720 * x * y - - 252 * x * z**2 - + 720 * x * z - - 360 * x - + 180 * y**2 - + 360 * y * z - - 240 * y - + 180 * z**2 - - 240 * z - + 72, - -252 * x**2 * y - - 504 * x * y**2 - - 504 * x * y * z - + 360 * x * y - - 252 * y**3 - - 504 * y**2 * z - + 360 * y**2 - - 252 * y * z**2 - + 360 * y * z - - 120 * y, - -252 * x**2 * z - - 504 * x * y * z - - 504 * x * z**2 - + 360 * x * z - - 252 * y**2 * z - - 504 * y * z**2 - + 360 * y * z - - 252 * z**3 - + 360 * z**2 - - 120 * z, - ], - [ - -252 * x * y**2 + 144 * x * y - 12 * x + 180 * y**2 - 120 * y + 12, - -252 * y**3 + 216 * y**2 - 36 * y, - -252 * y**2 * z + 144 * y * z - 12 * z, - ], - [ - -252 * x * z**2 + 144 * x * z - 12 * x + 180 * z**2 - 120 * z + 12, - -252 * y * z**2 + 144 * y * z - 12 * y, - -252 * z**3 + 216 * z**2 - 36 * z, - ], - [ - -63 * x * y**2 - - 252 * x * y * z - + 72 * x * y - - 63 * x * z**2 - + 72 * x * z - - 12 * x - + 45 * y**2 - + 180 * y * z - - 60 * y - + 45 * z**2 - - 60 * z - + 12, - -63 * y**3 - 252 * y**2 * z + 90 * y**2 - 63 * y * z**2 + 108 * y * z - 24 * y, - -63 * y**2 * z - 252 * y * z**2 + 108 * y * z - 63 * z**3 + 90 * z**2 - 24 * z, - ], - [ - -63 * x**3 - - 126 * x**2 * y - + 126 * x**2 * z - + 99 * x**2 - - 63 * x * y**2 - + 126 * x * y * z - + 144 * x * y - + 126 * x * z**2 - - 216 * x * z - - 33 * x - + 45 * y**2 - - 90 * y * z - - 30 * y - - 90 * z**2 - + 90 * z - - 3, - -63 * x**2 * y - - 126 * x * y**2 - + 126 * x * y * z - + 54 * x * y - - 63 * y**3 - + 126 * y**2 * z - + 54 * y**2 - + 126 * y * z**2 - - 126 * y * z - - 3 * y, - -63 * x**2 * z - - 126 * x * y * z - + 126 * x * z**2 - + 18 * x * z - - 63 * y**2 * z - + 126 * y * z**2 - + 18 * y * z - + 126 * z**3 - - 144 * z**2 - + 21 * z, - ], - [ - -63 * x**3 - + 126 * x**2 * y - - 126 * x**2 * z - + 99 * x**2 - + 126 * x * y**2 - + 126 * x * y * z - - 216 * x * y - - 63 * x * z**2 - + 144 * x * z - - 33 * x - - 90 * y**2 - - 90 * y * z - + 90 * y - + 45 * z**2 - - 30 * z - - 3, - -63 * x**2 * y - + 126 * x * y**2 - - 126 * x * y * z - + 18 * x * y - + 126 * y**3 - + 126 * y**2 * z - - 144 * y**2 - - 63 * y * z**2 - + 18 * y * z - + 21 * y, - -63 * x**2 * z - + 126 * x * y * z - - 126 * x * z**2 - + 54 * x * z - + 126 * y**2 * z - + 126 * y * z**2 - - 126 * y * z - - 63 * z**3 - + 54 * z**2 - - 3 * z, - ], - [ - 252 * x**3 - + 504 * x**2 * y - + 504 * x**2 * z - - 360 * x**2 - + 252 * x * y**2 - + 504 * x * y * z - - 360 * x * y - + 252 * x * z**2 - - 360 * x * z - + 120 * x, - 252 * x**2 * y - - 180 * x**2 - + 504 * x * y**2 - + 504 * x * y * z - - 720 * x * y - - 360 * x * z - + 240 * x - + 252 * y**3 - + 504 * y**2 * z - - 540 * y**2 - + 252 * y * z**2 - - 720 * y * z - + 360 * y - - 180 * z**2 - + 240 * z - - 72, - 252 * x**2 * z - + 504 * x * y * z - + 504 * x * z**2 - - 360 * x * z - + 252 * y**2 * z - + 504 * y * z**2 - - 360 * y * z - + 252 * z**3 - - 360 * z**2 - + 120 * z, - ], - [ - 252 * x**3 - 216 * x**2 + 36 * x, - 252 * x**2 * y - 180 * x**2 - 144 * x * y + 120 * x + 12 * y - 12, - 252 * x**2 * z - 144 * x * z + 12 * z, - ], - [ - 252 * x * z**2 - 144 * x * z + 12 * x, - 252 * y * z**2 - 144 * y * z + 12 * y - 180 * z**2 + 120 * z - 12, - 252 * z**3 - 216 * z**2 + 36 * z, - ], - [ - 63 * x**3 + 252 * x**2 * z - 90 * x**2 + 63 * x * z**2 - 108 * x * z + 24 * x, - 63 * x**2 * y - - 45 * x**2 - + 252 * x * y * z - - 72 * x * y - - 180 * x * z - + 60 * x - + 63 * y * z**2 - - 72 * y * z - + 12 * y - - 45 * z**2 - + 60 * z - - 12, - 63 * x**2 * z + 252 * x * z**2 - 108 * x * z + 63 * z**3 - 90 * z**2 + 24 * z, - ], - [ - 63 * x**3 - + 126 * x**2 * y - - 126 * x**2 * z - - 54 * x**2 - + 63 * x * y**2 - - 126 * x * y * z - - 54 * x * y - - 126 * x * z**2 - + 126 * x * z - + 3 * x, - 63 * x**2 * y - - 45 * x**2 - + 126 * x * y**2 - - 126 * x * y * z - - 144 * x * y - + 90 * x * z - + 30 * x - + 63 * y**3 - - 126 * y**2 * z - - 99 * y**2 - - 126 * y * z**2 - + 216 * y * z - + 33 * y - + 90 * z**2 - - 90 * z - + 3, - 63 * x**2 * z - + 126 * x * y * z - - 126 * x * z**2 - - 18 * x * z - + 63 * y**2 * z - - 126 * y * z**2 - - 18 * y * z - - 126 * z**3 - + 144 * z**2 - - 21 * z, - ], - [ - -126 * x**3 - - 126 * x**2 * y - - 126 * x**2 * z - + 144 * x**2 - + 63 * x * y**2 - + 126 * x * y * z - - 18 * x * y - + 63 * x * z**2 - - 18 * x * z - - 21 * x, - -126 * x**2 * y - + 90 * x**2 - - 126 * x * y**2 - - 126 * x * y * z - + 216 * x * y - + 90 * x * z - - 90 * x - + 63 * y**3 - + 126 * y**2 * z - - 99 * y**2 - + 63 * y * z**2 - - 144 * y * z - + 33 * y - - 45 * z**2 - + 30 * z - + 3, - -126 * x**2 * z - - 126 * x * y * z - - 126 * x * z**2 - + 126 * x * z - + 63 * y**2 * z - + 126 * y * z**2 - - 54 * y * z - + 63 * z**3 - - 54 * z**2 - + 3 * z, - ], - [ - -252 * x**3 - - 504 * x**2 * y - - 504 * x**2 * z - + 360 * x**2 - - 252 * x * y**2 - - 504 * x * y * z - + 360 * x * y - - 252 * x * z**2 - + 360 * x * z - - 120 * x, - -252 * x**2 * y - - 504 * x * y**2 - - 504 * x * y * z - + 360 * x * y - - 252 * y**3 - - 504 * y**2 * z - + 360 * y**2 - - 252 * y * z**2 - + 360 * y * z - - 120 * y, - -252 * x**2 * z - + 180 * x**2 - - 504 * x * y * z - + 360 * x * y - - 504 * x * z**2 - + 720 * x * z - - 240 * x - - 252 * y**2 * z - + 180 * y**2 - - 504 * y * z**2 - + 720 * y * z - - 240 * y - - 252 * z**3 - + 540 * z**2 - - 360 * z - + 72, - ], - [ - -252 * x**3 + 216 * x**2 - 36 * x, - -252 * x**2 * y + 144 * x * y - 12 * y, - -252 * x**2 * z + 180 * x**2 + 144 * x * z - 120 * x - 12 * z + 12, - ], - [ - -252 * x * y**2 + 144 * x * y - 12 * x, - -252 * y**3 + 216 * y**2 - 36 * y, - -252 * y**2 * z + 180 * y**2 + 144 * y * z - 120 * y - 12 * z + 12, - ], - [ - -63 * x**3 - 252 * x**2 * y + 90 * x**2 - 63 * x * y**2 + 108 * x * y - 24 * x, - -63 * x**2 * y - 252 * x * y**2 + 108 * x * y - 63 * y**3 + 90 * y**2 - 24 * y, - -63 * x**2 * z - + 45 * x**2 - - 252 * x * y * z - + 180 * x * y - + 72 * x * z - - 60 * x - - 63 * y**2 * z - + 45 * y**2 - + 72 * y * z - - 60 * y - - 12 * z - + 12, - ], - [ - -63 * x**3 - + 126 * x**2 * y - - 126 * x**2 * z - + 54 * x**2 - + 126 * x * y**2 - + 126 * x * y * z - - 126 * x * y - - 63 * x * z**2 - + 54 * x * z - - 3 * x, - -63 * x**2 * y - + 126 * x * y**2 - - 126 * x * y * z - + 18 * x * y - + 126 * y**3 - + 126 * y**2 * z - - 144 * y**2 - - 63 * y * z**2 - + 18 * y * z - + 21 * y, - -63 * x**2 * z - + 45 * x**2 - + 126 * x * y * z - - 90 * x * y - - 126 * x * z**2 - + 144 * x * z - - 30 * x - + 126 * y**2 * z - - 90 * y**2 - + 126 * y * z**2 - - 216 * y * z - + 90 * y - - 63 * z**3 - + 99 * z**2 - - 33 * z - - 3, - ], - [ - 126 * x**3 - + 126 * x**2 * y - + 126 * x**2 * z - - 144 * x**2 - - 63 * x * y**2 - - 126 * x * y * z - + 18 * x * y - - 63 * x * z**2 - + 18 * x * z - + 21 * x, - 126 * x**2 * y - + 126 * x * y**2 - + 126 * x * y * z - - 126 * x * y - - 63 * y**3 - - 126 * y**2 * z - + 54 * y**2 - - 63 * y * z**2 - + 54 * y * z - - 3 * y, - 126 * x**2 * z - - 90 * x**2 - + 126 * x * y * z - - 90 * x * y - + 126 * x * z**2 - - 216 * x * z - + 90 * x - - 63 * y**2 * z - + 45 * y**2 - - 126 * y * z**2 - + 144 * y * z - - 30 * y - - 63 * z**3 - + 99 * z**2 - - 33 * z - - 3, - ], - [ - 1512 * x**3 - + 2016 * x**2 * y - + 2016 * x**2 * z - - 2592 * x**2 - + 504 * x * y**2 - + 1008 * x * y * z - - 1728 * x * y - + 504 * x * z**2 - - 1728 * x * z - + 1080 * x, - 1512 * x**2 * y - + 2016 * x * y**2 - + 2016 * x * y * z - - 1728 * x * y - + 504 * y**3 - + 1008 * y**2 * z - - 864 * y**2 - + 504 * y * z**2 - - 864 * y * z - + 360 * y, - 1512 * x**2 * z - + 2016 * x * y * z - + 2016 * x * z**2 - - 1728 * x * z - + 504 * y**2 * z - + 1008 * y * z**2 - - 864 * y * z - + 504 * z**3 - - 864 * z**2 - + 360 * z, - ], - [ - 504 * x**3 - + 2016 * x**2 * y - + 1008 * x**2 * z - - 864 * x**2 - + 1512 * x * y**2 - + 2016 * x * y * z - - 1728 * x * y - + 504 * x * z**2 - - 864 * x * z - + 360 * x, - 504 * x**2 * y - + 2016 * x * y**2 - + 1008 * x * y * z - - 1728 * x * y - + 1512 * y**3 - + 2016 * y**2 * z - - 2592 * y**2 - + 504 * y * z**2 - - 1728 * y * z - + 1080 * y, - 504 * x**2 * z - + 2016 * x * y * z - + 1008 * x * z**2 - - 864 * x * z - + 1512 * y**2 * z - + 2016 * y * z**2 - - 1728 * y * z - + 504 * z**3 - - 864 * z**2 - + 360 * z, - ], - [ - 504 * x**3 - + 1008 * x**2 * y - + 2016 * x**2 * z - - 864 * x**2 - + 504 * x * y**2 - + 2016 * x * y * z - - 864 * x * y - + 1512 * x * z**2 - - 1728 * x * z - + 360 * x, - 504 * x**2 * y - + 1008 * x * y**2 - + 2016 * x * y * z - - 864 * x * y - + 504 * y**3 - + 2016 * y**2 * z - - 864 * y**2 - + 1512 * y * z**2 - - 1728 * y * z - + 360 * y, - 504 * x**2 * z - + 1008 * x * y * z - + 2016 * x * z**2 - - 1728 * x * z - + 504 * y**2 * z - + 2016 * y * z**2 - - 1728 * y * z - + 1512 * z**3 - - 2592 * z**2 - + 1080 * z, - ], - [ - -1512 * x**3 - - 1008 * x**2 * y - - 1008 * x**2 * z - + 1944 * x**2 - + 288 * x * y - + 288 * x * z - - 432 * x, - -1512 * x**2 * y - - 1008 * x * y**2 - - 1008 * x * y * z - + 1296 * x * y - + 144 * y**2 - + 144 * y * z - - 144 * y, - -1512 * x**2 * z - - 1008 * x * y * z - - 1008 * x * z**2 - + 1296 * x * z - + 144 * y * z - + 144 * z**2 - - 144 * z, - ], - [ - -1008 * x**3 - - 2016 * x**2 * y - - 1008 * x**2 * z - + 1296 * x**2 - + 576 * x * y - + 288 * x * z - - 288 * x, - -1008 * x**2 * y - - 2016 * x * y**2 - - 1008 * x * y * z - + 2016 * x * y - + 288 * y**2 - + 144 * y * z - - 288 * y, - -1008 * x**2 * z - - 2016 * x * y * z - - 1008 * x * z**2 - + 1152 * x * z - + 288 * y * z - + 144 * z**2 - - 144 * z, - ], - [ - -1008 * x**3 - - 1008 * x**2 * y - - 2016 * x**2 * z - + 1296 * x**2 - + 288 * x * y - + 576 * x * z - - 288 * x, - -1008 * x**2 * y - - 1008 * x * y**2 - - 2016 * x * y * z - + 1152 * x * y - + 144 * y**2 - + 288 * y * z - - 144 * y, - -1008 * x**2 * z - - 1008 * x * y * z - - 2016 * x * z**2 - + 2016 * x * z - + 144 * y * z - + 288 * z**2 - - 288 * z, - ], - [ - -2016 * x**2 * y - + 288 * x**2 - - 1008 * x * y**2 - - 1008 * x * y * z - + 2016 * x * y - + 144 * x * z - - 288 * x, - -2016 * x * y**2 - + 576 * x * y - - 1008 * y**3 - - 1008 * y**2 * z - + 1296 * y**2 - + 288 * y * z - - 288 * y, - -2016 * x * y * z - + 288 * x * z - - 1008 * y**2 * z - - 1008 * y * z**2 - + 1152 * y * z - + 144 * z**2 - - 144 * z, - ], - [ - -1008 * x**2 * y - + 144 * x**2 - - 1512 * x * y**2 - - 1008 * x * y * z - + 1296 * x * y - + 144 * x * z - - 144 * x, - -1008 * x * y**2 - + 288 * x * y - - 1512 * y**3 - - 1008 * y**2 * z - + 1944 * y**2 - + 288 * y * z - - 432 * y, - -1008 * x * y * z - + 144 * x * z - - 1512 * y**2 * z - - 1008 * y * z**2 - + 1296 * y * z - + 144 * z**2 - - 144 * z, - ], - [ - -1008 * x**2 * y - + 144 * x**2 - - 1008 * x * y**2 - - 2016 * x * y * z - + 1152 * x * y - + 288 * x * z - - 144 * x, - -1008 * x * y**2 - + 288 * x * y - - 1008 * y**3 - - 2016 * y**2 * z - + 1296 * y**2 - + 576 * y * z - - 288 * y, - -1008 * x * y * z - + 144 * x * z - - 1008 * y**2 * z - - 2016 * y * z**2 - + 2016 * y * z - + 288 * z**2 - - 288 * z, - ], - [ - -2016 * x**2 * z - + 288 * x**2 - - 1008 * x * y * z - + 144 * x * y - - 1008 * x * z**2 - + 2016 * x * z - - 288 * x, - -2016 * x * y * z - + 288 * x * y - - 1008 * y**2 * z - + 144 * y**2 - - 1008 * y * z**2 - + 1152 * y * z - - 144 * y, - -2016 * x * z**2 - + 576 * x * z - - 1008 * y * z**2 - + 288 * y * z - - 1008 * z**3 - + 1296 * z**2 - - 288 * z, - ], - [ - -1008 * x**2 * z - + 144 * x**2 - - 2016 * x * y * z - + 288 * x * y - - 1008 * x * z**2 - + 1152 * x * z - - 144 * x, - -1008 * x * y * z - + 144 * x * y - - 2016 * y**2 * z - + 288 * y**2 - - 1008 * y * z**2 - + 2016 * y * z - - 288 * y, - -1008 * x * z**2 - + 288 * x * z - - 2016 * y * z**2 - + 576 * y * z - - 1008 * z**3 - + 1296 * z**2 - - 288 * z, - ], - [ - -1008 * x**2 * z - + 144 * x**2 - - 1008 * x * y * z - + 144 * x * y - - 1512 * x * z**2 - + 1296 * x * z - - 144 * x, - -1008 * x * y * z - + 144 * x * y - - 1008 * y**2 * z - + 144 * y**2 - - 1512 * y * z**2 - + 1296 * y * z - - 144 * y, - -1008 * x * z**2 - + 288 * x * z - - 1008 * y * z**2 - + 288 * y * z - - 1512 * z**3 - + 1944 * z**2 - - 432 * z, - ], - ] raise NotImplementedError @@ -999,7 +228,7 @@ def test_tri(degree): assert np.isclose(wtab[basix.index(kx, ky)], wsym).all() -@pytest.mark.parametrize("degree", [1, 2, 3]) +@pytest.mark.parametrize("degree", [1, 2]) def test_tet(degree): celltype = basix.CellType.tetrahedron g = sympy_rt(celltype, degree) From cb9ea4b1cde7ac93078087924ddbca2f80042a25 Mon Sep 17 00:00:00 2001 From: Matthew Scroggs Date: Wed, 17 Jun 2026 13:16:19 +0100 Subject: [PATCH 5/9] update more tests --- cpp/basix/finite-element.cpp | 24 ++++++++++++------------ test/test_elements.py | 32 ++++++++++++++++---------------- test/test_hermite.py | 6 +++--- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/cpp/basix/finite-element.cpp b/cpp/basix/finite-element.cpp index 355e28e65..07ed31928 100644 --- a/cpp/basix/finite-element.cpp +++ b/cpp/basix/finite-element.cpp @@ -561,7 +561,7 @@ std::vector basix::lex_dof_ordering(element::family family, cell::type cell { int n = degree - 1; for (int i = 0; i < n; ++i) - perm.push_back(3 + 2 * n + i); + perm.push_back(3 + i); perm.push_back(1); int dof = 3 + 3 * n; for (int i = 0; i < n; ++i) @@ -569,7 +569,7 @@ std::vector basix::lex_dof_ordering(element::family family, cell::type cell perm.push_back(3 + n + i); for (int j = 0; j < n - 1 - i; ++j) perm.push_back(dof++); - perm.push_back(3 + i); + perm.push_back(3 + 2 * n + i); } perm.push_back(2); } @@ -648,30 +648,30 @@ std::vector basix::lex_dof_ordering(element::family family, cell::type cell int face3 = 4 + 6 * n + n * (n - 1) * 3 / 2; int interior = 4 + 6 * n + n * (n - 1) * 2; for (int i = 0; i < n; ++i) - perm.push_back(4 + 5 * n + i); + perm.push_back(4 + i); perm.push_back(1); for (int i = 0; i < n; ++i) { - perm.push_back(4 + 4 * n + i); + perm.push_back(4 + n + i); for (int j = 0; j < n - 1 - i; ++j) - perm.push_back(face3++); - perm.push_back(4 + 2 * n + i); + perm.push_back(face0++); + perm.push_back(4 + 3 * n + i); } perm.push_back(2); for (int i = 0; i < n; ++i) { - perm.push_back(4 + 3 * n + i); + perm.push_back(4 + 2 * n + i); for (int j = 0; j < n - 1 - i; ++j) - perm.push_back(face2++); - perm.push_back(4 + n + i); + perm.push_back(face1++); + perm.push_back(4 + 4 * n + i); for (int j = 0; j < n - 1 - i; ++j) { - perm.push_back(face1++); + perm.push_back(face2++); for (int k = 0; k < n - 2 - i - j; ++k) perm.push_back(interior++); - perm.push_back(face0++); + perm.push_back(face3++); } - perm.push_back(4 + i); + perm.push_back(4 + 5 * n + i); } perm.push_back(3); } diff --git a/test/test_elements.py b/test/test_elements.py index 72f5b7591..91e3577d6 100644 --- a/test/test_elements.py +++ b/test/test_elements.py @@ -115,12 +115,12 @@ def test_dimension(family, cell, degree, dim): "triangle", 1, [ - lambda x: (-x[0], -x[1]), - lambda x: (3**0.5 * x[0], -(3**0.5) * x[1]), - lambda x: (x[0] - 1, x[1]), - lambda x: (3**0.5 * (1 - x[0] - 2 * x[1]), 3**0.5 * x[1]), lambda x: (-x[0], 1 - x[1]), lambda x: (-(3**0.5) * x[0], 3**0.5 * (2 * x[0] + x[1] - 1)), + lambda x: (x[0] - 1, x[1]), + lambda x: (3**0.5 * (1 - x[0] - 2 * x[1]), 3**0.5 * x[1]), + lambda x: (-x[0], -x[1]), + lambda x: (3**0.5 * x[0], -(3**0.5) * x[1]), ], ), ( @@ -128,9 +128,9 @@ def test_dimension(family, cell, degree, dim): "triangle", 1, [ - lambda x: (-x[0], -x[1]), - lambda x: (x[0] - 1, x[1]), lambda x: (-x[0], 1 - x[1]), + lambda x: (x[0] - 1, x[1]), + lambda x: (-x[0], -x[1]), ], ), ( @@ -138,10 +138,10 @@ def test_dimension(family, cell, degree, dim): "tetrahedron", 1, [ - lambda x: (2**0.5 * x[0], 2**0.5 * x[1], 2**0.5 * x[2]), - lambda x: (2**0.5 - 2**0.5 * x[0], -(2**0.5) * x[1], -(2**0.5) * x[2]), - lambda x: (2**0.5 * x[0], 2**0.5 * x[1] - 2**0.5, 2**0.5 * x[2]), lambda x: (-(2**0.5) * x[0], -(2**0.5) * x[1], 2**0.5 - 2**0.5 * x[2]), + lambda x: (2**0.5 * x[0], 2**0.5 * x[1] - 2**0.5, 2**0.5 * x[2]), + lambda x: (2**0.5 - 2**0.5 * x[0], -(2**0.5) * x[1], -(2**0.5) * x[2]), + lambda x: (2**0.5 * x[0], 2**0.5 * x[1], 2**0.5 * x[2]), ], ), ( @@ -149,9 +149,9 @@ def test_dimension(family, cell, degree, dim): "triangle", 1, [ - lambda x: (-x[1], x[0]), - lambda x: (x[1], 1 - x[0]), lambda x: (1.0 - x[1], x[0]), + lambda x: (x[1], 1 - x[0]), + lambda x: (-x[1], x[0]), ], ), ( @@ -159,12 +159,12 @@ def test_dimension(family, cell, degree, dim): "tetrahedron", 1, [ - lambda x: (0.0, -x[2], x[1]), - lambda x: (-x[2], 0.0, x[0]), - lambda x: (-x[1], x[0], 0.0), - lambda x: (x[2], x[2], 1.0 - x[0] - x[1]), - lambda x: (x[1], 1.0 - x[0] - x[2], x[1]), lambda x: (1.0 - x[1] - x[2], x[0], x[0]), + lambda x: (x[1], 1.0 - x[0] - x[2], x[1]), + lambda x: (x[2], x[2], 1.0 - x[0] - x[1]), + lambda x: (-x[1], x[0], 0.0), + lambda x: (-x[2], 0.0, x[0]), + lambda x: (0.0, -x[2], x[1]), ], ), ], diff --git a/test/test_hermite.py b/test/test_hermite.py index 9cd6fed6f..ddee07b87 100644 --- a/test/test_hermite.py +++ b/test/test_hermite.py @@ -176,10 +176,10 @@ def test_hermite_tetrahedron(): + 2 * y * z + z**3 - z**2, - 27 * x * y * z, - -27 * x * y * z - 27 * y**2 * z - 27 * y * z**2 + 27 * y * z, - -27 * x**2 * z - 27 * x * y * z - 27 * x * z**2 + 27 * x * z, -27 * x**2 * y - 27 * x * y**2 - 27 * x * y * z + 27 * x * y, + -27 * x**2 * z - 27 * x * y * z - 27 * x * z**2 + 27 * x * z, + -27 * x * y * z - 27 * y**2 * z - 27 * y * z**2 + 27 * y * z, + 27 * x * y * z, ] pts = basix.create_lattice(basix.CellType.tetrahedron, 3, basix.LatticeType.equispaced, True) From 86691a31c51c9c69e82927a65a099d68d24ae8da Mon Sep 17 00:00:00 2001 From: Matthew Scroggs Date: Thu, 18 Jun 2026 08:53:22 +0100 Subject: [PATCH 6/9] fix jacobians --- cpp/basix/dof-transformations.cpp | 5 +- test/test_nedelec_second_kind.py | 155 +++++++++++++++++++++++++++++- 2 files changed, 156 insertions(+), 4 deletions(-) diff --git a/cpp/basix/dof-transformations.cpp b/cpp/basix/dof-transformations.cpp index a8df682d9..78344802b 100644 --- a/cpp/basix/dof-transformations.cpp +++ b/cpp/basix/dof-transformations.cpp @@ -139,12 +139,12 @@ mapinfo_t get_mapinfo(cell::type cell_type) }; mdex::mdarray> J( md::extents{}, - {-1., 1., 0., -1., 0., 0., 0., 0., 1.}); + {0., 1., 0., -1., -1., 0., 0., 0., 1.}); T detJ = 1.0; mdex::mdarray> K( md::extents{}, - {0., -1., 0., 1., -1., 0., 0., 0., 1.}); + {-1., -1., 0., 1., 0., 0., 0., 0., 1.}); data.push_back(std::tuple(map, J, detJ, K)); } { @@ -438,7 +438,6 @@ std::pair, std::array> compute_transformation( for (std::size_t k1 = 0; k1 < result.extent(0); ++k1) tabulated_data(k0, k1, j) = result(k1, k0); } - // push forward mdarray_t pushed_data(tabulated_data.extents()); { diff --git a/test/test_nedelec_second_kind.py b/test/test_nedelec_second_kind.py index 71cc07ca6..dec0d6f1a 100644 --- a/test/test_nedelec_second_kind.py +++ b/test/test_nedelec_second_kind.py @@ -72,6 +72,159 @@ def sympy_nedelec(celltype, n): [0, 2 * z, 4 * y], [0, -4 * z, -2 * y], ] + if n == 2: + return [ + ( + 30 * x**2 + + 48 * x * y + + 48 * x * z + - 36 * x + + 18 * y**2 + + 36 * y * z + - 27 * y + + 18 * z**2 + - 27 * z + + 9, + 12 * x**2 + 12 * x * y + 12 * x * z - 9 * x, + 12 * x**2 + 12 * x * y + 12 * x * z - 9 * x, + ), + ( + 30 * x**2 + 12 * x * y + 12 * x * z - 24 * x - 3 * y - 3 * z + 3, + 18 * x**2 - 9 * x, + 18 * x**2 - 9 * x, + ), + ( + -15 * x**2 + - 15 * x * y + - 15 * x * z + + 15 * x + + 3 * y**2 / 2 + + 3 * y * z + + 3 * z**2 / 2 + - 3 / 2, + -15 * x**2 / 2 - 9 * x * y - 9 * x * z + 6 * x, + -15 * x**2 / 2 - 9 * x * y - 9 * x * z + 6 * x, + ), + ( + 12 * x * y + 12 * y**2 + 12 * y * z - 9 * y, + 18 * x**2 + + 48 * x * y + + 36 * x * z + - 27 * x + + 30 * y**2 + + 48 * y * z + - 36 * y + + 18 * z**2 + - 27 * z + + 9, + 12 * x * y + 12 * y**2 + 12 * y * z - 9 * y, + ), + ( + 18 * y**2 - 9 * y, + 12 * x * y - 3 * x + 30 * y**2 + 12 * y * z - 24 * y - 3 * z + 3, + 18 * y**2 - 9 * y, + ), + ( + -9 * x * y - 15 * y**2 / 2 - 9 * y * z + 6 * y, + 3 * x**2 / 2 + - 15 * x * y + + 3 * x * z + - 15 * y**2 + - 15 * y * z + + 15 * y + + 3 * z**2 / 2 + - 3 / 2, + -9 * x * y - 15 * y**2 / 2 - 9 * y * z + 6 * y, + ), + ( + 12 * x * z + 12 * y * z + 12 * z**2 - 9 * z, + 12 * x * z + 12 * y * z + 12 * z**2 - 9 * z, + 18 * x**2 + + 36 * x * y + + 48 * x * z + - 27 * x + + 18 * y**2 + + 48 * y * z + - 27 * y + + 30 * z**2 + - 36 * z + + 9, + ), + ( + 18 * z**2 - 9 * z, + 18 * z**2 - 9 * z, + 12 * x * z - 3 * x + 12 * y * z - 3 * y + 30 * z**2 - 24 * z + 3, + ), + ( + -9 * x * z - 9 * y * z - 15 * z**2 / 2 + 6 * z, + -9 * x * z - 9 * y * z - 15 * z**2 / 2 + 6 * z, + 3 * x**2 / 2 + + 3 * x * y + - 15 * x * z + + 3 * y**2 / 2 + - 15 * y * z + - 15 * z**2 + + 15 * z + - 3 / 2, + ), + (12 * x * y - 3 * y, 18 * x**2 - 9 * x, 0), + (-18 * y**2 + 9 * y, -12 * x * y + 3 * x, 0), + (-9 * x * y - 3 * y**2 / 2 + 3 * y, 3 * x**2 / 2 + 9 * x * y - 3 * x, 0), + (12 * x * z - 3 * z, 0, 18 * x**2 - 9 * x), + (-18 * z**2 + 9 * z, 0, -12 * x * z + 3 * x), + (-9 * x * z - 3 * z**2 / 2 + 3 * z, 0, 3 * x**2 / 2 + 9 * x * z - 3 * x), + (0, 12 * y * z - 3 * z, 18 * y**2 - 9 * y), + (0, -18 * z**2 + 9 * z, -12 * y * z + 3 * y), + (0, -9 * y * z - 3 * z**2 / 2 + 3 * z, 3 * y**2 / 2 + 9 * y * z - 3 * y), + ( + -24 * x * y - 12 * y**2 - 12 * y * z + 12 * y, + -36 * x**2 - 48 * x * y - 36 * x * z + 36 * x, + -12 * x * y, + ), + ( + 48 * x * y + 36 * y**2 + 36 * y * z - 36 * y, + 12 * x**2 + 24 * x * y + 12 * x * z - 12 * x, + 12 * x * y, + ), + ( + -48 * x * y - 12 * y**2 - 12 * y * z + 12 * y, + -12 * x**2 - 48 * x * y - 12 * x * z + 12 * x, + -36 * x * y, + ), + ( + -24 * x * z - 12 * y * z - 12 * z**2 + 12 * z, + -12 * x * z, + -36 * x**2 - 36 * x * y - 48 * x * z + 36 * x, + ), + ( + 48 * x * z + 36 * y * z + 36 * z**2 - 36 * z, + 12 * x * z, + 12 * x**2 + 12 * x * y + 24 * x * z - 12 * x, + ), + ( + -48 * x * z - 12 * y * z - 12 * z**2 + 12 * z, + -36 * x * z, + -12 * x**2 - 12 * x * y - 48 * x * z + 12 * x, + ), + ( + -12 * y * z, + -12 * x * z - 24 * y * z - 12 * z**2 + 12 * z, + -36 * x * y - 36 * y**2 - 48 * y * z + 36 * y, + ), + ( + 12 * y * z, + 36 * x * z + 48 * y * z + 36 * z**2 - 36 * z, + 12 * x * y + 12 * y**2 + 24 * y * z - 12 * y, + ), + ( + -36 * y * z, + -12 * x * z - 48 * y * z - 12 * z**2 + 12 * z, + -12 * x * y - 12 * y**2 - 48 * y * z + 12 * y, + ), + (12 * y * z, 12 * x * z, 36 * x * y), + (-12 * y * z, -36 * x * z, -12 * x * y), + (36 * y * z, 12 * x * z, 12 * x * y), + ] raise NotImplementedError @@ -99,7 +252,7 @@ def test_tri(degree): assert np.isclose(wtab[basix.index(kx, ky)], wsym).all() -@pytest.mark.parametrize("degree", [1]) +@pytest.mark.parametrize("degree", [1, 2]) def test_tet(degree): celltype = basix.CellType.tetrahedron g = sympy_nedelec(celltype, degree) From d38f6d60a5ea276a6895ea98cf744a0fbe9e3b7a Mon Sep 17 00:00:00 2001 From: Matthew Scroggs Date: Thu, 18 Jun 2026 09:02:41 +0100 Subject: [PATCH 7/9] update readme images --- joss/img/tetrahedron_numbering.png | Bin 15162 -> 14594 bytes joss/img/tetrahedron_numbering.svg | 64 ++++++++++++++--------------- joss/img/triangle_numbering.png | Bin 8204 -> 7943 bytes joss/img/triangle_numbering.svg | 16 ++++---- 4 files changed, 40 insertions(+), 40 deletions(-) diff --git a/joss/img/tetrahedron_numbering.png b/joss/img/tetrahedron_numbering.png index a833619d7c41ac2b38178feda31da81b0bf680d6..f4628d0fc08e363fbf42cd1c297aa459b3406da4 100644 GIT binary patch literal 14594 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

LE#Vs%|Q9D&!u){_HJl5q9@8MNGq&HH5PJl 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 P{ExJ_f>@!5f%pFf7{(+g literal 15162 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 q{!S_4Mw?=nj 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 KR`^KQ=f415zQiK{ diff --git a/joss/img/tetrahedron_numbering.svg b/joss/img/tetrahedron_numbering.svg index 90ab644c0..0d8accac1 100644 --- a/joss/img/tetrahedron_numbering.svg +++ b/joss/img/tetrahedron_numbering.svg @@ -18,17 +18,17 @@ x y z - - - + - + - + - + + + 0 1 @@ -36,38 +36,38 @@ 2 3 - - - -0 -2 -4 - - -1 -3 -5 - - - -0 -1 -3 - - + + +0 +2 +4 + + + +1 +3 +5 -2 - - - + + +0 +1 +3 + + + +2 + - + - + - + + + 0 \ No newline at end of file diff --git a/joss/img/triangle_numbering.png b/joss/img/triangle_numbering.png index 7cefbb3dd879c5d946aa69e9f1cfdd289b47e47e..e1b4a4f64b31a20a70b52a4760de52f1854bec12 100644 GIT binary patch literal 7943 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 XcPW%ygA#KtPmxs>HQ=A*5rO{&iKv0} diff --git a/joss/img/triangle_numbering.svg b/joss/img/triangle_numbering.svg index 6954f0bca..b40c5fc04 100644 --- a/joss/img/triangle_numbering.svg +++ b/joss/img/triangle_numbering.svg @@ -14,30 +14,30 @@ x y - + - + 0 1 2 - + - -0 + +0 1 -2 - +2 + - + 0 \ No newline at end of file From e43240e2c559dc5e126ddc1eba75bc5bfef98222 Mon Sep 17 00:00:00 2001 From: Matthew Scroggs Date: Thu, 18 Jun 2026 09:05:55 +0100 Subject: [PATCH 8/9] update demo --- demo/python/demo_custom_element.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/demo/python/demo_custom_element.py b/demo/python/demo_custom_element.py index 5f0ae0875..b888fed3b 100644 --- a/demo/python/demo_custom_element.py +++ b/demo/python/demo_custom_element.py @@ -235,9 +235,9 @@ x = [[], [], [], []] for _ in range(3): x[0].append(np.zeros((0, 2))) -x[1].append(np.array([[1 - p[0], p[0]] for p in pts])) -x[1].append(np.array([[0, p[0]] for p in pts])) x[1].append(np.array([[p[0], 0] for p in pts])) +x[1].append(np.array([[0, p[0]] for p in pts])) +x[1].append(np.array([[1 - p[0], p[0]] for p in pts])) x[2].append(np.zeros((0, 2))) # The interpolation matrices for the edges in this example will be have shape (1, 2, len(pts), 1), @@ -248,7 +248,7 @@ M = [[], [], [], []] for _ in range(3): M[0].append(np.zeros((0, 2, 0, 1))) -for normal in [[-1, -1], [-1, 0], [0, 1]]: +for normal in [[0, 1], [-1, 0], [-1, -1]]: mat = np.empty((1, 2, len(wts), 1)) mat[0, 0, :, 0] = normal[0] * wts mat[0, 1, :, 0] = normal[1] * wts From 78e546c6208fa089f4cc97f6473cfb654763d2ab Mon Sep 17 00:00:00 2001 From: Matthew Scroggs Date: Thu, 18 Jun 2026 13:26:18 +0100 Subject: [PATCH 9/9] ffc branch --- .github/workflows/fenicsx-refs.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/fenicsx-refs.env b/.github/workflows/fenicsx-refs.env index b8cb43b20..2aa205b1a 100644 --- a/.github/workflows/fenicsx-refs.env +++ b/.github/workflows/fenicsx-refs.env @@ -1,6 +1,6 @@ ufl_repository=FEniCS/ufl ufl_ref=main ffcx_repository=FEniCS/ffcx -ffcx_ref=main +ffcx_ref=mscroggs/reorder-simplices dolfinx_repository=FEniCS/dolfinx dolfinx_ref=main