38 #include <boost/container/small_vector.hpp>
51 template <
int dim,
int spacedim>
55 , polynomial_degree(fe.tensor_degree())
56 , n_shape_functions(fe.n_dofs_per_cell())
61 template <
int dim,
int spacedim>
81 template <
int dim,
int spacedim>
86 const unsigned int n_original_q_points)
90 this->update_each = update_flags;
92 const unsigned int n_q_points = q.
size();
95 covariant.resize(n_original_q_points);
98 contravariant.resize(n_original_q_points);
101 volume_elements.resize(n_original_q_points);
106 shape_values.resize(n_shape_functions * n_q_points);
108 if (this->update_each &
116 shape_derivatives.resize(n_shape_functions * n_q_points);
118 if (this->update_each &
120 shape_second_derivatives.resize(n_shape_functions * n_q_points);
124 shape_third_derivatives.resize(n_shape_functions * n_q_points);
128 shape_fourth_derivatives.resize(n_shape_functions * n_q_points);
131 compute_shape_function_values(q.
get_points());
139 template <
int dim,
int spacedim>
144 const unsigned int n_original_q_points)
146 initialize(update_flags, q, n_original_q_points);
148 if (this->update_each &
159 for (
unsigned int i = 0; i < n_faces; ++i)
161 unit_tangentials[i].resize(n_original_q_points);
162 std::fill(unit_tangentials[i].
begin(),
163 unit_tangentials[i].
end(),
167 unit_tangentials[n_faces + i].resize(n_original_q_points);
169 unit_tangentials[n_faces + i].
begin(),
170 unit_tangentials[n_faces + i].
end(),
179 template <
int dim,
int spacedim>
188 const auto &tensor_pols = fe_poly->get_poly_space();
190 const unsigned int n_shape_functions =
fe.n_dofs_per_cell();
191 const unsigned int n_points = unit_points.size();
193 std::vector<double>
values;
194 std::vector<Tensor<1, dim>> grads;
195 if (shape_values.size() != 0)
197 Assert(shape_values.size() == n_shape_functions * n_points,
199 values.resize(n_shape_functions);
201 if (shape_derivatives.size() != 0)
203 Assert(shape_derivatives.size() == n_shape_functions * n_points,
205 grads.resize(n_shape_functions);
208 std::vector<Tensor<2, dim>> grad2;
209 if (shape_second_derivatives.size() != 0)
211 Assert(shape_second_derivatives.size() == n_shape_functions * n_points,
213 grad2.resize(n_shape_functions);
216 std::vector<Tensor<3, dim>> grad3;
217 if (shape_third_derivatives.size() != 0)
219 Assert(shape_third_derivatives.size() == n_shape_functions * n_points,
221 grad3.resize(n_shape_functions);
224 std::vector<Tensor<4, dim>> grad4;
225 if (shape_fourth_derivatives.size() != 0)
227 Assert(shape_fourth_derivatives.size() == n_shape_functions * n_points,
229 grad4.resize(n_shape_functions);
233 if (shape_values.size() != 0 || shape_derivatives.size() != 0 ||
234 shape_second_derivatives.size() != 0 ||
235 shape_third_derivatives.size() != 0 ||
236 shape_fourth_derivatives.size() != 0)
239 tensor_pols.evaluate(
240 unit_points[
point],
values, grads, grad2, grad3, grad4);
242 if (shape_values.size() != 0)
243 for (
unsigned int i = 0; i < n_shape_functions; ++i)
246 if (shape_derivatives.size() != 0)
247 for (
unsigned int i = 0; i < n_shape_functions; ++i)
248 derivative(
point, i) = grads[i];
250 if (shape_second_derivatives.size() != 0)
251 for (
unsigned int i = 0; i < n_shape_functions; ++i)
252 second_derivative(
point, i) = grad2[i];
254 if (shape_third_derivatives.size() != 0)
255 for (
unsigned int i = 0; i < n_shape_functions; ++i)
256 third_derivative(
point, i) = grad3[i];
258 if (shape_fourth_derivatives.size() != 0)
259 for (
unsigned int i = 0; i < n_shape_functions; ++i)
260 fourth_derivative(
point, i) = grad4[i];
267 namespace MappingFEImplementation
277 template <
int dim,
int spacedim>
281 const typename ::MappingFE<dim, spacedim>::InternalData &data,
283 const unsigned int n_q_points)
290 const double * shape = &data.shape(
point + data_set, 0);
292 (shape[0] * data.mapping_support_points[0]);
293 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
294 for (
unsigned int i = 0; i < spacedim; ++i)
295 result[i] += shape[k] * data.mapping_support_points[k][i];
310 template <
int dim,
int spacedim>
314 const typename ::QProjector<dim>::DataSetDescriptor data_set,
315 const typename ::MappingFE<dim, spacedim>::InternalData &data,
316 const unsigned int n_q_points)
326 std::fill(data.contravariant.begin(),
327 data.contravariant.end(),
333 data.mapping_support_points.data();
338 &data.derivative(
point + data_set, 0);
340 double result[spacedim][dim];
344 for (
unsigned int i = 0; i < spacedim; ++i)
345 for (
unsigned int j = 0; j < dim; ++j)
346 result[i][j] = data_derv[0][j] * supp_pts[0][i];
347 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
348 for (
unsigned int i = 0; i < spacedim; ++i)
349 for (
unsigned int j = 0; j < dim; ++j)
350 result[i][j] += data_derv[k][j] * supp_pts[k][i];
357 for (
unsigned int i = 0; i < spacedim; ++i)
358 for (
unsigned int j = 0; j < dim; ++j)
359 data.contravariant[
point][i][j] = result[i][j];
368 data.covariant[
point] =
369 (data.contravariant[
point]).covariant_form();
377 data.volume_elements[
point] =
378 data.contravariant[
point].determinant();
388 template <
int dim,
int spacedim>
393 const typename ::MappingFE<dim, spacedim>::InternalData &data,
395 const unsigned int n_q_points)
406 &data.second_derivative(
point + data_set, 0);
407 double result[spacedim][dim][dim];
408 for (
unsigned int i = 0; i < spacedim; ++i)
409 for (
unsigned int j = 0; j < dim; ++j)
410 for (
unsigned int l = 0;
l < dim; ++
l)
412 (
second[0][j][
l] * data.mapping_support_points[0][i]);
413 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
414 for (
unsigned int i = 0; i < spacedim; ++i)
415 for (
unsigned int j = 0; j < dim; ++j)
416 for (
unsigned int l = 0;
l < dim; ++
l)
419 data.mapping_support_points[k][i]);
421 for (
unsigned int i = 0; i < spacedim; ++i)
422 for (
unsigned int j = 0; j < dim; ++j)
423 for (
unsigned int l = 0;
l < dim; ++
l)
424 jacobian_grads[
point][i][j][
l] = result[i][j][
l];
435 template <
int dim,
int spacedim>
440 const typename ::MappingFE<dim, spacedim>::InternalData &data,
442 const unsigned int n_q_points)
448 jacobian_pushed_forward_grads.size() + 1);
452 double tmp[spacedim][spacedim][spacedim];
456 &data.second_derivative(
point + data_set, 0);
457 double result[spacedim][dim][dim];
458 for (
unsigned int i = 0; i < spacedim; ++i)
459 for (
unsigned int j = 0; j < dim; ++j)
460 for (
unsigned int l = 0;
l < dim; ++
l)
461 result[i][j][
l] = (
second[0][j][
l] *
462 data.mapping_support_points[0][i]);
463 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
464 for (
unsigned int i = 0; i < spacedim; ++i)
465 for (
unsigned int j = 0; j < dim; ++j)
466 for (
unsigned int l = 0;
l < dim; ++
l)
469 data.mapping_support_points[k][i]);
472 for (
unsigned int i = 0; i < spacedim; ++i)
473 for (
unsigned int j = 0; j < spacedim; ++j)
474 for (
unsigned int l = 0;
l < dim; ++
l)
477 result[i][0][
l] * data.covariant[
point][j][0];
478 for (
unsigned int jr = 1; jr < dim; ++jr)
480 tmp[i][j][
l] += result[i][jr][
l] *
481 data.covariant[
point][j][jr];
486 for (
unsigned int i = 0; i < spacedim; ++i)
487 for (
unsigned int j = 0; j < spacedim; ++j)
488 for (
unsigned int l = 0;
l < spacedim; ++
l)
490 jacobian_pushed_forward_grads[
point][i][j][
l] =
491 tmp[i][j][0] * data.covariant[
point][
l][0];
492 for (
unsigned int lr = 1; lr < dim; ++lr)
494 jacobian_pushed_forward_grads[
point][i][j][
l] +=
495 tmp[i][j][lr] * data.covariant[
point][
l][lr];
509 template <
int dim,
int spacedim>
514 const typename ::MappingFE<dim, spacedim>::InternalData &data,
516 const unsigned int n_q_points)
528 &data.third_derivative(
point + data_set, 0);
529 double result[spacedim][dim][dim][dim];
530 for (
unsigned int i = 0; i < spacedim; ++i)
531 for (
unsigned int j = 0; j < dim; ++j)
532 for (
unsigned int l = 0;
l < dim; ++
l)
533 for (
unsigned int m = 0; m < dim; ++m)
536 data.mapping_support_points[0][i]);
537 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
538 for (
unsigned int i = 0; i < spacedim; ++i)
539 for (
unsigned int j = 0; j < dim; ++j)
540 for (
unsigned int l = 0;
l < dim; ++
l)
541 for (
unsigned int m = 0; m < dim; ++m)
542 result[i][j][
l][m] +=
544 data.mapping_support_points[k][i]);
546 for (
unsigned int i = 0; i < spacedim; ++i)
547 for (
unsigned int j = 0; j < dim; ++j)
548 for (
unsigned int l = 0;
l < dim; ++
l)
549 for (
unsigned int m = 0; m < dim; ++m)
550 jacobian_2nd_derivatives[
point][i][j][
l][m] =
564 template <
int dim,
int spacedim>
569 const typename ::MappingFE<dim, spacedim>::InternalData &data,
571 & jacobian_pushed_forward_2nd_derivatives,
572 const unsigned int n_q_points)
578 jacobian_pushed_forward_2nd_derivatives.size() +
583 double tmp[spacedim][spacedim][spacedim][spacedim];
587 &data.third_derivative(
point + data_set, 0);
588 double result[spacedim][dim][dim][dim];
589 for (
unsigned int i = 0; i < spacedim; ++i)
590 for (
unsigned int j = 0; j < dim; ++j)
591 for (
unsigned int l = 0;
l < dim; ++
l)
592 for (
unsigned int m = 0; m < dim; ++m)
595 data.mapping_support_points[0][i]);
596 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
597 for (
unsigned int i = 0; i < spacedim; ++i)
598 for (
unsigned int j = 0; j < dim; ++j)
599 for (
unsigned int l = 0;
l < dim; ++
l)
600 for (
unsigned int m = 0; m < dim; ++m)
601 result[i][j][
l][m] +=
603 data.mapping_support_points[k][i]);
606 for (
unsigned int i = 0; i < spacedim; ++i)
607 for (
unsigned int j = 0; j < spacedim; ++j)
608 for (
unsigned int l = 0;
l < dim; ++
l)
609 for (
unsigned int m = 0; m < dim; ++m)
611 jacobian_pushed_forward_2nd_derivatives
614 data.covariant[
point][j][0];
615 for (
unsigned int jr = 1; jr < dim; ++jr)
616 jacobian_pushed_forward_2nd_derivatives[
point]
619 result[i][jr][
l][m] *
620 data.covariant[
point][j][jr];
624 for (
unsigned int i = 0; i < spacedim; ++i)
625 for (
unsigned int j = 0; j < spacedim; ++j)
626 for (
unsigned int l = 0;
l < spacedim; ++
l)
627 for (
unsigned int m = 0; m < dim; ++m)
630 jacobian_pushed_forward_2nd_derivatives[
point]
633 data.covariant[
point][
l][0];
634 for (
unsigned int lr = 1; lr < dim; ++lr)
636 jacobian_pushed_forward_2nd_derivatives
637 [
point][i][j][lr][m] *
638 data.covariant[
point][
l][lr];
642 for (
unsigned int i = 0; i < spacedim; ++i)
643 for (
unsigned int j = 0; j < spacedim; ++j)
644 for (
unsigned int l = 0;
l < spacedim; ++
l)
645 for (
unsigned int m = 0; m < spacedim; ++m)
647 jacobian_pushed_forward_2nd_derivatives
649 tmp[i][j][
l][0] * data.covariant[
point][m][0];
650 for (
unsigned int mr = 1; mr < dim; ++mr)
651 jacobian_pushed_forward_2nd_derivatives[
point]
655 data.covariant[
point][m][mr];
668 template <
int dim,
int spacedim>
673 const typename ::MappingFE<dim, spacedim>::InternalData &data,
675 const unsigned int n_q_points)
687 &data.fourth_derivative(
point + data_set, 0);
688 double result[spacedim][dim][dim][dim][dim];
689 for (
unsigned int i = 0; i < spacedim; ++i)
690 for (
unsigned int j = 0; j < dim; ++j)
691 for (
unsigned int l = 0;
l < dim; ++
l)
692 for (
unsigned int m = 0; m < dim; ++m)
693 for (
unsigned int n = 0; n < dim; ++n)
694 result[i][j][
l][m][n] =
695 (fourth[0][j][
l][m][n] *
696 data.mapping_support_points[0][i]);
697 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
698 for (
unsigned int i = 0; i < spacedim; ++i)
699 for (
unsigned int j = 0; j < dim; ++j)
700 for (
unsigned int l = 0;
l < dim; ++
l)
701 for (
unsigned int m = 0; m < dim; ++m)
702 for (
unsigned int n = 0; n < dim; ++n)
703 result[i][j][
l][m][n] +=
704 (fourth[k][j][
l][m][n] *
705 data.mapping_support_points[k][i]);
707 for (
unsigned int i = 0; i < spacedim; ++i)
708 for (
unsigned int j = 0; j < dim; ++j)
709 for (
unsigned int l = 0;
l < dim; ++
l)
710 for (
unsigned int m = 0; m < dim; ++m)
711 for (
unsigned int n = 0; n < dim; ++n)
712 jacobian_3rd_derivatives[
point][i][j][
l][m][n] =
713 result[i][j][
l][m][n];
726 template <
int dim,
int spacedim>
731 const typename ::MappingFE<dim, spacedim>::InternalData &data,
733 & jacobian_pushed_forward_3rd_derivatives,
734 const unsigned int n_q_points)
740 jacobian_pushed_forward_3rd_derivatives.size() +
745 double tmp[spacedim][spacedim][spacedim][spacedim][spacedim];
749 &data.fourth_derivative(
point + data_set, 0);
750 double result[spacedim][dim][dim][dim][dim];
751 for (
unsigned int i = 0; i < spacedim; ++i)
752 for (
unsigned int j = 0; j < dim; ++j)
753 for (
unsigned int l = 0;
l < dim; ++
l)
754 for (
unsigned int m = 0; m < dim; ++m)
755 for (
unsigned int n = 0; n < dim; ++n)
756 result[i][j][
l][m][n] =
757 (fourth[0][j][
l][m][n] *
758 data.mapping_support_points[0][i]);
759 for (
unsigned int k = 1; k < data.n_shape_functions; ++k)
760 for (
unsigned int i = 0; i < spacedim; ++i)
761 for (
unsigned int j = 0; j < dim; ++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)
765 result[i][j][
l][m][n] +=
766 (fourth[k][j][
l][m][n] *
767 data.mapping_support_points[k][i]);
770 for (
unsigned int i = 0; i < spacedim; ++i)
771 for (
unsigned int j = 0; j < spacedim; ++j)
772 for (
unsigned int l = 0;
l < dim; ++
l)
773 for (
unsigned int m = 0; m < dim; ++m)
774 for (
unsigned int n = 0; n < dim; ++n)
777 result[i][0][
l][m][n] *
778 data.covariant[
point][j][0];
779 for (
unsigned int jr = 1; jr < dim; ++jr)
780 tmp[i][j][
l][m][n] +=
781 result[i][jr][
l][m][n] *
782 data.covariant[
point][j][jr];
786 for (
unsigned int i = 0; i < spacedim; ++i)
787 for (
unsigned int j = 0; j < spacedim; ++j)
788 for (
unsigned int l = 0;
l < spacedim; ++
l)
789 for (
unsigned int m = 0; m < dim; ++m)
790 for (
unsigned int n = 0; n < dim; ++n)
792 jacobian_pushed_forward_3rd_derivatives
795 data.covariant[
point][
l][0];
796 for (
unsigned int lr = 1; lr < dim; ++lr)
797 jacobian_pushed_forward_3rd_derivatives
799 tmp[i][j][lr][m][n] *
800 data.covariant[
point][
l][lr];
804 for (
unsigned int i = 0; i < spacedim; ++i)
805 for (
unsigned int j = 0; j < spacedim; ++j)
806 for (
unsigned int l = 0;
l < spacedim; ++
l)
807 for (
unsigned int m = 0; m < spacedim; ++m)
808 for (
unsigned int n = 0; n < dim; ++n)
811 jacobian_pushed_forward_3rd_derivatives
813 data.covariant[
point][m][0];
814 for (
unsigned int mr = 1; mr < dim; ++mr)
815 tmp[i][j][
l][m][n] +=
816 jacobian_pushed_forward_3rd_derivatives
818 data.covariant[
point][m][mr];
822 for (
unsigned int i = 0; i < spacedim; ++i)
823 for (
unsigned int j = 0; j < spacedim; ++j)
824 for (
unsigned int l = 0;
l < spacedim; ++
l)
825 for (
unsigned int m = 0; m < spacedim; ++m)
826 for (
unsigned int n = 0; n < spacedim; ++n)
828 jacobian_pushed_forward_3rd_derivatives
831 data.covariant[
point][n][0];
832 for (
unsigned int nr = 1; nr < dim; ++nr)
833 jacobian_pushed_forward_3rd_derivatives
835 tmp[i][j][
l][m][nr] *
836 data.covariant[
point][n][nr];
848 template <
int dim,
int spacedim>
854 ExcMessage(
"It only makes sense to create polynomial mappings "
855 "with a polynomial degree greater or equal to one."));
860 const auto &mapping_support_points =
fe.get_unit_support_points();
864 const unsigned int n_points = mapping_support_points.size();
865 const unsigned int n_shape_functions =
reference_cell.n_vertices();
871 for (
unsigned int i = 0; i < n_shape_functions; ++i)
879 template <
int dim,
int spacedim>
881 : fe(mapping.fe->clone())
882 , polynomial_degree(mapping.polynomial_degree)
883 , mapping_support_point_weights(mapping.mapping_support_point_weights)
888 template <
int dim,
int spacedim>
889 std::unique_ptr<Mapping<dim, spacedim>>
892 return std::make_unique<MappingFE<dim, spacedim>>(*this);
897 template <
int dim,
int spacedim>
901 return polynomial_degree;
906 template <
int dim,
int spacedim>
912 const std::vector<Point<spacedim>> support_points =
913 this->compute_mapping_support_points(cell);
917 for (
unsigned int i = 0; i < this->fe->n_dofs_per_cell(); ++i)
918 mapped_point += support_points[i] * this->fe->shape_value(i, p);
925 template <
int dim,
int spacedim>
931 const std::vector<Point<spacedim>> support_points =
932 this->compute_mapping_support_points(cell);
934 const double eps = 1.e-12 * cell->diameter();
935 const unsigned int loop_limit = 10;
939 unsigned int loop = 0;
955 for (
unsigned int i = 0; i < this->fe->n_dofs_per_cell(); ++i)
957 mapped_point += support_points[i] * this->fe->shape_value(i, p_unit);
958 const auto grad_F_i = this->fe->shape_grad(i, p_unit);
959 const auto hessian_F_i = this->fe->shape_grad_grad(i, p_unit);
960 for (
unsigned int j = 0; j < dim; ++j)
962 grad_FT[j] += grad_F_i[j] * support_points[i];
963 for (
unsigned int l = 0;
l < dim; ++
l)
964 hess_FT[j][
l] += hessian_F_i[j][
l] * support_points[i];
969 const auto residual = p - mapped_point;
976 if (grad_FT_residual.norm() <=
eps)
981 for (
unsigned int j = 0; j < dim; ++j)
982 for (
unsigned int l = 0;
l < dim; ++
l)
983 corrected_metric_tensor[j][
l] =
984 -grad_FT[j] * grad_FT[
l] + hess_FT[j][
l] * residual;
987 const auto g_inverse =
invert(corrected_metric_tensor);
988 p_unit -=
Point<dim>(g_inverse * grad_FT_residual);
992 while (
loop < loop_limit);
1006 template <
int dim,
int spacedim>
1017 for (
unsigned int i = 0; i < 5; ++i)
1062 template <
int dim,
int spacedim>
1063 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
1067 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> data_ptr =
1068 std::make_unique<InternalData>(*this->fe);
1070 data.
initialize(this->requires_update_flags(update_flags), q, q.
size());
1077 template <
int dim,
int spacedim>
1078 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
1083 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> data_ptr =
1084 std::make_unique<InternalData>(*this->fe);
1088 this->fe->reference_cell(), quadrature),
1096 template <
int dim,
int spacedim>
1097 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
1102 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> data_ptr =
1103 std::make_unique<InternalData>(*this->fe);
1107 this->fe->reference_cell(), quadrature),
1115 template <
int dim,
int spacedim>
1130 const unsigned int n_q_points = quadrature.
size();
1152 internal::MappingFEImplementation::maybe_compute_q_points<dim, spacedim>(
1158 internal::MappingFEImplementation::maybe_update_Jacobians<dim, spacedim>(
1159 computed_cell_similarity,
1164 internal::MappingFEImplementation::maybe_update_jacobian_grads<dim, spacedim>(
1165 computed_cell_similarity,
1173 spacedim>(computed_cell_similarity,
1181 spacedim>(computed_cell_similarity,
1187 internal::MappingFEImplementation::
1188 maybe_update_jacobian_pushed_forward_2nd_derivatives<dim, spacedim>(
1189 computed_cell_similarity,
1197 spacedim>(computed_cell_similarity,
1203 internal::MappingFEImplementation::
1204 maybe_update_jacobian_pushed_forward_3rd_derivatives<dim, spacedim>(
1205 computed_cell_similarity,
1211 const UpdateFlags update_flags = data.update_each;
1212 const std::vector<double> &weights = quadrature.
get_weights();
1230 if (dim == spacedim)
1240 1
e-12 * Utilities::fixed_power<dim>(
1241 cell->diameter() / std::sqrt(
double(dim))),
1243 cell->center(), det,
point)));
1253 for (
unsigned int i = 0; i < spacedim; ++i)
1254 for (
unsigned int j = 0; j < dim; ++j)
1258 for (
unsigned int i = 0; i < dim; ++i)
1259 for (
unsigned int j = 0; j < dim; ++j)
1260 G[i][j] = DX_t[i] * DX_t[j];
1265 if (computed_cell_similarity ==
1276 Assert(spacedim == dim + 1,
1278 "There is no (unique) cell normal for " +
1280 "-dimensional cells in " +
1282 "-dimensional space. This only works if the "
1283 "space dimension is one greater than the "
1284 "dimensionality of the mesh cells."));
1296 if (cell->direction_flag() ==
false)
1325 return computed_cell_similarity;
1332 namespace MappingFEImplementation
1346 template <
int dim,
int spacedim>
1349 const ::MappingFE<dim, spacedim> &mapping,
1350 const typename ::Triangulation<dim, spacedim>::cell_iterator
1352 const unsigned int face_no,
1353 const unsigned int subface_no,
1354 const unsigned int n_q_points,
1356 const typename ::MappingFE<dim, spacedim>::InternalData &data,
1360 const UpdateFlags update_flags = data.update_each;
1383 for (
unsigned int d = 0;
d != dim - 1; ++
d)
1385 Assert(face_no + cell->n_faces() *
d <
1386 data.unit_tangentials.size(),
1389 data.aux[
d].size() <=
1390 data.unit_tangentials[face_no + cell->n_faces() *
d].size(),
1395 data.unit_tangentials[face_no + cell->n_faces() *
d]),
1406 if (dim == spacedim)
1408 for (
unsigned int i = 0; i < n_q_points; ++i)
1418 (face_no == 0 ? -1 : +1);
1448 data.contravariant[
point].transpose()[0];
1450 (face_no == 0 ? -1. : +1.) *
1461 cell_normal /= cell_normal.
norm();
1473 for (
unsigned int i = 0; i < n_q_points; ++i)
1477 data.quadrature_weights[i + data_set];
1482 const double area_ratio =
1484 cell->subface_case(face_no), subface_no);
1493 for (
unsigned int i = 0; i < n_q_points; ++i)
1505 data.covariant[
point].transpose();
1516 template <
int dim,
int spacedim>
1519 const ::MappingFE<dim, spacedim> &mapping,
1520 const typename ::Triangulation<dim, spacedim>::cell_iterator
1522 const unsigned int face_no,
1523 const unsigned int subface_no,
1526 const typename ::MappingFE<dim, spacedim>::InternalData &data,
1530 const unsigned int n_q_points = quadrature.
size();
1532 maybe_compute_q_points<dim, spacedim>(data_set,
1545 maybe_update_jacobian_pushed_forward_grads<dim, spacedim>(
1551 maybe_update_jacobian_2nd_derivatives<dim, spacedim>(
1557 maybe_update_jacobian_pushed_forward_2nd_derivatives<dim, spacedim>(
1563 maybe_update_jacobian_3rd_derivatives<dim, spacedim>(
1569 maybe_update_jacobian_pushed_forward_3rd_derivatives<dim, spacedim>(
1591 template <
int dim,
int spacedim>
1595 const unsigned int face_no,
1626 cell->face_orientation(face_no),
1627 cell->face_flip(face_no),
1628 cell->face_rotation(face_no),
1630 quadrature[quadrature.
size() == 1 ? 0 : face_no],
1637 template <
int dim,
int spacedim>
1641 const unsigned int face_no,
1642 const unsigned int subface_no,
1674 cell->face_orientation(face_no),
1675 cell->face_flip(face_no),
1676 cell->face_rotation(face_no),
1678 cell->subface_case(face_no)),
1688 namespace MappingFEImplementation
1692 template <
int dim,
int spacedim,
int rank>
1709 const typename ::MappingFE<dim, spacedim>::InternalData *
>(
1710 &mapping_data) !=
nullptr),
1712 const typename ::MappingFE<dim, spacedim>::InternalData &data =
1714 const typename ::MappingFE<dim, spacedim>::InternalData &
>(
1717 switch (mapping_kind)
1724 "update_contravariant_transformation"));
1726 for (
unsigned int i = 0; i < input.size(); ++i)
1738 "update_contravariant_transformation"));
1742 "update_volume_elements"));
1747 for (
unsigned int i = 0; i < input.size(); ++i)
1751 output[i] /= data.volume_elements[i];
1763 "update_covariant_transformation"));
1765 for (
unsigned int i = 0; i < input.size(); ++i)
1777 template <
int dim,
int spacedim,
int rank>
1788 const typename ::MappingFE<dim, spacedim>::InternalData *
>(
1789 &mapping_data) !=
nullptr),
1791 const typename ::MappingFE<dim, spacedim>::InternalData &data =
1793 const typename ::MappingFE<dim, spacedim>::InternalData &
>(
1796 switch (mapping_kind)
1803 "update_covariant_transformation"));
1807 "update_contravariant_transformation"));
1810 for (
unsigned int i = 0; i < output.size(); ++i)
1827 "update_covariant_transformation"));
1830 for (
unsigned int i = 0; i < output.size(); ++i)
1847 "update_covariant_transformation"));
1851 "update_contravariant_transformation"));
1855 "update_volume_elements"));
1858 for (
unsigned int i = 0; i < output.size(); ++i)
1867 output[i] /= data.volume_elements[i];
1880 template <
int dim,
int spacedim>
1891 const typename ::MappingFE<dim, spacedim>::InternalData *
>(
1892 &mapping_data) !=
nullptr),
1894 const typename ::MappingFE<dim, spacedim>::InternalData &data =
1896 const typename ::MappingFE<dim, spacedim>::InternalData &
>(
1899 switch (mapping_kind)
1906 "update_covariant_transformation"));
1910 "update_contravariant_transformation"));
1912 for (
unsigned int q = 0; q < output.size(); ++q)
1913 for (
unsigned int i = 0; i < spacedim; ++i)
1915 double tmp1[dim][dim];
1916 for (
unsigned int J = 0; J < dim; ++J)
1917 for (
unsigned int K = 0; K < dim; ++K)
1920 data.contravariant[q][i][0] * input[q][0][J][K];
1921 for (
unsigned int I = 1; I < dim; ++I)
1923 data.contravariant[q][i][I] * input[q][I][J][K];
1925 for (
unsigned int j = 0; j < spacedim; ++j)
1928 for (
unsigned int K = 0; K < dim; ++K)
1930 tmp2[K] = data.covariant[q][j][0] * tmp1[0][K];
1931 for (
unsigned int J = 1; J < dim; ++J)
1932 tmp2[K] += data.covariant[q][j][J] * tmp1[J][K];
1934 for (
unsigned int k = 0; k < spacedim; ++k)
1936 output[q][i][j][k] =
1937 data.covariant[q][k][0] * tmp2[0];
1938 for (
unsigned int K = 1; K < dim; ++K)
1939 output[q][i][j][k] +=
1940 data.covariant[q][k][K] * tmp2[K];
1952 "update_covariant_transformation"));
1954 for (
unsigned int q = 0; q < output.size(); ++q)
1955 for (
unsigned int i = 0; i < spacedim; ++i)
1957 double tmp1[dim][dim];
1958 for (
unsigned int J = 0; J < dim; ++J)
1959 for (
unsigned int K = 0; K < dim; ++K)
1962 data.covariant[q][i][0] * input[q][0][J][K];
1963 for (
unsigned int I = 1; I < dim; ++I)
1965 data.covariant[q][i][I] * input[q][I][J][K];
1967 for (
unsigned int j = 0; j < spacedim; ++j)
1970 for (
unsigned int K = 0; K < dim; ++K)
1972 tmp2[K] = data.covariant[q][j][0] * tmp1[0][K];
1973 for (
unsigned int J = 1; J < dim; ++J)
1974 tmp2[K] += data.covariant[q][j][J] * tmp1[J][K];
1976 for (
unsigned int k = 0; k < spacedim; ++k)
1978 output[q][i][j][k] =
1979 data.covariant[q][k][0] * tmp2[0];
1980 for (
unsigned int K = 1; K < dim; ++K)
1981 output[q][i][j][k] +=
1982 data.covariant[q][k][K] * tmp2[K];
1995 "update_covariant_transformation"));
1999 "update_contravariant_transformation"));
2003 "update_volume_elements"));
2005 for (
unsigned int q = 0; q < output.size(); ++q)
2006 for (
unsigned int i = 0; i < spacedim; ++i)
2009 for (
unsigned int I = 0; I < dim; ++I)
2011 data.contravariant[q][i][I] / data.volume_elements[q];
2012 double tmp1[dim][dim];
2013 for (
unsigned int J = 0; J < dim; ++J)
2014 for (
unsigned int K = 0; K < dim; ++K)
2016 tmp1[J][K] = factor[0] * input[q][0][J][K];
2017 for (
unsigned int I = 1; I < dim; ++I)
2018 tmp1[J][K] += factor[I] * input[q][I][J][K];
2020 for (
unsigned int j = 0; j < spacedim; ++j)
2023 for (
unsigned int K = 0; K < dim; ++K)
2025 tmp2[K] = data.covariant[q][j][0] * tmp1[0][K];
2026 for (
unsigned int J = 1; J < dim; ++J)
2027 tmp2[K] += data.covariant[q][j][J] * tmp1[J][K];
2029 for (
unsigned int k = 0; k < spacedim; ++k)
2031 output[q][i][j][k] =
2032 data.covariant[q][k][0] * tmp2[0];
2033 for (
unsigned int K = 1; K < dim; ++K)
2034 output[q][i][j][k] +=
2035 data.covariant[q][k][K] * tmp2[K];
2050 template <
int dim,
int spacedim,
int rank>
2061 const typename ::MappingFE<dim, spacedim>::InternalData *
>(
2062 &mapping_data) !=
nullptr),
2064 const typename ::MappingFE<dim, spacedim>::InternalData &data =
2066 const typename ::MappingFE<dim, spacedim>::InternalData &
>(
2069 switch (mapping_kind)
2076 "update_covariant_transformation"));
2078 for (
unsigned int i = 0; i < output.size(); ++i)
2093 template <
int dim,
int spacedim>
2109 template <
int dim,
int spacedim>
2125 template <
int dim,
int spacedim>
2133 switch (mapping_kind)
2157 template <
int dim,
int spacedim>
2170 switch (mapping_kind)
2176 "update_covariant_transformation"));
2178 for (
unsigned int q = 0; q < output.size(); ++q)
2179 for (
unsigned int i = 0; i < spacedim; ++i)
2180 for (
unsigned int j = 0; j < spacedim; ++j)
2183 for (
unsigned int K = 0; K < dim; ++K)
2185 tmp[K] = data.
covariant[q][j][0] * input[q][i][0][K];
2186 for (
unsigned int J = 1; J < dim; ++J)
2187 tmp[K] += data.
covariant[q][j][J] * input[q][i][J][K];
2189 for (
unsigned int k = 0; k < spacedim; ++k)
2191 output[q][i][j][k] = data.
covariant[q][k][0] * tmp[0];
2192 for (
unsigned int K = 1; K < dim; ++K)
2193 output[q][i][j][k] += data.
covariant[q][k][K] * tmp[K];
2206 template <
int dim,
int spacedim>
2214 switch (mapping_kind)
2233 template <
int spacedim>
2235 check_all_manifold_ids_identical(
2243 template <
int spacedim>
2245 check_all_manifold_ids_identical(
2248 const auto b_id = cell->manifold_id();
2250 for (
const auto f : cell->face_indices())
2251 if (b_id != cell->face(f)->manifold_id())
2259 template <
int spacedim>
2261 check_all_manifold_ids_identical(
2264 const auto b_id = cell->manifold_id();
2266 for (
const auto f : cell->face_indices())
2267 if (b_id != cell->face(f)->manifold_id())
2270 for (
const auto l : cell->line_indices())
2271 if (b_id != cell->line(
l)->manifold_id())
2280 template <
int dim,
int spacedim>
2281 std::vector<Point<spacedim>>
2286 check_all_manifold_ids_identical(cell),
2288 "All entities of a cell need to have the same boundary id as the cell has."));
2292 for (
const unsigned int i : cell->vertex_indices())
2295 std::vector<Point<spacedim>> mapping_support_points(
2296 fe->get_unit_support_points().size());
2299 mapping_support_point_weights,
2300 mapping_support_points);
2302 return mapping_support_points;
2307 template <
int dim,
int spacedim>
2317 template <
int dim,
int spacedim>
2323 ExcMessage(
"The dimension of your mapping (" +
2325 ") and the reference cell cell_type (" +
2327 " ) do not agree."));
2335 #include "mapping_fe.inst"
ArrayView< typename std::remove_reference< typename std::iterator_traits< Iterator >::reference >::type, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
Triangulation< dim, spacedim >::cell_iterator cell_of_current_support_points
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
void initialize(const UpdateFlags update_flags, const Quadrature< dim > &quadrature, const unsigned int n_original_q_points)
std::vector< DerivativeForm< 1, dim, spacedim > > contravariant
std::vector< DerivativeForm< 1, dim, spacedim > > covariant
void compute_shape_function_values(const std::vector< Point< dim >> &unit_points)
virtual std::size_t memory_consumption() const override
InternalData(const FiniteElement< dim, spacedim > &fe)
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
const unsigned int polynomial_degree
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
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 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
Table< 2, double > mapping_support_point_weights
virtual std::vector< Point< spacedim > > compute_mapping_support_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell) const
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
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 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 bool is_compatible_with(const ReferenceCell &reference_cell) 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
Abstract base class for mapping classes.
static DataSetDescriptor cell()
const std::vector< Point< dim > > & get_points() const
const std::vector< double > & get_weights() const
unsigned int size() const
constexpr SymmetricTensor< 2, dim, Number > invert(const SymmetricTensor< 2, dim, Number > &t)
constexpr Number determinant(const SymmetricTensor< 2, dim, Number > &t)
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)
numbers::NumberTraits< Number >::real_type norm() const
Triangulation< dim, spacedim > & get_triangulation()
unsigned int n_vertices() const
unsigned int size() const
unsigned int max_n_quadrature_points() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
@ 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
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
#define Assert(cond, exc)
static ::ExceptionBase & ExcNotImplemented()
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
void loop(ITERATOR begin, typename identity< ITERATOR >::type end, DOFINFO &dinfo, INFOBOX &info, const std::function< void(DOFINFO &, typename INFOBOX::CellInfo &)> &cell_worker, const std::function< void(DOFINFO &, typename INFOBOX::CellInfo &)> &boundary_worker, const std::function< void(DOFINFO &, DOFINFO &, typename INFOBOX::CellInfo &, typename INFOBOX::CellInfo &)> &face_worker, ASSEMBLER &assembler, const LoopControl &lctrl=LoopControl())
const Manifold< dim, spacedim > & get_manifold(const types::manifold_id number) const
@ mapping_covariant_gradient
@ mapping_contravariant_hessian
@ mapping_covariant_hessian
@ mapping_contravariant_gradient
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell &reference_cell)
std::enable_if< std::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)
Point< spacedim > point(const gp_Pnt &p, const double tolerance=1e-10)
void quadrature_points(const Triangulation< dim, spacedim > &triangulation, const Quadrature< dim > &quadrature, const std::vector< std::vector< BoundingBox< spacedim >>> &global_bounding_boxes, ParticleHandler< dim, spacedim > &particle_handler, const Mapping< dim, spacedim > &mapping=(ReferenceCells::get_hypercube< dim >() .template get_default_linear_mapping< dim, spacedim >()), const std::vector< std::vector< double >> &properties={})
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
VectorType::value_type * begin(VectorType &V)
VectorType::value_type * end(VectorType &V)
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 maybe_update_jacobian_pushed_forward_3rd_derivatives(const CellSimilarity::Similarity cell_similarity, const typename QProjector< dim >::DataSetDescriptor data_set, const typename ::MappingQGeneric< dim, spacedim >::InternalData &data, std::vector< Tensor< 5, spacedim >> &jacobian_pushed_forward_3rd_derivatives)
void transform_fields(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 maybe_update_Jacobians(const CellSimilarity::Similarity cell_similarity, const typename ::QProjector< dim >::DataSetDescriptor data_set, const typename ::MappingQGeneric< dim, spacedim >::InternalData &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 maybe_update_jacobian_2nd_derivatives(const CellSimilarity::Similarity cell_similarity, const typename QProjector< dim >::DataSetDescriptor data_set, const typename ::MappingQGeneric< dim, spacedim >::InternalData &data, std::vector< DerivativeForm< 3, dim, spacedim >> &jacobian_2nd_derivatives)
void maybe_update_jacobian_pushed_forward_2nd_derivatives(const CellSimilarity::Similarity cell_similarity, const typename QProjector< dim >::DataSetDescriptor data_set, const typename ::MappingQGeneric< dim, spacedim >::InternalData &data, std::vector< Tensor< 4, spacedim >> &jacobian_pushed_forward_2nd_derivatives)
void maybe_compute_q_points(const typename QProjector< dim >::DataSetDescriptor data_set, const typename ::MappingQGeneric< dim, spacedim >::InternalData &data, std::vector< Point< spacedim >> &quadrature_points)
void maybe_update_jacobian_pushed_forward_grads(const CellSimilarity::Similarity cell_similarity, const typename QProjector< dim >::DataSetDescriptor data_set, const typename ::MappingQGeneric< dim, spacedim >::InternalData &data, std::vector< Tensor< 3, spacedim >> &jacobian_pushed_forward_grads)
void maybe_update_jacobian_3rd_derivatives(const CellSimilarity::Similarity cell_similarity, const typename QProjector< dim >::DataSetDescriptor data_set, const typename ::MappingQGeneric< dim, spacedim >::InternalData &data, std::vector< DerivativeForm< 4, dim, spacedim >> &jacobian_3rd_derivatives)
void do_fill_fe_face_values(const ::MappingQGeneric< 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 ::MappingQGeneric< dim, spacedim >::InternalData &data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data)
void maybe_update_jacobian_grads(const CellSimilarity::Similarity cell_similarity, const typename QProjector< dim >::DataSetDescriptor data_set, const typename ::MappingQGeneric< dim, spacedim >::InternalData &data, std::vector< DerivativeForm< 2, dim, spacedim >> &jacobian_grads)
void maybe_compute_face_data(const ::MappingQGeneric< 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 ::MappingQGeneric< dim, spacedim >::InternalData &data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data)
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 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)
static const unsigned int invalid_unsigned_int
static double subface_ratio(const internal::SubfaceCase< dim > &subface_case, const unsigned int subface_no)
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)