25#ifdef DEAL_II_WITH_ADOLC
26# include <adolc/adouble.h>
27# include <adolc/adtl.h>
38 template <
int dim,
int spacedim>
51 const std::vector<unsigned int> shape_function_to_row_table =
58 if (is_primitive ==
true)
75 template <
int dim,
int spacedim>
83 template <
int dim,
int spacedim>
96 const std::vector<unsigned int> shape_function_to_row_table =
99 for (
unsigned int d = 0; d < spacedim; ++d)
107 if (is_primitive ==
true)
117 shape_function_to_row_table[i * fe.
n_components() + component];
126 unsigned int n_nonzero_components = 0;
127 for (
unsigned int d = 0; d < spacedim; ++d)
130 ++n_nonzero_components;
132 if (n_nonzero_components == 0)
134 else if (n_nonzero_components > 1)
138 for (
unsigned int d = 0; d < spacedim; ++d)
140 .is_nonzero_shape_function_component[d] ==
true)
153 template <
int dim,
int spacedim>
161 template <
int dim,
int spacedim>
180 const std::vector<unsigned int> shape_function_to_row_table =
183 for (
unsigned int d = 0;
184 d < ::SymmetricTensor<2, dim>::n_independent_components;
193 if (is_primitive ==
true)
203 shape_function_to_row_table[i * fe.
n_components() + component];
212 unsigned int n_nonzero_components = 0;
213 for (
unsigned int d = 0;
214 d < ::SymmetricTensor<2, dim>::n_independent_components;
218 ++n_nonzero_components;
220 if (n_nonzero_components == 0)
222 else if (n_nonzero_components > 1)
226 for (
unsigned int d = 0;
227 d < ::SymmetricTensor<2, dim>::n_independent_components;
230 .is_nonzero_shape_function_component[d] ==
true)
243 template <
int dim,
int spacedim>
251 template <
int dim,
int spacedim>
263 const std::vector<unsigned int> shape_function_to_row_table =
266 for (
unsigned int d = 0; d < dim * dim; ++d)
274 if (is_primitive ==
true)
284 shape_function_to_row_table[i * fe.
n_components() + component];
293 unsigned int n_nonzero_components = 0;
294 for (
unsigned int d = 0; d < dim * dim; ++d)
297 ++n_nonzero_components;
299 if (n_nonzero_components == 0)
301 else if (n_nonzero_components > 1)
305 for (
unsigned int d = 0; d < dim * dim; ++d)
307 .is_nonzero_shape_function_component[d] ==
true)
320 template <
int dim,
int spacedim>
328 template <
int dim,
int spacedim>
329 template <
typename Number>
343 boost::container::small_vector<Number, 200> dof_values(
345 fe_values->present_cell.get_interpolated_dof_values(
349 fe_values->finite_element_output.shape_values,
356 template <
int dim,
int spacedim>
357 template <
class InputVector>
360 const InputVector &dof_values,
374 fe_values->finite_element_output.shape_values,
381 template <
int dim,
int spacedim>
382 template <
typename Number>
390 "update_gradients")));
394 fe_values->present_cell.n_dofs_for_dof_handler());
398 boost::container::small_vector<Number, 200> dof_values(
400 fe_values->present_cell.get_interpolated_dof_values(
404 fe_values->finite_element_output.shape_gradients,
411 template <
int dim,
int spacedim>
412 template <
typename InputVector>
415 const InputVector &dof_values,
421 "update_gradients")));
429 fe_values->finite_element_output.shape_gradients,
436 template <
int dim,
int spacedim>
437 template <
typename Number>
445 "update_hessians")));
449 fe_values->present_cell.n_dofs_for_dof_handler());
453 boost::container::small_vector<Number, 200> dof_values(
455 fe_values->present_cell.get_interpolated_dof_values(
460 fe_values->finite_element_output.shape_hessians,
467 template <
int dim,
int spacedim>
468 template <
class InputVector>
471 const InputVector &dof_values,
477 "update_hessians")));
485 fe_values->finite_element_output.shape_hessians,
492 template <
int dim,
int spacedim>
493 template <
typename Number>
501 "update_hessians")));
505 fe_values->present_cell.n_dofs_for_dof_handler());
509 boost::container::small_vector<Number, 200> dof_values(
511 fe_values->present_cell.get_interpolated_dof_values(
515 fe_values->finite_element_output.shape_hessians,
522 template <
int dim,
int spacedim>
523 template <
class InputVector>
526 const InputVector &dof_values,
532 "update_hessians")));
540 fe_values->finite_element_output.shape_hessians,
547 template <
int dim,
int spacedim>
548 template <
typename Number>
557 "update_3rd_derivatives")));
561 fe_values->present_cell.n_dofs_for_dof_handler());
565 boost::container::small_vector<Number, 200> dof_values(
567 fe_values->present_cell.get_interpolated_dof_values(
571 fe_values->finite_element_output.shape_3rd_derivatives,
578 template <
int dim,
int spacedim>
579 template <
class InputVector>
582 const InputVector &dof_values,
585 &third_derivatives)
const
589 "update_3rd_derivatives")));
597 fe_values->finite_element_output.shape_3rd_derivatives,
604 template <
int dim,
int spacedim>
605 template <
typename Number>
619 boost::container::small_vector<Number, 200> dof_values(
621 fe_values->present_cell.get_interpolated_dof_values(
625 fe_values->finite_element_output.shape_values,
632 template <
int dim,
int spacedim>
633 template <
class InputVector>
636 const InputVector &dof_values,
650 fe_values->finite_element_output.shape_values,
657 template <
int dim,
int spacedim>
658 template <
typename Number>
666 "update_gradients")));
670 fe_values->present_cell.n_dofs_for_dof_handler());
674 boost::container::small_vector<Number, 200> dof_values(
676 fe_values->present_cell.get_interpolated_dof_values(
680 fe_values->finite_element_output.shape_gradients,
687 template <
int dim,
int spacedim>
688 template <
typename InputVector>
691 const InputVector &dof_values,
697 "update_gradients")));
705 fe_values->finite_element_output.shape_gradients,
712 template <
int dim,
int spacedim>
713 template <
typename Number>
722 "update_gradients")));
726 fe_values->present_cell.n_dofs_for_dof_handler());
730 boost::container::small_vector<Number, 200> dof_values(
732 fe_values->present_cell.get_interpolated_dof_values(
736 fe_values->finite_element_output.shape_gradients,
738 symmetric_gradients);
743 template <
int dim,
int spacedim>
744 template <
class InputVector>
747 const InputVector &dof_values,
750 &symmetric_gradients)
const
754 "update_gradients")));
762 fe_values->finite_element_output.shape_gradients,
764 symmetric_gradients);
769 template <
int dim,
int spacedim>
770 template <
typename Number>
778 "update_gradients")));
782 fe_values->present_cell.n_dofs_for_dof_handler());
786 boost::container::small_vector<Number, 200> dof_values(
788 fe_values->present_cell.get_interpolated_dof_values(
792 fe_values->finite_element_output.shape_gradients,
799 template <
int dim,
int spacedim>
800 template <
class InputVector>
803 const InputVector &dof_values,
809 "update_gradients")));
817 fe_values->finite_element_output.shape_gradients,
824 template <
int dim,
int spacedim>
825 template <
typename Number>
833 "update_gradients")));
835 ExcMessage(
"FEValues object is not reinited to any cell"));
837 fe_values->present_cell.n_dofs_for_dof_handler());
840 if constexpr ((dim == 2) || (dim == 3))
843 boost::container::small_vector<Number, 200> dof_values(
845 fe_values->present_cell.get_interpolated_dof_values(
849 fe_values->finite_element_output.shape_gradients,
855 ExcMessage(
"The curl is only defined for vector fields "
856 "that are either two- or three-dimensional. "
857 "You cannot ask for the curl for dim=" +
858 std::to_string(dim) +
"."));
863 template <
int dim,
int spacedim>
864 template <
class InputVector>
867 const InputVector &dof_values,
873 "update_gradients")));
875 ExcMessage(
"FEValues object is not reinited to any cell"));
881 fe_values->finite_element_output.shape_gradients,
888 template <
int dim,
int spacedim>
889 template <
typename Number>
897 "update_hessians")));
901 fe_values->present_cell.n_dofs_for_dof_handler());
905 boost::container::small_vector<Number, 200> dof_values(
907 fe_values->present_cell.get_interpolated_dof_values(
911 fe_values->finite_element_output.shape_hessians,
918 template <
int dim,
int spacedim>
919 template <
class InputVector>
922 const InputVector &dof_values,
928 "update_hessians")));
936 fe_values->finite_element_output.shape_hessians,
943 template <
int dim,
int spacedim>
944 template <
typename Number>
952 "update_hessians")));
959 fe_function.
size() ==
fe_values->present_cell.n_dofs_for_dof_handler(),
961 fe_values->present_cell.n_dofs_for_dof_handler()));
965 boost::container::small_vector<Number, 200> dof_values(
967 fe_values->present_cell.get_interpolated_dof_values(
971 fe_values->finite_element_output.shape_hessians,
978 template <
int dim,
int spacedim>
979 template <
class InputVector>
982 const InputVector &dof_values,
988 "update_hessians")));
999 fe_values->finite_element_output.shape_hessians,
1006 template <
int dim,
int spacedim>
1007 template <
typename Number>
1016 "update_3rd_derivatives")));
1020 fe_values->present_cell.n_dofs_for_dof_handler());
1024 boost::container::small_vector<Number, 200> dof_values(
1026 fe_values->present_cell.get_interpolated_dof_values(
1030 fe_values->finite_element_output.shape_3rd_derivatives,
1037 template <
int dim,
int spacedim>
1038 template <
class InputVector>
1041 const InputVector &dof_values,
1044 &third_derivatives)
const
1048 "update_3rd_derivatives")));
1056 fe_values->finite_element_output.shape_3rd_derivatives,
1063 template <
int dim,
int spacedim>
1064 template <
typename Number>
1078 boost::container::small_vector<Number, 200> dof_values(
1080 fe_values->present_cell.get_interpolated_dof_values(
1084 fe_values->finite_element_output.shape_values,
1091 template <
int dim,
int spacedim>
1092 template <
class InputVector>
1095 const InputVector &dof_values,
1109 fe_values->finite_element_output.shape_values,
1116 template <
int dim,
int spacedim>
1117 template <
typename Number>
1125 "update_gradients")));
1129 fe_values->present_cell.n_dofs_for_dof_handler());
1133 boost::container::small_vector<Number, 200> dof_values(
1135 fe_values->present_cell.get_interpolated_dof_values(
1139 fe_values->finite_element_output.shape_gradients,
1146 template <
int dim,
int spacedim>
1147 template <
class InputVector>
1151 const InputVector &dof_values,
1157 "update_gradients")));
1165 fe_values->finite_element_output.shape_gradients,
1172 template <
int dim,
int spacedim>
1173 template <
typename Number>
1187 boost::container::small_vector<Number, 200> dof_values(
1189 fe_values->present_cell.get_interpolated_dof_values(
1193 fe_values->finite_element_output.shape_values,
1200 template <
int dim,
int spacedim>
1201 template <
class InputVector>
1204 const InputVector &dof_values,
1218 fe_values->finite_element_output.shape_values,
1225 template <
int dim,
int spacedim>
1226 template <
typename Number>
1234 "update_gradients")));
1238 fe_values->present_cell.n_dofs_for_dof_handler());
1242 boost::container::small_vector<Number, 200> dof_values(
1244 fe_values->present_cell.get_interpolated_dof_values(
1248 fe_values->finite_element_output.shape_gradients,
1255 template <
int dim,
int spacedim>
1256 template <
class InputVector>
1259 const InputVector &dof_values,
1265 "update_gradients")));
1273 fe_values->finite_element_output.shape_gradients,
1280 template <
int dim,
int spacedim>
1281 template <
typename Number>
1289 "update_gradients")));
1293 fe_values->present_cell.n_dofs_for_dof_handler());
1297 boost::container::small_vector<Number, 200> dof_values(
1299 fe_values->present_cell.get_interpolated_dof_values(
1303 fe_values->finite_element_output.shape_gradients,
1310 template <
int dim,
int spacedim>
1311 template <
class InputVector>
1314 const InputVector &dof_values,
1320 "update_gradients")));
1328 fe_values->finite_element_output.shape_gradients,
1339 template <
int dim,
int spacedim>
1350 const unsigned int n_vectors =
1358 const unsigned int n_symmetric_second_order_tensors =
1367 const unsigned int n_second_order_tensors =
1379#include "fe/fe_values_views.inst"
auto make_const_array_view(const Container &container) -> decltype(make_array_view(container))
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
const ObserverPointer< const FiniteElement< dim, spacedim >, FEValuesBase< dim, spacedim > > fe
const FiniteElement< dim, spacedim > & get_fe() const
void get_function_third_derivatives_from_local_dof_values(const InputVector &dof_values, std::vector< solution_third_derivative_type< typename InputVector::value_type > > &third_derivatives) const
void get_function_laplacians(const ReadVector< Number > &fe_function, std::vector< solution_laplacian_type< Number > > &laplacians) const
typename ProductType< Number, value_type >::type solution_laplacian_type
void get_function_hessians_from_local_dof_values(const InputVector &dof_values, std::vector< solution_hessian_type< typename InputVector::value_type > > &hessians) const
void get_function_values_from_local_dof_values(const InputVector &dof_values, std::vector< solution_value_type< typename InputVector::value_type > > &values) const
std::vector< ShapeFunctionData > shape_function_data
void get_function_gradients(const ReadVector< Number > &fe_function, std::vector< solution_gradient_type< Number > > &gradients) const
ObserverPointer< const FEValuesBase< dim, spacedim > > fe_values
typename ProductType< Number, value_type >::type solution_value_type
typename ProductType< Number, gradient_type >::type solution_gradient_type
void get_function_values(const ReadVector< Number > &fe_function, std::vector< solution_value_type< Number > > &values) const
typename ProductType< Number, hessian_type >::type solution_hessian_type
typename ProductType< Number, third_derivative_type >::type solution_third_derivative_type
void get_function_laplacians_from_local_dof_values(const InputVector &dof_values, std::vector< solution_laplacian_type< typename InputVector::value_type > > &laplacians) const
void get_function_gradients_from_local_dof_values(const InputVector &dof_values, std::vector< solution_gradient_type< typename InputVector::value_type > > &gradients) const
void get_function_third_derivatives(const ReadVector< Number > &fe_function, std::vector< solution_third_derivative_type< Number > > &third_derivatives) const
void get_function_hessians(const ReadVector< Number > &fe_function, std::vector< solution_hessian_type< Number > > &hessians) const
ObserverPointer< const FEValuesBase< dim, spacedim > > fe_values
typename ProductType< Number, divergence_type >::type solution_divergence_type
unsigned int first_tensor_component
std::vector< ShapeFunctionData > shape_function_data
typename ProductType< Number, value_type >::type solution_value_type
typename ProductType< Number, gradient_type >::type solution_gradient_type
typename ProductType< Number, value_type >::type solution_value_type
unsigned int first_tensor_component
typename ProductType< Number, divergence_type >::type solution_divergence_type
ObserverPointer< const FEValuesBase< dim, spacedim > > fe_values
std::vector< ShapeFunctionData > shape_function_data
void get_function_symmetric_gradients_from_local_dof_values(const InputVector &dof_values, std::vector< solution_symmetric_gradient_type< typename InputVector::value_type > > &symmetric_gradients) const
void get_function_gradients_from_local_dof_values(const InputVector &dof_values, std::vector< solution_gradient_type< typename InputVector::value_type > > &gradients) const
void get_function_laplacians(const ReadVector< Number > &fe_function, std::vector< solution_laplacian_type< Number > > &laplacians) const
unsigned int first_vector_component
void get_function_gradients(const ReadVector< Number > &fe_function, std::vector< solution_gradient_type< Number > > &gradients) const
typename ProductType< Number, divergence_type >::type solution_divergence_type
typename ProductType< Number, symmetric_gradient_type >::type solution_symmetric_gradient_type
void get_function_symmetric_gradients(const ReadVector< Number > &fe_function, std::vector< solution_symmetric_gradient_type< Number > > &symmetric_gradients) const
void get_function_laplacians_from_local_dof_values(const InputVector &dof_values, std::vector< solution_laplacian_type< typename InputVector::value_type > > &laplacians) const
void get_function_hessians(const ReadVector< Number > &fe_function, std::vector< solution_hessian_type< Number > > &hessians) const
ObserverPointer< const FEValuesBase< dim, spacedim > > fe_values
typename ProductType< Number, value_type >::type solution_value_type
typename ProductType< Number, gradient_type >::type solution_gradient_type
void get_function_third_derivatives(const ReadVector< Number > &fe_function, std::vector< solution_third_derivative_type< Number > > &third_derivatives) const
typename ProductType< Number, hessian_type >::type solution_hessian_type
void get_function_values(const ReadVector< Number > &fe_function, std::vector< solution_value_type< Number > > &values) const
void get_function_curls_from_local_dof_values(const InputVector &dof_values, std::vector< solution_curl_type< typename InputVector::value_type > > &curls) const
typename ProductType< Number, value_type >::type solution_laplacian_type
typename ProductType< Number, curl_type >::type solution_curl_type
std::vector< ShapeFunctionData > shape_function_data
void get_function_curls(const ReadVector< Number > &fe_function, std::vector< solution_curl_type< Number > > &curls) const
void get_function_hessians_from_local_dof_values(const InputVector &dof_values, std::vector< solution_hessian_type< typename InputVector::value_type > > &hessians) const
typename ProductType< Number, third_derivative_type >::type solution_third_derivative_type
void get_function_values_from_local_dof_values(const InputVector &dof_values, std::vector< solution_value_type< typename InputVector::value_type > > &values) const
void get_function_divergences_from_local_dof_values(const InputVector &dof_values, std::vector< solution_divergence_type< typename InputVector::value_type > > &divergences) const
void get_function_third_derivatives_from_local_dof_values(const InputVector &dof_values, std::vector< solution_third_derivative_type< typename InputVector::value_type > > &third_derivatives) const
void get_function_divergences(const ReadVector< Number > &fe_function, std::vector< solution_divergence_type< Number > > &divergences) const
unsigned int n_dofs_per_cell() const
unsigned int n_components() const
const ComponentMask & get_nonzero_components(const unsigned int i) const
bool is_primitive() const
std::pair< unsigned int, unsigned int > system_to_component_index(const unsigned int index) const
virtual size_type size() const =0
constexpr SymmetricTensor()=default
static constexpr unsigned int n_independent_components
static constexpr unsigned int n_independent_components
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcAccessToUninitializedField(std::string arg1)
#define Assert(cond, exc)
static ::ExceptionBase & ExcNotReinited()
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcIndexRange(std::size_t arg1, std::size_t arg2, std::size_t arg3)
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
@ update_hessians
Second derivatives of shape functions.
@ update_values
Shape function values.
@ update_3rd_derivatives
Third derivatives of shape functions.
@ update_gradients
Shape function gradients.
void do_function_divergences(const ArrayView< const Number > &dof_values, const Table< 2, ::Tensor< 1, spacedim > > &shape_gradients, const std::vector< typename Vector< dim, spacedim >::ShapeFunctionData > &shape_function_data, std::vector< typename Vector< dim, spacedim >::template solution_divergence_type< Number > > &divergences)
void do_function_symmetric_gradients(const ArrayView< const Number > &dof_values, const Table< 2, ::Tensor< 1, spacedim > > &shape_gradients, const std::vector< typename Vector< dim, spacedim >::ShapeFunctionData > &shape_function_data, std::vector< typename ProductType< Number, ::SymmetricTensor< 2, spacedim > >::type > &symmetric_gradients)
void do_function_derivatives(const ArrayView< const Number > &dof_values, const Table< 2, ::Tensor< order, spacedim > > &shape_derivatives, const std::vector< typename Scalar< dim, spacedim >::ShapeFunctionData > &shape_function_data, std::vector< typename ProductType< Number, ::Tensor< order, spacedim > >::type > &derivatives)
void do_function_gradients(const ArrayView< const Number > &dof_values, const Table< 2, ::Tensor< 1, spacedim > > &shape_gradients, const std::vector< typename Tensor< 2, dim, spacedim >::ShapeFunctionData > &shape_function_data, std::vector< typename Tensor< 2, dim, spacedim >::template solution_gradient_type< Number > > &gradients)
void do_function_values(const ArrayView< const Number > &dof_values, const Table< 2, double > &shape_values, const std::vector< typename Scalar< dim, spacedim >::ShapeFunctionData > &shape_function_data, std::vector< typename ProductType< Number, double >::type > &values)
void do_function_curls(const ArrayView< const Number > &dof_values, const Table< 2, ::Tensor< 1, spacedim > > &shape_gradients, const std::vector< typename Vector< dim, spacedim >::ShapeFunctionData > &shape_function_data, std::vector< typename ProductType< Number, ::internal::CurlType< spacedim > >::type > &curls)
void do_function_laplacians(const ArrayView< const Number > &dof_values, const Table< 2, ::Tensor< 2, spacedim > > &shape_hessians, const std::vector< typename Scalar< dim, spacedim >::ShapeFunctionData > &shape_function_data, std::vector< typename Scalar< dim, spacedim >::template solution_laplacian_type< Number > > &laplacians)
std::vector< unsigned int > make_shape_function_to_row_table(const FiniteElement< dim, spacedim > &fe)
constexpr unsigned int invalid_unsigned_int
std::vector< Lazy<::FEValuesViews::Vector< dim, spacedim > > > vectors
Cache(const FEValuesBase< dim, spacedim > &fe_values)
std::vector< Lazy<::FEValuesViews::SymmetricTensor< 2, dim, spacedim > > > symmetric_second_order_tensors
std::vector< Lazy<::FEValuesViews::Tensor< 2, dim, spacedim > > > second_order_tensors
std::vector< Lazy<::FEValuesViews::Scalar< dim, spacedim > > > scalars