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_bernardi_raugel.h> 22 #include <deal.II/base/polynomials_nedelec.h> 23 #include <deal.II/base/polynomials_raviart_thomas.h> 24 #include <deal.II/base/polynomials_rt_bubbles.h> 25 #include <deal.II/base/qprojector.h> 27 #include <deal.II/fe/fe_poly_tensor.h> 28 #include <deal.II/fe/fe_values.h> 29 #include <deal.II/fe/mapping_cartesian.h> 31 #include <deal.II/grid/tria.h> 33 DEAL_II_NAMESPACE_OPEN
53 get_face_sign_change_rt(const ::Triangulation<1>::cell_iterator &,
55 std::vector<double> &face_sign)
58 std::fill(face_sign.begin(), face_sign.end(), 1.0);
64 get_face_sign_change_rt(
65 const ::Triangulation<2>::cell_iterator &cell,
66 const unsigned int dofs_per_face,
67 std::vector<double> & face_sign)
69 const unsigned int dim = 2;
70 const unsigned int spacedim = 2;
74 std::fill(face_sign.begin(), face_sign.end(), 1.0);
77 f < GeometryInfo<dim>::faces_per_cell;
82 if (!face->at_boundary())
84 const unsigned int nn = cell->neighbor_face_no(f);
87 for (
unsigned int j = 0; j < dofs_per_face; ++j)
89 Assert(f * dofs_per_face + j < face_sign.size(),
94 face_sign[f * dofs_per_face + j] = -1.0;
103 get_face_sign_change_rt(
104 const ::Triangulation<3>::cell_iterator & ,
106 std::vector<double> &face_sign)
108 std::fill(face_sign.begin(), face_sign.end(), 1.0);
113 get_face_sign_change_nedelec(
114 const ::Triangulation<1>::cell_iterator & ,
116 std::vector<double> &face_sign)
119 std::fill(face_sign.begin(), face_sign.end(), 1.0);
125 get_face_sign_change_nedelec(
126 const ::Triangulation<2>::cell_iterator & ,
128 std::vector<double> &face_sign)
130 std::fill(face_sign.begin(), face_sign.end(), 1.0);
136 get_face_sign_change_nedelec(
137 const ::Triangulation<3>::cell_iterator &cell,
139 std::vector<double> &face_sign)
141 const unsigned int dim = 3;
142 std::fill(face_sign.begin(), face_sign.end(), 1.0);
145 for (
unsigned int l = 0; l < GeometryInfo<dim>::lines_per_cell; ++
l)
146 if (!(cell->line_orientation(l)))
155 template <
class PolynomialType,
int dim,
int spacedim>
157 const unsigned int degree,
159 const std::vector<bool> & restriction_is_additive_flags,
160 const std::vector<ComponentMask> &nonzero_components)
162 restriction_is_additive_flags,
165 , poly_space(PolynomialType(degree))
175 for (
unsigned int comp = 0; comp < this->
n_components(); ++comp)
181 template <
class PolynomialType,
int dim,
int spacedim>
194 template <
class PolynomialType,
int dim,
int spacedim>
197 const unsigned int i,
199 const unsigned int component)
const 204 std::lock_guard<std::mutex> lock(cache_mutex);
206 if (cached_point != p || cached_values.size() == 0)
209 cached_values.resize(poly_space.n());
211 std::vector<Tensor<4, dim>> dummy1;
212 std::vector<Tensor<5, dim>> dummy2;
214 p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
218 if (inverse_node_matrix.n_cols() == 0)
219 return cached_values[i][component];
221 for (
unsigned int j = 0; j < inverse_node_matrix.n_cols(); ++j)
222 s += inverse_node_matrix(j, i) * cached_values[j][component];
228 template <
class PolynomialType,
int dim,
int spacedim>
240 template <
class PolynomialType,
int dim,
int spacedim>
243 const unsigned int i,
245 const unsigned int component)
const 250 std::lock_guard<std::mutex> lock(cache_mutex);
252 if (cached_point != p || cached_grads.size() == 0)
255 cached_grads.resize(poly_space.n());
257 std::vector<Tensor<4, dim>> dummy1;
258 std::vector<Tensor<5, dim>> dummy2;
260 p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
264 if (inverse_node_matrix.n_cols() == 0)
265 return cached_grads[i][component];
267 for (
unsigned int j = 0; j < inverse_node_matrix.n_cols(); ++j)
268 s += inverse_node_matrix(j, i) * cached_grads[j][component];
275 template <
class PolynomialType,
int dim,
int spacedim>
287 template <
class PolynomialType,
int dim,
int spacedim>
290 const unsigned int i,
292 const unsigned int component)
const 297 std::lock_guard<std::mutex> lock(cache_mutex);
299 if (cached_point != p || cached_grad_grads.size() == 0)
302 cached_grad_grads.resize(poly_space.n());
304 std::vector<Tensor<4, dim>> dummy1;
305 std::vector<Tensor<5, dim>> dummy2;
307 p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
311 if (inverse_node_matrix.n_cols() == 0)
312 return cached_grad_grads[i][component];
314 for (
unsigned int j = 0; j < inverse_node_matrix.n_cols(); ++j)
315 s += inverse_node_matrix(i, j) * cached_grad_grads[j][component];
325 template <
class PolynomialType,
int dim,
int spacedim>
333 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
345 Assert(dynamic_cast<const InternalData *>(&fe_internal) !=
nullptr,
347 const InternalData &fe_data =
static_cast<const InternalData &
>(fe_internal);
349 const unsigned int n_q_points = quadrature.
size();
352 fe_data.shape_values.size()[0] == this->dofs_per_cell,
354 this->dofs_per_cell));
356 fe_data.shape_values.size()[1] == n_q_points,
365 std::fill(fe_data.sign_change.begin(), fe_data.sign_change.end(), 1.0);
368 internal::FE_PolyTensor::get_face_sign_change_rt(cell,
370 fe_data.sign_change);
372 internal::FE_PolyTensor::get_face_sign_change_nedelec(cell,
374 fe_data.sign_change);
377 for (
unsigned int i = 0; i < this->dofs_per_cell; ++i)
379 const unsigned int first =
380 output_data.shape_function_to_row_table[i * this->
n_components() +
381 this->get_nonzero_components(i)
382 .first_selected_component()];
396 switch (mapping_type)
400 for (
unsigned int k = 0; k < n_q_points; ++k)
401 for (
unsigned int d = 0; d < dim; ++d)
402 output_data.shape_values(first + d, k) =
403 fe_data.shape_values[i][k][d];
414 fe_data.transformed_shape_values));
416 for (
unsigned int k = 0; k < n_q_points; ++k)
417 for (
unsigned int d = 0;
d < dim; ++
d)
418 output_data.shape_values(first + d, k) =
419 fe_data.transformed_shape_values[k][
d];
431 fe_data.transformed_shape_values));
432 for (
unsigned int k = 0; k < n_q_points; ++k)
433 for (
unsigned int d = 0;
d < dim; ++
d)
434 output_data.shape_values(first + d, k) =
435 fe_data.sign_change[i] *
436 fe_data.transformed_shape_values[k][
d];
446 fe_data.transformed_shape_values));
448 for (
unsigned int k = 0; k < n_q_points; ++k)
449 for (
unsigned int d = 0;
d < dim; ++
d)
450 output_data.shape_values(first + d, k) =
451 fe_data.sign_change[i] *
452 fe_data.transformed_shape_values[k][
d];
470 switch (mapping_type)
478 fe_data.transformed_shape_grads));
479 for (
unsigned int k = 0; k < n_q_points; ++k)
480 for (
unsigned int d = 0;
d < dim; ++
d)
481 output_data.shape_gradients[first + d][k] =
482 fe_data.transformed_shape_grads[k][d];
491 fe_data.transformed_shape_grads));
493 for (
unsigned int k = 0; k < n_q_points; ++k)
494 for (
unsigned int d = 0;
d < spacedim; ++
d)
495 for (
unsigned int n = 0; n < spacedim; ++n)
496 fe_data.transformed_shape_grads[k][d] -=
497 output_data.shape_values(first + n, k) *
498 mapping_data.jacobian_pushed_forward_grads[k][n][
d];
500 for (
unsigned int k = 0; k < n_q_points; ++k)
501 for (
unsigned int d = 0;
d < dim; ++
d)
502 output_data.shape_gradients[first + d][k] =
503 fe_data.transformed_shape_grads[k][d];
509 for (
unsigned int k = 0; k < n_q_points; ++k)
510 fe_data.untransformed_shape_grads[k] =
511 fe_data.shape_grads[i][k];
518 for (
unsigned int k = 0; k < n_q_points; ++k)
519 for (
unsigned int d = 0;
d < spacedim; ++
d)
520 for (
unsigned int n = 0; n < spacedim; ++n)
521 fe_data.transformed_shape_grads[k][d] +=
522 output_data.shape_values(first + n, k) *
523 mapping_data.jacobian_pushed_forward_grads[k][
d][n];
526 for (
unsigned int k = 0; k < n_q_points; ++k)
527 for (
unsigned int d = 0;
d < dim; ++
d)
528 output_data.shape_gradients[first + d][k] =
529 fe_data.transformed_shape_grads[k][d];
536 for (
unsigned int k = 0; k < n_q_points; ++k)
537 fe_data.untransformed_shape_grads[k] =
538 fe_data.shape_grads[i][k];
545 for (
unsigned int k = 0; k < n_q_points; ++k)
546 for (
unsigned int d = 0;
d < spacedim; ++
d)
547 for (
unsigned int n = 0; n < spacedim; ++n)
548 fe_data.transformed_shape_grads[k][d] +=
549 (output_data.shape_values(first + n, k) *
551 .jacobian_pushed_forward_grads[k][
d][n]) -
552 (output_data.shape_values(first + d, k) *
553 mapping_data.jacobian_pushed_forward_grads[k][n][n]);
555 for (
unsigned int k = 0; k < n_q_points; ++k)
556 for (
unsigned int d = 0;
d < dim; ++
d)
557 output_data.shape_gradients[first + d][k] =
558 fe_data.sign_change[i] *
559 fe_data.transformed_shape_grads[k][d];
576 for (
unsigned int k = 0; k < n_q_points; ++k)
577 fe_data.untransformed_shape_grads[k] =
578 fe_data.shape_grads[i][k];
586 for (
unsigned int k = 0; k < n_q_points; ++k)
587 for (
unsigned int d = 0;
d < spacedim; ++
d)
588 for (
unsigned int n = 0; n < spacedim; ++n)
589 fe_data.transformed_shape_grads[k][d] -=
590 output_data.shape_values(first + n, k) *
591 mapping_data.jacobian_pushed_forward_grads[k][n][
d];
593 for (
unsigned int k = 0; k < n_q_points; ++k)
594 for (
unsigned int d = 0;
d < dim; ++
d)
595 output_data.shape_gradients[first + d][k] =
596 fe_data.sign_change[i] *
597 fe_data.transformed_shape_grads[k][d];
615 switch (mapping_type)
625 for (
unsigned int k = 0; k < n_q_points; ++k)
626 for (
unsigned int d = 0;
d < spacedim; ++
d)
627 for (
unsigned int n = 0; n < spacedim; ++n)
628 fe_data.transformed_shape_hessians[k][d] -=
629 output_data.shape_gradients[first + d][k][n] *
630 mapping_data.jacobian_pushed_forward_grads[k][n];
632 for (
unsigned int k = 0; k < n_q_points; ++k)
633 for (
unsigned int d = 0;
d < dim; ++
d)
634 output_data.shape_hessians[first + d][k] =
635 fe_data.transformed_shape_hessians[k][d];
641 for (
unsigned int k = 0; k < n_q_points; ++k)
642 fe_data.untransformed_shape_hessian_tensors[k] =
643 fe_data.shape_grad_grads[i][k];
647 fe_data.untransformed_shape_hessian_tensors),
652 for (
unsigned int k = 0; k < n_q_points; ++k)
653 for (
unsigned int d = 0;
d < spacedim; ++
d)
654 for (
unsigned int n = 0; n < spacedim; ++n)
655 for (
unsigned int i = 0; i < spacedim; ++i)
656 for (
unsigned int j = 0; j < spacedim; ++j)
658 fe_data.transformed_shape_hessians[k][
d][i][j] -=
659 (output_data.shape_values(first + n, k) *
661 .jacobian_pushed_forward_2nd_derivatives
663 (output_data.shape_gradients[first + d][k][n] *
665 .jacobian_pushed_forward_grads[k][n][i][j]) +
666 (output_data.shape_gradients[first + n][k][i] *
668 .jacobian_pushed_forward_grads[k][n][
d][j]) +
669 (output_data.shape_gradients[first + n][k][j] *
671 .jacobian_pushed_forward_grads[k][n][i][d]);
674 for (
unsigned int k = 0; k < n_q_points; ++k)
675 for (
unsigned int d = 0;
d < dim; ++
d)
676 output_data.shape_hessians[first + d][k] =
677 fe_data.transformed_shape_hessians[k][d];
683 for (
unsigned int k = 0; k < n_q_points; ++k)
684 fe_data.untransformed_shape_hessian_tensors[k] =
685 fe_data.shape_grad_grads[i][k];
689 fe_data.untransformed_shape_hessian_tensors),
694 for (
unsigned int k = 0; k < n_q_points; ++k)
695 for (
unsigned int d = 0;
d < spacedim; ++
d)
696 for (
unsigned int n = 0; n < spacedim; ++n)
697 for (
unsigned int i = 0; i < spacedim; ++i)
698 for (
unsigned int j = 0; j < spacedim; ++j)
700 fe_data.transformed_shape_hessians[k][
d][i][j] +=
701 (output_data.shape_values(first + n, k) *
703 .jacobian_pushed_forward_2nd_derivatives
705 (output_data.shape_gradients[first + n][k][i] *
707 .jacobian_pushed_forward_grads[k][d][n][j]) +
708 (output_data.shape_gradients[first + n][k][j] *
710 .jacobian_pushed_forward_grads[k][
d][i][n]) -
711 (output_data.shape_gradients[first + d][k][n] *
713 .jacobian_pushed_forward_grads[k][n][i][j]);
714 for (
unsigned int m = 0; m < spacedim; ++m)
716 .transformed_shape_hessians[k][d][i][j] -=
718 .jacobian_pushed_forward_grads[k][d][i]
721 .jacobian_pushed_forward_grads[k][m][n]
723 output_data.shape_values(first + n, k)) +
725 .jacobian_pushed_forward_grads[k][d][m]
728 .jacobian_pushed_forward_grads[k][m][i]
730 output_data.shape_values(first + n, k));
733 for (
unsigned int k = 0; k < n_q_points; ++k)
734 for (
unsigned int d = 0;
d < dim; ++
d)
735 output_data.shape_hessians[first + d][k] =
736 fe_data.transformed_shape_hessians[k][d];
743 for (
unsigned int k = 0; k < n_q_points; ++k)
744 fe_data.untransformed_shape_hessian_tensors[k] =
745 fe_data.shape_grad_grads[i][k];
749 fe_data.untransformed_shape_hessian_tensors),
754 for (
unsigned int k = 0; k < n_q_points; ++k)
755 for (
unsigned int d = 0;
d < spacedim; ++
d)
756 for (
unsigned int n = 0; n < spacedim; ++n)
757 for (
unsigned int i = 0; i < spacedim; ++i)
758 for (
unsigned int j = 0; j < spacedim; ++j)
760 fe_data.transformed_shape_hessians[k][
d][i][j] +=
761 (output_data.shape_values(first + n, k) *
763 .jacobian_pushed_forward_2nd_derivatives
765 (output_data.shape_gradients[first + n][k][i] *
767 .jacobian_pushed_forward_grads[k][d][n][j]) +
768 (output_data.shape_gradients[first + n][k][j] *
770 .jacobian_pushed_forward_grads[k][
d][i][n]) -
771 (output_data.shape_gradients[first + d][k][n] *
773 .jacobian_pushed_forward_grads[k][n][i][j]);
775 fe_data.transformed_shape_hessians[k][
d][i][j] -=
776 (output_data.shape_values(first + d, k) *
778 .jacobian_pushed_forward_2nd_derivatives
780 (output_data.shape_gradients[first + d][k][i] *
782 .jacobian_pushed_forward_grads[k][n][n][j]) +
783 (output_data.shape_gradients[first +
d][k][j] *
785 .jacobian_pushed_forward_grads[k][n][n][i]);
787 for (
unsigned int m = 0; m < spacedim; ++m)
790 .transformed_shape_hessians[k][
d][i][j] -=
792 .jacobian_pushed_forward_grads[k][
d][i]
795 .jacobian_pushed_forward_grads[k][m][n]
797 output_data.shape_values(first + n, k)) +
799 .jacobian_pushed_forward_grads[k][d][m]
802 .jacobian_pushed_forward_grads[k][m][i]
804 output_data.shape_values(first + n, k));
807 .transformed_shape_hessians[k][
d][i][j] +=
809 .jacobian_pushed_forward_grads[k][n][i]
812 .jacobian_pushed_forward_grads[k][m][n]
814 output_data.shape_values(first + d, k)) +
816 .jacobian_pushed_forward_grads[k][n][m]
819 .jacobian_pushed_forward_grads[k][m][i]
821 output_data.shape_values(first + d, k));
825 for (
unsigned int k = 0; k < n_q_points; ++k)
826 for (
unsigned int d = 0;
d < dim; ++
d)
827 output_data.shape_hessians[first + d][k] =
828 fe_data.sign_change[i] *
829 fe_data.transformed_shape_hessians[k][d];
836 for (
unsigned int k = 0; k < n_q_points; ++k)
837 fe_data.untransformed_shape_hessian_tensors[k] =
838 fe_data.shape_grad_grads[i][k];
842 fe_data.untransformed_shape_hessian_tensors),
847 for (
unsigned int k = 0; k < n_q_points; ++k)
848 for (
unsigned int d = 0;
d < spacedim; ++
d)
849 for (
unsigned int n = 0; n < spacedim; ++n)
850 for (
unsigned int i = 0; i < spacedim; ++i)
851 for (
unsigned int j = 0; j < spacedim; ++j)
853 fe_data.transformed_shape_hessians[k][
d][i][j] -=
854 (output_data.shape_values(first + n, k) *
856 .jacobian_pushed_forward_2nd_derivatives
858 (output_data.shape_gradients[first + d][k][n] *
860 .jacobian_pushed_forward_grads[k][n][i][j]) +
861 (output_data.shape_gradients[first + n][k][i] *
863 .jacobian_pushed_forward_grads[k][n][
d][j]) +
864 (output_data.shape_gradients[first + n][k][j] *
866 .jacobian_pushed_forward_grads[k][n][i][d]);
869 for (
unsigned int k = 0; k < n_q_points; ++k)
870 for (
unsigned int d = 0;
d < dim; ++
d)
871 output_data.shape_hessians[first + d][k] =
872 fe_data.sign_change[i] *
873 fe_data.transformed_shape_hessians[k][d];
897 template <
class PolynomialType,
int dim,
int spacedim>
901 const unsigned int face_no,
905 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
917 Assert(dynamic_cast<const InternalData *>(&fe_internal) !=
nullptr,
919 const InternalData &fe_data =
static_cast<const InternalData &
>(fe_internal);
921 const unsigned int n_q_points = quadrature.
size();
928 cell->face_orientation(face_no),
929 cell->face_flip(face_no),
930 cell->face_rotation(face_no),
941 std::fill(fe_data.sign_change.begin(), fe_data.sign_change.end(), 1.0);
944 internal::FE_PolyTensor::get_face_sign_change_rt(cell,
946 fe_data.sign_change);
949 internal::FE_PolyTensor::get_face_sign_change_nedelec(cell,
951 fe_data.sign_change);
953 for (
unsigned int i = 0; i < this->dofs_per_cell; ++i)
955 const unsigned int first =
956 output_data.shape_function_to_row_table[i * this->
n_components() +
957 this->get_nonzero_components(i)
958 .first_selected_component()];
962 switch (mapping_type)
966 for (
unsigned int k = 0; k < n_q_points; ++k)
967 for (
unsigned int d = 0;
d < dim; ++
d)
968 output_data.shape_values(first + d, k) =
969 fe_data.shape_values[i][k + offset][
d];
977 transformed_shape_values =
987 transformed_shape_values);
989 for (
unsigned int k = 0; k < n_q_points; ++k)
990 for (
unsigned int d = 0;
d < dim; ++
d)
991 output_data.shape_values(first + d, k) =
992 transformed_shape_values[k][
d];
1000 transformed_shape_values =
1010 transformed_shape_values);
1011 for (
unsigned int k = 0; k < n_q_points; ++k)
1012 for (
unsigned int d = 0;
d < dim; ++
d)
1013 output_data.shape_values(first + d, k) =
1014 fe_data.sign_change[i] * transformed_shape_values[k][
d];
1021 transformed_shape_values =
1031 transformed_shape_values);
1033 for (
unsigned int k = 0; k < n_q_points; ++k)
1034 for (
unsigned int d = 0;
d < dim; ++
d)
1035 output_data.shape_values(first + d, k) =
1036 fe_data.sign_change[i] * transformed_shape_values[k][
d];
1048 switch (mapping_type)
1060 transformed_shape_grads);
1061 for (
unsigned int k = 0; k < n_q_points; ++k)
1062 for (
unsigned int d = 0;
d < dim; ++
d)
1063 output_data.shape_gradients[first + d][k] =
1064 transformed_shape_grads[k][d];
1078 transformed_shape_grads);
1080 for (
unsigned int k = 0; k < n_q_points; ++k)
1081 for (
unsigned int d = 0;
d < spacedim; ++
d)
1082 for (
unsigned int n = 0; n < spacedim; ++n)
1083 transformed_shape_grads[k][d] -=
1084 output_data.shape_values(first + n, k) *
1085 mapping_data.jacobian_pushed_forward_grads[k][n][
d];
1087 for (
unsigned int k = 0; k < n_q_points; ++k)
1088 for (
unsigned int d = 0;
d < dim; ++
d)
1089 output_data.shape_gradients[first + d][k] =
1090 transformed_shape_grads[k][d];
1100 for (
unsigned int k = 0; k < n_q_points; ++k)
1101 fe_data.untransformed_shape_grads[k + offset] =
1102 fe_data.shape_grads[i][k + offset];
1109 transformed_shape_grads);
1111 for (
unsigned int k = 0; k < n_q_points; ++k)
1112 for (
unsigned int d = 0;
d < spacedim; ++
d)
1113 for (
unsigned int n = 0; n < spacedim; ++n)
1114 transformed_shape_grads[k][d] +=
1115 output_data.shape_values(first + n, k) *
1116 mapping_data.jacobian_pushed_forward_grads[k][
d][n];
1118 for (
unsigned int k = 0; k < n_q_points; ++k)
1119 for (
unsigned int d = 0;
d < dim; ++
d)
1120 output_data.shape_gradients[first + d][k] =
1121 transformed_shape_grads[k][d];
1133 for (
unsigned int k = 0; k < n_q_points; ++k)
1134 fe_data.untransformed_shape_grads[k + offset] =
1135 fe_data.shape_grads[i][k + offset];
1142 transformed_shape_grads);
1144 for (
unsigned int k = 0; k < n_q_points; ++k)
1145 for (
unsigned int d = 0;
d < spacedim; ++
d)
1146 for (
unsigned int n = 0; n < spacedim; ++n)
1147 transformed_shape_grads[k][d] +=
1148 (output_data.shape_values(first + n, k) *
1150 .jacobian_pushed_forward_grads[k][
d][n]) -
1151 (output_data.shape_values(first + d, k) *
1152 mapping_data.jacobian_pushed_forward_grads[k][n][n]);
1154 for (
unsigned int k = 0; k < n_q_points; ++k)
1155 for (
unsigned int d = 0;
d < dim; ++
d)
1156 output_data.shape_gradients[first + d][k] =
1157 fe_data.sign_change[i] * transformed_shape_grads[k][d];
1174 for (
unsigned int k = 0; k < n_q_points; ++k)
1175 fe_data.untransformed_shape_grads[k + offset] =
1176 fe_data.shape_grads[i][k + offset];
1188 transformed_shape_grads);
1190 for (
unsigned int k = 0; k < n_q_points; ++k)
1191 for (
unsigned int d = 0;
d < spacedim; ++
d)
1192 for (
unsigned int n = 0; n < spacedim; ++n)
1193 transformed_shape_grads[k][d] -=
1194 output_data.shape_values(first + n, k) *
1195 mapping_data.jacobian_pushed_forward_grads[k][n][
d];
1197 for (
unsigned int k = 0; k < n_q_points; ++k)
1198 for (
unsigned int d = 0;
d < dim; ++
d)
1199 output_data.shape_gradients[first + d][k] =
1200 fe_data.sign_change[i] * transformed_shape_grads[k][d];
1212 switch (mapping_type)
1217 transformed_shape_hessians =
1227 transformed_shape_hessians);
1229 for (
unsigned int k = 0; k < n_q_points; ++k)
1230 for (
unsigned int d = 0;
d < spacedim; ++
d)
1231 for (
unsigned int n = 0; n < spacedim; ++n)
1232 transformed_shape_hessians[k][d] -=
1233 output_data.shape_gradients[first + d][k][n] *
1234 mapping_data.jacobian_pushed_forward_grads[k][n];
1236 for (
unsigned int k = 0; k < n_q_points; ++k)
1237 for (
unsigned int d = 0;
d < dim; ++
d)
1238 output_data.shape_hessians[first + d][k] =
1239 transformed_shape_hessians[k][d];
1245 for (
unsigned int k = 0; k < n_q_points; ++k)
1246 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1247 fe_data.shape_grad_grads[i][k + offset];
1250 transformed_shape_hessians =
1260 transformed_shape_hessians);
1262 for (
unsigned int k = 0; k < n_q_points; ++k)
1263 for (
unsigned int d = 0;
d < spacedim; ++
d)
1264 for (
unsigned int n = 0; n < spacedim; ++n)
1265 for (
unsigned int i = 0; i < spacedim; ++i)
1266 for (
unsigned int j = 0; j < spacedim; ++j)
1268 transformed_shape_hessians[k][
d][i][j] -=
1269 (output_data.shape_values(first + n, k) *
1271 .jacobian_pushed_forward_2nd_derivatives
1273 (output_data.shape_gradients[first + d][k][n] *
1275 .jacobian_pushed_forward_grads[k][n][i][j]) +
1276 (output_data.shape_gradients[first + n][k][i] *
1278 .jacobian_pushed_forward_grads[k][n][
d][j]) +
1279 (output_data.shape_gradients[first + n][k][j] *
1281 .jacobian_pushed_forward_grads[k][n][i][d]);
1284 for (
unsigned int k = 0; k < n_q_points; ++k)
1285 for (
unsigned int d = 0;
d < dim; ++
d)
1286 output_data.shape_hessians[first + d][k] =
1287 transformed_shape_hessians[k][d];
1294 for (
unsigned int k = 0; k < n_q_points; ++k)
1295 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1296 fe_data.shape_grad_grads[i][k + offset];
1299 transformed_shape_hessians =
1309 transformed_shape_hessians);
1311 for (
unsigned int k = 0; k < n_q_points; ++k)
1312 for (
unsigned int d = 0;
d < spacedim; ++
d)
1313 for (
unsigned int n = 0; n < spacedim; ++n)
1314 for (
unsigned int i = 0; i < spacedim; ++i)
1315 for (
unsigned int j = 0; j < spacedim; ++j)
1317 transformed_shape_hessians[k][
d][i][j] +=
1318 (output_data.shape_values(first + n, k) *
1320 .jacobian_pushed_forward_2nd_derivatives
1322 (output_data.shape_gradients[first + n][k][i] *
1324 .jacobian_pushed_forward_grads[k][d][n][j]) +
1325 (output_data.shape_gradients[first + n][k][j] *
1327 .jacobian_pushed_forward_grads[k][
d][i][n]) -
1328 (output_data.shape_gradients[first + d][k][n] *
1330 .jacobian_pushed_forward_grads[k][n][i][j]);
1331 for (
unsigned int m = 0; m < spacedim; ++m)
1332 transformed_shape_hessians[k][d][i][j] -=
1334 .jacobian_pushed_forward_grads[k][d][i]
1337 .jacobian_pushed_forward_grads[k][m][n]
1339 output_data.shape_values(first + n, k)) +
1341 .jacobian_pushed_forward_grads[k][d][m]
1344 .jacobian_pushed_forward_grads[k][m][i]
1346 output_data.shape_values(first + n, k));
1349 for (
unsigned int k = 0; k < n_q_points; ++k)
1350 for (
unsigned int d = 0;
d < dim; ++
d)
1351 output_data.shape_hessians[first + d][k] =
1352 transformed_shape_hessians[k][d];
1360 for (
unsigned int k = 0; k < n_q_points; ++k)
1361 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1362 fe_data.shape_grad_grads[i][k + offset];
1365 transformed_shape_hessians =
1375 transformed_shape_hessians);
1377 for (
unsigned int k = 0; k < n_q_points; ++k)
1378 for (
unsigned int d = 0;
d < spacedim; ++
d)
1379 for (
unsigned int n = 0; n < spacedim; ++n)
1380 for (
unsigned int i = 0; i < spacedim; ++i)
1381 for (
unsigned int j = 0; j < spacedim; ++j)
1383 transformed_shape_hessians[k][
d][i][j] +=
1384 (output_data.shape_values(first + n, k) *
1386 .jacobian_pushed_forward_2nd_derivatives
1388 (output_data.shape_gradients[first + n][k][i] *
1390 .jacobian_pushed_forward_grads[k][d][n][j]) +
1391 (output_data.shape_gradients[first + n][k][j] *
1393 .jacobian_pushed_forward_grads[k][
d][i][n]) -
1394 (output_data.shape_gradients[first + d][k][n] *
1396 .jacobian_pushed_forward_grads[k][n][i][j]);
1398 transformed_shape_hessians[k][
d][i][j] -=
1399 (output_data.shape_values(first + d, k) *
1401 .jacobian_pushed_forward_2nd_derivatives
1403 (output_data.shape_gradients[first + d][k][i] *
1405 .jacobian_pushed_forward_grads[k][n][n][j]) +
1406 (output_data.shape_gradients[first +
d][k][j] *
1408 .jacobian_pushed_forward_grads[k][n][n][i]);
1410 for (
unsigned int m = 0; m < spacedim; ++m)
1412 transformed_shape_hessians[k][
d][i][j] -=
1414 .jacobian_pushed_forward_grads[k][
d][i]
1417 .jacobian_pushed_forward_grads[k][m][n]
1419 output_data.shape_values(first + n, k)) +
1421 .jacobian_pushed_forward_grads[k][d][m]
1424 .jacobian_pushed_forward_grads[k][m][i]
1426 output_data.shape_values(first + n, k));
1428 transformed_shape_hessians[k][
d][i][j] +=
1430 .jacobian_pushed_forward_grads[k][n][i]
1433 .jacobian_pushed_forward_grads[k][m][n]
1435 output_data.shape_values(first + d, k)) +
1437 .jacobian_pushed_forward_grads[k][n][m]
1440 .jacobian_pushed_forward_grads[k][m][i]
1442 output_data.shape_values(first + d, k));
1446 for (
unsigned int k = 0; k < n_q_points; ++k)
1447 for (
unsigned int d = 0;
d < dim; ++
d)
1448 output_data.shape_hessians[first + d][k] =
1449 fe_data.sign_change[i] *
1450 transformed_shape_hessians[k][d];
1457 for (
unsigned int k = 0; k < n_q_points; ++k)
1458 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1459 fe_data.shape_grad_grads[i][k + offset];
1462 transformed_shape_hessians =
1472 transformed_shape_hessians);
1474 for (
unsigned int k = 0; k < n_q_points; ++k)
1475 for (
unsigned int d = 0;
d < spacedim; ++
d)
1476 for (
unsigned int n = 0; n < spacedim; ++n)
1477 for (
unsigned int i = 0; i < spacedim; ++i)
1478 for (
unsigned int j = 0; j < spacedim; ++j)
1480 transformed_shape_hessians[k][
d][i][j] -=
1481 (output_data.shape_values(first + n, k) *
1483 .jacobian_pushed_forward_2nd_derivatives
1485 (output_data.shape_gradients[first + d][k][n] *
1487 .jacobian_pushed_forward_grads[k][n][i][j]) +
1488 (output_data.shape_gradients[first + n][k][i] *
1490 .jacobian_pushed_forward_grads[k][n][
d][j]) +
1491 (output_data.shape_gradients[first + n][k][j] *
1493 .jacobian_pushed_forward_grads[k][n][i][d]);
1496 for (
unsigned int k = 0; k < n_q_points; ++k)
1497 for (
unsigned int d = 0;
d < dim; ++
d)
1498 output_data.shape_hessians[first + d][k] =
1499 fe_data.sign_change[i] *
1500 transformed_shape_hessians[k][d];
1520 template <
class PolynomialType,
int dim,
int spacedim>
1524 const unsigned int face_no,
1525 const unsigned int sub_no,
1529 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1541 Assert(dynamic_cast<const InternalData *>(&fe_internal) !=
nullptr,
1543 const InternalData &fe_data =
static_cast<const InternalData &
>(fe_internal);
1545 const unsigned int n_q_points = quadrature.
size();
1553 cell->face_orientation(face_no),
1554 cell->face_flip(face_no),
1555 cell->face_rotation(face_no),
1557 cell->subface_case(face_no));
1569 std::fill(fe_data.sign_change.begin(), fe_data.sign_change.end(), 1.0);
1572 internal::FE_PolyTensor::get_face_sign_change_rt(cell,
1573 this->dofs_per_face,
1574 fe_data.sign_change);
1577 internal::FE_PolyTensor::get_face_sign_change_nedelec(cell,
1578 this->dofs_per_face,
1579 fe_data.sign_change);
1581 for (
unsigned int i = 0; i < this->dofs_per_cell; ++i)
1583 const unsigned int first =
1584 output_data.shape_function_to_row_table[i * this->
n_components() +
1585 this->get_nonzero_components(i)
1586 .first_selected_component()];
1590 switch (mapping_type)
1594 for (
unsigned int k = 0; k < n_q_points; ++k)
1595 for (
unsigned int d = 0;
d < dim; ++
d)
1596 output_data.shape_values(first + d, k) =
1597 fe_data.shape_values[i][k + offset][
d];
1605 transformed_shape_values =
1615 transformed_shape_values);
1617 for (
unsigned int k = 0; k < n_q_points; ++k)
1618 for (
unsigned int d = 0;
d < dim; ++
d)
1619 output_data.shape_values(first + d, k) =
1620 transformed_shape_values[k][
d];
1629 transformed_shape_values =
1640 transformed_shape_values);
1641 for (
unsigned int k = 0; k < n_q_points; ++k)
1642 for (
unsigned int d = 0;
d < dim; ++
d)
1643 output_data.shape_values(first + d, k) =
1644 fe_data.sign_change[i] * transformed_shape_values[k][
d];
1651 transformed_shape_values =
1662 transformed_shape_values);
1664 for (
unsigned int k = 0; k < n_q_points; ++k)
1665 for (
unsigned int d = 0;
d < dim; ++
d)
1666 output_data.shape_values(first + d, k) =
1667 fe_data.sign_change[i] * transformed_shape_values[k][
d];
1683 switch (mapping_type)
1691 transformed_shape_grads);
1692 for (
unsigned int k = 0; k < n_q_points; ++k)
1693 for (
unsigned int d = 0;
d < dim; ++
d)
1694 output_data.shape_gradients[first + d][k] =
1695 transformed_shape_grads[k][d];
1705 transformed_shape_grads);
1707 for (
unsigned int k = 0; k < n_q_points; ++k)
1708 for (
unsigned int d = 0;
d < spacedim; ++
d)
1709 for (
unsigned int n = 0; n < spacedim; ++n)
1710 transformed_shape_grads[k][d] -=
1711 output_data.shape_values(first + n, k) *
1712 mapping_data.jacobian_pushed_forward_grads[k][n][
d];
1714 for (
unsigned int k = 0; k < n_q_points; ++k)
1715 for (
unsigned int d = 0;
d < dim; ++
d)
1716 output_data.shape_gradients[first + d][k] =
1717 transformed_shape_grads[k][d];
1724 for (
unsigned int k = 0; k < n_q_points; ++k)
1725 fe_data.untransformed_shape_grads[k + offset] =
1726 fe_data.shape_grads[i][k + offset];
1734 transformed_shape_grads);
1736 for (
unsigned int k = 0; k < n_q_points; ++k)
1737 for (
unsigned int d = 0;
d < spacedim; ++
d)
1738 for (
unsigned int n = 0; n < spacedim; ++n)
1739 transformed_shape_grads[k][d] +=
1740 output_data.shape_values(first + n, k) *
1741 mapping_data.jacobian_pushed_forward_grads[k][
d][n];
1743 for (
unsigned int k = 0; k < n_q_points; ++k)
1744 for (
unsigned int d = 0;
d < dim; ++
d)
1745 output_data.shape_gradients[first + d][k] =
1746 transformed_shape_grads[k][d];
1754 for (
unsigned int k = 0; k < n_q_points; ++k)
1755 fe_data.untransformed_shape_grads[k + offset] =
1756 fe_data.shape_grads[i][k + offset];
1764 transformed_shape_grads);
1766 for (
unsigned int k = 0; k < n_q_points; ++k)
1767 for (
unsigned int d = 0;
d < spacedim; ++
d)
1768 for (
unsigned int n = 0; n < spacedim; ++n)
1769 transformed_shape_grads[k][d] +=
1770 (output_data.shape_values(first + n, k) *
1772 .jacobian_pushed_forward_grads[k][
d][n]) -
1773 (output_data.shape_values(first + d, k) *
1774 mapping_data.jacobian_pushed_forward_grads[k][n][n]);
1776 for (
unsigned int k = 0; k < n_q_points; ++k)
1777 for (
unsigned int d = 0;
d < dim; ++
d)
1778 output_data.shape_gradients[first + d][k] =
1779 fe_data.sign_change[i] * transformed_shape_grads[k][d];
1795 for (
unsigned int k = 0; k < n_q_points; ++k)
1796 fe_data.untransformed_shape_grads[k + offset] =
1797 fe_data.shape_grads[i][k + offset];
1805 transformed_shape_grads);
1807 for (
unsigned int k = 0; k < n_q_points; ++k)
1808 for (
unsigned int d = 0;
d < spacedim; ++
d)
1809 for (
unsigned int n = 0; n < spacedim; ++n)
1810 transformed_shape_grads[k][d] -=
1811 output_data.shape_values(first + n, k) *
1812 mapping_data.jacobian_pushed_forward_grads[k][n][
d];
1814 for (
unsigned int k = 0; k < n_q_points; ++k)
1815 for (
unsigned int d = 0;
d < dim; ++
d)
1816 output_data.shape_gradients[first + d][k] =
1817 fe_data.sign_change[i] * transformed_shape_grads[k][d];
1829 switch (mapping_type)
1834 transformed_shape_hessians =
1844 transformed_shape_hessians);
1846 for (
unsigned int k = 0; k < n_q_points; ++k)
1847 for (
unsigned int d = 0;
d < spacedim; ++
d)
1848 for (
unsigned int n = 0; n < spacedim; ++n)
1849 transformed_shape_hessians[k][d] -=
1850 output_data.shape_gradients[first + d][k][n] *
1851 mapping_data.jacobian_pushed_forward_grads[k][n];
1853 for (
unsigned int k = 0; k < n_q_points; ++k)
1854 for (
unsigned int d = 0;
d < dim; ++
d)
1855 output_data.shape_hessians[first + d][k] =
1856 transformed_shape_hessians[k][d];
1862 for (
unsigned int k = 0; k < n_q_points; ++k)
1863 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1864 fe_data.shape_grad_grads[i][k + offset];
1867 transformed_shape_hessians =
1877 transformed_shape_hessians);
1879 for (
unsigned int k = 0; k < n_q_points; ++k)
1880 for (
unsigned int d = 0;
d < spacedim; ++
d)
1881 for (
unsigned int n = 0; n < spacedim; ++n)
1882 for (
unsigned int i = 0; i < spacedim; ++i)
1883 for (
unsigned int j = 0; j < spacedim; ++j)
1885 transformed_shape_hessians[k][
d][i][j] -=
1886 (output_data.shape_values(first + n, k) *
1888 .jacobian_pushed_forward_2nd_derivatives
1890 (output_data.shape_gradients[first + d][k][n] *
1892 .jacobian_pushed_forward_grads[k][n][i][j]) +
1893 (output_data.shape_gradients[first + n][k][i] *
1895 .jacobian_pushed_forward_grads[k][n][
d][j]) +
1896 (output_data.shape_gradients[first + n][k][j] *
1898 .jacobian_pushed_forward_grads[k][n][i][d]);
1901 for (
unsigned int k = 0; k < n_q_points; ++k)
1902 for (
unsigned int d = 0;
d < dim; ++
d)
1903 output_data.shape_hessians[first + d][k] =
1904 transformed_shape_hessians[k][d];
1911 for (
unsigned int k = 0; k < n_q_points; ++k)
1912 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1913 fe_data.shape_grad_grads[i][k + offset];
1916 transformed_shape_hessians =
1926 transformed_shape_hessians);
1928 for (
unsigned int k = 0; k < n_q_points; ++k)
1929 for (
unsigned int d = 0;
d < spacedim; ++
d)
1930 for (
unsigned int n = 0; n < spacedim; ++n)
1931 for (
unsigned int i = 0; i < spacedim; ++i)
1932 for (
unsigned int j = 0; j < spacedim; ++j)
1934 transformed_shape_hessians[k][
d][i][j] +=
1935 (output_data.shape_values(first + n, k) *
1937 .jacobian_pushed_forward_2nd_derivatives
1939 (output_data.shape_gradients[first + n][k][i] *
1941 .jacobian_pushed_forward_grads[k][d][n][j]) +
1942 (output_data.shape_gradients[first + n][k][j] *
1944 .jacobian_pushed_forward_grads[k][
d][i][n]) -
1945 (output_data.shape_gradients[first + d][k][n] *
1947 .jacobian_pushed_forward_grads[k][n][i][j]);
1948 for (
unsigned int m = 0; m < spacedim; ++m)
1949 transformed_shape_hessians[k][d][i][j] -=
1951 .jacobian_pushed_forward_grads[k][d][i]
1954 .jacobian_pushed_forward_grads[k][m][n]
1956 output_data.shape_values(first + n, k)) +
1958 .jacobian_pushed_forward_grads[k][d][m]
1961 .jacobian_pushed_forward_grads[k][m][i]
1963 output_data.shape_values(first + n, k));
1966 for (
unsigned int k = 0; k < n_q_points; ++k)
1967 for (
unsigned int d = 0;
d < dim; ++
d)
1968 output_data.shape_hessians[first + d][k] =
1969 transformed_shape_hessians[k][d];
1977 for (
unsigned int k = 0; k < n_q_points; ++k)
1978 fe_data.untransformed_shape_hessian_tensors[k + offset] =
1979 fe_data.shape_grad_grads[i][k + offset];
1982 transformed_shape_hessians =
1992 transformed_shape_hessians);
1994 for (
unsigned int k = 0; k < n_q_points; ++k)
1995 for (
unsigned int d = 0;
d < spacedim; ++
d)
1996 for (
unsigned int n = 0; n < spacedim; ++n)
1997 for (
unsigned int i = 0; i < spacedim; ++i)
1998 for (
unsigned int j = 0; j < spacedim; ++j)
2000 transformed_shape_hessians[k][
d][i][j] +=
2001 (output_data.shape_values(first + n, k) *
2003 .jacobian_pushed_forward_2nd_derivatives
2005 (output_data.shape_gradients[first + n][k][i] *
2007 .jacobian_pushed_forward_grads[k][d][n][j]) +
2008 (output_data.shape_gradients[first + n][k][j] *
2010 .jacobian_pushed_forward_grads[k][
d][i][n]) -
2011 (output_data.shape_gradients[first + d][k][n] *
2013 .jacobian_pushed_forward_grads[k][n][i][j]);
2015 transformed_shape_hessians[k][
d][i][j] -=
2016 (output_data.shape_values(first + d, k) *
2018 .jacobian_pushed_forward_2nd_derivatives
2020 (output_data.shape_gradients[first + d][k][i] *
2022 .jacobian_pushed_forward_grads[k][n][n][j]) +
2023 (output_data.shape_gradients[first +
d][k][j] *
2025 .jacobian_pushed_forward_grads[k][n][n][i]);
2026 for (
unsigned int m = 0; m < spacedim; ++m)
2028 transformed_shape_hessians[k][
d][i][j] -=
2030 .jacobian_pushed_forward_grads[k][
d][i]
2033 .jacobian_pushed_forward_grads[k][m][n]
2035 output_data.shape_values(first + n, k)) +
2037 .jacobian_pushed_forward_grads[k][d][m]
2040 .jacobian_pushed_forward_grads[k][m][i]
2042 output_data.shape_values(first + n, k));
2044 transformed_shape_hessians[k][
d][i][j] +=
2046 .jacobian_pushed_forward_grads[k][n][i]
2049 .jacobian_pushed_forward_grads[k][m][n]
2051 output_data.shape_values(first + d, k)) +
2053 .jacobian_pushed_forward_grads[k][n][m]
2056 .jacobian_pushed_forward_grads[k][m][i]
2058 output_data.shape_values(first + d, k));
2062 for (
unsigned int k = 0; k < n_q_points; ++k)
2063 for (
unsigned int d = 0;
d < dim; ++
d)
2064 output_data.shape_hessians[first + d][k] =
2065 fe_data.sign_change[i] *
2066 transformed_shape_hessians[k][d];
2073 for (
unsigned int k = 0; k < n_q_points; ++k)
2074 fe_data.untransformed_shape_hessian_tensors[k + offset] =
2075 fe_data.shape_grad_grads[i][k + offset];
2078 transformed_shape_hessians =
2088 transformed_shape_hessians);
2090 for (
unsigned int k = 0; k < n_q_points; ++k)
2091 for (
unsigned int d = 0;
d < spacedim; ++
d)
2092 for (
unsigned int n = 0; n < spacedim; ++n)
2093 for (
unsigned int i = 0; i < spacedim; ++i)
2094 for (
unsigned int j = 0; j < spacedim; ++j)
2096 transformed_shape_hessians[k][
d][i][j] -=
2097 (output_data.shape_values(first + n, k) *
2099 .jacobian_pushed_forward_2nd_derivatives
2101 (output_data.shape_gradients[first + d][k][n] *
2103 .jacobian_pushed_forward_grads[k][n][i][j]) +
2104 (output_data.shape_gradients[first + n][k][i] *
2106 .jacobian_pushed_forward_grads[k][n][
d][j]) +
2107 (output_data.shape_gradients[first + n][k][j] *
2109 .jacobian_pushed_forward_grads[k][n][i][d]);
2112 for (
unsigned int k = 0; k < n_q_points; ++k)
2113 for (
unsigned int d = 0;
d < dim; ++
d)
2114 output_data.shape_hessians[first + d][k] =
2115 fe_data.sign_change[i] *
2116 transformed_shape_hessians[k][d];
2136 template <
class PolynomialType,
int dim,
int spacedim>
2143 switch (mapping_type)
2233 #include "fe_poly_tensor.inst" 2236 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
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.
#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
Second derivatives of shape functions.
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
unsigned int size() const
unsigned int n_components() const
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()
ArrayView< typename std::remove_reference< typename std::iterator_traits< Iterator >::reference >::type, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
unsigned int n_components(const DoFHandler< dim, spacedim > &dh)
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()
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)