15#ifndef dealii_mapping_q_internal_h
16#define dealii_mapping_q_internal_h
65 template <
int spacedim>
73 return Point<1>((p[0] - vertices[0][0]) /
74 (vertices[1][0] - vertices[0][0]));
79 template <
int spacedim>
91 const long double x = p[0];
92 const long double y = p[1];
94 const long double x0 = vertices[0][0];
95 const long double x1 = vertices[1][0];
96 const long double x2 = vertices[2][0];
97 const long double x3 = vertices[3][0];
99 const long double y0 = vertices[0][1];
100 const long double y1 = vertices[1][1];
101 const long double y2 = vertices[2][1];
102 const long double y3 = vertices[3][1];
104 const long double a = (x1 - x3) * (y0 - y2) - (x0 - x2) * (y1 - y3);
105 const long double b = -(x0 - x1 - x2 + x3) * y + (x - 2 * x1 + x3) * y0 -
106 (x - 2 * x0 + x2) * y1 - (x - x1) * y2 +
108 const long double c = (x0 - x1) * y - (x - x1) * y0 + (x - x0) * y1;
110 const long double discriminant = b * b - 4 * a * c;
119 const long double sqrt_discriminant =
std::sqrt(discriminant);
122 if (b != 0.0 &&
std::abs(b) == sqrt_discriminant)
133 eta1 = 2 * c / (-b - sqrt_discriminant);
134 eta2 = 2 * c / (-b + sqrt_discriminant);
139 eta1 = (-b - sqrt_discriminant) / (2 * a);
140 eta2 = (-b + sqrt_discriminant) / (2 * a);
143 const long double eta =
150 const long double subexpr0 = -eta * x2 + x0 * (eta - 1);
151 const long double xi_denominator0 = eta * x3 - x1 * (eta - 1) + subexpr0;
152 const long double max_x =
155 if (
std::abs(xi_denominator0) > 1e-10 * max_x)
157 const double xi = (x + subexpr0) / xi_denominator0;
158 return {xi,
static_cast<double>(eta)};
162 const long double max_y =
164 const long double subexpr1 = -eta * y2 + y0 * (eta - 1);
165 const long double xi_denominator1 =
166 eta * y3 - y1 * (eta - 1) + subexpr1;
167 if (
std::abs(xi_denominator1) > 1e-10 * max_y)
169 const double xi = (subexpr1 + y) / xi_denominator1;
170 return {xi,
static_cast<double>(eta)};
177 spacedim>::ExcTransformationFailed()));
183 return {std::numeric_limits<double>::quiet_NaN(),
184 std::numeric_limits<double>::quiet_NaN()};
189 template <
int spacedim>
198 return {std::numeric_limits<double>::quiet_NaN(),
199 std::numeric_limits<double>::quiet_NaN(),
200 std::numeric_limits<double>::quiet_NaN()};
218 std::vector<Point<dim>>
220 const std::vector<unsigned int> &renumbering)
224 std::vector<Point<dim>> points(renumbering.size());
225 const unsigned int n1 = line_support_points.size();
226 for (
unsigned int q2 = 0, q = 0; q2 < (dim > 2 ? n1 : 1); ++q2)
227 for (
unsigned int q1 = 0; q1 < (dim > 1 ? n1 : 1); ++q1)
228 for (
unsigned int q0 = 0; q0 < n1; ++q0, ++q)
230 points[renumbering[q]][0] = line_support_points[q0][0];
232 points[renumbering[q]][1] = line_support_points[q1][0];
234 points[renumbering[q]][2] = line_support_points[q2][0];
248 inline ::Table<2, double>
255 if (polynomial_degree == 1)
258 const unsigned int M = polynomial_degree - 1;
259 const unsigned int n_inner_2d = M * M;
260 const unsigned int n_outer_2d = 4 + 4 * M;
263 loqvs.reinit(n_inner_2d, n_outer_2d);
265 for (
unsigned int i = 0; i < M; ++i)
266 for (
unsigned int j = 0; j < M; ++j)
269 gl.point((i + 1) * (polynomial_degree + 1) + (j + 1));
270 const unsigned int index_table = i * M + j;
271 for (
unsigned int v = 0; v < 4; ++v)
272 loqvs(index_table, v) =
274 loqvs(index_table, 4 + i) = 1. - p[0];
275 loqvs(index_table, 4 + i + M) = p[0];
276 loqvs(index_table, 4 + j + 2 * M) = 1. - p[1];
277 loqvs(index_table, 4 + j + 3 * M) = p[1];
282 for (
unsigned int unit_point = 0; unit_point < n_inner_2d; ++unit_point)
283 Assert(std::fabs(std::accumulate(loqvs[unit_point].begin(),
284 loqvs[unit_point].end(),
286 1) < 1e-13 * polynomial_degree,
300 inline ::Table<2, double>
307 if (polynomial_degree == 1)
310 const unsigned int M = polynomial_degree - 1;
313 const unsigned int n_outer = 8 + 12 * M + 6 * M * M;
316 lohvs.reinit(n_inner, n_outer);
318 for (
unsigned int i = 0; i < M; ++i)
319 for (
unsigned int j = 0; j < M; ++j)
320 for (
unsigned int k = 0; k < M; ++k)
322 const Point<3> &p = gl.point((i + 1) * (M + 2) * (M + 2) +
323 (j + 1) * (M + 2) + (k + 1));
324 const unsigned int index_table = i * M * M + j * M + k;
327 for (
unsigned int v = 0; v < 8; ++v)
328 lohvs(index_table, v) =
333 constexpr std::array<unsigned int, 4> line_coordinates_y(
336 for (
unsigned int l = 0; l < 4; ++l)
337 lohvs(index_table, 8 + line_coordinates_y[l] * M + j) =
342 constexpr std::array<unsigned int, 4> line_coordinates_x(
345 for (
unsigned int l = 0; l < 4; ++l)
346 lohvs(index_table, 8 + line_coordinates_x[l] * M + k) =
351 constexpr std::array<unsigned int, 4> line_coordinates_z(
354 for (
unsigned int l = 0; l < 4; ++l)
355 lohvs(index_table, 8 + line_coordinates_z[l] * M + i) =
360 lohvs(index_table, 8 + 12 * M + 0 * M * M + i * M + j) =
362 lohvs(index_table, 8 + 12 * M + 1 * M * M + i * M + j) = p[0];
363 lohvs(index_table, 8 + 12 * M + 2 * M * M + k * M + i) =
365 lohvs(index_table, 8 + 12 * M + 3 * M * M + k * M + i) = p[1];
366 lohvs(index_table, 8 + 12 * M + 4 * M * M + j * M + k) =
368 lohvs(index_table, 8 + 12 * M + 5 * M * M + j * M + k) = p[2];
373 for (
unsigned int unit_point = 0; unit_point < n_inner; ++unit_point)
374 Assert(std::fabs(std::accumulate(lohvs[unit_point].begin(),
375 lohvs[unit_point].end(),
377 1) < 1e-13 * polynomial_degree,
389 inline std::vector<::Table<2, double>>
391 const unsigned int polynomial_degree,
392 const unsigned int dim)
395 std::vector<::Table<2, double>> output(dim);
396 if (polynomial_degree <= 1)
401 output[0].reinit(polynomial_degree - 1,
403 for (
unsigned int q = 0; q < polynomial_degree - 1; ++q)
424 inline ::Table<2, double>
428 if (polynomial_degree <= 1)
429 return ::Table<2, double>();
432 const std::vector<unsigned int> h2l =
438 for (
unsigned int q = 0; q < output.size(0); ++q)
455 template <
int dim,
int spacedim>
458 const typename ::MappingQ<dim, spacedim>::InternalData &data)
461 data.mapping_support_points.size());
465 for (
unsigned int i = 0; i < data.mapping_support_points.size(); ++i)
466 p_real += data.mapping_support_points[i] * data.shape(0, i);
477 template <
int dim,
int spacedim,
typename Number>
484 const std::vector<unsigned int> &renumber,
485 const bool print_iterations_to_deallog =
false)
487 if (print_iterations_to_deallog)
488 deallog <<
"Start MappingQ::do_transform_real_to_unit_cell for real "
489 <<
"point [ " << p <<
" ] " << std::endl;
506 polynomials_1d, points, p_unit, polynomials_1d.size() == 2, renumber);
515 f.
norm_square() - 1e-24 * p_real.second[0].norm_square()) ==
553 const double eps = 1.e-11;
554 const unsigned int newton_iteration_limit = 20;
557 invalid_point[0] = std::numeric_limits<double>::lowest();
558 bool tried_project_to_unit_cell =
false;
560 unsigned int newton_iteration = 0;
561 Number f_weighted_norm_square = 1.;
562 Number last_f_weighted_norm_square = 1.;
566 if (print_iterations_to_deallog)
567 deallog <<
"Newton iteration " << newton_iteration
568 <<
" for unit point guess " << p_unit << std::endl;
572 for (
unsigned int d = 0; d < spacedim; ++d)
573 for (
unsigned int e = 0; e < dim; ++e)
574 df[d][e] = p_real.second[e][d];
584 Number(std::numeric_limits<double>::min())) ==
585 Number(std::numeric_limits<double>::min())))
593 if (tried_project_to_unit_cell ==
false)
600 polynomials_1d.size() == 2,
602 f = p_real.first - p;
603 f_weighted_norm_square = 1.;
604 last_f_weighted_norm_square = 1;
605 tried_project_to_unit_cell =
true;
609 return invalid_point;
617 if (print_iterations_to_deallog)
618 deallog <<
" delta=" << delta << std::endl;
621 double step_length = 1.0;
629 for (
unsigned int i = 0; i < dim; ++i)
630 p_unit_trial[i] -= step_length * delta[i];
633 const auto p_real_trial =
638 polynomials_1d.size() == 2,
641 p_real_trial.first - p;
642 f_weighted_norm_square = (df_inverse * f_trial).norm_square();
644 if (print_iterations_to_deallog)
646 deallog <<
" step_length=" << step_length << std::endl;
647 if (step_length == 1.0)
648 deallog <<
" ||f || =" << f.norm() << std::endl;
649 deallog <<
" ||f*|| =" << f_trial.
norm() << std::endl
651 <<
std::sqrt(f_weighted_norm_square) << std::endl;
671 if (
std::max(f_weighted_norm_square - 1e-6 * 1e-6, Number(0.)) *
676 p_real = p_real_trial;
677 p_unit = p_unit_trial;
681 else if (step_length > 0.05)
692 if (step_length <= 0.05 && tried_project_to_unit_cell ==
false)
699 polynomials_1d.size() == 2,
701 f = p_real.first - p;
702 f_weighted_norm_square = 1.;
703 last_f_weighted_norm_square = 1;
704 tried_project_to_unit_cell =
true;
707 else if (step_length <= 0.05)
708 return invalid_point;
711 if (newton_iteration > newton_iteration_limit)
712 return invalid_point;
720 !(
std::max(f_weighted_norm_square - eps * eps, Number(0.)) *
721 std::max(last_f_weighted_norm_square -
722 std::min(f_weighted_norm_square, Number(1e-6 * 1e-6)) *
727 if (print_iterations_to_deallog)
728 deallog <<
"Iteration converged for p_unit = [ " << p_unit
729 <<
" ] and iteration error "
730 <<
std::sqrt(f_weighted_norm_square) << std::endl;
747 const std::vector<unsigned int> &renumber)
749 const unsigned int spacedim = dim + 1;
756 const double eps = 1.e-12;
757 const unsigned int loop_limit = 10;
759 unsigned int loop = 0;
760 double f_weighted_norm_square = 1.;
762 while (f_weighted_norm_square > eps * eps && loop++ < loop_limit)
769 polynomials_1d.size() == 2,
775 polynomials_1d, points, p_unit, renumber);
778 for (
unsigned int j = 0; j < dim; ++j)
780 f[j] = DF[j] * p_minus_F;
781 for (
unsigned int l = 0; l < dim; ++l)
782 df[j][l] = -DF[j] * DF[l] +
hessian[j][l] * p_minus_F;
788 f_weighted_norm_square = d.norm_square();
822 template <
int dim,
int spacedim>
830 (spacedim == 1 ? 3 : (spacedim == 2 ? 6 : 10));
848 1. / real_support_points[0].distance(real_support_points[1]))
861 Assert(dim == spacedim || real_support_points.size() ==
869 affine.first.covariant_form().transpose();
876 for (
unsigned int d = 0; d < spacedim; ++d)
877 for (
unsigned int e = 0; e < dim; ++e)
885 std::array<double, n_functions> shape_values;
891 shape_values[0] = 1.;
895 for (
unsigned int d = 0; d < spacedim; ++d)
896 shape_values[1 + d] = p_scaled[d];
897 for (
unsigned int d = 0, c = 0; d < spacedim; ++d)
898 for (
unsigned int e = 0; e <= d; ++e, ++c)
899 shape_values[1 + spacedim + c] = p_scaled[d] * p_scaled[e];
908 matrix[i][j] += shape_values[i] * shape_values[j];
921 for (
unsigned int j = 0; j < i; ++j)
923 double Lik_Ljk_sum = 0;
924 for (
unsigned int k = 0; k < j; ++k)
925 Lik_Ljk_sum += matrix[i][k] * matrix[j][k];
926 matrix[i][j] = matrix[j][j] * (matrix[i][j] - Lik_Ljk_sum);
927 Lij_sum += matrix[i][j] * matrix[i][j];
930 ExcMessage(
"Matrix of normal equations not positive "
936 matrix[i][i] = 1. /
std::sqrt(matrix[i][i] - Lij_sum);
943 for (
unsigned int j = 0; j < i; ++j)
961 for (
unsigned int i = dim + 1; i <
n_functions; ++i)
978 template <
typename Number>
983 for (
unsigned int d = 0; d < dim; ++d)
991 for (
unsigned int d = 0; d < spacedim; ++d)
994 for (
unsigned int d = 0; d < spacedim; ++d)
1000 for (
unsigned int d = 0, c = 0; d < spacedim; ++d)
1001 for (
unsigned int e = 0; e <= d; ++e, ++c)
1003 coefficients[1 + spacedim + c] * (p_scaled[d] * p_scaled[e]);
1014 const Number affine_distance_to_unit_cell =
1017 for (
unsigned int d = 0; d < dim; ++d)
1019 distance_to_unit_cell,
1020 affine_distance_to_unit_cell + 0.5,
1062 template <
int dim,
int spacedim>
1066 const typename ::MappingQ<dim, spacedim>::InternalData &data,
1072 const UpdateFlags update_flags = data.update_each;
1074 using VectorizedArrayType =
1075 typename ::MappingQ<dim,
1076 spacedim>::InternalData::VectorizedArrayType;
1077 const unsigned int n_shape_values = data.n_shape_functions;
1078 const unsigned int n_q_points = data.shape_info.n_q_points;
1079 constexpr unsigned int n_lanes = VectorizedArrayType::size();
1080 constexpr unsigned int n_comp = 1 + (spacedim - 1) / n_lanes;
1081 constexpr unsigned int n_hessians = (dim * (dim + 1)) / 2;
1088 jacobians.resize(n_q_points);
1090 inverse_jacobians.resize(n_q_points);
1107 n_q_points == quadrature_points.size(),
1110 data.n_shape_functions > 0,
1113 n_q_points == jacobian_grads.size(),
1119 data.shape_info.element_type ==
1122 for (
unsigned int q = 0; q < n_q_points; ++q)
1123 quadrature_points[q] =
1124 data.mapping_support_points[data.shape_info
1125 .lexicographic_numbering[q]];
1138 for (
unsigned int i = 0; i < n_shape_values * n_comp; ++i)
1141 const std::vector<unsigned int> &renumber_to_lexicographic =
1142 data.shape_info.lexicographic_numbering;
1143 for (
unsigned int i = 0; i < n_shape_values; ++i)
1144 for (
unsigned int d = 0; d < spacedim; ++d)
1146 const unsigned int in_comp = d % n_lanes;
1147 const unsigned int out_comp = d / n_lanes;
1150 data.mapping_support_points[renumber_to_lexicographic[i]][d];
1161 for (
unsigned int out_comp = 0; out_comp < n_comp; ++out_comp)
1162 for (
unsigned int i = 0; i < n_q_points; ++i)
1163 for (
unsigned int in_comp = 0;
1164 in_comp < n_lanes && in_comp < spacedim - out_comp * n_lanes;
1166 quadrature_points[i][out_comp * n_lanes + in_comp] =
1167 eval.
begin_values()[out_comp * n_q_points + i][in_comp];
1173 for (
unsigned int out_comp = 0; out_comp < n_comp; ++out_comp)
1174 for (
unsigned int point = 0; point < n_q_points; ++point)
1175 for (
unsigned int in_comp = 0;
1176 in_comp < n_lanes && in_comp < spacedim - out_comp * n_lanes;
1178 for (
unsigned int j = 0; j < dim; ++j)
1180 jacobians[point][out_comp * n_lanes + in_comp][j] =
1189 for (
unsigned int point = 0; point < n_q_points; ++point)
1190 data.volume_elements[point] = jacobians[point].determinant();
1198 for (
unsigned int point = 0; point < n_q_points; ++point)
1199 inverse_jacobians[point] =
1200 jacobians[point].covariant_form().transpose();
1205 constexpr int desymmetrize_3d[6][2] = {
1206 {0, 0}, {1, 1}, {2, 2}, {0, 1}, {0, 2}, {1, 2}};
1207 constexpr int desymmetrize_2d[3][2] = {{0, 0}, {1, 1}, {0, 1}};
1210 for (
unsigned int out_comp = 0; out_comp < n_comp; ++out_comp)
1211 for (
unsigned int point = 0; point < n_q_points; ++point)
1212 for (
unsigned int j = 0; j < n_hessians; ++j)
1213 for (
unsigned int in_comp = 0;
1214 in_comp < n_lanes &&
1215 in_comp < spacedim - out_comp * n_lanes;
1218 const unsigned int total_number = point * n_hessians + j;
1219 const unsigned int new_point = total_number % n_q_points;
1220 const unsigned int new_hessian_comp =
1221 total_number / n_q_points;
1222 const unsigned int new_hessian_comp_i =
1223 dim == 2 ? desymmetrize_2d[new_hessian_comp][0] :
1224 desymmetrize_3d[new_hessian_comp][0];
1225 const unsigned int new_hessian_comp_j =
1226 dim == 2 ? desymmetrize_2d[new_hessian_comp][1] :
1227 desymmetrize_3d[new_hessian_comp][1];
1228 const double value =
1232 jacobian_grads[new_point][out_comp * n_lanes + in_comp]
1233 [new_hessian_comp_i][new_hessian_comp_j] =
1235 jacobian_grads[new_point][out_comp * n_lanes + in_comp]
1236 [new_hessian_comp_j][new_hessian_comp_i] =
1244 template <
int dim,
int spacedim>
1248 const typename ::MappingQ<dim, spacedim>::InternalData &data,
1251 const std::vector<unsigned int> &renumber_lexicographic_to_hierarchic,
1256 const UpdateFlags update_flags = data.update_each;
1258 data.mapping_support_points);
1260 const unsigned int n_points = unit_points.size();
1268 jacobians.resize(n_points);
1270 inverse_jacobians.resize(n_points);
1272 const bool is_translation =
1275 const bool needs_gradient =
1283 for (
unsigned int i = 0; i < n_points; i += n_lanes)
1284 if (n_points - i > 1)
1287 for (
unsigned int j = 0; j < n_lanes; ++j)
1288 if (i + j < n_points)
1289 for (
unsigned int d = 0; d < dim; ++d)
1290 p_vec[d][j] = unit_points[i + j][d];
1292 for (
unsigned int d = 0; d < dim; ++d)
1293 p_vec[d][j] = unit_points[i][d];
1305 polynomials_1d.size() == 2,
1306 renumber_lexicographic_to_hierarchic);
1308 value = result.first;
1310 for (
unsigned int d = 0; d < spacedim; ++d)
1311 for (
unsigned int e = 0; e < dim; ++e)
1312 derivative[d][e] = result.second[e][d];
1319 polynomials_1d.size() == 2,
1320 renumber_lexicographic_to_hierarchic);
1323 for (
unsigned int j = 0; j < n_lanes && i + j < n_points; ++j)
1324 for (
unsigned int d = 0; d < spacedim; ++d)
1325 quadrature_points[i + j][d] =
value[d][j];
1331 for (
unsigned int j = 0; j < n_lanes && i + j < n_points; ++j)
1332 for (
unsigned int d = 0; d < spacedim; ++d)
1333 for (
unsigned int e = 0; e < dim; ++e)
1334 jacobians[i + j][d][e] = derivative[d][e][j];
1339 for (
unsigned int j = 0; j < n_lanes && i + j < n_points; ++j)
1346 for (
unsigned int j = 0; j < n_lanes && i + j < n_points; ++j)
1347 for (
unsigned int d = 0; d < dim; ++d)
1348 for (
unsigned int e = 0; e < spacedim; ++e)
1349 inverse_jacobians[i + j][d][e] = covariant[e][d][j];
1363 polynomials_1d.
size() == 2,
1364 renumber_lexicographic_to_hierarchic);
1366 value = result.first;
1368 for (
unsigned int d = 0; d < spacedim; ++d)
1369 for (
unsigned int e = 0; e < dim; ++e)
1370 derivative[d][e] = result.second[e][d];
1377 polynomials_1d.
size() == 2,
1378 renumber_lexicographic_to_hierarchic);
1381 quadrature_points[i] =
value;
1387 data.volume_elements[i] = derivative.
determinant();
1390 jacobians[i] = derivative;
1405 template <
int dim,
int spacedim>
1409 const typename ::MappingQ<dim, spacedim>::InternalData &data,
1412 const std::vector<unsigned int> &renumber_lexicographic_to_hierarchic,
1418 data.mapping_support_points);
1419 const unsigned int n_q_points = jacobian_grads.size();
1422 for (
unsigned int point = 0; point < n_q_points; ++point)
1429 renumber_lexicographic_to_hierarchic);
1431 for (
unsigned int i = 0; i < spacedim; ++i)
1432 for (
unsigned int j = 0; j < dim; ++j)
1433 for (
unsigned int l = 0; l < dim; ++l)
1434 jacobian_grads[point][i][j][l] = second[j][l][i];
1447 template <
int dim,
int spacedim>
1451 const typename ::MappingQ<dim, spacedim>::InternalData &data,
1454 const std::vector<unsigned int> &renumber_lexicographic_to_hierarchic,
1460 data.mapping_support_points);
1461 const unsigned int n_q_points = jacobian_pushed_forward_grads.size();
1465 double tmp[spacedim][spacedim][spacedim];
1466 for (
unsigned int point = 0; point < n_q_points; ++point)
1473 renumber_lexicographic_to_hierarchic);
1475 data.output_data->inverse_jacobians[point].
transpose();
1478 for (
unsigned int i = 0; i < spacedim; ++i)
1479 for (
unsigned int j = 0; j < spacedim; ++j)
1480 for (
unsigned int l = 0; l < dim; ++l)
1482 tmp[i][j][l] = second[0][l][i] * covariant[j][0];
1483 for (
unsigned int jr = 1; jr < dim; ++jr)
1486 second[jr][l][i] * covariant[j][jr];
1491 for (
unsigned int i = 0; i < spacedim; ++i)
1492 for (
unsigned int j = 0; j < spacedim; ++j)
1493 for (
unsigned int l = 0; l < spacedim; ++l)
1495 jacobian_pushed_forward_grads[point][i][j][l] =
1496 tmp[i][j][0] * covariant[l][0];
1497 for (
unsigned int lr = 1; lr < dim; ++lr)
1499 jacobian_pushed_forward_grads[point][i][j][l] +=
1500 tmp[i][j][lr] * covariant[l][lr];
1510 template <
int dim,
int spacedim,
int length_tensor>
1517 for (
unsigned int i = 0; i < spacedim; ++i)
1520 result[i][0][0][0] = compressed[0][i];
1523 for (
unsigned int d = 0; d < 2; ++d)
1524 for (
unsigned int e = 0; e < 2; ++e)
1525 for (
unsigned int f = 0; f < 2; ++f)
1526 result[i][d][e][f] = compressed[d + e + f][i];
1534 for (
unsigned int d = 0; d < 2; ++d)
1535 for (
unsigned int e = 0; e < 2; ++e)
1537 result[i][d][e][2] = compressed[4 + d + e][i];
1538 result[i][d][2][e] = compressed[4 + d + e][i];
1539 result[i][2][d][e] = compressed[4 + d + e][i];
1541 for (
unsigned int d = 0; d < 2; ++d)
1543 result[i][d][2][2] = compressed[7 + d][i];
1544 result[i][2][d][2] = compressed[7 + d][i];
1545 result[i][2][2][d] = compressed[7 + d][i];
1547 result[i][2][2][2] = compressed[9][i];
1562 template <
int dim,
int spacedim>
1566 const typename ::MappingQ<dim, spacedim>::InternalData &data,
1569 const std::vector<unsigned int> &renumber_lexicographic_to_hierarchic,
1575 data.mapping_support_points);
1576 const unsigned int n_q_points = jacobian_2nd_derivatives.size();
1580 for (
unsigned int point = 0; point < n_q_points; ++point)
1587 renumber_lexicographic_to_hierarchic));
1602 template <
int dim,
int spacedim>
1606 const typename ::MappingQ<dim, spacedim>::InternalData &data,
1609 const std::vector<unsigned int> &renumber_lexicographic_to_hierarchic,
1615 data.mapping_support_points);
1616 const unsigned int n_q_points =
1617 jacobian_pushed_forward_2nd_derivatives.size();
1623 for (
unsigned int point = 0; point < n_q_points; ++point)
1631 renumber_lexicographic_to_hierarchic));
1633 data.output_data->inverse_jacobians[point].
transpose();
1636 for (
unsigned int i = 0; i < spacedim; ++i)
1637 for (
unsigned int j = 0; j < spacedim; ++j)
1638 for (
unsigned int l = 0; l < dim; ++l)
1639 for (
unsigned int m = 0; m < dim; ++m)
1642 third[i][0][l][m] * covariant[j][0];
1643 for (
unsigned int jr = 1; jr < dim; ++jr)
1645 third[i][jr][l][m] * covariant[j][jr];
1649 for (
unsigned int i = 0; i < spacedim; ++i)
1650 for (
unsigned int j = 0; j < spacedim; ++j)
1651 for (
unsigned int l = 0; l < spacedim; ++l)
1652 for (
unsigned int m = 0; m < dim; ++m)
1655 tmp[i][j][0][m] * covariant[l][0];
1656 for (
unsigned int lr = 1; lr < dim; ++lr)
1658 tmp[i][j][lr][m] * covariant[l][lr];
1662 for (
unsigned int i = 0; i < spacedim; ++i)
1663 for (
unsigned int j = 0; j < spacedim; ++j)
1664 for (
unsigned int l = 0; l < spacedim; ++l)
1665 for (
unsigned int m = 0; m < spacedim; ++m)
1667 jacobian_pushed_forward_2nd_derivatives
1668 [point][i][j][l][m] =
1669 tmp2[i][j][l][0] * covariant[m][0];
1670 for (
unsigned int mr = 1; mr < dim; ++mr)
1671 jacobian_pushed_forward_2nd_derivatives[point][i]
1674 tmp2[i][j][l][mr] * covariant[m][mr];
1683 template <
int dim,
int spacedim,
int length_tensor>
1690 for (
unsigned int i = 0; i < spacedim; ++i)
1693 result[i][0][0][0][0] = compressed[0][i];
1696 for (
unsigned int d = 0; d < 2; ++d)
1697 for (
unsigned int e = 0; e < 2; ++e)
1698 for (
unsigned int f = 0; f < 2; ++f)
1699 for (
unsigned int g = 0; g < 2; ++g)
1700 result[i][d][e][f][g] = compressed[d + e + f + g][i];
1708 for (
unsigned int d = 0; d < 2; ++d)
1709 for (
unsigned int e = 0; e < 2; ++e)
1710 for (
unsigned int f = 0; f < 2; ++f)
1712 result[i][d][e][f][2] = compressed[5 + d + e + f][i];
1713 result[i][d][e][2][f] = compressed[5 + d + e + f][i];
1714 result[i][d][2][e][f] = compressed[5 + d + e + f][i];
1715 result[i][2][d][e][f] = compressed[5 + d + e + f][i];
1717 for (
unsigned int d = 0; d < 2; ++d)
1718 for (
unsigned int e = 0; e < 2; ++e)
1720 result[i][d][e][2][2] = compressed[9 + d + e][i];
1721 result[i][d][2][e][2] = compressed[9 + d + e][i];
1722 result[i][d][2][2][e] = compressed[9 + d + e][i];
1723 result[i][2][d][e][2] = compressed[9 + d + e][i];
1724 result[i][2][d][2][e] = compressed[9 + d + e][i];
1725 result[i][2][2][d][e] = compressed[9 + d + e][i];
1727 for (
unsigned int d = 0; d < 2; ++d)
1729 result[i][d][2][2][2] = compressed[12 + d][i];
1730 result[i][2][d][2][2] = compressed[12 + d][i];
1731 result[i][2][2][d][2] = compressed[12 + d][i];
1732 result[i][2][2][2][d] = compressed[12 + d][i];
1734 result[i][2][2][2][2] = compressed[14][i];
1749 template <
int dim,
int spacedim>
1753 const typename ::MappingQ<dim, spacedim>::InternalData &data,
1756 const std::vector<unsigned int> &renumber_lexicographic_to_hierarchic,
1762 data.mapping_support_points);
1763 const unsigned int n_q_points = jacobian_3rd_derivatives.size();
1767 for (
unsigned int point = 0; point < n_q_points; ++point)
1774 renumber_lexicographic_to_hierarchic));
1789 template <
int dim,
int spacedim>
1793 const typename ::MappingQ<dim, spacedim>::InternalData &data,
1796 const std::vector<unsigned int> &renumber_lexicographic_to_hierarchic,
1802 data.mapping_support_points);
1803 const unsigned int n_q_points =
1804 jacobian_pushed_forward_3rd_derivatives.size();
1809 ndarray<double, spacedim, spacedim, spacedim, spacedim, dim>
1813 for (
unsigned int point = 0; point < n_q_points; ++point)
1821 renumber_lexicographic_to_hierarchic));
1824 data.output_data->inverse_jacobians[point].
transpose();
1827 for (
unsigned int i = 0; i < spacedim; ++i)
1828 for (
unsigned int j = 0; j < spacedim; ++j)
1829 for (
unsigned int l = 0; l < dim; ++l)
1830 for (
unsigned int m = 0; m < dim; ++m)
1831 for (
unsigned int n = 0; n < dim; ++n)
1833 tmp[i][j][l][m][n] =
1834 fourth[i][0][l][m][n] * covariant[j][0];
1835 for (
unsigned int jr = 1; jr < dim; ++jr)
1836 tmp[i][j][l][m][n] +=
1837 fourth[i][jr][l][m][n] * covariant[j][jr];
1841 for (
unsigned int i = 0; i < spacedim; ++i)
1842 for (
unsigned int j = 0; j < spacedim; ++j)
1843 for (
unsigned int l = 0; l < spacedim; ++l)
1844 for (
unsigned int m = 0; m < dim; ++m)
1845 for (
unsigned int n = 0; n < dim; ++n)
1847 tmp2[i][j][l][m][n] =
1848 tmp[i][j][0][m][n] * covariant[l][0];
1849 for (
unsigned int lr = 1; lr < dim; ++lr)
1850 tmp2[i][j][l][m][n] +=
1851 tmp[i][j][lr][m][n] * covariant[l][lr];
1855 for (
unsigned int i = 0; i < spacedim; ++i)
1856 for (
unsigned int j = 0; j < spacedim; ++j)
1857 for (
unsigned int l = 0; l < spacedim; ++l)
1858 for (
unsigned int m = 0; m < spacedim; ++m)
1859 for (
unsigned int n = 0; n < dim; ++n)
1861 tmp[i][j][l][m][n] =
1862 tmp2[i][j][l][0][n] * covariant[m][0];
1863 for (
unsigned int mr = 1; mr < dim; ++mr)
1864 tmp[i][j][l][m][n] +=
1865 tmp2[i][j][l][mr][n] * covariant[m][mr];
1869 for (
unsigned int i = 0; i < spacedim; ++i)
1870 for (
unsigned int j = 0; j < spacedim; ++j)
1871 for (
unsigned int l = 0; l < spacedim; ++l)
1872 for (
unsigned int m = 0; m < spacedim; ++m)
1873 for (
unsigned int n = 0; n < spacedim; ++n)
1875 jacobian_pushed_forward_3rd_derivatives
1876 [point][i][j][l][m][n] =
1877 tmp[i][j][l][m][0] * covariant[n][0];
1878 for (
unsigned int nr = 1; nr < dim; ++nr)
1879 jacobian_pushed_forward_3rd_derivatives[point]
1882 tmp[i][j][l][m][nr] * covariant[n][nr];
1900 template <
int dim,
int spacedim>
1903 const ::MappingQ<dim, spacedim> &
mapping,
1904 const typename ::Triangulation<dim, spacedim>::cell_iterator &cell,
1905 const unsigned int face_no,
1906 const unsigned int subface_no,
1907 const unsigned int n_q_points,
1908 const std::vector<double> &weights,
1909 const typename ::MappingQ<dim, spacedim>::InternalData &data,
1913 const UpdateFlags update_flags = data.update_each;
1933 for (
unsigned int d = 0; d != dim - 1; ++d)
1935 const unsigned int vector_index =
1937 Assert(vector_index < data.unit_tangentials.size(),
1939 Assert(data.aux[d].size() <=
1940 data.unit_tangentials[vector_index].size(),
1943 data.unit_tangentials[vector_index]),
1953 if (dim == spacedim)
1955 for (
unsigned int i = 0; i < n_q_points; ++i)
1965 (face_no == 0 ? -1 : +1);
1990 for (
unsigned int point = 0; point < n_q_points; ++point)
1993 data.output_data->jacobians[point];
2000 (face_no == 0 ? -1. : +1.) *
2011 cell_normal /= cell_normal.
norm();
2023 for (
unsigned int i = 0; i < output_data.
boundary_forms.size(); ++i)
2031 cell->subface_case(face_no), subface_no);
2037 for (
unsigned int i = 0; i < output_data.
normal_vectors.size(); ++i)
2052 template <
int dim,
int spacedim>
2055 const ::MappingQ<dim, spacedim> &
mapping,
2056 const typename ::Triangulation<dim, spacedim>::cell_iterator &cell,
2057 const unsigned int face_no,
2058 const unsigned int subface_no,
2061 const typename ::MappingQ<dim, spacedim>::InternalData &data,
2063 const std::vector<unsigned int> &renumber_lexicographic_to_hierarchic,
2068 &data.quadrature_points[data_set], quadrature.
size());
2069 if (dim > 1 && data.tensor_product_quadrature)
2087 renumber_lexicographic_to_hierarchic,
2096 renumber_lexicographic_to_hierarchic,
2104 renumber_lexicographic_to_hierarchic,
2111 renumber_lexicographic_to_hierarchic,
2118 renumber_lexicographic_to_hierarchic,
2125 renumber_lexicographic_to_hierarchic,
2132 renumber_lexicographic_to_hierarchic,
2150 template <
int dim,
int spacedim,
int rank>
2154 const MappingKind mapping_kind,
2160 const typename ::MappingQ<dim, spacedim>::InternalData *
>(
2161 &mapping_data) !=
nullptr),
2163 const typename ::MappingQ<dim, spacedim>::InternalData &data =
2165 const typename ::MappingQ<dim, spacedim>::InternalData &
>(
2168 switch (mapping_kind)
2174 "update_contravariant_transformation"));
2176 for (
unsigned int i = 0; i < output.size(); ++i)
2187 "update_contravariant_transformation"));
2190 "update_volume_elements"));
2195 for (
unsigned int i = 0; i < output.size(); ++i)
2200 output[i] /= data.volume_elements[i];
2211 "update_covariant_transformation"));
2213 for (
unsigned int i = 0; i < output.size(); ++i)
2215 data.output_data->inverse_jacobians[i].transpose(), input[i]);
2230 template <
int dim,
int spacedim,
int rank>
2234 const MappingKind mapping_kind,
2240 const typename ::MappingQ<dim, spacedim>::InternalData *
>(
2241 &mapping_data) !=
nullptr),
2243 const typename ::MappingQ<dim, spacedim>::InternalData &data =
2245 const typename ::MappingQ<dim, spacedim>::InternalData &
>(
2248 switch (mapping_kind)
2254 "update_covariant_transformation"));
2257 "update_contravariant_transformation"));
2260 for (
unsigned int i = 0; i < output.size(); ++i)
2266 data.output_data->inverse_jacobians[i].transpose(),
2277 "update_covariant_transformation"));
2280 for (
unsigned int i = 0; i < output.size(); ++i)
2283 data.output_data->inverse_jacobians[i].
transpose();
2296 "update_covariant_transformation"));
2299 "update_contravariant_transformation"));
2302 "update_volume_elements"));
2305 for (
unsigned int i = 0; i < output.size(); ++i)
2308 data.output_data->inverse_jacobians[i].
transpose();
2316 output[i] /= data.volume_elements[i];
2332 template <
int dim,
int spacedim>
2336 const MappingKind mapping_kind,
2342 const typename ::MappingQ<dim, spacedim>::InternalData *
>(
2343 &mapping_data) !=
nullptr),
2345 const typename ::MappingQ<dim, spacedim>::InternalData &data =
2347 const typename ::MappingQ<dim, spacedim>::InternalData &
>(
2350 switch (mapping_kind)
2356 "update_covariant_transformation"));
2359 "update_contravariant_transformation"));
2361 for (
unsigned int q = 0; q < output.size(); ++q)
2364 data.output_data->inverse_jacobians[q].
transpose();
2366 data.output_data->jacobians[q];
2380 "update_covariant_transformation"));
2382 for (
unsigned int q = 0; q < output.size(); ++q)
2385 data.output_data->inverse_jacobians[q].
transpose();
2397 "update_covariant_transformation"));
2400 "update_contravariant_transformation"));
2403 "update_volume_elements"));
2405 for (
unsigned int q = 0; q < output.size(); ++q)
2408 data.output_data->inverse_jacobians[q].
transpose();
2410 data.output_data->jacobians[q];
2414 data.volume_elements[q],
2432 template <
int dim,
int spacedim,
int rank>
2436 const MappingKind mapping_kind,
2442 const typename ::MappingQ<dim, spacedim>::InternalData *
>(
2443 &mapping_data) !=
nullptr),
2445 const typename ::MappingQ<dim, spacedim>::InternalData &data =
2447 const typename ::MappingQ<dim, spacedim>::InternalData &
>(
2450 switch (mapping_kind)
2456 "update_covariant_transformation"));
2458 for (
unsigned int i = 0; i < output.size(); ++i)
2460 data.output_data->inverse_jacobians[i].transpose(), input[i]);
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
void set_data_pointers(AlignedVector< Number > *scratch_data, const unsigned int n_components)
const Number * begin_gradients() const
const Number * begin_values() const
const Number * begin_dof_values() const
const Number * begin_hessians() const
Abstract base class for mapping classes.
constexpr numbers::NumberTraits< Number >::real_type distance_square(const Point< dim, Number > &p) const
Class storing the offset index into a Quadrature rule created by project_to_all_faces() or project_to...
const std::vector< double > & get_weights() const
unsigned int size() const
numbers::NumberTraits< Number >::real_type norm() const
constexpr numbers::NumberTraits< Number >::real_type norm_square() const
static constexpr std::size_t size()
const Point< spacedim > normalization_shift
const double normalization_length
InverseQuadraticApproximation(const InverseQuadraticApproximation &)=default
static constexpr unsigned int n_functions
Point< dim, Number > compute(const Point< spacedim, Number > &p) const
InverseQuadraticApproximation(const ArrayView< const Point< spacedim > > &real_support_points, const std::vector< Point< dim > > &unit_support_points)
std::array< Point< dim >, n_functions > coefficients
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ASSERT_UNREACHABLE()
#define DEAL_II_NOT_IMPLEMENTED()
static ::ExceptionBase & ExcAccessToUninitializedField(std::string arg1)
static ::ExceptionBase & ExcTransformationFailed()
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
@ update_jacobian_pushed_forward_2nd_derivatives
@ update_volume_elements
Determinant of the Jacobian.
@ update_contravariant_transformation
Contravariant transformation.
@ update_jacobian_pushed_forward_grads
@ update_jacobian_3rd_derivatives
@ update_jacobian_grads
Gradient of volume element.
@ update_normal_vectors
Normal vectors.
@ update_JxW_values
Transformed quadrature weights.
@ update_covariant_transformation
Covariant transformation.
@ update_quadrature_points
Transformed quadrature points.
@ update_jacobian_pushed_forward_3rd_derivatives
@ update_boundary_forms
Outer normal vector, not normalized.
@ update_jacobian_2nd_derivatives
@ mapping_covariant_gradient
@ mapping_contravariant_hessian
@ mapping_covariant_hessian
@ mapping_contravariant_gradient
@ tensor_symmetric_collocation
MappingQ< dim, spacedim > StaticMappingQ1< dim, spacedim >::mapping
EvaluationFlags
The EvaluationFlags enum.
constexpr T fixed_power(const T t)
constexpr T pow(const T base, const int iexp)
Point< 1 > transform_real_to_unit_cell(const std::array< Point< spacedim >, GeometryInfo< 1 >::vertices_per_cell > &vertices, const Point< spacedim > &p)
void maybe_update_jacobian_pushed_forward_2nd_derivatives(const CellSimilarity::Similarity cell_similarity, const typename ::MappingQ< dim, spacedim >::InternalData &data, const ArrayView< const Point< dim > > &unit_points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, std::vector< Tensor< 4, spacedim > > &jacobian_pushed_forward_2nd_derivatives)
Point< dim, Number > do_transform_real_to_unit_cell_internal(const Point< spacedim, Number > &p, const Point< dim, Number > &initial_p_unit, const ArrayView< const Point< spacedim > > &points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber, const bool print_iterations_to_deallog=false)
DerivativeForm< 3, dim, spacedim > expand_3rd_derivatives(const Tensor< 1, length_tensor, Tensor< 1, spacedim > > &compressed)
inline ::Table< 2, double > compute_support_point_weights_cell(const unsigned int polynomial_degree)
void transform_differential_forms(const ArrayView< const DerivativeForm< rank, dim, spacedim > > &input, const MappingKind mapping_kind, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_data, const ArrayView< Tensor< rank+1, spacedim > > &output)
void maybe_update_jacobian_grads(const CellSimilarity::Similarity cell_similarity, const typename ::MappingQ< dim, spacedim >::InternalData &data, const ArrayView< const Point< dim > > &unit_points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, std::vector< DerivativeForm< 2, dim, spacedim > > &jacobian_grads)
void do_fill_fe_face_values(const ::MappingQ< dim, spacedim > &mapping, const typename ::Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int subface_no, const typename QProjector< dim >::DataSetDescriptor data_set, const Quadrature< dim - 1 > &quadrature, const typename ::MappingQ< dim, spacedim >::InternalData &data, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data)
inline ::Table< 2, double > compute_support_point_weights_on_hex(const unsigned int polynomial_degree)
void transform_fields(const ArrayView< const Tensor< rank, dim > > &input, const MappingKind mapping_kind, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_data, const ArrayView< Tensor< rank, spacedim > > &output)
void maybe_update_jacobian_3rd_derivatives(const CellSimilarity::Similarity cell_similarity, const typename ::MappingQ< dim, spacedim >::InternalData &data, const ArrayView< const Point< dim > > &unit_points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, std::vector< DerivativeForm< 4, dim, spacedim > > &jacobian_3rd_derivatives)
void maybe_update_jacobian_pushed_forward_grads(const CellSimilarity::Similarity cell_similarity, const typename ::MappingQ< dim, spacedim >::InternalData &data, const ArrayView< const Point< dim > > &unit_points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, std::vector< Tensor< 3, spacedim > > &jacobian_pushed_forward_grads)
inline ::Table< 2, double > compute_support_point_weights_on_quad(const unsigned int polynomial_degree)
void maybe_update_q_points_Jacobians_generic(const CellSimilarity::Similarity cell_similarity, const typename ::MappingQ< dim, spacedim >::InternalData &data, const ArrayView< const Point< dim > > &unit_points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, std::vector< Point< spacedim > > &quadrature_points, std::vector< DerivativeForm< 1, dim, spacedim > > &jacobians, std::vector< DerivativeForm< 1, spacedim, dim > > &inverse_jacobians)
std::vector< Point< dim > > unit_support_points(const std::vector< Point< 1 > > &line_support_points, const std::vector< unsigned int > &renumbering)
void transform_gradients(const ArrayView< const Tensor< rank, dim > > &input, const MappingKind mapping_kind, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_data, const ArrayView< Tensor< rank, spacedim > > &output)
void maybe_update_q_points_Jacobians_and_grads_tensor(const CellSimilarity::Similarity cell_similarity, const typename ::MappingQ< dim, spacedim >::InternalData &data, std::vector< Point< spacedim > > &quadrature_points, std::vector< DerivativeForm< 1, dim, spacedim > > &jacobians, std::vector< DerivativeForm< 1, spacedim, dim > > &inverse_jacobians, std::vector< DerivativeForm< 2, dim, spacedim > > &jacobian_grads)
void transform_hessians(const ArrayView< const Tensor< 3, dim > > &input, const MappingKind mapping_kind, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_data, const ArrayView< Tensor< 3, spacedim > > &output)
void maybe_update_jacobian_pushed_forward_3rd_derivatives(const CellSimilarity::Similarity cell_similarity, const typename ::MappingQ< dim, spacedim >::InternalData &data, const ArrayView< const Point< dim > > &unit_points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, std::vector< Tensor< 5, spacedim > > &jacobian_pushed_forward_3rd_derivatives)
std::vector<::Table< 2, double > > compute_support_point_weights_perimeter_to_interior(const unsigned int polynomial_degree, const unsigned int dim)
DerivativeForm< 4, dim, spacedim > expand_4th_derivatives(const Tensor< 1, length_tensor, Tensor< 1, spacedim > > &compressed)
Point< spacedim > compute_mapped_location_of_point(const typename ::MappingQ< dim, spacedim >::InternalData &data)
Point< dim > do_transform_real_to_unit_cell_internal_codim1(const Point< dim+1 > &p, const Point< dim > &initial_p_unit, const ArrayView< const Point< dim+1 > > &points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber)
void maybe_compute_face_data(const ::MappingQ< dim, spacedim > &mapping, const typename ::Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int subface_no, const unsigned int n_q_points, const std::vector< double > &weights, const typename ::MappingQ< dim, spacedim >::InternalData &data, internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &output_data)
void maybe_update_jacobian_2nd_derivatives(const CellSimilarity::Similarity cell_similarity, const typename ::MappingQ< dim, spacedim >::InternalData &data, const ArrayView< const Point< dim > > &unit_points, const std::vector< Polynomials::Polynomial< double > > &polynomials_1d, const std::vector< unsigned int > &renumber_lexicographic_to_hierarchic, std::vector< DerivativeForm< 3, dim, spacedim > > &jacobian_2nd_derivatives)
Tensor< 3, spacedim, Number > apply_contravariant_hessian(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 1, dim, spacedim, Number > &contravariant, const Tensor< 3, dim, Number > &input)
Tensor< 3, spacedim, Number > apply_piola_hessian(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const DerivativeForm< 1, dim, spacedim, Number > &contravariant, const Number &volume_element, const Tensor< 3, dim, Number > &input)
SymmetricTensor< 2, dim, typename ProductTypeNoPoint< Number, Number2 >::type > evaluate_tensor_product_hessian(const std::vector< Polynomials::Polynomial< double > > &poly, const ArrayView< const Number > &values, const Point< dim, Number2 > &p, const std::vector< unsigned int > &renumber={})
Tensor< 3, spacedim, Number > apply_covariant_hessian(const DerivativeForm< 1, dim, spacedim, Number > &covariant, const Tensor< 3, dim, Number > &input)
std::pair< typename ProductTypeNoPoint< Number, Number2 >::type, Tensor< 1, dim, typename ProductTypeNoPoint< Number, Number2 >::type > > evaluate_tensor_product_value_and_gradient(const std::vector< Polynomials::Polynomial< double > > &poly, const ArrayView< const Number > &values, const Point< dim, Number2 > &p, const bool d_linear=false, const std::vector< unsigned int > &renumber={})
ProductTypeNoPoint< Number, Number2 >::type evaluate_tensor_product_value(const std::vector< Polynomials::Polynomial< double > > &poly, const ArrayView< const Number > &values, const Point< dim, Number2 > &p, const bool d_linear=false, const std::vector< unsigned int > &renumber={})
Tensor< 1, 1, typename ProductTypeNoPoint< Number, Number2 >::type > evaluate_tensor_product_higher_derivatives(const std::vector< Polynomials::Polynomial< double > > &poly, const ArrayView< const Number > &values, const Point< 1, Number2 > &p, const std::vector< unsigned int > &renumber={})
constexpr unsigned int invalid_unsigned_int
::VectorizedArray< Number, width > min(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > abs(const ::VectorizedArray< Number, width > &)
typename internal::ndarray::HelperArray< T, Ns... >::type ndarray
static constexpr unsigned int vertices_per_cell
static constexpr unsigned int faces_per_cell
static double subface_ratio(const internal::SubfaceCase< dim > &subface_case, const unsigned int subface_no)
static Point< dim, Number > project_to_unit_cell(const Point< dim, Number > &p)
static double d_linear_shape_function(const Point< dim > &xi, const unsigned int i)
static std_cxx20::ranges::iota_view< unsigned int, unsigned int > vertex_indices()
static void evaluate(const unsigned int n_components, const EvaluationFlags::EvaluationFlags evaluation_flag, const Number *values_dofs, FEEvaluationData< dim, Number, false > &fe_eval)
DEAL_II_HOST constexpr Number determinant(const SymmetricTensor< 2, dim, Number > &)
DEAL_II_HOST constexpr SymmetricTensor< 2, dim, Number > invert(const SymmetricTensor< 2, dim, Number > &)
constexpr Tensor< 1, dim, Number > cross_product_2d(const Tensor< 1, dim, Number > &src)
constexpr Tensor< 1, dim, typename ProductType< Number1, Number2 >::type > cross_product_3d(const Tensor< 1, dim, Number1 > &src1, const Tensor< 1, dim, Number2 > &src2)
Number compare_and_apply_mask(const Number &left, const Number &right, const Number &true_value, const Number &false_value)