17 #include <deal.II/base/array_view.h> 18 #include <deal.II/base/derivative_form.h> 19 #include <deal.II/base/polynomials_abf.h> 20 #include <deal.II/base/polynomials_bdm.h> 21 #include <deal.II/base/polynomials_nedelec.h> 22 #include <deal.II/base/polynomials_raviart_thomas.h> 23 #include <deal.II/base/polynomials_rt_bubbles.h> 24 #include <deal.II/base/qprojector.h> 26 #include <deal.II/fe/fe_poly_tensor.h> 27 #include <deal.II/fe/fe_values.h> 28 #include <deal.II/fe/mapping_cartesian.h> 30 #include <deal.II/grid/tria.h> 32 DEAL_II_NAMESPACE_OPEN
52 get_face_sign_change_rt(const ::Triangulation<1>::cell_iterator &,
54 std::vector<double> &face_sign)
57 std::fill(face_sign.begin(), face_sign.end(), 1.0);
63 get_face_sign_change_rt(
64 const ::Triangulation<2>::cell_iterator &cell,
65 const unsigned int dofs_per_face,
66 std::vector<double> & face_sign)
68 const unsigned int dim = 2;
69 const unsigned int spacedim = 2;
73 std::fill(face_sign.begin(), face_sign.end(), 1.0);
76 f < GeometryInfo<dim>::faces_per_cell;
81 if (!face->at_boundary())
83 const unsigned int nn = cell->neighbor_face_no(f);
86 for (
unsigned int j = 0; j < dofs_per_face; ++j)
88 Assert(f * dofs_per_face + j < face_sign.size(),
93 face_sign[f * dofs_per_face + j] = -1.0;
102 get_face_sign_change_rt(
103 const ::Triangulation<3>::cell_iterator & ,
105 std::vector<double> &face_sign)
107 std::fill(face_sign.begin(), face_sign.end(), 1.0);
112 get_face_sign_change_nedelec(
113 const ::Triangulation<1>::cell_iterator & ,
115 std::vector<double> &face_sign)
118 std::fill(face_sign.begin(), face_sign.end(), 1.0);
124 get_face_sign_change_nedelec(
125 const ::Triangulation<2>::cell_iterator & ,
127 std::vector<double> &face_sign)
129 std::fill(face_sign.begin(), face_sign.end(), 1.0);
135 get_face_sign_change_nedelec(
136 const ::Triangulation<3>::cell_iterator &cell,
138 std::vector<double> &face_sign)
140 const unsigned int dim = 3;
141 std::fill(face_sign.begin(), face_sign.end(), 1.0);
144 for (
unsigned int l = 0; l < GeometryInfo<dim>::lines_per_cell; ++
l)
145 if (!(cell->line_orientation(l)))
154 template <
class PolynomialType,
int dim,
int spacedim>
156 const unsigned int degree,
158 const std::vector<bool> & restriction_is_additive_flags,
159 const std::vector<ComponentMask> &nonzero_components)
161 restriction_is_additive_flags,
164 , poly_space(PolynomialType(degree))
174 for (
unsigned int comp = 0; comp < this->
n_components(); ++comp)
180 template <
class PolynomialType,
int dim,
int spacedim>
193 template <
class PolynomialType,
int dim,
int spacedim>
196 const unsigned int i,
198 const unsigned int component)
const 205 if (cached_point != p || cached_values.size() == 0)
208 cached_values.resize(poly_space.n());
210 std::vector<Tensor<4, dim>> dummy1;
211 std::vector<Tensor<5, dim>> dummy2;
213 p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
217 if (inverse_node_matrix.n_cols() == 0)
218 return cached_values[i][component];
220 for (
unsigned int j = 0; j < inverse_node_matrix.n_cols(); ++j)
221 s += inverse_node_matrix(j, i) * cached_values[j][component];
227 template <
class PolynomialType,
int dim,
int spacedim>
239 template <
class PolynomialType,
int dim,
int spacedim>
242 const unsigned int i,
244 const unsigned int component)
const 251 if (cached_point != p || cached_grads.size() == 0)
254 cached_grads.resize(poly_space.n());
256 std::vector<Tensor<4, dim>> dummy1;
257 std::vector<Tensor<5, dim>> dummy2;
259 p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
263 if (inverse_node_matrix.n_cols() == 0)
264 return cached_grads[i][component];
266 for (
unsigned int j = 0; j < inverse_node_matrix.n_cols(); ++j)
267 s += inverse_node_matrix(j, i) * cached_grads[j][component];
274 template <
class PolynomialType,
int dim,
int spacedim>
286 template <
class PolynomialType,
int dim,
int spacedim>
289 const unsigned int i,
291 const unsigned int component)
const 298 if (cached_point != p || cached_grad_grads.size() == 0)
301 cached_grad_grads.resize(poly_space.n());
303 std::vector<Tensor<4, dim>> dummy1;
304 std::vector<Tensor<5, dim>> dummy2;
306 p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
310 if (inverse_node_matrix.n_cols() == 0)
311 return cached_grad_grads[i][component];
313 for (
unsigned int j = 0; j < inverse_node_matrix.n_cols(); ++j)
314 s += inverse_node_matrix(i, j) * cached_grad_grads[j][component];
324 template <
class PolynomialType,
int dim,
int spacedim>
332 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
344 Assert(dynamic_cast<const InternalData *>(&fe_internal) !=
nullptr,
348 const unsigned int n_q_points = quadrature.
size();
353 this->dofs_per_cell));
367 internal::FE_PolyTensor::get_face_sign_change_rt(cell,
371 internal::FE_PolyTensor::get_face_sign_change_nedelec(cell,
376 for (
unsigned int i = 0; i < this->dofs_per_cell; ++i)
378 const unsigned int first =
379 output_data.shape_function_to_row_table[i * this->
n_components() +
380 this->get_nonzero_components(i)
381 .first_selected_component()];
395 switch (mapping_type)
399 for (
unsigned int k = 0; k < n_q_points; ++k)
400 for (
unsigned int d = 0; d < dim; ++d)
401 output_data.shape_values(first + d, k) =
413 fe_data.transformed_shape_values));
415 for (
unsigned int k = 0; k < n_q_points; ++k)
416 for (
unsigned int d = 0; d < dim; ++d)
417 output_data.shape_values(first + d, k) =
418 fe_data.transformed_shape_values[k][d];
430 fe_data.transformed_shape_values));
431 for (
unsigned int k = 0; k < n_q_points; ++k)
432 for (
unsigned int d = 0; d < dim; ++d)
433 output_data.shape_values(first + d, k) =
435 fe_data.transformed_shape_values[k][d];
445 fe_data.transformed_shape_values));
447 for (
unsigned int k = 0; k < n_q_points; ++k)
448 for (
unsigned int d = 0; d < dim; ++d)
449 output_data.shape_values(first + d, k) =
451 fe_data.transformed_shape_values[k][d];
469 switch (mapping_type)
477 fe_data.transformed_shape_grads));
478 for (
unsigned int k = 0; k < n_q_points; ++k)
479 for (
unsigned int d = 0; d < dim; ++d)
480 output_data.shape_gradients[first + d][k] =
481 fe_data.transformed_shape_grads[k][d];
490 fe_data.transformed_shape_grads));
492 for (
unsigned int k = 0; k < n_q_points; ++k)
493 for (
unsigned int d = 0; d < spacedim; ++d)
494 for (
unsigned int n = 0; n < spacedim; ++n)
495 fe_data.transformed_shape_grads[k][d] -=
496 output_data.shape_values(first + n, k) *
497 mapping_data.jacobian_pushed_forward_grads[k][n][d];
499 for (
unsigned int k = 0; k < n_q_points; ++k)
500 for (
unsigned int d = 0; d < dim; ++d)
501 output_data.shape_gradients[first + d][k] =
502 fe_data.transformed_shape_grads[k][d];
508 for (
unsigned int k = 0; k < n_q_points; ++k)
509 fe_data.untransformed_shape_grads[k] =
517 for (
unsigned int k = 0; k < n_q_points; ++k)
518 for (
unsigned int d = 0; d < spacedim; ++d)
519 for (
unsigned int n = 0; n < spacedim; ++n)
520 fe_data.transformed_shape_grads[k][d] +=
521 output_data.shape_values(first + n, k) *
522 mapping_data.jacobian_pushed_forward_grads[k][d][n];
525 for (
unsigned int k = 0; k < n_q_points; ++k)
526 for (
unsigned int d = 0; d < dim; ++d)
527 output_data.shape_gradients[first + d][k] =
528 fe_data.transformed_shape_grads[k][d];
535 for (
unsigned int k = 0; k < n_q_points; ++k)
536 fe_data.untransformed_shape_grads[k] =
544 for (
unsigned int k = 0; k < n_q_points; ++k)
545 for (
unsigned int d = 0; d < spacedim; ++d)
546 for (
unsigned int n = 0; n < spacedim; ++n)
547 fe_data.transformed_shape_grads[k][d] +=
548 (output_data.shape_values(first + n, k) *
550 .jacobian_pushed_forward_grads[k][d][n]) -
551 (output_data.shape_values(first + d, k) *
552 mapping_data.jacobian_pushed_forward_grads[k][n][n]);
554 for (
unsigned int k = 0; k < n_q_points; ++k)
555 for (
unsigned int d = 0; d < dim; ++d)
556 output_data.shape_gradients[first + d][k] =
558 fe_data.transformed_shape_grads[k][d];
575 for (
unsigned int k = 0; k < n_q_points; ++k)
576 fe_data.untransformed_shape_grads[k] =
585 for (
unsigned int k = 0; k < n_q_points; ++k)
586 for (
unsigned int d = 0; d < spacedim; ++d)
587 for (
unsigned int n = 0; n < spacedim; ++n)
588 fe_data.transformed_shape_grads[k][d] -=
589 output_data.shape_values(first + n, k) *
590 mapping_data.jacobian_pushed_forward_grads[k][n][d];
592 for (
unsigned int k = 0; k < n_q_points; ++k)
593 for (
unsigned int d = 0; d < dim; ++d)
594 output_data.shape_gradients[first + d][k] =
596 fe_data.transformed_shape_grads[k][d];
614 switch (mapping_type)
624 for (
unsigned int k = 0; k < n_q_points; ++k)
625 for (
unsigned int d = 0; d < spacedim; ++d)
626 for (
unsigned int n = 0; n < spacedim; ++n)
627 fe_data.transformed_shape_hessians[k][d] -=
628 output_data.shape_gradients[first + d][k][n] *
629 mapping_data.jacobian_pushed_forward_grads[k][n];
631 for (
unsigned int k = 0; k < n_q_points; ++k)
632 for (
unsigned int d = 0; d < dim; ++d)
633 output_data.shape_hessians[first + d][k] =
634 fe_data.transformed_shape_hessians[k][d];
640 for (
unsigned int k = 0; k < n_q_points; ++k)
641 fe_data.untransformed_shape_hessian_tensors[k] =
646 fe_data.untransformed_shape_hessian_tensors),
651 for (
unsigned int k = 0; k < n_q_points; ++k)
652 for (
unsigned int d = 0; d < spacedim; ++d)
653 for (
unsigned int n = 0; n < spacedim; ++n)
654 for (
unsigned int i = 0; i < spacedim; ++i)
655 for (
unsigned int j = 0; j < spacedim; ++j)
657 fe_data.transformed_shape_hessians[k][d][i][j] -=
658 (output_data.shape_values(first + n, k) *
660 .jacobian_pushed_forward_2nd_derivatives
662 (output_data.shape_gradients[first + d][k][n] *
664 .jacobian_pushed_forward_grads[k][n][i][j]) +
665 (output_data.shape_gradients[first + n][k][i] *
667 .jacobian_pushed_forward_grads[k][n][d][j]) +
668 (output_data.shape_gradients[first + n][k][j] *
670 .jacobian_pushed_forward_grads[k][n][i][d]);
673 for (
unsigned int k = 0; k < n_q_points; ++k)
674 for (
unsigned int d = 0; d < dim; ++d)
675 output_data.shape_hessians[first + d][k] =
676 fe_data.transformed_shape_hessians[k][d];
682 for (
unsigned int k = 0; k < n_q_points; ++k)
683 fe_data.untransformed_shape_hessian_tensors[k] =
688 fe_data.untransformed_shape_hessian_tensors),
693 for (
unsigned int k = 0; k < n_q_points; ++k)
694 for (
unsigned int d = 0; d < spacedim; ++d)
695 for (
unsigned int n = 0; n < spacedim; ++n)
696 for (
unsigned int i = 0; i < spacedim; ++i)
697 for (
unsigned int j = 0; j < spacedim; ++j)
699 fe_data.transformed_shape_hessians[k][d][i][j] +=
700 (output_data.shape_values(first + n, k) *
702 .jacobian_pushed_forward_2nd_derivatives
704 (output_data.shape_gradients[first + n][k][i] *
706 .jacobian_pushed_forward_grads[k][d][n][j]) +
707 (output_data.shape_gradients[first + n][k][j] *
709 .jacobian_pushed_forward_grads[k][d][i][n]) -
710 (output_data.shape_gradients[first + d][k][n] *
712 .jacobian_pushed_forward_grads[k][n][i][j]);
713 for (
unsigned int m = 0; m < spacedim; ++m)
715 .transformed_shape_hessians[k][d][i][j] -=
717 .jacobian_pushed_forward_grads[k][d][i]
720 .jacobian_pushed_forward_grads[k][m][n]
722 output_data.shape_values(first + n, k)) +
724 .jacobian_pushed_forward_grads[k][d][m]
727 .jacobian_pushed_forward_grads[k][m][i]
729 output_data.shape_values(first + n, k));
732 for (
unsigned int k = 0; k < n_q_points; ++k)
733 for (
unsigned int d = 0; d < dim; ++d)
734 output_data.shape_hessians[first + d][k] =
735 fe_data.transformed_shape_hessians[k][d];
742 for (
unsigned int k = 0; k < n_q_points; ++k)
743 fe_data.untransformed_shape_hessian_tensors[k] =
748 fe_data.untransformed_shape_hessian_tensors),
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 for (
unsigned int i = 0; i < spacedim; ++i)
757 for (
unsigned int j = 0; j < spacedim; ++j)
759 fe_data.transformed_shape_hessians[k][d][i][j] +=
760 (output_data.shape_values(first + n, k) *
762 .jacobian_pushed_forward_2nd_derivatives
764 (output_data.shape_gradients[first + n][k][i] *
766 .jacobian_pushed_forward_grads[k][d][n][j]) +
767 (output_data.shape_gradients[first + n][k][j] *
769 .jacobian_pushed_forward_grads[k][d][i][n]) -
770 (output_data.shape_gradients[first + d][k][n] *
772 .jacobian_pushed_forward_grads[k][n][i][j]);
774 fe_data.transformed_shape_hessians[k][d][i][j] -=
775 (output_data.shape_values(first + d, k) *
777 .jacobian_pushed_forward_2nd_derivatives
779 (output_data.shape_gradients[first + d][k][i] *
781 .jacobian_pushed_forward_grads[k][n][n][j]) +
782 (output_data.shape_gradients[first + d][k][j] *
784 .jacobian_pushed_forward_grads[k][n][n][i]);
786 for (
unsigned int m = 0; m < spacedim; ++m)
789 .transformed_shape_hessians[k][d][i][j] -=
791 .jacobian_pushed_forward_grads[k][d][i]
794 .jacobian_pushed_forward_grads[k][m][n]
796 output_data.shape_values(first + n, k)) +
798 .jacobian_pushed_forward_grads[k][d][m]
801 .jacobian_pushed_forward_grads[k][m][i]
803 output_data.shape_values(first + n, k));
806 .transformed_shape_hessians[k][d][i][j] +=
808 .jacobian_pushed_forward_grads[k][n][i]
811 .jacobian_pushed_forward_grads[k][m][n]
813 output_data.shape_values(first + d, k)) +
815 .jacobian_pushed_forward_grads[k][n][m]
818 .jacobian_pushed_forward_grads[k][m][i]
820 output_data.shape_values(first + d, k));
824 for (
unsigned int k = 0; k < n_q_points; ++k)
825 for (
unsigned int d = 0; d < dim; ++d)
826 output_data.shape_hessians[first + d][k] =
828 fe_data.transformed_shape_hessians[k][d];
835 for (
unsigned int k = 0; k < n_q_points; ++k)
836 fe_data.untransformed_shape_hessian_tensors[k] =
841 fe_data.untransformed_shape_hessian_tensors),
846 for (
unsigned int k = 0; k < n_q_points; ++k)
847 for (
unsigned int d = 0; d < spacedim; ++d)
848 for (
unsigned int n = 0; n < spacedim; ++n)
849 for (
unsigned int i = 0; i < spacedim; ++i)
850 for (
unsigned int j = 0; j < spacedim; ++j)
852 fe_data.transformed_shape_hessians[k][d][i][j] -=
853 (output_data.shape_values(first + n, k) *
855 .jacobian_pushed_forward_2nd_derivatives
857 (output_data.shape_gradients[first + d][k][n] *
859 .jacobian_pushed_forward_grads[k][n][i][j]) +
860 (output_data.shape_gradients[first + n][k][i] *
862 .jacobian_pushed_forward_grads[k][n][d][j]) +
863 (output_data.shape_gradients[first + n][k][j] *
865 .jacobian_pushed_forward_grads[k][n][i][d]);
868 for (
unsigned int k = 0; k < n_q_points; ++k)
869 for (
unsigned int d = 0; d < dim; ++d)
870 output_data.shape_hessians[first + d][k] =
872 fe_data.transformed_shape_hessians[k][d];
896 template <
class PolynomialType,
int dim,
int spacedim>
900 const unsigned int face_no,
904 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
916 Assert(dynamic_cast<const InternalData *>(&fe_internal) !=
nullptr,
920 const unsigned int n_q_points = quadrature.
size();
927 cell->face_orientation(face_no),
928 cell->face_flip(face_no),
929 cell->face_rotation(face_no),
943 internal::FE_PolyTensor::get_face_sign_change_rt(cell,
948 internal::FE_PolyTensor::get_face_sign_change_nedelec(cell,
952 for (
unsigned int i = 0; i < this->dofs_per_cell; ++i)
954 const unsigned int first =
955 output_data.shape_function_to_row_table[i * this->
n_components() +
956 this->get_nonzero_components(i)
957 .first_selected_component()];
961 switch (mapping_type)
965 for (
unsigned int k = 0; k < n_q_points; ++k)
966 for (
unsigned int d = 0; d < dim; ++d)
967 output_data.shape_values(first + d, k) =
976 transformed_shape_values =
986 transformed_shape_values);
988 for (
unsigned int k = 0; k < n_q_points; ++k)
989 for (
unsigned int d = 0; d < dim; ++d)
990 output_data.shape_values(first + d, k) =
991 transformed_shape_values[k][d];
999 transformed_shape_values =
1009 transformed_shape_values);
1010 for (
unsigned int k = 0; k < n_q_points; ++k)
1011 for (
unsigned int d = 0; d < dim; ++d)
1012 output_data.shape_values(first + d, k) =
1013 fe_data.
sign_change[i] * transformed_shape_values[k][d];
1020 transformed_shape_values =
1030 transformed_shape_values);
1032 for (
unsigned int k = 0; k < n_q_points; ++k)
1033 for (
unsigned int d = 0; d < dim; ++d)
1034 output_data.shape_values(first + d, k) =
1035 fe_data.
sign_change[i] * transformed_shape_values[k][d];
1047 switch (mapping_type)
1059 transformed_shape_grads);
1060 for (
unsigned int k = 0; k < n_q_points; ++k)
1061 for (
unsigned int d = 0; d < dim; ++d)
1062 output_data.shape_gradients[first + d][k] =
1063 transformed_shape_grads[k][d];
1077 transformed_shape_grads);
1079 for (
unsigned int k = 0; k < n_q_points; ++k)
1080 for (
unsigned int d = 0; d < spacedim; ++d)
1081 for (
unsigned int n = 0; n < spacedim; ++n)
1082 transformed_shape_grads[k][d] -=
1083 output_data.shape_values(first + n, k) *
1084 mapping_data.jacobian_pushed_forward_grads[k][n][d];
1086 for (
unsigned int k = 0; k < n_q_points; ++k)
1087 for (
unsigned int d = 0; d < dim; ++d)
1088 output_data.shape_gradients[first + d][k] =
1089 transformed_shape_grads[k][d];
1099 for (
unsigned int k = 0; k < n_q_points; ++k)
1100 fe_data.untransformed_shape_grads[k + offset] =
1108 transformed_shape_grads);
1110 for (
unsigned int k = 0; k < n_q_points; ++k)
1111 for (
unsigned int d = 0; d < spacedim; ++d)
1112 for (
unsigned int n = 0; n < spacedim; ++n)
1113 transformed_shape_grads[k][d] +=
1114 output_data.shape_values(first + n, k) *
1115 mapping_data.jacobian_pushed_forward_grads[k][d][n];
1117 for (
unsigned int k = 0; k < n_q_points; ++k)
1118 for (
unsigned int d = 0; d < dim; ++d)
1119 output_data.shape_gradients[first + d][k] =
1120 transformed_shape_grads[k][d];
1132 for (
unsigned int k = 0; k < n_q_points; ++k)
1133 fe_data.untransformed_shape_grads[k + offset] =
1141 transformed_shape_grads);
1143 for (
unsigned int k = 0; k < n_q_points; ++k)
1144 for (
unsigned int d = 0; d < spacedim; ++d)
1145 for (
unsigned int n = 0; n < spacedim; ++n)
1146 transformed_shape_grads[k][d] +=
1147 (output_data.shape_values(first + n, k) *
1149 .jacobian_pushed_forward_grads[k][d][n]) -
1150 (output_data.shape_values(first + d, k) *
1151 mapping_data.jacobian_pushed_forward_grads[k][n][n]);
1153 for (
unsigned int k = 0; k < n_q_points; ++k)
1154 for (
unsigned int d = 0; d < dim; ++d)
1155 output_data.shape_gradients[first + d][k] =
1156 fe_data.
sign_change[i] * transformed_shape_grads[k][d];
1173 for (
unsigned int k = 0; k < n_q_points; ++k)
1174 fe_data.untransformed_shape_grads[k + offset] =
1187 transformed_shape_grads);
1189 for (
unsigned int k = 0; k < n_q_points; ++k)
1190 for (
unsigned int d = 0; d < spacedim; ++d)
1191 for (
unsigned int n = 0; n < spacedim; ++n)
1192 transformed_shape_grads[k][d] -=
1193 output_data.shape_values(first + n, k) *
1194 mapping_data.jacobian_pushed_forward_grads[k][n][d];
1196 for (
unsigned int k = 0; k < n_q_points; ++k)
1197 for (
unsigned int d = 0; d < dim; ++d)
1198 output_data.shape_gradients[first + d][k] =
1199 fe_data.
sign_change[i] * transformed_shape_grads[k][d];
1211 switch (mapping_type)
1216 transformed_shape_hessians =
1226 transformed_shape_hessians);
1228 for (
unsigned int k = 0; k < n_q_points; ++k)
1229 for (
unsigned int d = 0; d < spacedim; ++d)
1230 for (
unsigned int n = 0; n < spacedim; ++n)
1231 transformed_shape_hessians[k][d] -=
1232 output_data.shape_gradients[first + d][k][n] *
1233 mapping_data.jacobian_pushed_forward_grads[k][n];
1235 for (
unsigned int k = 0; k < n_q_points; ++k)
1236 for (
unsigned int d = 0; d < dim; ++d)
1237 output_data.shape_hessians[first + d][k] =
1238 transformed_shape_hessians[k][d];
1244 for (
unsigned int k = 0; k < n_q_points; ++k)
1245 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1249 transformed_shape_hessians =
1259 transformed_shape_hessians);
1261 for (
unsigned int k = 0; k < n_q_points; ++k)
1262 for (
unsigned int d = 0; d < spacedim; ++d)
1263 for (
unsigned int n = 0; n < spacedim; ++n)
1264 for (
unsigned int i = 0; i < spacedim; ++i)
1265 for (
unsigned int j = 0; j < spacedim; ++j)
1267 transformed_shape_hessians[k][d][i][j] -=
1268 (output_data.shape_values(first + n, k) *
1270 .jacobian_pushed_forward_2nd_derivatives
1272 (output_data.shape_gradients[first + d][k][n] *
1274 .jacobian_pushed_forward_grads[k][n][i][j]) +
1275 (output_data.shape_gradients[first + n][k][i] *
1277 .jacobian_pushed_forward_grads[k][n][d][j]) +
1278 (output_data.shape_gradients[first + n][k][j] *
1280 .jacobian_pushed_forward_grads[k][n][i][d]);
1283 for (
unsigned int k = 0; k < n_q_points; ++k)
1284 for (
unsigned int d = 0; d < dim; ++d)
1285 output_data.shape_hessians[first + d][k] =
1286 transformed_shape_hessians[k][d];
1293 for (
unsigned int k = 0; k < n_q_points; ++k)
1294 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1298 transformed_shape_hessians =
1308 transformed_shape_hessians);
1310 for (
unsigned int k = 0; k < n_q_points; ++k)
1311 for (
unsigned int d = 0; d < spacedim; ++d)
1312 for (
unsigned int n = 0; n < spacedim; ++n)
1313 for (
unsigned int i = 0; i < spacedim; ++i)
1314 for (
unsigned int j = 0; j < spacedim; ++j)
1316 transformed_shape_hessians[k][d][i][j] +=
1317 (output_data.shape_values(first + n, k) *
1319 .jacobian_pushed_forward_2nd_derivatives
1321 (output_data.shape_gradients[first + n][k][i] *
1323 .jacobian_pushed_forward_grads[k][d][n][j]) +
1324 (output_data.shape_gradients[first + n][k][j] *
1326 .jacobian_pushed_forward_grads[k][d][i][n]) -
1327 (output_data.shape_gradients[first + d][k][n] *
1329 .jacobian_pushed_forward_grads[k][n][i][j]);
1330 for (
unsigned int m = 0; m < spacedim; ++m)
1331 transformed_shape_hessians[k][d][i][j] -=
1333 .jacobian_pushed_forward_grads[k][d][i]
1336 .jacobian_pushed_forward_grads[k][m][n]
1338 output_data.shape_values(first + n, k)) +
1340 .jacobian_pushed_forward_grads[k][d][m]
1343 .jacobian_pushed_forward_grads[k][m][i]
1345 output_data.shape_values(first + n, k));
1348 for (
unsigned int k = 0; k < n_q_points; ++k)
1349 for (
unsigned int d = 0; d < dim; ++d)
1350 output_data.shape_hessians[first + d][k] =
1351 transformed_shape_hessians[k][d];
1359 for (
unsigned int k = 0; k < n_q_points; ++k)
1360 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1364 transformed_shape_hessians =
1374 transformed_shape_hessians);
1376 for (
unsigned int k = 0; k < n_q_points; ++k)
1377 for (
unsigned int d = 0; d < spacedim; ++d)
1378 for (
unsigned int n = 0; n < spacedim; ++n)
1379 for (
unsigned int i = 0; i < spacedim; ++i)
1380 for (
unsigned int j = 0; j < spacedim; ++j)
1382 transformed_shape_hessians[k][d][i][j] +=
1383 (output_data.shape_values(first + n, k) *
1385 .jacobian_pushed_forward_2nd_derivatives
1387 (output_data.shape_gradients[first + n][k][i] *
1389 .jacobian_pushed_forward_grads[k][d][n][j]) +
1390 (output_data.shape_gradients[first + n][k][j] *
1392 .jacobian_pushed_forward_grads[k][d][i][n]) -
1393 (output_data.shape_gradients[first + d][k][n] *
1395 .jacobian_pushed_forward_grads[k][n][i][j]);
1397 transformed_shape_hessians[k][d][i][j] -=
1398 (output_data.shape_values(first + d, k) *
1400 .jacobian_pushed_forward_2nd_derivatives
1402 (output_data.shape_gradients[first + d][k][i] *
1404 .jacobian_pushed_forward_grads[k][n][n][j]) +
1405 (output_data.shape_gradients[first + d][k][j] *
1407 .jacobian_pushed_forward_grads[k][n][n][i]);
1409 for (
unsigned int m = 0; m < spacedim; ++m)
1411 transformed_shape_hessians[k][d][i][j] -=
1413 .jacobian_pushed_forward_grads[k][d][i]
1416 .jacobian_pushed_forward_grads[k][m][n]
1418 output_data.shape_values(first + n, k)) +
1420 .jacobian_pushed_forward_grads[k][d][m]
1423 .jacobian_pushed_forward_grads[k][m][i]
1425 output_data.shape_values(first + n, k));
1427 transformed_shape_hessians[k][d][i][j] +=
1429 .jacobian_pushed_forward_grads[k][n][i]
1432 .jacobian_pushed_forward_grads[k][m][n]
1434 output_data.shape_values(first + d, k)) +
1436 .jacobian_pushed_forward_grads[k][n][m]
1439 .jacobian_pushed_forward_grads[k][m][i]
1441 output_data.shape_values(first + d, k));
1445 for (
unsigned int k = 0; k < n_q_points; ++k)
1446 for (
unsigned int d = 0; d < dim; ++d)
1447 output_data.shape_hessians[first + d][k] =
1449 transformed_shape_hessians[k][d];
1456 for (
unsigned int k = 0; k < n_q_points; ++k)
1457 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1461 transformed_shape_hessians =
1471 transformed_shape_hessians);
1473 for (
unsigned int k = 0; k < n_q_points; ++k)
1474 for (
unsigned int d = 0; d < spacedim; ++d)
1475 for (
unsigned int n = 0; n < spacedim; ++n)
1476 for (
unsigned int i = 0; i < spacedim; ++i)
1477 for (
unsigned int j = 0; j < spacedim; ++j)
1479 transformed_shape_hessians[k][d][i][j] -=
1480 (output_data.shape_values(first + n, k) *
1482 .jacobian_pushed_forward_2nd_derivatives
1484 (output_data.shape_gradients[first + d][k][n] *
1486 .jacobian_pushed_forward_grads[k][n][i][j]) +
1487 (output_data.shape_gradients[first + n][k][i] *
1489 .jacobian_pushed_forward_grads[k][n][d][j]) +
1490 (output_data.shape_gradients[first + n][k][j] *
1492 .jacobian_pushed_forward_grads[k][n][i][d]);
1495 for (
unsigned int k = 0; k < n_q_points; ++k)
1496 for (
unsigned int d = 0; d < dim; ++d)
1497 output_data.shape_hessians[first + d][k] =
1499 transformed_shape_hessians[k][d];
1519 template <
class PolynomialType,
int dim,
int spacedim>
1523 const unsigned int face_no,
1524 const unsigned int sub_no,
1528 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1540 Assert(dynamic_cast<const InternalData *>(&fe_internal) !=
nullptr,
1544 const unsigned int n_q_points = quadrature.
size();
1552 cell->face_orientation(face_no),
1553 cell->face_flip(face_no),
1554 cell->face_rotation(face_no),
1556 cell->subface_case(face_no));
1571 internal::FE_PolyTensor::get_face_sign_change_rt(cell,
1572 this->dofs_per_face,
1576 internal::FE_PolyTensor::get_face_sign_change_nedelec(cell,
1577 this->dofs_per_face,
1580 for (
unsigned int i = 0; i < this->dofs_per_cell; ++i)
1582 const unsigned int first =
1583 output_data.shape_function_to_row_table[i * this->
n_components() +
1584 this->get_nonzero_components(i)
1585 .first_selected_component()];
1589 switch (mapping_type)
1593 for (
unsigned int k = 0; k < n_q_points; ++k)
1594 for (
unsigned int d = 0; d < dim; ++d)
1595 output_data.shape_values(first + d, k) =
1604 transformed_shape_values =
1614 transformed_shape_values);
1616 for (
unsigned int k = 0; k < n_q_points; ++k)
1617 for (
unsigned int d = 0; d < dim; ++d)
1618 output_data.shape_values(first + d, k) =
1619 transformed_shape_values[k][d];
1628 transformed_shape_values =
1639 transformed_shape_values);
1640 for (
unsigned int k = 0; k < n_q_points; ++k)
1641 for (
unsigned int d = 0; d < dim; ++d)
1642 output_data.shape_values(first + d, k) =
1643 fe_data.
sign_change[i] * transformed_shape_values[k][d];
1650 transformed_shape_values =
1661 transformed_shape_values);
1663 for (
unsigned int k = 0; k < n_q_points; ++k)
1664 for (
unsigned int d = 0; d < dim; ++d)
1665 output_data.shape_values(first + d, k) =
1666 fe_data.
sign_change[i] * transformed_shape_values[k][d];
1682 switch (mapping_type)
1690 transformed_shape_grads);
1691 for (
unsigned int k = 0; k < n_q_points; ++k)
1692 for (
unsigned int d = 0; d < dim; ++d)
1693 output_data.shape_gradients[first + d][k] =
1694 transformed_shape_grads[k][d];
1704 transformed_shape_grads);
1706 for (
unsigned int k = 0; k < n_q_points; ++k)
1707 for (
unsigned int d = 0; d < spacedim; ++d)
1708 for (
unsigned int n = 0; n < spacedim; ++n)
1709 transformed_shape_grads[k][d] -=
1710 output_data.shape_values(first + n, k) *
1711 mapping_data.jacobian_pushed_forward_grads[k][n][d];
1713 for (
unsigned int k = 0; k < n_q_points; ++k)
1714 for (
unsigned int d = 0; d < dim; ++d)
1715 output_data.shape_gradients[first + d][k] =
1716 transformed_shape_grads[k][d];
1723 for (
unsigned int k = 0; k < n_q_points; ++k)
1724 fe_data.untransformed_shape_grads[k + offset] =
1733 transformed_shape_grads);
1735 for (
unsigned int k = 0; k < n_q_points; ++k)
1736 for (
unsigned int d = 0; d < spacedim; ++d)
1737 for (
unsigned int n = 0; n < spacedim; ++n)
1738 transformed_shape_grads[k][d] +=
1739 output_data.shape_values(first + n, k) *
1740 mapping_data.jacobian_pushed_forward_grads[k][d][n];
1742 for (
unsigned int k = 0; k < n_q_points; ++k)
1743 for (
unsigned int d = 0; d < dim; ++d)
1744 output_data.shape_gradients[first + d][k] =
1745 transformed_shape_grads[k][d];
1753 for (
unsigned int k = 0; k < n_q_points; ++k)
1754 fe_data.untransformed_shape_grads[k + offset] =
1763 transformed_shape_grads);
1765 for (
unsigned int k = 0; k < n_q_points; ++k)
1766 for (
unsigned int d = 0; d < spacedim; ++d)
1767 for (
unsigned int n = 0; n < spacedim; ++n)
1768 transformed_shape_grads[k][d] +=
1769 (output_data.shape_values(first + n, k) *
1771 .jacobian_pushed_forward_grads[k][d][n]) -
1772 (output_data.shape_values(first + d, k) *
1773 mapping_data.jacobian_pushed_forward_grads[k][n][n]);
1775 for (
unsigned int k = 0; k < n_q_points; ++k)
1776 for (
unsigned int d = 0; d < dim; ++d)
1777 output_data.shape_gradients[first + d][k] =
1778 fe_data.
sign_change[i] * transformed_shape_grads[k][d];
1794 for (
unsigned int k = 0; k < n_q_points; ++k)
1795 fe_data.untransformed_shape_grads[k + offset] =
1804 transformed_shape_grads);
1806 for (
unsigned int k = 0; k < n_q_points; ++k)
1807 for (
unsigned int d = 0; d < spacedim; ++d)
1808 for (
unsigned int n = 0; n < spacedim; ++n)
1809 transformed_shape_grads[k][d] -=
1810 output_data.shape_values(first + n, k) *
1811 mapping_data.jacobian_pushed_forward_grads[k][n][d];
1813 for (
unsigned int k = 0; k < n_q_points; ++k)
1814 for (
unsigned int d = 0; d < dim; ++d)
1815 output_data.shape_gradients[first + d][k] =
1816 fe_data.
sign_change[i] * transformed_shape_grads[k][d];
1828 switch (mapping_type)
1833 transformed_shape_hessians =
1843 transformed_shape_hessians);
1845 for (
unsigned int k = 0; k < n_q_points; ++k)
1846 for (
unsigned int d = 0; d < spacedim; ++d)
1847 for (
unsigned int n = 0; n < spacedim; ++n)
1848 transformed_shape_hessians[k][d] -=
1849 output_data.shape_gradients[first + d][k][n] *
1850 mapping_data.jacobian_pushed_forward_grads[k][n];
1852 for (
unsigned int k = 0; k < n_q_points; ++k)
1853 for (
unsigned int d = 0; d < dim; ++d)
1854 output_data.shape_hessians[first + d][k] =
1855 transformed_shape_hessians[k][d];
1861 for (
unsigned int k = 0; k < n_q_points; ++k)
1862 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1866 transformed_shape_hessians =
1876 transformed_shape_hessians);
1878 for (
unsigned int k = 0; k < n_q_points; ++k)
1879 for (
unsigned int d = 0; d < spacedim; ++d)
1880 for (
unsigned int n = 0; n < spacedim; ++n)
1881 for (
unsigned int i = 0; i < spacedim; ++i)
1882 for (
unsigned int j = 0; j < spacedim; ++j)
1884 transformed_shape_hessians[k][d][i][j] -=
1885 (output_data.shape_values(first + n, k) *
1887 .jacobian_pushed_forward_2nd_derivatives
1889 (output_data.shape_gradients[first + d][k][n] *
1891 .jacobian_pushed_forward_grads[k][n][i][j]) +
1892 (output_data.shape_gradients[first + n][k][i] *
1894 .jacobian_pushed_forward_grads[k][n][d][j]) +
1895 (output_data.shape_gradients[first + n][k][j] *
1897 .jacobian_pushed_forward_grads[k][n][i][d]);
1900 for (
unsigned int k = 0; k < n_q_points; ++k)
1901 for (
unsigned int d = 0; d < dim; ++d)
1902 output_data.shape_hessians[first + d][k] =
1903 transformed_shape_hessians[k][d];
1910 for (
unsigned int k = 0; k < n_q_points; ++k)
1911 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1915 transformed_shape_hessians =
1925 transformed_shape_hessians);
1927 for (
unsigned int k = 0; k < n_q_points; ++k)
1928 for (
unsigned int d = 0; d < spacedim; ++d)
1929 for (
unsigned int n = 0; n < spacedim; ++n)
1930 for (
unsigned int i = 0; i < spacedim; ++i)
1931 for (
unsigned int j = 0; j < spacedim; ++j)
1933 transformed_shape_hessians[k][d][i][j] +=
1934 (output_data.shape_values(first + n, k) *
1936 .jacobian_pushed_forward_2nd_derivatives
1938 (output_data.shape_gradients[first + n][k][i] *
1940 .jacobian_pushed_forward_grads[k][d][n][j]) +
1941 (output_data.shape_gradients[first + n][k][j] *
1943 .jacobian_pushed_forward_grads[k][d][i][n]) -
1944 (output_data.shape_gradients[first + d][k][n] *
1946 .jacobian_pushed_forward_grads[k][n][i][j]);
1947 for (
unsigned int m = 0; m < spacedim; ++m)
1948 transformed_shape_hessians[k][d][i][j] -=
1950 .jacobian_pushed_forward_grads[k][d][i]
1953 .jacobian_pushed_forward_grads[k][m][n]
1955 output_data.shape_values(first + n, k)) +
1957 .jacobian_pushed_forward_grads[k][d][m]
1960 .jacobian_pushed_forward_grads[k][m][i]
1962 output_data.shape_values(first + n, k));
1965 for (
unsigned int k = 0; k < n_q_points; ++k)
1966 for (
unsigned int d = 0; d < dim; ++d)
1967 output_data.shape_hessians[first + d][k] =
1968 transformed_shape_hessians[k][d];
1976 for (
unsigned int k = 0; k < n_q_points; ++k)
1977 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1981 transformed_shape_hessians =
1991 transformed_shape_hessians);
1993 for (
unsigned int k = 0; k < n_q_points; ++k)
1994 for (
unsigned int d = 0; d < spacedim; ++d)
1995 for (
unsigned int n = 0; n < spacedim; ++n)
1996 for (
unsigned int i = 0; i < spacedim; ++i)
1997 for (
unsigned int j = 0; j < spacedim; ++j)
1999 transformed_shape_hessians[k][d][i][j] +=
2000 (output_data.shape_values(first + n, k) *
2002 .jacobian_pushed_forward_2nd_derivatives
2004 (output_data.shape_gradients[first + n][k][i] *
2006 .jacobian_pushed_forward_grads[k][d][n][j]) +
2007 (output_data.shape_gradients[first + n][k][j] *
2009 .jacobian_pushed_forward_grads[k][d][i][n]) -
2010 (output_data.shape_gradients[first + d][k][n] *
2012 .jacobian_pushed_forward_grads[k][n][i][j]);
2014 transformed_shape_hessians[k][d][i][j] -=
2015 (output_data.shape_values(first + d, k) *
2017 .jacobian_pushed_forward_2nd_derivatives
2019 (output_data.shape_gradients[first + d][k][i] *
2021 .jacobian_pushed_forward_grads[k][n][n][j]) +
2022 (output_data.shape_gradients[first + d][k][j] *
2024 .jacobian_pushed_forward_grads[k][n][n][i]);
2025 for (
unsigned int m = 0; m < spacedim; ++m)
2027 transformed_shape_hessians[k][d][i][j] -=
2029 .jacobian_pushed_forward_grads[k][d][i]
2032 .jacobian_pushed_forward_grads[k][m][n]
2034 output_data.shape_values(first + n, k)) +
2036 .jacobian_pushed_forward_grads[k][d][m]
2039 .jacobian_pushed_forward_grads[k][m][i]
2041 output_data.shape_values(first + n, k));
2043 transformed_shape_hessians[k][d][i][j] +=
2045 .jacobian_pushed_forward_grads[k][n][i]
2048 .jacobian_pushed_forward_grads[k][m][n]
2050 output_data.shape_values(first + d, k)) +
2052 .jacobian_pushed_forward_grads[k][n][m]
2055 .jacobian_pushed_forward_grads[k][m][i]
2057 output_data.shape_values(first + d, k));
2061 for (
unsigned int k = 0; k < n_q_points; ++k)
2062 for (
unsigned int d = 0; d < dim; ++d)
2063 output_data.shape_hessians[first + d][k] =
2065 transformed_shape_hessians[k][d];
2072 for (
unsigned int k = 0; k < n_q_points; ++k)
2073 fe_data.untransformed_shape_hessian_tensors[k + offset] =
2077 transformed_shape_hessians =
2087 transformed_shape_hessians);
2089 for (
unsigned int k = 0; k < n_q_points; ++k)
2090 for (
unsigned int d = 0; d < spacedim; ++d)
2091 for (
unsigned int n = 0; n < spacedim; ++n)
2092 for (
unsigned int i = 0; i < spacedim; ++i)
2093 for (
unsigned int j = 0; j < spacedim; ++j)
2095 transformed_shape_hessians[k][d][i][j] -=
2096 (output_data.shape_values(first + n, k) *
2098 .jacobian_pushed_forward_2nd_derivatives
2100 (output_data.shape_gradients[first + d][k][n] *
2102 .jacobian_pushed_forward_grads[k][n][i][j]) +
2103 (output_data.shape_gradients[first + n][k][i] *
2105 .jacobian_pushed_forward_grads[k][n][d][j]) +
2106 (output_data.shape_gradients[first + n][k][j] *
2108 .jacobian_pushed_forward_grads[k][n][i][d]);
2111 for (
unsigned int k = 0; k < n_q_points; ++k)
2112 for (
unsigned int d = 0; d < dim; ++d)
2113 output_data.shape_hessians[first + d][k] =
2115 transformed_shape_hessians[k][d];
2135 template <
class PolynomialType,
int dim,
int spacedim>
2142 switch (mapping_type)
2150 out |= update_gradients | update_values |
2154 out |= update_hessians | update_values | update_gradients |
2167 out |= update_gradients | update_values |
update_piola |
2173 out |= update_hessians |
update_piola | update_values |
2187 out |= update_gradients | update_values |
2193 out |= update_hessians |
update_piola | update_values |
2208 out |= update_gradients | update_values |
2213 out |= update_hessians | update_values | update_gradients |
2232 #include "fe_poly_tensor.inst" 2235 DEAL_II_NAMESPACE_CLOSE
Point< dim > cached_point
Contravariant transformation.
FE_PolyTensor(const unsigned int degree, const FiniteElementData< dim > &fe_data, const std::vector< bool > &restriction_is_additive_flags, const std::vector< ComponentMask > &nonzero_components)
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > component_to_base_table
static::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
virtual void transform(const ArrayView< const Tensor< 1, dim >> &input, const MappingType type, const typename Mapping< dim, spacedim >::InternalDataBase &internal, const ArrayView< Tensor< 1, spacedim >> &output) const =0
ArrayView< typename std::remove_reference< typename std::iterator_traits< Iterator >::reference >::type > make_array_view(const Iterator begin, const Iterator end)
unsigned int size() const
virtual Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const override
Third derivatives of shape functions.
size_type size(const unsigned int i) const
#define Assert(cond, exc)
static::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
virtual Tensor< 1, dim > shape_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
Abstract base class for mapping classes.
virtual double shape_value(const unsigned int i, const Point< dim > &p) const override
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const override
std::vector< double > sign_change
unsigned int n_components() const
Second derivatives of shape functions.
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
Table< 2, Tensor< 1, dim > > shape_values
Shape function gradients.
static DataSetDescriptor subface(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::ExceptionBase & ExcNotImplemented()
unsigned int n_components(const DoFHandler< dim, spacedim > &dh)
Table< 2, DerivativeForm< 1, dim, spacedim > > shape_grads
Values needed for Piola transform.
Covariant transformation.
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
static::ExceptionBase & ExcInternalError()
Table< 2, DerivativeForm< 2, dim, spacedim > > shape_grad_grads
static DataSetDescriptor face(const unsigned int face_no, const bool face_orientation, const bool face_flip, const bool face_rotation, const unsigned int n_quadrature_points)