| 
    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