16#ifndef dealii_matrix_free_evaluation_kernels_h
17#define dealii_matrix_free_evaluation_kernels_h
36 template <MatrixFreeFunctions::ElementType element,
bool is_
long>
40 template <
bool is_
long>
58 template <
bool is_
long>
77 template <
bool is_
long>
127 evaluate(
const unsigned int n_components,
133 integrate(
const unsigned int n_components,
165 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
173 evaluate(
const unsigned int n_components,
179 integrate(
const unsigned int n_components,
195 const unsigned int n_components,
203 std::array<const MatrixFreeFunctions::UnivariateShapeData<Number2> *, 3>
206 const auto &
shape_data = fe_eval.get_shape_info().data;
211 for (
int i = 1; i < dim; ++i)
221 (Eval::n_rows_of_product > Eval::n_columns_of_product ?
222 Eval::n_rows_of_product :
223 Eval::n_columns_of_product);
224 Number *
temp1 = fe_eval.get_scratch_data().begin();
230 Utilities::fixed_power<dim>(
238 const std::size_t n_q_points =
temp_size == 0 ?
239 fe_eval.get_shape_info().n_q_points :
240 Eval::n_columns_of_product;
244 fe_eval.get_shape_info().dofs_per_component_on_cell;
249 fe_eval.get_shape_info().dofs_per_component_on_cell;
253 fe_degree != -1 ? fe_degree :
shape_data.front().fe_degree;
254 for (
unsigned int c = 0; c < n_components; ++c)
256 i < (dim > 2 ? degree + 1 : 1);
259 for (
int j = 0;
j < (dim > 1 ? degree + 1 - i : 1); ++
j)
261 for (
int k = 0;
k < degree + 1 -
j - i;
265 for (
int k = degree + 1 -
j - i;
k < degree + 1;
269 for (
int j = degree + 1 - i;
j < degree + 1; ++
j)
270 for (
int k = 0;
k < degree + 1; ++
k, ++
count_q)
276 Number *values_quad = fe_eval.begin_values();
277 Number *gradients_quad = fe_eval.begin_gradients();
282 for (
unsigned int c = 0; c < n_components; ++c)
292 values_quad += n_q_points;
293 gradients_quad += n_q_points;
298 for (
unsigned int c = 0; c < n_components; ++c)
320 values_quad += n_q_points;
321 gradients_quad += 2 * n_q_points;
326 for (
unsigned int c = 0; c < n_components; ++c)
360 values_quad += n_q_points;
361 gradients_quad += 3 * n_q_points;
374 values_quad -= n_components * n_q_points;
376 for (std::size_t c = 0; c < n_components; ++c)
377 for (std::size_t
q = 0;
q < n_q_points; ++
q)
378 values_quad[c * n_q_points +
q] +=
392 const unsigned int n_components,
398 std::array<const MatrixFreeFunctions::UnivariateShapeData<Number2> *, 3>
401 const auto &
shape_data = fe_eval.get_shape_info().data;
405 for (
int i = 1; i < dim; ++i)
415 (Eval::n_rows_of_product > Eval::n_columns_of_product ?
416 Eval::n_rows_of_product :
417 Eval::n_columns_of_product);
418 Number *
temp1 = fe_eval.get_scratch_data().begin();
424 Utilities::fixed_power<dim>(
432 const std::size_t n_q_points =
temp_size == 0 ?
433 fe_eval.get_shape_info().n_q_points :
434 Eval::n_columns_of_product;
437 Utilities::fixed_power<dim>(
shape_data.front().fe_degree + 1) :
438 fe_eval.get_shape_info().dofs_per_component_on_cell;
440 Number *values_dofs =
442 temp1 + 2 * (std::max<std::size_t>(
443 fe_eval.get_shape_info().dofs_per_component_on_cell,
447 Number *values_quad = fe_eval.begin_values();
448 Number *gradients_quad = fe_eval.begin_gradients();
453 for (
unsigned int c = 0; c < n_components; ++c)
477 values_quad += n_q_points;
478 gradients_quad += n_q_points;
483 for (
unsigned int c = 0; c < n_components; ++c)
512 values_quad += n_q_points;
513 gradients_quad += 2 * n_q_points;
518 for (
unsigned int c = 0; c < n_components; ++c)
553 values_quad += n_q_points;
554 gradients_quad += 3 * n_q_points;
566 values_quad -= n_components * n_q_points;
568 for (
unsigned int c = 0; c < n_components; ++c)
570 values_dofs[0] = values_quad[0];
571 for (
unsigned int q = 1;
q < n_q_points; ++
q)
572 values_dofs[0] += values_quad[
q];
574 values_quad += n_q_points;
578 for (
unsigned int c = 0; c < n_components; ++c)
587 fe_eval.get_shape_info().dofs_per_component_on_cell;
590 fe_degree != -1 ? fe_degree :
shape_data.front().fe_degree;
591 for (
unsigned int c = 0; c < n_components; ++c)
593 i < (dim > 2 ? degree + 1 : 1);
596 for (
int j = 0;
j < (dim > 1 ? degree + 1 - i : 1); ++
j)
598 for (
int k = 0;
k < degree + 1 -
j - i;
611 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
618 Number>::evaluate(
const unsigned int n_components,
625 const std::size_t n_dofs =
626 fe_eval.get_shape_info().dofs_per_component_on_cell;
627 const std::size_t n_q_points = fe_eval.get_shape_info().n_q_points;
629 const auto &
shape_data = fe_eval.get_shape_info().data;
636 const auto *
const shape_values =
shape_data.front().shape_values.data();
637 auto *out = fe_eval.begin_values();
640 for (
unsigned int c = 0; c < n_components; c += 3)
642 if (c + 1 == n_components)
651 shape_values, in, out, n_dofs, n_q_points, 1, 1);
652 else if (c + 2 == n_components)
661 shape_values, in, out, n_dofs, n_q_points, 1, 1);
671 shape_values, in, out, n_dofs, n_q_points, 1, 1);
673 out += 3 * n_q_points;
680 const auto *
const shape_gradients =
682 auto *out = fe_eval.begin_gradients();
685 for (
unsigned int c = 0; c < n_components; c += 3)
687 if (c + 1 == n_components)
696 shape_gradients, in, out, n_dofs, n_q_points * dim, 1, 1);
697 else if (c + 2 == n_components)
706 shape_gradients, in, out, n_dofs, n_q_points * dim, 1, 1);
716 shape_gradients, in, out, n_dofs, n_q_points * dim, 1, 1);
718 out += 3 * n_q_points * dim;
726 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
733 Number>::integrate(
const unsigned int n_components,
742 const std::size_t n_dofs =
743 fe_eval.get_shape_info().dofs_per_component_on_cell;
744 const std::size_t n_q_points = fe_eval.get_shape_info().n_q_points;
746 const auto &
shape_data = fe_eval.get_shape_info().data;
753 const auto *
const shape_values =
shape_data.front().shape_values.data();
754 auto *in = fe_eval.begin_values();
757 for (
unsigned int c = 0; c < n_components; c += 3)
761 if (c + 1 == n_components)
770 shape_values, in, out, n_dofs, n_q_points, 1, 1);
771 else if (c + 2 == n_components)
780 shape_values, in, out, n_dofs, n_q_points, 1, 1);
790 shape_values, in, out, n_dofs, n_q_points, 1, 1);
794 if (c + 1 == n_components)
803 shape_values, in, out, n_dofs, n_q_points, 1, 1);
804 else if (c + 2 == n_components)
813 shape_values, in, out, n_dofs, n_q_points, 1, 1);
823 shape_values, in, out, n_dofs, n_q_points, 1, 1);
826 in += 3 * n_q_points;
832 const auto *
const shape_gradients =
834 auto *in = fe_eval.begin_gradients();
837 for (
unsigned int c = 0; c < n_components; c += 3)
842 if (c + 1 == n_components)
851 shape_gradients, in, out, n_dofs, n_q_points * dim, 1, 1);
852 else if (c + 2 == n_components)
861 shape_gradients, in, out, n_dofs, n_q_points * dim, 1, 1);
871 shape_gradients, in, out, n_dofs, n_q_points * dim, 1, 1);
875 if (c + 1 == n_components)
884 shape_gradients, in, out, n_dofs, n_q_points * dim, 1, 1);
885 else if (c + 2 == n_components)
894 shape_gradients, in, out, n_dofs, n_q_points * dim, 1, 1);
904 shape_gradients, in, out, n_dofs, n_q_points * dim, 1, 1);
907 in += 3 * n_q_points * dim;
931 "The second dimension must not be smaller than the first");
955 template <
typename Number,
typename Number2>
971 ExcMessage(
"The second dimension must not be smaller than the first"));
995 const unsigned int np_1 =
997 const unsigned int np_2 =
1000 ExcMessage(
"Cannot transform with 0-point basis"));
1002 ExcMessage(
"Cannot transform with 0-point basis"));
1009 for (
unsigned int c = n_components; c != 0; --c)
1014 for (
unsigned int q =
np_1;
q != 0; --
q)
1023 (
q - 1) * Utilities::fixed_power<next_dim>(
np_1),
1025 (
q - 1) * Utilities::fixed_power<next_dim>(
np_2),
1076 template <
typename Number,
typename Number2>
1093 ExcMessage(
"The second dimension must not be smaller than the first"));
1096 "Input and output cannot alias with each other when "
1097 "adding the result of the basis change to existing data"));
1119 const unsigned int np_1 =
1121 const unsigned int np_2 =
1124 ExcMessage(
"Cannot transform with 0-point basis"));
1126 ExcMessage(
"Cannot transform with 0-point basis"));
1128 for (
unsigned int c = 0; c < n_components; ++c)
1183 eval_val.template hessians<dim - 1,
false,
false>(
1188 for (
unsigned int q = 0;
q <
np_1; ++
q)
1198 q * Utilities::fixed_power<next_dim>(
np_2),
1200 q * Utilities::fixed_power<next_dim>(
np_1),
1229 template <
typename Number,
typename Number2>
1235 Number *scratch_data,
1238 constexpr int next_dim = dim > 1 ? dim - 1 : dim;
1246 const unsigned int stride =
1274 for (
unsigned int c = 0; c < n_components; ++c)
1282 coefficients[i +
q * n_blocks +
1311 template <
int n_po
ints_1d,
int dim,
typename Number,
typename Number2>
1315 const Number *values,
1346 for (
unsigned int l = 0; l <
loop_bound; ++l)
1365 template <
int n_po
ints_1d,
int dim,
typename Number,
typename Number2>
1370 const Number *gradients,
1405 for (
unsigned int l = 0; l <
loop_bound; ++l)
1428 template <
int n_po
ints_1d,
int dim,
typename Number>
1440 fe_eval.get_shape_info().data[0];
1442 data.n_q_points_1d *
data.n_q_points_1d);
1450 data.shape_gradients_collocation.data(),
1451 data.shape_hessians_collocation.data(),
1453 data.n_q_points_1d);
1455 const Number *values = fe_eval.begin_values();
1456 Number *hessians = fe_eval.begin_hessians();
1457 Number *scratch = fe_eval.get_scratch_data().begin();
1458 const std::size_t n_points = fe_eval.get_shape_info().n_q_points;
1459 for (
unsigned int comp = 0;
comp < n_components; ++
comp)
1470 hessians + dim * n_points);
1478 hessians + 4 * n_points);
1482 hessians + 5 * n_points);
1485 hessians + 2 * n_points);
1489 hessians += (dim * (dim + 1)) / 2 * n_points;
1501 template <
int n_q_po
ints_1d,
int dim,
typename Number>
1511 fe_eval.get_shape_info().data[0];
1513 data.n_q_points_1d *
data.n_q_points_1d);
1521 data.shape_gradients_collocation.data(),
1522 data.shape_hessians_collocation.data(),
1524 data.n_q_points_1d);
1525 Number *values = fe_eval.begin_values();
1526 const Number *hessians = fe_eval.begin_hessians();
1527 Number *scratch = fe_eval.get_scratch_data().begin();
1528 const std::size_t n_points = fe_eval.get_shape_info().n_q_points;
1530 for (
unsigned int comp = 0;
comp < n_components; ++
comp)
1559 eval.template gradients<1,
false, (dim > 2)>(hessians +
1566 hessians += (dim * (dim + 1)) / 2 * n_points;
1578 template <
int dim,
typename Number>
1581 const Number *values_dofs,
1587 using Eval =
typename Impl::Eval;
1590 Eval
eval1 = Impl::create_evaluator_tensor_product(
1593 Eval
eval2 = Impl::create_evaluator_tensor_product(
1597 const unsigned int n_points = fe_eval.get_shape_info().n_q_points;
1598 Number *
tmp1 = fe_eval.get_scratch_data().begin();
1602 Utilities::fixed_power<dim>(
1604 Number *hessians = fe_eval.begin_hessians();
1606 for (
unsigned int comp = 0;
comp < n_components;
1608 hessians += n_points * dim * (dim + 1) / 2,
1610 fe_eval.get_shape_info().dofs_per_component_on_cell)
1623 hessians + 2 * n_points);
1637 hessians + 3 * n_points);
1641 hessians + 4 * n_points);
1649 hessians + 5 * n_points);
1653 hessians + 2 * n_points);
1659 "Only 1d, 2d and 3d implemented for Hessian"));
1672 template <
int dim,
typename Number>
1676 Number *values_dofs,
1682 using Eval =
typename Impl::Eval;
1685 Eval
eval1 = Impl::create_evaluator_tensor_product(
1688 Eval
eval2 = Impl::create_evaluator_tensor_product(
1692 const unsigned int n_points = fe_eval.get_shape_info().n_q_points;
1693 Number *
tmp1 = fe_eval.get_scratch_data().begin();
1697 Utilities::fixed_power<dim>(
1699 const Number *hessians = fe_eval.begin_hessians();
1701 for (
unsigned int comp = 0;
comp < n_components;
1703 hessians += n_points * dim * (dim + 1) / 2,
1705 fe_eval.get_shape_info().dofs_per_component_on_cell)
1769 "Only 1d, 2d and 3d implemented for Hessian"));
1787 template <
int dim,
int fe_degree,
typename Number>
1802 const Number *values_dofs,
1805 constexpr std::size_t n_points =
Utilities::pow(fe_degree + 1, dim);
1807 for (
unsigned int c = 0; c < n_components; ++c)
1810 for (
unsigned int i = 0; i < n_points; ++i)
1811 fe_eval.begin_values()[n_points * c + i] =
1812 values_dofs[n_points * c + i];
1816 fe_eval.get_shape_info().data.front(),
1817 values_dofs + c * n_points,
1818 fe_eval.begin_gradients() + c * dim * n_points);
1825 Number *values_dofs,
1829 constexpr std::size_t n_points =
Utilities::pow(fe_degree + 1, dim);
1831 for (
unsigned int c = 0; c < n_components; ++c)
1836 for (
unsigned int i = 0; i < n_points; ++i)
1837 values_dofs[n_points * c + i] +=
1838 fe_eval.begin_values()[n_points * c + i];
1840 for (
unsigned int i = 0; i < n_points; ++i)
1841 values_dofs[n_points * c + i] =
1842 fe_eval.begin_values()[n_points * c + i];
1847 fe_eval.get_shape_info().data.front(),
1848 values_dofs + c * n_points,
1849 fe_eval.begin_gradients() + c * dim * n_points,
1868 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
1874 const Number *values_dofs,
1877 const auto &
shape_data = fe_eval.get_shape_info().data.front();
1879 Assert(n_q_points_1d > fe_degree,
1880 ExcMessage(
"You lose information when going to a collocation "
1881 "space of lower degree, so the evaluation results "
1882 "would be wrong. Thus, this class does not permit "
1883 "the chosen operation."));
1884 constexpr std::size_t n_dofs =
Utilities::pow(fe_degree + 1, dim);
1885 constexpr std::size_t n_q_points =
Utilities::pow(n_q_points_1d, dim);
1887 for (
unsigned int c = 0; c < n_components; ++c)
1893 (fe_degree >= n_q_points_1d ? n_q_points_1d : fe_degree + 1),
1894 n_q_points_1d>::do_forward(1,
1896 values_dofs + c * n_dofs,
1897 fe_eval.begin_values() + c * n_q_points);
1903 fe_eval.begin_values() + c * n_q_points,
1904 fe_eval.begin_gradients() + c * dim * n_q_points);
1911 Number *values_dofs,
1915 const auto &
shape_data = fe_eval.get_shape_info().data.front();
1917 Assert(n_q_points_1d > fe_degree,
1918 ExcMessage(
"You lose information when going to a collocation "
1919 "space of lower degree, so the evaluation results "
1920 "would be wrong. Thus, this class does not permit "
1921 "the chosen operation."));
1922 constexpr std::size_t n_q_points =
Utilities::pow(n_q_points_1d, dim);
1924 for (
unsigned int c = 0; c < n_components; ++c)
1930 fe_eval.begin_values() + c * n_q_points,
1931 fe_eval.begin_gradients() + c * dim * n_q_points,
1940 (fe_degree >= n_q_points_1d ? n_q_points_1d : fe_degree + 1),
1941 n_q_points_1d>::do_backward(1,
1944 fe_eval.begin_values() + c * n_q_points,
1958 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
1968 template <
bool integrate>
1970 evaluate_or_integrate(
1979 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
1980 template <
bool integrate>
1989 Number *values_dofs,
1993 Assert(dim == 2 || dim == 3,
1994 ExcMessage(
"Only dim = 2,3 implemented for Raviart-Thomas "
1995 "evaluation/integration"));
2002 fe_eval.get_shape_info().data[0].n_q_points_1d);
2004 fe_eval.get_shape_info().data[1].n_q_points_1d);
2005 AssertDimension(fe_degree, fe_eval.get_shape_info().data[0].fe_degree);
2006 AssertDimension(fe_degree, fe_eval.get_shape_info().data[1].fe_degree + 1);
2008 const auto &
shape_data = fe_eval.get_shape_info().data;
2009 const unsigned int dofs_per_component =
2011 const unsigned int n_points =
Utilities::pow(n_q_points_1d, dim);
2012 Number *gradients = fe_eval.begin_gradients();
2013 Number *values = fe_eval.begin_values();
2026 if constexpr (dim > 2)
2032 gradients += n_points * dim;
2033 values_dofs += dofs_per_component;
2040 if constexpr (dim > 2)
2045 if constexpr (dim > 2)
2048 gradients += n_points * dim;
2049 values_dofs += dofs_per_component;
2067 if constexpr (dim > 2)
2075 gradients += n_points * dim;
2076 values_dofs += dofs_per_component;
2080 if constexpr (dim > 2)
2087 if constexpr (dim > 2)
2090 gradients += n_points * dim;
2091 values_dofs += dofs_per_component;
2121 template <
int dim,
typename Number,
bool do_
integrate>
2124 template <
int fe_degree,
int n_q_po
ints_1d,
typename OtherNumber>
2126 run(
const unsigned int n_components,
2134 static_assert(std::is_same_v<Number, std::remove_const_t<OtherNumber>>,
2135 "Type of Number and of OtherNumber do not match.");
2137 const auto element_type = fe_eval.get_shape_info().element_type;
2140 Assert(fe_eval.get_shape_info().data.size() == 1 ||
2141 (fe_eval.get_shape_info().data.size() == dim &&
2142 element_type == ElementType::tensor_general) ||
2143 element_type == ElementType::tensor_raviart_thomas,
2153 if constexpr (do_integrate)
2155 if (fe_eval.get_shape_info().data[0].fe_degree <
2156 fe_eval.get_shape_info().data[0].n_q_points_1d)
2172 if (fe_degree >= 0 && fe_degree + 1 == n_q_points_1d &&
2173 element_type == ElementType::tensor_symmetric_collocation)
2185 else if (fe_degree >= 0 &&
2187 element_type <= ElementType::tensor_symmetric)
2200 else if (fe_degree >= 0 &&
2201 element_type <= ElementType::tensor_symmetric_no_collocation)
2214 else if (element_type == ElementType::tensor_none)
2224 else if (element_type == ElementType::tensor_symmetric_plus_dg0)
2231 Number>>(n_components,
2237 else if (element_type == ElementType::truncated_tensor)
2250 else if (element_type == ElementType::tensor_raviart_thomas)
2252 if constexpr (fe_degree > 0 && n_q_points_1d > 0 && dim > 1)
2261 const_cast<Number *
>(values_dofs),
2269 "in 2d/3d and with templated degree"));
2290 if (fe_eval.get_shape_info().data[0].fe_degree <
2291 fe_eval.get_shape_info().data[0].n_q_points_1d)
2301 template <
typename T>
2304 const unsigned int n_components,
2306 const Number *values_dofs,
2309 std::bool_constant<false>)
2316 template <
typename T>
2319 const unsigned int n_components,
2321 Number *values_dofs,
2324 std::bool_constant<true>)
2326 T::integrate(n_components,
2333 template <
typename T,
typename OtherNumber>
2336 const unsigned int n_components,
2347 std::bool_constant<do_integrate>());
2357 template <
int dim,
typename Number>
2363 template <
int fe_degree,
int = 0>
2365 run(
const unsigned int n_components,
2370 const unsigned int given_degree =
2371 (fe_degree > -1) ? fe_degree :
2372 fe_eval.get_shape_info().data.front().fe_degree;
2374 const unsigned int dofs_per_component =
2378 Assert(fe_eval.get_shape_info().element_type <=
2390 fe_eval.get_shape_info().
data.front().inverse_shape_values_eo,
2394 for (
unsigned int d = 0; d < n_components; ++d)
2396 const Number *in =
in_array + d * dofs_per_component;
2397 Number *out =
out_array + d * dofs_per_component;
2406 for (
unsigned int q = 0;
q < dofs_per_component; ++
q)
2409 for (
unsigned int d = 0; d < n_components; ++d)
2412 for (
unsigned int d = 0; d < n_components; ++d)
2414 Number *out =
out_array + d * dofs_per_component;
2433 template <
int dim,
typename Number>
2439 template <
int fe_degree,
int = 0>
2448 const unsigned int given_degree =
2449 (fe_degree > -1) ? fe_degree :
2450 fe_eval.get_shape_info().data.front().fe_degree;
2452 const unsigned int dofs_per_component =
2458 "Expected diagonal to be a multiple of scalar dof per cells"));
2474 Assert(fe_eval.get_shape_info().element_type <=
2486 fe_eval.get_shape_info().
data.front().inverse_shape_values_eo,
2506 const Number *
in_ = in +
di * dofs_per_component;
2507 Number *
out_ = out +
di * dofs_per_component;
2520 for (
unsigned int q = 0;
q < dofs_per_component; ++
q)
2524 dofs_per_component);
2528 for (
unsigned int q = 0;
q < dofs_per_component; ++
q)
2537 for (
unsigned int q = 0;
q < dofs_per_component; ++
q)
2542 Number *
out_ = out +
di * dofs_per_component;
2550 in += dofs_per_component;
2551 out += dofs_per_component;
2559 template <
int n_components>
2564 const unsigned int dofs_per_component,
2570 std::array<Number, dim + 2> tmp = {};
2573 "Number of components larger than dim+2 not supported."));
2576 tmp[d] = src[d * dofs_per_component];
2585 dst[
d1 * dofs_per_component] = sum;
2598 template <
int dim,
typename Number>
2601 template <
int fe_degree,
int n_q_po
ints_1d>
2609 fe_degree > -1 && (fe_degree + 1 == n_q_points_1d);
2611 Assert(fe_eval.get_shape_info().element_type !=
2617 fe_eval.get_shape_info().data.front().inverse_shape_values_eo :
2618 fe_eval.get_shape_info().data.front().inverse_shape_values;
2620 const std::size_t dofs_per_component =
2622 fe_eval.get_shape_info().dofs_per_component_on_cell;
2625 fe_eval.get_shape_info().n_q_points;
2638 fe_eval.get_shape_info().
data.front().fe_degree + 1,
2639 fe_eval.get_shape_info().data.front().n_q_points_1d);
2643 const Number *in =
in_array + d * n_q_points;
2644 Number *out =
out_array + d * dofs_per_component;
ScalarNumber shape_info_number_type
#define DEAL_II_ALWAYS_INLINE
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#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)
@ tensor_symmetric_no_collocation
@ tensor_symmetric_plus_dg0
std::vector< index_type > data
EvaluationFlags
The EvaluationFlags enum.
constexpr T pow(const T base, const int iexp)
void evaluate_hessians_collocation(const unsigned int n_components, FEEvaluationData< dim, Number, false > &fe_eval)
constexpr bool use_collocation_evaluation(const unsigned int fe_degree, const unsigned int n_q_points_1d)
void integrate_gradients_collocation(const MatrixFreeFunctions::UnivariateShapeData< Number2 > &shape, Number *values, const Number *gradients, const bool add_into_values_array)
void evaluate_hessians_slow(const unsigned int n_components, const Number *values_dofs, FEEvaluationData< dim, Number, false > &fe_eval)
std::enable_if_t<(variant==evaluate_general), void > apply_matrix_vector_product(const Number2 *matrix, const Number *in, Number *out)
void integrate_hessians_collocation(const unsigned int n_components, FEEvaluationData< dim, Number, false > &fe_eval, const bool add_into_values_array)
void evaluate_gradients_collocation(const MatrixFreeFunctions::UnivariateShapeData< Number2 > &shape, const Number *values, Number *gradients)
void integrate_hessians_slow(const unsigned int n_components, const FEEvaluationData< dim, Number, false > &fe_eval, Number *values_dofs, const bool add_into_values_array)
constexpr unsigned int invalid_unsigned_int
::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_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 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_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 evaluate(const unsigned int n_components, const EvaluationFlags::EvaluationFlags evaluation_flag, const Number *values_dofs, FEEvaluationData< dim, Number, false > &fe_eval)
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)
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 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::bool_constant< true >)
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_in=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::bool_constant< false >)
typename FEEvaluationData< dim, Number, false >::shape_info_number_type Number2
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)
AlignedVector< Number > shape_gradients_collocation_eo