8#include "element-families.h"
12#include "precompute.h"
13#include "sobolev-spaces.h"
32template <
typename T, std::
size_t d>
33using mdspan_t = MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan<
34 T, MDSPAN_IMPL_STANDARD_NAMESPACE::dextents<std::size_t, d>>;
35template <
typename T, std::
size_t d>
37 = MDSPAN_IMPL_STANDARD_NAMESPACE::MDSPAN_IMPL_PROPOSED_NAMESPACE::mdarray<
38 T, MDSPAN_IMPL_STANDARD_NAMESPACE::dextents<std::size_t, d>>;
43std::array<std::vector<mdspan_t<const T, 2>>, 4>
44to_mdspan(std::array<std::vector<mdarray_t<T, 2>>, 4>& x)
46 std::array<std::vector<mdspan_t<const T, 2>>, 4> x1;
47 for (std::size_t i = 0; i < x.size(); ++i)
48 for (std::size_t j = 0; j < x[i].size(); ++j)
49 x1[i].emplace_back(x[i][j].data(), x[i][j].extents());
57std::array<std::vector<mdspan_t<const T, 4>>, 4>
58to_mdspan(std::array<std::vector<mdarray_t<T, 4>>, 4>& M)
60 std::array<std::vector<mdspan_t<const T, 4>>, 4> M1;
61 for (std::size_t i = 0; i < M.size(); ++i)
62 for (std::size_t j = 0; j < M[i].size(); ++j)
63 M1[i].emplace_back(M[i][j].data(), M[i][j].extents());
71std::array<std::vector<mdspan_t<const T, 2>>, 4>
72to_mdspan(
const std::array<std::vector<std::vector<T>>, 4>& x,
73 const std::array<std::vector<std::array<std::size_t, 2>>, 4>& shape)
75 std::array<std::vector<mdspan_t<const T, 2>>, 4> x1;
76 for (std::size_t i = 0; i < x.size(); ++i)
77 for (std::size_t j = 0; j < x[i].size(); ++j)
78 x1[i].push_back(mdspan_t<const T, 2>(x[i][j].data(), shape[i][j]));
86std::array<std::vector<mdspan_t<const T, 4>>, 4>
87to_mdspan(
const std::array<std::vector<std::vector<T>>, 4>& M,
88 const std::array<std::vector<std::array<std::size_t, 4>>, 4>& shape)
90 std::array<std::vector<mdspan_t<const T, 4>>, 4> M1;
91 for (std::size_t i = 0; i < M.size(); ++i)
92 for (std::size_t j = 0; j < M[i].size(); ++j)
93 M1[i].push_back(mdspan_t<const T, 4>(M[i][j].data(), shape[i][j]));
103template <
typename T, std::
size_t d>
121template <std::
floating_po
int T>
122std::tuple<std::array<std::vector<std::vector<T>>, 4>,
123 std::array<std::vector<std::array<std::size_t, 2>>, 4>,
124 std::array<std::vector<std::vector<T>>, 4>,
125 std::array<std::vector<std::array<std::size_t, 4>>, 4>>
137template <std::
floating_po
int F>
140 template <
typename T, std::
size_t d>
141 using mdspan_t = MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan<
142 T, MDSPAN_IMPL_STANDARD_NAMESPACE::dextents<std::size_t, d>>;
352 std::size_t
hash()
const;
367 for (std::size_t
i = 1;
i <=
nd; ++
i)
369 for (std::size_t
i = 1;
i <=
nd; ++
i)
371 std::size_t
vs = std::accumulate(_value_shape.begin(), _value_shape.end(),
372 1, std::multiplies{});
373 std::size_t
ndofs = _coeffs.second[0];
398 std::pair<std::vector<F>, std::array<std::size_t, 4>>
399 tabulate(
int nd, impl::mdspan_t<const F, 2>
x)
const;
424 std::pair<std::vector<F>, std::array<std::size_t, 4>>
426 std::array<std::size_t, 2>
shape)
const;
453 void tabulate(
int nd, impl::mdspan_t<const F, 2>
x,
482 std::span<F>
basis)
const;
510 const std::vector<std::size_t>&
value_shape()
const {
return _value_shape; }
515 int dim()
const {
return _coeffs.second[0]; }
525 return _lagrange_variant;
549 return _dof_transformations_are_permutations;
556 return _dof_transformations_are_identity;
572 std::pair<std::vector<F>, std::array<std::size_t, 3>>
573 push_forward(impl::mdspan_t<const F, 3>
U, impl::mdspan_t<const F, 3>
J,
574 std::span<const F>
detJ, impl::mdspan_t<const F, 3>
K)
const;
583 std::pair<std::vector<F>, std::array<std::size_t, 3>>
584 pull_back(impl::mdspan_t<const F, 3>
u, impl::mdspan_t<const F, 3>
J,
585 std::span<const F>
detJ, impl::mdspan_t<const F, 3>
K)
const;
618 template <
typename O,
typename P,
typename Q,
typename R>
623 case maps::type::identity:
624 return [](
O&
u,
const P&
U,
const Q&,
F,
const R&)
628 for (std::size_t
i = 0;
i <
U.extent(0); ++
i)
629 for (std::size_t
j = 0;
j <
U.extent(1); ++
j)
632 case maps::type::covariantPiola:
633 return [](
O&
u,
const P&
U,
const Q&
J,
F detJ,
const R&
K)
635 case maps::type::contravariantPiola:
636 return [](
O&
u,
const P&
U,
const Q&
J,
F detJ,
const R&
K)
638 case maps::type::doubleCovariantPiola:
639 return [](
O&
u,
const P&
U,
const Q&
J,
F detJ,
const R&
K)
641 case maps::type::doubleContravariantPiola:
642 return [](
O&
u,
const P&
U,
const Q&
J,
F detJ,
const R&
K)
645 throw std::runtime_error(
"Map not implemented");
655 const std::vector<std::vector<std::vector<int>>>&
entity_dofs()
const
669 return _e_closure_dofs;
753 std::pair<std::vector<F>, std::array<std::size_t, 3>>
760 std::map<cell::type, std::pair<std::vector<F>, std::array<std::size_t, 3>>>
763 return _entity_transformations;
775 if (!_dof_transformations_are_permutations)
777 throw std::runtime_error(
778 "The DOF transformations for this element are not permutations");
781 if (_dof_transformations_are_identity)
797 if (!_dof_transformations_are_permutations)
799 throw std::runtime_error(
800 "The DOF transformations for this element are not permutations");
802 if (_dof_transformations_are_identity)
816 template <
typename T>
828 template <
typename T>
840 template <
typename T>
852 template <
typename T>
864 template <
typename T>
877 template <
typename T>
889 template <
typename T>
902 template <
typename T>
910 const std::pair<std::vector<F>, std::array<std::size_t, 2>>&
points()
const
967 const std::pair<std::vector<F>, std::array<std::size_t, 2>>&
978 const std::pair<std::vector<F>, std::array<std::size_t, 2>>&
1018 const std::pair<std::vector<F>, std::array<std::size_t, 2>>&
wcoeffs()
const
1028 std::vector<std::pair<std::vector<F>, std::array<std::size_t, 2>>>, 4>&
1071 std::vector<std::pair<std::vector<F>, std::array<std::size_t, 4>>>, 4>&
1080 const std::pair<std::vector<F>, std::array<std::size_t, 2>>&
1097 return _tensor_factors.size() > 0;
1111 std::vector<std::vector<FiniteElement<F>>>
1115 throw std::runtime_error(
"Element has no tensor product representation.");
1116 return _tensor_factors;
1136 template <
typename T,
bool post>
1139 const std::map<
cell::type, std::vector<std::vector<std::size_t>>>&
eperm)
1142 using array2_t = std::pair<std::vector<F>, std::array<std::size_t, 2>>;
1143 using array3_t = std::pair<std::vector<F>, std::array<std::size_t, 3>>;
1145 = std::vector<std::pair<std::vector<std::size_t>, array2_t>>;
1153 template <
typename T,
bool post,
typename OP>
1156 const std::map<cell::type, trans_data_t>&
etrans,
OP op)
const;
1165 std::size_t _cell_tdim;
1168 std::vector<std::vector<cell::type>> _cell_subentity_types;
1183 int _interpolation_nderivs;
1186 int _embedded_superdegree;
1189 int _embedded_subdegree;
1192 std::vector<std::size_t> _value_shape;
1205 std::pair<std::vector<F>, std::array<std::size_t, 2>> _coeffs;
1208 std::vector<std::vector<std::vector<int>>> _edofs;
1211 std::vector<std::vector<std::vector<int>>> _e_closure_dofs;
1214 std::map<cell::type, array3_t> _entity_transformations;
1221 std::pair<std::vector<F>, std::array<std::size_t, 2>> _points;
1225 std::array<std::vector<std::pair<std::vector<F>, std::array<std::size_t, 2>>>,
1230 std::pair<std::vector<F>, std::array<std::size_t, 2>> _matM;
1234 bool _dof_transformations_are_permutations;
1237 bool _dof_transformations_are_identity;
1242 std::map<cell::type, std::vector<std::vector<std::size_t>>> _eperm;
1247 std::map<cell::type, std::vector<std::vector<std::size_t>>> _eperm_rev;
1250 std::map<cell::type, trans_data_t> _etrans;
1253 std::map<cell::type, trans_data_t> _etransT;
1256 std::map<cell::type, trans_data_t> _etrans_inv;
1259 std::map<cell::type, trans_data_t> _etrans_invT;
1263 bool _discontinuous;
1266 std::pair<std::vector<F>, std::array<std::size_t, 2>> _dual_matrix;
1274 std::vector<int> _dof_ordering;
1281 std::vector<std::vector<FiniteElement>> _tensor_factors;
1284 bool _interpolation_is_identity;
1288 std::pair<std::vector<F>, std::array<std::size_t, 2>> _wcoeffs;
1292 = std::vector<std::pair<std::vector<F>, std::array<std::size_t, 4>>>;
1293 std::array<array4_t, 4> _M;
1324template <std::
floating_po
int T>
1326 cell::type cell_type,
const std::vector<std::size_t>& value_shape,
1327 impl::mdspan_t<const T, 2> wcoeffs,
1328 const std::array<std::vector<impl::mdspan_t<const T, 2>>, 4>& x,
1329 const std::array<std::vector<impl::mdspan_t<const T, 4>>, 4>& M,
1330 int interpolation_nderivs,
maps::type map_type,
1331 sobolev::space sobolev_space,
bool discontinuous,
int embedded_subdegree,
1345template <std::
floating_po
int T>
1350 std::vector<int> dof_ordering = {});
1366 bool discontinuous);
1380template <std::
floating_po
int T>
1381std::vector<std::vector<FiniteElement<T>>>
1384 bool discontinuous, std::vector<int> dof_ordering);
1397template <std::
floating_po
int T>
1408template <std::
floating_po
int F>
1409template <
typename T,
bool post>
1410void FiniteElement<F>::permute_data(
1411 std::span<T> data,
int block_size, std::uint32_t cell_info,
1412 const std::map<
cell::type, std::vector<std::vector<std::size_t>>>& eperm)
1415 if (_cell_tdim >= 2)
1419 int face_start = _cell_tdim == 3 ? 3 * _edofs[2].size() : 0;
1423 auto& trans = eperm.at(cell::type::interval)[0];
1424 for (std::size_t e = 0; e < _edofs[1].size(); ++e)
1427 if (cell_info >> (face_start + e) & 1)
1433 if (_cell_tdim == 3)
1436 for (std::size_t f = 0; f < _edofs[2].size(); ++f)
1438 auto& trans = eperm.at(_cell_subentity_types[2][f]);
1441 if (!post and cell_info >> (3 * f) & 1)
1448 for (std::uint32_t r = 0; r < (cell_info >> (3 * f + 1) & 3); ++r)
1455 if (post and cell_info >> (3 * f) & 1)
1465template <std::
floating_po
int F>
1466template <
typename T,
bool post,
typename OP>
1467void FiniteElement<F>::transform_data(
1468 std::span<T> data,
int block_size, std::uint32_t cell_info,
1469 const std::map<cell::type, trans_data_t>& etrans, OP op)
const
1471 if (_cell_tdim >= 2)
1475 int face_start = _cell_tdim == 3 ? 3 * _edofs[2].size() : 0;
1477 for (
auto& edofs0 : _edofs[0])
1478 dofstart += edofs0.size();
1482 auto& [v_size_t, matrix] = etrans.at(cell::type::interval)[0];
1483 for (std::size_t e = 0; e < _edofs[1].size(); ++e)
1486 if (cell_info >> (face_start + e) & 1)
1488 op(std::span(v_size_t),
1489 mdspan_t<const F, 2>(matrix.first.data(), matrix.second), data,
1490 dofstart, block_size);
1492 dofstart += _edofs[1][e].size();
1496 if (_cell_tdim == 3)
1499 for (std::size_t f = 0; f < _edofs[2].size(); ++f)
1501 auto& trans = etrans.at(_cell_subentity_types[2][f]);
1504 if (!post and cell_info >> (3 * f) & 1)
1506 const auto& m = trans[1];
1507 const auto& v_size_t = std::get<0>(m);
1508 const auto& matrix = std::get<1>(m);
1509 op(std::span(v_size_t),
1510 mdspan_t<const F, 2>(matrix.first.data(), matrix.second), data,
1511 dofstart, block_size);
1515 for (std::uint32_t r = 0; r < (cell_info >> (3 * f + 1) & 3); ++r)
1517 const auto& m = trans[0];
1518 const auto& v_size_t = std::get<0>(m);
1519 const auto& matrix = std::get<1>(m);
1520 op(std::span(v_size_t),
1521 mdspan_t<const F, 2>(matrix.first.data(), matrix.second), data,
1522 dofstart, block_size);
1526 if (post and cell_info >> (3 * f) & 1)
1528 const auto& m = trans[1];
1529 const auto& v_size_t = std::get<0>(m);
1530 const auto& matrix = std::get<1>(m);
1531 op(std::span(v_size_t),
1532 mdspan_t<const F, 2>(matrix.first.data(), matrix.second), data,
1533 dofstart, block_size);
1536 dofstart += _edofs[2][f].size();
1542template <std::
floating_po
int F>
1543template <
typename T>
1547 if (_dof_transformations_are_identity)
1550 if (_dof_transformations_are_permutations)
1557 precompute::pre_apply_matrix<F, T>);
1561template <std::
floating_po
int F>
1562template <
typename T>
1566 if (_dof_transformations_are_identity)
1569 if (_dof_transformations_are_permutations)
1576 precompute::pre_apply_matrix<F, T>);
1580template <std::
floating_po
int F>
1581template <
typename T>
1585 if (_dof_transformations_are_identity)
1588 if (_dof_transformations_are_permutations)
1595 precompute::pre_apply_matrix<F, T>);
1599template <std::
floating_po
int F>
1600template <
typename T>
1604 if (_dof_transformations_are_identity)
1607 if (_dof_transformations_are_permutations)
1614 precompute::pre_apply_matrix<F, T>);
1618template <std::
floating_po
int F>
1619template <
typename T>
1623 if (_dof_transformations_are_identity)
1626 if (_dof_transformations_are_permutations)
1639 precompute::post_apply_tranpose_matrix<F, T>);
1643template <std::
floating_po
int F>
1644template <
typename T>
1648 if (_dof_transformations_are_identity)
1651 if (_dof_transformations_are_permutations)
1664 precompute::post_apply_tranpose_matrix<F, T>);
1668template <std::
floating_po
int F>
1669template <
typename T>
1673 if (_dof_transformations_are_identity)
1676 if (_dof_transformations_are_permutations)
1689 precompute::post_apply_tranpose_matrix<F, T>);
1693template <std::
floating_po
int F>
1694template <
typename T>
1698 if (_dof_transformations_are_identity)
1701 if (_dof_transformations_are_permutations)
1714 precompute::post_apply_tranpose_matrix<F, T>);
A finite element.
Definition finite-element.h:139
void pre_apply_transpose_dof_transformation(std::span< T > data, int block_size, std::uint32_t cell_info) const
Definition finite-element.h:1563
FiniteElement(element::family family, cell::type cell_type, polyset::type poly_type, int degree, const std::vector< std::size_t > &value_shape, mdspan_t< const F, 2 > wcoeffs, const std::array< std::vector< mdspan_t< const F, 2 > >, 4 > &x, const std::array< std::vector< mdspan_t< const F, 4 > >, 4 > &M, int interpolation_nderivs, maps::type map_type, sobolev::space sobolev_space, bool discontinuous, int embedded_subdegree, int embedded_superdegree, element::lagrange_variant lvariant, element::dpc_variant dvariant, std::vector< int > dof_ordering={})
Construct a finite element.
void post_apply_inverse_transpose_dof_transformation(std::span< T > data, int block_size, std::uint32_t cell_info) const
Definition finite-element.h:1695
const std::array< std::vector< std::pair< std::vector< F >, std::array< std::size_t, 4 > > >, 4 > & M() const
Definition finite-element.h:1072
void pre_apply_inverse_dof_transformation(std::span< T > data, int block_size, std::uint32_t cell_info) const
Definition finite-element.h:1601
std::pair< std::vector< F >, std::array< std::size_t, 3 > > base_transformations() const
Get the base transformations.
Definition finite-element.cpp:1339
void pre_apply_inverse_transpose_dof_transformation(std::span< T > data, int block_size, std::uint32_t cell_info) const
Definition finite-element.h:1582
bool dof_transformations_are_identity() const
Definition finite-element.h:554
bool operator==(const FiniteElement &e) const
Definition finite-element.cpp:1157
std::map< cell::type, std::pair< std::vector< F >, std::array< std::size_t, 3 > > > entity_transformations() const
Definition finite-element.h:761
void pre_apply_dof_transformation(std::span< T > data, int block_size, std::uint32_t cell_info) const
Definition finite-element.h:1544
const std::vector< int > & dof_ordering() const
Get dof layout.
Definition finite-element.h:1127
int embedded_subdegree() const
Definition finite-element.h:505
const std::vector< std::vector< std::vector< int > > > & entity_dofs() const
Definition finite-element.h:655
FiniteElement(FiniteElement &&element)=default
Move constructor.
bool has_tensor_product_factorisation() const
Definition finite-element.h:1095
int interpolation_nderivs() const
The number of derivatives needed when interpolating.
Definition finite-element.h:1124
std::pair< std::vector< F >, std::array< std::size_t, 4 > > tabulate(int nd, impl::mdspan_t< const F, 2 > x) const
Compute basis values and derivatives at set of points.
Definition finite-element.cpp:1247
int embedded_superdegree() const
Definition finite-element.h:500
int dim() const
Definition finite-element.h:515
std::size_t hash() const
Get a unique hash of this element.
Definition finite-element.cpp:1197
const std::vector< std::size_t > & value_shape() const
Definition finite-element.h:510
element::lagrange_variant lagrange_variant() const
Definition finite-element.h:523
const std::array< std::vector< std::pair< std::vector< F >, std::array< std::size_t, 2 > > >, 4 > & x() const
Definition finite-element.h:1029
int degree() const
Definition finite-element.h:494
const std::pair< std::vector< F >, std::array< std::size_t, 2 > > & points() const
Definition finite-element.h:910
sobolev::space sobolev_space() const
Definition finite-element.h:538
const std::vector< std::vector< std::vector< int > > > & entity_closure_dofs() const
Definition finite-element.h:667
FiniteElement(const FiniteElement &element)=default
Copy constructor.
void post_apply_inverse_dof_transformation(std::span< T > data, int block_size, std::uint32_t cell_info) const
Definition finite-element.h:1645
void post_apply_transpose_dof_transformation(std::span< T > data, int block_size, std::uint32_t cell_info) const
Definition finite-element.h:1620
std::array< std::size_t, 4 > tabulate_shape(std::size_t nd, std::size_t num_points) const
Definition finite-element.h:363
FiniteElement & operator=(FiniteElement &&element)=default
Move assignment operator.
const std::pair< std::vector< F >, std::array< std::size_t, 2 > > & interpolation_matrix() const
Return a matrix of weights interpolation,.
Definition finite-element.h:968
polyset::type polyset_type() const
Definition finite-element.h:490
void permute_dofs(std::span< std::int32_t > dofs, std::uint32_t cell_info) const
Definition finite-element.h:773
const std::pair< std::vector< F >, std::array< std::size_t, 2 > > & wcoeffs() const
Definition finite-element.h:1018
std::pair< std::vector< F >, std::array< std::size_t, 3 > > pull_back(impl::mdspan_t< const F, 3 > u, impl::mdspan_t< const F, 3 > J, std::span< const F > detJ, impl::mdspan_t< const F, 3 > K) const
Definition finite-element.cpp:1448
bool dof_transformations_are_permutations() const
Definition finite-element.h:547
void post_apply_dof_transformation(std::span< T > data, int block_size, std::uint32_t cell_info) const
Definition finite-element.h:1670
std::pair< std::vector< F >, std::array< std::size_t, 3 > > push_forward(impl::mdspan_t< const F, 3 > U, impl::mdspan_t< const F, 3 > J, std::span< const F > detJ, impl::mdspan_t< const F, 3 > K) const
Definition finite-element.cpp:1408
cell::type cell_type() const
Definition finite-element.h:486
bool interpolation_is_identity() const
Definition finite-element.h:1121
bool discontinuous() const
Definition finite-element.h:543
std::vector< std::vector< FiniteElement< F > > > get_tensor_product_representation() const
Definition finite-element.h:1112
maps::type map_type() const
Definition finite-element.h:534
const std::pair< std::vector< F >, std::array< std::size_t, 2 > > & dual_matrix() const
Definition finite-element.h:979
element::dpc_variant dpc_variant() const
Definition finite-element.h:530
const std::pair< std::vector< F >, std::array< std::size_t, 2 > > & coefficient_matrix() const
Definition finite-element.h:1081
FiniteElement & operator=(const FiniteElement &element)=default
Assignment operator.
void unpermute_dofs(std::span< std::int32_t > dofs, std::uint32_t cell_info) const
Definition finite-element.h:794
element::family family() const
Definition finite-element.h:519
~FiniteElement()=default
Destructor.
std::function< void(O &, const P &, const Q &, F, const R &)> map_fn() const
Definition finite-element.h:619
type
Cell type.
Definition cell.h:21
std::tuple< std::array< std::vector< std::vector< T > >, 4 >, std::array< std::vector< std::array< std::size_t, 2 > >, 4 >, std::array< std::vector< std::vector< T > >, 4 >, std::array< std::vector< std::array< std::size_t, 4 > >, 4 > > make_discontinuous(const std::array< std::vector< mdspan_t< const T, 2 > >, 4 > &x, const std::array< std::vector< mdspan_t< const T, 4 > >, 4 > &M, std::size_t tdim, std::size_t value_size)
Definition finite-element.cpp:520
lagrange_variant
Variants of a Lagrange space that can be created.
Definition element-families.h:12
impl::mdspan_t< T, d > mdspan_t
Typedef for mdspan.
Definition finite-element.h:104
dpc_variant
Definition element-families.h:32
family
Available element families.
Definition element-families.h:45
void covariant_piola(O &&r, const P &U, const Q &, double, const R &K)
Covariant Piola map.
Definition maps.h:60
void contravariant_piola(O &&r, const P &U, const Q &J, double detJ, const R &)
Contravariant Piola map.
Definition maps.h:80
void double_contravariant_piola(O &&r, const P &U, const Q &J, double detJ, const R &)
Double contravariant Piola map.
Definition maps.h:134
void double_covariant_piola(O &&r, const P &U, const Q &J, double, const R &K)
Double covariant Piola map.
Definition maps.h:102
type
Map type.
Definition maps.h:38
type
Cell type.
Definition polyset.h:136
void pre_apply_permutation_mapped(std::span< const std::size_t > perm, std::span< E > data, std::span< const int > emap, std::size_t block_size=1)
Permutation of mapped data.
Definition precompute.h:156
space
Sobolev space type.
Definition sobolev-spaces.h:13
Basix: FEniCS runtime basis evaluation library.
Definition cell.h:17
FiniteElement< T > create_element(element::family family, cell::type cell, int degree, element::lagrange_variant lvariant, element::dpc_variant dvariant, bool discontinuous, std::vector< int > dof_ordering={})
Definition finite-element.cpp:193
std::vector< int > tp_dof_ordering(element::family family, cell::type cell, int degree, element::lagrange_variant lvariant, element::dpc_variant dvariant, bool discontinuous)
Definition finite-element.cpp:399
std::vector< std::vector< FiniteElement< T > > > tp_factors(element::family family, cell::type cell, int degree, element::lagrange_variant lvariant, element::dpc_variant dvariant, bool discontinuous, std::vector< int > dof_ordering)
Definition finite-element.cpp:349
std::string version()
Definition finite-element.cpp:1486
FiniteElement< T > create_custom_element(cell::type cell_type, const std::vector< std::size_t > &value_shape, impl::mdspan_t< const T, 2 > wcoeffs, const std::array< std::vector< impl::mdspan_t< const T, 2 > >, 4 > &x, const std::array< std::vector< impl::mdspan_t< const T, 4 > >, 4 > &M, int interpolation_nderivs, maps::type map_type, sobolev::space sobolev_space, bool discontinuous, int embedded_subdegree, int embedded_superdegree, polyset::type poly_type)
Definition finite-element.cpp:609
FiniteElement< T > create_tp_element(element::family family, cell::type cell, int degree, element::lagrange_variant lvariant, element::dpc_variant dvariant, bool discontinuous)
Definition finite-element.cpp:330