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)
647 shape_values, in, out, n_dofs, n_q_points, 1, 1);
656 const auto *
const shape_gradients =
658 auto *out = fe_eval.begin_gradients();
661 for (
unsigned int c = 0; c < n_components; ++c)
668 shape_gradients, in, out, n_dofs, n_q_points * dim, 1, 1);
669 out += n_q_points * dim;
677 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
684 Number>::integrate(
const unsigned int n_components,
693 const std::size_t n_dofs =
694 fe_eval.get_shape_info().dofs_per_component_on_cell;
695 const std::size_t n_q_points = fe_eval.get_shape_info().n_q_points;
697 const auto &
shape_data = fe_eval.get_shape_info().data;
704 const auto *
const shape_values =
shape_data.front().shape_values.data();
705 auto *in = fe_eval.begin_values();
708 for (
unsigned int c = 0; c < n_components; ++c)
716 shape_values, in, out, n_dofs, n_q_points, 1, 1);
723 shape_values, in, out, n_dofs, n_q_points, 1, 1);
732 const auto *
const shape_gradients =
734 auto *in = fe_eval.begin_gradients();
737 for (
unsigned int c = 0; c < n_components; ++c)
746 shape_gradients, in, out, n_dofs, n_q_points * dim, 1, 1);
753 shape_gradients, in, out, n_dofs, n_q_points * dim, 1, 1);
755 in += n_q_points * dim;
780 "The second dimension must not be smaller than the first");
804 template <
typename Number,
typename Number2>
820 ExcMessage(
"The second dimension must not be smaller than the first"));
844 const unsigned int np_1 =
846 const unsigned int np_2 =
849 ExcMessage(
"Cannot transform with 0-point basis"));
851 ExcMessage(
"Cannot transform with 0-point basis"));
858 for (
unsigned int c = n_components; c != 0; --c)
863 for (
unsigned int q =
np_1;
q != 0; --
q)
872 (
q - 1) * Utilities::fixed_power<next_dim>(
np_1),
874 (
q - 1) * Utilities::fixed_power<next_dim>(
np_2),
925 template <
typename Number,
typename Number2>
942 ExcMessage(
"The second dimension must not be smaller than the first"));
945 "Input and output cannot alias with each other when "
946 "adding the result of the basis change to existing data"));
968 const unsigned int np_1 =
970 const unsigned int np_2 =
973 ExcMessage(
"Cannot transform with 0-point basis"));
975 ExcMessage(
"Cannot transform with 0-point basis"));
977 for (
unsigned int c = 0; c < n_components; ++c)
1032 eval_val.template hessians<dim - 1,
false,
false>(
1037 for (
unsigned int q = 0;
q <
np_1; ++
q)
1047 q * Utilities::fixed_power<next_dim>(
np_2),
1049 q * Utilities::fixed_power<next_dim>(
np_1),
1078 template <
typename Number,
typename Number2>
1084 Number *scratch_data,
1087 constexpr int next_dim = dim > 1 ? dim - 1 : dim;
1095 const unsigned int stride =
1123 for (
unsigned int c = 0; c < n_components; ++c)
1131 coefficients[i +
q * n_blocks +
1160 template <
int n_po
ints_1d,
int dim,
typename Number,
typename Number2>
1164 const Number *values,
1195 for (
unsigned int l = 0; l <
loop_bound; ++l)
1214 template <
int n_po
ints_1d,
int dim,
typename Number,
typename Number2>
1219 const Number *gradients,
1254 for (
unsigned int l = 0; l <
loop_bound; ++l)
1277 template <
int n_po
ints_1d,
int dim,
typename Number>
1289 fe_eval.get_shape_info().data[0];
1304 const Number *values = fe_eval.begin_values();
1305 Number *hessians = fe_eval.begin_hessians();
1306 Number *scratch = fe_eval.get_scratch_data().begin();
1307 const std::size_t n_points = fe_eval.get_shape_info().n_q_points;
1308 for (
unsigned int comp = 0;
comp < n_components; ++
comp)
1319 hessians + dim * n_points);
1327 hessians + 4 * n_points);
1331 hessians + 5 * n_points);
1334 hessians + 2 * n_points);
1338 hessians += (dim * (dim + 1)) / 2 * n_points;
1350 template <
int n_q_po
ints_1d,
int dim,
typename Number>
1360 fe_eval.get_shape_info().data[0];
1374 Number *values = fe_eval.begin_values();
1375 const Number *hessians = fe_eval.begin_hessians();
1376 Number *scratch = fe_eval.get_scratch_data().begin();
1377 const std::size_t n_points = fe_eval.get_shape_info().n_q_points;
1379 for (
unsigned int comp = 0;
comp < n_components; ++
comp)
1408 eval.template gradients<1,
false, (dim > 2)>(hessians +
1415 hessians += (dim * (dim + 1)) / 2 * n_points;
1427 template <
int dim,
typename Number>
1430 const Number *values_dofs,
1436 using Eval =
typename Impl::Eval;
1439 Eval
eval1 = Impl::create_evaluator_tensor_product(
1442 Eval
eval2 = Impl::create_evaluator_tensor_product(
1446 const unsigned int n_points = fe_eval.get_shape_info().n_q_points;
1447 Number *
tmp1 = fe_eval.get_scratch_data().begin();
1451 Utilities::fixed_power<dim>(
1453 Number *hessians = fe_eval.begin_hessians();
1455 for (
unsigned int comp = 0;
comp < n_components;
1457 hessians += n_points * dim * (dim + 1) / 2,
1459 fe_eval.get_shape_info().dofs_per_component_on_cell)
1472 hessians + 2 * n_points);
1486 hessians + 3 * n_points);
1490 hessians + 4 * n_points);
1498 hessians + 5 * n_points);
1502 hessians + 2 * n_points);
1508 "Only 1d, 2d and 3d implemented for Hessian"));
1521 template <
int dim,
typename Number>
1525 Number *values_dofs,
1531 using Eval =
typename Impl::Eval;
1534 Eval
eval1 = Impl::create_evaluator_tensor_product(
1537 Eval
eval2 = Impl::create_evaluator_tensor_product(
1541 const unsigned int n_points = fe_eval.get_shape_info().n_q_points;
1542 Number *
tmp1 = fe_eval.get_scratch_data().begin();
1546 Utilities::fixed_power<dim>(
1548 const Number *hessians = fe_eval.begin_hessians();
1550 for (
unsigned int comp = 0;
comp < n_components;
1552 hessians += n_points * dim * (dim + 1) / 2,
1554 fe_eval.get_shape_info().dofs_per_component_on_cell)
1618 "Only 1d, 2d and 3d implemented for Hessian"));
1636 template <
int dim,
int fe_degree,
typename Number>
1651 const Number *values_dofs,
1654 constexpr std::size_t n_points =
Utilities::pow(fe_degree + 1, dim);
1656 for (
unsigned int c = 0; c < n_components; ++c)
1659 for (
unsigned int i = 0; i < n_points; ++i)
1660 fe_eval.begin_values()[n_points * c + i] =
1661 values_dofs[n_points * c + i];
1665 fe_eval.get_shape_info().data.front(),
1666 values_dofs + c * n_points,
1667 fe_eval.begin_gradients() + c * dim * n_points);
1674 Number *values_dofs,
1678 constexpr std::size_t n_points =
Utilities::pow(fe_degree + 1, dim);
1680 for (
unsigned int c = 0; c < n_components; ++c)
1685 for (
unsigned int i = 0; i < n_points; ++i)
1686 values_dofs[n_points * c + i] +=
1687 fe_eval.begin_values()[n_points * c + i];
1689 for (
unsigned int i = 0; i < n_points; ++i)
1690 values_dofs[n_points * c + i] =
1691 fe_eval.begin_values()[n_points * c + i];
1696 fe_eval.get_shape_info().data.front(),
1697 values_dofs + c * n_points,
1698 fe_eval.begin_gradients() + c * dim * n_points,
1717 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
1723 const Number *values_dofs,
1726 const auto &
shape_data = fe_eval.get_shape_info().data.front();
1728 Assert(n_q_points_1d > fe_degree,
1729 ExcMessage(
"You lose information when going to a collocation "
1730 "space of lower degree, so the evaluation results "
1731 "would be wrong. Thus, this class does not permit "
1732 "the chosen operation."));
1733 constexpr std::size_t n_dofs =
Utilities::pow(fe_degree + 1, dim);
1734 constexpr std::size_t n_q_points =
Utilities::pow(n_q_points_1d, dim);
1736 for (
unsigned int c = 0; c < n_components; ++c)
1742 (fe_degree >= n_q_points_1d ? n_q_points_1d : fe_degree + 1),
1743 n_q_points_1d>::do_forward(1,
1745 values_dofs + c * n_dofs,
1746 fe_eval.begin_values() + c * n_q_points);
1752 fe_eval.begin_values() + c * n_q_points,
1753 fe_eval.begin_gradients() + c * dim * n_q_points);
1760 Number *values_dofs,
1764 const auto &
shape_data = fe_eval.get_shape_info().data.front();
1766 Assert(n_q_points_1d > fe_degree,
1767 ExcMessage(
"You lose information when going to a collocation "
1768 "space of lower degree, so the evaluation results "
1769 "would be wrong. Thus, this class does not permit "
1770 "the chosen operation."));
1771 constexpr std::size_t n_q_points =
Utilities::pow(n_q_points_1d, dim);
1773 for (
unsigned int c = 0; c < n_components; ++c)
1779 fe_eval.begin_values() + c * n_q_points,
1780 fe_eval.begin_gradients() + c * dim * n_q_points,
1789 (fe_degree >= n_q_points_1d ? n_q_points_1d : fe_degree + 1),
1790 n_q_points_1d>::do_backward(1,
1793 fe_eval.begin_values() + c * n_q_points,
1807 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
1817 template <
bool integrate>
1819 evaluate_or_integrate(
1828 template <
int dim,
int fe_degree,
int n_q_po
ints_1d,
typename Number>
1829 template <
bool integrate>
1838 Number *values_dofs,
1842 Assert(dim == 2 || dim == 3,
1843 ExcMessage(
"Only dim = 2,3 implemented for Raviart-Thomas "
1844 "evaluation/integration"));
1851 fe_eval.get_shape_info().data[0].n_q_points_1d);
1853 fe_eval.get_shape_info().data[1].n_q_points_1d);
1854 AssertDimension(fe_degree, fe_eval.get_shape_info().data[0].fe_degree);
1855 AssertDimension(fe_degree, fe_eval.get_shape_info().data[1].fe_degree + 1);
1857 const auto &
shape_data = fe_eval.get_shape_info().data;
1858 const unsigned int dofs_per_component =
1860 const unsigned int n_points =
Utilities::pow(n_q_points_1d, dim);
1861 Number *gradients = fe_eval.begin_gradients();
1862 Number *values = fe_eval.begin_values();
1875 if constexpr (dim > 2)
1881 gradients += n_points * dim;
1882 values_dofs += dofs_per_component;
1889 if constexpr (dim > 2)
1894 if constexpr (dim > 2)
1897 gradients += n_points * dim;
1898 values_dofs += dofs_per_component;
1916 if constexpr (dim > 2)
1924 gradients += n_points * dim;
1925 values_dofs += dofs_per_component;
1929 if constexpr (dim > 2)
1936 if constexpr (dim > 2)
1939 gradients += n_points * dim;
1940 values_dofs += dofs_per_component;
1970 template <
int dim,
typename Number,
bool do_
integrate>
1973 template <
int fe_degree,
int n_q_po
ints_1d,
typename OtherNumber>
1975 run(
const unsigned int n_components,
1983 static_assert(std::is_same_v<Number, std::remove_const_t<OtherNumber>>,
1984 "Type of Number and of OtherNumber do not match.");
1986 const auto element_type = fe_eval.get_shape_info().element_type;
1989 Assert(fe_eval.get_shape_info().data.size() == 1 ||
1990 (fe_eval.get_shape_info().data.size() == dim &&
1991 element_type == ElementType::tensor_general) ||
1992 element_type == ElementType::tensor_raviart_thomas,
2002 if constexpr (do_integrate)
2004 if (fe_eval.get_shape_info().data[0].fe_degree <
2005 fe_eval.get_shape_info().data[0].n_q_points_1d)
2021 if (fe_degree >= 0 && fe_degree + 1 == n_q_points_1d &&
2022 element_type == ElementType::tensor_symmetric_collocation)
2034 else if (fe_degree >= 0 &&
2036 element_type <= ElementType::tensor_symmetric)
2049 else if (fe_degree >= 0 &&
2050 element_type <= ElementType::tensor_symmetric_no_collocation)
2063 else if (element_type == ElementType::tensor_none)
2073 else if (element_type == ElementType::tensor_symmetric_plus_dg0)
2080 Number>>(n_components,
2086 else if (element_type == ElementType::truncated_tensor)
2099 else if (element_type == ElementType::tensor_raviart_thomas)
2101 if constexpr (fe_degree > 0 && n_q_points_1d > 0 && dim > 1)
2110 const_cast<Number *
>(values_dofs),
2118 "in 2d/3d and with templated degree"));
2139 if (fe_eval.get_shape_info().data[0].fe_degree <
2140 fe_eval.get_shape_info().data[0].n_q_points_1d)
2150 template <
typename T>
2153 const unsigned int n_components,
2155 const Number *values_dofs,
2158 std::bool_constant<false>)
2165 template <
typename T>
2168 const unsigned int n_components,
2170 Number *values_dofs,
2173 std::bool_constant<true>)
2175 T::integrate(n_components,
2182 template <
typename T,
typename OtherNumber>
2185 const unsigned int n_components,
2196 std::bool_constant<do_integrate>());
2206 template <
int dim,
typename Number>
2212 template <
int fe_degree,
int = 0>
2214 run(
const unsigned int n_components,
2219 const unsigned int given_degree =
2220 (fe_degree > -1) ? fe_degree :
2221 fe_eval.get_shape_info().data.front().fe_degree;
2223 const unsigned int dofs_per_component =
2227 Assert(fe_eval.get_shape_info().element_type <=
2239 fe_eval.get_shape_info().data.front().inverse_shape_values_eo,
2243 for (
unsigned int d = 0; d < n_components; ++d)
2245 const Number *in =
in_array + d * dofs_per_component;
2246 Number *out =
out_array + d * dofs_per_component;
2255 for (
unsigned int q = 0;
q < dofs_per_component; ++
q)
2258 for (
unsigned int d = 0; d < n_components; ++d)
2261 for (
unsigned int d = 0; d < n_components; ++d)
2263 Number *out =
out_array + d * dofs_per_component;
2282 template <
int dim,
typename Number>
2288 template <
int fe_degree,
int = 0>
2297 const unsigned int given_degree =
2298 (fe_degree > -1) ? fe_degree :
2299 fe_eval.get_shape_info().data.front().fe_degree;
2301 const unsigned int dofs_per_component =
2307 "Expected diagonal to be a multiple of scalar dof per cells"));
2323 Assert(fe_eval.get_shape_info().element_type <=
2335 fe_eval.get_shape_info().data.front().inverse_shape_values_eo,
2355 const Number *
in_ = in +
di * dofs_per_component;
2356 Number *
out_ = out +
di * dofs_per_component;
2369 for (
unsigned int q = 0;
q < dofs_per_component; ++
q)
2373 dofs_per_component);
2377 for (
unsigned int q = 0;
q < dofs_per_component; ++
q)
2386 for (
unsigned int q = 0;
q < dofs_per_component; ++
q)
2391 Number *
out_ = out +
di * dofs_per_component;
2399 in += dofs_per_component;
2400 out += dofs_per_component;
2408 template <
int n_components>
2413 const unsigned int dofs_per_component,
2419 std::array<Number, dim + 2> tmp = {};
2422 "Number of components larger than dim+2 not supported."));
2425 tmp[d] = src[d * dofs_per_component];
2434 dst[
d1 * dofs_per_component] = sum;
2447 template <
int dim,
typename Number>
2450 template <
int fe_degree,
int n_q_po
ints_1d>
2458 fe_degree > -1 && (fe_degree + 1 == n_q_points_1d);
2460 Assert(fe_eval.get_shape_info().element_type !=
2466 fe_eval.get_shape_info().data.front().inverse_shape_values_eo :
2467 fe_eval.get_shape_info().data.front().inverse_shape_values;
2469 const std::size_t dofs_per_component =
2471 fe_eval.get_shape_info().dofs_per_component_on_cell;
2474 fe_eval.get_shape_info().n_q_points;
2487 fe_eval.get_shape_info().data.front().fe_degree + 1,
2488 fe_eval.get_shape_info().data.front().n_q_points_1d);
2492 const Number *in =
in_array + d * n_q_points;
2493 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
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)
static const 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_hessians_collocation
AlignedVector< Number > shape_gradients_collocation_eo
unsigned int n_q_points_1d
AlignedVector< Number > shape_gradients_collocation