42 template <
int spacedim>
44 get_dof_sign_change_h_div(
45 const typename ::Triangulation<1, spacedim>::cell_iterator &,
47 const std::vector<MappingKind> &,
48 std::vector<double> &)
61 template <
int spacedim>
63 get_dof_sign_change_h_div(
64 const typename ::Triangulation<2, spacedim>::cell_iterator &cell,
66 const std::vector<MappingKind> &mapping_kind,
67 std::vector<double> &face_sign)
69 const unsigned int dim = 2;
72 const CellId this_cell_id = cell->id();
74 for (
unsigned int f = 0; f < GeometryInfo<dim>::faces_per_cell; ++f)
76 typename ::Triangulation<dim, spacedim>::face_iterator face =
78 if (!face->at_boundary())
80 const unsigned int nn = cell->neighbor_face_no(f);
81 const typename ::Triangulation<dim,
82 spacedim>::cell_iterator
83 neighbor_cell_at_face = cell->neighbor(f);
84 const CellId neighbor_cell_id = neighbor_cell_at_face->id();
88 if (((nn + f) % 2 == 0) && this_cell_id < neighbor_cell_id)
95 Assert(mapping_kind.size() == 1 ||
96 cell_j < mapping_kind.size(),
101 if ((mapping_kind.size() > 1 ?
102 mapping_kind[cell_j] :
112 template <
int spacedim>
114 get_dof_sign_change_h_div(
115 const typename ::Triangulation<3, spacedim>::cell_iterator
118 const std::vector<MappingKind> & ,
119 std::vector<double> & )
125 template <
int spacedim>
127 get_dof_sign_change_nedelec(
128 const typename ::Triangulation<1, spacedim>::cell_iterator
131 const std::vector<MappingKind> & ,
132 std::vector<double> & )
137 template <
int spacedim>
139 get_dof_sign_change_nedelec(
140 const typename ::Triangulation<2, spacedim>::cell_iterator &cell,
142 const std::vector<MappingKind> &mapping_kind,
143 std::vector<double> &line_dof_sign)
168 for (
unsigned int l = 0; l < GeometryInfo<2>::lines_per_cell; ++l)
169 if (cell->line_orientation(l) !=
177 line_dof_sign[l] = -1.0;
196 for (
unsigned int local_line_dof = 0;
197 local_line_dof < (k + 1);
199 if (local_line_dof % 2 == 0)
200 line_dof_sign[local_line_dof + l * (k + 1)] = -1.0;
205 template <
int spacedim>
207 get_dof_sign_change_nedelec(
208 const typename ::Triangulation<3, spacedim>::cell_iterator &cell,
210 const std::vector<MappingKind> &mapping_kind,
211 std::vector<double> &line_dof_sign)
239 for (
unsigned int l = 0; l < GeometryInfo<3>::lines_per_cell; ++l)
240 if (cell->line_orientation(l) !=
248 line_dof_sign[l] = -1.0;
267 for (
unsigned int local_line_dof = 0;
268 local_line_dof < (k + 1);
270 if (local_line_dof % 2 == 0)
271 line_dof_sign[local_line_dof + l * (k + 1)] = -1.0;
281template <
int dim,
int spacedim>
285 const std::vector<bool> &restriction_is_additive_flags,
286 const std::vector<ComponentMask> &nonzero_components)
288 restriction_is_additive_flags,
291 , poly_space(polynomials.clone())
293 cached_point[0] = -1;
301 for (
unsigned int comp = 0; comp < this->n_components(); ++comp)
302 this->component_to_base_table[comp].
first.second = comp;
306 adjust_quad_dof_sign_for_face_orientation_table.resize(
307 this->n_unique_2d_subobjects());
309 for (
unsigned int f = 0; f < this->n_unique_2d_subobjects(); ++f)
311 adjust_quad_dof_sign_for_face_orientation_table[f] =
314 adjust_quad_dof_sign_for_face_orientation_table[f].fill(
false);
321template <
int dim,
int spacedim>
324 , mapping_kind(fe.mapping_kind)
325 , adjust_quad_dof_sign_for_face_orientation_table(
326 fe.adjust_quad_dof_sign_for_face_orientation_table)
327 , poly_space(fe.poly_space->clone())
328 , inverse_node_matrix(fe.inverse_node_matrix)
333template <
int dim,
int spacedim>
337 return mapping_kind.size() == 1;
341template <
int dim,
int spacedim>
344 const unsigned int index,
345 const unsigned int face,
346 const bool face_orientation,
347 const bool face_flip,
348 const bool face_rotation)
const
361 Assert(adjust_quad_dof_sign_for_face_orientation_table
362 [this->n_unique_2d_subobjects() == 1 ? 0 : face]
365 this->n_dofs_per_quad(face),
368 return adjust_quad_dof_sign_for_face_orientation_table
369 [this->n_unique_2d_subobjects() == 1 ? 0 : face](
377template <
int dim,
int spacedim>
381 if (single_mapping_kind())
382 return mapping_kind[0];
385 return mapping_kind[i];
390template <
int dim,
int spacedim>
402template <
int dim,
int spacedim>
405 const unsigned int i,
407 const unsigned int component)
const
412 std::lock_guard<std::mutex> lock(cache_mutex);
414 if (cached_point != p || cached_values.empty())
417 cached_values.resize(poly_space->n());
419 std::vector<Tensor<4, dim>> dummy1;
420 std::vector<Tensor<5, dim>> dummy2;
421 poly_space->evaluate(
422 p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
426 if (inverse_node_matrix.n_cols() == 0)
427 return cached_values[i][component];
429 for (
unsigned int j = 0; j < inverse_node_matrix.n_cols(); ++j)
430 s += inverse_node_matrix(j, i) * cached_values[j][component];
436template <
int dim,
int spacedim>
447template <
int dim,
int spacedim>
450 const unsigned int i,
452 const unsigned int component)
const
457 std::lock_guard<std::mutex> lock(cache_mutex);
459 if (cached_point != p || cached_grads.empty())
462 cached_grads.resize(poly_space->n());
464 std::vector<Tensor<4, dim>> dummy1;
465 std::vector<Tensor<5, dim>> dummy2;
466 poly_space->evaluate(
467 p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
471 if (inverse_node_matrix.n_cols() == 0)
472 return cached_grads[i][component];
474 for (
unsigned int j = 0; j < inverse_node_matrix.n_cols(); ++j)
475 s += inverse_node_matrix(j, i) * cached_grads[j][component];
482template <
int dim,
int spacedim>
493template <
int dim,
int spacedim>
496 const unsigned int i,
498 const unsigned int component)
const
503 std::lock_guard<std::mutex> lock(cache_mutex);
505 if (cached_point != p || cached_grad_grads.empty())
508 cached_grad_grads.resize(poly_space->n());
510 std::vector<Tensor<4, dim>> dummy1;
511 std::vector<Tensor<5, dim>> dummy2;
512 poly_space->evaluate(
513 p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
517 if (inverse_node_matrix.n_cols() == 0)
518 return cached_grad_grads[i][component];
520 for (
unsigned int j = 0; j < inverse_node_matrix.n_cols(); ++j)
521 s += inverse_node_matrix(i, j) * cached_grad_grads[j][component];
531template <
int dim,
int spacedim>
550 Assert(
dynamic_cast<const InternalData *
>(&fe_internal) !=
nullptr,
552 const InternalData &fe_data =
static_cast<const InternalData &
>(fe_internal);
554 const unsigned int n_q_points = quadrature.
size();
557 fe_data.shape_values.size()[0] == this->n_dofs_per_cell(),
559 this->n_dofs_per_cell()));
561 fe_data.shape_values.size()[1] == n_q_points,
569 std::fill(fe_data.dof_sign_change.begin(),
570 fe_data.dof_sign_change.end(),
573 internal::FE_PolyTensor::get_dof_sign_change_nedelec(
574 cell, *
this, this->mapping_kind, fe_data.dof_sign_change);
581 internal::FE_PolyTensor::get_dof_sign_change_h_div(cell,
584 fe_data.dof_sign_change);
587 const unsigned int first_quad_index = this->get_first_quad_index();
589 const unsigned int n_dofs_per_quad = this->n_dofs_per_quad();
590 const unsigned int n_quad_dofs =
593 for (
unsigned int dof_index = 0; dof_index < this->n_dofs_per_cell();
600 const bool is_quad_dof =
602 (first_quad_index <= dof_index) &&
603 (dof_index < first_quad_index + n_quad_dofs));
613 double dof_sign = 1.0;
616 dof_sign = fe_data.dof_sign_change[dof_index];
624 const unsigned int face_index_from_dof_index =
625 (dof_index - first_quad_index) / (n_dofs_per_quad);
627 const unsigned int local_quad_dof_index = dof_index % n_dofs_per_quad;
630 if (adjust_quad_dof_sign_for_face_orientation(
631 local_quad_dof_index,
632 face_index_from_dof_index,
633 cell->face_orientation(face_index_from_dof_index),
634 cell->face_flip(face_index_from_dof_index),
635 cell->face_rotation(face_index_from_dof_index)))
639 const MappingKind mapping_kind = get_mapping_kind(dof_index);
641 const unsigned int first =
642 output_data.shape_function_to_row_table
643 [dof_index * this->n_components() +
644 this->get_nonzero_components(dof_index).first_selected_component()];
658 switch (mapping_kind)
662 for (
unsigned int k = 0; k < n_q_points; ++k)
663 for (
unsigned int d = 0;
d < dim; ++
d)
664 output_data.shape_values(
first + d, k) =
665 fe_data.shape_values[dof_index][k][
d];
678 for (
unsigned int k = 0; k < n_q_points; ++k)
679 for (
unsigned int d = 0;
d < dim; ++
d)
680 output_data.shape_values(
first + d, k) =
681 fe_data.transformed_shape_values[k][
d];
694 for (
unsigned int k = 0; k < n_q_points; ++k)
695 for (
unsigned int d = 0;
d < dim; ++
d)
696 output_data.shape_values(
first + d, k) =
697 dof_sign * fe_data.transformed_shape_values[k][
d];
709 for (
unsigned int k = 0; k < n_q_points; ++k)
710 for (
unsigned int d = 0;
d < dim; ++
d)
711 output_data.shape_values(
first + d, k) =
712 dof_sign * fe_data.transformed_shape_values[k][
d];
730 switch (mapping_kind)
739 for (
unsigned int k = 0; k < n_q_points; ++k)
740 for (
unsigned int d = 0;
d < dim; ++
d)
741 output_data.shape_gradients[
first + d][k] =
742 fe_data.transformed_shape_grads[k][d];
753 for (
unsigned int k = 0; k < n_q_points; ++k)
754 for (
unsigned int d = 0;
d < spacedim; ++
d)
755 for (
unsigned int n = 0; n < spacedim; ++n)
756 fe_data.transformed_shape_grads[k][d] -=
757 output_data.shape_values(
first + n, k) *
760 for (
unsigned int k = 0; k < n_q_points; ++k)
761 for (
unsigned int d = 0;
d < dim; ++
d)
762 output_data.shape_gradients[
first + d][k] =
763 fe_data.transformed_shape_grads[k][d];
769 for (
unsigned int k = 0; k < n_q_points; ++k)
770 fe_data.untransformed_shape_grads[k] =
771 fe_data.shape_grads[dof_index][k];
778 for (
unsigned int k = 0; k < n_q_points; ++k)
779 for (
unsigned int d = 0;
d < spacedim; ++
d)
780 for (
unsigned int n = 0; n < spacedim; ++n)
781 fe_data.transformed_shape_grads[k][d] +=
782 output_data.shape_values(
first + n, k) *
786 for (
unsigned int k = 0; k < n_q_points; ++k)
787 for (
unsigned int d = 0;
d < dim; ++
d)
788 output_data.shape_gradients[
first + d][k] =
789 fe_data.transformed_shape_grads[k][d];
796 for (
unsigned int k = 0; k < n_q_points; ++k)
797 fe_data.untransformed_shape_grads[k] =
798 fe_data.shape_grads[dof_index][k];
805 for (
unsigned int k = 0; k < n_q_points; ++k)
806 for (
unsigned int d = 0;
d < spacedim; ++
d)
807 for (
unsigned int n = 0; n < spacedim; ++n)
808 fe_data.transformed_shape_grads[k][d] +=
809 (output_data.shape_values(
first + n, k) *
812 (output_data.shape_values(
first + d, k) *
815 for (
unsigned int k = 0; k < n_q_points; ++k)
816 for (
unsigned int d = 0;
d < dim; ++
d)
817 output_data.shape_gradients[
first + d][k] =
818 dof_sign * fe_data.transformed_shape_grads[k][d];
835 for (
unsigned int k = 0; k < n_q_points; ++k)
836 fe_data.untransformed_shape_grads[k] =
837 fe_data.shape_grads[dof_index][k];
845 for (
unsigned int k = 0; k < n_q_points; ++k)
846 for (
unsigned int d = 0;
d < spacedim; ++
d)
847 for (
unsigned int n = 0; n < spacedim; ++n)
848 fe_data.transformed_shape_grads[k][d] -=
849 output_data.shape_values(
first + n, k) *
852 for (
unsigned int k = 0; k < n_q_points; ++k)
853 for (
unsigned int d = 0;
d < dim; ++
d)
854 output_data.shape_gradients[
first + d][k] =
855 dof_sign * fe_data.transformed_shape_grads[k][d];
873 switch (mapping_kind)
883 for (
unsigned int k = 0; k < n_q_points; ++k)
884 for (
unsigned int d = 0;
d < spacedim; ++
d)
885 for (
unsigned int n = 0; n < spacedim; ++n)
886 fe_data.transformed_shape_hessians[k][d] -=
887 output_data.shape_gradients[
first + d][k][n] *
890 for (
unsigned int k = 0; k < n_q_points; ++k)
891 for (
unsigned int d = 0;
d < dim; ++
d)
892 output_data.shape_hessians[
first + d][k] =
893 fe_data.transformed_shape_hessians[k][d];
899 for (
unsigned int k = 0; k < n_q_points; ++k)
900 fe_data.untransformed_shape_hessian_tensors[k] =
901 fe_data.shape_grad_grads[dof_index][k];
905 fe_data.untransformed_shape_hessian_tensors),
910 for (
unsigned int k = 0; k < n_q_points; ++k)
911 for (
unsigned int d = 0;
d < spacedim; ++
d)
912 for (
unsigned int n = 0; n < spacedim; ++n)
913 for (
unsigned int i = 0; i < spacedim; ++i)
914 for (
unsigned int j = 0; j < spacedim; ++j)
916 fe_data.transformed_shape_hessians[k][
d][i][j] -=
917 (output_data.shape_values(
first + n, k) *
921 (output_data.shape_gradients[
first + d][k][n] *
924 (output_data.shape_gradients[
first + n][k][i] *
927 (output_data.shape_gradients[
first + n][k][j] *
932 for (
unsigned int k = 0; k < n_q_points; ++k)
933 for (
unsigned int d = 0;
d < dim; ++
d)
934 output_data.shape_hessians[
first + d][k] =
935 fe_data.transformed_shape_hessians[k][d];
941 for (
unsigned int k = 0; k < n_q_points; ++k)
942 fe_data.untransformed_shape_hessian_tensors[k] =
943 fe_data.shape_grad_grads[dof_index][k];
947 fe_data.untransformed_shape_hessian_tensors),
952 for (
unsigned int k = 0; k < n_q_points; ++k)
953 for (
unsigned int d = 0;
d < spacedim; ++
d)
954 for (
unsigned int n = 0; n < spacedim; ++n)
955 for (
unsigned int i = 0; i < spacedim; ++i)
956 for (
unsigned int j = 0; j < spacedim; ++j)
958 fe_data.transformed_shape_hessians[k][
d][i][j] +=
959 (output_data.shape_values(
first + n, k) *
963 (output_data.shape_gradients[
first + n][k][i] *
966 (output_data.shape_gradients[
first + n][k][j] *
969 (output_data.shape_gradients[
first + d][k][n] *
972 for (
unsigned int m = 0; m < spacedim; ++m)
974 .transformed_shape_hessians[k][d][i][j] -=
976 .jacobian_pushed_forward_grads[k][d][i]
979 .jacobian_pushed_forward_grads[k][m][n]
981 output_data.shape_values(
first + n, k)) +
983 .jacobian_pushed_forward_grads[k][d][m]
986 .jacobian_pushed_forward_grads[k][m][i]
988 output_data.shape_values(
first + n, k));
991 for (
unsigned int k = 0; k < n_q_points; ++k)
992 for (
unsigned int d = 0;
d < dim; ++
d)
993 output_data.shape_hessians[
first + d][k] =
994 fe_data.transformed_shape_hessians[k][d];
1001 for (
unsigned int k = 0; k < n_q_points; ++k)
1002 fe_data.untransformed_shape_hessian_tensors[k] =
1003 fe_data.shape_grad_grads[dof_index][k];
1007 fe_data.untransformed_shape_hessian_tensors),
1012 for (
unsigned int k = 0; k < n_q_points; ++k)
1013 for (
unsigned int d = 0;
d < spacedim; ++
d)
1014 for (
unsigned int n = 0; n < spacedim; ++n)
1015 for (
unsigned int i = 0; i < spacedim; ++i)
1016 for (
unsigned int j = 0; j < spacedim; ++j)
1018 fe_data.transformed_shape_hessians[k][
d][i][j] +=
1019 (output_data.shape_values(
first + n, k) *
1023 (output_data.shape_gradients[
first + n][k][i] *
1026 (output_data.shape_gradients[
first + n][k][j] *
1029 (output_data.shape_gradients[
first + d][k][n] *
1033 fe_data.transformed_shape_hessians[k][
d][i][j] -=
1034 (output_data.shape_values(
first + d, k) *
1038 (output_data.shape_gradients[
first + d][k][i] *
1041 (output_data.shape_gradients[
first +
d][k][j] *
1045 for (
unsigned int m = 0; m < spacedim; ++m)
1048 .transformed_shape_hessians[k][
d][i][j] -=
1055 output_data.shape_values(
first + n, k)) +
1057 .jacobian_pushed_forward_grads[k][d][m]
1060 .jacobian_pushed_forward_grads[k][m][i]
1062 output_data.shape_values(
first + n, k));
1065 .transformed_shape_hessians[k][
d][i][j] +=
1072 output_data.shape_values(
first + d, k)) +
1074 .jacobian_pushed_forward_grads[k][n][m]
1077 .jacobian_pushed_forward_grads[k][m][i]
1079 output_data.shape_values(
first + d, k));
1083 for (
unsigned int k = 0; k < n_q_points; ++k)
1084 for (
unsigned int d = 0;
d < dim; ++
d)
1085 output_data.shape_hessians[
first + d][k] =
1086 dof_sign * fe_data.transformed_shape_hessians[k][d];
1093 for (
unsigned int k = 0; k < n_q_points; ++k)
1094 fe_data.untransformed_shape_hessian_tensors[k] =
1095 fe_data.shape_grad_grads[dof_index][k];
1099 fe_data.untransformed_shape_hessian_tensors),
1104 for (
unsigned int k = 0; k < n_q_points; ++k)
1105 for (
unsigned int d = 0;
d < spacedim; ++
d)
1106 for (
unsigned int n = 0; n < spacedim; ++n)
1107 for (
unsigned int i = 0; i < spacedim; ++i)
1108 for (
unsigned int j = 0; j < spacedim; ++j)
1110 fe_data.transformed_shape_hessians[k][
d][i][j] -=
1111 (output_data.shape_values(
first + n, k) *
1115 (output_data.shape_gradients[
first + d][k][n] *
1118 (output_data.shape_gradients[
first + n][k][i] *
1121 (output_data.shape_gradients[
first + n][k][j] *
1126 for (
unsigned int k = 0; k < n_q_points; ++k)
1127 for (
unsigned int d = 0;
d < dim; ++
d)
1128 output_data.shape_hessians[
first + d][k] =
1129 dof_sign * fe_data.transformed_shape_hessians[k][d];
1153template <
int dim,
int spacedim>
1157 const unsigned int face_no,
1174 Assert(
dynamic_cast<const InternalData *
>(&fe_internal) !=
nullptr,
1176 const InternalData &fe_data =
static_cast<const InternalData &
>(fe_internal);
1178 const unsigned int n_q_points = quadrature[0].
size();
1186 cell->combined_face_orientation(
1197 std::fill(fe_data.dof_sign_change.begin(),
1198 fe_data.dof_sign_change.end(),
1201 internal::FE_PolyTensor::get_dof_sign_change_nedelec(
1202 cell, *
this, this->mapping_kind, fe_data.dof_sign_change);
1209 internal::FE_PolyTensor::get_dof_sign_change_h_div(cell,
1212 fe_data.dof_sign_change);
1215 const unsigned int first_quad_index = this->get_first_quad_index();
1217 const unsigned int n_dofs_per_quad = this->n_dofs_per_quad();
1218 const unsigned int n_quad_dofs =
1221 for (
unsigned int dof_index = 0; dof_index < this->n_dofs_per_cell();
1228 const bool is_quad_dof =
1230 (first_quad_index <= dof_index) &&
1231 (dof_index < first_quad_index + n_quad_dofs));
1241 double dof_sign = 1.0;
1244 dof_sign = fe_data.dof_sign_change[dof_index];
1252 unsigned int face_index_from_dof_index =
1253 (dof_index - first_quad_index) / (n_dofs_per_quad);
1255 unsigned int local_quad_dof_index = dof_index % n_dofs_per_quad;
1258 if (adjust_quad_dof_sign_for_face_orientation(
1259 local_quad_dof_index,
1260 face_index_from_dof_index,
1261 cell->face_orientation(face_index_from_dof_index),
1262 cell->face_flip(face_index_from_dof_index),
1263 cell->face_rotation(face_index_from_dof_index)))
1267 const MappingKind mapping_kind = get_mapping_kind(dof_index);
1269 const unsigned int first =
1270 output_data.shape_function_to_row_table
1271 [dof_index * this->n_components() +
1272 this->get_nonzero_components(dof_index).first_selected_component()];
1276 switch (mapping_kind)
1280 for (
unsigned int k = 0; k < n_q_points; ++k)
1281 for (
unsigned int d = 0;
d < dim; ++
d)
1282 output_data.shape_values(
first + d, k) =
1283 fe_data.shape_values[dof_index][k + offset][
d];
1291 transformed_shape_values =
1301 transformed_shape_values);
1303 for (
unsigned int k = 0; k < n_q_points; ++k)
1304 for (
unsigned int d = 0;
d < dim; ++
d)
1305 output_data.shape_values(
first + d, k) =
1306 transformed_shape_values[k][
d];
1314 transformed_shape_values =
1324 transformed_shape_values);
1325 for (
unsigned int k = 0; k < n_q_points; ++k)
1326 for (
unsigned int d = 0;
d < dim; ++
d)
1327 output_data.shape_values(
first + d, k) =
1328 dof_sign * transformed_shape_values[k][
d];
1335 transformed_shape_values =
1345 transformed_shape_values);
1347 for (
unsigned int k = 0; k < n_q_points; ++k)
1348 for (
unsigned int d = 0;
d < dim; ++
d)
1349 output_data.shape_values(
first + d, k) =
1350 dof_sign * transformed_shape_values[k][
d];
1362 switch (mapping_kind)
1376 transformed_shape_grads);
1377 for (
unsigned int k = 0; k < n_q_points; ++k)
1378 for (
unsigned int d = 0;
d < dim; ++
d)
1379 output_data.shape_gradients[
first + d][k] =
1380 transformed_shape_grads[k][d];
1396 transformed_shape_grads);
1398 for (
unsigned int k = 0; k < n_q_points; ++k)
1399 for (
unsigned int d = 0;
d < spacedim; ++
d)
1400 for (
unsigned int n = 0; n < spacedim; ++n)
1401 transformed_shape_grads[k][d] -=
1402 output_data.shape_values(
first + n, k) *
1405 for (
unsigned int k = 0; k < n_q_points; ++k)
1406 for (
unsigned int d = 0;
d < dim; ++
d)
1407 output_data.shape_gradients[
first + d][k] =
1408 transformed_shape_grads[k][d];
1418 for (
unsigned int k = 0; k < n_q_points; ++k)
1419 fe_data.untransformed_shape_grads[k + offset] =
1420 fe_data.shape_grads[dof_index][k + offset];
1427 transformed_shape_grads);
1429 for (
unsigned int k = 0; k < n_q_points; ++k)
1430 for (
unsigned int d = 0;
d < spacedim; ++
d)
1431 for (
unsigned int n = 0; n < spacedim; ++n)
1432 transformed_shape_grads[k][d] +=
1433 output_data.shape_values(
first + n, k) *
1436 for (
unsigned int k = 0; k < n_q_points; ++k)
1437 for (
unsigned int d = 0;
d < dim; ++
d)
1438 output_data.shape_gradients[
first + d][k] =
1439 transformed_shape_grads[k][d];
1451 for (
unsigned int k = 0; k < n_q_points; ++k)
1452 fe_data.untransformed_shape_grads[k + offset] =
1453 fe_data.shape_grads[dof_index][k + offset];
1460 transformed_shape_grads);
1462 for (
unsigned int k = 0; k < n_q_points; ++k)
1463 for (
unsigned int d = 0;
d < spacedim; ++
d)
1464 for (
unsigned int n = 0; n < spacedim; ++n)
1465 transformed_shape_grads[k][d] +=
1466 (output_data.shape_values(
first + n, k) *
1469 (output_data.shape_values(
first + d, k) *
1472 for (
unsigned int k = 0; k < n_q_points; ++k)
1473 for (
unsigned int d = 0;
d < dim; ++
d)
1474 output_data.shape_gradients[
first + d][k] =
1475 dof_sign * transformed_shape_grads[k][d];
1492 for (
unsigned int k = 0; k < n_q_points; ++k)
1493 fe_data.untransformed_shape_grads[k + offset] =
1494 fe_data.shape_grads[dof_index][k + offset];
1506 transformed_shape_grads);
1508 for (
unsigned int k = 0; k < n_q_points; ++k)
1509 for (
unsigned int d = 0;
d < spacedim; ++
d)
1510 for (
unsigned int n = 0; n < spacedim; ++n)
1511 transformed_shape_grads[k][d] -=
1512 output_data.shape_values(
first + n, k) *
1515 for (
unsigned int k = 0; k < n_q_points; ++k)
1516 for (
unsigned int d = 0;
d < dim; ++
d)
1517 output_data.shape_gradients[
first + d][k] =
1518 dof_sign * transformed_shape_grads[k][d];
1530 switch (mapping_kind)
1535 transformed_shape_hessians =
1545 transformed_shape_hessians);
1547 for (
unsigned int k = 0; k < n_q_points; ++k)
1548 for (
unsigned int d = 0;
d < spacedim; ++
d)
1549 for (
unsigned int n = 0; n < spacedim; ++n)
1550 transformed_shape_hessians[k][d] -=
1551 output_data.shape_gradients[
first + d][k][n] *
1554 for (
unsigned int k = 0; k < n_q_points; ++k)
1555 for (
unsigned int d = 0;
d < dim; ++
d)
1556 output_data.shape_hessians[
first + d][k] =
1557 transformed_shape_hessians[k][d];
1563 for (
unsigned int k = 0; k < n_q_points; ++k)
1564 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1565 fe_data.shape_grad_grads[dof_index][k + offset];
1568 transformed_shape_hessians =
1578 transformed_shape_hessians);
1580 for (
unsigned int k = 0; k < n_q_points; ++k)
1581 for (
unsigned int d = 0;
d < spacedim; ++
d)
1582 for (
unsigned int n = 0; n < spacedim; ++n)
1583 for (
unsigned int i = 0; i < spacedim; ++i)
1584 for (
unsigned int j = 0; j < spacedim; ++j)
1586 transformed_shape_hessians[k][
d][i][j] -=
1587 (output_data.shape_values(
first + n, k) *
1591 (output_data.shape_gradients[
first + d][k][n] *
1594 (output_data.shape_gradients[
first + n][k][i] *
1597 (output_data.shape_gradients[
first + n][k][j] *
1602 for (
unsigned int k = 0; k < n_q_points; ++k)
1603 for (
unsigned int d = 0;
d < dim; ++
d)
1604 output_data.shape_hessians[
first + d][k] =
1605 transformed_shape_hessians[k][d];
1612 for (
unsigned int k = 0; k < n_q_points; ++k)
1613 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1614 fe_data.shape_grad_grads[dof_index][k + offset];
1617 transformed_shape_hessians =
1627 transformed_shape_hessians);
1629 for (
unsigned int k = 0; k < n_q_points; ++k)
1630 for (
unsigned int d = 0;
d < spacedim; ++
d)
1631 for (
unsigned int n = 0; n < spacedim; ++n)
1632 for (
unsigned int i = 0; i < spacedim; ++i)
1633 for (
unsigned int j = 0; j < spacedim; ++j)
1635 transformed_shape_hessians[k][
d][i][j] +=
1636 (output_data.shape_values(
first + n, k) *
1640 (output_data.shape_gradients[
first + n][k][i] *
1643 (output_data.shape_gradients[
first + n][k][j] *
1646 (output_data.shape_gradients[
first + d][k][n] *
1649 for (
unsigned int m = 0; m < spacedim; ++m)
1650 transformed_shape_hessians[k][d][i][j] -=
1652 .jacobian_pushed_forward_grads[k][d][i]
1655 .jacobian_pushed_forward_grads[k][m][n]
1657 output_data.shape_values(
first + n, k)) +
1659 .jacobian_pushed_forward_grads[k][d][m]
1662 .jacobian_pushed_forward_grads[k][m][i]
1664 output_data.shape_values(
first + n, k));
1667 for (
unsigned int k = 0; k < n_q_points; ++k)
1668 for (
unsigned int d = 0;
d < dim; ++
d)
1669 output_data.shape_hessians[
first + d][k] =
1670 transformed_shape_hessians[k][d];
1678 for (
unsigned int k = 0; k < n_q_points; ++k)
1679 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1680 fe_data.shape_grad_grads[dof_index][k + offset];
1683 transformed_shape_hessians =
1693 transformed_shape_hessians);
1695 for (
unsigned int k = 0; k < n_q_points; ++k)
1696 for (
unsigned int d = 0;
d < spacedim; ++
d)
1697 for (
unsigned int n = 0; n < spacedim; ++n)
1698 for (
unsigned int i = 0; i < spacedim; ++i)
1699 for (
unsigned int j = 0; j < spacedim; ++j)
1701 transformed_shape_hessians[k][
d][i][j] +=
1702 (output_data.shape_values(
first + n, k) *
1706 (output_data.shape_gradients[
first + n][k][i] *
1709 (output_data.shape_gradients[
first + n][k][j] *
1712 (output_data.shape_gradients[
first + d][k][n] *
1716 transformed_shape_hessians[k][
d][i][j] -=
1717 (output_data.shape_values(
first + d, k) *
1721 (output_data.shape_gradients[
first + d][k][i] *
1724 (output_data.shape_gradients[
first +
d][k][j] *
1728 for (
unsigned int m = 0; m < spacedim; ++m)
1730 transformed_shape_hessians[k][
d][i][j] -=
1737 output_data.shape_values(
first + n, k)) +
1739 .jacobian_pushed_forward_grads[k][d][m]
1742 .jacobian_pushed_forward_grads[k][m][i]
1744 output_data.shape_values(
first + n, k));
1746 transformed_shape_hessians[k][
d][i][j] +=
1753 output_data.shape_values(
first + d, k)) +
1755 .jacobian_pushed_forward_grads[k][n][m]
1758 .jacobian_pushed_forward_grads[k][m][i]
1760 output_data.shape_values(
first + d, k));
1764 for (
unsigned int k = 0; k < n_q_points; ++k)
1765 for (
unsigned int d = 0;
d < dim; ++
d)
1766 output_data.shape_hessians[
first + d][k] =
1767 dof_sign * transformed_shape_hessians[k][d];
1774 for (
unsigned int k = 0; k < n_q_points; ++k)
1775 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1776 fe_data.shape_grad_grads[dof_index][k + offset];
1779 transformed_shape_hessians =
1789 transformed_shape_hessians);
1791 for (
unsigned int k = 0; k < n_q_points; ++k)
1792 for (
unsigned int d = 0;
d < spacedim; ++
d)
1793 for (
unsigned int n = 0; n < spacedim; ++n)
1794 for (
unsigned int i = 0; i < spacedim; ++i)
1795 for (
unsigned int j = 0; j < spacedim; ++j)
1797 transformed_shape_hessians[k][
d][i][j] -=
1798 (output_data.shape_values(
first + n, k) *
1802 (output_data.shape_gradients[
first + d][k][n] *
1805 (output_data.shape_gradients[
first + n][k][i] *
1808 (output_data.shape_gradients[
first + n][k][j] *
1813 for (
unsigned int k = 0; k < n_q_points; ++k)
1814 for (
unsigned int d = 0;
d < dim; ++
d)
1815 output_data.shape_hessians[
first + d][k] =
1816 dof_sign * transformed_shape_hessians[k][d];
1836template <
int dim,
int spacedim>
1840 const unsigned int face_no,
1841 const unsigned int sub_no,
1856 Assert(
dynamic_cast<const InternalData *
>(&fe_internal) !=
nullptr,
1858 const InternalData &fe_data =
static_cast<const InternalData &
>(fe_internal);
1860 const unsigned int n_q_points = quadrature.
size();
1869 cell->combined_face_orientation(
1872 cell->subface_case(face_no));
1881 std::fill(fe_data.dof_sign_change.begin(),
1882 fe_data.dof_sign_change.end(),
1885 internal::FE_PolyTensor::get_dof_sign_change_nedelec(
1886 cell, *
this, this->mapping_kind, fe_data.dof_sign_change);
1893 internal::FE_PolyTensor::get_dof_sign_change_h_div(cell,
1896 fe_data.dof_sign_change);
1899 const unsigned int first_quad_index = this->get_first_quad_index();
1901 const unsigned int n_dofs_per_quad = this->n_dofs_per_quad();
1902 const unsigned int n_quad_dofs =
1905 for (
unsigned int dof_index = 0; dof_index < this->n_dofs_per_cell();
1912 const bool is_quad_dof =
1914 (first_quad_index <= dof_index) &&
1915 (dof_index < first_quad_index + n_quad_dofs));
1925 double dof_sign = 1.0;
1928 dof_sign = fe_data.dof_sign_change[dof_index];
1936 unsigned int face_index_from_dof_index =
1937 (dof_index - first_quad_index) / (n_dofs_per_quad);
1939 unsigned int local_quad_dof_index = dof_index % n_dofs_per_quad;
1942 if (adjust_quad_dof_sign_for_face_orientation(
1943 local_quad_dof_index,
1944 face_index_from_dof_index,
1945 cell->face_orientation(face_index_from_dof_index),
1946 cell->face_flip(face_index_from_dof_index),
1947 cell->face_rotation(face_index_from_dof_index)))
1951 const MappingKind mapping_kind = get_mapping_kind(dof_index);
1953 const unsigned int first =
1954 output_data.shape_function_to_row_table
1955 [dof_index * this->n_components() +
1956 this->get_nonzero_components(dof_index).first_selected_component()];
1960 switch (mapping_kind)
1964 for (
unsigned int k = 0; k < n_q_points; ++k)
1965 for (
unsigned int d = 0;
d < dim; ++
d)
1966 output_data.shape_values(
first + d, k) =
1967 fe_data.shape_values[dof_index][k + offset][
d];
1975 transformed_shape_values =
1985 transformed_shape_values);
1987 for (
unsigned int k = 0; k < n_q_points; ++k)
1988 for (
unsigned int d = 0;
d < dim; ++
d)
1989 output_data.shape_values(
first + d, k) =
1990 transformed_shape_values[k][
d];
1999 transformed_shape_values =
2010 transformed_shape_values);
2011 for (
unsigned int k = 0; k < n_q_points; ++k)
2012 for (
unsigned int d = 0;
d < dim; ++
d)
2013 output_data.shape_values(
first + d, k) =
2014 dof_sign * transformed_shape_values[k][
d];
2021 transformed_shape_values =
2032 transformed_shape_values);
2034 for (
unsigned int k = 0; k < n_q_points; ++k)
2035 for (
unsigned int d = 0;
d < dim; ++
d)
2036 output_data.shape_values(
first + d, k) =
2037 dof_sign * transformed_shape_values[k][
d];
2053 switch (mapping_kind)
2063 transformed_shape_grads);
2064 for (
unsigned int k = 0; k < n_q_points; ++k)
2065 for (
unsigned int d = 0;
d < dim; ++
d)
2066 output_data.shape_gradients[
first + d][k] =
2067 transformed_shape_grads[k][d];
2079 transformed_shape_grads);
2081 for (
unsigned int k = 0; k < n_q_points; ++k)
2082 for (
unsigned int d = 0;
d < spacedim; ++
d)
2083 for (
unsigned int n = 0; n < spacedim; ++n)
2084 transformed_shape_grads[k][d] -=
2085 output_data.shape_values(
first + n, k) *
2088 for (
unsigned int k = 0; k < n_q_points; ++k)
2089 for (
unsigned int d = 0;
d < dim; ++
d)
2090 output_data.shape_gradients[
first + d][k] =
2091 transformed_shape_grads[k][d];
2098 for (
unsigned int k = 0; k < n_q_points; ++k)
2099 fe_data.untransformed_shape_grads[k + offset] =
2100 fe_data.shape_grads[dof_index][k + offset];
2108 transformed_shape_grads);
2110 for (
unsigned int k = 0; k < n_q_points; ++k)
2111 for (
unsigned int d = 0;
d < spacedim; ++
d)
2112 for (
unsigned int n = 0; n < spacedim; ++n)
2113 transformed_shape_grads[k][d] +=
2114 output_data.shape_values(
first + n, k) *
2117 for (
unsigned int k = 0; k < n_q_points; ++k)
2118 for (
unsigned int d = 0;
d < dim; ++
d)
2119 output_data.shape_gradients[
first + d][k] =
2120 transformed_shape_grads[k][d];
2128 for (
unsigned int k = 0; k < n_q_points; ++k)
2129 fe_data.untransformed_shape_grads[k + offset] =
2130 fe_data.shape_grads[dof_index][k + offset];
2138 transformed_shape_grads);
2140 for (
unsigned int k = 0; k < n_q_points; ++k)
2141 for (
unsigned int d = 0;
d < spacedim; ++
d)
2142 for (
unsigned int n = 0; n < spacedim; ++n)
2143 transformed_shape_grads[k][d] +=
2144 (output_data.shape_values(
first + n, k) *
2147 (output_data.shape_values(
first + d, k) *
2150 for (
unsigned int k = 0; k < n_q_points; ++k)
2151 for (
unsigned int d = 0;
d < dim; ++
d)
2152 output_data.shape_gradients[
first + d][k] =
2153 dof_sign * transformed_shape_grads[k][d];
2169 for (
unsigned int k = 0; k < n_q_points; ++k)
2170 fe_data.untransformed_shape_grads[k + offset] =
2171 fe_data.shape_grads[dof_index][k + offset];
2179 transformed_shape_grads);
2181 for (
unsigned int k = 0; k < n_q_points; ++k)
2182 for (
unsigned int d = 0;
d < spacedim; ++
d)
2183 for (
unsigned int n = 0; n < spacedim; ++n)
2184 transformed_shape_grads[k][d] -=
2185 output_data.shape_values(
first + n, k) *
2188 for (
unsigned int k = 0; k < n_q_points; ++k)
2189 for (
unsigned int d = 0;
d < dim; ++
d)
2190 output_data.shape_gradients[
first + d][k] =
2191 dof_sign * transformed_shape_grads[k][d];
2203 switch (mapping_kind)
2208 transformed_shape_hessians =
2218 transformed_shape_hessians);
2220 for (
unsigned int k = 0; k < n_q_points; ++k)
2221 for (
unsigned int d = 0;
d < spacedim; ++
d)
2222 for (
unsigned int n = 0; n < spacedim; ++n)
2223 transformed_shape_hessians[k][d] -=
2224 output_data.shape_gradients[
first + d][k][n] *
2227 for (
unsigned int k = 0; k < n_q_points; ++k)
2228 for (
unsigned int d = 0;
d < dim; ++
d)
2229 output_data.shape_hessians[
first + d][k] =
2230 transformed_shape_hessians[k][d];
2236 for (
unsigned int k = 0; k < n_q_points; ++k)
2237 fe_data.untransformed_shape_hessian_tensors[k + offset] =
2238 fe_data.shape_grad_grads[dof_index][k + offset];
2241 transformed_shape_hessians =
2251 transformed_shape_hessians);
2253 for (
unsigned int k = 0; k < n_q_points; ++k)
2254 for (
unsigned int d = 0;
d < spacedim; ++
d)
2255 for (
unsigned int n = 0; n < spacedim; ++n)
2256 for (
unsigned int i = 0; i < spacedim; ++i)
2257 for (
unsigned int j = 0; j < spacedim; ++j)
2259 transformed_shape_hessians[k][
d][i][j] -=
2260 (output_data.shape_values(
first + n, k) *
2264 (output_data.shape_gradients[
first + d][k][n] *
2267 (output_data.shape_gradients[
first + n][k][i] *
2270 (output_data.shape_gradients[
first + n][k][j] *
2275 for (
unsigned int k = 0; k < n_q_points; ++k)
2276 for (
unsigned int d = 0;
d < dim; ++
d)
2277 output_data.shape_hessians[
first + d][k] =
2278 transformed_shape_hessians[k][d];
2285 for (
unsigned int k = 0; k < n_q_points; ++k)
2286 fe_data.untransformed_shape_hessian_tensors[k + offset] =
2287 fe_data.shape_grad_grads[dof_index][k + offset];
2290 transformed_shape_hessians =
2300 transformed_shape_hessians);
2302 for (
unsigned int k = 0; k < n_q_points; ++k)
2303 for (
unsigned int d = 0;
d < spacedim; ++
d)
2304 for (
unsigned int n = 0; n < spacedim; ++n)
2305 for (
unsigned int i = 0; i < spacedim; ++i)
2306 for (
unsigned int j = 0; j < spacedim; ++j)
2308 transformed_shape_hessians[k][
d][i][j] +=
2309 (output_data.shape_values(
first + n, k) *
2313 (output_data.shape_gradients[
first + n][k][i] *
2316 (output_data.shape_gradients[
first + n][k][j] *
2319 (output_data.shape_gradients[
first + d][k][n] *
2322 for (
unsigned int m = 0; m < spacedim; ++m)
2323 transformed_shape_hessians[k][d][i][j] -=
2325 .jacobian_pushed_forward_grads[k][d][i]
2328 .jacobian_pushed_forward_grads[k][m][n]
2330 output_data.shape_values(
first + n, k)) +
2332 .jacobian_pushed_forward_grads[k][d][m]
2335 .jacobian_pushed_forward_grads[k][m][i]
2337 output_data.shape_values(
first + n, k));
2340 for (
unsigned int k = 0; k < n_q_points; ++k)
2341 for (
unsigned int d = 0;
d < dim; ++
d)
2342 output_data.shape_hessians[
first + d][k] =
2343 transformed_shape_hessians[k][d];
2351 for (
unsigned int k = 0; k < n_q_points; ++k)
2352 fe_data.untransformed_shape_hessian_tensors[k + offset] =
2353 fe_data.shape_grad_grads[dof_index][k + offset];
2356 transformed_shape_hessians =
2366 transformed_shape_hessians);
2368 for (
unsigned int k = 0; k < n_q_points; ++k)
2369 for (
unsigned int d = 0;
d < spacedim; ++
d)
2370 for (
unsigned int n = 0; n < spacedim; ++n)
2371 for (
unsigned int i = 0; i < spacedim; ++i)
2372 for (
unsigned int j = 0; j < spacedim; ++j)
2374 transformed_shape_hessians[k][
d][i][j] +=
2375 (output_data.shape_values(
first + n, k) *
2379 (output_data.shape_gradients[
first + n][k][i] *
2382 (output_data.shape_gradients[
first + n][k][j] *
2385 (output_data.shape_gradients[
first + d][k][n] *
2389 transformed_shape_hessians[k][
d][i][j] -=
2390 (output_data.shape_values(
first + d, k) *
2394 (output_data.shape_gradients[
first + d][k][i] *
2397 (output_data.shape_gradients[
first +
d][k][j] *
2400 for (
unsigned int m = 0; m < spacedim; ++m)
2402 transformed_shape_hessians[k][
d][i][j] -=
2409 output_data.shape_values(
first + n, k)) +
2411 .jacobian_pushed_forward_grads[k][d][m]
2414 .jacobian_pushed_forward_grads[k][m][i]
2416 output_data.shape_values(
first + n, k));
2418 transformed_shape_hessians[k][
d][i][j] +=
2425 output_data.shape_values(
first + d, k)) +
2427 .jacobian_pushed_forward_grads[k][n][m]
2430 .jacobian_pushed_forward_grads[k][m][i]
2432 output_data.shape_values(
first + d, k));
2436 for (
unsigned int k = 0; k < n_q_points; ++k)
2437 for (
unsigned int d = 0;
d < dim; ++
d)
2438 output_data.shape_hessians[
first + d][k] =
2439 dof_sign * transformed_shape_hessians[k][d];
2446 for (
unsigned int k = 0; k < n_q_points; ++k)
2447 fe_data.untransformed_shape_hessian_tensors[k + offset] =
2448 fe_data.shape_grad_grads[dof_index][k + offset];
2451 transformed_shape_hessians =
2461 transformed_shape_hessians);
2463 for (
unsigned int k = 0; k < n_q_points; ++k)
2464 for (
unsigned int d = 0;
d < spacedim; ++
d)
2465 for (
unsigned int n = 0; n < spacedim; ++n)
2466 for (
unsigned int i = 0; i < spacedim; ++i)
2467 for (
unsigned int j = 0; j < spacedim; ++j)
2469 transformed_shape_hessians[k][
d][i][j] -=
2470 (output_data.shape_values(
first + n, k) *
2474 (output_data.shape_gradients[
first + d][k][n] *
2477 (output_data.shape_gradients[
first + n][k][i] *
2480 (output_data.shape_gradients[
first + n][k][j] *
2485 for (
unsigned int k = 0; k < n_q_points; ++k)
2486 for (
unsigned int d = 0;
d < dim; ++
d)
2487 output_data.shape_hessians[
first + d][k] =
2488 dof_sign * transformed_shape_hessians[k][d];
2508template <
int dim,
int spacedim>
2515 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
2517 const MappingKind mapping_kind = get_mapping_kind(i);
2519 switch (mapping_kind)
2610#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)
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
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
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
bool adjust_quad_dof_sign_for_face_orientation(const unsigned int index, const unsigned int face_no, const bool face_orientation, const bool face_flip, const bool face_rotation) const
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
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 subface(const ReferenceCell &reference_cell, const unsigned int face_no, const unsigned int subface_no, const bool face_orientation, const bool face_flip, const bool face_rotation, const unsigned int n_quadrature_points, const internal::SubfaceCase< dim > ref_case=internal::SubfaceCase< dim >::case_isotropic)
static DataSetDescriptor face(const ReferenceCell &reference_cell, const unsigned int face_no, const bool face_orientation, const bool face_flip, const bool face_rotation, const unsigned int n_quadrature_points)
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 & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
@ 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
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell &reference_cell)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
types::geometric_orientation combined_face_orientation(const bool face_orientation, const bool face_rotation, const bool face_flip)
constexpr types::geometric_orientation default_geometric_orientation