33template <
int dim,
int spacedim>
36 , poly_space(fe.poly_space->clone())
39template <
int dim,
int spacedim>
43 const std::vector<bool> &restriction_is_additive_flags,
44 const std::vector<ComponentMask> &nonzero_components)
46 restriction_is_additive_flags,
48 , poly_space(poly_space.clone())
52template <
int dim,
int spacedim>
60template <
int dim,
int spacedim>
66 return poly_space->compute_value(i, p);
70template <
int dim,
int spacedim>
75 const unsigned int component)
const
80 return poly_space->compute_value(i, p);
85template <
int dim,
int spacedim>
91 return poly_space->template compute_derivative<1>(i, p);
96template <
int dim,
int spacedim>
100 const unsigned int component)
const
105 return poly_space->template compute_derivative<1>(i, p);
110template <
int dim,
int spacedim>
116 return poly_space->template compute_derivative<2>(i, p);
121template <
int dim,
int spacedim>
124 const unsigned int i,
126 const unsigned int component)
const
131 return poly_space->template compute_derivative<2>(i, p);
136template <
int dim,
int spacedim>
142 return poly_space->template compute_derivative<3>(i, p);
147template <
int dim,
int spacedim>
150 const unsigned int i,
152 const unsigned int component)
const
157 return poly_space->template compute_derivative<3>(i, p);
162template <
int dim,
int spacedim>
168 return poly_space->template compute_derivative<4>(i, p);
173template <
int dim,
int spacedim>
176 const unsigned int i,
178 const unsigned int component)
const
183 return poly_space->template compute_derivative<4>(i, p);
193template <
int dim,
int spacedim>
234template <
int dim,
int spacedim>
236higher_derivatives_need_correcting(
240 const unsigned int n_q_points,
244 const bool update_higher_derivatives =
246 if (!update_higher_derivatives)
264template <
int dim,
int spacedim>
283 Assert(
dynamic_cast<const InternalData *
>(&fe_internal) !=
nullptr,
285 const InternalData &fe_data =
static_cast<const InternalData &
>(fe_internal);
289 const bool need_to_correct_higher_derivatives =
290 higher_derivatives_need_correcting(mapping,
300 for (
unsigned int k = 0; k < this->n_dofs_per_cell(); ++k)
309 for (
unsigned int k = 0; k < this->n_dofs_per_cell(); ++k)
315 if (need_to_correct_higher_derivatives)
316 correct_hessians(output_data, mapping_data, quadrature.
size());
322 for (
unsigned int k = 0; k < this->n_dofs_per_cell(); ++k)
329 if (need_to_correct_higher_derivatives)
330 correct_third_derivatives(output_data, mapping_data, quadrature.
size());
336template <
int dim,
int spacedim>
340 const unsigned int face_no,
351 const unsigned int n_q_points =
352 quadrature[quadrature.
size() == 1 ? 0 : face_no].
size();
358 Assert(
dynamic_cast<const InternalData *
>(&fe_internal) !=
nullptr,
360 const InternalData &fe_data =
static_cast<const InternalData &
>(fe_internal);
369 cell->combined_face_orientation(
375 const bool need_to_correct_higher_derivatives =
376 higher_derivatives_need_correcting(mapping,
385 for (
unsigned int k = 0; k < this->n_dofs_per_cell(); ++k)
386 for (
unsigned int i = 0; i < n_q_points; ++i)
387 output_data.shape_values(k, i) = fe_data.shape_values[k][i + offset];
390 for (
unsigned int k = 0; k < this->n_dofs_per_cell(); ++k)
399 for (
unsigned int k = 0; k < this->n_dofs_per_cell(); ++k)
406 if (need_to_correct_higher_derivatives)
407 correct_hessians(output_data, mapping_data, n_q_points);
412 for (
unsigned int k = 0; k < this->n_dofs_per_cell(); ++k)
419 if (need_to_correct_higher_derivatives)
420 correct_third_derivatives(output_data, mapping_data, n_q_points);
426template <
int dim,
int spacedim>
430 const unsigned int face_no,
431 const unsigned int sub_no,
446 Assert(
dynamic_cast<const InternalData *
>(&fe_internal) !=
nullptr,
448 const InternalData &fe_data =
static_cast<const InternalData &
>(fe_internal);
458 cell->combined_face_orientation(
461 cell->subface_case(face_no));
465 const bool need_to_correct_higher_derivatives =
466 higher_derivatives_need_correcting(mapping,
475 for (
unsigned int k = 0; k < this->n_dofs_per_cell(); ++k)
476 for (
unsigned int i = 0; i < quadrature.
size(); ++i)
477 output_data.shape_values(k, i) = fe_data.shape_values[k][i + offset];
480 for (
unsigned int k = 0; k < this->n_dofs_per_cell(); ++k)
489 for (
unsigned int k = 0; k < this->n_dofs_per_cell(); ++k)
496 if (need_to_correct_higher_derivatives)
497 correct_hessians(output_data, mapping_data, quadrature.
size());
502 for (
unsigned int k = 0; k < this->n_dofs_per_cell(); ++k)
512 if (need_to_correct_higher_derivatives)
513 correct_third_derivatives(output_data, mapping_data, quadrature.
size());
519template <
int dim,
int spacedim>
526 const unsigned int n_q_points)
const
528 for (
unsigned int dof = 0; dof < this->n_dofs_per_cell(); ++dof)
529 for (
unsigned int i = 0; i < n_q_points; ++i)
530 for (
unsigned int j = 0; j < spacedim; ++j)
538template <
int dim,
int spacedim>
545 const unsigned int n_q_points)
const
547 for (
unsigned int dof = 0; dof < this->n_dofs_per_cell(); ++dof)
548 for (
unsigned int i = 0; i < n_q_points; ++i)
549 for (
unsigned int j = 0; j < spacedim; ++j)
550 for (
unsigned int k = 0; k < spacedim; ++k)
551 for (
unsigned int l = 0;
l < spacedim; ++
l)
552 for (
unsigned int m = 0; m < spacedim; ++m)
562 .jacobian_pushed_forward_2nd_derivatives[i][m][j][k][l] *
569template <
int dim,
int spacedim>
578template <
int dim,
int spacedim>
579std::vector<unsigned int>
582 auto *
const space_tensor_prod =
584 if (space_tensor_prod !=
nullptr)
587 auto *
const space_tensor_prod_aniso =
589 if (space_tensor_prod_aniso !=
nullptr)
592 auto *
const space_tensor_prod_piecewise =
dynamic_cast<
594 this->poly_space.get());
595 if (space_tensor_prod_piecewise !=
nullptr)
598 auto *
const space_tensor_prod_bubbles =
600 this->poly_space.get());
601 if (space_tensor_prod_bubbles !=
nullptr)
604 auto *
const space_tensor_prod_const =
606 if (space_tensor_prod_const !=
nullptr)
610 return std::vector<unsigned int>();
615template <
int dim,
int spacedim>
616std::vector<unsigned int>
624template <
int dim,
int spacedim>
629 poly_space->memory_consumption();
634#include "fe/fe_poly.inst"
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
const std::vector< unsigned int > & get_numbering() const
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const override
virtual Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual Tensor< 3, dim > shape_3rd_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
std::vector< unsigned int > get_poly_space_numbering_inverse() const
virtual double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
FE_Poly(const ScalarPolynomialsBase< dim > &poly_space, const FiniteElementData< dim > &fe_data, const std::vector< bool > &restriction_is_additive_flags, const std::vector< ComponentMask > &nonzero_components)
void correct_hessians(internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data, const internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const unsigned int n_q_points) const
virtual void fill_fe_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const CellSimilarity::Similarity cell_similarity, const Quadrature< dim > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const typename FiniteElement< dim, spacedim >::InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const override
unsigned int get_degree() const
const ScalarPolynomialsBase< dim > & get_poly_space() const
virtual Tensor< 4, dim > shape_4th_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
void correct_third_derivatives(internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data, const internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const unsigned int n_q_points) const
virtual double shape_value(const unsigned int i, const Point< dim > &p) const override
virtual Tensor< 3, dim > shape_3rd_derivative(const unsigned int i, const Point< dim > &p) const override
virtual void fill_fe_face_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const hp::QCollection< dim - 1 > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const typename FiniteElement< dim, spacedim >::InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
virtual Tensor< 4, dim > shape_4th_derivative(const unsigned int i, const Point< dim > &p) const override
std::vector< unsigned int > get_poly_space_numbering() const
virtual std::size_t memory_consumption() const override
virtual void fill_fe_subface_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int sub_no, const Quadrature< dim - 1 > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const typename FiniteElement< dim, spacedim >::InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
virtual Tensor< 1, dim > shape_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual std::size_t memory_consumption() const
Abstract base class for mapping classes.
virtual void transform(const ArrayView< const Tensor< 1, dim > > &input, const MappingKind kind, const typename Mapping< dim, spacedim >::InternalDataBase &internal, const ArrayView< Tensor< 1, spacedim > > &output) const =0
static DataSetDescriptor face(const ReferenceCell< dim > &reference_cell, const unsigned int face_no, const types::geometric_orientation combined_orientation, const unsigned int n_quadrature_points)
static DataSetDescriptor subface(const ReferenceCell< dim > &reference_cell, const unsigned int face_no, const unsigned int subface_no, const types::geometric_orientation combined_orientation, const unsigned int n_quadrature_points, const internal::SubfaceCase< dim > ref_case=internal::SubfaceCase< dim >::case_isotropic)
unsigned int size() const
const std::vector< unsigned int > & get_numbering() const
const std::vector< unsigned int > & get_numbering() const
const std::vector< unsigned int > & get_numbering() const
unsigned int size() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_NOT_IMPLEMENTED()
#define Assert(cond, exc)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
@ update_jacobian_pushed_forward_2nd_derivatives
@ update_jacobian_pushed_forward_grads
@ update_hessians
Second derivatives of shape functions.
@ update_values
Shape function values.
@ update_normal_vectors
Normal vectors.
@ update_3rd_derivatives
Third derivatives of shape functions.
@ update_JxW_values
Transformed quadrature weights.
@ update_covariant_transformation
Covariant transformation.
@ update_gradients
Shape function gradients.
@ update_default
No update.
@ mapping_covariant_gradient
@ mapping_covariant_hessian
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell< dim > &reference_cell)
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
std::vector< Integer > invert_permutation(const std::vector< Integer > &permutation)