13#ifndef dealii_fe_point_evaluation_h
14#define dealii_fe_point_evaluation_h
46 <<
"You are requesting information from an FEPointEvaluationBase "
47 <<
"object for which this kind of information has not been computed. "
48 <<
"What information these objects compute is determined by the update_* "
49 <<
"flags you pass to MappingInfo() in the Constructor. Here, "
50 <<
"the operation you are attempting requires the <" << arg1
51 <<
"> flag to be set, but it was apparently not specified "
52 <<
"upon initialization.");
62 typename Enable =
void>
68 typename ::internal::VectorizedArrayTrait<
77 n_components == spacedim,
90 const unsigned int component,
94 result[component] = vector_entry;
108 for (
unsigned int c = 0; c < n_components; ++c)
109 result_scalar[c] = result[c].sum();
111 return result_scalar;
119 return result[component].
sum();
124 const unsigned int vector_lane,
127 for (
unsigned int i = 0; i < n_components; ++i)
128 for (
unsigned int d = 0; d < dim; ++d)
131 value[d][i], vector_lane);
136 const unsigned int vector_lane,
139 for (
unsigned int i = 0; i < n_components; ++i)
140 for (
unsigned int d = 0; d < dim; ++d)
142 value[d][i], vector_lane) = result[i][d];
147 const unsigned int vector_lane,
150 for (
unsigned int i = 0; i < n_components; ++i)
151 for (
unsigned int d = 0; d < dim; ++d)
153 value[d][i], vector_lane) = result[i][d];
158 const unsigned int vector_lane)
160 for (
unsigned int i = 0; i < n_components; ++i)
161 for (
unsigned int d = 0; d < spacedim; ++d)
168 const unsigned int vector_lane,
171 for (
unsigned int i = 0; i < n_components; ++i)
172 result[i] =
value[i][vector_lane];
185 const unsigned int vector_lane,
188 for (
unsigned int i = 0; i < n_components; ++i)
189 value[i][vector_lane] = result[i];
203 for (
unsigned int i = 0; i < n_components; ++i)
210 const unsigned int vector_lane,
211 const unsigned int component,
215 vector_lane) += shape_value;
220 const unsigned int vector_lane,
221 const unsigned int component)
229 const unsigned int vector_lane,
230 const unsigned int component,
233 for (
unsigned int d = 0; d < spacedim; ++d)
241 const unsigned int vector_lane,
242 const unsigned int component)
245 for (
unsigned int d = 0; d < spacedim; ++d)
253 template <
int dim,
int spacedim,
typename Number>
259 typename ::internal::VectorizedArrayTrait<
277 result = vector_entry;
300 const unsigned int vector_lane,
303 for (
unsigned int d = 0; d < dim; ++d)
304 result[d] =
value[d][vector_lane];
317 const unsigned int vector_lane,
320 for (
unsigned int d = 0; d < dim; ++d)
321 value[d][vector_lane] = result[d];
334 const unsigned int vector_lane)
336 for (
unsigned int d = 0; d < spacedim; ++d)
343 const unsigned int vector_lane,
346 result =
value[vector_lane];
359 const unsigned int vector_lane,
362 value[vector_lane] = result;
381 const unsigned int vector_lane,
391 const unsigned int vector_lane,
399 const unsigned int vector_lane,
403 for (
unsigned int d = 0; d < spacedim; ++d)
410 const unsigned int vector_lane,
414 for (
unsigned int d = 0; d < spacedim; ++d)
421 template <
int dim,
typename Number>
426 std::enable_if_t<dim != 1>>
431 typename ::internal::VectorizedArrayTrait<
446 const unsigned int component,
450 result[component] = vector_entry;
464 for (
unsigned int c = 0; c < dim; ++c)
465 result_scalar[c] = result[c].sum();
467 return result_scalar;
475 return result[component].
sum();
480 const unsigned int vector_lane,
483 for (
unsigned int i = 0; i < dim; ++i)
484 for (
unsigned int d = 0; d < dim; ++d)
487 value[d][i], vector_lane);
492 const unsigned int vector_lane,
495 for (
unsigned int i = 0; i < dim; ++i)
496 for (
unsigned int d = 0; d < dim; ++d)
498 value[d][i], vector_lane) = result[i][d];
503 const unsigned int vector_lane)
505 for (
unsigned int i = 0; i < dim; ++i)
506 for (
unsigned int d = 0; d < dim; ++d)
513 const unsigned int vector_lane,
516 for (
unsigned int i = 0; i < dim; ++i)
517 result[i] =
value[i][vector_lane];
530 const unsigned int vector_lane,
533 for (
unsigned int i = 0; i < dim; ++i)
534 value[i][vector_lane] = result[i];
548 for (
unsigned int i = 0; i < dim; ++i)
555 const unsigned int vector_lane,
556 const unsigned int component,
560 vector_lane) += shape_value;
565 const unsigned int vector_lane,
566 const unsigned int component)
574 const unsigned int vector_lane,
575 const unsigned int component,
578 for (
unsigned int d = 0; d < dim; ++d)
586 const unsigned int vector_lane,
587 const unsigned int component)
590 for (
unsigned int d = 0; d < dim; ++d)
598 template <
int dim,
int spacedim>
601 const unsigned int base_element_number);
603 template <
int dim,
int spacedim>
607 template <
int dim,
int spacedim>
608 std::vector<Polynomials::Polynomial<double>>
621template <
int n_components_,
637 using ETT =
typename internal::FEPointEvaluation::
638 EvaluatorTypeTraits<dim, spacedim, n_components, Number>;
645 typename ETT::interface_vectorized_unit_gradient_type;
669 const unsigned int first_selected_component = 0);
693 const unsigned int first_selected_component = 0,
812 JxW(
const unsigned int point_index)
const;
878 setup(
const unsigned int first_selected_component);
885 template <
bool is_face,
bool is_linear>
918 std::vector<Polynomials::Polynomial<double>>
poly;
1054 std::unique_ptr<NonMatching::MappingInfo<dim, spacedim, Number>>
1134template <
int n_components_,
1137 typename Number =
double>
1151 using ETT =
typename internal::FEPointEvaluation::
1152 EvaluatorTypeTraits<dim, spacedim, n_components, Number>;
1159 typename ETT::interface_vectorized_unit_gradient_type;
1198 const unsigned int first_selected_component = 0,
1199 const bool force_lexicographic_numbering =
false);
1228 const unsigned int first_selected_component = 0,
1229 const bool force_lexicographic_numbering =
false);
1272 template <std::
size_t str
ide_view>
1315 template <std::
size_t str
ide_view>
1319 const bool sum_into_values =
false);
1346 const bool sum_into_values =
false);
1374 template <std::
size_t str
ide_view>
1379 const bool sum_into_values =
false);
1410 const bool sum_into_values =
false);
1450 template <
bool is_linear, std::
size_t str
ide_view>
1459 template <
bool is_linear, std::
size_t str
ide_view>
1464 const unsigned int n_shapes,
1465 const unsigned int qb,
1472 template <
bool is_linear, std::
size_t str
ide_view>
1481 template <std::
size_t str
ide_view>
1492 template <
bool is_linear>
1496 const unsigned int n_shapes,
1497 const unsigned int qb,
1507 template <
bool is_linear, std::
size_t str
ide_view>
1512 const bool sum_into_values);
1517 template <
bool do_JxW,
bool is_linear, std::
size_t str
ide_view>
1522 const bool sum_into_values);
1527 template <
bool do_JxW, std::
size_t str
ide_view>
1532 const bool sum_into_values);
1537 template <
bool do_JxW, std::
size_t str
ide_view>
1542 const bool sum_into_values);
1572template <
int n_components_,
1575 typename Number =
double>
1589 using ETT =
typename internal::FEPointEvaluation::
1590 EvaluatorTypeTraits<dim, spacedim, n_components, Number>;
1597 typename ETT::interface_vectorized_unit_gradient_type;
1606 const unsigned int first_selected_component = 0);
1620 reinit(
const unsigned int face_index);
1633 template <std::
size_t str
ide_view>
1676 template <std::
size_t str
ide_view>
1680 const bool sum_into_values =
false);
1707 const bool sum_into_values =
false);
1731 template <std::
size_t str
ide_view>
1736 const bool sum_into_values =
false);
1763 const bool sum_into_values =
false);
1771 template <
int str
ide_face_dof = VectorizedArrayType::size()>
1782 template <
int str
ide_face_dof = VectorizedArrayType::size()>
1786 const bool sum_into_values =
false);
1820 template <
bool is_linear, std::
size_t str
ide_view>
1826 template <
bool do_JxW,
bool is_linear, std::
size_t str
ide_view>
1831 const bool sum_into_values);
1837 template <
bool is_linear,
int str
ide_face_dof>
1846 template <
bool do_JxW,
bool is_linear,
int str
ide_face_dof>
1851 const bool sum_into_values);
1859template <
int n_components_,
int dim,
int spacedim,
typename Number>
1864 const unsigned int first_selected_component)
1865 : n_q_batches(
numbers::invalid_unsigned_int)
1866 , n_q_points(
numbers::invalid_unsigned_int)
1867 , n_q_points_scalar(
numbers::invalid_unsigned_int)
1871 , update_flags(update_flags)
1872 , mapping_info_on_the_fly(
1873 std::make_unique<
NonMatching::MappingInfo<dim, spacedim, Number>>(
1876 , mapping_info(mapping_info_on_the_fly.get())
1877 , current_cell_index(
numbers::invalid_unsigned_int)
1878 , current_face_number(
numbers::invalid_unsigned_int)
1879 , must_reinitialize_pointers(false)
1882 setup(first_selected_component);
1887template <
int n_components_,
int dim,
int spacedim,
typename Number>
1892 const unsigned int first_selected_component,
1893 const bool is_interior)
1894 : n_q_batches(
numbers::invalid_unsigned_int)
1895 , n_q_points(
numbers::invalid_unsigned_int)
1896 , n_q_points_scalar(
numbers::invalid_unsigned_int)
1897 , mapping(&mapping_info.get_mapping())
1900 , update_flags(mapping_info.get_update_flags())
1901 , mapping_info(&mapping_info)
1902 , current_cell_index(
numbers::invalid_unsigned_int)
1903 , current_face_number(
numbers::invalid_unsigned_int)
1904 , must_reinitialize_pointers(true)
1905 , is_interior(is_interior)
1907 setup(first_selected_component);
1912template <
int n_components_,
int dim,
int spacedim,
typename Number>
1916 : n_q_batches(other.n_q_batches)
1917 , n_q_points(other.n_q_points)
1918 , n_q_points_scalar(other.n_q_points_scalar)
1919 , mapping(other.mapping)
1922 , use_linear_path(other.use_linear_path)
1923 , renumber(other.renumber)
1924 , solution_renumbered(other.solution_renumbered)
1925 , solution_renumbered_vectorized(other.solution_renumbered_vectorized)
1926 , values(other.values)
1927 , gradients(other.gradients)
1928 , dofs_per_component(other.dofs_per_component)
1929 , dofs_per_component_face(other.dofs_per_component_face)
1930 , component_in_base_element(other.component_in_base_element)
1931 , nonzero_shape_function_component(other.nonzero_shape_function_component)
1932 , update_flags(other.update_flags)
1933 , fe_values(other.fe_values)
1934 , mapping_info_on_the_fly(
1935 other.mapping_info_on_the_fly ?
1940 , mapping_info(other.mapping_info)
1941 , current_cell_index(other.current_cell_index)
1942 , current_face_number(other.current_face_number)
1943 , fast_path(other.fast_path)
1944 , must_reinitialize_pointers(true)
1945 , is_interior(other.is_interior)
1950template <
int n_components_,
int dim,
int spacedim,
typename Number>
1956template <
int n_components_,
int dim,
int spacedim,
typename Number>
1959 const unsigned int first_selected_component)
1961 if (fe->n_components() > 1)
1963 fe->n_components() + 1);
1965 shapes.reserve(100);
1967 bool same_base_element =
true;
1968 unsigned int base_element_number = 0;
1969 component_in_base_element = 0;
1970 unsigned int component = 0;
1972 for (; base_element_number < fe->n_base_elements(); ++base_element_number)
1973 if (component + fe->element_multiplicity(base_element_number) >
1974 first_selected_component)
1980 if (fe->n_components() > 1 &&
1981 first_selected_component + n_components >
1982 component + fe->element_multiplicity(base_element_number))
1983 same_base_element =
false;
1984 component_in_base_element = first_selected_component - component;
1988 component += fe->element_multiplicity(base_element_number);
1992 *fe, base_element_number) &&
1995 shape_info.reinit(
QMidpoint<1>(), *fe, base_element_number);
1996 renumber = shape_info.lexicographic_numbering;
1997 dofs_per_component = shape_info.dofs_per_component_on_cell;
1998 dofs_per_component_face = shape_info.dofs_per_component_on_face;
2000 fe->base_element(base_element_number));
2002 bool is_lexicographic =
true;
2003 for (
unsigned int i = 0; i < renumber.size(); ++i)
2004 if (i != renumber[i])
2005 is_lexicographic =
false;
2007 if (is_lexicographic)
2010 use_linear_path = (poly.size() == 2 && poly[0].value(0.) == 1. &&
2011 poly[0].value(1.) == 0. && poly[1].value(0.) == 0. &&
2012 poly[1].value(1.) == 1.) &&
2013 (fe->n_components() == n_components);
2015 const unsigned int size_face = 3 * dofs_per_component_face * n_components;
2016 const unsigned int size_cell = dofs_per_component * n_components;
2017 scratch_data_scalar.resize(size_face + size_cell);
2019 solution_renumbered.resize(dofs_per_component);
2020 solution_renumbered_vectorized.resize(dofs_per_component);
2026 nonzero_shape_function_component.resize(fe->n_dofs_per_cell());
2027 for (
unsigned int d = 0; d < n_components; ++d)
2029 const unsigned int component = first_selected_component + d;
2030 for (
unsigned int i = 0; i < fe->n_dofs_per_cell(); ++i)
2032 const bool is_primitive =
2033 fe->is_primitive() || fe->is_primitive(i);
2035 nonzero_shape_function_component[i][d] =
2036 (component == fe->system_to_component_index(i).first);
2038 nonzero_shape_function_component[i][d] =
2039 (fe->get_nonzero_components(i)[component] ==
true);
2049template <
int n_components_,
int dim,
int spacedim,
typename Number>
2050template <
bool is_face,
bool is_linear>
2054 const unsigned int geometry_index =
2055 mapping_info->template compute_geometry_index_offset<is_face>(
2056 current_cell_index, current_face_number);
2058 cell_type = mapping_info->get_cell_type(geometry_index);
2060 const_cast<unsigned int &
>(n_q_points_scalar) =
2061 mapping_info->get_n_q_points_unvectorized(geometry_index);
2064 const_cast<unsigned int &
>(n_q_batches) =
2065 (n_q_points_scalar + n_lanes_internal - 1) / n_lanes_internal;
2067 const unsigned int n_q_points_before = n_q_points;
2069 const_cast<unsigned int &
>(n_q_points) =
2070 (stride == 1) ? n_q_batches : n_q_points_scalar;
2072 if (n_q_points != n_q_points_before)
2075 values.resize(n_q_points);
2077 gradients.resize(n_q_points);
2080 if (n_q_points == 0)
2084 const unsigned int unit_point_offset =
2085 mapping_info->compute_unit_point_index_offset(geometry_index);
2088 unit_point_faces_ptr =
2089 mapping_info->get_unit_point_faces(unit_point_offset);
2091 unit_point_ptr = mapping_info->get_unit_point(unit_point_offset);
2094 const unsigned int data_offset =
2095 mapping_info->compute_data_index_offset(geometry_index);
2096 const unsigned int compressed_data_offset =
2097 mapping_info->compute_compressed_data_index_offset(geometry_index);
2101 mapping_info->get_update_flags_mapping();
2103 real_point_ptr = mapping_info->get_real_point(data_offset);
2106 mapping_info->get_jacobian(compressed_data_offset, is_interior);
2108 inverse_jacobian_ptr =
2109 mapping_info->get_inverse_jacobian(compressed_data_offset,
2112 normal_ptr = mapping_info->get_normal_vector(data_offset);
2114 JxW_ptr = mapping_info->get_JxW(data_offset);
2118 real_point_ptr = mapping_info->get_real_point(data_offset);
2120 mapping_info->get_jacobian(compressed_data_offset, is_interior);
2121 inverse_jacobian_ptr =
2122 mapping_info->get_inverse_jacobian(compressed_data_offset, is_interior);
2123 normal_ptr = mapping_info->get_normal_vector(data_offset);
2124 JxW_ptr = mapping_info->get_JxW(data_offset);
2127 if (!is_linear && fast_path)
2129 const std::size_t n_shapes = poly.size();
2131 shapes_faces.resize_fast(n_q_batches * n_shapes);
2133 shapes.resize_fast(n_q_batches * n_shapes);
2135 for (
unsigned int qb = 0; qb < n_q_batches; ++qb)
2141 shapes_faces.data() + qb * n_shapes,
2143 unit_point_faces_ptr[qb],
2156 else if (qb + 1 < n_q_batches)
2161 shapes.data() + qb * n_shapes,
2164 unit_point_ptr[qb + 1]);
2180template <
int n_components_,
int dim,
int spacedim,
typename Number>
2186 const unsigned int point_index)
const
2189 return values[point_index];
2194template <
int n_components_,
int dim,
int spacedim,
typename Number>
2198 Number>::gradient_type &
2200 const unsigned int point_index)
const
2203 return gradients[point_index];
2208template <
int n_components_,
int dim,
int spacedim,
typename Number>
2211 const unsigned int point_index)
const
2213 static_assert(n_components == dim,
2214 "Only makes sense for a vector field with dim components");
2217 return trace(gradients[point_index]);
2222template <
int n_components_,
int dim,
int spacedim,
typename Number>
2226 const unsigned int point_index)
2229 values[point_index] = value;
2234template <
int n_components_,
int dim,
int spacedim,
typename Number>
2238 const unsigned int point_index)
2241 gradients[point_index] = gradient;
2246template <
int n_components_,
int dim,
int spacedim,
typename Number>
2249 const Number &value,
2250 const unsigned int point_index)
2252 static_assert(n_components == dim,
2253 "Only makes sense for a vector field with dim components");
2257 for (
unsigned int d = 0; d < dim; ++d)
2258 gradients[point_index][d][d] = value;
2263template <
int n_components_,
int dim,
int spacedim,
typename Number>
2266 const unsigned int point_index)
const
2269 dim > 1 && n_components == dim,
2270 "Only makes sense for a vector field with dim components and dim > 1");
2273 if constexpr (dim == 2)
2274 return grad[1][0] - grad[0][1];
2275 else if constexpr (dim == 3)
2278 curl[0] = grad[2][1] - grad[1][2];
2279 curl[1] = grad[0][2] - grad[2][0];
2280 curl[2] = grad[1][0] - grad[0][1];
2290template <
int n_components_,
int dim,
int spacedim,
typename Number>
2293 const unsigned int point_index)
const
2296 Assert(jacobian_ptr !=
nullptr,
2298 ExcFEPointEvaluationAccessToUninitializedMappingField(
2299 "update_jacobians"));
2300 return jacobian_ptr[cell_type <= ::internal::MatrixFreeFunctions::
2301 GeometryType::affine ?
2308template <
int n_components_,
int dim,
int spacedim,
typename Number>
2311 const unsigned int point_index)
const
2314 Assert(inverse_jacobian_ptr !=
nullptr,
2316 ExcFEPointEvaluationAccessToUninitializedMappingField(
2317 "update_inverse_jacobians"));
2318 return inverse_jacobian_ptr
2327template <
int n_components_,
int dim,
int spacedim,
typename Number>
2330 const unsigned int point_index)
const
2333 Assert(JxW_ptr !=
nullptr,
2335 ExcFEPointEvaluationAccessToUninitializedMappingField(
2336 "update_JxW_values"));
2337 return JxW_ptr[point_index];
2342template <
int n_components_,
int dim,
int spacedim,
typename Number>
2345 const unsigned int point_index)
const
2347 return quadrature_point(point_index);
2352template <
int n_components_,
int dim,
int spacedim,
typename Number>
2355 const unsigned int point_index)
const
2358 Assert(real_point_ptr !=
nullptr,
2360 ExcFEPointEvaluationAccessToUninitializedMappingField(
2361 "update_quadrature_points"));
2362 return real_point_ptr[point_index];
2367template <
int n_components_,
int dim,
int spacedim,
typename Number>
2370 const unsigned int point_index)
const
2373 Assert(unit_point_ptr !=
nullptr,
ExcMessage(
"unit_point_ptr is not set!"));
2375 for (
unsigned int d = 0; d < dim; ++d)
2377 unit_point_ptr[point_index / stride][d], point_index % stride);
2383template <
int n_components_,
int dim,
int spacedim,
typename Number>
2394template <
int n_components_,
int dim,
int spacedim,
typename Number>
2398 const unsigned int first_selected_component,
2399 const bool force_lexicographic_numbering)
2403 first_selected_component)
2404 , lexicographic_numbering(force_lexicographic_numbering ||
2405 this->renumber.empty())
2410template <
int n_components_,
int dim,
int spacedim,
typename Number>
2415 const unsigned int first_selected_component,
2416 const bool force_lexicographic_numbering)
2421 first_selected_component)
2422 , lexicographic_numbering(force_lexicographic_numbering ||
2423 this->renumber.empty())
2428template <
int n_components_,
int dim,
int spacedim,
typename Number>
2436 if (this->use_linear_path)
2437 this->
template do_reinit<false, true>();
2439 this->
template do_reinit<false, false>();
2444template <
int n_components_,
int dim,
int spacedim,
typename Number>
2448 internal_reinit_single_cell_state_mapping_info();
2449 this->must_reinitialize_pointers =
false;
2454template <
int n_components_,
int dim,
int spacedim,
typename Number>
2461 AssertThrow(this->mapping_info_on_the_fly.get() !=
nullptr,
2464 this->mapping_info_on_the_fly->reinit(cell, unit_points);
2465 this->must_reinitialize_pointers =
false;
2467 if (!this->fast_path)
2469 this->fe_values = std::make_shared<FEValues<dim, spacedim>>(
2473 std::vector<
Point<dim>>(unit_points.begin(), unit_points.end())),
2474 this->update_flags);
2475 this->fe_values->reinit(cell);
2478 if (this->use_linear_path)
2479 this->
template do_reinit<false, true>();
2481 this->
template do_reinit<false, false>();
2486template <
int n_components_,
int dim,
int spacedim,
typename Number>
2493 this->must_reinitialize_pointers =
false;
2495 if (this->use_linear_path)
2496 this->
template do_reinit<false, true>();
2498 this->
template do_reinit<false, false>();
2500 if (!this->fast_path)
2502 std::vector<Point<dim>> unit_points(this->n_q_points_scalar);
2504 for (
unsigned int v = 0; v < this->n_q_points_scalar; ++v)
2505 for (
unsigned int d = 0; d < dim; ++d)
2507 this->unit_point_ptr[v / n_lanes_internal][d][v % n_lanes_internal];
2509 this->fe_values = std::make_shared<FEValues<dim, spacedim>>(
2513 std::vector<
Point<dim>>(unit_points.begin(), unit_points.end())),
2514 this->update_flags);
2516 this->fe_values->reinit(
2517 this->mapping_info->get_cell_iterator(this->current_cell_index));
2523template <
int n_components_,
int dim,
int spacedim,
typename Number>
2524template <std::
size_t str
ide_view>
2536 if (this->must_reinitialize_pointers)
2537 internal_reinit_single_cell_state_mapping_info();
2539 if (this->n_q_points == 0)
2542 if (this->fe->n_components() > 1)
2546 n_components * this->fe->dofs_per_cell);
2548 if (this->fast_path)
2550 if (this->use_linear_path)
2551 evaluate_fast<true>(solution_values, evaluation_flags);
2553 evaluate_fast<false>(solution_values, evaluation_flags);
2556 evaluate_slow(solution_values, evaluation_flags);
2561template <
int n_components_,
int dim,
int spacedim,
typename Number>
2568 solution_values.
size()),
2574template <
int n_components_,
int dim,
int spacedim,
typename Number>
2575template <std::
size_t str
ide_view>
2580 const bool sum_into_values)
2582 do_integrate<true>(solution_values, integration_flags, sum_into_values);
2587template <
int n_components_,
int dim,
int spacedim,
typename Number>
2592 const bool sum_into_values)
2595 solution_values.
size()),
2602template <
int n_components_,
int dim,
int spacedim,
typename Number>
2610 for (
const auto point_index : this->quadrature_point_indices())
2611 return_value += values[point_index] * this->JxW(point_index);
2613 return ETT::sum_value(return_value);
2618template <
int n_components_,
int dim,
int spacedim,
typename Number>
2625 "Calling this function only makes sense in fully vectorized mode."));
2626 if (q == n_q_batches - 1)
2628 const unsigned int n_filled_lanes =
2629 n_q_points_scalar & (n_lanes_user_interface - 1);
2630 if (n_filled_lanes == 0)
2631 return n_lanes_user_interface;
2633 return n_filled_lanes;
2636 return n_lanes_user_interface;
2641template <
int n_components_,
int dim,
int spacedim,
typename Number>
2642template <std::
size_t str
ide_view>
2647 const bool sum_into_values)
2649 do_integrate<false>(solution_values, integration_flags, sum_into_values);
2654template <
int n_components_,
int dim,
int spacedim,
typename Number>
2659 const bool sum_into_values)
2662 solution_values.
size()),
2669template <
int n_components_,
int dim,
int spacedim,
typename Number>
2670template <
bool is_linear, std::
size_t str
ide_view>
2675 const unsigned int dofs_per_comp =
2678 for (
unsigned int comp = 0; comp < n_components; ++comp)
2680 const std::size_t offset =
2681 (this->component_in_base_element + comp) * dofs_per_comp;
2683 if ((is_linear && n_components == 1) || lexicographic_numbering)
2685 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
2686 ETT::read_value(solution_values[i + offset],
2688 this->solution_renumbered[i]);
2695 if (n_components > this->fe->n_components())
2696 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
2697 ETT::read_value(solution_values[this->renumber[i] + offset],
2699 this->solution_renumbered[i]);
2702 const unsigned int *renumber_ptr = this->renumber.data() + offset;
2703 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
2704 ETT::read_value(solution_values[renumber_ptr[i]],
2706 this->solution_renumbered[i]);
2714template <
int n_components_,
int dim,
int spacedim,
typename Number>
2715template <
bool is_linear, std::
size_t str
ide_view>
2720 const unsigned int n_shapes,
2721 const unsigned int qb,
2727 std::array<vectorized_value_type, dim + 1> result;
2728 if constexpr (is_linear)
2730 if constexpr (n_components == 1)
2737 stride_view>(solution_values.
data(), this->unit_point_ptr[qb]);
2741 this->solution_renumbered.data(), this->unit_point_ptr[qb]);
2749 false>(this->shapes.data() + qb * n_shapes,
2751 this->solution_renumbered.data());
2752 gradient[0] = result[0];
2754 gradient[1] = result[1];
2756 gradient[2] = result[2];
2757 value = result[dim];
2761 if constexpr (is_linear)
2763 if constexpr (n_components == 1)
2768 stride_view>(solution_values.
data(), this->unit_point_ptr[qb]);
2771 this->solution_renumbered.data(), this->unit_point_ptr[qb]);
2779 this->shapes.data() + qb * n_shapes,
2781 this->solution_renumbered.data());
2787template <
int n_components_,
int dim,
int spacedim,
typename Number>
2788template <
bool is_linear, std::
size_t str
ide_view>
2794 if (!(is_linear && n_components == 1))
2795 prepare_evaluate_fast<is_linear>(solution_values);
2798 const unsigned int n_shapes = is_linear ? 2 : this->poly.size();
2800 for (
unsigned int qb = 0; qb < this->n_q_batches; ++qb)
2805 compute_evaluate_fast<is_linear>(
2806 solution_values, evaluation_flags, n_shapes, qb, value, gradient);
2810 for (
unsigned int v = 0, offset = qb * stride;
2811 v < stride && (stride == 1 || offset < this->n_q_points_scalar);
2813 ETT::set_value(value, v, this->values[offset]);
2821 for (
unsigned int v = 0, offset = qb * stride;
2822 v < stride && (stride == 1 || offset < this->n_q_points_scalar);
2826 ETT::set_gradient(gradient, v, unit_gradient);
2827 this->gradients[offset] =
2831 this->inverse_jacobian_ptr[0].
transpose(), unit_gradient) :
2834 ->inverse_jacobian_ptr[this->cell_type <=
2836 GeometryType::affine ?
2848template <
int n_components_,
int dim,
int spacedim,
typename Number>
2849template <std::
size_t str
ide_view>
2856 Assert(this->fe_values.get() !=
nullptr,
2858 "Not initialized. Please call FEPointEvaluation::reinit()!"));
2860 const std::size_t n_points = this->fe_values->get_quadrature().size();
2864 this->values.resize(this->n_q_points);
2865 std::fill(this->values.begin(), this->values.end(),
value_type());
2866 for (
unsigned int i = 0; i < this->fe->n_dofs_per_cell(); ++i)
2869 for (
unsigned int d = 0; d < n_components; ++d)
2870 if (this->nonzero_shape_function_component[i][d] &&
2871 (this->fe->is_primitive(i) || this->fe->is_primitive()))
2872 for (
unsigned int qb = 0, q = 0; q < n_points;
2873 ++qb, q += n_lanes_user_interface)
2874 for (
unsigned int v = 0;
2875 v < n_lanes_user_interface && q + v < n_points;
2877 ETT::access(this->values[qb],
2880 this->fe_values->shape_value(i, q + v) * value);
2881 else if (this->nonzero_shape_function_component[i][d])
2882 for (
unsigned int qb = 0, q = 0; q < n_points;
2883 ++qb, q += n_lanes_user_interface)
2884 for (
unsigned int v = 0;
2885 v < n_lanes_user_interface && q + v < n_points;
2887 ETT::access(this->values[qb],
2890 this->fe_values->shape_value_component(i,
2899 this->gradients.resize(this->n_q_points);
2900 std::fill(this->gradients.begin(),
2901 this->gradients.end(),
2903 for (
unsigned int i = 0; i < this->fe->n_dofs_per_cell(); ++i)
2906 for (
unsigned int d = 0; d < n_components; ++d)
2907 if (this->nonzero_shape_function_component[i][d] &&
2908 (this->fe->is_primitive(i) || this->fe->is_primitive()))
2909 for (
unsigned int qb = 0, q = 0; q < n_points;
2910 ++qb, q += n_lanes_user_interface)
2911 for (
unsigned int v = 0;
2912 v < n_lanes_user_interface && q + v < n_points;
2914 ETT::access(this->gradients[qb],
2917 this->fe_values->shape_grad(i, q + v) * value);
2918 else if (this->nonzero_shape_function_component[i][d])
2919 for (
unsigned int qb = 0, q = 0; q < n_points;
2920 ++qb, q += n_lanes_user_interface)
2921 for (
unsigned int v = 0;
2922 v < n_lanes_user_interface && q + v < n_points;
2925 this->gradients[qb],
2928 this->fe_values->shape_grad_component(i, q + v, d) * value);
2935template <
int n_components_,
int dim,
int spacedim,
typename Number>
2936template <
bool is_linear>
2940 const unsigned int n_shapes,
2941 const unsigned int qb,
2956 solution_values_vectorized_linear :
2957 this->solution_renumbered_vectorized.data(),
2958 this->unit_point_ptr[qb],
2965 this->shapes.data() + qb * n_shapes,
2968 is_linear ? solution_values_vectorized_linear :
2969 this->solution_renumbered_vectorized.data(),
2970 this->unit_point_ptr[qb],
2976template <
int n_components_,
int dim,
int spacedim,
typename Number>
2977template <
bool is_linear, std::
size_t str
ide_view>
2982 const bool sum_into_values)
2984 if (!sum_into_values && this->fe->n_components() > n_components)
2985 for (
unsigned int i = 0; i < solution_values.
size(); ++i)
2986 solution_values[i] = 0;
2988 const unsigned int dofs_per_comp =
2991 for (
unsigned int comp = 0; comp < n_components; ++comp)
2993 const std::size_t offset =
2994 (this->component_in_base_element + comp) * dofs_per_comp;
2996 if (is_linear || lexicographic_numbering)
2998 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
2999 if (sum_into_values)
3000 solution_values[i + offset] +=
3001 ETT::sum_value(comp,
3003 *(solution_values_vectorized_linear + i) :
3004 this->solution_renumbered_vectorized[i]);
3006 solution_values[i + offset] =
3007 ETT::sum_value(comp,
3009 *(solution_values_vectorized_linear + i) :
3010 this->solution_renumbered_vectorized[i]);
3017 if (n_components > this->fe->n_components())
3018 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
3019 if (sum_into_values)
3020 solution_values[this->renumber[i] + offset] +=
3021 ETT::sum_value(comp, this->solution_renumbered_vectorized[i]);
3023 solution_values[this->renumber[i] + offset] =
3024 ETT::sum_value(comp, this->solution_renumbered_vectorized[i]);
3027 const unsigned int *renumber_ptr = this->renumber.data() + offset;
3028 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
3029 if (sum_into_values)
3030 solution_values[renumber_ptr[i]] +=
3031 ETT::sum_value(comp,
3032 this->solution_renumbered_vectorized[i]);
3034 solution_values[renumber_ptr[i]] =
3035 ETT::sum_value(comp,
3036 this->solution_renumbered_vectorized[i]);
3044template <
int n_components_,
int dim,
int spacedim,
typename Number>
3045template <
bool do_JxW,
bool is_linear, std::
size_t str
ide_view>
3050 const bool sum_into_values)
3053 if constexpr (stride == 1)
3054 if (
const unsigned int n_filled_lanes =
3055 this->n_q_points_scalar & (n_lanes_internal - 1);
3059 for (
unsigned int v = n_filled_lanes; v < n_lanes_internal; ++v)
3060 ETT::set_zero_value(this->values.back(), v);
3062 for (
unsigned int v = n_filled_lanes; v < n_lanes_internal; ++v)
3063 ETT::set_zero_gradient(this->gradients.back(), v);
3067 solution_values_vectorized_linear = {};
3070 const unsigned int n_shapes = is_linear ? 2 : this->poly.size();
3072 const bool cartesian_cell =
3074 const bool affine_cell =
3076 for (
unsigned int qb = 0; qb < this->n_q_batches; ++qb)
3082 for (
unsigned int v = 0, offset = qb * stride;
3083 v < stride && (stride == 1 || offset < this->n_q_points_scalar);
3085 ETT::get_value(value,
3087 do_JxW ? this->values[offset] * this->JxW_ptr[offset] :
3088 this->values[offset]);
3091 for (
unsigned int v = 0, offset = qb * stride;
3092 v < stride && (stride == 1 || offset < this->n_q_points_scalar);
3096 do_JxW ? this->gradients[offset] * this->JxW_ptr[offset] :
3097 this->gradients[offset];
3105 this->inverse_jacobian_ptr[affine_cell ? 0 : offset],
3109 compute_integrate_fast<is_linear>(
3115 solution_values_vectorized_linear.data());
3119 finish_integrate_fast<is_linear>(solution_values,
3120 solution_values_vectorized_linear.
data(),
3126template <
int n_components_,
int dim,
int spacedim,
typename Number>
3127template <
bool do_JxW, std::
size_t str
ide_view>
3132 const bool sum_into_values)
3135 Assert(this->fe_values.get() !=
nullptr,
3137 "Not initialized. Please call FEPointEvaluation::reinit()!"));
3138 if (!sum_into_values)
3139 for (
unsigned int i = 0; i < solution_values.
size(); ++i)
3140 solution_values[i] = 0;
3142 const std::size_t n_points = this->fe_values->get_quadrature().
size();
3147 for (
unsigned int i = 0; i < this->fe->n_dofs_per_cell(); ++i)
3149 for (
unsigned int d = 0; d < n_components; ++d)
3150 if (this->nonzero_shape_function_component[i][d] &&
3151 (this->fe->is_primitive(i) || this->fe->is_primitive()))
3152 for (
unsigned int qb = 0, q = 0; q < n_points;
3153 ++qb, q += n_lanes_user_interface)
3154 for (
unsigned int v = 0;
3155 v < n_lanes_user_interface && q + v < n_points;
3157 solution_values[i] +=
3158 this->fe_values->shape_value(i, q + v) *
3159 ETT::access(this->values[qb], v, d) *
3160 (do_JxW ? this->fe_values->JxW(q + v) : 1.);
3161 else if (this->nonzero_shape_function_component[i][d])
3162 for (
unsigned int qb = 0, q = 0; q < n_points;
3163 ++qb, q += n_lanes_user_interface)
3164 for (
unsigned int v = 0;
3165 v < n_lanes_user_interface && q + v < n_points;
3167 solution_values[i] +=
3168 this->fe_values->shape_value_component(i, q + v, d) *
3169 ETT::access(this->values[qb], v, d) *
3170 (do_JxW ? this->fe_values->JxW(q + v) : 1.);
3177 for (
unsigned int i = 0; i < this->fe->n_dofs_per_cell(); ++i)
3179 for (
unsigned int d = 0; d < n_components; ++d)
3180 if (this->nonzero_shape_function_component[i][d] &&
3181 (this->fe->is_primitive(i) || this->fe->is_primitive()))
3182 for (
unsigned int qb = 0, q = 0; q < n_points;
3183 ++qb, q += n_lanes_user_interface)
3184 for (
unsigned int v = 0;
3185 v < n_lanes_user_interface && q + v < n_points;
3187 solution_values[i] +=
3188 this->fe_values->shape_grad(i, q + v) *
3189 ETT::access(this->gradients[qb], v, d) *
3190 (do_JxW ? this->fe_values->JxW(q + v) : 1.);
3191 else if (this->nonzero_shape_function_component[i][d])
3192 for (
unsigned int qb = 0, q = 0; q < n_points;
3193 ++qb, q += n_lanes_user_interface)
3194 for (
unsigned int v = 0;
3195 v < n_lanes_user_interface && q + v < n_points;
3197 solution_values[i] +=
3198 this->fe_values->shape_grad_component(i, q + v, d) *
3199 ETT::access(this->gradients[qb], v, d) *
3200 (do_JxW ? this->fe_values->JxW(q + v) : 1.);
3207template <
int n_components_,
int dim,
int spacedim,
typename Number>
3208template <
bool do_JxW, std::
size_t str
ide_view>
3213 const bool sum_into_values)
3215 if (this->must_reinitialize_pointers)
3216 internal_reinit_single_cell_state_mapping_info();
3220 if (this->n_q_points == 0 ||
3222 (integration_flags &
3225 if (!sum_into_values)
3226 for (
unsigned int i = 0; i < solution_values.
size(); ++i)
3227 solution_values[i] = 0;
3232 !do_JxW || this->JxW_ptr !=
nullptr,
3234 "JxW pointer is not set! If you do not want to integrate() use test_and_sum()"));
3236 if (this->fe->n_components() > 1)
3240 n_components * this->fe->dofs_per_cell);
3242 if (this->fast_path)
3244 if (this->use_linear_path)
3245 integrate_fast<do_JxW, true>(solution_values,
3249 integrate_fast<do_JxW, false>(solution_values,
3254 integrate_slow<do_JxW>(solution_values, integration_flags, sum_into_values);
3259template <
int n_components_,
int dim,
int spacedim,
typename Number>
3262 const unsigned int point_index)
const
3265 Assert(this->normal_ptr !=
nullptr,
3267 ExcFEPointEvaluationAccessToUninitializedMappingField(
3268 "update_normal_vectors"));
3269 return this->normal_ptr[point_index];
3274template <
int n_components_,
int dim,
int spacedim,
typename Number>
3280 const unsigned int point_index)
const
3285 if constexpr (n_components == 1)
3287 this->gradients[point_index] * normal_vector(point_index);
3289 for (
unsigned int comp = 0; comp < n_components; ++comp)
3290 normal_derivative[comp] =
3291 this->gradients[point_index][comp] * normal_vector(point_index);
3293 return normal_derivative;
3298template <
int n_components_,
int dim,
int spacedim,
typename Number>
3302 const unsigned int point_index)
3305 if constexpr (n_components == 1)
3306 this->gradients[point_index] = value * normal_vector(point_index);
3308 for (
unsigned int comp = 0; comp < n_components; ++comp)
3309 this->gradients[point_index][comp] =
3310 value[comp] * normal_vector(point_index);
3315template <
int n_components_,
int dim,
int spacedim,
typename Number>
3320 const bool is_interior,
3321 const unsigned int first_selected_component)
3325 first_selected_component,
3331template <
int n_components_,
int dim,
int spacedim,
typename Number>
3335 const unsigned int face_number)
3338 this->current_face_number = face_number;
3339 this->must_reinitialize_pointers =
false;
3341 if (this->use_linear_path)
3342 this->
template do_reinit<true, true>();
3344 this->
template do_reinit<true, false>();
3349template <
int n_components_,
int dim,
int spacedim,
typename Number>
3352 const unsigned int face_index)
3354 this->current_cell_index = face_index;
3355 this->current_face_number =
3356 this->mapping_info->get_face_number(face_index, this->is_interior);
3357 this->must_reinitialize_pointers =
false;
3359 if (this->use_linear_path)
3360 this->
template do_reinit<true, true>();
3362 this->
template do_reinit<true, false>();
3367template <
int n_components_,
int dim,
int spacedim,
typename Number>
3368template <std::
size_t str
ide_view>
3374 Assert(!this->must_reinitialize_pointers,
3375 ExcMessage(
"Object has not been reinitialized!"));
3377 if (this->n_q_points == 0)
3388 if (this->use_linear_path)
3389 do_evaluate<true>(solution_values, evaluation_flags);
3391 do_evaluate<false>(solution_values, evaluation_flags);
3396template <
int n_components_,
int dim,
int spacedim,
typename Number>
3403 solution_values.
size()),
3409template <
int n_components_,
int dim,
int spacedim,
typename Number>
3410template <
bool is_linear, std::
size_t str
ide_view>
3416 const unsigned int dofs_per_comp =
3420 if (stride_view == 1 && this->component_in_base_element == 0 &&
3421 (is_linear || this->renumber.empty()))
3422 input = solution_values.
data();
3425 for (
unsigned int comp = 0; comp < n_components; ++comp)
3427 const std::size_t offset =
3428 (this->component_in_base_element + comp) * dofs_per_comp;
3430 if (is_linear || this->renumber.empty())
3432 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
3433 this->scratch_data_scalar[i + comp * dofs_per_comp] =
3434 solution_values[i + offset];
3438 if (n_components > this->fe->n_components())
3439 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
3440 ETT::read_value(solution_values[this->renumber[i] + offset],
3442 this->solution_renumbered[i]);
3445 const unsigned int *renumber_ptr =
3446 this->renumber.
data() + offset;
3447 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
3448 this->scratch_data_scalar[i + comp * dofs_per_comp] =
3449 solution_values[renumber_ptr[i]];
3453 input = this->scratch_data_scalar.
data();
3457 this->scratch_data_scalar.begin() + dofs_per_comp * n_components;
3460 template interpolate<true, false>(n_components,
3465 this->current_face_number);
3467 do_evaluate_in_face<is_linear, 1>(output, evaluation_flags);
3472template <
int n_components_,
int dim,
int spacedim,
typename Number>
3473template <std::
size_t str
ide_view>
3478 const bool sum_into_values)
3480 Assert(!this->must_reinitialize_pointers,
3481 ExcMessage(
"Object has not been reinitialized!"));
3485 if (this->n_q_points == 0 ||
3487 (integration_flags &
3490 if (!sum_into_values)
3491 for (
unsigned int i = 0; i < solution_values.
size(); ++i)
3492 solution_values[i] = 0;
3498 if (this->use_linear_path)
3499 do_integrate<true, true>(solution_values,
3503 do_integrate<true, false>(solution_values,
3510template <
int n_components_,
int dim,
int spacedim,
typename Number>
3515 const bool sum_into_values)
3518 solution_values.
size()),
3525template <
int n_components_,
int dim,
int spacedim,
typename Number>
3526template <std::
size_t str
ide_view>
3531 const bool sum_into_values)
3533 Assert(!this->must_reinitialize_pointers,
3534 ExcMessage(
"Object has not been reinitialized!"));
3538 if (this->n_q_points == 0 ||
3540 (integration_flags &
3543 if (!sum_into_values)
3544 for (
unsigned int i = 0; i < solution_values.
size(); ++i)
3545 solution_values[i] = 0;
3551 if (this->use_linear_path)
3552 do_integrate<false, true>(solution_values,
3556 do_integrate<false, false>(solution_values,
3563template <
int n_components_,
int dim,
int spacedim,
typename Number>
3568 const bool sum_into_values)
3571 solution_values.
size()),
3578template <
int n_components_,
int dim,
int spacedim,
typename Number>
3579template <
bool do_JxW,
bool is_linear, std::
size_t str
ide_view>
3584 const bool sum_into_values)
3586 if (!sum_into_values && this->fe->n_components() > n_components)
3587 for (
unsigned int i = 0; i < solution_values.
size(); ++i)
3588 solution_values[i] = 0;
3590 do_integrate_in_face<do_JxW, is_linear, 1>(this->scratch_data_scalar.begin(),
3594 ScalarNumber *input = this->scratch_data_scalar.begin();
3596 if (stride_view == 1 && this->component_in_base_element == 0 &&
3597 (is_linear || this->renumber.empty()))
3599 if (sum_into_values)
3601 FEFaceNormalEvaluationImpl<dim, is_linear ? 1 : -1,
ScalarNumber>::
3602 template interpolate<false, true>(n_components,
3606 solution_values.
data(),
3607 this->current_face_number);
3610 FEFaceNormalEvaluationImpl<dim, is_linear ? 1 : -1,
ScalarNumber>::
3611 template interpolate<false, false>(n_components,
3615 solution_values.
data(),
3616 this->current_face_number);
3620 const unsigned int dofs_per_comp_face =
3621 is_linear ?
Utilities::pow(2, dim - 1) : this->dofs_per_component_face;
3623 const unsigned int size_input = 3 * dofs_per_comp_face * n_components;
3627 FEFaceNormalEvaluationImpl<dim, is_linear ? 1 : -1,
ScalarNumber>::
3628 template interpolate<false, false>(n_components,
3633 this->current_face_number);
3635 const unsigned int dofs_per_comp =
3638 for (
unsigned int comp = 0; comp < n_components; ++comp)
3640 const std::size_t offset =
3641 (this->component_in_base_element + comp) * dofs_per_comp;
3643 if (is_linear || this->renumber.empty())
3645 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
3646 if (sum_into_values)
3647 solution_values[i + offset] +=
3648 output[i + comp * dofs_per_comp];
3650 solution_values[i + offset] =
3651 output[i + comp * dofs_per_comp];
3655 if (n_components > this->fe->n_components())
3656 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
3657 if (sum_into_values)
3658 solution_values[this->renumber[i] + offset] +=
3659 ETT::sum_value(comp,
3660 this->solution_renumbered_vectorized[i]);
3662 solution_values[this->renumber[i] + offset] =
3663 ETT::sum_value(comp,
3664 this->solution_renumbered_vectorized[i]);
3667 const unsigned int *renumber_ptr =
3668 this->renumber.data() + offset;
3669 for (
unsigned int i = 0; i < dofs_per_comp; ++i)
3670 if (sum_into_values)
3671 solution_values[renumber_ptr[i]] +=
3672 output[i + comp * dofs_per_comp];
3674 solution_values[renumber_ptr[i]] =
3675 output[i + comp * dofs_per_comp];
3684template <
int n_components_,
int dim,
int spacedim,
typename Number>
3685template <
int str
ide_face_dof>
3691 if (this->use_linear_path)
3692 do_evaluate_in_face<true, stride_face_dof>(face_dof_values,
3695 do_evaluate_in_face<false, stride_face_dof>(face_dof_values,
3701template <
int n_components_,
int dim,
int spacedim,
typename Number>
3702template <
bool is_linear,
int str
ide_face_dof>
3709 if constexpr (n_components == 1)
3710 face_dof_values_ptr = face_dof_values;
3713 const unsigned int dofs_per_comp_face =
3714 is_linear ?
Utilities::pow(2, dim - 1) : this->dofs_per_component_face;
3715 for (
unsigned int comp = 0; comp < n_components; ++comp)
3716 for (
unsigned int i = 0; i < 2 * dofs_per_comp_face; ++i)
3717 ETT::read_value(face_dof_values[(i + comp * 3 * dofs_per_comp_face) *
3720 this->solution_renumbered[i]);
3722 face_dof_values_ptr = this->solution_renumbered.data();
3725 constexpr int stride_face_dof_actual =
3726 n_components == 1 ? stride_face_dof : 1;
3729 const unsigned int n_shapes = is_linear ? 2 : this->poly.size();
3731 for (
unsigned int qb = 0; qb < this->n_q_batches; ++qb)
3738 const std::array<vectorized_value_type, dim + 1> interpolated_value =
3745 stride_face_dof_actual>(face_dof_values_ptr,
3746 this->unit_point_faces_ptr[qb]) :
3753 stride_face_dof_actual>(this->shapes_faces.data() +
3756 face_dof_values_ptr);
3758 value = interpolated_value[dim - 1];
3761 if (this->current_face_number / 2 == 0)
3763 gradient[0] = interpolated_value[dim];
3765 gradient[1] = interpolated_value[0];
3767 gradient[2] = interpolated_value[1];
3769 else if (this->current_face_number / 2 == 1)
3772 gradient[1] = interpolated_value[dim];
3775 gradient[0] = interpolated_value[1];
3776 gradient[2] = interpolated_value[0];
3779 gradient[0] = interpolated_value[0];
3783 else if (this->current_face_number / 2 == 2)
3787 gradient[0] = interpolated_value[0];
3788 gradient[1] = interpolated_value[1];
3789 gradient[2] = interpolated_value[dim];
3804 stride_face_dof_actual>(face_dof_values_ptr,
3805 this->unit_point_faces_ptr[qb]) :
3811 stride_face_dof_actual>(this->shapes_faces.data() +
3814 face_dof_values_ptr);
3819 for (
unsigned int v = 0, offset = qb * stride;
3820 v < stride && (stride == 1 || offset < this->n_q_points_scalar);
3822 ETT::set_value(value, v, this->values[offset]);
3830 for (
unsigned int v = 0, offset = qb * stride;
3831 v < stride && (stride == 1 || offset < this->n_q_points_scalar);
3835 ETT::set_gradient(gradient, v, unit_gradient);
3836 this->gradients[offset] =
3840 this->inverse_jacobian_ptr[0].
transpose(), unit_gradient) :
3843 ->inverse_jacobian_ptr[this->cell_type <=
3845 GeometryType::affine ?
3857template <
int n_components_,
int dim,
int spacedim,
typename Number>
3858template <
int str
ide_face_dof>
3863 const bool sum_into_values)
3865 if (this->use_linear_path)
3866 do_integrate_in_face<true, true, stride_face_dof>(face_dof_values,
3870 do_integrate_in_face<true, false, stride_face_dof>(face_dof_values,
3877template <
int n_components_,
int dim,
int spacedim,
typename Number>
3878template <
bool do_JxW,
bool is_linear,
int str
ide_face_dof>
3884 const bool sum_into_values)
3887 if constexpr (stride == 1)
3888 if (
const unsigned int n_filled_lanes =
3889 this->n_q_points_scalar & (n_lanes_internal - 1);
3893 for (
unsigned int v = n_filled_lanes; v < n_lanes_internal; ++v)
3894 ETT::set_zero_value(this->values.back(), v);
3896 for (
unsigned int v = n_filled_lanes; v < n_lanes_internal; ++v)
3897 ETT::set_zero_gradient(this->gradients.back(), v);
3902 solution_values_vectorized_linear = {};
3905 const unsigned int n_shapes = is_linear ? 2 : this->poly.size();
3907 const bool cartesian_cell =
3909 const bool affine_cell =
3911 for (
unsigned int qb = 0; qb < this->n_q_batches; ++qb)
3917 for (
unsigned int v = 0, offset = qb * stride;
3918 v < stride && (stride == 1 || offset < this->n_q_points_scalar);
3920 ETT::get_value(value,
3922 do_JxW ? this->values[offset] * this->JxW_ptr[offset] :
3923 this->values[offset]);
3926 for (
unsigned int v = 0, offset = qb * stride;
3927 v < stride && (stride == 1 || offset < this->n_q_points_scalar);
3931 do_JxW ? this->gradients[offset] * this->JxW_ptr[offset] :
3932 this->gradients[offset];
3940 this->inverse_jacobian_ptr[affine_cell ? 0 : offset],
3946 std::array<vectorized_value_type, 2> value_face = {};
3949 value_face[0] = value;
3952 if (this->current_face_number / 2 == 0)
3954 value_face[1] = gradient[0];
3956 gradient_in_face[0] = gradient[1];
3958 gradient_in_face[1] = gradient[2];
3960 else if (this->current_face_number / 2 == 1)
3963 value_face[1] = gradient[1];
3966 gradient_in_face[0] = gradient[2];
3967 gradient_in_face[1] = gradient[0];
3970 gradient_in_face[0] = gradient[0];
3974 else if (this->current_face_number / 2 == 2)
3978 value_face[1] = gradient[2];
3979 gradient_in_face[0] = gradient[0];
3980 gradient_in_face[1] = gradient[1];
3993 2>(this->shapes_faces.data() + qb * n_shapes,
3997 is_linear ? solution_values_vectorized_linear.data() :
3998 this->solution_renumbered_vectorized.data(),
3999 this->unit_point_faces_ptr[qb],
4007 this->shapes_faces.data() + qb * n_shapes,
4010 is_linear ? solution_values_vectorized_linear.data() :
4011 this->solution_renumbered_vectorized.data(),
4012 this->unit_point_faces_ptr[qb],
4016 const unsigned int dofs_per_comp_face =
4017 is_linear ?
Utilities::pow(2, dim - 1) : this->dofs_per_component_face;
4019 for (
unsigned int comp = 0; comp < n_components; ++comp)
4020 for (
unsigned int i = 0; i < 2 * dofs_per_comp_face; ++i)
4021 if (sum_into_values)
4022 face_dof_values[(i + comp * 3 * dofs_per_comp_face) *
4024 ETT::sum_value(comp,
4026 *(solution_values_vectorized_linear.data() + i) :
4027 this->solution_renumbered_vectorized[i]);
4029 face_dof_values[(i + comp * 3 * dofs_per_comp_face) * stride_face_dof] =
4030 ETT::sum_value(comp,
4032 *(solution_values_vectorized_linear.data() + i) :
4033 this->solution_renumbered_vectorized[i]);
4038template <
int n_components_,
int dim,
int spacedim,
typename Number>
4041 const unsigned int point_index)
const
4044 Assert(this->normal_ptr !=
nullptr,
4046 ExcFEPointEvaluationAccessToUninitializedMappingField(
4047 "update_normal_vectors"));
4051 for (
unsigned int d = 0; d < dim; ++d)
4060 return this->normal_ptr[point_index];
4066template <
int n_components_,
int dim,
int spacedim,
typename Number>
4077 if constexpr (n_components == 1)
4079 this->gradients[point_index] * normal_vector(point_index);
4081 for (
unsigned int comp = 0; comp < n_components; ++comp)
4082 normal_derivative[comp] =
4083 this->gradients[point_index][comp] * normal_vector(point_index);
4085 return normal_derivative;
4090template <
int n_components_,
int dim,
int spacedim,
typename Number>
4094 const unsigned int point_index)
4097 if constexpr (n_components == 1)
4098 this->gradients[point_index] = value * normal_vector(point_index);
4100 for (
unsigned int comp = 0; comp < n_components; ++comp)
4101 this->gradients[point_index][comp] =
4102 value[comp] * normal_vector(point_index);
value_type * data() const noexcept
typename ETT::vectorized_value_type vectorized_value_type
static constexpr std::size_t n_lanes_internal
void do_integrate_in_face(ScalarNumber *face_dof_values, const EvaluationFlags::EvaluationFlags &integration_flags, const bool sum_into_values)
void integrate_in_face(ScalarNumber *face_dof_values, const EvaluationFlags::EvaluationFlags &integration_flags, const bool sum_into_values=false)
typename ETT::scalar_value_type scalar_value_type
typename internal::VectorizedArrayTrait< Number >::value_type ScalarNumber
void evaluate(const StridedArrayView< const ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
void do_evaluate_in_face(const ScalarNumber *face_dof_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
void submit_normal_derivative(const value_type &, const unsigned int point_index)
typename internal::FEPointEvaluation::EvaluatorTypeTraits< dim, spacedim, n_components, Number > ETT
static constexpr std::size_t stride
typename ETT::interface_vectorized_unit_gradient_type interface_vectorized_unit_gradient_type
void do_evaluate(const StridedArrayView< const ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
static constexpr unsigned int n_components
static constexpr std::size_t n_lanes_user_interface
typename ETT::real_gradient_type gradient_type
FEFacePointEvaluation(const NonMatching::MappingInfo< dim, spacedim, Number > &mapping_info, const FiniteElement< dim, spacedim > &fe, const bool is_interior=true, const unsigned int first_selected_component=0)
void evaluate_in_face(const ScalarNumber *face_dof_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
void reinit(const unsigned int cell_index, const unsigned int face_number)
void test_and_sum(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags, const bool sum_into_values=false)
typename ETT::unit_gradient_type unit_gradient_type
const value_type get_normal_derivative(const unsigned int point_index) const
void do_integrate(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags, const bool sum_into_values)
void integrate(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags, const bool sum_into_values=false)
static constexpr unsigned int dimension
Tensor< 1, spacedim, Number > normal_vector(const unsigned int point_index) const
typename ETT::value_type value_type
typename ::internal::VectorizedArrayTrait< Number >::vectorized_value_type VectorizedArrayType
ObserverPointer< const Mapping< dim, spacedim > > mapping
const DerivativeForm< 1, dim, spacedim, Number > * jacobian_ptr
std::unique_ptr< NonMatching::MappingInfo< dim, spacedim, Number > > mapping_info_on_the_fly
std::vector< gradient_type > gradients
unsigned int dofs_per_component
typename ETT::interface_vectorized_unit_gradient_type interface_vectorized_unit_gradient_type
Number get_divergence(const unsigned int point_index) const
unsigned int dofs_per_component_face
Number JxW(const unsigned int point_index) const
const UpdateFlags update_flags
static constexpr std::size_t n_lanes_user_interface
static constexpr std::size_t stride
internal::MatrixFreeFunctions::GeometryType cell_type
std::vector< Polynomials::Polynomial< double > > poly
curl_type get_curl(const unsigned int point_index) const
Point< spacedim, Number > real_point(const unsigned int point_index) const
const unsigned int n_q_points_scalar
const Point< dim, VectorizedArrayType > * unit_point_ptr
FEPointEvaluationBase(FEPointEvaluationBase &&other) noexcept
AlignedVector< ScalarNumber > scratch_data_scalar
std_cxx20::ranges::iota_view< unsigned int, unsigned int > quadrature_point_indices() const
const value_type & get_value(const unsigned int point_index) const
const Point< dim - 1, VectorizedArrayType > * unit_point_faces_ptr
std::vector< scalar_value_type > solution_renumbered
const unsigned int n_q_batches
ObserverPointer< const FiniteElement< dim, spacedim > > fe
std::vector< std::array< bool, n_components > > nonzero_shape_function_component
Point< spacedim, Number > quadrature_point(const unsigned int point_index) const
unsigned int n_active_entries_per_quadrature_batch(unsigned int q)
const gradient_type & get_gradient(const unsigned int point_index) const
std::shared_ptr< FEValues< dim, spacedim > > fe_values
FEPointEvaluationBase(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const UpdateFlags update_flags, const unsigned int first_selected_component=0)
std::vector< unsigned int > renumber
std::vector< value_type > values
AlignedVector<::ndarray< VectorizedArrayType, 2, dim - 1 > > shapes_faces
Point< dim, Number > unit_point(const unsigned int point_index) const
const unsigned int n_q_points
void submit_divergence(const Number &value, const unsigned int point_index)
bool must_reinitialize_pointers
const Tensor< 1, spacedim, Number > * normal_ptr
DerivativeForm< 1, spacedim, dim, Number > inverse_jacobian(const unsigned int point_index) const
AlignedVector< vectorized_value_type > solution_renumbered_vectorized
static constexpr std::size_t n_lanes_internal
ObserverPointer< const NonMatching::MappingInfo< dim, spacedim, Number > > mapping_info
const DerivativeForm< 1, spacedim, dim, Number > * inverse_jacobian_ptr
AlignedVector<::ndarray< VectorizedArrayType, 2, dim > > shapes
typename ETT::value_type value_type
unsigned int current_cell_index
scalar_value_type integrate_value() const
void submit_gradient(const gradient_type &, const unsigned int point_index)
void setup(const unsigned int first_selected_component)
typename ETT::scalar_value_type scalar_value_type
static constexpr unsigned int dimension
typename ::internal::VectorizedArrayTrait< Number >::vectorized_value_type VectorizedArrayType
typename ETT::vectorized_value_type vectorized_value_type
static constexpr unsigned int n_components
typename internal::FEPointEvaluation::EvaluatorTypeTraits< dim, spacedim, n_components, Number > ETT
unsigned int current_face_number
FEPointEvaluationBase(FEPointEvaluationBase &other) noexcept
DerivativeForm< 1, dim, spacedim, Number > jacobian(const unsigned int point_index) const
typename ETT::real_gradient_type gradient_type
const Point< spacedim, Number > * real_point_ptr
FEPointEvaluationBase(const NonMatching::MappingInfo< dim, spacedim, Number > &mapping_info, const FiniteElement< dim, spacedim > &fe, const unsigned int first_selected_component=0, const bool is_interior=true)
unsigned int component_in_base_element
internal::MatrixFreeFunctions::ShapeInfo< ScalarNumber > shape_info
void submit_value(const value_type &value, const unsigned int point_index)
typename internal::VectorizedArrayTrait< Number >::value_type ScalarNumber
typename ETT::curl_type curl_type
static constexpr std::size_t stride
void integrate_slow(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags, const bool sum_into_values)
static constexpr unsigned int dimension
typename ETT::value_type value_type
void do_integrate(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags, const bool sum_into_values)
void evaluate_fast(const StridedArrayView< const ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
typename ETT::scalar_value_type scalar_value_type
typename ETT::unit_gradient_type unit_gradient_type
void evaluate(const StridedArrayView< const ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
const value_type get_normal_derivative(const unsigned int point_index) const
void prepare_evaluate_fast(const StridedArrayView< const ScalarNumber, stride_view > &solution_values)
void test_and_sum(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags, const bool sum_into_values=false)
void integrate(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags, const bool sum_into_values=false)
typename internal::VectorizedArrayTrait< Number >::value_type ScalarNumber
typename ETT::vectorized_value_type vectorized_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_unit_gradient_type gradient, vectorized_value_type *solution_values_vectorized_linear)
typename ::internal::VectorizedArrayTrait< Number >::vectorized_value_type VectorizedArrayType
typename ETT::real_gradient_type gradient_type
void submit_normal_derivative(const value_type &, const unsigned int point_index)
void evaluate_slow(const StridedArrayView< const ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
static constexpr std::size_t n_lanes_internal
static constexpr unsigned int n_components
void finish_integrate_fast(const StridedArrayView< ScalarNumber, stride_view > &solution_values, vectorized_value_type *solution_values_vectorized_linear, const bool sum_into_values)
typename internal::FEPointEvaluation::EvaluatorTypeTraits< dim, spacedim, n_components, Number > ETT
void internal_reinit_single_cell_state_mapping_info()
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_unit_gradient_type &gradient)
void integrate_fast(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags, const bool sum_into_values)
static constexpr std::size_t n_lanes_user_interface
const bool lexicographic_numbering
FEPointEvaluation(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const UpdateFlags update_flags, const unsigned int first_selected_component=0, const bool force_lexicographic_numbering=false)
typename ETT::interface_vectorized_unit_gradient_type interface_vectorized_unit_gradient_type
Tensor< 1, spacedim, Number > normal_vector(const unsigned int point_index) const
Abstract base class for mapping classes.
value_type * data() const noexcept
Tensor< rank, dim, Number > sum(const Tensor< rank, dim, Number > &local, const MPI_Comm mpi_communicator)
#define DEAL_II_DEPRECATED
#define DEAL_II_NAMESPACE_OPEN
constexpr bool running_in_debug_mode()
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ASSERT_UNREACHABLE()
#define DEAL_II_NOT_IMPLEMENTED()
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcFEPointEvaluationAccessToUninitializedMappingField(std::string arg1)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcNotInitialized()
#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.
* * * RotationFunction< dim, Number >::RotationFunction Number(dim)
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)
std::conditional_t< dim==3, Tensor< 1, 3, NumberType >, std::conditional_t< dim==2, NumberType, std::monostate > > CurlType
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={})
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)
void compute_values_of_array_in_pairs(::ndarray< Number, 2, dim > *shapes, const std::vector< Polynomials::Polynomial< double > > &poly, const Point< dim, Number > &p0, const Point< dim, Number > &p1)
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 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)
ProductTypeNoPoint< Number, Number2 >::type evaluate_tensor_product_value_linear(const Number *values, const Point< dim, Number2 > &p)
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 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)
constexpr unsigned int invalid_unsigned_int
boost::integer_range< IncrementableType > iota_view
typename internal::ndarray::HelperArray< T, Ns... >::type ndarray
static void set_zero_gradient(unit_gradient_type &value, const unsigned int vector_lane)
static void access(value_type &value, const unsigned int vector_lane, const unsigned int component, const ScalarNumber &shape_value)
static void set_value(const vectorized_value_type &value, const unsigned int vector_lane, scalar_value_type &result)
static Tensor< 1, dim, ScalarNumber > access(const real_gradient_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_zero_value(value_type &value, const unsigned int vector_lane)
static void set_gradient(const interface_vectorized_unit_gradient_type &value, const unsigned int vector_lane, unit_gradient_type &result)
static void read_value(const ScalarNumber vector_entry, const unsigned int component, scalar_value_type &result)
internal::CurlType< dim, Number > curl_type
static void access(real_gradient_type &value, const unsigned int vector_lane, const unsigned int component, const Tensor< 1, dim, ScalarNumber > &shape_gradient)
static scalar_value_type sum_value(const vectorized_value_type &result)
static scalar_value_type sum_value(const scalar_value_type &result)
static ScalarNumber sum_value(const unsigned int component, const vectorized_value_type &result)
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)
typename ::internal::VectorizedArrayTrait< Number >::vectorized_value_type VectorizedArrayType
static void get_gradient(interface_vectorized_unit_gradient_type &value, const unsigned int vector_lane, const unit_gradient_type &result)
static void set_value(const vectorized_value_type &value, const unsigned int, vectorized_value_type &result)
typename internal::VectorizedArrayTrait< Number >::value_type ScalarNumber
static ScalarNumber access(const value_type &value, const unsigned int vector_lane, const unsigned int)
static void get_gradient(vectorized_unit_gradient_type &value, const unsigned int, const vectorized_unit_gradient_type &result)
static scalar_value_type sum_value(const scalar_value_type &result)
static void get_value(vectorized_value_type &value, const unsigned int, const vectorized_value_type &result)
static void set_gradient(const vectorized_unit_gradient_type &value, const unsigned int vector_lane, scalar_unit_gradient_type &result)
static void set_zero_value(value_type &value, const unsigned int vector_lane)
static Tensor< 1, spacedim, ScalarNumber > access(const real_gradient_type &value, const unsigned int vector_lane, const unsigned int)
static void set_value(const vectorized_value_type &value, const unsigned int, vectorized_value_type &result)
internal::CurlType< dim, Number > curl_type
VectorizedArrayType vectorized_value_type
typename internal::VectorizedArrayTrait< Number >::value_type ScalarNumber
static void get_value(vectorized_value_type &value, const unsigned int vector_lane, const scalar_value_type &result)
static scalar_value_type sum_value(const vectorized_value_type &result)
static void access(real_gradient_type &value, const unsigned int vector_lane, const unsigned int, const Tensor< 1, spacedim, ScalarNumber > &shape_gradient)
static void set_gradient(const vectorized_unit_gradient_type &value, const unsigned int, vectorized_unit_gradient_type &result)
ScalarNumber scalar_value_type
static void set_value(const vectorized_value_type &value, const unsigned int vector_lane, scalar_value_type &result)
static void set_zero_gradient(real_gradient_type &value, const unsigned int vector_lane)
static void access(value_type &value, const unsigned int vector_lane, const unsigned int, const ScalarNumber &shape_value)
static void get_gradient(vectorized_unit_gradient_type &value, const unsigned int vector_lane, const scalar_unit_gradient_type &result)
static ScalarNumber sum_value(const unsigned int, const vectorized_value_type &result)
static void read_value(const ScalarNumber vector_entry, const unsigned int, scalar_value_type &result)
typename ::internal::VectorizedArrayTrait< Number >::vectorized_value_type VectorizedArrayType
static Tensor< 1, spacedim, ScalarNumber > access(const real_gradient_type &value, const unsigned int vector_lane, const unsigned int component)
static void get_gradient(interface_vectorized_unit_gradient_type &value, const unsigned int vector_lane, const DerivativeForm< 1, dim, n_components, Number > &result)
static void get_value(vectorized_value_type &value, const unsigned int, const vectorized_value_type &result)
static void get_value(vectorized_value_type &value, const unsigned int vector_lane, const scalar_value_type &result)
static void set_value(const vectorized_value_type &value, const unsigned int, vectorized_value_type &result)
static scalar_value_type sum_value(const scalar_value_type &result)
typename ::internal::VectorizedArrayTrait< Number >::vectorized_value_type VectorizedArrayType
static scalar_value_type sum_value(const vectorized_value_type &result)
static void read_value(const ScalarNumber vector_entry, const unsigned int component, scalar_value_type &result)
Tensor< 1, n_components, ScalarNumber > scalar_value_type
static void set_value(const vectorized_value_type &value, const unsigned int vector_lane, scalar_value_type &result)
static ScalarNumber access(const value_type &value, const unsigned int vector_lane, const unsigned int component)
static ScalarNumber sum_value(const unsigned int component, const vectorized_value_type &result)
Tensor< 1, n_components, Tensor< 1, dim, VectorizedArrayType > > vectorized_unit_gradient_type
static void set_zero_value(value_type &value, const unsigned int vector_lane)
internal::CurlType< dim, Number > curl_type
static void set_gradient(const interface_vectorized_unit_gradient_type &value, const unsigned int vector_lane, unit_gradient_type &result)
static void set_zero_gradient(real_gradient_type &value, const unsigned int vector_lane)
typename internal::VectorizedArrayTrait< Number >::value_type ScalarNumber
static void get_gradient(interface_vectorized_unit_gradient_type &value, const unsigned int vector_lane, const unit_gradient_type &result)
std::conditional_t< n_components==spacedim, Tensor< 2, spacedim, Number >, Tensor< 1, n_components, Tensor< 1, spacedim, Number > > > real_gradient_type
Tensor< 1, n_components, VectorizedArrayType > vectorized_value_type
static void access(real_gradient_type &value, const unsigned int vector_lane, const unsigned int component, const Tensor< 1, spacedim, ScalarNumber > &shape_gradient)
Tensor< 1, n_components, Tensor< 1, dim, Number > > unit_gradient_type
static void access(value_type &value, const unsigned int vector_lane, const unsigned int component, const ScalarNumber &shape_value)
static constexpr std::size_t width()
static constexpr std::size_t stride()
static value_type & get(value_type &value, unsigned int c)
constexpr Number trace(const SymmetricTensor< 2, dim2, Number > &)