48 #include <boost/container/small_vector.hpp> 51 #include <type_traits> 58 template <
class VectorType>
77 template <
int dim,
int spacedim>
78 inline std::vector<unsigned int>
81 std::vector<unsigned int> shape_function_to_row_table(
90 unsigned int nth_nonzero_component = 0;
95 row + nth_nonzero_component;
96 ++nth_nonzero_component;
101 return shape_function_to_row_table;
108 template <
typename Number,
typename T =
void>
123 template <
typename Number>
126 typename std::enable_if<
127 Differentiation::AD::is_ad_number<Number>::value>::type>
130 value(
const Number & )
142 template <
int dim,
int spacedim>
144 const unsigned int component)
145 : fe_values(&fe_values)
146 , component(component)
147 , shape_function_data(this->fe_values->fe->dofs_per_cell)
155 const std::vector<unsigned int> shape_function_to_row_table =
162 if (is_primitive ==
true)
179 template <
int dim,
int spacedim>
187 template <
int dim,
int spacedim>
189 const unsigned int first_vector_component)
190 : fe_values(&fe_values)
191 , first_vector_component(first_vector_component)
200 const std::vector<unsigned int> shape_function_to_row_table =
203 for (
unsigned int d = 0;
d < spacedim; ++
d)
205 const unsigned int component = first_vector_component +
d;
211 if (is_primitive ==
true)
221 shape_function_to_row_table[i * fe.
n_components() + component];
230 unsigned int n_nonzero_components = 0;
231 for (
unsigned int d = 0;
d < spacedim; ++
d)
234 ++n_nonzero_components;
236 if (n_nonzero_components == 0)
238 else if (n_nonzero_components > 1)
242 for (
unsigned int d = 0;
d < spacedim; ++
d)
244 .is_nonzero_shape_function_component[
d] ==
true)
257 template <
int dim,
int spacedim>
265 template <
int dim,
int spacedim>
268 const unsigned int first_tensor_component)
269 : fe_values(&fe_values)
270 , first_tensor_component(first_tensor_component)
274 Assert(first_tensor_component + (dim * dim + dim) / 2 - 1 <
277 first_tensor_component +
284 const std::vector<unsigned int> shape_function_to_row_table =
287 for (
unsigned int d = 0;
288 d < ::SymmetricTensor<2, dim>::n_independent_components;
291 const unsigned int component = first_tensor_component +
d;
297 if (is_primitive ==
true)
298 shape_function_data[i].is_nonzero_shape_function_component[
d] =
301 shape_function_data[i].is_nonzero_shape_function_component[
d] =
304 if (shape_function_data[i].is_nonzero_shape_function_component[d] ==
306 shape_function_data[i].row_index[
d] =
307 shape_function_to_row_table[i * fe.
n_components() + component];
309 shape_function_data[i].row_index[
d] =
316 unsigned int n_nonzero_components = 0;
317 for (
unsigned int d = 0;
318 d < ::SymmetricTensor<2, dim>::n_independent_components;
320 if (shape_function_data[i].is_nonzero_shape_function_component[
d] ==
322 ++n_nonzero_components;
324 if (n_nonzero_components == 0)
325 shape_function_data[i].single_nonzero_component = -2;
326 else if (n_nonzero_components > 1)
327 shape_function_data[i].single_nonzero_component = -1;
330 for (
unsigned int d = 0;
331 d < ::SymmetricTensor<2, dim>::n_independent_components;
333 if (shape_function_data[i]
334 .is_nonzero_shape_function_component[
d] ==
true)
336 shape_function_data[i].single_nonzero_component =
337 shape_function_data[i].row_index[
d];
338 shape_function_data[i].single_nonzero_component_index =
d;
347 template <
int dim,
int spacedim>
355 template <
int dim,
int spacedim>
357 const unsigned int first_tensor_component)
358 : fe_values(&fe_values)
359 , first_tensor_component(first_tensor_component)
360 , shape_function_data(this->fe_values->fe->dofs_per_cell)
367 const std::vector<unsigned int> shape_function_to_row_table =
370 for (
unsigned int d = 0;
d < dim * dim; ++
d)
372 const unsigned int component = first_tensor_component +
d;
378 if (is_primitive ==
true)
379 shape_function_data[i].is_nonzero_shape_function_component[
d] =
382 shape_function_data[i].is_nonzero_shape_function_component[
d] =
385 if (shape_function_data[i].is_nonzero_shape_function_component[d] ==
387 shape_function_data[i].row_index[
d] =
388 shape_function_to_row_table[i * fe.
n_components() + component];
390 shape_function_data[i].row_index[
d] =
397 unsigned int n_nonzero_components = 0;
398 for (
unsigned int d = 0;
d < dim * dim; ++
d)
399 if (shape_function_data[i].is_nonzero_shape_function_component[
d] ==
401 ++n_nonzero_components;
403 if (n_nonzero_components == 0)
404 shape_function_data[i].single_nonzero_component = -2;
405 else if (n_nonzero_components > 1)
406 shape_function_data[i].single_nonzero_component = -1;
409 for (
unsigned int d = 0;
d < dim * dim; ++
d)
410 if (shape_function_data[i]
411 .is_nonzero_shape_function_component[
d] ==
true)
413 shape_function_data[i].single_nonzero_component =
414 shape_function_data[i].row_index[
d];
415 shape_function_data[i].single_nonzero_component_index =
d;
424 template <
int dim,
int spacedim>
438 template <
int dim,
int spacedim,
typename Number>
444 &shape_function_data,
447 const unsigned int dofs_per_cell = dof_values.
size();
448 const unsigned int n_quadrature_points =
449 dofs_per_cell > 0 ? shape_values.n_cols() : values.
size();
452 std::fill(values.begin(),
456 for (
unsigned int shape_function = 0; shape_function < dofs_per_cell;
458 if (shape_function_data[shape_function]
459 .is_nonzero_shape_function_component)
461 const Number &
value = dof_values[shape_function];
468 const double *shape_value_ptr =
469 &shape_values(shape_function_data[shape_function].row_index, 0);
470 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
472 values[q_point] += value * (*shape_value_ptr++);
480 template <
int order,
int dim,
int spacedim,
typename Number>
486 &shape_function_data,
491 const unsigned int dofs_per_cell = dof_values.
size();
492 const unsigned int n_quadrature_points =
493 dofs_per_cell > 0 ? shape_derivatives[0].size() : derivatives.size();
501 for (
unsigned int shape_function = 0; shape_function < dofs_per_cell;
503 if (shape_function_data[shape_function]
504 .is_nonzero_shape_function_component)
506 const Number &
value = dof_values[shape_function];
513 const ::Tensor<order, spacedim> *shape_derivative_ptr =
514 &shape_derivatives[shape_function_data[shape_function].row_index]
516 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
518 derivatives[q_point] += value * (*shape_derivative_ptr++);
524 template <
int dim,
int spacedim,
typename Number>
530 & shape_function_data,
532 Number>::laplacian_type> &laplacians)
534 const unsigned int dofs_per_cell = dof_values.
size();
535 const unsigned int n_quadrature_points =
536 dofs_per_cell > 0 ? shape_hessians[0].size() : laplacians.size();
539 std::fill(laplacians.begin(),
542 Number>::laplacian_type());
544 for (
unsigned int shape_function = 0; shape_function < dofs_per_cell;
546 if (shape_function_data[shape_function]
547 .is_nonzero_shape_function_component)
549 const Number &
value = dof_values[shape_function];
556 const ::Tensor<2, spacedim> *shape_hessian_ptr =
557 &shape_hessians[shape_function_data[shape_function].row_index][0];
558 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
560 laplacians[q_point] += value *
trace(*shape_hessian_ptr++);
568 template <
int dim,
int spacedim,
typename Number>
574 &shape_function_data,
579 const unsigned int dofs_per_cell = dof_values.
size();
580 const unsigned int n_quadrature_points =
581 dofs_per_cell > 0 ? shape_values.n_cols() : values.
size();
589 for (
unsigned int shape_function = 0; shape_function < dofs_per_cell;
593 shape_function_data[shape_function].single_nonzero_component;
599 const Number &
value = dof_values[shape_function];
608 const unsigned int comp = shape_function_data[shape_function]
609 .single_nonzero_component_index;
610 const double *shape_value_ptr = &shape_values(snc, 0);
611 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
613 values[q_point][comp] += value * (*shape_value_ptr++);
616 for (
unsigned int d = 0;
d < spacedim; ++
d)
617 if (shape_function_data[shape_function]
618 .is_nonzero_shape_function_component[
d])
620 const double *shape_value_ptr = &shape_values(
621 shape_function_data[shape_function].row_index[d], 0);
622 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
624 values[q_point][d] += value * (*shape_value_ptr++);
631 template <
int order,
int dim,
int spacedim,
typename Number>
637 &shape_function_data,
642 const unsigned int dofs_per_cell = dof_values.
size();
643 const unsigned int n_quadrature_points =
644 dofs_per_cell > 0 ? shape_derivatives[0].size() : derivatives.size();
653 for (
unsigned int shape_function = 0; shape_function < dofs_per_cell;
657 shape_function_data[shape_function].single_nonzero_component;
663 const Number &
value = dof_values[shape_function];
672 const unsigned int comp = shape_function_data[shape_function]
673 .single_nonzero_component_index;
674 const ::Tensor<order, spacedim> *shape_derivative_ptr =
675 &shape_derivatives[snc][0];
676 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
678 derivatives[q_point][comp] += value * (*shape_derivative_ptr++);
681 for (
unsigned int d = 0;
d < spacedim; ++
d)
682 if (shape_function_data[shape_function]
683 .is_nonzero_shape_function_component[
d])
685 const ::Tensor<order, spacedim> *shape_derivative_ptr =
686 &shape_derivatives[shape_function_data[shape_function]
688 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
690 derivatives[q_point][d] +=
691 value * (*shape_derivative_ptr++);
698 template <
int dim,
int spacedim,
typename Number>
704 &shape_function_data,
708 &symmetric_gradients)
710 const unsigned int dofs_per_cell = dof_values.
size();
711 const unsigned int n_quadrature_points = dofs_per_cell > 0 ?
712 shape_gradients[0].size() :
713 symmetric_gradients.size();
717 symmetric_gradients.begin(),
718 symmetric_gradients.end(),
722 for (
unsigned int shape_function = 0; shape_function < dofs_per_cell;
726 shape_function_data[shape_function].single_nonzero_component;
732 const Number &
value = dof_values[shape_function];
741 const unsigned int comp = shape_function_data[shape_function]
742 .single_nonzero_component_index;
743 const ::Tensor<1, spacedim> *shape_gradient_ptr =
744 &shape_gradients[snc][0];
745 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
747 symmetric_gradients[q_point] +=
749 symmetrize_single_row(comp, *shape_gradient_ptr++));
752 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
757 for (
unsigned int d = 0;
d < spacedim; ++
d)
758 if (shape_function_data[shape_function]
759 .is_nonzero_shape_function_component[
d])
762 shape_gradients[shape_function_data[shape_function]
763 .row_index[
d]][q_point];
764 symmetric_gradients[q_point] +=
symmetrize(grad);
771 template <
int dim,
int spacedim,
typename Number>
777 & shape_function_data,
779 Number>::divergence_type> &divergences)
781 const unsigned int dofs_per_cell = dof_values.
size();
782 const unsigned int n_quadrature_points =
783 dofs_per_cell > 0 ? shape_gradients[0].size() : divergences.size();
786 std::fill(divergences.begin(),
789 Number>::divergence_type());
791 for (
unsigned int shape_function = 0; shape_function < dofs_per_cell;
795 shape_function_data[shape_function].single_nonzero_component;
801 const Number &
value = dof_values[shape_function];
810 const unsigned int comp = shape_function_data[shape_function]
811 .single_nonzero_component_index;
812 const ::Tensor<1, spacedim> *shape_gradient_ptr =
813 &shape_gradients[snc][0];
814 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
816 divergences[q_point] += value * (*shape_gradient_ptr++)[comp];
819 for (
unsigned int d = 0;
d < spacedim; ++
d)
820 if (shape_function_data[shape_function]
821 .is_nonzero_shape_function_component[
d])
823 const ::Tensor<1, spacedim> *shape_gradient_ptr =
824 &shape_gradients[shape_function_data[shape_function]
826 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
828 divergences[q_point] += value * (*shape_gradient_ptr++)[
d];
835 template <
int dim,
int spacedim,
typename Number>
841 &shape_function_data,
844 typename ::internal::CurlType<spacedim>::type>::type> &curls)
846 const unsigned int dofs_per_cell = dof_values.
size();
847 const unsigned int n_quadrature_points =
848 dofs_per_cell > 0 ? shape_gradients[0].size() : curls.size();
851 std::fill(curls.begin(),
855 typename ::internal::CurlType<spacedim>::type>::type());
863 "Computing the curl in 1d is not a useful operation"));
869 for (
unsigned int shape_function = 0;
870 shape_function < dofs_per_cell;
873 const int snc = shape_function_data[shape_function]
874 .single_nonzero_component;
880 const Number &
value = dof_values[shape_function];
890 const ::Tensor<1, spacedim> *shape_gradient_ptr =
891 &shape_gradients[snc][0];
893 Assert(shape_function_data[shape_function]
894 .single_nonzero_component >= 0,
897 if (shape_function_data[shape_function]
898 .single_nonzero_component_index == 0)
899 for (
unsigned int q_point = 0;
900 q_point < n_quadrature_points;
903 value * (*shape_gradient_ptr++)[1];
905 for (
unsigned int q_point = 0;
906 q_point < n_quadrature_points;
909 value * (*shape_gradient_ptr++)[0];
917 if (shape_function_data[shape_function]
918 .is_nonzero_shape_function_component[0])
921 spacedim> *shape_gradient_ptr =
922 &shape_gradients[shape_function_data[shape_function]
925 for (
unsigned int q_point = 0;
926 q_point < n_quadrature_points;
929 value * (*shape_gradient_ptr++)[1];
932 if (shape_function_data[shape_function]
933 .is_nonzero_shape_function_component[1])
936 spacedim> *shape_gradient_ptr =
937 &shape_gradients[shape_function_data[shape_function]
940 for (
unsigned int q_point = 0;
941 q_point < n_quadrature_points;
944 value * (*shape_gradient_ptr++)[0];
953 for (
unsigned int shape_function = 0;
954 shape_function < dofs_per_cell;
957 const int snc = shape_function_data[shape_function]
958 .single_nonzero_component;
964 const Number &
value = dof_values[shape_function];
974 const ::Tensor<1, spacedim> *shape_gradient_ptr =
975 &shape_gradients[snc][0];
977 switch (shape_function_data[shape_function]
978 .single_nonzero_component_index)
982 for (
unsigned int q_point = 0;
983 q_point < n_quadrature_points;
987 value * (*shape_gradient_ptr)[2];
989 value * (*shape_gradient_ptr++)[1];
997 for (
unsigned int q_point = 0;
998 q_point < n_quadrature_points;
1001 curls[q_point][0] -=
1002 value * (*shape_gradient_ptr)[2];
1003 curls[q_point][2] +=
1004 value * (*shape_gradient_ptr++)[0];
1012 for (
unsigned int q_point = 0;
1013 q_point < n_quadrature_points;
1016 curls[q_point][0] +=
1017 value * (*shape_gradient_ptr)[1];
1018 curls[q_point][1] -=
1019 value * (*shape_gradient_ptr++)[0];
1035 if (shape_function_data[shape_function]
1036 .is_nonzero_shape_function_component[0])
1039 spacedim> *shape_gradient_ptr =
1040 &shape_gradients[shape_function_data[shape_function]
1043 for (
unsigned int q_point = 0;
1044 q_point < n_quadrature_points;
1047 curls[q_point][1] +=
1048 value * (*shape_gradient_ptr)[2];
1049 curls[q_point][2] -=
1050 value * (*shape_gradient_ptr++)[1];
1054 if (shape_function_data[shape_function]
1055 .is_nonzero_shape_function_component[1])
1058 spacedim> *shape_gradient_ptr =
1059 &shape_gradients[shape_function_data[shape_function]
1062 for (
unsigned int q_point = 0;
1063 q_point < n_quadrature_points;
1066 curls[q_point][0] -=
1067 value * (*shape_gradient_ptr)[2];
1068 curls[q_point][2] +=
1069 value * (*shape_gradient_ptr++)[0];
1073 if (shape_function_data[shape_function]
1074 .is_nonzero_shape_function_component[2])
1077 spacedim> *shape_gradient_ptr =
1078 &shape_gradients[shape_function_data[shape_function]
1081 for (
unsigned int q_point = 0;
1082 q_point < n_quadrature_points;
1085 curls[q_point][0] +=
1086 value * (*shape_gradient_ptr)[1];
1087 curls[q_point][1] -=
1088 value * (*shape_gradient_ptr++)[0];
1099 template <
int dim,
int spacedim,
typename Number>
1105 & shape_function_data,
1107 Number>::laplacian_type> &laplacians)
1109 const unsigned int dofs_per_cell = dof_values.
size();
1110 const unsigned int n_quadrature_points =
1111 dofs_per_cell > 0 ? shape_hessians[0].size() : laplacians.size();
1114 std::fill(laplacians.begin(),
1117 Number>::laplacian_type());
1119 for (
unsigned int shape_function = 0; shape_function < dofs_per_cell;
1123 shape_function_data[shape_function].single_nonzero_component;
1129 const Number &
value = dof_values[shape_function];
1138 const unsigned int comp = shape_function_data[shape_function]
1139 .single_nonzero_component_index;
1140 const ::Tensor<2, spacedim> *shape_hessian_ptr =
1141 &shape_hessians[snc][0];
1142 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
1144 laplacians[q_point][comp] +=
1145 value *
trace(*shape_hessian_ptr++);
1148 for (
unsigned int d = 0;
d < spacedim; ++
d)
1149 if (shape_function_data[shape_function]
1150 .is_nonzero_shape_function_component[
d])
1152 const ::Tensor<2, spacedim> *shape_hessian_ptr =
1153 &shape_hessians[shape_function_data[shape_function]
1155 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
1157 laplacians[q_point][d] +=
1158 value *
trace(*shape_hessian_ptr++);
1167 template <
int dim,
int spacedim,
typename Number>
1171 const ::Table<2, double> &shape_values,
1174 &shape_function_data,
1180 const unsigned int dofs_per_cell = dof_values.
size();
1181 const unsigned int n_quadrature_points =
1182 dofs_per_cell > 0 ? shape_values.n_cols() : values.size();
1191 for (
unsigned int shape_function = 0; shape_function < dofs_per_cell;
1195 shape_function_data[shape_function].single_nonzero_component;
1201 const Number &
value = dof_values[shape_function];
1212 shape_function_data[shape_function]
1213 .single_nonzero_component_index);
1214 const double *shape_value_ptr = &shape_values(snc, 0);
1215 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
1217 values[q_point][comp] += value * (*shape_value_ptr++);
1220 for (
unsigned int d = 0;
1224 if (shape_function_data[shape_function]
1225 .is_nonzero_shape_function_component[
d])
1230 const double *shape_value_ptr = &shape_values(
1231 shape_function_data[shape_function].row_index[d], 0);
1232 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
1234 values[q_point][comp] += value * (*shape_value_ptr++);
1241 template <
int dim,
int spacedim,
typename Number>
1248 &shape_function_data,
1250 template OutputType<Number>::divergence_type> &divergences)
1252 const unsigned int dofs_per_cell = dof_values.
size();
1253 const unsigned int n_quadrature_points =
1254 dofs_per_cell > 0 ? shape_gradients[0].size() : divergences.size();
1257 std::fill(divergences.begin(),
1260 Number>::divergence_type());
1262 for (
unsigned int shape_function = 0; shape_function < dofs_per_cell;
1266 shape_function_data[shape_function].single_nonzero_component;
1272 const Number &
value = dof_values[shape_function];
1281 const unsigned int comp = shape_function_data[shape_function]
1282 .single_nonzero_component_index;
1284 const ::Tensor<1, spacedim> *shape_gradient_ptr =
1285 &shape_gradients[snc][0];
1292 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
1293 ++q_point, ++shape_gradient_ptr)
1295 divergences[q_point][ii] += value * (*shape_gradient_ptr)[jj];
1298 divergences[q_point][jj] +=
1299 value * (*shape_gradient_ptr)[ii];
1304 for (
unsigned int d = 0;
1307 spacedim>::n_independent_components;
1309 if (shape_function_data[shape_function]
1310 .is_nonzero_shape_function_component[
d])
1322 const unsigned int comp =
1323 shape_function_data[shape_function]
1324 .single_nonzero_component_index;
1326 const ::Tensor<1, spacedim> *shape_gradient_ptr =
1327 &shape_gradients[shape_function_data[shape_function]
1329 for (
unsigned int q_point = 0;
1330 q_point < n_quadrature_points;
1331 ++q_point, ++shape_gradient_ptr)
1333 for (
unsigned int j = 0; j < spacedim; ++j)
1335 const unsigned int vector_component =
1339 divergences[q_point][vector_component] +=
1340 value * (*shape_gradient_ptr++)[j];
1350 template <
int dim,
int spacedim,
typename Number>
1354 const ::Table<2, double> &shape_values,
1356 &shape_function_data,
1361 const unsigned int dofs_per_cell = dof_values.
size();
1362 const unsigned int n_quadrature_points =
1363 dofs_per_cell > 0 ? shape_values.n_cols() : values.size();
1371 for (
unsigned int shape_function = 0; shape_function < dofs_per_cell;
1375 shape_function_data[shape_function].single_nonzero_component;
1381 const Number &
value = dof_values[shape_function];
1390 const unsigned int comp = shape_function_data[shape_function]
1391 .single_nonzero_component_index;
1397 const double *shape_value_ptr = &shape_values(snc, 0);
1398 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
1400 values[q_point][indices] += value * (*shape_value_ptr++);
1403 for (
unsigned int d = 0;
d < dim * dim; ++
d)
1404 if (shape_function_data[shape_function]
1405 .is_nonzero_shape_function_component[
d])
1411 const double *shape_value_ptr = &shape_values(
1412 shape_function_data[shape_function].row_index[d], 0);
1413 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
1415 values[q_point][indices] += value * (*shape_value_ptr++);
1422 template <
int dim,
int spacedim,
typename Number>
1428 & shape_function_data,
1430 Number>::divergence_type> &divergences)
1432 const unsigned int dofs_per_cell = dof_values.
size();
1433 const unsigned int n_quadrature_points =
1434 dofs_per_cell > 0 ? shape_gradients[0].size() : divergences.size();
1437 std::fill(divergences.begin(),
1440 Number>::divergence_type());
1442 for (
unsigned int shape_function = 0; shape_function < dofs_per_cell;
1446 shape_function_data[shape_function].single_nonzero_component;
1452 const Number &
value = dof_values[shape_function];
1461 const unsigned int comp = shape_function_data[shape_function]
1462 .single_nonzero_component_index;
1464 const ::Tensor<1, spacedim> *shape_gradient_ptr =
1465 &shape_gradients[snc][0];
1470 const unsigned int ii = indices[0];
1471 const unsigned int jj = indices[1];
1473 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
1474 ++q_point, ++shape_gradient_ptr)
1476 divergences[q_point][ii] += value * (*shape_gradient_ptr)[jj];
1481 for (
unsigned int d = 0;
d < dim * dim; ++
d)
1482 if (shape_function_data[shape_function]
1483 .is_nonzero_shape_function_component[
d])
1493 template <
int dim,
int spacedim,
typename Number>
1499 & shape_function_data,
1501 Number>::gradient_type> &gradients)
1503 const unsigned int dofs_per_cell = dof_values.
size();
1504 const unsigned int n_quadrature_points =
1505 dofs_per_cell > 0 ? shape_gradients[0].size() : gradients.size();
1508 std::fill(gradients.begin(),
1511 Number>::gradient_type());
1513 for (
unsigned int shape_function = 0; shape_function < dofs_per_cell;
1517 shape_function_data[shape_function].single_nonzero_component;
1523 const Number &
value = dof_values[shape_function];
1532 const unsigned int comp = shape_function_data[shape_function]
1533 .single_nonzero_component_index;
1535 const ::Tensor<1, spacedim> *shape_gradient_ptr =
1536 &shape_gradients[snc][0];
1541 const unsigned int ii = indices[0];
1542 const unsigned int jj = indices[1];
1544 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
1545 ++q_point, ++shape_gradient_ptr)
1547 gradients[q_point][ii][jj] += value * (*shape_gradient_ptr);
1552 for (
unsigned int d = 0;
d < dim * dim; ++
d)
1553 if (shape_function_data[shape_function]
1554 .is_nonzero_shape_function_component[
d])
1566 template <
int dim,
int spacedim>
1567 template <
class InputVector>
1570 const InputVector &fe_function,
1578 Assert(fe_values->present_cell.get() !=
nullptr,
1579 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1581 fe_values->present_cell->n_dofs_for_dof_handler());
1586 fe_values->dofs_per_cell);
1587 fe_values->present_cell->get_interpolated_dof_values(fe_function,
1589 internal::do_function_values<dim, spacedim>(
1591 fe_values->finite_element_output.shape_values,
1592 shape_function_data,
1598 template <
int dim,
int spacedim>
1599 template <
class InputVector>
1602 const InputVector &dof_values,
1610 Assert(fe_values->present_cell.get() !=
nullptr,
1611 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1614 internal::do_function_values<dim, spacedim>(
1616 fe_values->finite_element_output.shape_values,
1617 shape_function_data,
1623 template <
int dim,
int spacedim>
1624 template <
class InputVector>
1627 const InputVector &fe_function,
1629 typename InputVector::value_type>::type>
1634 "update_gradients")));
1635 Assert(fe_values->present_cell.get() !=
nullptr,
1636 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1638 fe_values->present_cell->n_dofs_for_dof_handler());
1642 fe_values->dofs_per_cell);
1643 fe_values->present_cell->get_interpolated_dof_values(fe_function,
1645 internal::do_function_derivatives<1, dim, spacedim>(
1647 fe_values->finite_element_output.shape_gradients,
1648 shape_function_data,
1654 template <
int dim,
int spacedim>
1655 template <
class InputVector>
1658 const InputVector &dof_values,
1665 "update_gradients")));
1666 Assert(fe_values->present_cell.get() !=
nullptr,
1667 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1670 internal::do_function_derivatives<1, dim, spacedim>(
1672 fe_values->finite_element_output.shape_gradients,
1673 shape_function_data,
1679 template <
int dim,
int spacedim>
1680 template <
class InputVector>
1683 const InputVector &fe_function,
1685 typename InputVector::value_type>::type>
1690 "update_hessians")));
1691 Assert(fe_values->present_cell.get() !=
nullptr,
1692 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1694 fe_values->present_cell->n_dofs_for_dof_handler());
1698 fe_values->dofs_per_cell);
1699 fe_values->present_cell->get_interpolated_dof_values(fe_function,
1701 internal::do_function_derivatives<2, dim, spacedim>(
1703 fe_values->finite_element_output.shape_hessians,
1704 shape_function_data,
1710 template <
int dim,
int spacedim>
1711 template <
class InputVector>
1714 const InputVector &dof_values,
1721 "update_hessians")));
1722 Assert(fe_values->present_cell.get() !=
nullptr,
1723 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1726 internal::do_function_derivatives<2, dim, spacedim>(
1728 fe_values->finite_element_output.shape_hessians,
1729 shape_function_data,
1735 template <
int dim,
int spacedim>
1736 template <
class InputVector>
1739 const InputVector &fe_function,
1746 "update_hessians")));
1747 Assert(fe_values->present_cell.get() !=
nullptr,
1748 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1750 fe_values->present_cell->n_dofs_for_dof_handler());
1754 fe_values->dofs_per_cell);
1755 fe_values->present_cell->get_interpolated_dof_values(fe_function,
1757 internal::do_function_laplacians<dim, spacedim>(
1759 fe_values->finite_element_output.shape_hessians,
1760 shape_function_data,
1766 template <
int dim,
int spacedim>
1767 template <
class InputVector>
1770 const InputVector &dof_values,
1777 "update_hessians")));
1778 Assert(fe_values->present_cell.get() !=
nullptr,
1779 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1782 internal::do_function_laplacians<dim, spacedim>(
1784 fe_values->finite_element_output.shape_hessians,
1785 shape_function_data,
1791 template <
int dim,
int spacedim>
1792 template <
class InputVector>
1795 const InputVector &fe_function,
1797 typename InputVector::value_type>::type>
1798 &third_derivatives)
const 1802 "update_3rd_derivatives")));
1803 Assert(fe_values->present_cell.get() !=
nullptr,
1804 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1806 fe_values->present_cell->n_dofs_for_dof_handler());
1810 fe_values->dofs_per_cell);
1811 fe_values->present_cell->get_interpolated_dof_values(fe_function,
1813 internal::do_function_derivatives<3, dim, spacedim>(
1815 fe_values->finite_element_output.shape_3rd_derivatives,
1816 shape_function_data,
1822 template <
int dim,
int spacedim>
1823 template <
class InputVector>
1826 const InputVector & dof_values,
1832 "update_3rd_derivatives")));
1833 Assert(fe_values->present_cell.get() !=
nullptr,
1834 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1837 internal::do_function_derivatives<3, dim, spacedim>(
1839 fe_values->finite_element_output.shape_3rd_derivatives,
1840 shape_function_data,
1846 template <
int dim,
int spacedim>
1847 template <
class InputVector>
1850 const InputVector &fe_function,
1858 Assert(fe_values->present_cell.get() !=
nullptr,
1859 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1861 fe_values->present_cell->n_dofs_for_dof_handler());
1865 fe_values->dofs_per_cell);
1866 fe_values->present_cell->get_interpolated_dof_values(fe_function,
1868 internal::do_function_values<dim, spacedim>(
1870 fe_values->finite_element_output.shape_values,
1871 shape_function_data,
1877 template <
int dim,
int spacedim>
1878 template <
class InputVector>
1881 const InputVector &dof_values,
1889 Assert(fe_values->present_cell.get() !=
nullptr,
1890 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1893 internal::do_function_values<dim, spacedim>(
1895 fe_values->finite_element_output.shape_values,
1896 shape_function_data,
1902 template <
int dim,
int spacedim>
1903 template <
class InputVector>
1906 const InputVector &fe_function,
1908 typename InputVector::value_type>::type>
1913 "update_gradients")));
1914 Assert(fe_values->present_cell.get() !=
nullptr,
1915 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1917 fe_values->present_cell->n_dofs_for_dof_handler());
1921 fe_values->dofs_per_cell);
1922 fe_values->present_cell->get_interpolated_dof_values(fe_function,
1924 internal::do_function_derivatives<1, dim, spacedim>(
1926 fe_values->finite_element_output.shape_gradients,
1927 shape_function_data,
1933 template <
int dim,
int spacedim>
1934 template <
class InputVector>
1937 const InputVector &dof_values,
1944 "update_gradients")));
1945 Assert(fe_values->present_cell.get() !=
nullptr,
1946 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1949 internal::do_function_derivatives<1, dim, spacedim>(
1951 fe_values->finite_element_output.shape_gradients,
1952 shape_function_data,
1958 template <
int dim,
int spacedim>
1959 template <
class InputVector>
1962 const InputVector &fe_function,
1964 typename InputVector::value_type>::type>
1965 &symmetric_gradients)
const 1969 "update_gradients")));
1970 Assert(fe_values->present_cell.get() !=
nullptr,
1971 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
1973 fe_values->present_cell->n_dofs_for_dof_handler());
1977 fe_values->dofs_per_cell);
1978 fe_values->present_cell->get_interpolated_dof_values(fe_function,
1980 internal::do_function_symmetric_gradients<dim, spacedim>(
1982 fe_values->finite_element_output.shape_gradients,
1983 shape_function_data,
1984 symmetric_gradients);
1989 template <
int dim,
int spacedim>
1990 template <
class InputVector>
1993 const InputVector & dof_values,
1999 "update_gradients")));
2000 Assert(fe_values->present_cell.get() !=
nullptr,
2001 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2004 internal::do_function_symmetric_gradients<dim, spacedim>(
2006 fe_values->finite_element_output.shape_gradients,
2007 shape_function_data,
2008 symmetric_gradients);
2013 template <
int dim,
int spacedim>
2014 template <
class InputVector>
2017 const InputVector &fe_function,
2019 typename InputVector::value_type>::type>
2024 "update_gradients")));
2025 Assert(fe_values->present_cell.get() !=
nullptr,
2026 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2028 fe_values->present_cell->n_dofs_for_dof_handler());
2033 fe_values->dofs_per_cell);
2034 fe_values->present_cell->get_interpolated_dof_values(fe_function,
2036 internal::do_function_divergences<dim, spacedim>(
2038 fe_values->finite_element_output.shape_gradients,
2039 shape_function_data,
2045 template <
int dim,
int spacedim>
2046 template <
class InputVector>
2049 const InputVector &dof_values,
2056 "update_gradients")));
2057 Assert(fe_values->present_cell.get() !=
nullptr,
2058 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2061 internal::do_function_divergences<dim, spacedim>(
2063 fe_values->finite_element_output.shape_gradients,
2064 shape_function_data,
2070 template <
int dim,
int spacedim>
2071 template <
class InputVector>
2074 const InputVector &fe_function,
2081 "update_gradients")));
2082 Assert(fe_values->present_cell.get() !=
nullptr,
2083 ExcMessage(
"FEValues object is not reinited to any cell"));
2085 fe_values->present_cell->n_dofs_for_dof_handler());
2089 fe_values->dofs_per_cell);
2090 fe_values->present_cell->get_interpolated_dof_values(fe_function,
2092 internal::do_function_curls<dim, spacedim>(
2094 fe_values->finite_element_output.shape_gradients,
2095 shape_function_data,
2101 template <
int dim,
int spacedim>
2102 template <
class InputVector>
2105 const InputVector &dof_values,
2112 "update_gradients")));
2113 Assert(fe_values->present_cell.get() !=
nullptr,
2114 ExcMessage(
"FEValues object is not reinited to any cell"));
2117 internal::do_function_curls<dim, spacedim>(
2119 fe_values->finite_element_output.shape_gradients,
2120 shape_function_data,
2126 template <
int dim,
int spacedim>
2127 template <
class InputVector>
2130 const InputVector &fe_function,
2132 typename InputVector::value_type>::type>
2137 "update_hessians")));
2138 Assert(fe_values->present_cell.get() !=
nullptr,
2139 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2141 fe_values->present_cell->n_dofs_for_dof_handler());
2145 fe_values->dofs_per_cell);
2146 fe_values->present_cell->get_interpolated_dof_values(fe_function,
2148 internal::do_function_derivatives<2, dim, spacedim>(
2150 fe_values->finite_element_output.shape_hessians,
2151 shape_function_data,
2157 template <
int dim,
int spacedim>
2158 template <
class InputVector>
2161 const InputVector &dof_values,
2168 "update_hessians")));
2169 Assert(fe_values->present_cell.get() !=
nullptr,
2170 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2173 internal::do_function_derivatives<2, dim, spacedim>(
2175 fe_values->finite_element_output.shape_hessians,
2176 shape_function_data,
2182 template <
int dim,
int spacedim>
2183 template <
class InputVector>
2186 const InputVector &fe_function,
2193 "update_hessians")));
2194 Assert(laplacians.size() == fe_values->n_quadrature_points,
2196 fe_values->n_quadrature_points));
2197 Assert(fe_values->present_cell.get() !=
nullptr,
2198 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2200 fe_function.size() == fe_values->present_cell->n_dofs_for_dof_handler(),
2202 fe_values->present_cell->n_dofs_for_dof_handler()));
2206 fe_values->dofs_per_cell);
2207 fe_values->present_cell->get_interpolated_dof_values(fe_function,
2209 internal::do_function_laplacians<dim, spacedim>(
2211 fe_values->finite_element_output.shape_hessians,
2212 shape_function_data,
2218 template <
int dim,
int spacedim>
2219 template <
class InputVector>
2222 const InputVector &dof_values,
2229 "update_hessians")));
2230 Assert(laplacians.size() == fe_values->n_quadrature_points,
2232 fe_values->n_quadrature_points));
2233 Assert(fe_values->present_cell.get() !=
nullptr,
2234 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2237 internal::do_function_laplacians<dim, spacedim>(
2239 fe_values->finite_element_output.shape_hessians,
2240 shape_function_data,
2246 template <
int dim,
int spacedim>
2247 template <
class InputVector>
2250 const InputVector &fe_function,
2252 typename InputVector::value_type>::type>
2253 &third_derivatives)
const 2257 "update_3rd_derivatives")));
2258 Assert(fe_values->present_cell.get() !=
nullptr,
2259 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2261 fe_values->present_cell->n_dofs_for_dof_handler());
2265 fe_values->dofs_per_cell);
2266 fe_values->present_cell->get_interpolated_dof_values(fe_function,
2268 internal::do_function_derivatives<3, dim, spacedim>(
2270 fe_values->finite_element_output.shape_3rd_derivatives,
2271 shape_function_data,
2277 template <
int dim,
int spacedim>
2278 template <
class InputVector>
2281 const InputVector & dof_values,
2287 "update_3rd_derivatives")));
2288 Assert(fe_values->present_cell.get() !=
nullptr,
2289 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2292 internal::do_function_derivatives<3, dim, spacedim>(
2294 fe_values->finite_element_output.shape_3rd_derivatives,
2295 shape_function_data,
2301 template <
int dim,
int spacedim>
2302 template <
class InputVector>
2305 const InputVector &fe_function,
2313 Assert(fe_values->present_cell.get() !=
nullptr,
2314 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2316 fe_values->present_cell->n_dofs_for_dof_handler());
2320 fe_values->dofs_per_cell);
2321 fe_values->present_cell->get_interpolated_dof_values(fe_function,
2323 internal::do_function_values<dim, spacedim>(
2325 fe_values->finite_element_output.shape_values,
2326 shape_function_data,
2332 template <
int dim,
int spacedim>
2333 template <
class InputVector>
2336 const InputVector &dof_values,
2344 Assert(fe_values->present_cell.get() !=
nullptr,
2345 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2348 internal::do_function_values<dim, spacedim>(
2350 fe_values->finite_element_output.shape_values,
2351 shape_function_data,
2357 template <
int dim,
int spacedim>
2358 template <
class InputVector>
2361 const InputVector &fe_function,
2363 typename InputVector::value_type>::type>
2368 "update_gradients")));
2369 Assert(fe_values->present_cell.get() !=
nullptr,
2370 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2372 fe_values->present_cell->n_dofs_for_dof_handler());
2377 fe_values->dofs_per_cell);
2378 fe_values->present_cell->get_interpolated_dof_values(fe_function,
2380 internal::do_function_divergences<dim, spacedim>(
2382 fe_values->finite_element_output.shape_gradients,
2383 shape_function_data,
2389 template <
int dim,
int spacedim>
2390 template <
class InputVector>
2394 const InputVector &dof_values,
2401 "update_gradients")));
2402 Assert(fe_values->present_cell.get() !=
nullptr,
2403 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2406 internal::do_function_divergences<dim, spacedim>(
2408 fe_values->finite_element_output.shape_gradients,
2409 shape_function_data,
2415 template <
int dim,
int spacedim>
2416 template <
class InputVector>
2419 const InputVector &fe_function,
2427 Assert(fe_values->present_cell.get() !=
nullptr,
2428 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2430 fe_values->present_cell->n_dofs_for_dof_handler());
2434 fe_values->dofs_per_cell);
2435 fe_values->present_cell->get_interpolated_dof_values(fe_function,
2437 internal::do_function_values<dim, spacedim>(
2439 fe_values->finite_element_output.shape_values,
2440 shape_function_data,
2446 template <
int dim,
int spacedim>
2447 template <
class InputVector>
2450 const InputVector &dof_values,
2458 Assert(fe_values->present_cell.get() !=
nullptr,
2459 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2462 internal::do_function_values<dim, spacedim>(
2464 fe_values->finite_element_output.shape_values,
2465 shape_function_data,
2471 template <
int dim,
int spacedim>
2472 template <
class InputVector>
2475 const InputVector &fe_function,
2477 typename InputVector::value_type>::type>
2482 "update_gradients")));
2483 Assert(fe_values->present_cell.get() !=
nullptr,
2484 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2486 fe_values->present_cell->n_dofs_for_dof_handler());
2491 fe_values->dofs_per_cell);
2492 fe_values->present_cell->get_interpolated_dof_values(fe_function,
2494 internal::do_function_divergences<dim, spacedim>(
2496 fe_values->finite_element_output.shape_gradients,
2497 shape_function_data,
2503 template <
int dim,
int spacedim>
2504 template <
class InputVector>
2507 const InputVector &dof_values,
2514 "update_gradients")));
2515 Assert(fe_values->present_cell.get() !=
nullptr,
2516 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2519 internal::do_function_divergences<dim, spacedim>(
2521 fe_values->finite_element_output.shape_gradients,
2522 shape_function_data,
2528 template <
int dim,
int spacedim>
2529 template <
class InputVector>
2532 const InputVector &fe_function,
2534 typename InputVector::value_type>::type>
2539 "update_gradients")));
2540 Assert(fe_values->present_cell.get() !=
nullptr,
2541 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2543 fe_values->present_cell->n_dofs_for_dof_handler());
2548 fe_values->dofs_per_cell);
2549 fe_values->present_cell->get_interpolated_dof_values(fe_function,
2551 internal::do_function_gradients<dim, spacedim>(
2553 fe_values->finite_element_output.shape_gradients,
2554 shape_function_data,
2560 template <
int dim,
int spacedim>
2561 template <
class InputVector>
2564 const InputVector &dof_values,
2571 "update_gradients")));
2572 Assert(fe_values->present_cell.get() !=
nullptr,
2573 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
2576 internal::do_function_gradients<dim, spacedim>(
2578 fe_values->finite_element_output.shape_gradients,
2579 shape_function_data,
2590 template <
int dim,
int spacedim>
2596 scalars.reserve(n_scalars);
2597 for (
unsigned int component = 0; component < n_scalars; ++component)
2598 scalars.emplace_back(fe_values, component);
2603 const unsigned int n_vectors =
2605 vectors.reserve(n_vectors);
2606 for (
unsigned int component = 0; component < n_vectors; ++component)
2607 vectors.emplace_back(fe_values, component);
2610 const unsigned int n_symmetric_second_order_tensors =
2614 symmetric_second_order_tensors.reserve(n_symmetric_second_order_tensors);
2615 for (
unsigned int component = 0;
2616 component < n_symmetric_second_order_tensors;
2618 symmetric_second_order_tensors.emplace_back(fe_values, component);
2622 const unsigned int n_second_order_tensors =
2625 second_order_tensors.reserve(n_second_order_tensors);
2626 for (
unsigned int component = 0; component < n_second_order_tensors;
2628 second_order_tensors.emplace_back(fe_values, component);
2636 template <
int dim,
int spacedim>
2660 n_dofs_for_dof_handler()
const = 0;
2662 #include "fe_values.decl.1.inst" 2669 get_interpolated_dof_values(
const IndexSet & in,
2670 Vector<IndexSet::value_type> &out)
const = 0;
2682 template <
int dim,
int spacedim>
2683 template <
typename CI>
2707 n_dofs_for_dof_handler()
const override;
2709 #include "fe_values.decl.2.inst" 2716 get_interpolated_dof_values(
const IndexSet & in,
2717 Vector<IndexSet::value_type> &out)
const override;
2747 template <
int dim,
int spacedim>
2773 n_dofs_for_dof_handler()
const override;
2775 #include "fe_values.decl.2.inst" 2782 get_interpolated_dof_values(
const IndexSet & in,
2783 Vector<IndexSet::value_type> &out)
const override;
2804 template <
int dim,
int spacedim>
2805 template <
typename CI>
2812 template <
int dim,
int spacedim>
2813 template <
typename CI>
2822 template <
int dim,
int spacedim>
2823 template <
typename CI>
2827 return cell->get_dof_handler().n_dofs();
2832 #include "fe_values.impl.1.inst" 2836 template <
int dim,
int spacedim>
2837 template <
typename CI>
2841 Vector<IndexSet::value_type> &out)
const 2846 cell->get_fe().dofs_per_cell);
2849 for (
unsigned int i = 0; i <
cell->get_fe().dofs_per_cell; ++i)
2856 template <
int dim,
int spacedim>
2858 spacedim>::TriaCellIterator::message_string =
2859 (
"You have previously called the FEValues::reinit function with a\n" 2860 "cell iterator of type Triangulation<dim,spacedim>::cell_iterator. However,\n" 2861 "when you do this, you cannot call some functions in the FEValues\n" 2862 "class, such as the get_function_values/gradients/hessians/third_derivatives\n" 2863 "functions. If you need these functions, then you need to call\n" 2864 "FEValues::reinit with an iterator type that allows to extract\n" 2865 "degrees of freedom, such as DoFHandler<dim,spacedim>::cell_iterator.");
2869 template <
int dim,
int spacedim>
2877 template <
int dim,
int spacedim>
2886 template <
int dim,
int spacedim>
2896 #include "fe_values.impl.2.inst" 2900 template <
int dim,
int spacedim>
2904 Vector<IndexSet::value_type> &)
const 2913 namespace FEValuesImplementation
2915 template <
int dim,
int spacedim>
2923 n_quadrature_points,
2927 this->JxW_values.resize(n_quadrature_points,
2928 numbers::signaling_nan<double>());
2931 this->jacobians.resize(
2932 n_quadrature_points,
2936 this->jacobian_grads.resize(
2937 n_quadrature_points,
2941 this->jacobian_pushed_forward_grads.resize(
2945 this->jacobian_2nd_derivatives.resize(
2946 n_quadrature_points,
2950 this->jacobian_pushed_forward_2nd_derivatives.resize(
2954 this->jacobian_3rd_derivatives.resize(n_quadrature_points);
2957 this->jacobian_pushed_forward_3rd_derivatives.resize(
2961 this->inverse_jacobians.resize(
2962 n_quadrature_points,
2966 this->boundary_forms.resize(
2970 this->normal_vectors.resize(
2976 template <
int dim,
int spacedim>
2987 jacobian_pushed_forward_2nd_derivatives) +
2990 jacobian_pushed_forward_3rd_derivatives) +
2999 template <
int dim,
int spacedim>
3009 this->shape_function_to_row_table =
3014 unsigned int n_nonzero_shape_components = 0;
3024 this->shape_values.reinit(n_nonzero_shape_components,
3025 n_quadrature_points);
3026 this->shape_values.fill(numbers::signaling_nan<double>());
3031 this->shape_gradients.reinit(n_nonzero_shape_components,
3032 n_quadrature_points);
3033 this->shape_gradients.fill(
3039 this->shape_hessians.reinit(n_nonzero_shape_components,
3040 n_quadrature_points);
3041 this->shape_hessians.fill(
3047 this->shape_3rd_derivatives.reinit(n_nonzero_shape_components,
3048 n_quadrature_points);
3049 this->shape_3rd_derivatives.fill(
3056 template <
int dim,
int spacedim>
3075 template <
int dim,
int spacedim>
3077 const unsigned int n_q_points,
3083 , dofs_per_cell(dofs_per_cell)
3084 , mapping(&mapping, typeid(*this).name())
3085 , fe(&fe, typeid(*this).name())
3090 ExcMessage(
"There is nothing useful you can do with an FEValues " 3091 "object when using a quadrature formula with zero " 3092 "quadrature points!"));
3098 template <
int dim,
int spacedim>
3116 template <
typename Number,
typename Number2>
3119 const ::Table<2, double> &shape_values,
3120 std::vector<Number> & values)
3125 dofs_per_cell > 0 ? shape_values.n_cols() : values.size();
3129 std::fill_n(values.begin(),
3140 for (
unsigned int shape_func = 0; shape_func <
dofs_per_cell; ++shape_func)
3142 const Number2
value = dof_values_ptr[shape_func];
3150 const double *shape_value_ptr = &shape_values(shape_func, 0);
3152 values[
point] += value * (*shape_value_ptr++);
3158 template <
int dim,
int spacedim,
typename VectorType>
3161 const typename VectorType::value_type *dof_values_ptr,
3162 const ::Table<2, double> & shape_values,
3164 const std::vector<unsigned int> & shape_function_to_row_table,
3166 const bool quadrature_points_fastest =
false,
3167 const unsigned int component_multiple = 1)
3169 using Number =
typename VectorType::value_type;
3171 for (
unsigned int i = 0; i < values.
size(); ++i)
3172 std::fill_n(values[i].
begin(),
3174 typename VectorType::value_type());
3179 if (dofs_per_cell == 0)
3186 const unsigned result_components = n_components * component_multiple;
3187 (void)result_components;
3188 if (quadrature_points_fastest)
3191 for (
unsigned int i = 0; i < values.
size(); ++i)
3197 for (
unsigned int i = 0; i < values.
size(); ++i)
3204 for (
unsigned int mc = 0; mc < component_multiple; ++mc)
3205 for (
unsigned int shape_func = 0; shape_func <
dofs_per_cell;
3217 const unsigned int comp =
3220 const unsigned int row =
3221 shape_function_to_row_table[shape_func * n_components + comp];
3223 const double *shape_value_ptr = &shape_values(row, 0);
3225 if (quadrature_points_fastest)
3230 values_comp[
point] += value * (*shape_value_ptr++);
3235 values[
point][comp] += value * (*shape_value_ptr++);
3243 const unsigned int row =
3244 shape_function_to_row_table[shape_func * n_components + c];
3246 const double * shape_value_ptr = &shape_values(row, 0);
3249 if (quadrature_points_fastest)
3254 values_comp[
point] += value * (*shape_value_ptr++);
3259 values[
point][comp] += value * (*shape_value_ptr++);
3268 template <
int order,
int spacedim,
typename Number>
3271 const Number * dof_values_ptr,
3275 const unsigned int dofs_per_cell = shape_derivatives.size()[0];
3277 dofs_per_cell > 0 ? shape_derivatives[0].size() : derivatives.size();
3281 std::fill_n(derivatives.begin(),
3292 for (
unsigned int shape_func = 0; shape_func <
dofs_per_cell; ++shape_func)
3294 const Number &
value = dof_values_ptr[shape_func];
3302 &shape_derivatives[shape_func][0];
3304 derivatives[
point] += value * (*shape_derivative_ptr++);
3310 template <
int order,
int dim,
int spacedim,
typename Number>
3313 const Number * dof_values_ptr,
3316 const std::vector<unsigned int> &shape_function_to_row_table,
3318 const bool quadrature_points_fastest =
false,
3319 const unsigned int component_multiple = 1)
3322 for (
unsigned int i = 0; i < derivatives.size(); ++i)
3323 std::fill_n(derivatives[i].
begin(),
3324 derivatives[i].size(),
3330 if (dofs_per_cell == 0)
3338 const unsigned result_components = n_components * component_multiple;
3339 (void)result_components;
3340 if (quadrature_points_fastest)
3343 for (
unsigned int i = 0; i < derivatives.size(); ++i)
3349 for (
unsigned int i = 0; i < derivatives.size(); ++i)
3356 for (
unsigned int mc = 0; mc < component_multiple; ++mc)
3357 for (
unsigned int shape_func = 0; shape_func <
dofs_per_cell;
3369 const unsigned int comp =
3372 const unsigned int row =
3373 shape_function_to_row_table[shape_func * n_components + comp];
3376 &shape_derivatives[row][0];
3378 if (quadrature_points_fastest)
3381 derivatives[comp][
point] += value * (*shape_derivative_ptr++);
3385 derivatives[
point][comp] += value * (*shape_derivative_ptr++);
3393 const unsigned int row =
3394 shape_function_to_row_table[shape_func * n_components + c];
3397 &shape_derivatives[row][0];
3400 if (quadrature_points_fastest)
3403 derivatives[comp][
point] +=
3404 value * (*shape_derivative_ptr++);
3408 derivatives[
point][comp] +=
3409 value * (*shape_derivative_ptr++);
3416 template <
int spacedim,
typename Number,
typename Number2>
3419 const Number2 * dof_values_ptr,
3421 std::vector<Number> & laplacians)
3423 const unsigned int dofs_per_cell = shape_hessians.size()[0];
3425 dofs_per_cell > 0 ? shape_hessians[0].size() : laplacians.size();
3429 std::fill_n(laplacians.begin(),
3436 for (
unsigned int shape_func = 0; shape_func <
dofs_per_cell; ++shape_func)
3438 const Number2
value = dof_values_ptr[shape_func];
3447 &shape_hessians[shape_func][0];
3449 laplacians[
point] += value *
trace(*shape_hessian_ptr++);
3455 template <
int dim,
int spacedim,
typename VectorType,
typename Number>
3458 const Number * dof_values_ptr,
3461 const std::vector<unsigned int> & shape_function_to_row_table,
3462 std::vector<VectorType> & laplacians,
3463 const bool quadrature_points_fastest =
false,
3464 const unsigned int component_multiple = 1)
3467 for (
unsigned int i = 0; i < laplacians.size(); ++i)
3468 std::fill_n(laplacians[i].
begin(),
3469 laplacians[i].size(),
3470 typename VectorType::value_type());
3475 if (dofs_per_cell == 0)
3483 const unsigned result_components = n_components * component_multiple;
3484 (void)result_components;
3485 if (quadrature_points_fastest)
3488 for (
unsigned int i = 0; i < laplacians.size(); ++i)
3494 for (
unsigned int i = 0; i < laplacians.size(); ++i)
3501 for (
unsigned int mc = 0; mc < component_multiple; ++mc)
3502 for (
unsigned int shape_func = 0; shape_func <
dofs_per_cell;
3514 const unsigned int comp =
3517 const unsigned int row =
3518 shape_function_to_row_table[shape_func * n_components + comp];
3521 &shape_hessians[row][0];
3522 if (quadrature_points_fastest)
3524 VectorType &laplacians_comp = laplacians[comp];
3527 laplacians_comp[
point] +=
3528 value *
trace(*shape_hessian_ptr++);
3533 laplacians[
point][comp] +=
3534 value *
trace(*shape_hessian_ptr++);
3542 const unsigned int row =
3543 shape_function_to_row_table[shape_func * n_components + c];
3546 &shape_hessians[row][0];
3549 if (quadrature_points_fastest)
3551 VectorType &laplacians_comp = laplacians[comp];
3554 laplacians_comp[
point] +=
3555 value *
trace(*shape_hessian_ptr++);
3560 laplacians[
point][comp] +=
3561 value *
trace(*shape_hessian_ptr++);
3569 template <
int dim,
int spacedim>
3570 template <
class InputVector>
3573 const InputVector & fe_function,
3574 std::vector<typename InputVector::value_type> &values)
const 3576 using Number =
typename InputVector::value_type;
3581 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
3586 present_cell->get_interpolated_dof_values(fe_function, dof_values);
3594 template <
int dim,
int spacedim>
3595 template <
class InputVector>
3598 const InputVector & fe_function,
3600 std::vector<typename InputVector::value_type> & values)
const 3602 using Number =
typename InputVector::value_type;
3608 boost::container::small_vector<Number, 200> dof_values(
dofs_per_cell);
3618 template <
int dim,
int spacedim>
3619 template <
class InputVector>
3622 const InputVector & fe_function,
3623 std::vector<Vector<typename InputVector::value_type>> &values)
const 3625 using Number =
typename InputVector::value_type;
3627 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
3635 present_cell->get_interpolated_dof_values(fe_function, dof_values);
3646 template <
int dim,
int spacedim>
3647 template <
class InputVector>
3650 const InputVector & fe_function,
3652 std::vector<Vector<typename InputVector::value_type>> &values)
const 3654 using Number =
typename InputVector::value_type;
3662 boost::container::small_vector<Number, 200> dof_values(
dofs_per_cell);
3677 template <
int dim,
int spacedim>
3678 template <
class InputVector>
3681 const InputVector & fe_function,
3683 ArrayView<std::vector<typename InputVector::value_type>> values,
3684 bool quadrature_points_fastest)
const 3686 using Number =
typename InputVector::value_type;
3695 boost::container::small_vector<Number, 200> dof_values(indices.
size());
3696 for (
unsigned int i = 0; i < indices.
size(); ++i)
3704 quadrature_points_fastest,
3710 template <
int dim,
int spacedim>
3711 template <
class InputVector>
3714 const InputVector &fe_function,
3718 using Number =
typename InputVector::value_type;
3723 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
3728 present_cell->get_interpolated_dof_values(fe_function, dof_values);
3736 template <
int dim,
int spacedim>
3737 template <
class InputVector>
3740 const InputVector & fe_function,
3745 using Number =
typename InputVector::value_type;
3751 boost::container::small_vector<Number, 200> dof_values(
dofs_per_cell);
3761 template <
int dim,
int spacedim>
3762 template <
class InputVector>
3765 const InputVector &fe_function,
3770 using Number =
typename InputVector::value_type;
3774 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
3779 present_cell->get_interpolated_dof_values(fe_function, dof_values);
3790 template <
int dim,
int spacedim>
3791 template <
class InputVector>
3794 const InputVector & fe_function,
3798 bool quadrature_points_fastest)
const 3800 using Number =
typename InputVector::value_type;
3808 boost::container::small_vector<Number, 200> dof_values(indices.
size());
3809 for (
unsigned int i = 0; i < indices.
size(); ++i)
3817 quadrature_points_fastest,
3823 template <
int dim,
int spacedim>
3824 template <
class InputVector>
3827 const InputVector &fe_function,
3831 using Number =
typename InputVector::value_type;
3836 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
3841 present_cell->get_interpolated_dof_values(fe_function, dof_values);
3849 template <
int dim,
int spacedim>
3850 template <
class InputVector>
3853 const InputVector & fe_function,
3858 using Number =
typename InputVector::value_type;
3864 boost::container::small_vector<Number, 200> dof_values(
dofs_per_cell);
3874 template <
int dim,
int spacedim>
3875 template <
class InputVector>
3878 const InputVector &fe_function,
3882 bool quadrature_points_fastest)
const 3884 using Number =
typename InputVector::value_type;
3888 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
3893 present_cell->get_interpolated_dof_values(fe_function, dof_values);
3900 quadrature_points_fastest);
3905 template <
int dim,
int spacedim>
3906 template <
class InputVector>
3909 const InputVector & fe_function,
3913 bool quadrature_points_fastest)
const 3915 using Number =
typename InputVector::value_type;
3921 boost::container::small_vector<Number, 200> dof_values(indices.
size());
3922 for (
unsigned int i = 0; i < indices.
size(); ++i)
3930 quadrature_points_fastest,
3936 template <
int dim,
int spacedim>
3937 template <
class InputVector>
3940 const InputVector & fe_function,
3941 std::vector<typename InputVector::value_type> &laplacians)
const 3943 using Number =
typename InputVector::value_type;
3948 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
3953 present_cell->get_interpolated_dof_values(fe_function, dof_values);
3961 template <
int dim,
int spacedim>
3962 template <
class InputVector>
3965 const InputVector & fe_function,
3967 std::vector<typename InputVector::value_type> & laplacians)
const 3969 using Number =
typename InputVector::value_type;
3975 boost::container::small_vector<Number, 200> dof_values(
dofs_per_cell);
3985 template <
int dim,
int spacedim>
3986 template <
class InputVector>
3989 const InputVector & fe_function,
3990 std::vector<Vector<typename InputVector::value_type>> &laplacians)
const 3992 using Number =
typename InputVector::value_type;
3994 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
4001 present_cell->get_interpolated_dof_values(fe_function, dof_values);
4012 template <
int dim,
int spacedim>
4013 template <
class InputVector>
4016 const InputVector & fe_function,
4018 std::vector<Vector<typename InputVector::value_type>> &laplacians)
const 4020 using Number =
typename InputVector::value_type;
4028 boost::container::small_vector<Number, 200> dof_values(indices.
size());
4029 for (
unsigned int i = 0; i < indices.
size(); ++i)
4043 template <
int dim,
int spacedim>
4044 template <
class InputVector>
4047 const InputVector & fe_function,
4049 std::vector<std::vector<typename InputVector::value_type>> &laplacians,
4050 bool quadrature_points_fastest)
const 4052 using Number =
typename InputVector::value_type;
4058 boost::container::small_vector<Number, 200> dof_values(indices.
size());
4059 for (
unsigned int i = 0; i < indices.
size(); ++i)
4067 quadrature_points_fastest,
4073 template <
int dim,
int spacedim>
4074 template <
class InputVector>
4077 const InputVector &fe_function,
4079 &third_derivatives)
const 4081 using Number =
typename InputVector::value_type;
4086 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
4091 present_cell->get_interpolated_dof_values(fe_function, dof_values);
4100 template <
int dim,
int spacedim>
4101 template <
class InputVector>
4104 const InputVector & fe_function,
4107 &third_derivatives)
const 4109 using Number =
typename InputVector::value_type;
4115 boost::container::small_vector<Number, 200> dof_values(
dofs_per_cell);
4126 template <
int dim,
int spacedim>
4127 template <
class InputVector>
4130 const InputVector &fe_function,
4133 & third_derivatives,
4134 bool quadrature_points_fastest)
const 4136 using Number =
typename InputVector::value_type;
4140 ExcMessage(
"FEValues object is not reinit'ed to any cell"));
4145 present_cell->get_interpolated_dof_values(fe_function, dof_values);
4152 quadrature_points_fastest);
4157 template <
int dim,
int spacedim>
4158 template <
class InputVector>
4161 const InputVector & fe_function,
4165 bool quadrature_points_fastest)
const 4167 using Number =
typename InputVector::value_type;
4173 boost::container::small_vector<Number, 200> dof_values(indices.
size());
4174 for (
unsigned int i = 0; i < indices.
size(); ++i)
4182 quadrature_points_fastest,
4188 template <
int dim,
int spacedim>
4197 template <
int dim,
int spacedim>
4198 const std::vector<Tensor<1, spacedim>> &
4203 "update_normal_vectors")));
4210 template <
int dim,
int spacedim>
4230 template <
int dim,
int spacedim>
4241 UpdateFlags flags = update_flags |
fe->requires_update_flags(update_flags);
4242 flags |=
mapping->requires_update_flags(flags);
4249 template <
int dim,
int spacedim>
4267 template <
int dim,
int spacedim>
4274 if (&cell->get_triangulation() !=
4278 ->get_triangulation())
4287 cell->get_triangulation().signals.any_change.connect(
4290 cell->get_triangulation().signals.mesh_movement.connect(
4300 cell->get_triangulation().signals.post_refinement.connect(
4303 cell->get_triangulation().signals.mesh_movement.connect(
4310 template <
int dim,
int spacedim>
4346 (cell->is_translation_of(
4356 ->direction_flag() != cell->direction_flag())
4365 template <
int dim,
int spacedim>
4374 template <
int dim,
int spacedim>
4379 template <
int dim,
int spacedim>
4384 template <
int dim,
int spacedim>
4389 template <
int dim,
int spacedim>
4406 template <
int dim,
int spacedim>
4422 template <
int dim,
int spacedim>
4428 if (dim != spacedim - 1)
4430 ExcMessage(
"You can only pass the 'update_normal_vectors' " 4431 "flag to FEFaceValues or FESubfaceValues objects, " 4432 "but not to an FEValues object unless the " 4433 "triangulation it refers to is embedded in a higher " 4434 "dimensional space."));
4448 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>>
4456 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>>
4458 if (flags & update_mapping)
4464 this->update_flags = flags;
4467 this->
fe_data = std::move(fe_get_data.return_value());
4468 if (flags & update_mapping)
4469 this->
mapping_data = std::move(mapping_get_data.return_value());
4483 template <
typename Type,
typename Po
inter,
typename Iterator>
4485 reset_pointer_in_place_if_possible(std::unique_ptr<Pointer> &
present_cell,
4491 if (present_cell.get() && (
typeid(*present_cell.get()) ==
typeid(Type)))
4494 static_cast<const Type *
>(present_cell.get())->~Type();
4497 new (
const_cast<void *
>(
static_cast<const void *
>(present_cell.get())))
4502 present_cell = std_cxx14::make_unique<Type>(new_cell);
4508 template <
int dim,
int spacedim>
4518 reset_pointer_in_place_if_possible<
4530 template <
int dim,
int spacedim>
4531 template <
template <
int,
int>
class DoFHandlerType,
bool lda>
4545 reset_pointer_in_place_if_possible<
4558 template <
int dim,
int spacedim>
4592 template <
int dim,
int spacedim>
4604 template <
int dim,
int spacedim>
4606 const unsigned int n_q_points,
4618 , quadrature(quadrature)
4623 template <
int dim,
int spacedim>
4624 const std::vector<Tensor<1, spacedim>> &
4629 "update_boundary_forms")));
4635 template <
int dim,
int spacedim>
4646 template <
int dim,
int spacedim>
4651 template <
int dim,
int spacedim>
4656 template <
int dim,
int spacedim>
4674 template <
int dim,
int spacedim>
4691 template <
int dim,
int spacedim>
4707 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>>
4716 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>>
4718 if (flags & update_mapping)
4724 this->update_flags = flags;
4727 this->
fe_data = std::move(fe_get_data.return_value());
4728 if (flags & update_mapping)
4729 this->
mapping_data = std::move(mapping_get_data.return_value());
4737 template <
int dim,
int spacedim>
4738 template <
template <
int,
int>
class DoFHandlerType,
bool lda>
4742 const unsigned int face_no)
4748 cell->get_dof_handler().get_fe(cell->active_fe_index())),
4754 reset_pointer_in_place_if_possible<
4767 template <
int dim,
int spacedim>
4768 template <
template <
int,
int>
class DoFHandlerType,
bool lda>
4774 const auto face_n = cell->face_iterator_to_index(face);
4780 template <
int dim,
int spacedim>
4784 const unsigned int face_no)
4789 reset_pointer_in_place_if_possible<
4801 template <
int dim,
int spacedim>
4807 const auto face_n = cell->face_iterator_to_index(face);
4813 template <
int dim,
int spacedim>
4845 template <
int dim,
int spacedim>
4850 template <
int dim,
int spacedim>
4855 template <
int dim,
int spacedim>
4873 template <
int dim,
int spacedim>
4890 template <
int dim,
int spacedim>
4907 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>>
4916 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>>
4918 if (flags & update_mapping)
4925 this->update_flags = flags;
4928 this->
fe_data = std::move(fe_get_data.return_value());
4929 if (flags & update_mapping)
4930 this->
mapping_data = std::move(mapping_get_data.return_value());
4938 template <
int dim,
int spacedim>
4939 template <
template <
int,
int>
class DoFHandlerType,
bool lda>
4943 const unsigned int face_no,
4944 const unsigned int subface_no)
4950 cell->get_dof_handler().get_fe(cell->active_fe_index())),
4957 Assert(cell->face(face_no)->has_children() ||
4958 subface_no < GeometryInfo<dim>::max_children_per_face,
4962 Assert(!cell->face(face_no)->has_children() ||
4963 subface_no < cell->face(face_no)->number_of_children(),
4966 cell->face(face_no)->number_of_children()));
4967 Assert(cell->has_children() ==
false,
4968 ExcMessage(
"You can't use subface data for cells that are " 4969 "already refined. Iterate over their children " 4970 "instead in these cases."));
4973 reset_pointer_in_place_if_possible<
4986 template <
int dim,
int spacedim>
4987 template <
template <
int,
int>
class DoFHandlerType,
bool lda>
4995 cell->face_iterator_to_index(face),
4996 face->child_iterator_to_index(subface));
5001 template <
int dim,
int spacedim>
5005 const unsigned int face_no,
5006 const unsigned int subface_no)
5014 (cell->has_periodic_neighbor(face_no) ?
5015 cell->periodic_neighbor(face_no)
5016 ->face(cell->periodic_neighbor_face_no(face_no))
5018 cell->face(face_no)->n_children()));
5021 reset_pointer_in_place_if_possible<
5033 template <
int dim,
int spacedim>
5041 cell->face_iterator_to_index(face),
5042 face->child_iterator_to_index(subface));
5047 template <
int dim,
int spacedim>
5050 const unsigned int subface_no)
5056 if (!cell->face(face_no)->has_children())
5067 switch (cell->subface_case(face_no))
5072 subface_index = cell->face(face_no)->child_index(subface_no);
5076 subface_index = cell->face(face_no)
5077 ->child(subface_no / 2)
5078 ->child_index(subface_no % 2);
5087 cell->face(face_no)->child(0)->child_index(subface_no);
5090 subface_index = cell->face(face_no)->child_index(1);
5101 subface_index = cell->face(face_no)->child_index(0);
5106 cell->face(face_no)->child(1)->child_index(subface_no - 1);
5145 #define SPLIT_INSTANTIATIONS_COUNT 6 5146 #ifndef SPLIT_INSTANTIATIONS_INDEX 5147 # define SPLIT_INSTANTIATIONS_INDEX 0 5149 #include "fe_values.inst" void get_function_third_derivatives(const InputVector &fe_function, std::vector< typename ProductType< third_derivative_type, typename InputVector::value_type >::type > &third_derivatives) const
Transformed quadrature weights.
constexpr Tensor()=default
virtual ~FEValuesBase() override
typename ProductType< Number, typename Vector< dim, spacedim >::curl_type >::type curl_type
void do_function_curls(const ArrayView< Number > &dof_values, const Table< 2, ::Tensor< 1, spacedim >> &shape_gradients, const std::vector< typename Vector< dim, spacedim >::ShapeFunctionData > &shape_function_data, std::vector< typename ProductType< Number, typename ::internal::CurlType< spacedim >::type >::type > &curls)
typename FEValuesViews::View< dim, spacedim, Extractor >::template OutputType< NumberType > OutputType
void reinit(const TriaIterator< DoFCellAccessor< DoFHandlerType< dim, spacedim >, level_dof_access >> &cell, const unsigned int face_no, const unsigned int subface_no)
static const unsigned int invalid_unsigned_int
std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > fe_data
CellSimilarity::Similarity cell_similarity
typename ProductType< Number, typename Tensor< 2, dim, spacedim >::gradient_type >::type gradient_type
typename ProductType< Number, typename SymmetricTensor< 2, dim, spacedim >::value_type >::type value_type
static constexpr unsigned int component_to_unrolled_index(const TableIndices< rank_ > &indices)
#define AssertDimension(dim1, dim2)
unsigned int present_face_index
void do_function_values(const typename VectorType::value_type *dof_values_ptr, const ::Table< 2, double > &shape_values, const FiniteElement< dim, spacedim > &fe, const std::vector< unsigned int > &shape_function_to_row_table, ArrayView< VectorType > values, const bool quadrature_points_fastest=false, const unsigned int component_multiple=1)
static constexpr const T & value(const T &t)
unsigned int n_nonzero_components(const unsigned int i) const
constexpr SymmetricTensor< 2, dim, Number > symmetrize(const Tensor< 2, dim, Number > &t)
const SmartPointer< const FEValuesBase< dim, spacedim > > fe_values
typename internal::ProductTypeImpl< typename std::decay< T >::type, typename std::decay< U >::type >::type type
Task< RT > new_task(const std::function< RT()> &function)
virtual void get_interpolated_dof_values(const Vector< double > &in, Vector< Vector< double > ::value_type > &out) const override
const unsigned int dofs_per_cell
const unsigned int component
void get_function_symmetric_gradients_from_local_dof_values(const InputVector &dof_values, std::vector< typename OutputType< typename InputVector::value_type >::symmetric_gradient_type > &symmetric_gradients) const
void get_function_values(const InputVector &fe_function, std::vector< typename ProductType< value_type, typename InputVector::value_type >::type > &values) const
const Quadrature< dim - 1 > quadrature
FEValuesBase(const unsigned int n_q_points, const unsigned int dofs_per_cell, const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe)
void get_function_third_derivatives(const InputVector &fe_function, std::vector< typename ProductType< third_derivative_type, typename InputVector::value_type >::type > &third_derivatives) const
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcAccessToUninitializedField(std::string arg1)
const Mapping< dim, spacedim > & get_mapping() const
void get_function_values(const InputVector &fe_function, std::vector< typename InputVector::value_type > &values) const
Outer normal vector, not normalized.
static constexpr TableIndices< rank_ > unrolled_to_component_indices(const unsigned int i)
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=StaticMappingQ1< dim, spacedim >::mapping)
typename ProductType< Number, typename Scalar< dim, spacedim >::hessian_type >::type hessian_type
FEFaceValuesBase(const unsigned int n_q_points, const unsigned int dofs_per_cell, const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const Quadrature< dim - 1 > &quadrature)
const FiniteElement< dim, spacedim > & get_fe() const
std::unique_ptr< const CellIteratorBase > present_cell
static ::ExceptionBase & ExcFEDontMatch()
void get_function_divergences(const InputVector &fe_function, std::vector< typename ProductType< divergence_type, typename InputVector::value_type >::type > &divergences) const
void get_function_laplacians(const InputVector &fe_function, std::vector< typename ProductType< value_type, typename InputVector::value_type >::type > &laplacians) const
TriaCellIterator(const typename Triangulation< dim, spacedim >::cell_iterator &cell)
Transformed quadrature points.
void do_reinit(const unsigned int face_no)
std::size_t memory_consumption() const
typename ProductType< Number, typename Scalar< dim, spacedim >::value_type >::type value_type
bool is_primitive() const
void check_cell_similarity(const typename Triangulation< dim, spacedim >::cell_iterator &cell)
const SmartPointer< const Mapping< dim, spacedim >, FEValuesBase< dim, spacedim > > mapping
static ::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
::internal::FEValuesViews::Cache< dim, spacedim > fe_values_views_cache
void do_reinit(const unsigned int face_no, const unsigned int subface_no)
void get_function_divergences_from_local_dof_values(const InputVector &dof_values, std::vector< typename OutputType< typename InputVector::value_type >::divergence_type > &divergences) const
void get_function_curls_from_local_dof_values(const InputVector &dof_values, std::vector< typename OutputType< typename InputVector::value_type >::curl_type > &curls) const
typename ProductType< Number, typename Vector< dim, spacedim >::gradient_type >::type gradient_type
void get_function_laplacians(const InputVector &fe_function, std::vector< typename ProductType< value_type, typename InputVector::value_type >::type > &laplacians) const
void get_function_hessians_from_local_dof_values(const InputVector &dof_values, std::vector< typename OutputType< typename InputVector::value_type >::hessian_type > &hessians) const
void do_function_derivatives(const Number *dof_values_ptr, const ::Table< 2, Tensor< order, spacedim >> &shape_derivatives, const FiniteElement< dim, spacedim > &fe, const std::vector< unsigned int > &shape_function_to_row_table, ArrayView< std::vector< Tensor< order, spacedim, Number >>> derivatives, const bool quadrature_points_fastest=false, const unsigned int component_multiple=1)
const Triangulation< dim, spacedim >::cell_iterator cell
void get_function_gradients(const InputVector &fe_function, std::vector< typename ProductType< gradient_type, typename InputVector::value_type >::type > &gradients) const
typename ProductType< Number, typename Scalar< dim, spacedim >::gradient_type >::type gradient_type
void get_function_hessians(const InputVector &fe_function, std::vector< typename ProductType< hessian_type, typename InputVector::value_type >::type > &hessians) const
void get_function_laplacians(const InputVector &fe_function, std::vector< typename InputVector::value_type > &laplacians) const
typename ProductType< Number, typename Tensor< 2, dim, spacedim >::value_type >::type value_type
static ::ExceptionBase & ExcMessage(std::string arg1)
void get_function_gradients_from_local_dof_values(const InputVector &dof_values, std::vector< typename OutputType< typename InputVector::value_type >::gradient_type > &gradients) const
constexpr SymmetricTensor()=default
static constexpr TableIndices< rank_ > unrolled_to_component_indices(const unsigned int i)
void do_function_laplacians(const Number *dof_values_ptr, const ::Table< 2, Tensor< 2, spacedim >> &shape_hessians, const FiniteElement< dim, spacedim > &fe, const std::vector< unsigned int > &shape_function_to_row_table, std::vector< VectorType > &laplacians, const bool quadrature_points_fastest=false, const unsigned int component_multiple=1)
CellSimilarity::Similarity get_cell_similarity() const
Third derivatives of shape functions.
UpdateFlags compute_update_flags(const UpdateFlags update_flags) const
void get_function_laplacians_from_local_dof_values(const InputVector &dof_values, std::vector< typename OutputType< typename InputVector::value_type >::laplacian_type > &laplacians) const
void do_function_values(const Number2 *dof_values_ptr, const ::Table< 2, double > &shape_values, std::vector< Number > &values)
std::vector< unsigned int > make_shape_function_to_row_table(const FiniteElement< dim, spacedim > &fe)
#define Assert(cond, exc)
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
FESubfaceValues(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const Quadrature< dim - 1 > &face_quadrature, const UpdateFlags update_flags)
Abstract base class for mapping classes.
const ComponentMask & get_nonzero_components(const unsigned int i) const
std::vector< ShapeFunctionData > shape_function_data
const Quadrature< dim > quadrature
const unsigned int first_vector_component
ArrayView< typename std::remove_reference< typename std::iterator_traits< Iterator >::reference >::type, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
virtual types::global_dof_index n_dofs_for_dof_handler() const override
void do_function_laplacians(const Number2 *dof_values_ptr, const ::Table< 2, Tensor< 2, spacedim >> &shape_hessians, std::vector< Number > &laplacians)
#define DEAL_II_NAMESPACE_CLOSE
void invalidate_present_cell()
std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > mapping_data
static const char *const message_string
void get_function_hessians_from_local_dof_values(const InputVector &dof_values, std::vector< typename OutputType< typename InputVector::value_type >::hessian_type > &hessians) const
void get_function_symmetric_gradients(const InputVector &fe_function, std::vector< typename ProductType< symmetric_gradient_type, typename InputVector::value_type >::type > &symmetric_gradients) const
Second derivatives of shape functions.
Gradient of volume element.
Point< spacedim > point(const gp_Pnt &p, const double tolerance=1e-10)
typename ProductType< Number, typename SymmetricTensor< 2, dim, spacedim >::divergence_type >::type divergence_type
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
std::size_t memory_consumption() const
void reinit(const TriaIterator< DoFCellAccessor< DoFHandlerType< dim, spacedim >, level_dof_access >> &cell)
const unsigned int dofs_per_cell
void get_function_hessians(const InputVector &fe_function, std::vector< typename ProductType< hessian_type, typename InputVector::value_type >::type > &hessians) const
void do_function_divergences(const ArrayView< Number > &dof_values, const Table< 2, ::Tensor< 1, spacedim >> &shape_gradients, const std::vector< typename Tensor< 2, dim, spacedim >::ShapeFunctionData > &shape_function_data, std::vector< typename Tensor< 2, dim, spacedim >::template OutputType< Number >::divergence_type > &divergences)
const unsigned int n_quadrature_points
void do_function_gradients(const ArrayView< Number > &dof_values, const Table< 2, ::Tensor< 1, spacedim >> &shape_gradients, const std::vector< typename Tensor< 2, dim, spacedim >::ShapeFunctionData > &shape_function_data, std::vector< typename Tensor< 2, dim, spacedim >::template OutputType< Number >::gradient_type > &gradients)
void get_function_hessians(const InputVector &fe_function, std::vector< Tensor< 2, spacedim, typename InputVector::value_type >> &hessians) const
VectorType::value_type get_vector_element(const VectorType &vector, const types::global_dof_index cell_number)
std_cxx20::ranges::iota_view< unsigned int, unsigned int > dof_indices() const
FEFaceValues(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const Quadrature< dim - 1 > &quadrature, const UpdateFlags update_flags)
void get_function_curls(const InputVector &fe_function, std::vector< typename ProductType< curl_type, typename InputVector::value_type >::type > &curls) const
void get_function_third_derivatives(const InputVector &fe_function, std::vector< Tensor< 3, spacedim, typename InputVector::value_type >> &third_derivatives) const
static VectorType::value_type get(const VectorType &V, const types::global_dof_index i)
MatrixTableIterators::Iterator< TransposeTable< T >, Constness, MatrixTableIterators::Storage::column_major > Iterator
boost::signals2::connection tria_listener_mesh_transform
typename ProductType< Number, typename Vector< dim, spacedim >::value_type >::type value_type
size_type size(const unsigned int i) const
std::pair< unsigned int, unsigned int > system_to_component_index(const unsigned int index) const
void do_function_derivatives(const Number *dof_values_ptr, const ::Table< 2, Tensor< order, spacedim >> &shape_derivatives, std::vector< Tensor< order, spacedim, Number >> &derivatives)
void get_function_laplacians_from_local_dof_values(const InputVector &dof_values, std::vector< typename OutputType< typename InputVector::value_type >::laplacian_type > &laplacians) const
unsigned int n_components() const
typename ProductType< Number, typename Vector< dim, spacedim >::divergence_type >::type divergence_type
#define DEAL_II_NAMESPACE_OPEN
void initialize(const UpdateFlags update_flags)
VectorType::value_type * begin(VectorType &V)
typename ProductType< Number, typename Vector< dim, spacedim >::hessian_type >::type hessian_type
Shape function gradients.
void get_function_third_derivatives_from_local_dof_values(const InputVector &dof_values, std::vector< typename OutputType< typename InputVector::value_type >::third_derivative_type > &third_derivatives) const
void maybe_invalidate_previous_present_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell)
typename ProductType< Number, typename Tensor< 2, dim, spacedim >::divergence_type >::type divergence_type
void get_function_gradients(const InputVector &fe_function, std::vector< Tensor< 1, spacedim, typename InputVector::value_type >> &gradients) const
void do_function_symmetric_gradients(const ArrayView< Number > &dof_values, const Table< 2, ::Tensor< 1, spacedim >> &shape_gradients, const std::vector< typename Vector< dim, spacedim >::ShapeFunctionData > &shape_function_data, std::vector< typename ProductType< Number, ::SymmetricTensor< 2, spacedim >>::type > &symmetric_gradients)
void initialize(const UpdateFlags update_flags)
void get_function_gradients_from_local_dof_values(const InputVector &dof_values, std::vector< typename OutputType< typename InputVector::value_type >::gradient_type > &gradients) const
static ::ExceptionBase & ExcNotMultiple(int arg1, int arg2)
constexpr Number trace(const SymmetricTensor< 2, dim2, Number > &)
static ::ExceptionBase & ExcNotImplemented()
static unsigned int n_threads()
void reinit(const TriaIterator< DoFCellAccessor< DoFHandlerType< dim, spacedim >, level_dof_access >> &cell, const unsigned int face_no)
const Triangulation< dim, spacedim >::cell_iterator get_cell() const
bool is_element(const size_type index) const
const SmartPointer< const FEValuesBase< dim, spacedim > > fe_values
void get_function_values(const InputVector &fe_function, std::vector< typename ProductType< value_type, typename InputVector::value_type >::type > &values) const
boost::signals2::connection tria_listener_refinement
::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > finite_element_output
TriaIterator< CellAccessor< dim, spacedim > > cell_iterator
typename ProductType< Number, typename Vector< dim, spacedim >::value_type >::type laplacian_type
const std::vector< Tensor< 1, spacedim > > & get_boundary_forms() const
void initialize(const UpdateFlags update_flags)
::internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > mapping_output
FEValues(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const Quadrature< dim > &quadrature, const UpdateFlags update_flags)
void get_function_gradients(const InputVector &fe_function, std::vector< typename ProductType< gradient_type, typename InputVector::value_type >::type > &gradients) const
void get_function_third_derivatives_from_local_dof_values(const InputVector &dof_values, std::vector< typename OutputType< typename InputVector::value_type >::third_derivative_type > &third_derivatives) const
const std::vector< Tensor< 1, spacedim > > & get_normal_vectors() const
void get_function_values_from_local_dof_values(const InputVector &dof_values, std::vector< typename OutputType< typename InputVector::value_type >::value_type > &values) const
typename ProductType< Number, typename Scalar< dim, spacedim >::value_type >::type laplacian_type
std::size_t memory_consumption() const
void get_function_values_from_local_dof_values(const InputVector &dof_values, std::vector< typename OutputType< typename InputVector::value_type >::value_type > &values) const
std::vector< ShapeFunctionData > shape_function_data
std::enable_if< std::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)
static ::ExceptionBase & ExcInternalError()
const SmartPointer< const FiniteElement< dim, spacedim >, FEValuesBase< dim, spacedim > > fe