16 #include <deal.II/base/utilities.h> 17 #include <deal.II/base/polynomial.h> 18 #include <deal.II/base/quadrature.h> 19 #include <deal.II/base/quadrature_lib.h> 20 #include <deal.II/base/qprojector.h> 21 #include <deal.II/base/memory_consumption.h> 22 #include <deal.II/base/tensor_product_polynomials.h> 23 #include <deal.II/base/std_cxx11/unique_ptr.h> 24 #include <deal.II/lac/full_matrix.h> 25 #include <deal.II/grid/tria_iterator.h> 26 #include <deal.II/grid/tria_boundary.h> 27 #include <deal.II/dofs/dof_accessor.h> 28 #include <deal.II/fe/fe_tools.h> 29 #include <deal.II/fe/fe_values.h> 30 #include <deal.II/fe/fe_system.h> 31 #include <deal.II/fe/mapping_fe_field.h> 32 #include <deal.II/fe/fe_q.h> 33 #include <deal.II/fe/mapping.h> 34 #include <deal.II/fe/mapping_q1.h> 35 #include <deal.II/base/qprojector.h> 36 #include <deal.II/base/thread_management.h> 37 #include <deal.II/numerics/vector_tools.h> 44 DEAL_II_NAMESPACE_OPEN
47 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
60 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
64 Assert (
false, ExcNotImplemented());
70 template<
int dim,
int spacedim,
typename DoFHandlerType,
typename VectorType>
73 (
const unsigned int qpoint,
74 const unsigned int shape_nr)
83 template<
int dim,
int spacedim,
typename DoFHandlerType,
typename VectorType>
86 (
const unsigned int qpoint,
87 const unsigned int shape_nr)
const 97 template<
int dim,
int spacedim,
typename DoFHandlerType,
typename VectorType>
100 (
const unsigned int qpoint,
101 const unsigned int shape_nr)
110 template <
int dim,
int spacedim,
typename DoFHandlerType,
typename VectorType>
113 (
const unsigned int qpoint,
114 const unsigned int shape_nr)
const 124 template <
int dim,
int spacedim,
typename DoFHandlerType,
typename VectorType>
127 (
const unsigned int qpoint,
128 const unsigned int shape_nr)
137 template <
int dim,
int spacedim,
typename DoFHandlerType,
typename VectorType>
140 (
const unsigned int qpoint,
141 const unsigned int shape_nr)
const 151 template <
int dim,
int spacedim,
typename DoFHandlerType,
typename VectorType>
154 (
const unsigned int qpoint,
155 const unsigned int shape_nr)
164 template <
int dim,
int spacedim,
typename DoFHandlerType,
typename VectorType>
167 (
const unsigned int qpoint,
168 const unsigned int shape_nr)
const 178 template <
int dim,
int spacedim,
typename DoFHandlerType,
typename VectorType>
181 (
const unsigned int qpoint,
182 const unsigned int shape_nr)
192 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
199 fe(&euler_dof_handler.get_fe()),
201 fe_mask(mask.
size() ? mask :
205 unsigned int size = 0;
206 for (
unsigned int i=0; i<fe_mask.size(); ++i)
215 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
222 fe_mask(mapping.fe_mask),
228 template<
int dim,
int spacedim,
typename DoFHandlerType,
typename VectorType>
232 (
const unsigned int qpoint,
233 const unsigned int shape_nr)
const 243 template <
int dim,
int spacedim,
typename DoFHandlerType,
typename VectorType>
252 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
258 const unsigned int n_points=unit_points.size();
260 for (
unsigned int point=0; point<n_points; ++point)
285 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
296 for (
unsigned int i=0; i<5; ++i)
344 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
349 const unsigned int n_original_q_points,
357 const unsigned int n_q_points = q.
size();
375 data.
covariant.resize(n_original_q_points);
396 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
401 const unsigned int n_original_q_points,
404 compute_data (update_flags, q, n_original_q_points, data);
421 static const int tangential_orientation[4]= {-1,1,1,-1};
422 for (
unsigned int i=0; i<nfaces; ++i)
425 tang[1-i/2]=tangential_orientation[i];
432 for (
unsigned int i=0; i<nfaces; ++i)
436 const unsigned int nd=
448 tang2[(nd+2)%dim]=1.;
464 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
471 this->compute_data (update_flags, quadrature,
472 quadrature.
size(), *data);
478 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
486 this->compute_face_data (update_flags, q,
487 quadrature.
size(), *data);
493 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
501 this->compute_face_data (update_flags, q,
502 quadrature.
size(), *data);
519 template <
int dim,
int spacedim>
521 maybe_compute_q_points (
const typename ::QProjector<dim>::DataSetDescriptor data_set,
522 const typename ::MappingFEField<dim,spacedim>::InternalData &data,
532 for (
unsigned int point=0; point<quadrature_points.size(); ++point)
535 const double *
shape = &data.shape(point+data_set,0);
537 for (
unsigned int k=0; k<data.n_shape_functions; ++k)
541 result[fe_to_real[comp_k]] += data.local_dof_values[k] * shape[k];
544 quadrature_points[point] = result;
556 template <
int dim,
int spacedim>
558 maybe_update_Jacobians (
const CellSimilarity::Similarity cell_similarity,
559 const typename ::QProjector<dim>::DataSetDescriptor data_set,
560 const typename ::MappingFEField<dim,spacedim>::InternalData &data,
563 const std::vector<unsigned int> &fe_to_real)
573 if (cell_similarity != CellSimilarity::translation)
575 const unsigned int n_q_points = data.contravariant.size();
577 Assert (data.n_shape_functions > 0, ExcInternalError());
579 for (
unsigned int point=0; point<n_q_points; ++point)
582 &data.derivative(point+data_set, 0);
586 for (
unsigned int k=0; k<data.n_shape_functions; ++k)
590 result[fe_to_real[comp_k]] += data.local_dof_values[k] * data_derv[k];
594 for (
unsigned int i=0; i<spacedim; ++i)
596 data.contravariant[point][i] = result[i];
605 if (cell_similarity != CellSimilarity::translation)
606 for (
unsigned int point=0; point<data.contravariant.size(); ++point)
607 data.covariant[point] = (data.contravariant[point]).covariant_form();
613 if (cell_similarity != CellSimilarity::translation)
614 for (
unsigned int point=0; point<data.contravariant.size(); ++point)
615 data.volume_elements[point] = data.contravariant[point].determinant();
625 template <
int dim,
int spacedim>
627 maybe_update_jacobian_grads (
const CellSimilarity::Similarity cell_similarity,
628 const typename ::QProjector<dim>::DataSetDescriptor data_set,
629 const typename ::MappingFEField<dim,spacedim>::InternalData &data,
632 const std::vector<unsigned int> &fe_to_real,
638 const unsigned int n_q_points = jacobian_grads.size();
640 if (cell_similarity != CellSimilarity::translation)
642 for (
unsigned int point=0; point<n_q_points; ++point)
645 &data.second_derivative(point+data_set, 0);
649 for (
unsigned int k=0; k<data.n_shape_functions; ++k)
653 for (
unsigned int j=0; j<dim; ++j)
654 for (
unsigned int l=0; l<dim; ++l)
655 result[fe_to_real[comp_k]][j][l] += (second[k][j][l]
656 * data.local_dof_values[k]);
661 for (
unsigned int i=0; i<spacedim; ++i)
662 for (
unsigned int j=0; j<dim; ++j)
663 for (
unsigned int l=0; l<dim; ++l)
664 jacobian_grads[point][i][j][l] = result[i][j][l];
676 template <
int dim,
int spacedim>
678 maybe_update_jacobian_pushed_forward_grads (
679 const CellSimilarity::Similarity cell_similarity,
680 const typename ::QProjector<dim>::DataSetDescriptor data_set,
681 const typename ::MappingFEField<dim,spacedim>::InternalData &data,
684 const std::vector<unsigned int> &fe_to_real,
690 const unsigned int n_q_points = jacobian_pushed_forward_grads.size();
692 if (cell_similarity != CellSimilarity::translation)
694 double tmp[spacedim][spacedim][spacedim];
695 for (
unsigned int point=0; point<n_q_points; ++point)
698 &data.second_derivative(point+data_set, 0);
702 for (
unsigned int k=0; k<data.n_shape_functions; ++k)
706 for (
unsigned int j=0; j<dim; ++j)
707 for (
unsigned int l=0; l<dim; ++l)
708 result[fe_to_real[comp_k]][j][l] += (second[k][j][l]
709 * data.local_dof_values[k]);
713 for (
unsigned int i=0; i<spacedim; ++i)
714 for (
unsigned int j=0; j<spacedim; ++j)
715 for (
unsigned int l=0; l<dim; ++l)
717 tmp[i][j][l] = result[i][0][l] *
718 data.covariant[point][j][0];
719 for (
unsigned int jr=1; jr<dim; ++jr)
721 tmp[i][j][l] += result[i][jr][l] *
722 data.covariant[point][j][jr];
727 for (
unsigned int i=0; i<spacedim; ++i)
728 for (
unsigned int j=0; j<spacedim; ++j)
729 for (
unsigned int l=0; l<spacedim; ++l)
731 jacobian_pushed_forward_grads[point][i][j][l] = tmp[i][j][0] *
732 data.covariant[point][l][0];
733 for (
unsigned int lr=1; lr<dim; ++lr)
735 jacobian_pushed_forward_grads[point][i][j][l] += tmp[i][j][lr] *
736 data.covariant[point][l][lr];
751 template <
int dim,
int spacedim>
753 maybe_update_jacobian_2nd_derivatives (
const CellSimilarity::Similarity cell_similarity,
754 const typename ::QProjector<dim>::DataSetDescriptor data_set,
755 const typename ::MappingFEField<dim,spacedim>::InternalData &data,
758 const std::vector<unsigned int> &fe_to_real,
764 const unsigned int n_q_points = jacobian_2nd_derivatives.size();
766 if (cell_similarity != CellSimilarity::translation)
768 for (
unsigned int point=0; point<n_q_points; ++point)
771 &data.third_derivative(point+data_set, 0);
775 for (
unsigned int k=0; k<data.n_shape_functions; ++k)
779 for (
unsigned int j=0; j<dim; ++j)
780 for (
unsigned int l=0; l<dim; ++l)
781 for (
unsigned int m=0; m<dim; ++m)
782 result[fe_to_real[comp_k]][j][l][m] += (third[k][j][l][m]
783 * data.local_dof_values[k]);
788 for (
unsigned int i=0; i<spacedim; ++i)
789 for (
unsigned int j=0; j<dim; ++j)
790 for (
unsigned int l=0; l<dim; ++l)
791 for (
unsigned int m=0; m<dim; ++m)
792 jacobian_2nd_derivatives[point][i][j][l][m] = result[i][j][l][m];
804 template <
int dim,
int spacedim>
806 maybe_update_jacobian_pushed_forward_2nd_derivatives (
807 const CellSimilarity::Similarity cell_similarity,
808 const typename ::QProjector<dim>::DataSetDescriptor data_set,
809 const typename ::MappingFEField<dim,spacedim>::InternalData &data,
812 const std::vector<unsigned int> &fe_to_real,
818 const unsigned int n_q_points = jacobian_pushed_forward_2nd_derivatives.size();
820 if (cell_similarity != CellSimilarity::translation)
822 double tmp[spacedim][spacedim][spacedim][spacedim];
823 for (
unsigned int point=0; point<n_q_points; ++point)
826 &data.third_derivative(point+data_set, 0);
830 for (
unsigned int k=0; k<data.n_shape_functions; ++k)
834 for (
unsigned int j=0; j<dim; ++j)
835 for (
unsigned int l=0; l<dim; ++l)
836 for (
unsigned int m=0; m<dim; ++m)
837 result[fe_to_real[comp_k]][j][l][m] += (third[k][j][l][m]
838 * data.local_dof_values[k]);
842 for (
unsigned int i=0; i<spacedim; ++i)
843 for (
unsigned int j=0; j<spacedim; ++j)
844 for (
unsigned int l=0; l<dim; ++l)
845 for (
unsigned int m=0; m<dim; ++m)
847 jacobian_pushed_forward_2nd_derivatives[point][i][j][l][m]
848 = result[i][0][l][m]*
849 data.covariant[point][j][0];
850 for (
unsigned int jr=1; jr<dim; ++jr)
851 jacobian_pushed_forward_2nd_derivatives[point][i][j][l][m]
852 += result[i][jr][l][m]*
853 data.covariant[point][j][jr];
857 for (
unsigned int i=0; i<spacedim; ++i)
858 for (
unsigned int j=0; j<spacedim; ++j)
859 for (
unsigned int l=0; l<spacedim; ++l)
860 for (
unsigned int m=0; m<dim; ++m)
863 = jacobian_pushed_forward_2nd_derivatives[point][i][j][0][m]*
864 data.covariant[point][l][0];
865 for (
unsigned int lr=1; lr<dim; ++lr)
867 += jacobian_pushed_forward_2nd_derivatives[point][i][j][lr][m]*
868 data.covariant[point][l][lr];
872 for (
unsigned int i=0; i<spacedim; ++i)
873 for (
unsigned int j=0; j<spacedim; ++j)
874 for (
unsigned int l=0; l<spacedim; ++l)
875 for (
unsigned int m=0; m<spacedim; ++m)
877 jacobian_pushed_forward_2nd_derivatives[point][i][j][l][m]
879 data.covariant[point][m][0];
880 for (
unsigned int mr=1; mr<dim; ++mr)
881 jacobian_pushed_forward_2nd_derivatives[point][i][j][l][m]
883 data.covariant[point][m][mr];
897 template <
int dim,
int spacedim>
900 const typename ::QProjector<dim>::DataSetDescriptor data_set,
901 const typename ::MappingFEField<dim,spacedim>::InternalData &data,
910 const unsigned int n_q_points = jacobian_3rd_derivatives.size();
912 if (cell_similarity != CellSimilarity::translation)
914 for (
unsigned int point=0; point<n_q_points; ++point)
917 &data.fourth_derivative(point+data_set, 0);
921 for (
unsigned int k=0; k<data.n_shape_functions; ++k)
925 for (
unsigned int j=0; j<dim; ++j)
926 for (
unsigned int l=0; l<dim; ++l)
927 for (
unsigned int m=0; m<dim; ++m)
928 for (
unsigned int n=0; n<dim; ++n)
929 result[fe_to_real[comp_k]][j][l][m][n] += (fourth[k][j][l][m][n]
930 * data.local_dof_values[k]);
935 for (
unsigned int i=0; i<spacedim; ++i)
936 for (
unsigned int j=0; j<dim; ++j)
937 for (
unsigned int l=0; l<dim; ++l)
938 for (
unsigned int m=0; m<dim; ++m)
939 for (
unsigned int n=0; n<dim; ++n)
940 jacobian_3rd_derivatives[point][i][j][l][m][n] = result[i][j][l][m][n];
953 template <
int dim,
int spacedim>
956 const CellSimilarity::Similarity cell_similarity,
957 const typename ::QProjector<dim>::DataSetDescriptor data_set,
958 const typename ::MappingFEField<dim,spacedim>::InternalData &data,
967 const unsigned int n_q_points = jacobian_pushed_forward_3rd_derivatives.size();
969 if (cell_similarity != CellSimilarity::translation)
971 double tmp[spacedim][spacedim][spacedim][spacedim][spacedim];
972 for (
unsigned int point=0; point<n_q_points; ++point)
975 &data.fourth_derivative(point+data_set, 0);
979 for (
unsigned int k=0; k<data.n_shape_functions; ++k)
983 for (
unsigned int j=0; j<dim; ++j)
984 for (
unsigned int l=0; l<dim; ++l)
985 for (
unsigned int m=0; m<dim; ++m)
986 for (
unsigned int n=0; n<dim; ++n)
987 result[fe_to_real[comp_k]][j][l][m][n]
988 += (fourth[k][j][l][m][n]
989 * data.local_dof_values[k]);
993 for (
unsigned int i=0; i<spacedim; ++i)
994 for (
unsigned int j=0; j<spacedim; ++j)
995 for (
unsigned int l=0; l<dim; ++l)
996 for (
unsigned int m=0; m<dim; ++m)
997 for (
unsigned int n=0; n<dim; ++n)
999 tmp[i][j][l][m][n] = result[i][0][l][m][n] *
1000 data.covariant[point][j][0];
1001 for (
unsigned int jr=1; jr<dim; ++jr)
1002 tmp[i][j][l][m][n] += result[i][jr][l][m][n] *
1003 data.covariant[point][j][jr];
1007 for (
unsigned int i=0; i<spacedim; ++i)
1008 for (
unsigned int j=0; j<spacedim; ++j)
1009 for (
unsigned int l=0; l<spacedim; ++l)
1010 for (
unsigned int m=0; m<dim; ++m)
1011 for (
unsigned int n=0; n<dim; ++n)
1013 jacobian_pushed_forward_3rd_derivatives[point][i][j][l][m][n]
1014 = tmp[i][j][0][m][n] *
1015 data.covariant[point][l][0];
1016 for (
unsigned int lr=1; lr<dim; ++lr)
1017 jacobian_pushed_forward_3rd_derivatives[point][i][j][l][m][n]
1018 += tmp[i][j][lr][m][n] *
1019 data.covariant[point][l][lr];
1023 for (
unsigned int i=0; i<spacedim; ++i)
1024 for (
unsigned int j=0; j<spacedim; ++j)
1025 for (
unsigned int l=0; l<spacedim; ++l)
1026 for (
unsigned int m=0; m<spacedim; ++m)
1027 for (
unsigned int n=0; n<dim; ++n)
1030 = jacobian_pushed_forward_3rd_derivatives[point][i][j][l][0][n] *
1031 data.covariant[point][m][0];
1032 for (
unsigned int mr=1; mr<dim; ++mr)
1034 += jacobian_pushed_forward_3rd_derivatives[point][i][j][l][mr][n] *
1035 data.covariant[point][m][mr];
1039 for (
unsigned int i=0; i<spacedim; ++i)
1040 for (
unsigned int j=0; j<spacedim; ++j)
1041 for (
unsigned int l=0; l<spacedim; ++l)
1042 for (
unsigned int m=0; m<spacedim; ++m)
1043 for (
unsigned int n=0; n<spacedim; ++n)
1045 jacobian_pushed_forward_3rd_derivatives[point][i][j][l][m][n]
1046 = tmp[i][j][l][m][0] *
1047 data.covariant[point][n][0];
1048 for (
unsigned int nr=1; nr<dim; ++nr)
1049 jacobian_pushed_forward_3rd_derivatives[point][i][j][l][m][n]
1050 += tmp[i][j][l][m][nr] *
1051 data.covariant[point][n][nr];
1068 template <
int dim,
int spacedim>
1071 const typename ::Triangulation<dim,spacedim>::cell_iterator &cell,
1072 const unsigned int face_no,
1073 const unsigned int subface_no,
1074 const std::vector<double> &weights,
1075 const typename ::MappingFEField<dim,spacedim>::InternalData &data,
1078 const UpdateFlags update_flags = data.update_each;
1082 const unsigned int n_q_points = output_data.
boundary_forms.size();
1091 for (
unsigned int d=0; d!=dim-1; ++d)
1094 data.unit_tangentials.size(),
1095 ExcInternalError());
1096 Assert (data.aux[d].size() <=
1098 ExcInternalError());
1103 make_array_view(data.aux[d]));
1108 if (dim == spacedim)
1110 for (
unsigned int i=0; i<n_q_points; ++i)
1122 output_data.
boundary_forms[i] = cross_product_2d(data.aux[0][i]);
1126 cross_product_3d(data.aux[0][i], data.aux[1][i]);
1129 Assert(
false, ExcNotImplemented());
1142 for (
unsigned int point=0; point<n_q_points; ++point)
1147 output_data.
boundary_forms[point] = data.contravariant[point].transpose()[0];
1149 (face_no == 0 ? -1. : +1.) * output_data.
boundary_forms[point].norm();
1159 cross_product_3d(DX_t[0], DX_t[1]);
1160 cell_normal /= cell_normal.
norm();
1165 cross_product_3d(data.aux[0][point], cell_normal);
1171 if (update_flags & (update_normal_vectors | update_JxW_values))
1174 if (update_flags & update_JxW_values)
1181 cell->subface_case(face_no), subface_no);
1186 if (update_flags & update_normal_vectors)
1191 for (
unsigned int point=0; point<n_q_points; ++point)
1192 output_data.
jacobians[point] = data.contravariant[point];
1195 for (
unsigned int point=0; point<n_q_points; ++point)
1206 template<
int dim,
int spacedim>
1209 const typename ::Triangulation<dim,spacedim>::cell_iterator &cell,
1210 const unsigned int face_no,
1211 const unsigned int subface_no,
1212 const typename ::QProjector<dim>::DataSetDescriptor data_set,
1214 const typename ::MappingFEField<dim,spacedim>::InternalData &data,
1220 maybe_compute_q_points<dim,spacedim> (data_set,
1225 maybe_update_Jacobians<dim,spacedim> (CellSimilarity::none,
1230 maybe_update_jacobian_grads<dim,spacedim> (CellSimilarity::none,
1236 maybe_update_jacobian_pushed_forward_grads<dim,spacedim> (CellSimilarity::none,
1242 maybe_update_jacobian_2nd_derivatives<dim,spacedim> (CellSimilarity::none,
1248 maybe_update_jacobian_pushed_forward_2nd_derivatives<dim,spacedim> (CellSimilarity::none,
1254 maybe_update_jacobian_3rd_derivatives<dim,spacedim> (CellSimilarity::none,
1260 maybe_update_jacobian_pushed_forward_3rd_derivatives<dim,spacedim> (CellSimilarity::none,
1267 cell, face_no, subface_no,
1276 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1277 CellSimilarity::Similarity
1280 const CellSimilarity::Similarity cell_similarity,
1287 Assert (dynamic_cast<const InternalData *> (&internal_data) != 0, ExcInternalError());
1290 const unsigned int n_q_points=quadrature.
size();
1291 const CellSimilarity::Similarity updated_cell_similarity
1296 CellSimilarity::invalid_next_cell);
1304 internal::maybe_update_Jacobians(cell_similarity,
1308 const UpdateFlags update_flags = data.update_each;
1309 const std::vector<double> &weights=quadrature.
get_weights();
1320 ExcDimensionMismatch(output_data.
normal_vectors.size(), n_q_points));
1323 if (cell_similarity != CellSimilarity::translation)
1324 for (
unsigned int point=0; point<n_q_points; ++point)
1326 if (dim == spacedim)
1328 const double det = data.contravariant[point].determinant();
1335 Assert (det > 1e-12*Utilities::fixed_power<dim>(cell->diameter()/
1336 std::sqrt(
double(dim))),
1338 output_data.
JxW_values[point] = weights[point] * det;
1346 for (
unsigned int i=0; i<spacedim; ++i)
1347 for (
unsigned int j=0; j<dim; ++j)
1348 DX_t[j][i] = data.contravariant[point][i][j];
1351 for (
unsigned int i=0; i<dim; ++i)
1352 for (
unsigned int j=0; j<dim; ++j)
1353 G[i][j] = DX_t[i] * DX_t[j];
1355 output_data.
JxW_values[point] = sqrt(determinant(G)) * weights[point];
1357 if (cell_similarity == CellSimilarity::inverted_translation)
1360 if (update_flags & update_normal_vectors)
1365 if (update_flags & update_normal_vectors)
1367 Assert (spacedim - dim == 1,
1368 ExcMessage(
"There is no cell normal in codim 2."));
1372 cross_product_2d(-DX_t[0]);
1375 cross_product_3d(DX_t[0], DX_t[1]);
1379 if (cell->direction_flag() ==
false)
1392 if (cell_similarity != CellSimilarity::translation)
1393 for (
unsigned int point=0; point<n_q_points; ++point)
1394 output_data.
jacobians[point] = data.contravariant[point];
1401 if (cell_similarity != CellSimilarity::translation)
1402 for (
unsigned int point=0; point<n_q_points; ++point)
1407 internal::maybe_update_jacobian_grads(cell_similarity,
1413 internal::maybe_update_jacobian_pushed_forward_grads(cell_similarity,
1419 internal::maybe_update_jacobian_2nd_derivatives(cell_similarity,
1425 internal::maybe_update_jacobian_pushed_forward_2nd_derivatives(cell_similarity,
1443 return updated_cell_similarity;
1448 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1452 const unsigned int face_no,
1459 Assert (dynamic_cast<const InternalData *> (&internal_data) != 0,
1460 ExcInternalError());
1469 cell->face_orientation(face_no),
1470 cell->face_flip(face_no),
1471 cell->face_rotation(face_no),
1480 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1484 const unsigned int face_no,
1485 const unsigned int subface_no,
1492 Assert (dynamic_cast<const InternalData *> (&internal_data) != 0,
1493 ExcInternalError());
1501 subface (face_no, subface_no,
1502 cell->face_orientation(face_no),
1503 cell->face_flip(face_no),
1504 cell->face_rotation(face_no),
1506 cell->subface_case(face_no)),
1516 template<
int dim,
int spacedim,
int rank,
typename VectorType,
typename DoFHandlerType>
1525 ExcInternalError());
1529 switch (mapping_type)
1536 for (
unsigned int i=0; i<output.size(); ++i)
1537 output[i] = apply_transformation(data.
contravariant[i], input[i]);
1549 for (
unsigned int i=0; i<output.size(); ++i)
1551 output[i] = apply_transformation(data.
contravariant[i], input[i]);
1566 for (
unsigned int i=0; i<output.size(); ++i)
1567 output[i] = apply_transformation(data.
covariant[i], input[i]);
1573 Assert(
false, ExcNotImplemented());
1578 template<
int dim,
int spacedim,
int rank,
typename VectorType,
typename DoFHandlerType>
1580 transform_differential_forms
1589 ExcInternalError());
1593 switch (mapping_type)
1600 for (
unsigned int i=0; i<output.size(); ++i)
1601 output[i] = apply_transformation(data.
covariant[i], input[i]);
1606 Assert(
false, ExcNotImplemented());
1614 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1624 transform_fields<dim,spacedim,1,VectorType,DoFHandlerType>(input, mapping_type, mapping_data, output);
1629 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1639 transform_differential_forms<dim,spacedim,1,VectorType,DoFHandlerType>(input, mapping_type, mapping_data, output);
1644 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1662 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1671 Assert (dynamic_cast<const InternalData *>(&mapping_data) != 0,
1672 ExcInternalError());
1675 switch (mapping_type)
1682 for (
unsigned int q=0; q<output.
size(); ++q)
1683 for (
unsigned int i=0; i<spacedim; ++i)
1684 for (
unsigned int j=0; j<spacedim; ++j)
1685 for (
unsigned int k=0; k<spacedim; ++k)
1687 output[q][i][j][k] = data.
covariant[q][j][0]
1689 * input[q][i][0][0];
1690 for (
unsigned int J=0; J<dim; ++J)
1692 const unsigned int K0 = (0==J)? 1 : 0;
1693 for (
unsigned int K=K0; K<dim; ++K)
1694 output[q][i][j][k] += data.
covariant[q][j][J]
1696 * input[q][i][J][K];
1704 Assert(
false, ExcNotImplemented());
1711 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1731 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1750 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1760 if (fe_mask[comp_i])
1769 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1788 for (
unsigned int d=0; d<dim; ++d)
1789 initial_p_unit[d] = 0.5;
1802 std_cxx11::unique_ptr<InternalData>
1803 mdata (
get_data(update_flags,point_quadrature));
1812 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1823 Assert(n_shapes!=0, ExcInternalError());
1841 const double eps = 1.e-12*cell->diameter();
1842 const unsigned int newton_iteration_limit = 20;
1843 unsigned int newton_iteration=0;
1853 if (fe_mask[comp_k])
1854 for (
unsigned int j=0; j<dim; ++j)
1857 for (
unsigned int j=0; j<dim; ++j)
1859 f[j] = DF[j] * p_minus_F;
1860 for (
unsigned int l=0; l<dim; ++l)
1861 df[j][l] = -DF[j] * DF[l];
1867 double step_length = 1;
1880 for (
unsigned int i=0; i<dim; ++i)
1881 p_unit_trial[i] -= step_length * delta[i];
1890 if (f_trial.
norm() < p_minus_F.
norm())
1892 p_real = p_real_trial;
1893 p_unit = p_unit_trial;
1894 p_minus_F = f_trial;
1897 else if (step_length > 0.05)
1904 if (newton_iteration > newton_iteration_limit)
1920 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1928 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1932 return this->fe_mask;
1936 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1944 template<
int dim,
int spacedim,
typename VectorType,
typename DoFHandlerType>
1952 typename DoFHandlerType::cell_iterator dof_cell(*cell, euler_dof_handler);
1953 Assert (dof_cell->active() ==
true, ExcInactiveCell());
1962 #include "mapping_fe_field.inst" 1965 DEAL_II_NAMESPACE_CLOSE
Transformed quadrature weights.
static const unsigned int invalid_unsigned_int
#define AssertDimension(dim1, dim2)
virtual Mapping< dim, spacedim >::InternalDataBase * get_subface_data(const UpdateFlags flags, const Quadrature< dim-1 > &quadrature) const
Contravariant transformation.
virtual Tensor< 3, dim > shape_3rd_derivative(const unsigned int i, const Point< dim > &p) const
const std::vector< Point< dim > > & get_points() const
unsigned int n_shape_functions
const std::vector< double > & get_weights() const
virtual std::size_t memory_consumption() const
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const
::ExceptionBase & ExcMessage(std::string arg1)
const unsigned int degree
Outer normal vector, not normalized.
std::vector< unsigned int > fe_to_real
Determinant of the Jacobian.
Transformed quadrature points.
SmartPointer< const FiniteElement< dim, spacedim >, MappingFEField< dim, spacedim, VectorType, DoFHandlerType > > fe
#define AssertThrow(cond, exc)
numbers::NumberTraits< Number >::real_type norm() const
Point< spacedim > do_transform_unit_to_real_cell(const InternalData &mdata) const
unsigned int get_degree() const
virtual Mapping< dim, spacedim > * clone() const
std::vector< DerivativeForm< 1, dim, spacedim > > covariant
std::vector< std::vector< Tensor< 1, dim > > > unit_tangentials
virtual Point< dim > transform_real_to_unit_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< spacedim > &p) const
InternalData(const FiniteElement< dim, spacedim > &fe, const ComponentMask mask)
void maybe_update_jacobian_pushed_forward_3rd_derivatives(const CellSimilarity::Similarity cell_similarity, const typename ::QProjector< dim >::DataSetDescriptor data_set, const typename ::MappingFEField< dim, spacedim >::InternalData &data, const FiniteElement< dim, spacedim > &fe, const ComponentMask &fe_mask, const std::vector< unsigned int > &fe_to_real, std::vector< Tensor< 5, spacedim > > &jacobian_pushed_forward_3rd_derivatives)
std::vector< Tensor< 3, dim > > shape_third_derivatives
#define Assert(cond, exc)
Abstract base class for mapping classes.
const ComponentMask & get_nonzero_components(const unsigned int i) const
virtual Point< spacedim > transform_unit_to_real_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< dim > &p) const
std::vector< double > volume_elements
numbers::NumberTraits< Number >::real_type norm_square() const
unsigned int size() const
const double & shape(const unsigned int qpoint, const unsigned int shape_nr) const
virtual InternalData * get_data(const UpdateFlags, const Quadrature< dim > &quadrature) const
virtual void compute_shapes_virtual(const std::vector< Point< dim > > &unit_points, typename MappingFEField< dim, spacedim >::InternalData &data) const
void update_internal_dofs(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const typename MappingFEField< dim, spacedim >::InternalData &data) const
virtual Mapping< dim, spacedim >::InternalDataBase * get_face_data(const UpdateFlags flags, const Quadrature< dim-1 > &quadrature) const
SmartPointer< const DoFHandlerType, MappingFEField< dim, spacedim, VectorType, DoFHandlerType > > euler_dof_handler
virtual bool preserves_vertex_locations() const
Gradient of volume element.
std::vector< double > local_dof_values
const Tensor< 3, dim > & third_derivative(const unsigned int qpoint, const unsigned int shape_nr) const
unsigned int size() const
const unsigned int dofs_per_cell
std::vector< double > shape_values
std::vector< Tensor< 4, dim > > shape_fourth_derivatives
friend class MappingFEField
std::vector< types::global_dof_index > local_dof_indices
void maybe_compute_face_data(const ::MappingFEField< dim, spacedim > &mapping, const typename ::Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int subface_no, const std::vector< double > &weights, const typename ::MappingFEField< dim, spacedim >::InternalData &data, internal::FEValues::MappingRelatedData< dim, spacedim > &output_data)
std::pair< unsigned int, unsigned int > system_to_component_index(const unsigned int index) const
virtual double shape_value(const unsigned int i, const Point< dim > &p) const
const Tensor< 2, dim > & second_derivative(const unsigned int qpoint, const unsigned int shape_nr) const
SmartPointer< const VectorType, MappingFEField< dim, spacedim, VectorType, DoFHandlerType > > euler_vector
void do_fill_fe_face_values(const ::MappingFEField< 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 ::MappingFEField< dim, spacedim >::InternalData &data, const FiniteElement< dim, spacedim > &fe, const ComponentMask &fe_mask, const std::vector< unsigned int > &fe_to_real, internal::FEValues::MappingRelatedData< dim, spacedim > &output_data)
const Tensor< 4, dim > & fourth_derivative(const unsigned int qpoint, const unsigned int shape_nr) const
void maybe_update_jacobian_3rd_derivatives(const CellSimilarity::Similarity cell_similarity, const typename ::QProjector< dim >::DataSetDescriptor data_set, const typename ::MappingFEField< dim, spacedim >::InternalData &data, const FiniteElement< dim, spacedim > &fe, const ComponentMask &fe_mask, const std::vector< unsigned int > &fe_to_real, std::vector< DerivativeForm< 4, dim, spacedim > > &jacobian_3rd_derivatives)
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const
static Point< dim > project_to_unit_cell(const Point< dim > &p)
const Tensor< 1, dim > & derivative(const unsigned int qpoint, const unsigned int shape_nr) const
std::vector< DerivativeForm< 1, dim, spacedim > > contravariant
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const
ComponentMask get_component_mask() const
std::vector< Tensor< 2, dim > > shape_second_derivatives
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
virtual Tensor< 4, dim > shape_4th_derivative(const unsigned int i, const Point< dim > &p) const
std::vector< Tensor< 1, dim > > shape_derivatives
Point< dim > do_transform_real_to_unit_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< spacedim > &p, const Point< dim > &initial_p_unit, InternalData &mdata) const
static double subface_ratio(const internal::SubfaceCase< dim > &subface_case, const unsigned int subface_no)
Covariant transformation.
std::vector< std::vector< Tensor< 1, spacedim > > > aux