16 #ifndef dealii_fe_point_evaluation_h
17 #define dealii_fe_point_evaluation_h
48 <<
"You are requesting information from an FEPointEvaluation "
49 <<
"object for which this kind of information has not been computed. "
50 <<
"What information these objects compute is determined by the update_* "
51 <<
"flags you pass to MappingInfo() in the Constructor. Here, "
52 <<
"the operation you are attempting requires the <" << arg1
53 <<
"> flag to be set, but it was apparently not specified "
54 <<
"upon initialization.");
60 template <
int dim,
int n_components,
typename Number>
66 typename ::internal::VectorizedArrayTrait<
82 const unsigned int component,
86 result[component] = vector_entry;
94 return result[component].
sum();
99 const unsigned int vector_lane,
102 for (
unsigned int i = 0; i < n_components; ++i)
103 for (
unsigned int d = 0;
d < dim; ++
d)
106 value[
d][i], vector_lane);
111 const unsigned int vector_lane,
114 for (
unsigned int i = 0; i < n_components; ++i)
115 for (
unsigned int d = 0;
d < dim; ++
d)
117 value[
d][i], vector_lane) = result[i][
d];
123 for (
unsigned int i = 0; i < n_components; ++i)
124 for (
unsigned int d = 0;
d < dim; ++
d)
131 const unsigned int vector_lane,
134 for (
unsigned int i = 0; i < n_components; ++i)
135 result[i] =
value[i][vector_lane];
148 const unsigned int vector_lane,
151 for (
unsigned int i = 0; i < n_components; ++i)
152 value[i][vector_lane] = result[i];
166 for (
unsigned int i = 0; i < n_components; ++i)
173 const unsigned int vector_lane,
174 const unsigned int component,
178 vector_lane) += shape_value;
183 const unsigned int vector_lane,
184 const unsigned int component)
192 const unsigned int vector_lane,
193 const unsigned int component,
196 for (
unsigned int d = 0;
d < dim; ++
d)
204 const unsigned int vector_lane,
205 const unsigned int component)
208 for (
unsigned int d = 0;
d < dim; ++
d)
216 template <
int dim,
typename Number>
222 typename ::internal::VectorizedArrayTrait<
237 result = vector_entry;
248 const unsigned int vector_lane,
251 for (
unsigned int d = 0;
d < dim; ++
d)
252 result[
d] =
value[
d][vector_lane];
265 const unsigned int vector_lane,
268 for (
unsigned int d = 0;
d < dim; ++
d)
269 value[
d][vector_lane] = result[
d];
283 for (
unsigned int d = 0;
d < dim; ++
d)
290 const unsigned int vector_lane,
293 result =
value[vector_lane];
306 const unsigned int vector_lane,
309 value[vector_lane] = result;
328 const unsigned int vector_lane,
338 const unsigned int vector_lane,
346 const unsigned int vector_lane,
350 for (
unsigned int d = 0;
d < dim; ++
d)
357 const unsigned int vector_lane,
361 for (
unsigned int d = 0;
d < dim; ++
d)
368 template <
int dim,
typename Number>
374 typename ::internal::VectorizedArrayTrait<
387 const unsigned int component,
391 result[component] = vector_entry;
399 return result[component].
sum();
404 const unsigned int vector_lane,
407 for (
unsigned int i = 0; i < dim; ++i)
408 for (
unsigned int d = 0;
d < dim; ++
d)
411 value[
d][i], vector_lane);
416 const unsigned int vector_lane,
419 for (
unsigned int i = 0; i < dim; ++i)
420 for (
unsigned int d = 0;
d < dim; ++
d)
422 value[
d][i], vector_lane) = result[i][
d];
428 for (
unsigned int i = 0; i < dim; ++i)
429 for (
unsigned int d = 0;
d < dim; ++
d)
436 const unsigned int vector_lane,
439 for (
unsigned int i = 0; i < dim; ++i)
440 result[i] =
value[i][vector_lane];
453 const unsigned int vector_lane,
456 for (
unsigned int i = 0; i < dim; ++i)
457 value[i][vector_lane] = result[i];
471 for (
unsigned int i = 0; i < dim; ++i)
478 const unsigned int vector_lane,
479 const unsigned int component,
483 vector_lane) += shape_value;
488 const unsigned int vector_lane,
489 const unsigned int component)
497 const unsigned int vector_lane,
498 const unsigned int component,
501 for (
unsigned int d = 0;
d < dim; ++
d)
509 const unsigned int vector_lane,
510 const unsigned int component)
513 for (
unsigned int d = 0;
d < dim; ++
d)
521 template <
typename Number>
527 typename ::internal::VectorizedArrayTrait<
542 result = vector_entry;
553 const unsigned int vector_lane,
556 result[0] =
value[0][vector_lane];
569 const unsigned int vector_lane,
572 value[0][vector_lane] = result[0];
591 const unsigned int vector_lane,
594 result =
value[vector_lane];
607 const unsigned int vector_lane,
610 value[vector_lane] = result;
629 const unsigned int vector_lane,
639 const unsigned int vector_lane,
647 const unsigned int vector_lane,
657 const unsigned int vector_lane,
667 template <
int dim,
int spacedim>
670 const unsigned int base_element_number);
672 template <
int dim,
int spacedim>
676 template <
int dim,
int spacedim>
677 std::vector<Polynomials::Polynomial<double>>
714 template <
int n_components_,
717 typename Number =
double>
730 using ETT =
typename internal::FEPointEvaluation::
731 EvaluatorTypeTraits<dim, n_components, Number>;
737 typename ETT::interface_vectorized_gradient_type;
760 const unsigned int first_selected_component = 0);
781 const unsigned int first_selected_component = 0);
845 template <std::
size_t str
ide_view>
867 solution_values.
size()),
889 template <std::
size_t str
ide_view>
918 solution_values.
size()),
944 template <std::
size_t str
ide_view>
977 solution_values.
size()),
989 get_value(
const unsigned int point_index)
const;
1031 jacobian(
const unsigned int point_index)
const;
1048 JxW(
const unsigned int point_index)
const;
1063 real_point(
const unsigned int point_index)
const;
1070 unit_point(
const unsigned int point_index)
const;
1097 setup(
const unsigned int first_selected_component);
1104 template <
bool is_face,
bool is_linear>
1112 template <
bool is_face_path,
bool is_linear, std::
size_t str
ide_view>
1122 template <
bool is_face_path,
bool is_linear, std::
size_t str
ide_view>
1127 const unsigned int n_shapes,
1128 const unsigned int qb,
1135 template <
bool is_face_path,
bool is_linear, std::
size_t str
ide_view>
1144 template <std::
size_t str
ide_view>
1155 template <
bool is_face_path,
bool is_linear>
1159 const unsigned int n_shapes,
1160 const unsigned int qb,
1170 template <
bool is_face_path,
bool is_linear, std::
size_t str
ide_view>
1180 template <
bool do_JxW,
1183 std::size_t stride_view>
1192 template <
bool do_JxW, std::
size_t str
ide_view>
1201 template <
bool do_JxW, std::
size_t str
ide_view>
1236 std::vector<Polynomials::Polynomial<double>>
poly;
1378 std::unique_ptr<NonMatching::MappingInfo<dim, spacedim, Number>>
1429 template <
int n_components_,
int dim,
int spacedim,
typename Number>
1434 const unsigned int first_selected_component)
1441 , use_face_path(false)
1442 , update_flags(update_flags)
1443 , mapping_info_on_the_fly(
1444 std::make_unique<
NonMatching::MappingInfo<dim, spacedim, Number>>(
1447 , mapping_info(mapping_info_on_the_fly.get())
1450 , is_reinitialized(false)
1452 setup(first_selected_component);
1457 template <
int n_components_,
int dim,
int spacedim,
typename Number>
1461 const unsigned int first_selected_component)
1465 , mapping(&mapping_info.get_mapping())
1468 , use_face_path(false)
1469 , update_flags(mapping_info.get_update_flags())
1470 , mapping_info(&mapping_info)
1473 , is_reinitialized(false)
1475 setup(first_selected_component);
1482 template <
int n_components_,
int dim,
int spacedim,
typename Number>
1485 : n_q_batches(other.n_q_batches)
1486 , n_q_points(other.n_q_points)
1487 , n_q_points_scalar(other.n_q_points_scalar)
1488 , mapping(other.mapping)
1491 , use_linear_path(other.use_linear_path)
1492 , renumber(other.renumber)
1493 , solution_renumbered(other.solution_renumbered)
1494 , solution_renumbered_vectorized(other.solution_renumbered_vectorized)
1497 , dofs_per_component(other.dofs_per_component)
1498 , dofs_per_component_face(other.dofs_per_component_face)
1499 , use_face_path(
false)
1500 , component_in_base_element(other.component_in_base_element)
1501 , nonzero_shape_function_component(other.nonzero_shape_function_component)
1502 , update_flags(other.update_flags)
1503 , fe_values(other.fe_values)
1504 , mapping_info_on_the_fly(
1505 other.mapping_info_on_the_fly ?
1510 , mapping_info(other.mapping_info)
1511 , current_cell_index(other.current_cell_index)
1512 , current_face_number(other.current_face_number)
1513 , fast_path(other.fast_path)
1514 , is_reinitialized(
false)
1515 , shapes(other.shapes)
1516 , shapes_faces(other.shapes_faces)
1518 connection_is_reinitialized = mapping_info->connect_is_reinitialized(
1519 [
this]() { this->is_reinitialized =
false; });
1524 template <
int n_components_,
int dim,
int spacedim,
typename Number>
1527 : n_q_batches(other.n_q_batches)
1528 , n_q_points(other.n_q_points)
1529 , n_q_points_scalar(other.n_q_points_scalar)
1530 , mapping(other.mapping)
1533 , use_linear_path(other.use_linear_path)
1534 , renumber(other.renumber)
1535 , solution_renumbered(other.solution_renumbered)
1536 , solution_renumbered_vectorized(other.solution_renumbered_vectorized)
1539 , dofs_per_component(other.dofs_per_component)
1540 , dofs_per_component_face(other.dofs_per_component_face)
1541 , use_face_path(
false)
1542 , component_in_base_element(other.component_in_base_element)
1543 , nonzero_shape_function_component(other.nonzero_shape_function_component)
1544 , update_flags(other.update_flags)
1545 , fe_values(other.fe_values)
1546 , mapping_info_on_the_fly(std::move(other.mapping_info_on_the_fly))
1547 , mapping_info(other.mapping_info)
1548 , current_cell_index(other.current_cell_index)
1549 , current_face_number(other.current_face_number)
1550 , fast_path(other.fast_path)
1551 , is_reinitialized(
false)
1552 , shapes(other.shapes)
1553 , shapes_faces(other.shapes_faces)
1555 connection_is_reinitialized = mapping_info->connect_is_reinitialized(
1556 [
this]() { this->is_reinitialized =
false; });
1561 template <
int n_components_,
int dim,
int spacedim,
typename Number>
1564 connection_is_reinitialized.disconnect();
1569 template <
int n_components_,
int dim,
int spacedim,
typename Number>
1572 const unsigned int first_selected_component)
1575 fe->n_components() + 1);
1577 shapes.reserve(100);
1579 bool same_base_element =
true;
1580 unsigned int base_element_number = 0;
1581 component_in_base_element = 0;
1582 unsigned int component = 0;
1583 for (; base_element_number < fe->n_base_elements(); ++base_element_number)
1584 if (component + fe->element_multiplicity(base_element_number) >
1585 first_selected_component)
1587 if (first_selected_component + n_components >
1588 component + fe->element_multiplicity(base_element_number))
1589 same_base_element =
false;
1590 component_in_base_element = first_selected_component - component;
1594 component += fe->element_multiplicity(base_element_number);
1598 *fe, base_element_number) &&
1601 shape_info.reinit(
QMidpoint<1>(), *fe, base_element_number);
1602 renumber = shape_info.lexicographic_numbering;
1603 dofs_per_component = shape_info.dofs_per_component_on_cell;
1604 dofs_per_component_face = shape_info.dofs_per_component_on_face;
1606 fe->base_element(base_element_number));
1608 bool is_lexicographic =
true;
1609 for (
unsigned int i = 0; i < renumber.size(); ++i)
1610 if (i != renumber[i])
1611 is_lexicographic =
false;
1613 if (is_lexicographic)
1616 use_linear_path = (poly.size() == 2 && poly[0].value(0.) == 1. &&
1617 poly[0].value(1.) == 0. && poly[1].value(0.) == 0. &&
1618 poly[1].value(1.) == 1.) &&
1619 (fe->n_components() == n_components);
1621 const unsigned int size_face = 2 * dofs_per_component_face;
1622 const unsigned int size_cell = dofs_per_component;
1623 scratch_data_scalar.resize(size_face + size_cell);
1625 solution_renumbered.resize(dofs_per_component);
1626 solution_renumbered_vectorized.resize(dofs_per_component);
1632 nonzero_shape_function_component.resize(fe->n_dofs_per_cell());
1633 for (
unsigned int d = 0;
d < n_components; ++
d)
1635 const unsigned int component = first_selected_component +
d;
1636 for (
unsigned int i = 0; i < fe->n_dofs_per_cell(); ++i)
1638 const bool is_primitive =
1639 fe->is_primitive() || fe->is_primitive(i);
1641 nonzero_shape_function_component[i][
d] =
1642 (component == fe->system_to_component_index(i).first);
1644 nonzero_shape_function_component[i][
d] =
1645 (fe->get_nonzero_components(i)[component] ==
true);
1655 template <
int n_components_,
int dim,
int spacedim,
typename Number>
1664 mapping_info->reinit(cell, unit_points);
1668 fe_values = std::make_shared<FEValues<dim, spacedim>>(
1672 std::vector<
Point<dim>>(unit_points.begin(), unit_points.end())),
1674 fe_values->reinit(cell);
1677 if (use_linear_path)
1678 do_reinit<false, true>();
1680 do_reinit<false, false>();
1685 template <
int n_components_,
int dim,
int spacedim,
typename Number>
1692 if (use_linear_path)
1693 do_reinit<false, true>();
1695 do_reinit<false, false>();
1700 template <
int n_components_,
int dim,
int spacedim,
typename Number>
1708 if (use_linear_path)
1709 do_reinit<false, true>();
1711 do_reinit<false, false>();
1715 std::vector<Point<dim>> unit_points(n_q_points_scalar);
1717 for (
unsigned int v = 0; v < n_q_points_scalar; ++v)
1718 for (
unsigned int d = 0;
d < dim; ++
d)
1720 unit_point_ptr[v / n_lanes_internal][
d][v % n_lanes_internal];
1722 fe_values = std::make_shared<FEValues<dim, spacedim>>(
1726 std::vector<
Point<dim>>(unit_points.begin(), unit_points.end())),
1729 fe_values->reinit(mapping_info->get_cell_iterator(current_cell_index));
1735 template <
int n_components_,
int dim,
int spacedim,
typename Number>
1739 const unsigned int face_number)
1742 current_face_number = face_number;
1744 if (use_linear_path)
1745 do_reinit<true, true>();
1747 do_reinit<true, false>();
1752 template <
int n_components_,
int dim,
int spacedim,
typename Number>
1753 template <
bool is_face,
bool is_linear>
1757 const unsigned int geometry_index =
1758 mapping_info->template compute_geometry_index_offset<is_face>(
1759 current_cell_index, current_face_number);
1761 cell_type = mapping_info->get_cell_type(geometry_index);
1763 const_cast<unsigned int &
>(n_q_points_scalar) =
1764 mapping_info->get_n_q_points_unvectorized(geometry_index);
1767 const_cast<unsigned int &
>(n_q_batches) =
1768 (n_q_points_scalar + n_lanes_internal - 1) / n_lanes_internal;
1770 const unsigned int n_q_points_before = n_q_points;
1772 const_cast<unsigned int &
>(n_q_points) =
1773 (stride == 1) ? n_q_batches : n_q_points_scalar;
1775 if (n_q_points != n_q_points_before)
1778 values.resize(n_q_points);
1783 if (n_q_points == 0)
1785 is_reinitialized =
true;
1792 is_face && (mapping_info->is_face_state() && n_q_points_scalar >= 6);
1795 const unsigned int unit_point_offset =
1796 mapping_info->compute_unit_point_index_offset(geometry_index);
1799 unit_point_faces_ptr =
1800 mapping_info->get_unit_point_faces(unit_point_offset);
1802 unit_point_ptr = mapping_info->get_unit_point(unit_point_offset);
1805 const unsigned int data_offset =
1806 mapping_info->compute_data_index_offset(geometry_index);
1807 const unsigned int compressed_data_offset =
1808 mapping_info->compute_compressed_data_index_offset(geometry_index);
1811 mapping_info->get_update_flags_mapping();
1813 real_point_ptr = mapping_info->get_real_point(data_offset);
1815 jacobian_ptr = mapping_info->get_jacobian(compressed_data_offset);
1817 inverse_jacobian_ptr =
1818 mapping_info->get_inverse_jacobian(compressed_data_offset);
1820 normal_ptr = mapping_info->get_normal_vector(data_offset);
1822 JxW_ptr = mapping_info->get_JxW(data_offset);
1824 real_point_ptr = mapping_info->get_real_point(data_offset);
1825 jacobian_ptr = mapping_info->get_jacobian(compressed_data_offset);
1826 inverse_jacobian_ptr =
1827 mapping_info->get_inverse_jacobian(compressed_data_offset);
1828 normal_ptr = mapping_info->get_normal_vector(data_offset);
1829 JxW_ptr = mapping_info->get_JxW(data_offset);
1832 if (!is_linear && fast_path)
1834 const std::size_t n_shapes = poly.size();
1836 for (
unsigned int qb = 0; qb < n_q_batches; ++qb)
1841 shapes_faces.resize_fast(n_q_batches * n_shapes);
1843 shapes_faces.data() + qb * n_shapes,
1845 unit_point_faces_ptr[qb],
1851 shapes.resize_fast(n_q_batches * n_shapes);
1853 shapes.data() + qb * n_shapes,
1860 is_reinitialized =
true;
1865 template <
int n_components_,
int dim,
int spacedim,
typename Number>
1866 template <
bool is_face_path,
bool is_linear, std::
size_t str
ide_view>
1872 const unsigned int dofs_per_comp =
1875 for (
unsigned int comp = 0; comp < n_components; ++comp)
1877 const std::size_t offset =
1878 (component_in_base_element + comp) * dofs_per_comp;
1883 if (is_linear || renumber.empty())
1885 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
1886 scratch_data_scalar[i] = solution_values[i + offset];
1887 input = scratch_data_scalar.
data();
1891 const unsigned int *renumber_ptr = renumber.data() + offset;
1892 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
1893 scratch_data_scalar[i] = solution_values[renumber_ptr[i]];
1894 input = scratch_data_scalar.
data();
1897 ScalarNumber *output = scratch_data_scalar.begin() + dofs_per_comp;
1900 template interpolate<true, false>(1,
1905 current_face_number);
1907 const unsigned int dofs_per_comp_face =
1908 is_linear ?
Utilities::pow(2, dim - 1) : dofs_per_component_face;
1909 for (
unsigned int i = 0; i < 2 * dofs_per_comp_face; ++i)
1910 ETT::read_value(output[i], comp, solution_renumbered[i]);
1914 if ((is_linear && n_components == 1) || renumber.empty())
1916 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
1917 ETT::read_value(solution_values[i + offset],
1919 solution_renumbered[i]);
1923 const unsigned int *renumber_ptr = renumber.data() + offset;
1924 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
1925 ETT::read_value(solution_values[renumber_ptr[i]],
1927 solution_renumbered[i]);
1935 template <
int n_components_,
int dim,
int spacedim,
typename Number>
1936 template <
bool is_face_path,
bool is_linear, std::
size_t str
ide_view>
1941 const unsigned int n_shapes,
1942 const unsigned int qb,
1950 const std::array<vectorized_value_type, dim + 1> interpolated_value =
1956 2>(solution_renumbered.data(), unit_point_faces_ptr[qb]) :
1962 false>(shapes_faces.data() + qb * n_shapes,
1964 solution_renumbered.data());
1966 value = interpolated_value[dim - 1];
1969 if (current_face_number / 2 == 0)
1971 gradient[0] = interpolated_value[dim];
1973 gradient[1] = interpolated_value[0];
1975 gradient[2] = interpolated_value[1];
1977 else if (current_face_number / 2 == 1)
1980 gradient[1] = interpolated_value[dim];
1983 gradient[0] = interpolated_value[1];
1984 gradient[2] = interpolated_value[0];
1987 gradient[0] = interpolated_value[0];
1991 else if (current_face_number / 2 == 2)
1995 gradient[0] = interpolated_value[0];
1996 gradient[1] = interpolated_value[1];
1997 gradient[2] = interpolated_value[dim];
2011 unit_point_faces_ptr[qb]) :
2016 false>(shapes_faces.data() + qb * n_shapes,
2018 solution_renumbered.data());
2025 std::array<vectorized_value_type, dim + 1> result;
2026 if constexpr (is_linear)
2028 if constexpr (n_components == 1)
2035 stride_view>(solution_values.
data(), unit_point_ptr[qb]);
2039 solution_renumbered.data(), unit_point_ptr[qb]);
2048 false>(shapes.data() + qb * n_shapes,
2050 solution_renumbered.data());
2051 gradient[0] = result[0];
2053 gradient[1] = result[1];
2055 gradient[2] = result[2];
2056 value = result[dim];
2060 if constexpr (is_linear)
2062 if constexpr (n_components == 1)
2067 stride_view>(solution_values.
data(), unit_point_ptr[qb]);
2070 solution_renumbered.data(), unit_point_ptr[qb]);
2077 false>(shapes.data() + qb * n_shapes,
2079 solution_renumbered.data());
2086 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2087 template <
bool is_face_path,
bool is_linear, std::
size_t str
ide_view>
2093 if (!(is_linear && n_components == 1) || is_face_path)
2094 prepare_evaluate_fast<is_face_path, is_linear>(solution_values,
2098 const unsigned int n_shapes = is_linear ? 2 : poly.size();
2100 for (
unsigned int qb = 0; qb < n_q_batches; ++qb)
2105 compute_evaluate_fast<is_face_path, is_linear>(
2106 solution_values, evaluation_flags, n_shapes, qb, value, gradient);
2110 for (
unsigned int v = 0, offset = qb * stride;
2111 v < stride && (stride == 1 || offset < n_q_points_scalar);
2113 ETT::set_value(value, v,
values[offset]);
2121 for (
unsigned int v = 0, offset = qb * stride;
2122 v < stride && (stride == 1 || offset < n_q_points_scalar);
2126 ETT::set_gradient(gradient, v, unit_gradient);
2133 inverse_jacobian_ptr
2147 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2148 template <std::
size_t str
ide_view>
2155 Assert(fe_values.get() !=
nullptr,
2157 "Not initialized. Please call FEPointEvaluation::reinit()!"));
2159 const std::size_t n_points = fe_values->get_quadrature().size();
2163 values.resize(n_q_points);
2165 for (
unsigned int i = 0; i < fe->n_dofs_per_cell(); ++i)
2168 for (
unsigned int d = 0;
d < n_components; ++
d)
2169 if (nonzero_shape_function_component[i][
d] &&
2170 (fe->is_primitive(i) || fe->is_primitive()))
2171 for (
unsigned int qb = 0, q = 0; q < n_points;
2172 ++qb, q += n_lanes_user_interface)
2173 for (
unsigned int v = 0;
2174 v < n_lanes_user_interface && q + v < n_points;
2179 fe_values->shape_value(i, q + v) * value);
2180 else if (nonzero_shape_function_component[i][
d])
2181 for (
unsigned int qb = 0, q = 0; q < n_points;
2182 ++qb, q += n_lanes_user_interface)
2183 for (
unsigned int v = 0;
2184 v < n_lanes_user_interface && q + v < n_points;
2189 fe_values->shape_value_component(i, q + v,
d) *
2198 for (
unsigned int i = 0; i < fe->n_dofs_per_cell(); ++i)
2201 for (
unsigned int d = 0;
d < n_components; ++
d)
2202 if (nonzero_shape_function_component[i][
d] &&
2203 (fe->is_primitive(i) || fe->is_primitive()))
2204 for (
unsigned int qb = 0, q = 0; q < n_points;
2205 ++qb, q += n_lanes_user_interface)
2206 for (
unsigned int v = 0;
2207 v < n_lanes_user_interface && q + v < n_points;
2212 fe_values->shape_grad(i, q + v) * value);
2213 else if (nonzero_shape_function_component[i][
d])
2214 for (
unsigned int qb = 0, q = 0; q < n_points;
2215 ++qb, q += n_lanes_user_interface)
2216 for (
unsigned int v = 0;
2217 v < n_lanes_user_interface && q + v < n_points;
2222 fe_values->shape_grad_component(i, q + v,
d) *
2230 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2231 template <std::
size_t str
ide_view>
2237 if (!is_reinitialized)
2240 if (n_q_points == 0)
2254 if (use_linear_path)
2255 evaluate_fast<true, true>(solution_values, evaluation_flags);
2257 evaluate_fast<true, false>(solution_values, evaluation_flags);
2261 if (use_linear_path)
2262 evaluate_fast<false, true>(solution_values, evaluation_flags);
2264 evaluate_fast<false, false>(solution_values, evaluation_flags);
2268 evaluate_slow(solution_values, evaluation_flags);
2273 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2274 template <
bool is_face_path,
bool is_linear>
2278 const unsigned int n_shapes,
2279 const unsigned int qb,
2288 std::array<vectorized_value_type, 2> value_face = {};
2291 value_face[0] = value;
2294 if (current_face_number / 2 == 0)
2296 value_face[1] = gradient[0];
2298 gradient_in_face[0] = gradient[1];
2300 gradient_in_face[1] = gradient[2];
2302 else if (current_face_number / 2 == 1)
2305 value_face[1] = gradient[1];
2308 gradient_in_face[0] = gradient[2];
2309 gradient_in_face[1] = gradient[0];
2312 gradient_in_face[0] = gradient[0];
2316 else if (current_face_number / 2 == 2)
2320 value_face[1] = gradient[2];
2321 gradient_in_face[0] = gradient[0];
2322 gradient_in_face[1] = gradient[1];
2335 2>(shapes_faces.data() + qb * n_shapes,
2339 is_linear ? solution_values_vectorized_linear :
2340 solution_renumbered_vectorized.data(),
2341 unit_point_faces_ptr[qb],
2349 shapes_faces.data() + qb * n_shapes,
2352 is_linear ? solution_values_vectorized_linear :
2353 solution_renumbered_vectorized.data(),
2354 unit_point_faces_ptr[qb],
2369 solution_values_vectorized_linear :
2370 solution_renumbered_vectorized.data(),
2378 shapes.data() + qb * n_shapes,
2381 is_linear ? solution_values_vectorized_linear :
2382 solution_renumbered_vectorized.data(),
2390 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2391 template <
bool is_face_path,
bool is_linear, std::
size_t str
ide_view>
2398 if (fe->n_components() > n_components)
2399 for (
unsigned int i = 0; i < solution_values.
size(); ++i)
2400 solution_values[i] = 0;
2402 const unsigned int dofs_per_comp =
2405 for (
unsigned int comp = 0; comp < n_components; ++comp)
2407 const std::size_t offset =
2408 (component_in_base_element + comp) * dofs_per_comp;
2412 const unsigned int dofs_per_comp_face =
2413 is_linear ?
Utilities::pow(2, dim - 1) : dofs_per_component_face;
2415 const unsigned int size_input = 2 * dofs_per_comp_face;
2419 for (
unsigned int i = 0; i < 2 * dofs_per_comp_face; ++i)
2421 ETT::sum_value(comp,
2423 *(solution_values_vectorized_linear + i) :
2424 solution_renumbered_vectorized[i]);
2427 template interpolate<false, false>(1,
2432 current_face_number);
2434 if (is_linear || renumber.empty())
2436 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
2437 solution_values[i + offset] = output[i];
2441 const unsigned int *renumber_ptr = renumber.
data() + offset;
2442 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
2443 solution_values[renumber_ptr[i]] = output[i];
2448 if (is_linear || renumber.empty())
2450 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
2451 solution_values[i + offset] =
2452 ETT::sum_value(comp,
2454 *(solution_values_vectorized_linear + i) :
2455 solution_renumbered_vectorized[i]);
2459 const unsigned int *renumber_ptr = renumber.
data() + offset;
2460 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
2461 solution_values[renumber_ptr[i]] =
2462 ETT::sum_value(comp, solution_renumbered_vectorized[i]);
2470 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2471 template <
bool do_JxW,
2474 std::size_t stride_view>
2481 if constexpr (stride == 1)
2482 if (
const unsigned int n_filled_lanes =
2483 n_q_points_scalar & (n_lanes_internal - 1);
2487 for (
unsigned int v = n_filled_lanes; v < n_lanes_internal; ++v)
2488 ETT::set_zero_value(
values.back(), v);
2490 for (
unsigned int v = n_filled_lanes; v < n_lanes_internal; ++v)
2491 ETT::set_zero_gradient(
gradients.back(), v);
2498 solution_values_vectorized_linear = {};
2501 const unsigned int n_shapes = is_linear ? 2 : poly.size();
2503 const bool cartesian_cell =
2505 const bool affine_cell =
2507 for (
unsigned int qb = 0; qb < n_q_batches; ++qb)
2513 for (
unsigned int v = 0, offset = qb * stride;
2514 v < stride && (stride == 1 || offset < n_q_points_scalar);
2516 ETT::get_value(value,
2518 do_JxW ?
values[offset] * JxW_ptr[offset] :
2522 for (
unsigned int v = 0, offset = qb * stride;
2523 v < stride && (stride == 1 || offset < n_q_points_scalar);
2534 inverse_jacobian_ptr[affine_cell ? 0 : offset], grad_w));
2537 compute_integrate_fast<is_face_path, is_linear>(
2543 solution_values_vectorized_linear.data());
2547 finish_integrate_fast<is_face_path, is_linear>(
2550 solution_values_vectorized_linear.
data());
2555 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2556 template <
bool do_JxW, std::
size_t str
ide_view>
2563 Assert(fe_values.get() !=
nullptr,
2565 "Not initialized. Please call FEPointEvaluation::reinit()!"));
2566 for (
unsigned int i = 0; i < solution_values.
size(); ++i)
2567 solution_values[i] = 0;
2569 const std::size_t n_points = fe_values->get_quadrature().
size();
2574 for (
unsigned int i = 0; i < fe->n_dofs_per_cell(); ++i)
2576 for (
unsigned int d = 0;
d < n_components; ++
d)
2577 if (nonzero_shape_function_component[i][
d] &&
2578 (fe->is_primitive(i) || fe->is_primitive()))
2579 for (
unsigned int qb = 0, q = 0; q < n_points;
2580 ++qb, q += n_lanes_user_interface)
2581 for (
unsigned int v = 0;
2582 v < n_lanes_user_interface && q + v < n_points;
2584 solution_values[i] += fe_values->shape_value(i, q + v) *
2585 ETT::access(
values[qb], v,
d) *
2586 (do_JxW ? fe_values->JxW(q + v) : 1.);
2587 else if (nonzero_shape_function_component[i][
d])
2588 for (
unsigned int qb = 0, q = 0; q < n_points;
2589 ++qb, q += n_lanes_user_interface)
2590 for (
unsigned int v = 0;
2591 v < n_lanes_user_interface && q + v < n_points;
2593 solution_values[i] +=
2594 fe_values->shape_value_component(i, q + v,
d) *
2595 ETT::access(
values[qb], v,
d) *
2596 (do_JxW ? fe_values->JxW(q + v) : 1.);
2603 for (
unsigned int i = 0; i < fe->n_dofs_per_cell(); ++i)
2605 for (
unsigned int d = 0;
d < n_components; ++
d)
2606 if (nonzero_shape_function_component[i][
d] &&
2607 (fe->is_primitive(i) || fe->is_primitive()))
2608 for (
unsigned int qb = 0, q = 0; q < n_points;
2609 ++qb, q += n_lanes_user_interface)
2610 for (
unsigned int v = 0;
2611 v < n_lanes_user_interface && q + v < n_points;
2613 solution_values[i] += fe_values->shape_grad(i, q + v) *
2615 (do_JxW ? fe_values->JxW(q + v) : 1.);
2616 else if (nonzero_shape_function_component[i][
d])
2617 for (
unsigned int qb = 0, q = 0; q < n_points;
2618 ++qb, q += n_lanes_user_interface)
2619 for (
unsigned int v = 0;
2620 v < n_lanes_user_interface && q + v < n_points;
2622 solution_values[i] +=
2623 fe_values->shape_grad_component(i, q + v,
d) *
2625 (do_JxW ? fe_values->JxW(q + v) : 1.);
2632 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2633 template <
bool do_JxW, std::
size_t str
ide_view>
2639 if (!is_reinitialized)
2644 if (n_q_points == 0 ||
2646 (integration_flags &
2649 for (
unsigned int i = 0; i < solution_values.
size(); ++i)
2650 solution_values[i] = 0;
2655 !do_JxW || JxW_ptr !=
nullptr,
2657 "JxW pointer is not set! If you do not want to integrate() use test_and_sum()"));
2664 if (use_linear_path)
2665 integrate_fast<do_JxW, true, true>(solution_values,
2668 integrate_fast<do_JxW, true, false>(solution_values,
2673 if (use_linear_path)
2674 integrate_fast<do_JxW, false, true>(solution_values,
2677 integrate_fast<do_JxW, false, false>(solution_values,
2682 integrate_slow<do_JxW>(solution_values, integration_flags);
2687 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2688 template <std::
size_t str
ide_view>
2694 do_integrate<true>(solution_values, integration_flags);
2699 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2700 template <std::
size_t str
ide_view>
2706 do_integrate<false>(solution_values, integration_flags);
2711 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2715 const unsigned int point_index)
const
2718 return values[point_index];
2723 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2727 const unsigned int point_index)
const
2735 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2739 const unsigned int point_index)
2742 values[point_index] = value;
2747 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2751 const unsigned int point_index)
2759 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2762 const unsigned int point_index)
const
2765 Assert(jacobian_ptr !=
nullptr,
2768 "update_jacobians"));
2777 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2780 const unsigned int point_index)
const
2783 Assert(inverse_jacobian_ptr !=
nullptr,
2786 "update_inverse_jacobians"));
2787 return inverse_jacobian_ptr
2796 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2799 const unsigned int point_index)
const
2802 Assert(JxW_ptr !=
nullptr,
2805 "update_JxW_values"));
2806 return JxW_ptr[point_index];
2811 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2814 const unsigned int point_index)
const
2817 Assert(normal_ptr !=
nullptr,
2820 "update_normal_vectors"));
2821 return normal_ptr[point_index];
2826 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2829 const unsigned int point_index)
const
2832 Assert(real_point_ptr !=
nullptr,
2835 "update_quadrature_points"));
2836 return real_point_ptr[point_index];
2841 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2844 const unsigned int point_index)
const
2847 Assert(unit_point_ptr !=
nullptr,
ExcMessage(
"unit_point_ptr is not set!"));
2849 for (
unsigned int d = 0;
d < dim; ++
d)
2851 unit_point_ptr[point_index / stride][
d], point_index % stride);
2857 template <
int n_components_,
int dim,
int spacedim,
typename Number>
2862 return {0
U, n_q_points};
value_type * data() const noexcept
static constexpr std::size_t stride
SmartPointer< const FiniteElement< dim > > fe
void integrate(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags)
void integrate(const ArrayView< ScalarNumber > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags)
AlignedVector< vectorized_value_type > solution_renumbered_vectorized
void do_integrate(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags)
unsigned int current_cell_index
void submit_gradient(const gradient_type &, const unsigned int point_index)
AlignedVector<::ndarray< VectorizedArrayType, 2, dim - 1 > > shapes_faces
std::vector< gradient_type > gradients
typename ETT::gradient_type gradient_type
std::vector< std::array< bool, n_components > > nonzero_shape_function_component
unsigned int current_face_number
static constexpr unsigned int dimension
const Point< dim - 1, VectorizedArrayType > * unit_point_faces_ptr
typename ETT::value_type value_type
std::unique_ptr< NonMatching::MappingInfo< dim, spacedim, Number > > mapping_info_on_the_fly
void test_and_sum(const ArrayView< ScalarNumber > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags)
typename ETT::scalar_value_type scalar_value_type
void compute_integrate_fast(const EvaluationFlags::EvaluationFlags &integration_flags, const unsigned int n_shapes, const unsigned int qb, const vectorized_value_type value, const interface_vectorized_gradient_type gradient, vectorized_value_type *solution_values_vectorized_linear)
const Point< dim, VectorizedArrayType > * unit_point_ptr
void evaluate(const StridedArrayView< const ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
std::vector< Polynomials::Polynomial< double > > poly
void test_and_sum(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags)
std::vector< value_type > values
AlignedVector<::ndarray< VectorizedArrayType, 2, dim > > shapes
const DerivativeForm< 1, spacedim, dim, Number > * inverse_jacobian_ptr
const value_type & get_value(const unsigned int point_index) const
void evaluate_fast(const StridedArrayView< const ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
typename internal::VectorizedArrayTrait< Number >::value_type ScalarNumber
const unsigned int n_q_batches
typename ETT::vectorized_value_type vectorized_value_type
typename ::internal::VectorizedArrayTrait< Number >::vectorized_value_type VectorizedArrayType
unsigned int dofs_per_component
std_cxx20::ranges::iota_view< unsigned int, unsigned int > quadrature_point_indices() const
DerivativeForm< 1, dim, spacedim, Number > jacobian(const unsigned int point_index) const
unsigned int dofs_per_component_face
void finish_integrate_fast(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags, vectorized_value_type *solution_values_vectorized_linear)
const DerivativeForm< 1, dim, spacedim, Number > * jacobian_ptr
const Point< spacedim, Number > * real_point_ptr
void prepare_evaluate_fast(const StridedArrayView< const ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
DerivativeForm< 1, spacedim, dim, Number > inverse_jacobian(const unsigned int point_index) const
Point< dim, Number > unit_point(const unsigned int point_index) const
const UpdateFlags update_flags
std::vector< unsigned int > renumber
AlignedVector< ScalarNumber > scratch_data_scalar
void evaluate_slow(const StridedArrayView< const ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
void evaluate(const ArrayView< const ScalarNumber > &solution_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
Number JxW(const unsigned int point_index) const
void setup(const unsigned int first_selected_component)
void submit_value(const value_type &value, const unsigned int point_index)
typename ETT::interface_vectorized_gradient_type interface_vectorized_gradient_type
static constexpr std::size_t n_lanes_internal
const unsigned int n_q_points
static constexpr unsigned int n_components
internal::MatrixFreeFunctions::GeometryType cell_type
internal::MatrixFreeFunctions::ShapeInfo< ScalarNumber > shape_info
void integrate_fast(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags)
const unsigned int n_q_points_scalar
unsigned int component_in_base_element
std::vector< scalar_value_type > solution_renumbered
typename internal::FEPointEvaluation::EvaluatorTypeTraits< dim, n_components, Number > ETT
void integrate_slow(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags)
std::shared_ptr< FEValues< dim, spacedim > > fe_values
static constexpr std::size_t n_lanes_user_interface
const Tensor< 1, spacedim, Number > * normal_ptr
FEPointEvaluation(const Mapping< dim > &mapping, const FiniteElement< dim > &fe, const UpdateFlags update_flags, const unsigned int first_selected_component=0)
boost::signals2::connection connection_is_reinitialized
void compute_evaluate_fast(const StridedArrayView< const ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &evaluation_flags, const unsigned int n_shapes, const unsigned int qb, vectorized_value_type &value, interface_vectorized_gradient_type &gradient)
Point< spacedim, Number > real_point(const unsigned int point_index) const
SmartPointer< const Mapping< dim, spacedim > > mapping
SmartPointer< NonMatching::MappingInfo< dim, spacedim, Number > > mapping_info
Tensor< 1, spacedim, Number > normal_vector(const unsigned int point_index) const
const gradient_type & get_gradient(const unsigned int point_index) const
value_type * data() const noexcept
Tensor< rank, dim, Number > sum(const Tensor< rank, dim, Number > &local, const MPI_Comm mpi_communicator)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcNotInitialized()
#define Assert(cond, exc)
static ::ExceptionBase & ExcNotImplemented()
static ::ExceptionBase & ExcFEPointEvaluationAccessToUninitializedMappingField(std::string arg1)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
#define DeclException1(Exception1, type1, outsequence)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
@ update_values
Shape function values.
@ update_normal_vectors
Normal vectors.
@ update_JxW_values
Transformed quadrature weights.
@ update_jacobians
Volume element.
@ update_inverse_jacobians
Volume element.
@ update_gradients
Shape function gradients.
@ update_quadrature_points
Transformed quadrature points.
EvaluationFlags
The EvaluationFlags enum.
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
constexpr T pow(const T base, const int iexp)
std::vector< Polynomials::Polynomial< double > > get_polynomial_space(const FiniteElement< dim, spacedim > &fe)
bool is_fast_path_supported(const FiniteElement< dim, spacedim > &fe, const unsigned int base_element_number)
ProductTypeNoPoint< Number, Number2 >::type evaluate_tensor_product_value_shapes(const ::ndarray< Number2, 2, dim > *shapes, const int n_shapes, const Number *values, const std::vector< unsigned int > &renumber={})
void reinit(MatrixBlock< MatrixType > &v, const BlockSparsityPattern &p)
void integrate_tensor_product_value_and_gradient(const ::ndarray< Number, 2, dim > *shapes, const unsigned int n_shapes, const Number2 *value, const Tensor< 1, dim, Number2 > &gradient, Number2 *values, const Point< dim, Number > &p, const bool do_add)
std::array< typename ProductTypeNoPoint< Number, Number2 >::type, dim+n_values > evaluate_tensor_product_value_and_gradient_linear(const Number *values, const Point< dim, Number2 > &p)
void compute_values_of_array(::ndarray< Number, 2, dim > *shapes, const std::vector< Polynomials::Polynomial< double >> &poly, const Point< dim, Number > &p, const unsigned int derivative=1)
std::array< typename ProductTypeNoPoint< Number, Number2 >::type, dim+n_values > evaluate_tensor_product_value_and_gradient_shapes(const ::ndarray< Number2, 2, dim > *shapes, const int n_shapes, const Number *values, const std::vector< unsigned int > &renumber={})
ProductTypeNoPoint< Number, Number2 >::type evaluate_tensor_product_value_linear(const Number *values, const Point< dim, Number2 > &p)
void integrate_tensor_product_value(const ::ndarray< Number, 2, dim > *shapes, const unsigned int n_shapes, const Number2 &value, Number2 *values, const Point< dim, Number > &p, const bool do_add)
static const unsigned int invalid_unsigned_int
boost::integer_range< IncrementableType > iota_view
typename internal::ndarray::HelperArray< T, Ns... >::type ndarray
typename ::internal::VectorizedArrayTrait< Number >::vectorized_value_type VectorizedArrayType
static void access(gradient_type &value, const unsigned int vector_lane, const unsigned int, const scalar_gradient_type &shape_gradient)
static void get_value(vectorized_value_type &value, const unsigned int, const vectorized_value_type &result)
static scalar_gradient_type access(const gradient_type &value, const unsigned int vector_lane, const unsigned int)
static void get_gradient(vectorized_gradient_type &value, const unsigned int, const vectorized_gradient_type &result)
static void set_gradient(const vectorized_gradient_type &value, const unsigned int vector_lane, scalar_gradient_type &result)
static void set_value(const vectorized_value_type &value, const unsigned int vector_lane, scalar_value_type &result)
typename internal::VectorizedArrayTrait< Number >::value_type ScalarNumber
ScalarNumber scalar_value_type
static void set_value(const vectorized_value_type &value, const unsigned int, vectorized_value_type &result)
static void read_value(const ScalarNumber vector_entry, const unsigned int, scalar_value_type &result)
static ScalarNumber sum_value(const unsigned int, const vectorized_value_type &result)
static void set_gradient(const vectorized_gradient_type &value, const unsigned int, vectorized_gradient_type &result)
static void get_value(vectorized_value_type &value, const unsigned int vector_lane, const scalar_value_type &result)
static void set_zero_value(value_type &value, const unsigned int vector_lane)
static ScalarNumber access(const value_type &value, const unsigned int vector_lane, const unsigned int)
static void set_zero_gradient(gradient_type &value, const unsigned int vector_lane)
VectorizedArrayType vectorized_value_type
static void access(value_type &value, const unsigned int vector_lane, const unsigned int, const ScalarNumber &shape_value)
static void get_gradient(vectorized_gradient_type &value, const unsigned int vector_lane, const scalar_gradient_type &result)
static void set_value(const vectorized_value_type &value, const unsigned int vector_lane, scalar_value_type &result)
VectorizedArrayType vectorized_value_type
ScalarNumber scalar_value_type
static void read_value(const ScalarNumber vector_entry, const unsigned int, scalar_value_type &result)
static void set_gradient(const vectorized_gradient_type &value, const unsigned int, vectorized_gradient_type &result)
static void get_gradient(vectorized_gradient_type &value, const unsigned int vector_lane, const scalar_gradient_type &result)
static scalar_gradient_type access(const gradient_type &value, const unsigned int vector_lane, const unsigned int)
static ScalarNumber sum_value(const unsigned int, const vectorized_value_type &result)
typename ::internal::VectorizedArrayTrait< Number >::vectorized_value_type VectorizedArrayType
static void set_zero_value(value_type &value, const unsigned int vector_lane)
static void get_value(vectorized_value_type &value, const unsigned int, const vectorized_value_type &result)
static void set_value(const vectorized_value_type &value, const unsigned int, vectorized_value_type &result)
static void set_zero_gradient(gradient_type &value, const unsigned int vector_lane)
static void set_gradient(const vectorized_gradient_type &value, const unsigned int vector_lane, scalar_gradient_type &result)
static void access(gradient_type &value, const unsigned int vector_lane, const unsigned int, const scalar_gradient_type &shape_gradient)
static ScalarNumber access(const value_type &value, const unsigned int vector_lane, const unsigned int)
typename internal::VectorizedArrayTrait< Number >::value_type ScalarNumber
static void get_gradient(vectorized_gradient_type &value, const unsigned int, const vectorized_gradient_type &result)
static void get_value(vectorized_value_type &value, const unsigned int vector_lane, const scalar_value_type &result)
static void access(value_type &value, const unsigned int vector_lane, const unsigned int, const ScalarNumber &shape_value)
static ScalarNumber access(const value_type &value, const unsigned int vector_lane, const unsigned int component)
static void get_value(vectorized_value_type &value, const unsigned int vector_lane, const scalar_value_type &result)
static void get_gradient(interface_vectorized_gradient_type &value, const unsigned int vector_lane, const gradient_type &result)
static void set_zero_gradient(gradient_type &value, const unsigned int vector_lane)
static void get_value(vectorized_value_type &value, const unsigned int, const vectorized_value_type &result)
static Tensor< 1, dim, ScalarNumber > access(const gradient_type &value, const unsigned int vector_lane, const unsigned int component)
static void set_value(const vectorized_value_type &value, const unsigned int, vectorized_value_type &result)
static void set_value(const vectorized_value_type &value, const unsigned int vector_lane, scalar_value_type &result)
static void set_gradient(const interface_vectorized_gradient_type &value, const unsigned int vector_lane, gradient_type &result)
typename internal::VectorizedArrayTrait< Number >::value_type ScalarNumber
static void access(gradient_type &value, const unsigned int vector_lane, const unsigned int component, const Tensor< 1, dim, ScalarNumber > &shape_gradient)
typename ::internal::VectorizedArrayTrait< Number >::vectorized_value_type VectorizedArrayType
static void access(value_type &value, const unsigned int vector_lane, const unsigned int component, const ScalarNumber &shape_value)
static void read_value(const ScalarNumber vector_entry, const unsigned int component, scalar_value_type &result)
static void set_zero_value(value_type &value, const unsigned int vector_lane)
static ScalarNumber sum_value(const unsigned int component, const vectorized_value_type &result)
typename ::internal::VectorizedArrayTrait< Number >::vectorized_value_type VectorizedArrayType
static ScalarNumber sum_value(const unsigned int component, const vectorized_value_type &result)
static void set_value(const vectorized_value_type &value, const unsigned int vector_lane, scalar_value_type &result)
typename internal::VectorizedArrayTrait< Number >::value_type ScalarNumber
static void access(value_type &value, const unsigned int vector_lane, const unsigned int component, const ScalarNumber &shape_value)
static Tensor< 1, dim, ScalarNumber > access(const gradient_type &value, const unsigned int vector_lane, const unsigned int component)
static void set_zero_value(value_type &value, const unsigned int vector_lane)
Tensor< 1, n_components, VectorizedArrayType > vectorized_value_type
Tensor< 1, n_components, Tensor< 1, dim, VectorizedArrayType > > vectorized_gradient_type
static void access(gradient_type &value, const unsigned int vector_lane, const unsigned int component, const Tensor< 1, dim, ScalarNumber > &shape_gradient)
static void read_value(const ScalarNumber vector_entry, const unsigned int component, scalar_value_type &result)
Tensor< 1, n_components, Tensor< 1, dim, ScalarNumber > > scalar_gradient_type
static void set_zero_gradient(gradient_type &value, const unsigned int vector_lane)
static ScalarNumber access(const value_type &value, const unsigned int vector_lane, const unsigned int component)
static void get_value(vectorized_value_type &value, const unsigned int, const vectorized_value_type &result)
static void set_value(const vectorized_value_type &value, const unsigned int, vectorized_value_type &result)
static void get_gradient(interface_vectorized_gradient_type &value, const unsigned int vector_lane, const gradient_type &result)
static void set_gradient(const interface_vectorized_gradient_type &value, const unsigned int vector_lane, gradient_type &result)
static void get_value(vectorized_value_type &value, const unsigned int vector_lane, const scalar_value_type &result)
static constexpr std::size_t width()
static constexpr std::size_t stride()
static value_type & get(value_type &value, unsigned int c)