17#ifndef dealii_matrix_free_evaluation_kernels_h
18#define dealii_matrix_free_evaluation_kernels_h
40 template <MatrixFreeFunctions::ElementType element,
bool is_
long>
44 template <
bool is_
long>
62 template <
bool is_
long>
81 template <
bool is_
long>
88 template <
bool is_
long>
132 evaluate(
const unsigned int n_components,
138 integrate(
const unsigned int n_components,
170 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
178 evaluate(
const unsigned int n_components,
184 integrate(
const unsigned int n_components,
195 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
202 template <
bool integrate>
204 evaluate_or_integrate(
211 template <
typename EvalType,
typename Number2>
221 template <
int normal_dir>
223 evaluate_tensor_product_per_component(
228 std::integral_constant<bool, false>);
230 template <
int normal_dir>
232 evaluate_tensor_product_per_component(
237 std::integral_constant<bool, true>);
249 const unsigned int n_components,
257 std::array<const MatrixFreeFunctions::UnivariateShapeData<Number2> *, 3>
265 for (
int i = 1; i < dim; ++i)
275 (Eval::n_rows_of_product > Eval::n_columns_of_product ?
276 Eval::n_rows_of_product :
277 Eval::n_columns_of_product);
278 Number *
temp1 = fe_eval.get_scratch_data().
begin();
284 Utilities::fixed_power<dim>(
292 const std::size_t n_q_points =
temp_size == 0 ?
293 fe_eval.get_shape_info().n_q_points :
294 Eval::n_columns_of_product;
298 fe_eval.get_shape_info().dofs_per_component_on_cell;
303 fe_eval.get_shape_info().dofs_per_component_on_cell;
307 fe_degree != -1 ? fe_degree :
shape_data.front().fe_degree;
308 for (
unsigned int c = 0; c < n_components; ++c)
310 i < (dim > 2 ? degree + 1 : 1);
313 for (
int j = 0;
j < (dim > 1 ? degree + 1 - i : 1); ++
j)
315 for (
int k = 0;
k < degree + 1 -
j - i;
319 for (
int k = degree + 1 -
j - i;
k < degree + 1;
323 for (
int j = degree + 1 - i;
j < degree + 1; ++
j)
324 for (
int k = 0;
k < degree + 1; ++
k, ++
count_q)
330 Number *values_quad = fe_eval.begin_values();
331 Number *gradients_quad = fe_eval.begin_gradients();
332 Number *hessians_quad = fe_eval.begin_hessians();
337 for (
unsigned int c = 0; c < n_components; ++c)
350 values_quad += n_q_points;
351 gradients_quad += n_q_points;
352 hessians_quad += n_q_points;
357 for (
unsigned int c = 0; c < n_components; ++c)
399 values_quad += n_q_points;
400 gradients_quad += 2 * n_q_points;
401 hessians_quad += 3 * n_q_points;
406 for (
unsigned int c = 0; c < n_components; ++c)
489 values_quad += n_q_points;
490 gradients_quad += 3 * n_q_points;
491 hessians_quad += 6 * n_q_points;
504 values_quad -= n_components * n_q_points;
506 for (std::size_t c = 0; c < n_components; ++c)
507 for (std::size_t
q = 0;
q < n_q_points; ++
q)
508 values_quad[c * n_q_points +
q] +=
522 const unsigned int n_components,
528 std::array<const MatrixFreeFunctions::UnivariateShapeData<Number2> *, 3>
535 for (
int i = 1; i < dim; ++i)
545 (Eval::n_rows_of_product > Eval::n_columns_of_product ?
546 Eval::n_rows_of_product :
547 Eval::n_columns_of_product);
548 Number *
temp1 = fe_eval.get_scratch_data().
begin();
554 Utilities::fixed_power<dim>(
562 const std::size_t n_q_points =
temp_size == 0 ?
563 fe_eval.get_shape_info().n_q_points :
564 Eval::n_columns_of_product;
567 Utilities::fixed_power<dim>(
shape_data.front().fe_degree + 1) :
568 fe_eval.get_shape_info().dofs_per_component_on_cell;
570 Number *values_dofs =
572 temp1 + 2 * (std::max<std::size_t>(
573 fe_eval.get_shape_info().dofs_per_component_on_cell,
577 Number *values_quad = fe_eval.begin_values();
578 Number *gradients_quad = fe_eval.begin_gradients();
579 Number *hessians_quad = fe_eval.begin_hessians();
584 for (
unsigned int c = 0; c < n_components; ++c)
619 values_quad += n_q_points;
620 gradients_quad += n_q_points;
621 hessians_quad += n_q_points;
626 for (
unsigned int c = 0; c < n_components; ++c)
679 values_quad += n_q_points;
680 gradients_quad += 2 * n_q_points;
681 hessians_quad += 3 * n_q_points;
686 for (
unsigned int c = 0; c < n_components; ++c)
770 values_quad += n_q_points;
771 gradients_quad += 3 * n_q_points;
772 hessians_quad += 6 * n_q_points;
784 values_quad -= n_components * n_q_points;
786 for (
unsigned int c = 0; c < n_components; ++c)
788 values_dofs[0] = values_quad[0];
789 for (
unsigned int q = 1;
q < n_q_points; ++
q)
790 values_dofs[0] += values_quad[
q];
792 values_quad += n_q_points;
796 for (
unsigned int c = 0; c < n_components; ++c)
805 fe_eval.get_shape_info().dofs_per_component_on_cell;
808 fe_degree != -1 ? fe_degree :
shape_data.front().fe_degree;
809 for (
unsigned int c = 0; c < n_components; ++c)
811 i < (dim > 2 ? degree + 1 : 1);
814 for (
int j = 0;
j < (dim > 1 ? degree + 1 - i : 1); ++
j)
816 for (
int k = 0;
k < degree + 1 -
j - i;
829 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
836 Number>::evaluate(
const unsigned int n_components,
843 const std::size_t n_dofs =
844 fe_eval.get_shape_info().dofs_per_component_on_cell;
845 const std::size_t n_q_points = fe_eval.get_shape_info().n_q_points;
860 Eval
eval(shape_values,
nullptr,
nullptr, n_dofs, n_q_points);
861 for (
unsigned int c = 0; c < n_components; ++c)
873 const auto shape_gradients =
shape_data.front().shape_gradients.
data();
877 for (
unsigned int c = 0; c < n_components; ++c)
879 for (
unsigned int d = 0; d < dim; ++d)
882 shape_gradients + n_q_points * n_dofs * d,
899 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
906 Number>::integrate(
const unsigned int n_components,
915 const std::size_t n_dofs =
916 fe_eval.get_shape_info().dofs_per_component_on_cell;
917 const std::size_t n_q_points = fe_eval.get_shape_info().n_q_points;
932 Eval
eval(shape_values,
nullptr,
nullptr, n_dofs, n_q_points);
933 for (
unsigned int c = 0; c < n_components; ++c)
949 const auto shape_gradients =
shape_data.front().shape_gradients.
data();
953 for (
unsigned int c = 0; c < n_components; ++c)
955 for (
unsigned int d = 0; d < dim; ++d)
958 shape_gradients + n_q_points * n_dofs * d,
980 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
981 template <
bool integrate>
1004 std::integral_constant<bool, integrate>());
1011 std::integral_constant<bool, integrate>());
1020 std::integral_constant<bool, integrate>());
1027 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
1028 template <
int normal_dir>
1040 std::integral_constant<bool, false>)
1049 (fe_degree == -1) ? 1 : fe_degree + 1,
1058 (fe_degree == -1) ? 1 : fe_degree,
1064 typename std::conditional<normal_dir == 0, EvalNormal, EvalTangent>::type;
1066 typename std::conditional<normal_dir == 1, EvalNormal, EvalTangent>::type;
1068 typename std::conditional<normal_dir == 2, EvalNormal, EvalTangent>::type;
1070 const auto &shape_info = fe_eval.get_shape_info();
1072 ((
normal_dir == 0) ? shape_info.data[0] : shape_info.data[1]));
1074 ((
normal_dir == 1) ? shape_info.data[0] : shape_info.data[1]));
1076 ((
normal_dir == 2) ? shape_info.data[0] : shape_info.data[1]));
1078 Number *
temp1 = fe_eval.get_scratch_data().
begin();
1083 std::max(Utilities::fixed_power<dim>(shape_info.data[0].fe_degree + 1),
1084 Utilities::fixed_power<dim>(shape_info.data[0].n_q_points_1d));
1086 const std::size_t n_q_points = shape_info.n_q_points;
1087 const std::size_t
dofs_per_comp = shape_info.dofs_per_component_on_cell;
1091 Number *values_quad = fe_eval.begin_values() + n_q_points *
normal_dir;
1092 Number *gradients_quad =
1093 fe_eval.begin_gradients() + dim * n_q_points *
normal_dir;
1094 Number *hessians_quad =
1095 (dim == 2) ? fe_eval.begin_hessians() + 3 * n_q_points *
normal_dir :
1096 fe_eval.begin_hessians() + 6 * n_q_points *
normal_dir;
1133 hessians_quad + n_q_points);
1197 hessians_quad + n_q_points);
1225 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
1226 template <
int normal_dir>
1238 std::integral_constant<bool, true>)
1245 (fe_degree == -1) ? 1 : fe_degree + 1,
1254 (fe_degree == -1) ? 1 : fe_degree,
1260 typename std::conditional<normal_dir == 0, EvalNormal, EvalTangent>::type;
1262 typename std::conditional<normal_dir == 1, EvalNormal, EvalTangent>::type;
1264 typename std::conditional<normal_dir == 2, EvalNormal, EvalTangent>::type;
1266 const auto &shape_info = fe_eval.get_shape_info();
1268 ((
normal_dir == 0) ? shape_info.data[0] : shape_info.data[1]));
1270 ((
normal_dir == 1) ? shape_info.data[0] : shape_info.data[1]));
1272 ((
normal_dir == 2) ? shape_info.data[0] : shape_info.data[1]));
1274 Number *
temp1 = fe_eval.get_scratch_data().
begin();
1279 std::max(Utilities::fixed_power<dim>(shape_info.data[0].fe_degree + 1),
1280 Utilities::fixed_power<dim>(shape_info.data[0].n_q_points_1d));
1282 const std::size_t n_q_points = shape_info.n_q_points;
1283 const std::size_t
dofs_per_comp = shape_info.dofs_per_component_on_cell;
1287 Number *values_quad = fe_eval.begin_values() + n_q_points *
normal_dir;
1288 Number *gradients_quad =
1289 fe_eval.begin_gradients() + dim * n_q_points *
normal_dir;
1290 Number *hessians_quad =
1291 (dim == 2) ? fe_eval.begin_hessians() + 3 * n_q_points *
normal_dir :
1292 fe_eval.begin_hessians() + 6 * n_q_points *
normal_dir;
1459 "The second dimension must not be smaller than the first");
1483 template <
typename Number,
typename Number2>
1499 ExcMessage(
"The second dimension must not be smaller than the first"));
1524 const unsigned int np_1 =
1526 const unsigned int np_2 =
1529 ExcMessage(
"Cannot transform with 0-point basis"));
1531 ExcMessage(
"Cannot transform with 0-point basis"));
1538 for (
unsigned int c = n_components; c != 0; --c)
1543 for (
unsigned int q =
np_1;
q != 0; --
q)
1552 (
q - 1) * Utilities::fixed_power<next_dim>(
np_1),
1554 (
q - 1) * Utilities::fixed_power<next_dim>(
np_2),
1605 template <
typename Number,
typename Number2>
1622 ExcMessage(
"The second dimension must not be smaller than the first"));
1625 "Input and output cannot alias with each other when "
1626 "adding the result of the basis change to existing data"));
1648 const unsigned int np_1 =
1650 const unsigned int np_2 =
1653 ExcMessage(
"Cannot transform with 0-point basis"));
1655 ExcMessage(
"Cannot transform with 0-point basis"));
1657 for (
unsigned int c = 0; c < n_components; ++c)
1712 eval_val.template hessians<dim - 1,
false,
false>(
1717 for (
unsigned int q = 0;
q <
np_1; ++
q)
1727 q * Utilities::fixed_power<next_dim>(
np_2),
1729 q * Utilities::fixed_power<next_dim>(
np_1),
1758 template <
typename Number,
typename Number2>
1764 Number * scratch_data,
1767 constexpr int next_dim = dim > 1 ? dim - 1 : dim;
1775 const unsigned int stride =
1803 for (
unsigned int c = 0; c < n_components; ++c)
1811 coefficients[i +
q * n_blocks +
1845 template <
int dim,
int fe_degree,
typename Number>
1858 evaluate(
const unsigned int n_components,
1860 const Number * values_dofs,
1866 const Number * values_dofs,
1867 Number * gradients_quad,
1868 Number * hessians_quad);
1871 integrate(
const unsigned int n_components,
1873 Number * values_dofs,
1880 Number * values_dofs,
1881 Number * gradients_quad,
1882 const Number * hessians_quad,
1888 template <
int dim,
int fe_degree,
typename Number>
1891 const unsigned int n_components,
1893 const Number * values_dofs,
1896 constexpr std::size_t n_points =
Utilities::pow(fe_degree + 1, dim);
1898 for (
unsigned int c = 0; c < n_components; ++c)
1901 for (
unsigned int i = 0; i < n_points; ++i)
1902 fe_eval.begin_values()[n_points * c + i] =
1903 values_dofs[n_points * c + i];
1905 do_evaluate(fe_eval.get_shape_info().
data.front(),
1907 values_dofs + c * n_points,
1908 fe_eval.begin_gradients() + c * dim * n_points,
1909 fe_eval.begin_hessians() +
1910 c * dim * (dim + 1) / 2 * n_points);
1916 template <
int dim,
int fe_degree,
typename Number>
1921 const Number * values_dofs,
1922 Number * gradients_quad,
1923 Number * hessians_quad)
1926 (fe_degree + 2) / 2 * (fe_degree + 1));
1927 constexpr std::size_t n_points =
Utilities::pow(fe_degree + 1, dim);
1938 gradients_quad + n_points);
1953 hessians_quad + n_points);
1972 template <
int dim,
int fe_degree,
typename Number>
1975 const unsigned int n_components,
1977 Number * values_dofs,
1981 constexpr std::size_t n_points =
Utilities::pow(fe_degree + 1, dim);
1983 for (
unsigned int c = 0; c < n_components; ++c)
1988 for (
unsigned int i = 0; i < n_points; ++i)
1989 values_dofs[n_points * c + i] +=
1990 fe_eval.begin_values()[n_points * c + i];
1992 for (
unsigned int i = 0; i < n_points; ++i)
1993 values_dofs[n_points * c + i] =
1994 fe_eval.begin_values()[n_points * c + i];
1997 do_integrate(fe_eval.get_shape_info().
data.front(),
1999 values_dofs + c * n_points,
2000 fe_eval.begin_gradients() + c * dim * n_points,
2001 fe_eval.begin_hessians() +
2002 c * dim * (dim + 1) / 2 * n_points,
2010 template <
int dim,
int fe_degree,
typename Number>
2015 Number * values_dofs,
2016 Number * gradients_quad,
2017 const Number * hessians_quad,
2021 (fe_degree + 2) / 2 * (fe_degree + 1));
2026 constexpr std::size_t n_points =
Utilities::pow(fe_degree + 1, dim);
2077 hessians_quad + 5 * n_points, gradients_quad + n_points);
2080 hessians_quad + 5 * n_points, gradients_quad + n_points);
2087 for (
unsigned int q = 0;
q < n_points; ++
q)
2088 gradients_quad[(dim - 1) * n_points +
q] = Number();
2120 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
2124 evaluate(
const unsigned int n_components,
2126 const Number * values_dofs,
2130 integrate(
const unsigned int n_components,
2132 Number * values_dofs,
2139 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
2145 Number>::evaluate(
const unsigned int n_components,
2147 const Number * values_dofs,
2152 Assert(n_q_points_1d > fe_degree,
2153 ExcMessage(
"You lose information when going to a collocation space "
2154 "of lower degree, so the evaluation results would be "
2155 "wrong. Thus, this class does not permit the desired "
2157 constexpr std::size_t n_dofs =
Utilities::pow(fe_degree + 1, dim);
2158 constexpr std::size_t n_q_points =
Utilities::pow(n_q_points_1d, dim);
2160 for (
unsigned int c = 0; c < n_components; ++c)
2166 (fe_degree >= n_q_points_1d ? n_q_points_1d : fe_degree + 1),
2167 n_q_points_1d>::do_forward(1,
2169 values_dofs + c * n_dofs,
2170 fe_eval.begin_values() + c * n_q_points);
2179 fe_eval.begin_values() + c * n_q_points,
2180 fe_eval.begin_gradients() + c * dim * n_q_points,
2181 fe_eval.begin_hessians() +
2182 c * dim * (dim + 1) / 2 * n_q_points);
2188 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
2194 Number>::integrate(
const unsigned int n_components,
2196 Number * values_dofs,
2202 Assert(n_q_points_1d > fe_degree,
2203 ExcMessage(
"You lose information when going to a collocation space "
2204 "of lower degree, so the evaluation results would be "
2205 "wrong. Thus, this class does not permit the desired "
2207 constexpr std::size_t n_q_points =
Utilities::pow(n_q_points_1d, dim);
2209 for (
unsigned int c = 0; c < n_components; ++c)
2218 fe_eval.begin_values() + c * n_q_points,
2219 fe_eval.begin_gradients() + c * dim * n_q_points,
2220 fe_eval.begin_hessians() +
2221 c * dim * (dim + 1) / 2 * n_q_points,
2230 (fe_degree >= n_q_points_1d ? n_q_points_1d : fe_degree + 1),
2231 n_q_points_1d>::do_backward(1,
2234 fe_eval.begin_values() + c * n_q_points,
2251 const unsigned int n_q_points_1d)
2253 return (n_q_points_1d > fe_degree) && (n_q_points_1d < 200) &&
2254 (n_q_points_1d <= 3 * fe_degree / 2 + 1);
2273 template <
int dim,
typename Number,
bool do_
integrate>
2276 template <
int fe_degree,
int n_q_po
ints_1d,
typename OtherNumber>
2278 run(
const unsigned int n_components,
2287 std::is_same<Number,
2288 typename std::remove_const<OtherNumber>::type>
::value,
2289 "Type of Number and of OtherNumber do not match.");
2291 const auto element_type = fe_eval.get_shape_info().element_type;
2294 Assert(fe_eval.get_shape_info().
data.size() == 1 ||
2295 (fe_eval.get_shape_info().
data.size() == dim &&
2296 element_type == ElementType::tensor_general) ||
2297 element_type == ElementType::tensor_raviart_thomas,
2300 if (fe_degree >= 0 && fe_degree + 1 == n_q_points_1d &&
2301 element_type == ElementType::tensor_symmetric_collocation)
2313 else if (fe_degree >= 0 &&
2315 element_type <= ElementType::tensor_symmetric)
2328 else if (fe_degree >= 0 &&
2329 element_type <= ElementType::tensor_symmetric_no_collocation)
2342 else if (element_type == ElementType::tensor_symmetric_plus_dg0)
2349 Number>>(n_components,
2355 else if (element_type == ElementType::truncated_tensor)
2368 else if (element_type == ElementType::tensor_none)
2381 else if (element_type == ElementType::tensor_raviart_thomas)
2385 (fe_degree == -1) ? 1 : fe_degree,
2386 (n_q_points_1d < 1) ? 1 : n_q_points_1d,
2389 const_cast<Number *
>(
2412 template <
typename T>
2415 const unsigned int n_components,
2417 const Number * values_dofs,
2420 std::integral_constant<bool, false>)
2427 template <
typename T>
2430 const unsigned int n_components,
2432 Number * values_dofs,
2435 std::integral_constant<bool, true>)
2437 T::integrate(n_components,
2444 template <
typename T,
typename OtherNumber>
2447 const unsigned int n_components,
2458 std::integral_constant<bool, do_integrate>());
2490 const unsigned int subface_index,
2491 const unsigned int direction)
2507 const unsigned int index =
2508 direction == 0 ? subface_index % 2 : subface_index / 2;
2519 const unsigned int n_components,
2522 Number * values_dofs,
2523 Number * values_quad,
2524 Number * gradients_quad,
2525 Number * hessians_quad,
2526 Number * scratch_data,
2527 const unsigned int subface_index)
2532 const std::size_t n_dofs = fe_degree > -1 ?
2535 const std::size_t n_q_points =
2544 for (
unsigned int c = 0; c < n_components; ++c)
2559 values_quad[0] = values_dofs[0];
2566 values_dofs += 3 * n_dofs;
2567 values_quad += n_q_points;
2570 for (
unsigned int c = 0; c < n_components; ++c)
2590 values_quad, gradients_quad);
2592 values_quad, gradients_quad + n_q_points);
2617 scratch_data, gradients_quad + (dim - 1) * n_q_points);
2631 values_quad[0] = values_dofs[0];
2632 gradients_quad[0] = values_dofs[1];
2637 values_dofs += 3 * n_dofs;
2638 values_quad += n_q_points;
2639 gradients_quad += dim * n_q_points;
2645 for (
unsigned int c = 0; c < n_components; ++c)
2700 values_dofs + 2 * n_dofs, hessians_quad + n_q_points);
2703 values_dofs + n_dofs, hessians_quad + 2 * n_q_points);
2706 hessians_quad[0] = values_dofs[2];
2711 values_dofs += 3 * n_dofs;
2712 hessians_quad += dim * (dim + 1) / 2 * n_q_points;
2719 const unsigned int n_components,
2722 Number * values_dofs,
2723 Number * values_quad,
2724 Number * gradients_quad,
2725 Number * hessians_quad,
2726 Number * scratch_data,
2727 const unsigned int subface_index)
2732 const std::size_t n_dofs =
2736 const std::size_t n_q_points =
2745 for (
unsigned int c = 0; c < n_components; ++c)
2760 values_dofs[0] = values_quad[0];
2765 values_dofs += 3 * n_dofs;
2766 values_quad += n_q_points;
2769 for (
unsigned int c = 0; c < n_components; ++c)
2781 values_dofs + n_dofs);
2794 gradients_quad + n_q_points, values_quad);
2797 gradients_quad + n_q_points, values_quad);
2799 gradients_quad, values_quad);
2812 gradients_quad + n_q_points, scratch_data);
2816 gradients_quad + n_q_points, scratch_data);
2832 values_dofs + n_dofs);
2840 values_dofs[0] = values_quad[0];
2841 values_dofs[1] = gradients_quad[0];
2846 values_dofs += 3 * n_dofs;
2847 values_quad += n_q_points;
2848 gradients_quad += dim * n_q_points;
2854 for (
unsigned int c = 0; c < n_components; ++c)
2910 values_dofs + n_dofs);
2925 hessians_quad + n_q_points, values_dofs + 2 * n_dofs);
2929 hessians_quad + 2 * n_q_points, values_dofs + n_dofs);
2932 hessians_quad + 2 * n_q_points, values_dofs + n_dofs);
2935 values_dofs[2] = hessians_quad[0];
2944 values_dofs += 3 * n_dofs;
2945 hessians_quad += dim * (dim + 1) / 2 * n_q_points;
2951 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
2963 template <
typename EvalType>
2967 const unsigned int subface_index,
2968 const unsigned int direction)
2976 const unsigned int index =
2977 direction == 0 ? subface_index % 2 : subface_index / 2;
2984 template <
bool integrate>
2988 Number * values_dofs,
2990 Number * scratch_data,
2991 const unsigned int subface_index,
3020 std::integral_constant<bool, integrate>());
3029 std::integral_constant<bool, integrate>());
3037 std::integral_constant<bool, integrate>());
3048 template <
int normal_dir>
3051 Number * values_dofs,
3053 Number * scratch_data,
3056 const unsigned int subface_index,
3057 std::integral_constant<bool, false>)
3062 (fe_degree == -1) ? 1 : fe_degree + 1,
3070 (fe_degree == -1) ? 1 : fe_degree,
3077 conditional<normal_dir == 0, EvalNormal, EvalTangent>::type;
3079 conditional<normal_dir == 0, EvalTangent, EvalNormal>::type;
3080 using Eval0 =
typename std::
3081 conditional<normal_dir == 2, EvalGeneral, TempEval0>::type;
3082 using Eval1 =
typename std::
3083 conditional<normal_dir == 2, EvalGeneral, TempEval1>::type;
3085 const auto &shape_info = fe_eval.get_shape_info();
3087 ((
normal_dir == 0) ? shape_info.data[0] : shape_info.data[1]),
3091 ((
normal_dir == 1) ? shape_info.data[0] : shape_info.data[1]),
3095 constexpr std::size_t n_q_points =
Utilities::pow(n_q_points_1d, dim - 1);
3096 const std::size_t
n_dofs_tangent = shape_info.dofs_per_component_on_face;
3104 {{{1, 2, 0}}, {{2, 0, 1}}, {{0, 1, 2}}}};
3105 const unsigned int component =
3112 3 * ((component == 0) ?
3119 Number *values_quad = fe_eval.begin_values() + n_q_points * shift;
3120 Number *gradients_quad =
3121 fe_eval.begin_gradients() + dim * n_q_points * shift;
3122 Number *hessians_quad =
3123 fe_eval.begin_hessians() + dim * (dim + 1) / 2 * n_q_points * shift;
3242 values_dofs + 2 *
dofs_stride, hessians_quad + n_q_points);
3245 values_dofs +
dofs_stride, hessians_quad + 2 * n_q_points);
3253 template <
int normal_dir>
3256 Number * values_dofs,
3258 Number * scratch_data,
3261 const unsigned int subface_index,
3262 std::integral_constant<bool, true>)
3267 (fe_degree == -1) ? 1 : fe_degree + 1,
3275 (fe_degree == -1) ? 1 : fe_degree,
3282 conditional<normal_dir == 0, EvalNormal, EvalTangent>::type;
3284 conditional<normal_dir == 0, EvalTangent, EvalNormal>::type;
3285 using Eval0 =
typename std::
3286 conditional<normal_dir == 2, EvalGeneral, TempEval0>::type;
3287 using Eval1 =
typename std::
3288 conditional<normal_dir == 2, EvalGeneral, TempEval1>::type;
3290 const auto &shape_info = fe_eval.get_shape_info();
3292 ((
normal_dir == 0) ? shape_info.data[0] : shape_info.data[1]),
3296 ((
normal_dir == 1) ? shape_info.data[0] : shape_info.data[1]),
3300 constexpr std::size_t n_q_points =
Utilities::pow(n_q_points_1d, dim - 1);
3301 const std::size_t
n_dofs_tangent = shape_info.dofs_per_component_on_face;
3309 {{{1, 2, 0}}, {{2, 0, 1}}, {{0, 1, 2}}}};
3310 const unsigned int component =
3317 3 * ((component == 0) ?
3324 Number *values_quad = fe_eval.begin_values() + n_q_points * shift;
3325 Number *gradients_quad =
3326 fe_eval.begin_gradients() + dim * n_q_points * shift;
3327 Number *hessians_quad =
3328 fe_eval.begin_hessians() + dim * (dim + 1) / 2 * n_q_points * shift;
3361 gradients_quad + 2 * n_q_points, values_dofs +
dofs_stride);
3389 gradients_quad + n_q_points, values_dofs +
dofs_stride);
3473 hessians_quad + n_q_points, values_dofs + 2 *
dofs_stride);
3477 hessians_quad + 2 * n_q_points, values_dofs +
dofs_stride);
3480 hessians_quad + 2 * n_q_points, values_dofs +
dofs_stride);
3490 template <
int dim,
int fe_degree,
typename Number>
3496 template <
bool do_evaluate,
bool add_
into_output>
3501 const Number * input,
3505 Assert(
static_cast<unsigned int>(fe_degree) ==
3506 shape_info.
data.front().fe_degree ||
3511 n_components, input, output, flags,
face_no, shape_info);
3519 shape_info.
data.front().fe_degree + 1,
3520 shape_info.
data.front().shape_data_on_face,
3528 template <
bool do_evaluate,
bool add_
into_output>
3531 const unsigned int n_components,
3534 const Number * input,
3538 Assert(
static_cast<unsigned int>(fe_degree + 1) ==
3539 shape_info.
data.front().n_q_points_1d ||
3549 shape_info.
data.front().quadrature.size(),
3550 shape_info.
data.front().quadrature_data_on_face,
3556 template <
bool do_evaluate,
bool add_
into_output,
int face_direction = 0>
3559 const Number * input,
3565 const unsigned int dofs_per_component_on_cell,
3566 const unsigned int dofs_per_component_on_face)
3582 const unsigned int in_stride = do_evaluate ?
3583 dofs_per_component_on_cell :
3584 dofs_per_component_on_face;
3585 const unsigned int out_stride = do_evaluate ?
3586 dofs_per_component_on_face :
3587 dofs_per_component_on_cell;
3589 for (
unsigned int c = 0; c < n_components; ++c)
3622 dofs_per_component_on_cell,
3623 dofs_per_component_on_face);
3627 template <
typename EvalType>
3636 template <
bool do_evaluate,
3642 const unsigned int n_components,
3643 const Number * input,
3669 shape_info,
face_no, input, output);
3678 n_components, input, output, flag,
face_no, shape_info);
3689 n_components, input, output, flag,
face_no, shape_info);
3698 n_components, input, output, flag,
face_no, shape_info);
3704 template <
bool do_evaluate,
3712 const Number * input,
3718 using Evalf0 =
typename std::conditional<
3722 (fe_degree == -1) ? 1 : fe_degree + 1,
3729 (fe_degree == -1) ? 1 : fe_degree,
3734 using Evalf1 =
typename std::conditional<
3738 (fe_degree == -1) ? 1 : fe_degree + 1,
3745 (fe_degree == -1) ? 1 : fe_degree,
3750 using Evalf2 =
typename std::conditional<
3754 (fe_degree == -1) ? 1 : fe_degree + 1,
3761 (fe_degree == -1) ? 1 : fe_degree,
3769 shape_info.
data[0] :
3774 shape_info.
data[0] :
3779 shape_info.
data[0] :
3783 const unsigned int dofs_per_component_on_cell =
3785 const unsigned int dofs_per_component_on_face =
3792 do_evaluate ? dofs_per_component_on_cell : dofs_per_component_on_face;
3794 do_evaluate ? dofs_per_component_on_face : dofs_per_component_on_cell;
3798 dofs_per_component_on_cell :
3799 dofs_per_component_on_face - 3 *
Utilities::pow(fe_degree, dim - 2);
3802 dofs_per_component_on_face - 3 *
Utilities::pow(fe_degree, dim - 2) :
3803 dofs_per_component_on_cell;
3836 template <
typename VectorizedArrayType,
typename Number2>
3840 for (
unsigned int v = 0; v < VectorizedArrayType::size(); ++v)
3848 template <
typename Number, std::
size_t w
idth>
3858 template <
typename VectorizedArrayType,
typename Number2>
3861 const unsigned int * indices,
3862 VectorizedArrayType &dst)
3864 for (
unsigned int v = 0; v < VectorizedArrayType::size(); ++v)
3872 template <
typename Number, std::
size_t w
idth>
3875 const unsigned int * indices,
3884 template <
typename VectorizedArrayType,
typename Number2>
3888 for (
unsigned int v = 0; v < VectorizedArrayType::size(); ++v)
3896 template <
typename Number, std::
size_t w
idth>
3908 template <
typename VectorizedArrayType,
typename Number2>
3911 const unsigned int * indices,
3914 for (
unsigned int v = 0; v < VectorizedArrayType::size(); ++v)
3915 dst_ptr[indices[v]] += src[v];
3922 template <
typename Number, std::
size_t w
idth>
3925 const unsigned int * indices,
3928#if DEAL_II_VECTORIZATION_WIDTH_IN_BITS < 512
3929 for (
unsigned int v = 0; v < width; ++v)
3930 dst_ptr[indices[v]] += src[v];
3934 (tmp + src).scatter(indices,
dst_ptr);
3940 template <
typename Number>
3943 const unsigned int n_components,
3945 const unsigned int *orientation,
3946 const bool integrate,
3947 const std::size_t n_q_points,
3949 Number * values_quad,
3950 Number * gradients_quad,
3951 Number * hessians_quad)
3953 for (
unsigned int c = 0; c < n_components; ++c)
3958 for (
unsigned int q = 0;
q < n_q_points; ++
q)
3959 tmp_values[
q] = values_quad[c * n_q_points + orientation[
q]];
3961 for (
unsigned int q = 0;
q < n_q_points; ++
q)
3962 tmp_values[orientation[
q]] = values_quad[c * n_q_points +
q];
3963 for (
unsigned int q = 0;
q < n_q_points; ++
q)
3967 for (
unsigned int d = 0; d < dim; ++d)
3970 for (
unsigned int q = 0;
q < n_q_points; ++
q)
3972 gradients_quad[(c * dim + d) * n_q_points + orientation[
q]];
3974 for (
unsigned int q = 0;
q < n_q_points; ++
q)
3976 gradients_quad[(c * dim + d) * n_q_points +
q];
3977 for (
unsigned int q = 0;
q < n_q_points; ++
q)
3978 gradients_quad[(c * dim + d) * n_q_points +
q] =
tmp_values[
q];
3982 const unsigned int hdim = (dim * (dim + 1)) / 2;
3983 for (
unsigned int d = 0; d <
hdim; ++d)
3986 for (
unsigned int q = 0;
q < n_q_points; ++
q)
3990 for (
unsigned int q = 0;
q < n_q_points; ++
q)
3992 hessians_quad[(c *
hdim + d) * n_q_points +
q];
3993 for (
unsigned int q = 0;
q < n_q_points; ++
q)
3994 hessians_quad[(c *
hdim + d) * n_q_points +
q] =
4003 template <
typename Number,
typename VectorizedArrayType>
4006 const unsigned int dim,
4007 const unsigned int n_components,
4008 const unsigned int v,
4010 const unsigned int * orientation,
4011 const bool integrate,
4012 const std::size_t n_q_points,
4014 VectorizedArrayType * values_quad,
4015 VectorizedArrayType * gradients_quad =
nullptr,
4016 VectorizedArrayType * hessians_quad =
nullptr)
4018 for (
unsigned int c = 0; c < n_components; ++c)
4023 for (
unsigned int q = 0;
q < n_q_points; ++
q)
4024 tmp_values[
q] = values_quad[c * n_q_points + orientation[
q]][v];
4026 for (
unsigned int q = 0;
q < n_q_points; ++
q)
4027 tmp_values[orientation[
q]] = values_quad[c * n_q_points +
q][v];
4028 for (
unsigned int q = 0;
q < n_q_points; ++
q)
4032 for (
unsigned int d = 0; d < dim; ++d)
4036 for (
unsigned int q = 0;
q < n_q_points; ++
q)
4037 tmp_values[
q] = gradients_quad[(c * dim + d) * n_q_points +
4040 for (
unsigned int q = 0;
q < n_q_points; ++
q)
4042 gradients_quad[(c * dim + d) * n_q_points +
q][v];
4043 for (
unsigned int q = 0;
q < n_q_points; ++
q)
4044 gradients_quad[(c * dim + d) * n_q_points +
q][v] =
4050 const unsigned int hdim = (dim * (dim + 1)) / 2;
4051 for (
unsigned int d = 0; d <
hdim; ++d)
4054 for (
unsigned int q = 0;
q < n_q_points; ++
q)
4058 for (
unsigned int q = 0;
q < n_q_points; ++
q)
4060 hessians_quad[(c *
hdim + d) * n_q_points +
q][v];
4061 for (
unsigned int q = 0;
q < n_q_points; ++
q)
4062 hessians_quad[(c *
hdim + d) * n_q_points +
q][v] =
4071 template <
int dim,
typename Number>
4074 template <
int fe_degree,
int n_q_po
ints_1d>
4076 run(
const unsigned int n_components,
4078 const Number * values_dofs,
4081 const auto &shape_info = fe_eval.get_shape_info();
4088 Assert((fe_eval.get_dof_access_index() ==
4090 fe_eval.is_interior_face() ==
false) ==
false,
4093 const unsigned int face_no = fe_eval.get_face_no();
4094 const unsigned int face_orientation = fe_eval.get_face_orientation();
4095 const std::size_t n_dofs = shape_info.dofs_per_component_on_cell;
4096 const std::size_t n_q_points = shape_info.n_q_points_faces[
face_no];
4103 const auto shape_values =
4109 Eval
eval(shape_values,
nullptr,
nullptr, n_dofs, n_q_points);
4110 for (
unsigned int c = 0; c < n_components; ++c)
4125 std::array<const Number2 *, dim> shape_gradients;
4126 for (
unsigned int d = 0; d < dim; ++d)
4127 shape_gradients[d] = &
shape_data.shape_gradients_face(
4128 face_no, face_orientation, d, 0);
4130 for (
unsigned int c = 0; c < n_components; ++c)
4132 for (
unsigned int d = 0; d < dim; ++d)
4155 const unsigned int dofs_per_face =
4161 Number *
temp = fe_eval.get_scratch_data().
begin();
4162 Number *scratch_data =
temp + 3 * n_components * dofs_per_face;
4166 if (fe_eval.get_dof_access_index() ==
4168 fe_eval.is_interior_face() ==
false)
4169 for (
unsigned int v = 0; v < Number::size(); ++v)
4171 fe_eval.get_face_no(v) != fe_eval.get_face_no(0))
4176 for (
unsigned int v = 0; v < Number::size(); ++v)
4183 for (
unsigned int i = 0; i < 3 * n_components * dofs_per_face;
4195 fe_eval.get_face_no(v));
4197 for (
unsigned int i = 0; i < 3 * n_components * dofs_per_face;
4199 temp[i][v] = scratch_data[i][v];
4209 fe_eval.get_face_no());
4211 const unsigned int subface_index = fe_eval.get_subface_index();
4213 fe_degree > -1 ? n_q_points_1d : 0;
4215 if (fe_degree >= 1 &&
4219 (fe_degree == -1) ? 1 : fe_degree,
4220 (n_q_points_1d < 1) ? 1 :
4229 fe_eval.get_face_no());
4231 else if (fe_degree > -1 &&
4238 Number>::evaluate_in_face(n_components,
4242 fe_eval.begin_values(),
4245 fe_eval.begin_hessians(),
4253 Number>::evaluate_in_face(n_components,
4257 fe_eval.begin_values(),
4260 fe_eval.begin_hessians(),
4266 for (
unsigned int v = 0; v < Number::size(); ++v)
4274 if (fe_eval.get_face_orientation(v) != 0)
4280 &fe_eval.get_shape_info().face_orientations_quad(
4281 fe_eval.get_face_orientation(v), 0),
4283 shape_info.n_q_points_face,
4285 fe_eval.begin_values(),
4286 fe_eval.begin_gradients(),
4287 fe_eval.begin_hessians());
4290 else if (fe_eval.get_face_orientation() != 0)
4295 &fe_eval.get_shape_info().face_orientations_quad(
4296 fe_eval.get_face_orientation(), 0),
4298 shape_info.n_q_points_face,
4300 fe_eval.begin_values(),
4301 fe_eval.begin_gradients(),
4302 fe_eval.begin_hessians());
4310 template <
int dim,
typename Number>
4313 template <
int fe_degree,
int n_q_po
ints_1d>
4315 run(
const unsigned int n_components,
4317 Number * values_dofs,
4320 const auto &shape_info = fe_eval.get_shape_info();
4327 Assert((fe_eval.get_dof_access_index() ==
4329 fe_eval.is_interior_face() ==
false) ==
false,
4332 const unsigned int face_no = fe_eval.get_face_no();
4333 const unsigned int face_orientation = fe_eval.get_face_orientation();
4334 const std::size_t n_dofs = shape_info.dofs_per_component_on_cell;
4335 const std::size_t n_q_points = shape_info.n_q_points_faces[
face_no];
4342 const auto shape_values =
4348 Eval
eval(shape_values,
nullptr,
nullptr, n_dofs, n_q_points);
4349 for (
unsigned int c = 0; c < n_components; ++c)
4364 std::array<const Number2 *, dim> shape_gradients;
4365 for (
unsigned int d = 0; d < dim; ++d)
4366 shape_gradients[d] = &
shape_data.shape_gradients_face(
4367 face_no, face_orientation, d, 0);
4369 for (
unsigned int c = 0; c < n_components; ++c)
4371 for (
unsigned int d = 0; d < dim; ++d)
4399 const unsigned int dofs_per_face =
4403 Number *
temp = fe_eval.get_scratch_data().
begin();
4404 Number *scratch_data =
temp + 3 * n_components * dofs_per_face;
4408 if (fe_eval.get_dof_access_index() ==
4410 fe_eval.is_interior_face() ==
false)
4413 std::all_of(fe_eval.get_cell_ids().
begin() + 1,
4414 fe_eval.get_cell_ids().
end(),
4415 [&](
const auto &v) {
4416 return v == fe_eval.get_cell_ids()[0] ||
4417 v == numbers::invalid_unsigned_int;
4422 for (
unsigned int v = 0; v < Number::size(); ++v)
4430 if (fe_eval.get_face_orientation(v) != 0)
4436 &fe_eval.get_shape_info().face_orientations_quad(
4437 fe_eval.get_face_orientation(v), 0),
4439 shape_info.n_q_points_face,
4441 fe_eval.begin_values(),
4442 fe_eval.begin_gradients(),
4443 fe_eval.begin_hessians());
4446 else if (fe_eval.get_face_orientation() != 0)
4451 &fe_eval.get_shape_info().face_orientations_quad(
4452 fe_eval.get_face_orientation(), 0),
4454 shape_info.n_q_points_face,
4456 fe_eval.begin_values(),
4457 fe_eval.begin_gradients(),
4458 fe_eval.begin_hessians());
4461 fe_degree > -1 ? n_q_points_1d : 0;
4462 const unsigned int subface_index = fe_eval.get_subface_index();
4464 if (fe_degree >= 1 &&
4468 (fe_degree == -1) ? 1 : fe_degree,
4469 (n_q_points_1d < 1) ? 1 :
4477 fe_eval.get_face_no());
4479 else if (fe_degree > -1 &&
4480 fe_eval.get_subface_index() >=
4488 Number>::integrate_in_face(n_components,
4492 fe_eval.begin_values(),
4493 fe_eval.begin_gradients(),
4494 fe_eval.begin_hessians(),
4503 Number>::integrate_in_face(n_components,
4507 fe_eval.begin_values(),
4508 fe_eval.begin_gradients(),
4509 fe_eval.begin_hessians(),
4515 for (
unsigned int v = 0; v < Number::size(); ++v)
4529 fe_eval.get_face_no(v));
4531 for (
unsigned int i = 0; i < 3 * n_components * dofs_per_face;
4533 temp[i][v] = scratch_data[i][v];
4543 fe_eval.get_face_no());
4550 template <
int n_face_orientations,
4557 const unsigned int n_components,
4562 typename Processor::VectorizedArrayType_ *
temp1)
4564 constexpr int dim = Processor::dim_;
4565 constexpr int fe_degree = Processor::fe_degree_;
4566 using VectorizedArrayType =
typename Processor::VectorizedArrayType_;
4567 constexpr int n_lanes = VectorizedArrayType::size();
4569 using Number =
typename Processor::Number_;
4570 using Number2_ =
typename Processor::Number2_;
4573 constexpr bool integrate = Processor::do_integrate;
4574 const unsigned int face_no = fe_eval.get_face_no();
4575 const auto & dof_info = fe_eval.get_dof_info();
4576 const unsigned int cell = fe_eval.get_cell_or_face_batch_id();
4578 fe_eval.get_dof_access_index();
4580 dof_info.index_storage_variants[dof_access_index].size());
4581 constexpr unsigned int dofs_per_face =
4583 const unsigned int subface_index = fe_eval.get_subface_index();
4586 dof_info.n_vectorization_lanes_filled[dof_access_index][cell];
4589 if (n_face_orientations == n_lanes)
4590 for (
unsigned int v = 1; v < n_lanes; ++v)
4591 if (fe_eval.get_face_no(v) != fe_eval.get_face_no(0) ||
4592 fe_eval.get_face_orientation(v) != fe_eval.get_face_orientation(0))
4599 std::array<const unsigned int *, n_face_orientations> orientation = {};
4602 fe_eval.is_interior_face() == 0)
4603 for (
unsigned int v = 0; v < n_lanes; ++v)
4612 fe_eval.get_face_orientation(v) != 0)
4631 orientation[v] = &fe_eval.get_shape_info().face_orientations_dofs(
4632 fe_eval.get_face_orientation(v), 0);
4635 else if (dim == 3 && fe_eval.get_face_orientation() != 0)
4653 for (
unsigned int v = 0; v < n_face_orientations; ++v)
4654 orientation[v] = &fe_eval.get_shape_info().face_orientations_dofs(
4655 fe_eval.get_face_orientation(), 0);
4663 .shape_data_on_face[0][fe_degree + (integrate ? (2 -
face_no % 2) :
4671 if (n_face_orientations == 1)
4673 &fe_eval.get_shape_info().face_to_cell_index_hermite(
face_no, 0);
4676 for (
unsigned int v = 0; v < n_lanes; ++v)
4681 const auto face_no = fe_eval.get_face_no(v);
4690 &fe_eval.get_shape_info().face_to_cell_index_hermite(
face_no,
4699 if (
shape_data.nodal_at_cell_boundaries ==
true)
4701 if (n_face_orientations == 1)
4703 &fe_eval.get_shape_info().face_to_cell_index_nodal(
face_no, 0);
4706 for (
unsigned int v = 0; v < n_lanes; ++v)
4711 const auto face_no = fe_eval.get_face_no(v);
4714 &fe_eval.get_shape_info().face_to_cell_index_nodal(
face_no,
4721 const auto reorientate = [&](
const unsigned int v,
const unsigned int i) {
4729 fe_eval.get_cell_ids()[0] :
4731 const unsigned int *dof_indices =
4732 &dof_info.dof_indices_contiguous[dof_access_index][
cell_index];
4734 for (
unsigned int comp = 0;
comp < n_components; ++
comp)
4737 dof_info.component_dof_indices_offset
4738 [fe_eval.get_active_fe_index()]
4739 [fe_eval.get_first_selected_component()] +
4743 if (n_face_orientations == 1 &&
4744 dof_info.index_storage_variants[dof_access_index][cell] ==
4746 interleaved_contiguous)
4749 dof_info.n_vectorization_lanes_filled[dof_access_index][cell],
4751 Number2_ *vector_ptr =
4756 for (
unsigned int i = 0; i < dofs_per_face; ++i)
4764 temp1[i_ + dofs_per_face],
4765 vector_ptr +
ind1 * n_lanes,
4766 vector_ptr +
ind2 * n_lanes,
4772 for (
unsigned int i = 0; i < dofs_per_face; ++i)
4779 vector_ptr +
ind * n_lanes);
4785 else if (n_face_orientations == 1 &&
4786 dof_info.index_storage_variants[dof_access_index][cell] ==
4788 interleaved_contiguous_strided)
4791 dof_info.n_vectorization_lanes_filled[dof_access_index][cell],
4796 for (
unsigned int i = 0; i < dofs_per_face; ++i)
4801 const unsigned int ind1 =
4803 const unsigned int ind2 =
4805 proc.hermite_grad_vectorized_indexed(
4807 temp1[i_ + dofs_per_face],
4817 for (
unsigned int i = 0; i < dofs_per_face; ++i)
4823 proc.value_vectorized_indexed(
temp1[i_],
4831 else if (n_face_orientations == 1 &&
4832 dof_info.index_storage_variants[dof_access_index][cell] ==
4834 interleaved_contiguous_mixed_strides)
4837 &dof_info.dof_indices_interleave_strides[dof_access_index]
4839 unsigned int indices[n_lanes];
4840 for (
unsigned int v = 0; v < n_lanes; ++v)
4843 dof_info.n_vectorization_lanes_filled[dof_access_index][cell];
4848 for (
unsigned int i = 0; i < dofs_per_face; ++i)
4853 unsigned int ind1[n_lanes];
4855 for (
unsigned int v = 0; v < n_lanes; ++v)
4856 ind1[v] = indices[v] +
4858 unsigned int ind2[n_lanes];
4860 for (
unsigned int v = 0; v < n_lanes; ++v)
4865 proc.hermite_grad_vectorized_indexed(
4867 temp1[i_ + dofs_per_face],
4876 if (integrate ==
false)
4877 for (
unsigned int i = 0; i < 2 * dofs_per_face; ++i)
4878 temp1[i] = VectorizedArrayType();
4881 for (
unsigned int i = 0; i < dofs_per_face; ++i)
4883 const unsigned int i_ =
4887 temp1[i_ + dofs_per_face][v],
4891 [n_face_orientations == 1 ? 0 : v][2 * i] *
4906 for (
unsigned int i = 0; i < dofs_per_face; ++i)
4909 unsigned int ind[n_lanes];
4911 for (
unsigned int v = 0; v < n_lanes; ++v)
4915 proc.value_vectorized_indexed(
temp1[i_],
4921 if (integrate ==
false)
4922 for (
unsigned int i = 0; i < dofs_per_face; ++i)
4923 temp1[i] = VectorizedArrayType();
4926 for (
unsigned int i = 0; i < dofs_per_face; ++i)
4940 else if (n_face_orientations > 1 ||
4941 dof_info.index_storage_variants[dof_access_index][cell] ==
4956 if (n_face_orientations == 1)
4967 .dof_indices_contiguous_sm[dof_access_index]
4968 [cell * n_lanes + v];
4974 else if (n_face_orientations == n_lanes)
4976 const auto &cells = fe_eval.get_cell_ids();
4977 for (
unsigned int v = 0; v < n_lanes; ++v)
4985 .dof_indices_contiguous[dof_access_index]
4992 .dof_indices_contiguous_sm[dof_access_index]
5005 else if (n_face_orientations == n_lanes)
5007 for (
unsigned int v = 0; v < n_lanes; ++v)
5009 dof_info.dof_indices_contiguous[dof_access_index]
5010 [fe_eval.get_cell_ids()[v]];
5017 for (
unsigned int i = 0; i < dofs_per_face; ++i)
5020 const unsigned int ind2 =
5024 proc.hermite_grad_vectorized_indexed(
5026 temp1[i_ + dofs_per_face],
5033 else if (n_face_orientations == 1)
5034 for (
unsigned int i = 0; i < dofs_per_face; ++i)
5037 const unsigned int ind2 =
5043 temp1[i_ + dofs_per_face][v],
5048 if (integrate ==
false)
5052 temp1[i + dofs_per_face][v] = 0.0;
5058 for (
unsigned int i = 0; i < dofs_per_face; ++i)
5059 temp1[i] =
temp1[i + dofs_per_face] = Number();
5062 for (
unsigned int i = 0; i < dofs_per_face; ++i)
5074 for (
unsigned int i = 0; i < dofs_per_face; ++i)
5079 proc.value_vectorized_indexed(
temp1[i_],
5083 else if (n_face_orientations == 1)
5084 for (
unsigned int i = 0; i < dofs_per_face; ++i)
5092 if (integrate ==
false)
5099 for (
unsigned int i = 0; i < dofs_per_face; ++i)
5100 temp1[i] = Number();
5103 for (
unsigned int i = 0; i < dofs_per_face; ++i)
5115 temp1 += 3 * dofs_per_face;
5121 template <
int dim,
typename Number2,
typename VectorizedArrayType>
5124 using Number =
typename VectorizedArrayType::value_type;
5126 template <
int fe_degree,
int n_q_po
ints_1d>
5128 run(
const unsigned int n_components,
5135 Assert(fe_eval.get_shape_info().element_type <=
5139 const unsigned int dofs_per_face =
Utilities::pow(fe_degree + 1, dim - 1);
5141 VectorizedArrayType *
temp = fe_eval.get_scratch_data().
begin();
5142 VectorizedArrayType *scratch_data =
5143 temp + 3 * n_components * dofs_per_face;
5147 if (fe_eval.get_dof_access_index() ==
5149 fe_eval.is_interior_face() ==
false)
5156 const unsigned int subface_index = fe_eval.get_subface_index();
5163 VectorizedArrayType>
::
5166 fe_eval.get_shape_info().
data.front(),
5168 fe_eval.begin_values(),
5169 fe_eval.begin_gradients(),
5170 fe_eval.begin_hessians(),
5178 VectorizedArrayType>
::
5181 fe_eval.get_shape_info().
data.front(),
5183 fe_eval.begin_values(),
5184 fe_eval.begin_gradients(),
5185 fe_eval.begin_hessians(),
5192 if (fe_eval.get_dof_access_index() ==
5194 fe_eval.is_interior_face() ==
false)
5196 for (
unsigned int v = 0; v < VectorizedArrayType::size(); ++v)
5201 if (fe_eval.get_cell_ids()[v] ==
5205 if (fe_eval.get_face_orientation(v) != 0)
5211 &fe_eval.get_shape_info().face_orientations_quad(
5212 fe_eval.get_face_orientation(v), 0),
5216 fe_eval.begin_values(),
5217 fe_eval.begin_gradients(),
5218 fe_eval.begin_hessians());
5221 else if (fe_eval.get_face_orientation() != 0)
5226 &fe_eval.get_shape_info().face_orientations_quad(
5227 fe_eval.get_face_orientation(), 0),
5231 fe_eval.begin_values(),
5232 fe_eval.begin_gradients(),
5233 fe_eval.begin_hessians());
5239 template <
typename Number3>
5243 const Number2 * vector_ptr,
5246 const unsigned int fe_degree = shape_info.
data.front().fe_degree;
5247 if (fe_degree < 1 || !shape_info.
data.front().nodal_at_cell_boundaries ||
5250 shape_info.
data.front().element_type !=
5253 vector_ptr ==
nullptr ||
5254 shape_info.
data.front().element_type >
5264 template <
int fe_degree>
5274 template <
typename T0,
typename T1,
typename T2>
5287 template <
typename T1,
typename T2>
5294 template <
typename T0,
typename T1,
typename T2,
typename T3>
5309 template <
typename T0,
typename T1,
typename T2>
5316 template <
typename T0,
typename T1,
typename T2>
5329 template <
typename T1,
typename T2>
5341 template <
int dim,
typename Number2,
typename VectorizedArrayType>
5344 using Number =
typename VectorizedArrayType::value_type;
5346 template <
int fe_degree,
int n_q_po
ints_1d>
5348 run(
const unsigned int n_components,
5355 Assert(fe_eval.get_shape_info().element_type <=
5359 const unsigned int dofs_per_face =
Utilities::pow(fe_degree + 1, dim - 1);
5361 VectorizedArrayType *
temp = fe_eval.get_scratch_data().
begin();
5362 VectorizedArrayType *scratch_data =
5363 temp + 3 * n_components * dofs_per_face;
5365 const unsigned int subface_index = fe_eval.get_subface_index();
5370 if (fe_eval.get_dof_access_index() ==
5372 fe_eval.is_interior_face() ==
false)
5373 for (
unsigned int v = 0; v < VectorizedArrayType::size(); ++v)
5381 if (fe_eval.get_face_orientation(v) != 0)
5387 &fe_eval.get_shape_info().face_orientations_quad(
5388 fe_eval.get_face_orientation(v), 0),
5392 fe_eval.begin_values(),
5393 fe_eval.begin_gradients(),
5394 fe_eval.begin_hessians());
5396 else if (fe_eval.get_face_orientation() != 0)
5401 &fe_eval.get_shape_info().face_orientations_quad(
5402 fe_eval.get_face_orientation(), 0),
5406 fe_eval.begin_values(),
5407 fe_eval.begin_gradients(),
5408 fe_eval.begin_hessians());
5411 if (fe_degree > -1 && fe_eval.get_subface_index() >=
5417 VectorizedArrayType>::
5418 integrate_in_face(n_components,
5420 fe_eval.get_shape_info().
data.front(),
5422 fe_eval.begin_values(),
5423 fe_eval.begin_gradients(),
5424 fe_eval.begin_hessians(),
5432 VectorizedArrayType>
::
5435 fe_eval.get_shape_info().
data.front(),
5437 fe_eval.begin_values(),
5438 fe_eval.begin_gradients(),
5439 fe_eval.begin_hessians(),
5445 if (fe_eval.get_dof_access_index() ==
5447 fe_eval.is_interior_face() ==
false)
5458 template <
int fe_degree>
5468 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4>
5483 template <
typename T0,
typename T1>
5491 template <
typename T0,
typename T1,
typename T2,
typename T3>
5508 template <
typename T0,
typename T1,
typename T2>
5516 template <
typename T0,
typename T1,
typename T2>
5531 template <
typename T0,
typename T1>
5547 template <
int dim,
typename Number>
5553 template <
int fe_degree,
int = 0>
5555 run(
const unsigned int n_components,
5560 const unsigned int given_degree =
5561 (fe_degree > -1) ? fe_degree :
5562 fe_eval.get_shape_info().
data.front().fe_degree;
5564 const unsigned int dofs_per_component =
5568 Assert(fe_eval.get_shape_info().element_type <=
5580 fe_eval.get_shape_info().data.front().inverse_shape_values_eo,
5584 for (
unsigned int d = 0; d < n_components; ++d)
5586 const Number *in =
in_array + d * dofs_per_component;
5587 Number * out =
out_array + d * dofs_per_component;
5596 for (
unsigned int q = 0;
q < dofs_per_component; ++
q)
5599 for (
unsigned int d = 0; d < n_components; ++d)
5602 for (
unsigned int d = 0; d < n_components; ++d)
5604 Number *out =
out_array + d * dofs_per_component;
5623 template <
int dim,
typename Number>
5629 template <
int fe_degree,
int = 0>
5638 const unsigned int given_degree =
5639 (fe_degree > -1) ? fe_degree :
5640 fe_eval.get_shape_info().
data.front().fe_degree;
5642 const unsigned int dofs_per_component =
5648 "Expected diagonal to be a multiple of scalar dof per cells"));
5664 Assert(fe_eval.get_shape_info().element_type <=
5676 fe_eval.get_shape_info().data.front().inverse_shape_values_eo,
5696 const Number *
in_ = in +
di * dofs_per_component;
5697 Number *
out_ = out +
di * dofs_per_component;
5710 for (
unsigned int q = 0;
q < dofs_per_component; ++
q)
5714 dofs_per_component);
5718 for (
unsigned int q = 0;
q < dofs_per_component; ++
q)
5727 for (
unsigned int q = 0;
q < dofs_per_component; ++
q)
5732 Number *
out_ = out +
di * dofs_per_component;
5740 in += dofs_per_component;
5741 out += dofs_per_component;
5749 template <
int n_components>
5754 const unsigned int dofs_per_component,
5760 std::array<Number, dim + 2> tmp = {};
5763 "Number of components larger than dim+2 not supported."));
5766 tmp[d] = src[d * dofs_per_component];
5775 dst[
d1 * dofs_per_component] = sum;
5788 template <
int dim,
typename Number>
5791 template <
int fe_degree,
int n_q_po
ints_1d>
5799 fe_degree > -1 && (fe_degree + 1 == n_q_points_1d);
5801 Assert(fe_eval.get_shape_info().element_type !=
5807 fe_eval.get_shape_info().
data.front().inverse_shape_values_eo :
5808 fe_eval.get_shape_info().
data.front().inverse_shape_values;
5810 const std::size_t dofs_per_component =
5812 fe_eval.get_shape_info().dofs_per_component_on_cell;
5815 fe_eval.get_shape_info().n_q_points;
5828 fe_eval.get_shape_info().data.front().fe_degree + 1,
5829 fe_eval.get_shape_info().
data.front().n_q_points_1d);
5833 const Number *in =
in_array + d * n_q_points;
5834 Number * out =
out_array + d * dofs_per_component;
5866 template <
int fe_degree,
int n_q_po
ints_1d>
5870 return fe_degree != -1;
value_type * data() const noexcept
Number shape_info_number_type
#define DEAL_II_ALWAYS_INLINE
#define DEAL_II_OPENMP_SIMD_PRAGMA
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
@ tensor_symmetric_no_collocation
@ tensor_symmetric_plus_dg0
@ tensor_symmetric_hermite
EvaluationFlags
The EvaluationFlags enum.
constexpr T pow(const T base, const int iexp)
void do_vectorized_add(const VectorizedArrayType src, Number2 *dst_ptr)
constexpr bool use_collocation_evaluation(const unsigned int fe_degree, const unsigned int n_q_points_1d)
void adjust_for_face_orientation_per_lane(const unsigned int dim, const unsigned int n_components, const unsigned int v, const EvaluationFlags::EvaluationFlags flag, const unsigned int *orientation, const bool integrate, const std::size_t n_q_points, Number *tmp_values, VectorizedArrayType *values_quad, VectorizedArrayType *gradients_quad=nullptr, VectorizedArrayType *hessians_quad=nullptr)
void fe_face_evaluation_process_and_io(Processor &proc, const unsigned int n_components, const EvaluationFlags::EvaluationFlags evaluation_flag, typename Processor::Number2_ *global_vector_ptr, const std::vector< ArrayView< const typename Processor::Number2_ > > *sm_ptr, const EvaluationData &fe_eval, typename Processor::VectorizedArrayType_ *temp1)
void do_vectorized_scatter_add(const VectorizedArrayType src, const unsigned int *indices, Number2 *dst_ptr)
void do_vectorized_gather(const Number2 *src_ptr, const unsigned int *indices, VectorizedArrayType &dst)
void do_vectorized_read(const Number2 *src_ptr, VectorizedArrayType &dst)
void adjust_for_face_orientation(const unsigned int dim, const unsigned int n_components, const EvaluationFlags::EvaluationFlags flag, const unsigned int *orientation, const bool integrate, const std::size_t n_q_points, Number *tmp_values, Number *values_quad, Number *gradients_quad, Number *hessians_quad)
@ evaluate_raviart_thomas
static const 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 > &)
typename FEEvaluationData< dim, Number, false >::shape_info_number_type Number2
static bool run(const unsigned int n_components, const FEEvaluationData< dim, Number, false > &fe_eval, const Number *in_array, Number *out_array)
typename FEEvaluationData< dim, Number, false >::shape_info_number_type Number2
static bool run(const unsigned int n_desired_components, const FEEvaluationData< dim, Number, false > &fe_eval, const ArrayView< const Number > &inverse_coefficients, const bool dyadic_coefficients, const Number *in_array, Number *out_array)
static void vmult(const Number *inverse_coefficients, const Number *src, Number *dst, const unsigned int dofs_per_component, const unsigned int n_given_components=0)
static void do_mass(const unsigned int n_components, const AlignedVector< Number2 > &transformation_matrix, const AlignedVector< Number > &coefficients, const Number *values_in, Number *scratch_data, Number *values_out)
static void do_forward(const unsigned int n_components, const AlignedVector< Number2 > &transformation_matrix, const Number *values_in, Number *values_out, const unsigned int basis_size_1_variable=numbers::invalid_unsigned_int, const unsigned int basis_size_2_variable=numbers::invalid_unsigned_int)
static void do_backward(const unsigned int n_components, const AlignedVector< Number2 > &transformation_matrix, const bool add_into_result, Number *values_in, Number *values_out, const unsigned int basis_size_1_variable=numbers::invalid_unsigned_int, const unsigned int basis_size_2_variable=numbers::invalid_unsigned_int)
static void integrate(const unsigned int n_components, const EvaluationFlags::EvaluationFlags integration_flag, Number *values_dofs, FEEvaluationData< dim, Number, false > &fe_eval, const bool add_into_values_array)
static void do_evaluate(const MatrixFreeFunctions::UnivariateShapeData< Number2 > &shape, const EvaluationFlags::EvaluationFlags evaluation_flag, const Number *values_dofs, Number *gradients_quad, Number *hessians_quad)
static void do_integrate(const MatrixFreeFunctions::UnivariateShapeData< Number2 > &shape, const EvaluationFlags::EvaluationFlags integration_flag, Number *values_dofs, Number *gradients_quad, const Number *hessians_quad, const bool add_into_values_array)
static void evaluate(const unsigned int n_components, const EvaluationFlags::EvaluationFlags evaluation_flag, const Number *values_dofs, FEEvaluationData< dim, Number, false > &fe_eval)
typename FEEvaluationData< dim, Number, false >::shape_info_number_type Number2
static void evaluate_or_integrate(const unsigned int n_components, const EvaluationFlags::EvaluationFlags evaluation_flag, OtherNumber *values_dofs, FEEvaluationData< dim, Number, false > &fe_eval, const bool sum_into_values_array)
static bool run(const unsigned int n_components, const EvaluationFlags::EvaluationFlags evaluation_flag, OtherNumber *values_dofs, FEEvaluationData< dim, Number, false > &fe_eval, const bool sum_into_values_array=false)
static void evaluate_or_integrate(const unsigned int n_components, const EvaluationFlags::EvaluationFlags evaluation_flag, const Number *values_dofs, FEEvaluationData< dim, Number, false > &fe_eval, const bool sum_into_values_array, std::integral_constant< bool, false >)
static void evaluate_or_integrate(const unsigned int n_components, const EvaluationFlags::EvaluationFlags evaluation_flag, Number *values_dofs, FEEvaluationData< dim, Number, false > &fe_eval, const bool sum_into_values_array, std::integral_constant< bool, true >)
static EvalType create_evaluator_tensor_product(const MatrixFreeFunctions::UnivariateShapeData< Number2 > &shape_data)
static const EvaluatorVariant variant
typename FEEvaluationData< dim, Number, false >::shape_info_number_type Number2
EvaluatorTensorProduct< variant, dim, fe_degree+1, n_q_points_1d, Number, Number2 > Eval
static void integrate(const unsigned int n_components, const EvaluationFlags::EvaluationFlags integration_flag, Number *values_dofs_actual, FEEvaluationData< dim, Number, false > &fe_eval, const bool add_into_values_array)
static Eval create_evaluator_tensor_product(const MatrixFreeFunctions::UnivariateShapeData< Number2 > *univariate_shape_data)
static void evaluate(const unsigned int n_components, const EvaluationFlags::EvaluationFlags evaluation_flag, const Number *values_dofs_actual, FEEvaluationData< dim, Number, false > &fe_eval)
static bool run(const unsigned int n_components, const EvaluationFlags::EvaluationFlags evaluation_flag, const Number *values_dofs, FEEvaluationData< dim, Number, true > &fe_eval)
void hermite_grad(T0 &temp_1, T0 &temp_2, const T1 &src_ptr_1, const T1 &src_ptr_2, const T2 &grad_weight)
static const int fe_degree_
static const bool do_integrate
void value_vectorized(T1 &temp, const T2 src_ptr)
void value(T1 &temp, const T2 &src_ptr)
VectorizedArrayType VectorizedArrayType_
void value_vectorized_indexed(T0 &temp, const T1 src_ptr, const T2 &indices)
void hermite_grad_vectorized(T0 &temp_1, T0 &temp_2, const T1 src_ptr_1, const T1 src_ptr_2, const T2 &grad_weight)
void hermite_grad_vectorized_indexed(T0 &temp_1, T0 &temp_2, const T1 src_ptr_1, const T1 src_ptr_2, const T2 &grad_weight, const T3 &indices_1, const T3 &indices_2)
typename VectorizedArrayType::value_type Number
static bool run(const unsigned int n_components, const EvaluationFlags::EvaluationFlags evaluation_flag, const Number2 *src_ptr, const std::vector< ArrayView< const Number2 > > *sm_ptr, FEEvaluationData< dim, VectorizedArrayType, true > &fe_eval)
static bool supports(const EvaluationFlags::EvaluationFlags evaluation_flag, const MatrixFreeFunctions::ShapeInfo< Number3 > &shape_info, const Number2 *vector_ptr, MatrixFreeFunctions::DoFInfo::IndexStorageVariants storage)
static const int fe_degree_
void value(const T0 &temp, T1 &dst_ptr)
void hermite_grad_vectorized(const T0 &temp_1, const T1 &temp_2, T2 dst_ptr_1, T3 dst_ptr_2, const T4 &grad_weight)
void hermite_grad_vectorized_indexed(const T0 &temp_1, const T0 &temp_2, T1 dst_ptr_1, T1 dst_ptr_2, const T2 &grad_weight, const T3 &indices_1, const T3 &indices_2)
static const bool do_integrate
VectorizedArrayType VectorizedArrayType_
void hermite_grad(const T0 &temp_1, const T0 &temp_2, T1 &dst_ptr_1, T1 &dst_ptr_2, const T2 &grad_weight)
void value_vectorized(const T0 &temp, T1 dst_ptr)
void value_vectorized_indexed(const T0 &temp, T1 dst_ptr, const T2 &indices)
typename VectorizedArrayType::value_type Number
static bool run(const unsigned int n_components, const EvaluationFlags::EvaluationFlags integration_flag, Number2 *dst_ptr, const std::vector< ArrayView< const Number2 > > *sm_ptr, FEEvaluationData< dim, VectorizedArrayType, true > &fe_eval)
static bool run(const unsigned int n_components, const EvaluationFlags::EvaluationFlags integration_flag, Number *values_dofs, FEEvaluationData< dim, Number, true > &fe_eval)
static void evaluate_or_integrate_in_face(const EvaluationFlags::EvaluationFlags evaluation_flag, Number *values_dofs, FEEvaluationData< dim, Number, true > &fe_eval, Number *scratch_data, const unsigned int subface_index, const unsigned int face_no)
static void evaluate_in_face_apply(Number *values_dofs, FEEvaluationData< dim, Number, true > &fe_eval, Number *scratch_data, const EvaluationFlags::EvaluationFlags evaluation_flag, const unsigned int face_direction, const unsigned int subface_index, std::integral_constant< bool, false >)
static EvalType create_evaluator_tensor_product(const MatrixFreeFunctions::UnivariateShapeData< Number2 > &data, const unsigned int subface_index, const unsigned int direction)
static void evaluate_in_face_apply(Number *values_dofs, FEEvaluationData< dim, Number, true > &fe_eval, Number *scratch_data, const EvaluationFlags::EvaluationFlags evaluation_flag, const unsigned int face_direction, const unsigned int subface_index, std::integral_constant< bool, true >)
typename FEEvaluationData< dim, Number, true >::shape_info_number_type Number2
EvaluatorTensorProduct< symmetric_evaluate ? evaluate_evenodd :evaluate_general, dim - 1, fe_degree+1, n_q_points_1d, Number, Number2 > Eval
static void evaluate_in_face(const unsigned int n_components, const EvaluationFlags::EvaluationFlags evaluation_flag, const MatrixFreeFunctions::UnivariateShapeData< Number2 > &data, Number *values_dofs, Number *values_quad, Number *gradients_quad, Number *hessians_quad, Number *scratch_data, const unsigned int subface_index)
static Eval create_evaluator_tensor_product(const MatrixFreeFunctions::UnivariateShapeData< Number2 > &data, const unsigned int subface_index, const unsigned int direction)
static void integrate_in_face(const unsigned int n_components, const EvaluationFlags::EvaluationFlags integration_flag, const MatrixFreeFunctions::UnivariateShapeData< Number2 > &data, Number *values_dofs, Number *values_quad, Number *gradients_quad, Number *hessians_quad, Number *scratch_data, const unsigned int subface_index)
typename FEEvaluationData< dim, Number, true >::shape_info_number_type Number2
static EvalType create_evaluator_tensor_product(const MatrixFreeFunctions::UnivariateShapeData< Number2 > &data, const unsigned int face_no)
static void interpolate_generic_raviart_thomas(const unsigned int n_components, const Number *input, Number *output, const EvaluationFlags::EvaluationFlags flag, const unsigned int face_no, const MatrixFreeFunctions::ShapeInfo< Number2 > &shape_info)
typename FEEvaluationData< dim, Number, true >::shape_info_number_type Number2
static void interpolate_generic_raviart_thomas_apply_face(const MatrixFreeFunctions::ShapeInfo< Number2 > &shape_info, const unsigned int face_no, const Number *input, Number *output)
static void interpolate_quadrature(const unsigned int n_components, const EvaluationFlags::EvaluationFlags flags, const MatrixFreeFunctions::ShapeInfo< Number2 > &shape_info, const Number *input, Number *output, const unsigned int face_no)
static void interpolate_generic(const unsigned int n_components, const Number *input, Number *output, const EvaluationFlags::EvaluationFlags flag, const unsigned int face_no, const unsigned int n_points_1d, const std::array< AlignedVector< Number2 >, 2 > &shape_data, const unsigned int dofs_per_component_on_cell, const unsigned int dofs_per_component_on_face)
static void interpolate(const unsigned int n_components, const EvaluationFlags::EvaluationFlags flags, const MatrixFreeFunctions::ShapeInfo< Number2 > &shape_info, const Number *input, Number *output, const unsigned int face_no)
unsigned int n_q_points_face
unsigned int dofs_per_component_on_cell
std::vector< UnivariateShapeData< Number > > data
unsigned int dofs_per_component_on_face
AlignedVector< Number > shape_values
std::array< AlignedVector< Number >, 2 > shape_data_on_face
AlignedVector< Number > shape_values_eo
AlignedVector< Number > shape_hessians_eo
AlignedVector< Number > shape_gradients_collocation_eo
unsigned int n_q_points_1d
AlignedVector< Number > shape_gradients_eo
AlignedVector< Number > shape_hessians
AlignedVector< Number > shape_gradients
std::array< AlignedVector< Number >, 2 > hessians_within_subface
std::array< AlignedVector< Number >, 2 > values_within_subface
AlignedVector< Number > shape_hessians_collocation_eo
std::array< AlignedVector< Number >, 2 > gradients_within_subface