16 #ifndef dealii_fe_point_evaluation_h
17 #define dealii_fe_point_evaluation_h
47 template <
int dim,
int n_components,
typename Number>
55 const unsigned int component,
59 result[component] = vector_entry;
64 const unsigned int component,
68 vector_entry = result[component];
75 const unsigned int vector_lane,
78 for (
unsigned int i = 0; i < n_components; ++i)
79 for (
unsigned int d = 0;
d < dim; ++
d)
80 result[i][
d] =
value[
d][i][vector_lane];
86 const unsigned int vector_lane,
89 for (
unsigned int i = 0; i < n_components; ++i)
90 for (
unsigned int d = 0;
d < dim; ++
d)
91 value[
d][i][vector_lane] = result[i][
d];
96 const unsigned int vector_lane,
99 for (
unsigned int i = 0; i < n_components; ++i)
100 result[i] =
value[i][vector_lane];
105 const unsigned int vector_lane,
108 for (
unsigned int i = 0; i < n_components; ++i)
109 value[i][vector_lane] = result[i];
112 template <
typename Number2>
115 const unsigned int component)
117 return value[component];
120 template <
typename Number2>
121 static const Number2 &
123 const unsigned int component)
125 return value[component];
129 template <
int dim,
typename Number>
140 result = vector_entry;
148 vector_entry = result;
153 const unsigned int vector_lane,
156 for (
unsigned int d = 0;
d < dim; ++
d)
157 result[
d] =
value[
d][vector_lane];
162 const unsigned int vector_lane,
165 for (
unsigned int d = 0;
d < dim; ++
d)
166 value[
d][vector_lane] = result[
d];
171 const unsigned int vector_lane,
174 result =
value[vector_lane];
179 const unsigned int vector_lane,
182 value[vector_lane] = result;
185 template <
typename Number2>
187 access(Number2 &value,
const unsigned int)
192 template <
typename Number2>
193 static const Number2 &
194 access(
const Number2 &value,
const unsigned int)
200 template <
int dim,
typename Number>
208 const unsigned int component,
211 result[component] = vector_entry;
216 const unsigned int component,
219 vector_entry = result[component];
225 const unsigned int vector_lane,
228 for (
unsigned int i = 0; i < dim; ++i)
229 for (
unsigned int d = 0;
d < dim; ++
d)
230 result[i][
d] =
value[
d][i][vector_lane];
236 const unsigned int vector_lane,
239 for (
unsigned int i = 0; i < dim; ++i)
240 for (
unsigned int d = 0;
d < dim; ++
d)
241 value[
d][i][vector_lane] = result[i][
d];
246 const unsigned int vector_lane,
249 for (
unsigned int i = 0; i < dim; ++i)
250 result[i] =
value[i][vector_lane];
255 const unsigned int vector_lane,
258 for (
unsigned int i = 0; i < dim; ++i)
259 value[i][vector_lane] = result[i];
265 return value[component];
268 static const Number &
271 return value[component];
277 return value[component];
283 return value[component];
287 template <
typename Number>
298 result = vector_entry;
306 vector_entry = result;
311 const unsigned int vector_lane,
314 result[0] =
value[0][vector_lane];
319 const unsigned int vector_lane,
322 value[0][vector_lane] = result[0];
327 const unsigned int vector_lane,
330 result =
value[vector_lane];
335 const unsigned int vector_lane,
338 value[vector_lane] = result;
341 template <
typename Number2>
343 access(Number2 &value,
const unsigned int)
348 template <
typename Number2>
349 static const Number2 &
350 access(
const Number2 &value,
const unsigned int)
356 template <
int dim,
int spacedim>
359 const unsigned int base_element_number);
361 template <
int dim,
int spacedim>
365 template <
int dim,
int spacedim>
366 std::vector<Polynomials::Polynomial<double>>
403 template <
int n_components,
406 typename Number =
double>
436 const unsigned int first_selected_component = 0);
456 const unsigned int first_selected_component = 0);
537 get_value(
const unsigned int point_index)
const;
591 jacobian(
const unsigned int point_index)
const;
608 JxW(
const unsigned int point_index)
const;
623 real_point(
const unsigned int point_index)
const;
630 unit_point(
const unsigned int point_index)
const;
650 setup(
const unsigned int first_selected_component);
671 std::vector<Polynomials::Polynomial<double>>
poly;
750 std::unique_ptr<NonMatching::MappingInfo<dim, spacedim>>
783 template <
int n_components,
int dim,
int spacedim,
typename Number>
788 const unsigned int first_selected_component)
792 , update_flags(update_flags)
793 , mapping_info_on_the_fly(
794 std::make_unique<
NonMatching::MappingInfo<dim, spacedim>>(mapping,
796 , mapping_info(mapping_info_on_the_fly.get())
799 , is_reinitialized(false)
801 setup(first_selected_component);
806 template <
int n_components,
int dim,
int spacedim,
typename Number>
810 const unsigned int first_selected_component)
812 , mapping(&mapping_info.get_mapping())
814 , update_flags(mapping_info.get_update_flags())
815 , mapping_info(&mapping_info)
818 , is_reinitialized(false)
820 setup(first_selected_component);
825 template <
int n_components,
int dim,
int spacedim,
typename Number>
828 const unsigned int first_selected_component)
831 fe->n_components() + 1);
833 bool same_base_element =
true;
834 unsigned int base_element_number = 0;
835 component_in_base_element = 0;
836 unsigned int component = 0;
837 for (; base_element_number < fe->n_base_elements(); ++base_element_number)
838 if (component + fe->element_multiplicity(base_element_number) >
839 first_selected_component)
841 if (first_selected_component + n_components >
842 component + fe->element_multiplicity(base_element_number))
843 same_base_element =
false;
844 component_in_base_element = first_selected_component - component;
848 component += fe->element_multiplicity(base_element_number);
852 *fe, base_element_number) &&
861 fe->base_element(base_element_number));
863 polynomials_are_hat_functions =
864 (poly.size() == 2 && poly[0].value(0.) == 1. &&
865 poly[0].value(1.) == 0. && poly[1].value(0.) == 0. &&
866 poly[1].value(1.) == 1.);
872 nonzero_shape_function_component.resize(fe->n_dofs_per_cell());
873 for (
unsigned int d = 0;
d < n_components; ++
d)
875 const unsigned int component = first_selected_component +
d;
876 for (
unsigned int i = 0; i < fe->n_dofs_per_cell(); ++i)
878 const bool is_primitive =
879 fe->is_primitive() || fe->is_primitive(i);
881 nonzero_shape_function_component[i][
d] =
882 (component == fe->system_to_component_index(i).first);
884 nonzero_shape_function_component[i][
d] =
885 (fe->get_nonzero_components(i)[component] ==
true);
895 template <
int n_components,
int dim,
int spacedim,
typename Number>
904 mapping_info->reinit(cell, unit_points);
908 fe_values = std::make_shared<FEValues<dim, spacedim>>(
912 std::vector<
Point<dim>>(unit_points.begin(), unit_points.end())),
914 fe_values->reinit(cell);
917 const_cast<unsigned int &
>(n_q_points) = unit_points.size();
920 values.resize(n_q_points, numbers::signaling_nan<value_type>());
922 gradients.resize(n_q_points, numbers::signaling_nan<gradient_type>());
924 is_reinitialized =
true;
929 template <
int n_components,
int dim,
int spacedim,
typename Number>
937 const_cast<unsigned int &
>(n_q_points) =
938 mapping_info->get_unit_points(current_cell_index, current_face_number)
942 values.resize(n_q_points, numbers::signaling_nan<value_type>());
944 gradients.resize(n_q_points, numbers::signaling_nan<gradient_type>());
946 is_reinitialized =
true;
951 template <
int n_components,
int dim,
int spacedim,
typename Number>
955 const unsigned int face_number)
958 current_face_number = face_number;
960 const_cast<unsigned int &
>(n_q_points) =
961 mapping_info->get_unit_points(current_cell_index, current_face_number)
965 values.resize(n_q_points, numbers::signaling_nan<value_type>());
967 gradients.resize(n_q_points, numbers::signaling_nan<gradient_type>());
969 is_reinitialized =
true;
974 template <
int n_components,
int dim,
int spacedim,
typename Number>
980 if (!is_reinitialized)
992 if (solution_renumbered.size() != dofs_per_component)
993 solution_renumbered.resize(dofs_per_component);
994 for (
unsigned int comp = 0; comp < n_components; ++comp)
995 for (
unsigned int i = 0; i < dofs_per_component; ++i)
997 EvaluatorTypeTraits<dim, n_components, Number>::read_value(
998 solution_values[renumber[(component_in_base_element + comp) *
1002 solution_renumbered[i]);
1006 unit_gradients.resize(n_q_points,
1007 numbers::signaling_nan<gradient_type>());
1009 const auto unit_points =
1010 mapping_info->get_unit_points(current_cell_index, current_face_number);
1012 const std::size_t n_points = unit_points.size();
1014 for (
unsigned int i = 0; i < n_points; i += n_lanes)
1018 for (
unsigned int j = 0; j < n_lanes && i + j < n_points; ++j)
1019 for (
unsigned int d = 0;
d < dim; ++
d)
1020 vectorized_points[
d][j] = unit_points[i + j][
d];
1023 const auto val_and_grad =
1026 solution_renumbered,
1028 polynomials_are_hat_functions);
1032 for (
unsigned int j = 0; j < n_lanes && i + j < n_points; ++j)
1034 EvaluatorTypeTraits<dim, n_components, Number>::set_value(
1035 val_and_grad.first, j,
values[i + j]);
1041 for (
unsigned int j = 0; j < n_lanes && i + j < n_points; ++j)
1046 Number>::set_gradient(val_and_grad.second,
1048 unit_gradients[i + j]);
1049 const auto &mapping_data =
1050 mapping_info->get_mapping_data(current_cell_index,
1051 current_face_number);
1053 mapping_data.inverse_jacobians[i + j].transpose(),
1054 unit_gradients[i + j]);
1063 Assert(fe_values.get() !=
nullptr,
1065 "Not initialized. Please call FEPointEvaluation::reinit()!"));
1069 values.resize(n_q_points);
1071 for (
unsigned int i = 0; i < fe->n_dofs_per_cell(); ++i)
1073 const Number value = solution_values[i];
1074 for (
unsigned int d = 0;
d < n_components; ++
d)
1075 if (nonzero_shape_function_component[i][
d] &&
1076 (fe->is_primitive(i) || fe->is_primitive()))
1077 for (
unsigned int q = 0; q < n_q_points; ++q)
1079 EvaluatorTypeTraits<dim, n_components, Number>::access(
1080 values[q],
d) += fe_values->shape_value(i, q) * value;
1081 else if (nonzero_shape_function_component[i][
d])
1082 for (
unsigned int q = 0; q < n_q_points; ++q)
1084 EvaluatorTypeTraits<dim, n_components, Number>::access(
1086 fe_values->shape_value_component(i, q,
d) * value;
1094 for (
unsigned int i = 0; i < fe->n_dofs_per_cell(); ++i)
1096 const Number value = solution_values[i];
1097 for (
unsigned int d = 0;
d < n_components; ++
d)
1098 if (nonzero_shape_function_component[i][
d] &&
1099 (fe->is_primitive(i) || fe->is_primitive()))
1100 for (
unsigned int q = 0; q < n_q_points; ++q)
1102 EvaluatorTypeTraits<dim, n_components, Number>::access(
1103 gradients[q],
d) += fe_values->shape_grad(i, q) * value;
1104 else if (nonzero_shape_function_component[i][
d])
1105 for (
unsigned int q = 0; q < n_q_points; ++q)
1107 EvaluatorTypeTraits<dim, n_components, Number>::access(
1109 fe_values->shape_grad_component(i, q,
d) * value;
1117 template <
int n_components,
int dim,
int spacedim,
typename Number>
1123 if (!is_reinitialized)
1126 if (n_q_points == 0)
1128 std::fill(solution_values.
begin(), solution_values.
end(), 0.0);
1144 if (solution_renumbered_vectorized.size() != dofs_per_component)
1145 solution_renumbered_vectorized.resize(dofs_per_component);
1147 solution_renumbered_vectorized.fill(
1153 const auto unit_points =
1154 mapping_info->get_unit_points(current_cell_index, current_face_number);
1156 const std::size_t n_points = unit_points.size();
1158 for (
unsigned int i = 0; i < n_points; i += n_lanes)
1162 for (
unsigned int j = 0; j < n_lanes && i + j < n_points; ++j)
1163 for (
unsigned int d = 0;
d < dim; ++
d)
1164 vectorized_points[
d][j] = unit_points[i + j][
d];
1177 for (
unsigned int j = 0; j < n_lanes && i + j < n_points; ++j)
1179 EvaluatorTypeTraits<dim, n_components, Number>::get_value(
1180 value, j,
values[i + j]);
1182 for (
unsigned int j = 0; j < n_lanes && i + j < n_points; ++j)
1184 const auto &mapping_data =
1185 mapping_info->get_mapping_data(current_cell_index,
1186 current_face_number);
1201 solution_renumbered_vectorized);
1205 std::fill(solution_values.
begin(), solution_values.
end(), Number());
1206 for (
unsigned int comp = 0; comp < n_components; ++comp)
1207 for (
unsigned int i = 0; i < dofs_per_component; ++i)
1210 internal::FEPointEvaluation::
1211 EvaluatorTypeTraits<dim, n_components, VectorizedArray<Number>>::
1212 write_value(result, comp, solution_renumbered_vectorized[i]);
1213 for (
unsigned int lane = n_lanes / 2; lane > 0; lane /= 2)
1214 for (
unsigned int j = 0; j < lane; ++j)
1215 result[j] += result[lane + j];
1216 solution_values[renumber[comp * dofs_per_component + i]] =
1225 Assert(fe_values.get() !=
nullptr,
1227 "Not initialized. Please call FEPointEvaluation::reinit()!"));
1228 std::fill(solution_values.
begin(), solution_values.
end(), 0.0);
1233 for (
unsigned int i = 0; i < fe->n_dofs_per_cell(); ++i)
1235 for (
unsigned int d = 0;
d < n_components; ++
d)
1236 if (nonzero_shape_function_component[i][
d] &&
1237 (fe->is_primitive(i) || fe->is_primitive()))
1238 for (
unsigned int q = 0; q < n_q_points; ++q)
1239 solution_values[i] +=
1240 fe_values->shape_value(i, q) *
1244 else if (nonzero_shape_function_component[i][
d])
1245 for (
unsigned int q = 0; q < n_q_points; ++q)
1246 solution_values[i] +=
1247 fe_values->shape_value_component(i, q,
d) *
1257 for (
unsigned int i = 0; i < fe->n_dofs_per_cell(); ++i)
1259 for (
unsigned int d = 0;
d < n_components; ++
d)
1260 if (nonzero_shape_function_component[i][
d] &&
1261 (fe->is_primitive(i) || fe->is_primitive()))
1262 for (
unsigned int q = 0; q < n_q_points; ++q)
1263 solution_values[i] +=
1264 fe_values->shape_grad(i, q) *
1268 else if (nonzero_shape_function_component[i][
d])
1269 for (
unsigned int q = 0; q < n_q_points; ++q)
1270 solution_values[i] +=
1271 fe_values->shape_grad_component(i, q,
d) *
1282 template <
int n_components,
int dim,
int spacedim,
typename Number>
1286 const unsigned int point_index)
const
1289 return values[point_index];
1294 template <
int n_components,
int dim,
int spacedim,
typename Number>
1298 const unsigned int point_index)
const
1306 template <
int n_components,
int dim,
int spacedim,
typename Number>
1310 const unsigned int point_index)
const
1313 ExcMessage(
"Unit gradients are currently only implemented for tensor "
1314 "product finite elements combined with MappingQ "
1317 return unit_gradients[point_index];
1322 template <
int n_components,
int dim,
int spacedim,
typename Number>
1326 const unsigned int point_index)
1329 values[point_index] = value;
1334 template <
int n_components,
int dim,
int spacedim,
typename Number>
1338 const unsigned int point_index)
1346 template <
int n_components,
int dim,
int spacedim,
typename Number>
1349 const unsigned int point_index)
const
1351 const auto &mapping_data =
1352 mapping_info->get_mapping_data(current_cell_index, current_face_number);
1354 return mapping_data.jacobians[point_index];
1359 template <
int n_components,
int dim,
int spacedim,
typename Number>
1362 const unsigned int point_index)
const
1364 const auto &mapping_data =
1365 mapping_info->get_mapping_data(current_cell_index, current_face_number);
1367 return mapping_data.inverse_jacobians[point_index];
1372 template <
int n_components,
int dim,
int spacedim,
typename Number>
1375 const unsigned int point_index)
const
1377 const auto &mapping_data =
1378 mapping_info->get_mapping_data(current_cell_index, current_face_number);
1380 return mapping_data.JxW_values[point_index];
1384 template <
int n_components,
int dim,
int spacedim,
typename Number>
1387 const unsigned int point_index)
const
1389 const auto &mapping_data =
1390 mapping_info->get_mapping_data(current_cell_index, current_face_number);
1392 return mapping_data.normal_vectors[point_index];
1397 template <
int n_components,
int dim,
int spacedim,
typename Number>
1400 const unsigned int point_index)
const
1402 const auto &mapping_data =
1403 mapping_info->get_mapping_data(current_cell_index, current_face_number);
1405 return mapping_data.quadrature_points[point_index];
1410 template <
int n_components,
int dim,
int spacedim,
typename Number>
1413 const unsigned int point_index)
const
1416 const auto unit_points =
1417 mapping_info->get_unit_points(current_cell_index, current_face_number);
1418 return unit_points[point_index];
1423 template <
int n_components,
int dim,
int spacedim,
typename Number>
1428 return {0
U, n_q_points};
std::vector< Polynomials::Polynomial< double > > poly
Number JxW(const unsigned int point_index) const
std::vector< value_type > solution_renumbered
const UpdateFlags update_flags
void submit_gradient(const gradient_type &, const unsigned int point_index)
std_cxx20::ranges::iota_view< unsigned int, unsigned int > quadrature_point_indices() const
bool polynomials_are_hat_functions
std::vector< gradient_type > gradients
void setup(const unsigned int first_selected_component)
const value_type & get_value(const unsigned int point_index) const
Tensor< 1, spacedim > normal_vector(const unsigned int point_index) const
Point< dim > unit_point(const unsigned int point_index) const
unsigned int component_in_base_element
unsigned int current_face_number
SmartPointer< NonMatching::MappingInfo< dim, spacedim > > mapping_info
SmartPointer< const Mapping< dim, spacedim > > mapping
void evaluate(const ArrayView< const Number > &solution_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
std::vector< std::array< bool, n_components > > nonzero_shape_function_component
const gradient_type & get_unit_gradient(const unsigned int point_index) const
DerivativeForm< 1, spacedim, dim > inverse_jacobian(const unsigned int point_index) const
Point< spacedim > real_point(const unsigned int point_index) const
std::vector< gradient_type > unit_gradients
typename internal::FEPointEvaluation::EvaluatorTypeTraits< dim, n_components, Number >::value_type value_type
const gradient_type & get_gradient(const unsigned int point_index) const
void reinit(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const ArrayView< const Point< dim >> &unit_points)
FEPointEvaluation(const Mapping< dim > &mapping, const FiniteElement< dim > &fe, const UpdateFlags update_flags, const unsigned int first_selected_component=0)
std::unique_ptr< NonMatching::MappingInfo< dim, spacedim > > mapping_info_on_the_fly
DerivativeForm< 1, dim, spacedim > jacobian(const unsigned int point_index) const
AlignedVector< typename internal::FEPointEvaluation::EvaluatorTypeTraits< dim, n_components, VectorizedArray< Number > >::value_type > solution_renumbered_vectorized
const unsigned int n_q_points
std::vector< value_type > values
unsigned int current_cell_index
void submit_value(const value_type &value, const unsigned int point_index)
void integrate(const ArrayView< Number > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags)
typename internal::FEPointEvaluation::EvaluatorTypeTraits< dim, n_components, Number >::gradient_type gradient_type
unsigned int dofs_per_component
std::vector< unsigned int > renumber
std::shared_ptr< FEValues< dim, spacedim > > fe_values
SmartPointer< const FiniteElement< dim > > fe
static constexpr std::size_t size()
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotInitialized()
#define Assert(cond, exc)
static ::ExceptionBase & ExcNotImplemented()
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
@ update_values
Shape function values.
@ update_inverse_jacobians
Volume element.
@ update_gradients
Shape function gradients.
EvaluationFlags
The EvaluationFlags enum.
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
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)
void integrate_add_tensor_product_value_and_gradient(const std::vector< Polynomials::Polynomial< double >> &poly, const Number2 &value, const Tensor< 1, dim, Number2 > &gradient, const Point< dim, Number > &p, AlignedVector< Number2 > &values, const std::vector< unsigned int > &renumber={})
void reinit(MatrixBlock< MatrixType > &v, const BlockSparsityPattern &p)
std::pair< typename ProductTypeNoPoint< Number, Number2 >::type, Tensor< 1, dim, typename ProductTypeNoPoint< Number, Number2 >::type > > evaluate_tensor_product_value_and_gradient(const std::vector< Polynomials::Polynomial< double >> &poly, const std::vector< Number > &values, const Point< dim, Number2 > &p, const bool d_linear=false, const std::vector< unsigned int > &renumber={})
static const unsigned int invalid_unsigned_int
boost::integer_range< IncrementableType > iota_view
static Number2 & access(Number2 &value, const unsigned int)
static void get_value(VectorizedArray< Number > &value, const unsigned int vector_lane, const value_type &result)
static void get_gradient(Tensor< 1, 1, VectorizedArray< Number >> &value, const unsigned int vector_lane, const gradient_type &result)
static void set_value(const VectorizedArray< Number > &value, const unsigned int vector_lane, value_type &result)
static void write_value(Number &vector_entry, const unsigned int, const value_type &result)
static void set_gradient(const Tensor< 1, 1, VectorizedArray< Number >> &value, const unsigned int vector_lane, gradient_type &result)
static const Number2 & access(const Number2 &value, const unsigned int)
static void read_value(const Number vector_entry, const unsigned int, value_type &result)
static Number2 & access(Number2 &value, const unsigned int)
static void get_value(VectorizedArray< Number > &value, const unsigned int vector_lane, const value_type &result)
static void set_gradient(const Tensor< 1, dim, VectorizedArray< Number >> &value, const unsigned int vector_lane, gradient_type &result)
static void read_value(const Number vector_entry, const unsigned int, value_type &result)
static const Number2 & access(const Number2 &value, const unsigned int)
static void get_gradient(Tensor< 1, dim, VectorizedArray< Number >> &value, const unsigned int vector_lane, const gradient_type &result)
static void write_value(Number &vector_entry, const unsigned int, const value_type &result)
static void set_value(const VectorizedArray< Number > &value, const unsigned int vector_lane, value_type &result)
static void get_value(Tensor< 1, dim, VectorizedArray< Number >> &value, const unsigned int vector_lane, const value_type &result)
static void write_value(Number &vector_entry, const unsigned int component, const value_type &result)
static const Number & access(const value_type &value, const unsigned int component)
static const Tensor< 1, dim, Number > & access(const gradient_type &value, const unsigned int component)
static void get_gradient(Tensor< 1, dim, Tensor< 1, dim, VectorizedArray< Number >>> &value, const unsigned int vector_lane, const gradient_type &result)
static void set_value(const Tensor< 1, dim, VectorizedArray< Number >> &value, const unsigned int vector_lane, value_type &result)
static void set_gradient(const Tensor< 1, dim, Tensor< 1, dim, VectorizedArray< Number >>> &value, const unsigned int vector_lane, gradient_type &result)
static Tensor< 1, dim, Number > & access(gradient_type &value, const unsigned int component)
static Number & access(value_type &value, const unsigned int component)
static void read_value(const Number vector_entry, const unsigned int component, value_type &result)
static void get_value(Tensor< 1, n_components, VectorizedArray< Number >> &value, const unsigned int vector_lane, const value_type &result)
static void set_value(const Tensor< 1, n_components, VectorizedArray< Number >> &value, const unsigned int vector_lane, value_type &result)
static const Number2 & access(const Tensor< 1, n_components, Number2 > &value, const unsigned int component)
static Number2 & access(Tensor< 1, n_components, Number2 > &value, const unsigned int component)
static void set_gradient(const Tensor< 1, dim, Tensor< 1, n_components, VectorizedArray< Number >>> &value, const unsigned int vector_lane, gradient_type &result)
Tensor< 1, n_components, Number > value_type
static void write_value(Number &vector_entry, const unsigned int component, const value_type &result)
Tensor< 1, n_components, Tensor< 1, dim, Number > > gradient_type
static void read_value(const Number vector_entry, const unsigned int component, value_type &result)
static void get_gradient(Tensor< 1, dim, Tensor< 1, n_components, VectorizedArray< Number >>> &value, const unsigned int vector_lane, const gradient_type &result)
unsigned int dofs_per_component_on_cell
void reinit(const Quadrature< dim_q > &quad, const FiniteElement< dim, spacedim > &fe_dim, const unsigned int base_element=0)
std::vector< unsigned int > lexicographic_numbering