DOLFINx
0.1.0
DOLFINx C++ interface
|
9 #include <basix/finite-element.h>
10 #include <dolfinx/common/types.h>
11 #include <dolfinx/mesh/cell_types.h>
16 #include <xtl/xspan.hpp>
18 struct ufc_finite_element;
29 explicit FiniteElement(
const ufc_finite_element& ufc_element);
82 std::string
family()
const noexcept;
87 const xt::xtensor<double, 2>& X)
const;
100 const xt::xtensor<double, 3>& reference_values,
101 const xt::xtensor<double, 3>& J,
102 const xtl::span<const double>& detJ,
103 const xt::xtensor<double, 3>& K)
const;
107 std::vector<double>& values, std::size_t order,
109 const std::vector<double>& J,
const xtl::span<const double>& detJ,
110 const std::vector<double>& K)
const;
117 const std::vector<std::shared_ptr<const FiniteElement>>&
121 std::size_t
hash()
const noexcept;
124 std::shared_ptr<const FiniteElement>
160 template <
typename T>
162 xtl::span<T> dofs)
const
166 throw std::runtime_error(
"No underlying element for interpolation. "
167 "Cannot interpolate mixed elements directly.");
170 const std::size_t rows = _space_dim / _bs;
171 assert(_space_dim % _bs == 0);
172 assert(dofs.size() == rows);
175 const xt::xtensor<double, 2>& Pi = _element->interpolation_matrix();
176 assert(Pi.size() % rows == 0);
177 const std::size_t cols = Pi.size() / rows;
178 for (std::size_t i = 0; i < rows; ++i)
182 dofs[i] = std::inner_product(std::next(Pi.data(), i * cols),
183 std::next(Pi.data(), i * cols + cols),
184 values.data(), T(0.0));
199 template <typename T>
201 std::uint32_t cell_permutation,
205 _element->apply_dof_transformation(data,
block_size, cell_permutation);
213 template <
typename T>
215 xtl::span<T> data, std::uint32_t cell_permutation,
int block_size)
const
218 _element->apply_inverse_transpose_dof_transformation(data,
block_size,
224 template <
typename T>
227 const xtl::span<const double>& detJ,
228 const xt::xtensor<double, 3>& K, xt::xtensor<T, 3>& U)
const
231 _element->map_pull_back_m(u, J, detJ, K, U);
235 std::string _signature, _family;
239 int _tdim, _space_dim, _value_size, _reference_value_size;
242 std::vector<std::shared_ptr<const FiniteElement>> _sub_elements;
248 std::vector<int> _value_dimension;
255 bool _needs_permutation_data;
258 std::unique_ptr<basix::FiniteElement> _element;
FiniteElement(const ufc_finite_element &ufc_element)
Create finite element from UFC finite element.
Definition: FiniteElement.cpp:64
int block_size() const noexcept
Block size of the finite element function space. For VectorElements and TensorElements,...
Definition: FiniteElement.cpp:148
bool interpolation_ident() const noexcept
Check if interpolation into the finite element space is an identity operation given the evaluation on...
Definition: FiniteElement.cpp:222
std::shared_ptr< const FiniteElement > extract_sub_element(const std::vector< int > &component) const
Extract sub finite element for component.
Definition: FiniteElement.cpp:212
int value_dimension(int i) const
Return the dimension of the value space for axis i.
Definition: FiniteElement.cpp:150
const xt::xtensor< double, 2 > & interpolation_points() const
Points on the reference cell at which an expression need to be evaluated in order to interpolate the ...
Definition: FiniteElement.cpp:228
void transform_reference_basis(xt::xtensor< double, 3 > &values, const xt::xtensor< double, 3 > &reference_values, const xt::xtensor< double, 3 > &J, const xtl::span< const double > &detJ, const xt::xtensor< double, 3 > &K) const
Evaluate all basis function derivatives of given order at given points in reference cell.
Definition: FiniteElement.cpp:187
CellType
Cell type identifier.
Definition: cell_types.h:21
void map_pull_back(const xt::xtensor< T, 3 > &u, const xt::xtensor< double, 3 > &J, const xtl::span< const double > &detJ, const xt::xtensor< double, 3 > &K, xt::xtensor< T, 3 > &U) const
Pull physical data back to the reference element. This passes the inputs directly into Basix's map_pu...
Definition: FiniteElement.h:226
int reference_value_size() const noexcept
The value size, e.g. 1 for a scalar function, 2 for a 2D vector for the reference element.
Definition: FiniteElement.cpp:138
void apply_inverse_transpose_dof_transformation(xtl::span< T > data, std::uint32_t cell_permutation, int block_size) const
Apply inverse transpose permutation to some data.
Definition: FiniteElement.h:214
int num_sub_elements() const noexcept
Get the number of sub elements (for a mixed element)
Definition: FiniteElement.cpp:197
void transform_reference_basis_derivatives(std::vector< double > &values, std::size_t order, const std::vector< double > &reference_values, const array2d< double > &X, const std::vector< double > &J, const xtl::span< const double > &detJ, const std::vector< double > &K) const
Push basis function (derivatives) forward to physical element.
Finite Element, containing the dof layout on a reference element, and various methods for evaluating ...
Definition: FiniteElement.h:24
std::size_t hash() const noexcept
Return simple hash of the signature string.
Definition: FiniteElement.cpp:209
int value_size() const noexcept
The value size, e.g. 1 for a scalar function, 2 for a 2D vector.
Definition: FiniteElement.cpp:136
int space_dimension() const noexcept
Dimension of the finite element function space.
Definition: FiniteElement.cpp:134
std::string family() const noexcept
The finite element family.
Definition: FiniteElement.cpp:158
constexpr void interpolate(const xt::xtensor< T, 2 > &values, xtl::span< T > dofs) const
Definition: FiniteElement.h:161
void apply_dof_transformation(xtl::span< T > data, std::uint32_t cell_permutation, int block_size) const
Apply permutation to some data.
Definition: FiniteElement.h:200
FiniteElement & operator=(const FiniteElement &element)=delete
Copy assignment.
virtual ~FiniteElement()=default
Destructor.
bool needs_permutation_data() const noexcept
Definition: FiniteElement.cpp:240
int value_rank() const noexcept
Rank of the value space.
Definition: FiniteElement.cpp:143
mesh::CellType cell_shape() const noexcept
Cell shape.
Definition: FiniteElement.cpp:129
void evaluate_reference_basis(xt::xtensor< double, 3 > &values, const xt::xtensor< double, 2 > &X) const
Evaluate all basis functions at given points in reference cell.
Definition: FiniteElement.cpp:160
std::string signature() const noexcept
String identifying the finite element.
Definition: FiniteElement.cpp:127
const std::vector< std::shared_ptr< const FiniteElement > > & sub_elements() const noexcept
Subelements (if any)
Definition: FiniteElement.cpp:203
Finite element method functionality.
Definition: assemble_matrix_impl.h:22
This class provides a dynamic 2-dimensional row-wise array data structure.
Definition: array2d.h:20