40 template <
int spacedim>
42 get_dof_sign_change_h_div(
43 const typename ::Triangulation<1, spacedim>::cell_iterator &,
45 const std::vector<MappingKind> &,
46 std::vector<double> &)
59 template <
int spacedim>
61 get_dof_sign_change_h_div(
62 const typename ::Triangulation<2, spacedim>::cell_iterator &cell,
64 const std::vector<MappingKind> &mapping_kind,
65 std::vector<double> &face_sign)
67 const unsigned int dim = 2;
70 const CellId this_cell_id = cell->id();
72 for (
unsigned int f = 0; f < GeometryInfo<dim>::faces_per_cell; ++f)
74 typename ::Triangulation<dim, spacedim>::face_iterator face =
76 if (!face->at_boundary())
78 const unsigned int nn = cell->neighbor_face_no(f);
79 const typename ::Triangulation<dim,
80 spacedim>::cell_iterator
81 neighbor_cell_at_face = cell->neighbor(f);
82 const CellId neighbor_cell_id = neighbor_cell_at_face->id();
86 if (((nn + f) % 2 == 0) && this_cell_id < neighbor_cell_id)
93 Assert(mapping_kind.size() == 1 ||
94 cell_j < mapping_kind.size(),
99 if ((mapping_kind.size() > 1 ?
100 mapping_kind[cell_j] :
110 template <
int spacedim>
112 get_dof_sign_change_h_div(
113 const typename ::Triangulation<3, spacedim>::cell_iterator
116 const std::vector<MappingKind> & ,
117 std::vector<double> & )
123 template <
int spacedim>
125 get_dof_sign_change_nedelec(
126 const typename ::Triangulation<1, spacedim>::cell_iterator
129 const std::vector<MappingKind> & ,
130 std::vector<double> & )
135 template <
int spacedim>
137 get_dof_sign_change_nedelec(
138 const typename ::Triangulation<2, spacedim>::cell_iterator &cell,
140 const std::vector<MappingKind> &mapping_kind,
141 std::vector<double> &line_dof_sign)
166 for (
unsigned int l = 0; l < GeometryInfo<2>::lines_per_cell; ++l)
167 if (cell->line_orientation(l) !=
175 line_dof_sign[l] = -1.0;
194 for (
unsigned int local_line_dof = 0;
195 local_line_dof < (k + 1);
197 if (local_line_dof % 2 == 0)
198 line_dof_sign[local_line_dof + l * (k + 1)] = -1.0;
203 template <
int spacedim>
205 get_dof_sign_change_nedelec(
206 const typename ::Triangulation<3, spacedim>::cell_iterator &cell,
208 const std::vector<MappingKind> &mapping_kind,
209 std::vector<double> &line_dof_sign)
237 for (
unsigned int l = 0; l < GeometryInfo<3>::lines_per_cell; ++l)
238 if (cell->line_orientation(l) !=
246 line_dof_sign[l] = -1.0;
265 for (
unsigned int local_line_dof = 0;
266 local_line_dof < (k + 1);
268 if (local_line_dof % 2 == 0)
269 line_dof_sign[local_line_dof + l * (k + 1)] = -1.0;
279template <
int dim,
int spacedim>
283 const std::vector<bool> &restriction_is_additive_flags,
284 const std::vector<ComponentMask> &nonzero_components)
286 restriction_is_additive_flags,
289 , poly_space(polynomials.clone())
291 cached_point[0] = -1;
299 for (
unsigned int comp = 0; comp < this->n_components(); ++comp)
300 this->component_to_base_table[comp].first.second = comp;
304 adjust_quad_dof_sign_for_face_orientation_table.resize(
305 this->n_unique_2d_subobjects());
307 for (
unsigned int f = 0; f < this->n_unique_2d_subobjects(); ++f)
309 adjust_quad_dof_sign_for_face_orientation_table[f] =
310 Table<2, bool>(this->n_dofs_per_quad(f),
312 adjust_quad_dof_sign_for_face_orientation_table[f].fill(
false);
319template <
int dim,
int spacedim>
321 : FiniteElement<dim, spacedim>(fe)
322 , mapping_kind(fe.mapping_kind)
323 , adjust_quad_dof_sign_for_face_orientation_table(
324 fe.adjust_quad_dof_sign_for_face_orientation_table)
325 , poly_space(fe.poly_space->clone())
326 , inverse_node_matrix(fe.inverse_node_matrix)
331template <
int dim,
int spacedim>
335 return mapping_kind.size() == 1;
339template <
int dim,
int spacedim>
342 const unsigned int index,
343 const unsigned int face,
357 Assert(adjust_quad_dof_sign_for_face_orientation_table
358 [this->n_unique_2d_subobjects() == 1 ? 0 : face]
361 this->n_dofs_per_quad(face),
364 return adjust_quad_dof_sign_for_face_orientation_table
365 [this->n_unique_2d_subobjects() == 1 ? 0 : face](
index,
366 combined_orientation);
370template <
int dim,
int spacedim>
374 if (single_mapping_kind())
375 return mapping_kind[0];
378 return mapping_kind[i];
383template <
int dim,
int spacedim>
386 const Point<dim> &)
const
395template <
int dim,
int spacedim>
398 const unsigned int i,
400 const unsigned int component)
const
405 std::scoped_lock lock(cache_mutex);
407 if (cached_point != p || cached_values.empty())
410 cached_values.resize(poly_space->n());
412 std::vector<Tensor<4, dim>> dummy1;
413 std::vector<Tensor<5, dim>> dummy2;
414 poly_space->evaluate(
415 p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
419 if (inverse_node_matrix.n_cols() == 0)
422 for (
unsigned int j = 0; j < inverse_node_matrix.n_cols(); ++j)
423 s += inverse_node_matrix(j, i) * cached_values[j][
component];
429template <
int dim,
int spacedim>
432 const Point<dim> &)
const
435 return Tensor<1, dim>();
440template <
int dim,
int spacedim>
443 const unsigned int i,
445 const unsigned int component)
const
450 std::scoped_lock lock(cache_mutex);
452 if (cached_point != p || cached_grads.empty())
455 cached_grads.resize(poly_space->n());
457 std::vector<Tensor<4, dim>> dummy1;
458 std::vector<Tensor<5, dim>> dummy2;
459 poly_space->evaluate(
460 p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
464 if (inverse_node_matrix.n_cols() == 0)
467 for (
unsigned int j = 0; j < inverse_node_matrix.n_cols(); ++j)
468 s += inverse_node_matrix(j, i) * cached_grads[j][
component];
475template <
int dim,
int spacedim>
478 const Point<dim> &)
const
481 return Tensor<2, dim>();
486template <
int dim,
int spacedim>
489 const unsigned int i,
491 const unsigned int component)
const
496 std::scoped_lock lock(cache_mutex);
498 if (cached_point != p || cached_grad_grads.empty())
501 cached_grad_grads.resize(poly_space->n());
503 std::vector<Tensor<4, dim>> dummy1;
504 std::vector<Tensor<5, dim>> dummy2;
505 poly_space->evaluate(
506 p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
510 if (inverse_node_matrix.n_cols() == 0)
513 for (
unsigned int j = 0; j < inverse_node_matrix.n_cols(); ++j)
514 s += inverse_node_matrix(i, j) * cached_grad_grads[j][
component];
524template <
int dim,
int spacedim>
529 const Quadrature<dim> &quadrature,
530 const Mapping<dim, spacedim> &
mapping,
531 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
532 const internal::FEValuesImplementation::MappingRelatedData<dim, spacedim>
535 ::internal::FEValuesImplementation::FiniteElementRelatedData<dim,
539 Assert(
dynamic_cast<const InternalData *
>(&fe_internal) !=
nullptr,
548 static_cast<const InternalData &
>(fe_internal),
554template <
int dim,
int spacedim>
558 const unsigned int face_no,
559 const hp::QCollection<dim - 1> &quadrature,
560 const Mapping<dim, spacedim> &
mapping,
561 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
562 const internal::FEValuesImplementation::MappingRelatedData<dim, spacedim>
565 ::internal::FEValuesImplementation::FiniteElementRelatedData<dim,
570 Assert(
dynamic_cast<const InternalData *
>(&fe_internal) !=
nullptr,
580 quadrature[0].size()),
581 quadrature[0].size(),
585 static_cast<const InternalData &
>(fe_internal),
591template <
int dim,
int spacedim>
595 const unsigned int face_no,
596 const unsigned int sub_no,
597 const Quadrature<dim - 1> &quadrature,
598 const Mapping<dim, spacedim> &
mapping,
599 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
600 const internal::FEValuesImplementation::MappingRelatedData<dim, spacedim>
603 ::internal::FEValuesImplementation::FiniteElementRelatedData<dim,
607 Assert(
dynamic_cast<const InternalData *
>(&fe_internal) !=
nullptr,
624 static_cast<const InternalData &
>(fe_internal),
630template <
int dim,
int spacedim>
636 const Mapping<dim, spacedim> &
mapping,
637 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
638 const internal::FEValuesImplementation::MappingRelatedData<dim, spacedim>
641 internal::FEValuesImplementation::FiniteElementRelatedData<dim, spacedim>
645 fe_data.
shape_values.size()[0] == this->n_dofs_per_cell(),
647 this->n_dofs_per_cell()));
658 internal::FE_PolyTensor::get_dof_sign_change_nedelec(
666 internal::FE_PolyTensor::get_dof_sign_change_h_div(cell,
672 const unsigned int first_quad_index = this->get_first_quad_index();
674 const unsigned int n_dofs_per_quad = this->n_dofs_per_quad();
675 const unsigned int n_quad_dofs =
678 for (
unsigned int dof_index = 0; dof_index < this->n_dofs_per_cell();
685 const bool is_quad_dof =
687 (first_quad_index <= dof_index) &&
688 (dof_index < first_quad_index + n_quad_dofs));
698 double dof_sign = 1.0;
709 unsigned int face_index_from_dof_index =
710 (dof_index - first_quad_index) / (n_dofs_per_quad);
712 unsigned int local_quad_dof_index = dof_index % n_dofs_per_quad;
715 if (adjust_quad_dof_sign_for_face_orientation(
716 local_quad_dof_index,
717 face_index_from_dof_index,
722 const MappingKind mapping_kind = get_mapping_kind(dof_index);
724 const unsigned int first =
726 [dof_index * this->n_components() +
727 this->get_nonzero_components(dof_index).first_selected_component()];
731 switch (mapping_kind)
736 for (
unsigned int d = 0;
d < dim; ++
d)
745 const ArrayView<Tensor<1, spacedim>>
746 transformed_shape_values =
756 transformed_shape_values);
759 for (
unsigned int d = 0;
d < dim; ++
d)
761 transformed_shape_values[k][
d];
768 const ArrayView<Tensor<1, spacedim>>
769 transformed_shape_values =
779 transformed_shape_values);
781 for (
unsigned int d = 0;
d < dim; ++
d)
783 dof_sign * transformed_shape_values[k][
d];
789 const ArrayView<Tensor<1, spacedim>>
790 transformed_shape_values =
800 transformed_shape_values);
803 for (
unsigned int d = 0;
d < dim; ++
d)
805 dof_sign * transformed_shape_values[k][
d];
817 const ArrayView<Tensor<2, spacedim>> transformed_shape_grads =
821 switch (mapping_kind)
831 transformed_shape_grads);
833 for (
unsigned int d = 0;
d < dim; ++
d)
835 transformed_shape_grads[k][d];
847 transformed_shape_grads);
850 for (
unsigned int d = 0;
d < spacedim; ++
d)
851 for (
unsigned int n = 0; n < spacedim; ++n)
852 transformed_shape_grads[k][d] -=
857 for (
unsigned int d = 0;
d < dim; ++
d)
859 transformed_shape_grads[k][d];
874 transformed_shape_grads);
877 for (
unsigned int d = 0;
d < spacedim; ++
d)
878 for (
unsigned int n = 0; n < spacedim; ++n)
879 transformed_shape_grads[k][d] +=
884 for (
unsigned int d = 0;
d < dim; ++
d)
886 transformed_shape_grads[k][d];
903 transformed_shape_grads);
906 for (
unsigned int d = 0;
d < spacedim; ++
d)
907 for (
unsigned int n = 0; n < spacedim; ++n)
908 transformed_shape_grads[k][d] +=
916 for (
unsigned int d = 0;
d < dim; ++
d)
918 dof_sign * transformed_shape_grads[k][d];
945 transformed_shape_grads);
948 for (
unsigned int d = 0;
d < spacedim; ++
d)
949 for (
unsigned int n = 0; n < spacedim; ++n)
950 transformed_shape_grads[k][d] -=
955 for (
unsigned int d = 0;
d < dim; ++
d)
957 dof_sign * transformed_shape_grads[k][d];
969 switch (mapping_kind)
973 const ArrayView<Tensor<3, spacedim>>
974 transformed_shape_hessians =
984 transformed_shape_hessians);
987 for (
unsigned int d = 0;
d < spacedim; ++
d)
988 for (
unsigned int n = 0; n < spacedim; ++n)
989 transformed_shape_hessians[k][d] -=
994 for (
unsigned int d = 0;
d < dim; ++
d)
996 transformed_shape_hessians[k][d];
1002 for (
unsigned int k = 0; k <
n_q_points; ++k)
1006 const ArrayView<Tensor<3, spacedim>>
1007 transformed_shape_hessians =
1017 transformed_shape_hessians);
1019 for (
unsigned int k = 0; k <
n_q_points; ++k)
1020 for (
unsigned int d = 0;
d < spacedim; ++
d)
1021 for (
unsigned int n = 0; n < spacedim; ++n)
1022 for (
unsigned int i = 0; i < spacedim; ++i)
1023 for (
unsigned int j = 0; j < spacedim; ++j)
1025 transformed_shape_hessians[k][
d][i][j] -=
1028 .jacobian_pushed_forward_2nd_derivatives
1041 for (
unsigned int k = 0; k <
n_q_points; ++k)
1042 for (
unsigned int d = 0;
d < dim; ++
d)
1044 transformed_shape_hessians[k][d];
1051 for (
unsigned int k = 0; k <
n_q_points; ++k)
1055 const ArrayView<Tensor<3, spacedim>>
1056 transformed_shape_hessians =
1066 transformed_shape_hessians);
1068 for (
unsigned int k = 0; k <
n_q_points; ++k)
1069 for (
unsigned int d = 0;
d < spacedim; ++
d)
1070 for (
unsigned int n = 0; n < spacedim; ++n)
1071 for (
unsigned int i = 0; i < spacedim; ++i)
1072 for (
unsigned int j = 0; j < spacedim; ++j)
1074 transformed_shape_hessians[k][
d][i][j] +=
1077 .jacobian_pushed_forward_2nd_derivatives
1088 for (
unsigned int m = 0; m < spacedim; ++m)
1089 transformed_shape_hessians[k][d][i][j] -=
1091 .jacobian_pushed_forward_grads[k][d][i]
1094 .jacobian_pushed_forward_grads[k][m][n]
1106 for (
unsigned int k = 0; k <
n_q_points; ++k)
1107 for (
unsigned int d = 0;
d < dim; ++
d)
1109 transformed_shape_hessians[k][d];
1117 for (
unsigned int k = 0; k <
n_q_points; ++k)
1121 const ArrayView<Tensor<3, spacedim>>
1122 transformed_shape_hessians =
1132 transformed_shape_hessians);
1134 for (
unsigned int k = 0; k <
n_q_points; ++k)
1135 for (
unsigned int d = 0;
d < spacedim; ++
d)
1136 for (
unsigned int n = 0; n < spacedim; ++n)
1137 for (
unsigned int i = 0; i < spacedim; ++i)
1138 for (
unsigned int j = 0; j < spacedim; ++j)
1140 transformed_shape_hessians[k][
d][i][j] +=
1143 .jacobian_pushed_forward_2nd_derivatives
1155 transformed_shape_hessians[k][
d][i][j] -=
1158 .jacobian_pushed_forward_2nd_derivatives
1167 for (
unsigned int m = 0; m < spacedim; ++m)
1169 transformed_shape_hessians[k][
d][i][j] -=
1185 transformed_shape_hessians[k][
d][i][j] +=
1203 for (
unsigned int k = 0; k <
n_q_points; ++k)
1204 for (
unsigned int d = 0;
d < dim; ++
d)
1206 dof_sign * transformed_shape_hessians[k][d];
1213 for (
unsigned int k = 0; k <
n_q_points; ++k)
1217 const ArrayView<Tensor<3, spacedim>>
1218 transformed_shape_hessians =
1228 transformed_shape_hessians);
1230 for (
unsigned int k = 0; k <
n_q_points; ++k)
1231 for (
unsigned int d = 0;
d < spacedim; ++
d)
1232 for (
unsigned int n = 0; n < spacedim; ++n)
1233 for (
unsigned int i = 0; i < spacedim; ++i)
1234 for (
unsigned int j = 0; j < spacedim; ++j)
1236 transformed_shape_hessians[k][
d][i][j] -=
1239 .jacobian_pushed_forward_2nd_derivatives
1252 for (
unsigned int k = 0; k <
n_q_points; ++k)
1253 for (
unsigned int d = 0;
d < dim; ++
d)
1255 dof_sign * transformed_shape_hessians[k][d];
1275template <
int dim,
int spacedim>
1282 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
1284 const MappingKind mapping_kind = get_mapping_kind(i);
1286 switch (mapping_kind)
1377#include "fe/fe_poly_tensor.inst"
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
internal::SubfaceCase< dim > subface_case(const unsigned int face_no) const
std::vector< Tensor< 3, spacedim > > transformed_shape_hessians
Table< 2, DerivativeForm< 2, dim, spacedim > > shape_grad_grads
Table< 2, DerivativeForm< 1, dim, spacedim > > shape_grads
std::vector< Tensor< 2, spacedim > > transformed_shape_grads
std::vector< Tensor< 3, dim > > untransformed_shape_hessian_tensors
std::vector< Tensor< 2, dim > > untransformed_shape_grads
Table< 2, Tensor< 1, dim > > shape_values
std::vector< Tensor< 1, spacedim > > transformed_shape_values
std::vector< double > dof_sign_change
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
bool adjust_quad_dof_sign_for_face_orientation(const unsigned int index, const unsigned int face_no, const types::geometric_orientation combined_orientation) const
virtual Tensor< 1, dim > shape_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 double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const override
void compute_fill(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const typename QProjector< dim >::DataSetDescriptor &offset, const unsigned int n_q_points, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const typename FE_PolyTensor< dim, spacedim >::InternalData &fe_internal, internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const
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 double shape_value(const unsigned int i, const Point< dim > &p) const override
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 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
MappingKind get_mapping_kind(const unsigned int i) const
FE_PolyTensor(const TensorPolynomialsBase< dim > &polynomials, const FiniteElementData< dim > &fe_data, const std::vector< bool > &restriction_is_additive_flags, const std::vector< ComponentMask > &nonzero_components)
bool single_mapping_kind() const
virtual Tensor< 1, dim > shape_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
unsigned int n_dofs_per_face(unsigned int face_no=0, unsigned int child=0) const
unsigned int tensor_degree() const
virtual unsigned int face_to_cell_index(const unsigned int face_dof_index, const unsigned int face, const types::geometric_orientation combined_orientation=numbers::default_geometric_orientation) const
friend class InternalDataBase
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 override
unsigned int size() 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 AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcFENotPrimitive()
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
TriaIterator< CellAccessor< dim, spacedim > > cell_iterator
@ update_jacobian_pushed_forward_2nd_derivatives
@ update_contravariant_transformation
Contravariant transformation.
@ update_jacobian_pushed_forward_grads
@ update_hessians
Second derivatives of shape functions.
@ update_values
Shape function values.
@ update_3rd_derivatives
Third derivatives of shape functions.
@ update_covariant_transformation
Covariant transformation.
@ update_gradients
Shape function gradients.
@ update_default
No update.
@ update_piola
Values needed for Piola transform.
@ mapping_covariant_gradient
@ mapping_contravariant_hessian
@ mapping_covariant_hessian
@ mapping_contravariant_gradient
types::geometric_orientation combined_face_orientation(const unsigned int face) const
MappingQ< dim, spacedim > StaticMappingQ1< dim, spacedim >::mapping
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell< dim > &reference_cell)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
* * * ScaleZFunction< dim, Number, components >::ScaleZFunction * component(component)
constexpr types::geometric_orientation default_geometric_orientation
std::uint8_t geometric_orientation
* const unsigned int n_q_points
static constexpr unsigned int faces_per_cell