36#include <boost/container/small_vector.hpp>
48template <
int dim,
int spacedim>
58template <
int dim,
int spacedim>
77template <
int dim,
int spacedim>
133template <
int dim,
int spacedim>
136 const UpdateFlags update_flags,
138 const unsigned int n_original_q_points)
150 const auto reference_cell = this->
fe.reference_cell();
151 const auto n_faces = reference_cell.n_faces();
153 for (
unsigned int i = 0; i < n_faces; ++i)
158 reference_cell.face_tangent_vector(i, 0));
164 reference_cell.face_tangent_vector(i, 1));
172template <
int dim,
int spacedim>
181 const auto &tensor_pols = fe_poly->get_poly_space();
184 const unsigned int n_points = unit_points.size();
186 std::vector<double> values;
187 std::vector<Tensor<1, dim>> grads;
201 std::vector<Tensor<2, dim>> grad2;
209 std::vector<Tensor<3, dim>> grad3;
217 std::vector<Tensor<4, dim>> grad4;
230 for (
unsigned int point = 0; point < n_points; ++point)
232 tensor_pols.evaluate(
233 unit_points[point], values, grads, grad2, grad3, grad4);
237 shape(point, i) = values[i];
270 template <
int dim,
int spacedim>
272 maybe_compute_q_points(
274 const typename ::MappingFE<dim, spacedim>::InternalData &data,
278 const UpdateFlags update_flags = data.update_each;
281 for (
unsigned int point = 0; point <
n_q_points; ++point)
283 const double *shape = &data.shape(point + data_set, 0);
285 (shape[0] * data.mapping_support_points[0]);
286 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
287 for (
unsigned int i = 0; i < spacedim; ++i)
288 result[i] += shape[k] * data.mapping_support_points[k][i];
289 quadrature_points[point] = result;
303 template <
int dim,
int spacedim>
305 maybe_update_Jacobians(
307 const typename ::QProjector<dim>::DataSetDescriptor data_set,
308 const typename ::MappingFE<dim, spacedim>::InternalData &data,
311 const UpdateFlags update_flags = data.update_each;
319 std::fill(data.contravariant.begin(),
320 data.contravariant.end(),
325 for (
unsigned int point = 0; point <
n_q_points; ++point)
327 double result[spacedim][dim];
331 for (
unsigned int i = 0; i < spacedim; ++i)
332 for (
unsigned int j = 0; j < dim; ++j)
333 result[i][j] = data.derivative(point + data_set, 0)[j] *
334 data.mapping_support_points[0][i];
335 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
336 for (
unsigned int i = 0; i < spacedim; ++i)
337 for (
unsigned int j = 0; j < dim; ++j)
339 data.derivative(point + data_set, k)[j] *
340 data.mapping_support_points[k][i];
347 for (
unsigned int i = 0; i < spacedim; ++i)
348 for (
unsigned int j = 0; j < dim; ++j)
349 data.contravariant[point][i][j] = result[i][j];
356 for (
unsigned int point = 0; point <
n_q_points; ++point)
358 data.covariant[point] =
359 (data.contravariant[point]).covariant_form();
366 for (
unsigned int point = 0; point <
n_q_points; ++point)
367 data.volume_elements[point] =
368 data.contravariant[point].determinant();
378 template <
int dim,
int spacedim>
380 maybe_update_jacobian_grads(
383 const typename ::MappingFE<dim, spacedim>::InternalData &data,
387 const UpdateFlags update_flags = data.update_each;
393 for (
unsigned int point = 0; point <
n_q_points; ++point)
396 &data.second_derivative(point + data_set, 0);
397 double result[spacedim][dim][dim];
398 for (
unsigned int i = 0; i < spacedim; ++i)
399 for (
unsigned int j = 0; j < dim; ++j)
400 for (
unsigned int l = 0; l < dim; ++l)
402 (second[0][j][l] * data.mapping_support_points[0][i]);
403 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
404 for (
unsigned int i = 0; i < spacedim; ++i)
405 for (
unsigned int j = 0; j < dim; ++j)
406 for (
unsigned int l = 0; l < dim; ++l)
409 data.mapping_support_points[k][i]);
411 for (
unsigned int i = 0; i < spacedim; ++i)
412 for (
unsigned int j = 0; j < dim; ++j)
413 for (
unsigned int l = 0; l < dim; ++l)
414 jacobian_grads[point][i][j][l] = result[i][j][l];
425 template <
int dim,
int spacedim>
427 maybe_update_jacobian_pushed_forward_grads(
430 const typename ::MappingFE<dim, spacedim>::InternalData &data,
434 const UpdateFlags update_flags = data.update_each;
438 jacobian_pushed_forward_grads.size() + 1);
442 double tmp[spacedim][spacedim][spacedim];
443 for (
unsigned int point = 0; point <
n_q_points; ++point)
446 &data.second_derivative(point + data_set, 0);
447 double result[spacedim][dim][dim];
448 for (
unsigned int i = 0; i < spacedim; ++i)
449 for (
unsigned int j = 0; j < dim; ++j)
450 for (
unsigned int l = 0; l < dim; ++l)
451 result[i][j][l] = (second[0][j][l] *
452 data.mapping_support_points[0][i]);
453 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
454 for (
unsigned int i = 0; i < spacedim; ++i)
455 for (
unsigned int j = 0; j < dim; ++j)
456 for (
unsigned int l = 0; l < dim; ++l)
459 data.mapping_support_points[k][i]);
462 for (
unsigned int i = 0; i < spacedim; ++i)
463 for (
unsigned int j = 0; j < spacedim; ++j)
464 for (
unsigned int l = 0; l < dim; ++l)
467 result[i][0][l] * data.covariant[point][j][0];
468 for (
unsigned int jr = 1; jr < dim; ++jr)
470 tmp[i][j][l] += result[i][jr][l] *
471 data.covariant[point][j][jr];
476 for (
unsigned int i = 0; i < spacedim; ++i)
477 for (
unsigned int j = 0; j < spacedim; ++j)
478 for (
unsigned int l = 0; l < spacedim; ++l)
480 jacobian_pushed_forward_grads[point][i][j][l] =
481 tmp[i][j][0] * data.covariant[point][l][0];
482 for (
unsigned int lr = 1; lr < dim; ++lr)
484 jacobian_pushed_forward_grads[point][i][j][l] +=
485 tmp[i][j][lr] * data.covariant[point][l][lr];
499 template <
int dim,
int spacedim>
501 maybe_update_jacobian_2nd_derivatives(
504 const typename ::MappingFE<dim, spacedim>::InternalData &data,
508 const UpdateFlags update_flags = data.update_each;
515 for (
unsigned int point = 0; point <
n_q_points; ++point)
518 &data.third_derivative(point + data_set, 0);
519 double result[spacedim][dim][dim][dim];
520 for (
unsigned int i = 0; i < spacedim; ++i)
521 for (
unsigned int j = 0; j < dim; ++j)
522 for (
unsigned int l = 0; l < dim; ++l)
523 for (
unsigned int m = 0; m < dim; ++m)
526 data.mapping_support_points[0][i]);
527 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
528 for (
unsigned int i = 0; i < spacedim; ++i)
529 for (
unsigned int j = 0; j < dim; ++j)
530 for (
unsigned int l = 0; l < dim; ++l)
531 for (
unsigned int m = 0; m < dim; ++m)
532 result[i][j][l][m] +=
534 data.mapping_support_points[k][i]);
536 for (
unsigned int i = 0; i < spacedim; ++i)
537 for (
unsigned int j = 0; j < dim; ++j)
538 for (
unsigned int l = 0; l < dim; ++l)
539 for (
unsigned int m = 0; m < dim; ++m)
540 jacobian_2nd_derivatives[point][i][j][l][m] =
554 template <
int dim,
int spacedim>
556 maybe_update_jacobian_pushed_forward_2nd_derivatives(
559 const typename ::MappingFE<dim, spacedim>::InternalData &data,
561 &jacobian_pushed_forward_2nd_derivatives,
564 const UpdateFlags update_flags = data.update_each;
568 jacobian_pushed_forward_2nd_derivatives.size() +
573 double tmp[spacedim][spacedim][spacedim][spacedim];
574 for (
unsigned int point = 0; point <
n_q_points; ++point)
577 &data.third_derivative(point + data_set, 0);
578 double result[spacedim][dim][dim][dim];
579 for (
unsigned int i = 0; i < spacedim; ++i)
580 for (
unsigned int j = 0; j < dim; ++j)
581 for (
unsigned int l = 0; l < dim; ++l)
582 for (
unsigned int m = 0; m < dim; ++m)
585 data.mapping_support_points[0][i]);
586 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
587 for (
unsigned int i = 0; i < spacedim; ++i)
588 for (
unsigned int j = 0; j < dim; ++j)
589 for (
unsigned int l = 0; l < dim; ++l)
590 for (
unsigned int m = 0; m < dim; ++m)
591 result[i][j][l][m] +=
593 data.mapping_support_points[k][i]);
596 for (
unsigned int i = 0; i < spacedim; ++i)
597 for (
unsigned int j = 0; j < spacedim; ++j)
598 for (
unsigned int l = 0; l < dim; ++l)
599 for (
unsigned int m = 0; m < dim; ++m)
601 jacobian_pushed_forward_2nd_derivatives
602 [point][i][j][l][m] =
604 data.covariant[point][j][0];
605 for (
unsigned int jr = 1; jr < dim; ++jr)
606 jacobian_pushed_forward_2nd_derivatives[point]
609 result[i][jr][l][m] *
610 data.covariant[point][j][jr];
614 for (
unsigned int i = 0; i < spacedim; ++i)
615 for (
unsigned int j = 0; j < spacedim; ++j)
616 for (
unsigned int l = 0; l < spacedim; ++l)
617 for (
unsigned int m = 0; m < dim; ++m)
620 jacobian_pushed_forward_2nd_derivatives[point]
623 data.covariant[point][l][0];
624 for (
unsigned int lr = 1; lr < dim; ++lr)
626 jacobian_pushed_forward_2nd_derivatives
627 [point][i][j][lr][m] *
628 data.covariant[point][l][lr];
632 for (
unsigned int i = 0; i < spacedim; ++i)
633 for (
unsigned int j = 0; j < spacedim; ++j)
634 for (
unsigned int l = 0; l < spacedim; ++l)
635 for (
unsigned int m = 0; m < spacedim; ++m)
637 jacobian_pushed_forward_2nd_derivatives
638 [point][i][j][l][m] =
639 tmp[i][j][l][0] * data.covariant[point][m][0];
640 for (
unsigned int mr = 1; mr < dim; ++mr)
641 jacobian_pushed_forward_2nd_derivatives[point]
645 data.covariant[point][m][mr];
658 template <
int dim,
int spacedim>
660 maybe_update_jacobian_3rd_derivatives(
663 const typename ::MappingFE<dim, spacedim>::InternalData &data,
667 const UpdateFlags update_flags = data.update_each;
674 for (
unsigned int point = 0; point <
n_q_points; ++point)
677 &data.fourth_derivative(point + data_set, 0);
678 double result[spacedim][dim][dim][dim][dim];
679 for (
unsigned int i = 0; i < spacedim; ++i)
680 for (
unsigned int j = 0; j < dim; ++j)
681 for (
unsigned int l = 0; l < dim; ++l)
682 for (
unsigned int m = 0; m < dim; ++m)
683 for (
unsigned int n = 0; n < dim; ++n)
684 result[i][j][l][m][n] =
685 (fourth[0][j][l][m][n] *
686 data.mapping_support_points[0][i]);
687 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
688 for (
unsigned int i = 0; i < spacedim; ++i)
689 for (
unsigned int j = 0; j < dim; ++j)
690 for (
unsigned int l = 0; l < dim; ++l)
691 for (
unsigned int m = 0; m < dim; ++m)
692 for (
unsigned int n = 0; n < dim; ++n)
693 result[i][j][l][m][n] +=
694 (fourth[k][j][l][m][n] *
695 data.mapping_support_points[k][i]);
697 for (
unsigned int i = 0; i < spacedim; ++i)
698 for (
unsigned int j = 0; j < dim; ++j)
699 for (
unsigned int l = 0; l < dim; ++l)
700 for (
unsigned int m = 0; m < dim; ++m)
701 for (
unsigned int n = 0; n < dim; ++n)
702 jacobian_3rd_derivatives[point][i][j][l][m][n] =
703 result[i][j][l][m][n];
716 template <
int dim,
int spacedim>
718 maybe_update_jacobian_pushed_forward_3rd_derivatives(
721 const typename ::MappingFE<dim, spacedim>::InternalData &data,
723 &jacobian_pushed_forward_3rd_derivatives,
726 const UpdateFlags update_flags = data.update_each;
730 jacobian_pushed_forward_3rd_derivatives.size() +
735 double tmp[spacedim][spacedim][spacedim][spacedim][spacedim];
736 for (
unsigned int point = 0; point <
n_q_points; ++point)
739 &data.fourth_derivative(point + data_set, 0);
740 double result[spacedim][dim][dim][dim][dim];
741 for (
unsigned int i = 0; i < spacedim; ++i)
742 for (
unsigned int j = 0; j < dim; ++j)
743 for (
unsigned int l = 0; l < dim; ++l)
744 for (
unsigned int m = 0; m < dim; ++m)
745 for (
unsigned int n = 0; n < dim; ++n)
746 result[i][j][l][m][n] =
747 (fourth[0][j][l][m][n] *
748 data.mapping_support_points[0][i]);
749 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
750 for (
unsigned int i = 0; i < spacedim; ++i)
751 for (
unsigned int j = 0; j < dim; ++j)
752 for (
unsigned int l = 0; l < dim; ++l)
753 for (
unsigned int m = 0; m < dim; ++m)
754 for (
unsigned int n = 0; n < dim; ++n)
755 result[i][j][l][m][n] +=
756 (fourth[k][j][l][m][n] *
757 data.mapping_support_points[k][i]);
760 for (
unsigned int i = 0; i < spacedim; ++i)
761 for (
unsigned int j = 0; j < spacedim; ++j)
762 for (
unsigned int l = 0; l < dim; ++l)
763 for (
unsigned int m = 0; m < dim; ++m)
764 for (
unsigned int n = 0; n < dim; ++n)
767 result[i][0][l][m][n] *
768 data.covariant[point][j][0];
769 for (
unsigned int jr = 1; jr < dim; ++jr)
770 tmp[i][j][l][m][n] +=
771 result[i][jr][l][m][n] *
772 data.covariant[point][j][jr];
776 for (
unsigned int i = 0; i < spacedim; ++i)
777 for (
unsigned int j = 0; j < spacedim; ++j)
778 for (
unsigned int l = 0; l < spacedim; ++l)
779 for (
unsigned int m = 0; m < dim; ++m)
780 for (
unsigned int n = 0; n < dim; ++n)
782 jacobian_pushed_forward_3rd_derivatives
783 [point][i][j][l][m][n] =
785 data.covariant[point][l][0];
786 for (
unsigned int lr = 1; lr < dim; ++lr)
787 jacobian_pushed_forward_3rd_derivatives
788 [point][i][j][l][m][n] +=
789 tmp[i][j][lr][m][n] *
790 data.covariant[point][l][lr];
794 for (
unsigned int i = 0; i < spacedim; ++i)
795 for (
unsigned int j = 0; j < spacedim; ++j)
796 for (
unsigned int l = 0; l < spacedim; ++l)
797 for (
unsigned int m = 0; m < spacedim; ++m)
798 for (
unsigned int n = 0; n < dim; ++n)
801 jacobian_pushed_forward_3rd_derivatives
802 [point][i][j][l][0][n] *
803 data.covariant[point][m][0];
804 for (
unsigned int mr = 1; mr < dim; ++mr)
805 tmp[i][j][l][m][n] +=
806 jacobian_pushed_forward_3rd_derivatives
807 [point][i][j][l][mr][n] *
808 data.covariant[point][m][mr];
812 for (
unsigned int i = 0; i < spacedim; ++i)
813 for (
unsigned int j = 0; j < spacedim; ++j)
814 for (
unsigned int l = 0; l < spacedim; ++l)
815 for (
unsigned int m = 0; m < spacedim; ++m)
816 for (
unsigned int n = 0; n < spacedim; ++n)
818 jacobian_pushed_forward_3rd_derivatives
819 [point][i][j][l][m][n] =
821 data.covariant[point][n][0];
822 for (
unsigned int nr = 1; nr < dim; ++nr)
823 jacobian_pushed_forward_3rd_derivatives
824 [point][i][j][l][m][n] +=
825 tmp[i][j][l][m][nr] *
826 data.covariant[point][n][nr];
838template <
int dim,
int spacedim>
844 ExcMessage(
"It only makes sense to create polynomial mappings "
845 "with a polynomial degree greater or equal to one."));
850 const auto &mapping_support_points =
fe.get_unit_support_points();
852 const auto reference_cell =
fe.reference_cell();
854 const unsigned int n_points = mapping_support_points.size();
855 const unsigned int n_shape_functions = reference_cell.n_vertices();
860 for (
unsigned int point = 0; point < n_points; ++point)
861 for (
unsigned int i = 0; i < n_shape_functions; ++i)
863 reference_cell.d_linear_shape_function(mapping_support_points[point],
869template <
int dim,
int spacedim>
878template <
int dim,
int spacedim>
879std::unique_ptr<Mapping<dim, spacedim>>
882 return std::make_unique<MappingFE<dim, spacedim>>(*this);
887template <
int dim,
int spacedim>
896template <
int dim,
int spacedim>
906 for (
unsigned int i = 0; i < this->
fe->n_dofs_per_cell(); ++i)
907 mapped_point += support_points[i] * this->
fe->shape_value(i, p);
914template <
int dim,
int spacedim>
922 const double eps = 1.e-12 * cell->
diameter();
923 const unsigned int loop_limit = 10;
927 unsigned int loop = 0;
943 for (
unsigned int i = 0; i < this->
fe->n_dofs_per_cell(); ++i)
945 mapped_point += support_points[i] * this->
fe->shape_value(i, p_unit);
946 const auto grad_F_i = this->
fe->shape_grad(i, p_unit);
947 const auto hessian_F_i = this->
fe->shape_grad_grad(i, p_unit);
948 for (
unsigned int j = 0; j < dim; ++j)
950 grad_FT[j] += grad_F_i[j] * support_points[i];
951 for (
unsigned int l = 0; l < dim; ++l)
952 hess_FT[j][l] += hessian_F_i[j][l] * support_points[i];
957 const auto residual = p - mapped_point;
964 if (grad_FT_residual.norm() <= eps)
969 for (
unsigned int j = 0; j < dim; ++j)
970 for (
unsigned int l = 0; l < dim; ++l)
971 corrected_metric_tensor[j][l] =
972 -grad_FT[j] * grad_FT[l] + hess_FT[j][l] *
residual;
975 const auto g_inverse =
invert(corrected_metric_tensor);
976 p_unit -=
Point<dim>(g_inverse * grad_FT_residual);
980 while (loop < loop_limit);
994template <
int dim,
int spacedim>
1004 UpdateFlags out = in;
1005 for (
unsigned int i = 0; i < 5; ++i)
1050template <
int dim,
int spacedim>
1051std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
1055 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> data_ptr =
1056 std::make_unique<InternalData>(*this->
fe);
1063template <
int dim,
int spacedim>
1064std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
1066 const UpdateFlags update_flags,
1069 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> data_ptr =
1070 std::make_unique<InternalData>(*this->
fe);
1074 this->
fe->reference_cell(), quadrature),
1082template <
int dim,
int spacedim>
1083std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
1085 const UpdateFlags update_flags,
1088 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> data_ptr =
1089 std::make_unique<InternalData>(*this->
fe);
1093 this->
fe->reference_cell(), quadrature),
1101template <
int dim,
int spacedim>
1130 support_points.end());
1139 internal::MappingFEImplementation::maybe_compute_q_points<dim, spacedim>(
1145 internal::MappingFEImplementation::maybe_update_Jacobians<dim, spacedim>(
1146 computed_cell_similarity,
1151 internal::MappingFEImplementation::maybe_update_jacobian_grads<dim, spacedim>(
1152 computed_cell_similarity,
1158 internal::MappingFEImplementation::maybe_update_jacobian_pushed_forward_grads<
1160 spacedim>(computed_cell_similarity,
1166 internal::MappingFEImplementation::maybe_update_jacobian_2nd_derivatives<
1168 spacedim>(computed_cell_similarity,
1174 internal::MappingFEImplementation::
1175 maybe_update_jacobian_pushed_forward_2nd_derivatives<dim, spacedim>(
1176 computed_cell_similarity,
1182 internal::MappingFEImplementation::maybe_update_jacobian_3rd_derivatives<
1184 spacedim>(computed_cell_similarity,
1190 internal::MappingFEImplementation::
1191 maybe_update_jacobian_pushed_forward_3rd_derivatives<dim, spacedim>(
1192 computed_cell_similarity,
1198 const UpdateFlags update_flags = data.
update_each;
1199 const std::vector<double> &weights = quadrature.
get_weights();
1215 for (
unsigned int point = 0; point <
n_q_points; ++point)
1217 if (dim == spacedim)
1230 cell->
center(), det, point)));
1232 output_data.
JxW_values[point] = weights[point] * det;
1240 for (
unsigned int i = 0; i < spacedim; ++i)
1241 for (
unsigned int j = 0; j < dim; ++j)
1245 for (
unsigned int i = 0; i < dim; ++i)
1246 for (
unsigned int j = 0; j < dim; ++j)
1247 G[i][j] = DX_t[i] * DX_t[j];
1252 if (computed_cell_similarity ==
1263 Assert(spacedim == dim + 1,
1265 "There is no (unique) cell normal for " +
1267 "-dimensional cells in " +
1269 "-dimensional space. This only works if the "
1270 "space dimension is one greater than the "
1271 "dimensionality of the mesh cells."));
1298 for (
unsigned int point = 0; point <
n_q_points; ++point)
1307 for (
unsigned int point = 0; point <
n_q_points; ++point)
1312 return computed_cell_similarity;
1319 namespace MappingFEImplementation
1333 template <
int dim,
int spacedim>
1335 maybe_compute_face_data(
1336 const ::MappingFE<dim, spacedim> &
mapping,
1337 const typename ::Triangulation<dim, spacedim>::cell_iterator
1339 const unsigned int face_no,
1340 const unsigned int subface_no,
1343 const typename ::MappingFE<dim, spacedim>::InternalData &data,
1347 const UpdateFlags update_flags = data.update_each;
1370 for (
unsigned int d = 0; d != dim - 1; ++d)
1372 Assert(face_no + cell->n_faces() * d <
1373 data.unit_tangentials.size(),
1376 data.aux[d].size() <=
1377 data.unit_tangentials[face_no + cell->n_faces() * d].size(),
1382 data.unit_tangentials[face_no + cell->n_faces() * d]),
1393 if (dim == spacedim)
1395 for (
unsigned int i = 0; i <
n_q_points; ++i)
1405 (face_no == 0 ? -1 : +1);
1435 data.contravariant[
point].transpose()[0];
1437 (face_no == 0 ? -1. : +1.) *
1443 const DerivativeForm<1, spacedim, dim> DX_t =
1444 data.contravariant[
point].transpose();
1446 Tensor<1, spacedim> cell_normal =
1448 cell_normal /= cell_normal.
norm();
1460 for (
unsigned int i = 0; i <
n_q_points; ++i)
1464 data.quadrature_weights[i + data_set];
1470 const double area_ratio =
1471 1. / cell->reference_cell()
1472 .face_reference_cell(face_no)
1473 .n_isotropic_children();
1482 for (
unsigned int i = 0; i <
n_q_points; ++i)
1489 output_data.
jacobians[point] = data.contravariant[point];
1494 data.covariant[point].transpose();
1505 template <
int dim,
int spacedim>
1508 const ::MappingFE<dim, spacedim> &
mapping,
1509 const typename ::Triangulation<dim, spacedim>::cell_iterator
1511 const unsigned int face_no,
1512 const unsigned int subface_no,
1513 const typename QProjector<dim>::DataSetDescriptor data_set,
1514 const Quadrature<dim - 1> &quadrature,
1515 const typename ::MappingFE<dim, spacedim>::InternalData &data,
1516 internal::FEValuesImplementation::MappingRelatedData<dim, spacedim>
1521 maybe_compute_q_points<dim, spacedim>(data_set,
1534 maybe_update_jacobian_pushed_forward_grads<dim, spacedim>(
1540 maybe_update_jacobian_2nd_derivatives<dim, spacedim>(
1546 maybe_update_jacobian_pushed_forward_2nd_derivatives<dim, spacedim>(
1552 maybe_update_jacobian_3rd_derivatives<dim, spacedim>(
1558 maybe_update_jacobian_pushed_forward_3rd_derivatives<dim, spacedim>(
1580template <
int dim,
int spacedim>
1584 const unsigned int face_no,
1597 support_points.end());
1599 internal::MappingFEImplementation::do_fill_fe_face_values(
1609 quadrature[quadrature.
size() == 1 ? 0 : face_no],
1616template <
int dim,
int spacedim>
1620 const unsigned int face_no,
1621 const unsigned int subface_no,
1634 support_points.end());
1636 internal::MappingFEImplementation::do_fill_fe_face_values(
1657 namespace MappingFEImplementation
1661 template <
int dim,
int spacedim,
int rank>
1678 const typename ::MappingFE<dim, spacedim>::InternalData *
>(
1679 &mapping_data) !=
nullptr),
1681 const typename ::MappingFE<dim, spacedim>::InternalData &data =
1683 const typename ::MappingFE<dim, spacedim>::InternalData &
>(
1686 switch (mapping_kind)
1693 "update_contravariant_transformation"));
1695 for (
unsigned int i = 0; i < input.size(); ++i)
1707 "update_contravariant_transformation"));
1711 "update_volume_elements"));
1716 for (
unsigned int i = 0; i < input.size(); ++i)
1720 output[i] /= data.volume_elements[i];
1732 "update_covariant_transformation"));
1734 for (
unsigned int i = 0; i < input.size(); ++i)
1746 template <
int dim,
int spacedim,
int rank>
1749 const ArrayView<
const Tensor<rank, dim>> &input,
1751 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_data,
1752 const ArrayView<Tensor<rank, spacedim>> &output)
1757 const typename ::MappingFE<dim, spacedim>::InternalData *
>(
1758 &mapping_data) !=
nullptr),
1760 const typename ::MappingFE<dim, spacedim>::InternalData &data =
1762 const typename ::MappingFE<dim, spacedim>::InternalData &
>(
1765 switch (mapping_kind)
1772 "update_covariant_transformation"));
1776 "update_contravariant_transformation"));
1779 for (
unsigned int i = 0; i < output.size(); ++i)
1781 const DerivativeForm<1, spacedim, dim>
A =
1796 "update_covariant_transformation"));
1799 for (
unsigned int i = 0; i < output.size(); ++i)
1801 const DerivativeForm<1, spacedim, dim>
A =
1816 "update_covariant_transformation"));
1820 "update_contravariant_transformation"));
1824 "update_volume_elements"));
1827 for (
unsigned int i = 0; i < output.size(); ++i)
1830 data.contravariant[i],
1831 data.volume_elements[i],
1844 template <
int dim,
int spacedim>
1847 const ArrayView<
const Tensor<3, dim>> &input,
1849 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_data,
1850 const ArrayView<Tensor<3, spacedim>> &output)
1855 const typename ::MappingFE<dim, spacedim>::InternalData *
>(
1856 &mapping_data) !=
nullptr),
1858 const typename ::MappingFE<dim, spacedim>::InternalData &data =
1860 const typename ::MappingFE<dim, spacedim>::InternalData &
>(
1863 switch (mapping_kind)
1870 "update_covariant_transformation"));
1874 "update_contravariant_transformation"));
1876 for (
unsigned int q = 0; q < output.size(); ++q)
1879 data.contravariant[q],
1890 "update_covariant_transformation"));
1892 for (
unsigned int q = 0; q < output.size(); ++q)
1905 "update_covariant_transformation"));
1909 "update_contravariant_transformation"));
1913 "update_volume_elements"));
1915 for (
unsigned int q = 0; q < output.size(); ++q)
1918 data.contravariant[q],
1919 data.volume_elements[q],
1932 template <
int dim,
int spacedim,
int rank>
1935 const ArrayView<
const DerivativeForm<rank, dim, spacedim>> &input,
1937 const typename Mapping<dim, spacedim>::InternalDataBase &mapping_data,
1938 const ArrayView<Tensor<rank + 1, spacedim>> &output)
1943 const typename ::MappingFE<dim, spacedim>::InternalData *
>(
1944 &mapping_data) !=
nullptr),
1946 const typename ::MappingFE<dim, spacedim>::InternalData &data =
1948 const typename ::MappingFE<dim, spacedim>::InternalData &
>(
1951 switch (mapping_kind)
1958 "update_covariant_transformation"));
1960 for (
unsigned int i = 0; i < output.size(); ++i)
1975template <
int dim,
int spacedim>
1979 const MappingKind mapping_kind,
1983 internal::MappingFEImplementation::transform_fields(input,
1991template <
int dim,
int spacedim>
1995 const MappingKind mapping_kind,
1999 internal::MappingFEImplementation::transform_differential_forms(input,
2007template <
int dim,
int spacedim>
2011 const MappingKind mapping_kind,
2015 switch (mapping_kind)
2018 internal::MappingFEImplementation::transform_fields(input,
2027 internal::MappingFEImplementation::transform_gradients(input,
2039template <
int dim,
int spacedim>
2043 const MappingKind mapping_kind,
2052 switch (mapping_kind)
2058 "update_covariant_transformation"));
2060 for (
unsigned int q = 0; q < output.size(); ++q)
2074template <
int dim,
int spacedim>
2078 const MappingKind mapping_kind,
2082 switch (mapping_kind)
2087 internal::MappingFEImplementation::transform_hessians(input,
2101 template <
int spacedim>
2103 check_all_manifold_ids_identical(
2111 template <
int spacedim>
2113 check_all_manifold_ids_identical(
2116 const auto m_id = cell->manifold_id();
2118 for (
const auto f : cell->face_indices())
2119 if (m_id != cell->face(f)->manifold_id())
2127 template <
int spacedim>
2129 check_all_manifold_ids_identical(
2132 const auto m_id = cell->manifold_id();
2134 for (
const auto f : cell->face_indices())
2135 if (m_id != cell->face(f)->manifold_id())
2138 for (
const auto l : cell->line_indices())
2139 if (m_id != cell->line(l)->manifold_id())
2148template <
int dim,
int spacedim>
2149boost::container::small_vector<Point<spacedim>, 200>
2153 boost::container::small_vector<Point<spacedim>, 200> points;
2158 vertices[i] = cell->
vertex(i);
2161 if (check_all_manifold_ids_identical(cell))
2178 const auto process = [&](
const auto &manifold,
2179 const auto &indices,
2180 const unsigned n_points) {
2181 if ((indices.size() == 0) || (n_points == 0))
2184 const unsigned int n_shape_functions =
2185 this->
fe->reference_cell().n_vertices();
2189 std::vector<Point<spacedim>> mapping_support_points_local(n_points);
2191 for (
unsigned int p = 0; p < n_points; ++p)
2192 for (
unsigned int i = 0; i < n_shape_functions; ++i)
2193 mapping_support_point_weights_local(p, i) =
2195 indices[p + (indices.size() - n_points)], i);
2198 mapping_support_point_weights_local,
2200 mapping_support_points_local));
2202 for (
unsigned int p = 0; p < n_points; ++p)
2203 points[indices[p + (indices.size() - n_points)]] =
2204 mapping_support_points_local[p];
2208 const auto &
fe = *this->
fe;
2215 std::vector<types::global_dof_index> indices;
2219 points[i] = vertices[i];
2222 for (
unsigned int l = 0; l < cell_ref->n_lines(); ++l)
2224 const auto accessor = cell_ref->line(l);
2225 indices.resize(
fe.n_dofs_per_line() + 2 *
fe.n_dofs_per_vertex());
2226 accessor->get_dof_indices(indices);
2227 process(cell->
line(l)->get_manifold(), indices,
fe.n_dofs_per_line());
2231 if constexpr (dim >= 3)
2233 for (
unsigned int f = 0; f < cell_ref->n_faces(); ++f)
2235 const auto accessor = cell_ref->face(f);
2236 indices.resize(
fe.n_dofs_per_face());
2237 accessor->get_dof_indices(indices);
2238 process(cell->
face(f)->get_manifold(),
2240 fe.n_dofs_per_quad());
2245 if constexpr (dim >= 2)
2247 indices.resize(
fe.n_dofs_per_cell());
2248 cell_ref->get_dof_indices(indices);
2251 (dim == 2) ?
fe.n_dofs_per_quad() :
fe.n_dofs_per_hex());
2260template <
int dim,
int spacedim>
2270template <
int dim,
int spacedim>
2275 Assert(dim == reference_cell.get_dimension(),
2276 ExcMessage(
"The dimension of your mapping (" +
2278 ") and the reference cell cell_type (" +
2280 " ) do not agree."));
2282 return fe->reference_cell() == reference_cell;
2288#include "fe/mapping_fe.inst"
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
internal::SubfaceCase< dim > subface_case(const unsigned int face_no) const
double diameter(const Mapping< dim, spacedim > &mapping) const
TriaIterator< TriaAccessor< dim - 1, dim, spacedim > > face(const unsigned int i) const
bool direction_flag() const
void distribute_dofs(const FiniteElement< dim, spacedim > &fe)
active_cell_iterator begin_active(const unsigned int level=0) const
virtual void get_new_points(const ArrayView< const Point< spacedim > > &surrounding_points, const Table< 2, double > &weights, ArrayView< Point< spacedim > > new_points) const
const Tensor< 3, dim > & third_derivative(const unsigned int qpoint, const unsigned int shape_nr) const
void initialize_face(const UpdateFlags update_flags, const Quadrature< dim > &quadrature, const unsigned int n_original_q_points)
std::vector< Point< spacedim > > mapping_support_points
const Tensor< 4, dim > & fourth_derivative(const unsigned int qpoint, const unsigned int shape_nr) const
std::vector< std::vector< Tensor< 1, spacedim > > > aux
std::vector< Tensor< 3, dim > > shape_third_derivatives
std::vector< Tensor< 2, dim > > shape_second_derivatives
std::vector< Tensor< 4, dim > > shape_fourth_derivatives
void compute_shape_function_values(const std::vector< Point< dim > > &unit_points)
std::array< std::vector< Tensor< 1, dim > >, ReferenceCells::max_n_faces< dim >() *2 > unit_tangentials
std::vector< double > quadrature_weights
const FiniteElement< dim, spacedim > & fe
std::vector< DerivativeForm< 1, dim, spacedim > > contravariant
std::vector< DerivativeForm< 1, dim, spacedim > > covariant
const Tensor< 1, dim > & derivative(const unsigned int qpoint, const unsigned int shape_nr) const
std::vector< double > shape_values
std::vector< Tensor< 1, dim > > shape_derivatives
virtual std::size_t memory_consumption() const override
const Tensor< 2, dim > & second_derivative(const unsigned int qpoint, const unsigned int shape_nr) const
InternalData(const FiniteElement< dim, spacedim > &fe)
const unsigned int n_shape_functions
std::vector< double > volume_elements
const double & shape(const unsigned int qpoint, const unsigned int shape_nr) const
virtual void reinit(const UpdateFlags update_flags, const Quadrature< dim > &quadrature) override
const unsigned int polynomial_degree
virtual CellSimilarity::Similarity fill_fe_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const CellSimilarity::Similarity cell_similarity, const Quadrature< dim > &quadrature, const typename Mapping< dim, spacedim >::InternalDataBase &internal_data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const override
const unsigned int polynomial_degree
MappingFE(const FiniteElement< dim, spacedim > &fe)
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_face_data(const UpdateFlags flags, const hp::QCollection< dim - 1 > &quadrature) const override
virtual Point< dim > transform_real_to_unit_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< spacedim > &p) const override
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
virtual boost::container::small_vector< Point< spacedim >, 200 > compute_mapping_support_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell) const
virtual void fill_fe_face_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const hp::QCollection< dim - 1 > &quadrature, const typename Mapping< dim, spacedim >::InternalDataBase &internal_data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const override
Table< 2, double > mapping_support_point_weights
virtual void transform(const ArrayView< const Tensor< 1, dim > > &input, const MappingKind kind, const typename Mapping< dim, spacedim >::InternalDataBase &internal, const ArrayView< Tensor< 1, spacedim > > &output) const override
virtual BoundingBox< spacedim > get_bounding_box(const typename Triangulation< dim, spacedim >::cell_iterator &cell) const override
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_data(const UpdateFlags, const Quadrature< dim > &quadrature) const override
virtual bool is_compatible_with(const ReferenceCell< dim > &reference_cell) const override
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_subface_data(const UpdateFlags flags, const Quadrature< dim - 1 > &quadrature) const override
unsigned int get_degree() const
virtual void fill_fe_subface_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int subface_no, const Quadrature< dim - 1 > &quadrature, const typename Mapping< dim, spacedim >::InternalDataBase &internal_data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data) const override
virtual std::unique_ptr< Mapping< dim, spacedim > > clone() const override
virtual Point< spacedim > transform_unit_to_real_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< dim > &p) const override
const std::unique_ptr< FiniteElement< dim, spacedim > > fe
virtual std::size_t memory_consumption() const
Class storing the offset index into a Quadrature rule created by project_to_all_faces() or project_to...
static DataSetDescriptor cell()
static DataSetDescriptor subface(const ReferenceCell< dim > &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< dim > &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)
static Quadrature< dim > project_to_all_faces(const ReferenceCell< dim > &reference_cell, const hp::QCollection< dim - 1 > &quadrature)
static Quadrature< dim > project_to_all_subfaces(const ReferenceCell< dim > &reference_cell, const SubQuadrature &quadrature)
const std::vector< double > & get_weights() const
const std::vector< Point< dim > > & get_points() const
unsigned int size() const
numbers::NumberTraits< Number >::real_type norm() const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > vertex_indices() const
const Manifold< dim, spacedim > & get_manifold() const
unsigned int n_vertices() const
Point< spacedim > center(const bool respect_manifold=false, const bool interpolate_from_surrounding=false) const
Point< spacedim > & vertex(const unsigned int i) const
typename::internal::TriangulationImplementation::Iterators< dim, spacedim >::line_iterator line(const unsigned int i) const
unsigned int size() const
unsigned int max_n_quadrature_points() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_NOT_IMPLEMENTED()
static ::ExceptionBase & ExcAccessToUninitializedField(std::string arg1)
static ::ExceptionBase & ExcDistortedMappedCell(Point< spacedim > arg1, double arg2, int arg3)
static ::ExceptionBase & ExcTransformationFailed()
static ::ExceptionBase & ExcNotImplemented()
#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)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
TriaIterator< CellAccessor< dim, spacedim > > cell_iterator
@ update_jacobian_pushed_forward_2nd_derivatives
@ update_volume_elements
Determinant of the Jacobian.
@ update_contravariant_transformation
Contravariant transformation.
@ update_jacobian_pushed_forward_grads
@ update_jacobian_3rd_derivatives
@ update_jacobian_grads
Gradient of volume element.
@ update_normal_vectors
Normal vectors.
@ update_JxW_values
Transformed quadrature weights.
@ update_covariant_transformation
Covariant transformation.
@ update_jacobians
Volume element.
@ update_inverse_jacobians
Volume element.
@ update_quadrature_points
Transformed quadrature points.
@ update_jacobian_pushed_forward_3rd_derivatives
@ update_boundary_forms
Outer normal vector, not normalized.
@ update_jacobian_2nd_derivatives
@ mapping_covariant_gradient
@ mapping_contravariant_hessian
@ mapping_covariant_hessian
@ mapping_contravariant_gradient
types::geometric_orientation combined_face_orientation(const unsigned int face) const
MappingQ< dim, spacedim > StaticMappingQ1< dim, spacedim >::mapping
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell< dim > &reference_cell)
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
Point< spacedim > point(const gp_Pnt &p, const double tolerance=1e-10)
constexpr unsigned int max_n_vertices()
constexpr T fixed_power(const T t)
std::string to_string(const number value, const unsigned int digits=numbers::invalid_unsigned_int)
std::string int_to_string(const unsigned int value, const unsigned int digits=numbers::invalid_unsigned_int)
void transform_differential_forms(const ArrayView< const DerivativeForm< rank, dim, spacedim > > &input, const MappingKind mapping_kind, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_data, const ArrayView< Tensor< rank+1, spacedim > > &output)
void do_fill_fe_face_values(const ::MappingQ< dim, spacedim > &mapping, const typename ::Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int subface_no, const typename QProjector< dim >::DataSetDescriptor data_set, const Quadrature< dim - 1 > &quadrature, const typename ::MappingQ< dim, spacedim >::InternalData &data, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data)
void transform_gradients(const ArrayView< const Tensor< rank, dim > > &input, const MappingKind mapping_kind, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_data, const ArrayView< Tensor< rank, spacedim > > &output)
void transform_hessians(const ArrayView< const Tensor< 3, dim > > &input, const MappingKind mapping_kind, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_data, const ArrayView< Tensor< 3, spacedim > > &output)
void maybe_compute_face_data(const ::MappingQ< dim, spacedim > &mapping, const typename ::Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int subface_no, const unsigned int n_q_points, const std::vector< double > &weights, const typename ::MappingQ< dim, spacedim >::InternalData &data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data)
Tensor< 3, spacedim, Number > apply_contravariant_hessian(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 1, dim, spacedim, Number > &contravariant, const Tensor< 3, dim, Number > &input)
Tensor< 3, spacedim, Number > apply_piola_hessian(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 1, dim, spacedim, Number > &contravariant, const Number &volume_element, const Tensor< 3, dim, Number > &input)
Tensor< 2, spacedim, Number > apply_piola_gradient(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 1, dim, spacedim, Number > &contravariant, const Number &volume_element, const Tensor< 2, dim, Number > &input)
Tensor< 3, spacedim, Number > apply_covariant_gradient(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 2, dim, spacedim, Number > &input)
Tensor< 3, spacedim, Number > apply_covariant_hessian(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const Tensor< 3, dim, Number > &input)
constexpr unsigned int invalid_unsigned_int
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
* const unsigned int n_q_points
constexpr Number determinant(const SymmetricTensor< 2, dim, Number > &)
constexpr SymmetricTensor< 2, dim, Number > invert(const SymmetricTensor< 2, dim, Number > &)
constexpr Tensor< 1, dim, Number > cross_product_2d(const Tensor< 1, dim, Number > &src)
constexpr Tensor< 1, dim, typename ProductType< Number1, Number2 >::type > cross_product_3d(const Tensor< 1, dim, Number1 > &src1, const Tensor< 1, dim, Number2 > &src2)