15#ifndef dealii_fe_values_base_h
16#define dealii_fe_values_base_h
46#include <boost/signals2/connection.hpp>
155template <
int dim,
int spacedim>
277 shape_value(
const unsigned int i,
const unsigned int q_point)
const;
301 const unsigned int q_point,
302 const unsigned int component)
const;
330 shape_grad(
const unsigned int i,
const unsigned int q_point)
const;
350 const unsigned int q_point,
351 const unsigned int component)
const;
393 const unsigned int q_point,
394 const unsigned int component)
const;
436 const unsigned int q_point,
437 const unsigned int component)
const;
487 template <
typename Number>
490 std::vector<Number> &values)
const;
505 template <
typename Number>
566 template <
typename Number>
570 std::vector<Number> &values)
const;
580 template <
typename Number>
608 template <
typename Number>
613 const bool quadrature_points_fastest)
const;
661 template <
typename Number>
683 template <
typename Number>
697 template <
typename Number>
712 template <
typename Number>
718 const bool quadrature_points_fastest =
false)
const;
763 template <
typename Number>
786 template <
typename Number>
791 const bool quadrature_points_fastest =
false)
const;
801 template <
typename Number>
816 template <
typename Number>
822 const bool quadrature_points_fastest =
false)
const;
864 template <
typename Number>
867 std::vector<Number> &laplacians)
const;
888 template <
typename Number>
901 template <
typename Number>
906 std::vector<Number> &laplacians)
const;
916 template <
typename Number>
931 template <
typename Number>
936 std::vector<std::vector<Number>> &laplacians,
937 const bool quadrature_points_fastest =
false)
const;
981 template <
typename Number>
1006 template <
typename Number>
1011 const bool quadrature_points_fastest =
false)
const;
1021 template <
typename Number>
1036 template <
typename Number>
1042 const bool quadrature_points_fastest =
false)
const;
1184 const std::vector<Point<spacedim>> &
1204 JxW(
const unsigned int q_point)
const;
1209 const std::vector<double> &
1227 const std::vector<DerivativeForm<1, dim, spacedim>> &
1246 const std::vector<DerivativeForm<2, dim, spacedim>> &
1266 const std::vector<Tensor<3, spacedim>> &
1285 const std::vector<DerivativeForm<3, dim, spacedim>> &
1306 const std::vector<Tensor<4, spacedim>> &
1326 const std::vector<DerivativeForm<4, dim, spacedim>> &
1347 const std::vector<Tensor<5, spacedim>> &
1365 const std::vector<DerivativeForm<1, spacedim, dim>> &
1397 const std::vector<Tensor<1, spacedim>> &
1506 <<
"You are requesting information from an FEValues/FEFaceValues/FESubfaceValues "
1507 <<
"object for which this kind of information has not been computed. What "
1508 <<
"information these objects compute is determined by the update_* flags you "
1509 <<
"pass to the constructor. Here, the operation you are attempting requires "
1511 <<
"> flag to be set, but it was apparently not specified "
1512 <<
"upon construction.");
1520 "FEValues object is not reinit'ed to any cell");
1530 "The FiniteElement you provided to FEValues and the FiniteElement that belongs "
1531 "to the DoFHandler that provided the cell iterator do not match.");
1539 <<
"The shape function with index " << arg1
1540 <<
" is not primitive, i.e. it is vector-valued and "
1541 <<
"has more than one non-zero vector component. This "
1542 <<
"function cannot be called for these shape functions. "
1543 <<
"Maybe you want to use the same function with the "
1544 <<
"_component suffix?");
1554 "The given FiniteElement is not a primitive element but the requested operation "
1555 "only works for those. See FiniteElement::is_primitive() for more information.");
1579 "You have previously called the FEValues::reinit() function with a "
1580 "cell iterator of type Triangulation<dim,spacedim>::cell_iterator. However, "
1581 "when you do this, you cannot call some functions in the FEValues "
1582 "class, such as the get_function_values/gradients/hessians/third_derivatives "
1583 "functions. If you need these functions, then you need to call "
1584 "FEValues::reinit() with an iterator type that allows to extract "
1585 "degrees of freedom, such as DoFHandler<dim,spacedim>::cell_iterator.");
1636 template <
typename Number>
1648 std::variant<typename Triangulation<dim, spacedim>::cell_iterator,
1712 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
1735 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1796 template <
int,
int,
int>
1798 template <
int,
int,
int>
1806template <
int dim,
int spacedim>
1813 return fe_values_views_cache.
scalars[scalar.component].value_or_initialize(
1821template <
int dim,
int spacedim>
1827 fe_values_views_cache.
vectors.size());
1830 .value_or_initialize([vector,
this]() {
1838template <
int dim,
int spacedim>
1850 return fe_values_views_cache
1852 .value_or_initialize([tensor,
this]() {
1860template <
int dim,
int spacedim>
1868 return fe_values_views_cache
1870 .value_or_initialize([tensor,
this]() {
1878template <
int dim,
int spacedim>
1879inline const double &
1881 const unsigned int q_point)
const
1885 ExcAccessToUninitializedField(
"update_values"));
1886 Assert(fe->is_primitive(i), ExcShapeFunctionNotPrimitive(i));
1890 if (fe->is_primitive())
1891 return this->finite_element_output.shape_values(i, q_point);
1902 const unsigned int row =
1903 this->finite_element_output
1904 .shape_function_to_row_table[i * fe->n_components() +
1905 fe->system_to_component_index(i).first];
1906 return this->finite_element_output.shape_values(row, q_point);
1912template <
int dim,
int spacedim>
1915 const unsigned int i,
1916 const unsigned int q_point,
1917 const unsigned int component)
const
1921 ExcAccessToUninitializedField(
"update_values"));
1928 if (fe->get_nonzero_components(i)[component] ==
false)
1934 const unsigned int row =
1935 this->finite_element_output
1936 .shape_function_to_row_table[i * fe->n_components() + component];
1937 return this->finite_element_output.shape_values(row, q_point);
1942template <
int dim,
int spacedim>
1945 const unsigned int q_point)
const
1949 ExcAccessToUninitializedField(
"update_gradients"));
1950 Assert(fe->is_primitive(i), ExcShapeFunctionNotPrimitive(i));
1954 if (fe->is_primitive())
1955 return this->finite_element_output.shape_gradients[i][q_point];
1966 const unsigned int row =
1967 this->finite_element_output
1968 .shape_function_to_row_table[i * fe->n_components() +
1969 fe->system_to_component_index(i).first];
1970 return this->finite_element_output.shape_gradients[row][q_point];
1976template <
int dim,
int spacedim>
1979 const unsigned int i,
1980 const unsigned int q_point,
1981 const unsigned int component)
const
1985 ExcAccessToUninitializedField(
"update_gradients"));
1991 if (fe->get_nonzero_components(i)[component] ==
false)
1997 const unsigned int row =
1998 this->finite_element_output
1999 .shape_function_to_row_table[i * fe->n_components() + component];
2000 return this->finite_element_output.shape_gradients[row][q_point];
2005template <
int dim,
int spacedim>
2008 const unsigned int q_point)
const
2012 ExcAccessToUninitializedField(
"update_hessians"));
2013 Assert(fe->is_primitive(i), ExcShapeFunctionNotPrimitive(i));
2017 if (fe->is_primitive())
2018 return this->finite_element_output.shape_hessians[i][q_point];
2029 const unsigned int row =
2030 this->finite_element_output
2031 .shape_function_to_row_table[i * fe->n_components() +
2032 fe->system_to_component_index(i).first];
2033 return this->finite_element_output.shape_hessians[row][q_point];
2039template <
int dim,
int spacedim>
2042 const unsigned int i,
2043 const unsigned int q_point,
2044 const unsigned int component)
const
2048 ExcAccessToUninitializedField(
"update_hessians"));
2054 if (fe->get_nonzero_components(i)[component] ==
false)
2060 const unsigned int row =
2061 this->finite_element_output
2062 .shape_function_to_row_table[i * fe->n_components() + component];
2063 return this->finite_element_output.shape_hessians[row][q_point];
2068template <
int dim,
int spacedim>
2071 const unsigned int i,
2072 const unsigned int q_point)
const
2076 ExcAccessToUninitializedField(
"update_3rd_derivatives"));
2077 Assert(fe->is_primitive(i), ExcShapeFunctionNotPrimitive(i));
2081 if (fe->is_primitive())
2082 return this->finite_element_output.shape_3rd_derivatives[i][q_point];
2093 const unsigned int row =
2094 this->finite_element_output
2095 .shape_function_to_row_table[i * fe->n_components() +
2096 fe->system_to_component_index(i).first];
2097 return this->finite_element_output.shape_3rd_derivatives[row][q_point];
2103template <
int dim,
int spacedim>
2106 const unsigned int i,
2107 const unsigned int q_point,
2108 const unsigned int component)
const
2112 ExcAccessToUninitializedField(
"update_3rd_derivatives"));
2118 if (fe->get_nonzero_components(i)[component] ==
false)
2124 const unsigned int row =
2125 this->finite_element_output
2126 .shape_function_to_row_table[i * fe->n_components() + component];
2127 return this->finite_element_output.shape_3rd_derivatives[row][q_point];
2132template <
int dim,
int spacedim>
2141template <
int dim,
int spacedim>
2150template <
int dim,
int spacedim>
2154 return this->update_flags;
2159template <
int dim,
int spacedim>
2160inline const std::vector<Point<spacedim>> &
2164 ExcAccessToUninitializedField(
"update_quadrature_points"));
2166 return this->mapping_output.quadrature_points;
2171template <
int dim,
int spacedim>
2172inline const std::vector<double> &
2176 ExcAccessToUninitializedField(
"update_JxW_values"));
2178 return this->mapping_output.JxW_values;
2183template <
int dim,
int spacedim>
2184inline const std::vector<DerivativeForm<1, dim, spacedim>> &
2188 ExcAccessToUninitializedField(
"update_jacobians"));
2190 return this->mapping_output.jacobians;
2195template <
int dim,
int spacedim>
2196inline const std::vector<DerivativeForm<2, dim, spacedim>> &
2200 ExcAccessToUninitializedField(
"update_jacobians_grads"));
2202 return this->mapping_output.jacobian_grads;
2207template <
int dim,
int spacedim>
2210 const unsigned int q_point)
const
2213 ExcAccessToUninitializedField(
"update_jacobian_pushed_forward_grads"));
2215 return this->mapping_output.jacobian_pushed_forward_grads[q_point];
2220template <
int dim,
int spacedim>
2221inline const std::vector<Tensor<3, spacedim>> &
2225 ExcAccessToUninitializedField(
"update_jacobian_pushed_forward_grads"));
2227 return this->mapping_output.jacobian_pushed_forward_grads;
2232template <
int dim,
int spacedim>
2235 const unsigned int q_point)
const
2238 ExcAccessToUninitializedField(
"update_jacobian_2nd_derivatives"));
2240 return this->mapping_output.jacobian_2nd_derivatives[q_point];
2245template <
int dim,
int spacedim>
2246inline const std::vector<DerivativeForm<3, dim, spacedim>> &
2250 ExcAccessToUninitializedField(
"update_jacobian_2nd_derivatives"));
2252 return this->mapping_output.jacobian_2nd_derivatives;
2257template <
int dim,
int spacedim>
2260 const unsigned int q_point)
const
2263 ExcAccessToUninitializedField(
2264 "update_jacobian_pushed_forward_2nd_derivatives"));
2266 return this->mapping_output.jacobian_pushed_forward_2nd_derivatives[q_point];
2271template <
int dim,
int spacedim>
2272inline const std::vector<Tensor<4, spacedim>> &
2276 ExcAccessToUninitializedField(
2277 "update_jacobian_pushed_forward_2nd_derivatives"));
2279 return this->mapping_output.jacobian_pushed_forward_2nd_derivatives;
2284template <
int dim,
int spacedim>
2287 const unsigned int q_point)
const
2290 ExcAccessToUninitializedField(
"update_jacobian_3rd_derivatives"));
2292 return this->mapping_output.jacobian_3rd_derivatives[q_point];
2297template <
int dim,
int spacedim>
2298inline const std::vector<DerivativeForm<4, dim, spacedim>> &
2302 ExcAccessToUninitializedField(
"update_jacobian_3rd_derivatives"));
2304 return this->mapping_output.jacobian_3rd_derivatives;
2309template <
int dim,
int spacedim>
2312 const unsigned int q_point)
const
2315 ExcAccessToUninitializedField(
2316 "update_jacobian_pushed_forward_3rd_derivatives"));
2318 return this->mapping_output.jacobian_pushed_forward_3rd_derivatives[q_point];
2323template <
int dim,
int spacedim>
2324inline const std::vector<Tensor<5, spacedim>> &
2328 ExcAccessToUninitializedField(
2329 "update_jacobian_pushed_forward_3rd_derivatives"));
2331 return this->mapping_output.jacobian_pushed_forward_3rd_derivatives;
2336template <
int dim,
int spacedim>
2337inline const std::vector<DerivativeForm<1, spacedim, dim>> &
2341 ExcAccessToUninitializedField(
"update_inverse_jacobians"));
2343 return this->mapping_output.inverse_jacobians;
2348template <
int dim,
int spacedim>
2358template <
int dim,
int spacedim>
2361 const unsigned int start_dof_index)
const
2363 Assert(start_dof_index <= dofs_per_cell,
2366 start_dof_index, dofs_per_cell);
2371template <
int dim,
int spacedim>
2374 const unsigned int end_dof_index)
const
2376 Assert(end_dof_index < dofs_per_cell,
2379 0U, end_dof_index + 1);
2384template <
int dim,
int spacedim>
2389 0U, n_quadrature_points);
2394template <
int dim,
int spacedim>
2399 ExcAccessToUninitializedField(
"update_quadrature_points"));
2403 return this->mapping_output.quadrature_points[q_point];
2408template <
int dim,
int spacedim>
2413 ExcAccessToUninitializedField(
"update_JxW_values"));
2417 return this->mapping_output.JxW_values[q_point];
2422template <
int dim,
int spacedim>
2427 ExcAccessToUninitializedField(
"update_jacobians"));
2431 return this->mapping_output.jacobians[q_point];
2436template <
int dim,
int spacedim>
2441 ExcAccessToUninitializedField(
"update_jacobians_grads"));
2445 return this->mapping_output.jacobian_grads[q_point];
2450template <
int dim,
int spacedim>
2455 ExcAccessToUninitializedField(
"update_inverse_jacobians"));
2459 return this->mapping_output.inverse_jacobians[q_point];
2464template <
int dim,
int spacedim>
2470 "update_normal_vectors")));
2474 return this->mapping_output.normal_vectors[q_point];
typename LevelSelector::cell_iterator level_cell_iterator
types::global_dof_index n_dofs_for_dof_handler() const
CellIteratorWrapper()=default
std::optional< std::variant< typename Triangulation< dim, spacedim >::cell_iterator, typename DoFHandler< dim, spacedim >::cell_iterator, typename DoFHandler< dim, spacedim >::level_cell_iterator > > cell
bool is_initialized() const
void get_interpolated_dof_values(const ReadVector< Number > &in, Vector< Number > &out) const
CellSimilarity::Similarity cell_similarity
const Tensor< 5, spacedim > & jacobian_pushed_forward_3rd_derivative(const unsigned int q_point) const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > dof_indices_ending_at(const unsigned int end_dof_index) const
const FEValuesViews::Vector< dim, spacedim > & operator[](const FEValuesExtractors::Vector &vector) const
const std::vector< double > & get_JxW_values() const
const DerivativeForm< 1, dim, spacedim > & jacobian(const unsigned int q_point) const
::internal::FEValuesViews::Cache< dim, spacedim > fe_values_views_cache
FEValuesBase(const FEValuesBase &)=delete
const FEValuesViews::Scalar< dim, spacedim > & operator[](const FEValuesExtractors::Scalar &scalar) const
Triangulation< dim, spacedim >::cell_iterator get_cell() const
boost::signals2::connection tria_listener_mesh_transform
void get_function_values(const ReadVector< Number > &fe_function, std::vector< Number > &values) const
const std::vector< Point< spacedim > > & get_quadrature_points() const
const std::vector< DerivativeForm< 1, dim, spacedim > > & get_jacobians() const
const DerivativeForm< 2, dim, spacedim > & jacobian_grad(const unsigned int q_point) const
internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > mapping_output
virtual ~FEValuesBase() override
const std::vector< DerivativeForm< 3, dim, spacedim > > & get_jacobian_2nd_derivatives() const
UpdateFlags get_update_flags() const
const FEValuesViews::Tensor< 2, dim, spacedim > & operator[](const FEValuesExtractors::Tensor< 2 > &tensor) const
const unsigned int dofs_per_cell
void check_cell_similarity(const typename Triangulation< dim, spacedim >::cell_iterator &cell)
Tensor< 3, spacedim > shape_3rd_derivative_component(const unsigned int i, const unsigned int q_point, const unsigned int component) const
CellIteratorWrapper present_cell
const Tensor< 1, spacedim > & normal_vector(const unsigned int q_point) const
static constexpr unsigned int space_dimension
Tensor< 2, spacedim > shape_hessian_component(const unsigned int i, const unsigned int q_point, const unsigned int component) const
void get_function_hessians(const ReadVector< Number > &fe_function, std::vector< Tensor< 2, spacedim, Number > > &hessians) const
void always_allow_check_for_cell_similarity(const bool allow)
void get_function_laplacians(const ReadVector< Number > &fe_function, std::vector< Number > &laplacians) const
const Point< spacedim > & quadrature_point(const unsigned int q_point) const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > dof_indices_starting_at(const unsigned int start_dof_index) const
double shape_value_component(const unsigned int i, const unsigned int q_point, const unsigned int component) const
const Mapping< dim, spacedim > & get_mapping() const
const unsigned int n_quadrature_points
CellSimilarity::Similarity get_cell_similarity() const
const std::vector< Tensor< 1, spacedim > > & get_normal_vectors() const
std::size_t memory_consumption() const
const Tensor< 3, spacedim > & jacobian_pushed_forward_grad(const unsigned int q_point) const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > dof_indices() const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > quadrature_point_indices() const
void get_function_third_derivatives(const ReadVector< Number > &fe_function, std::vector< Tensor< 3, spacedim, Number > > &third_derivatives) const
const Tensor< 2, spacedim > & shape_hessian(const unsigned int i, const unsigned int q_point) const
const std::vector< Tensor< 5, spacedim > > & get_jacobian_pushed_forward_3rd_derivatives() const
const Tensor< 4, spacedim > & jacobian_pushed_forward_2nd_derivative(const unsigned int q_point) const
const Tensor< 3, spacedim > & shape_3rd_derivative(const unsigned int i, const unsigned int q_point) const
UpdateFlags compute_update_flags(const UpdateFlags update_flags) const
std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > mapping_data
void get_function_gradients(const ReadVector< Number > &fe_function, std::vector< Tensor< 1, spacedim, Number > > &gradients) const
const std::vector< DerivativeForm< 2, dim, spacedim > > & get_jacobian_grads() const
boost::signals2::connection tria_listener_refinement
const std::vector< Tensor< 3, spacedim > > & get_jacobian_pushed_forward_grads() const
const DerivativeForm< 4, dim, spacedim > & jacobian_3rd_derivative(const unsigned int q_point) const
const DerivativeForm< 1, spacedim, dim > & inverse_jacobian(const unsigned int q_point) const
void invalidate_present_cell()
const std::vector< Tensor< 4, spacedim > > & get_jacobian_pushed_forward_2nd_derivatives() const
const DerivativeForm< 3, dim, spacedim > & jacobian_2nd_derivative(const unsigned int q_point) const
const ObserverPointer< const Mapping< dim, spacedim >, FEValuesBase< dim, spacedim > > mapping
Tensor< 1, spacedim > shape_grad_component(const unsigned int i, const unsigned int q_point, const unsigned int component) const
bool check_for_cell_similarity_allowed
::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > finite_element_output
const FEValuesViews::SymmetricTensor< 2, dim, spacedim > & operator[](const FEValuesExtractors::SymmetricTensor< 2 > &tensor) const
const ObserverPointer< const FiniteElement< dim, spacedim >, FEValuesBase< dim, spacedim > > fe
const Tensor< 1, spacedim > & shape_grad(const unsigned int i, const unsigned int q_point) const
const std::vector< DerivativeForm< 4, dim, spacedim > > & get_jacobian_3rd_derivatives() const
std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > fe_data
const FiniteElement< dim, spacedim > & get_fe() const
double JxW(const unsigned int q_point) const
const double & shape_value(const unsigned int i, const unsigned int q_point) const
void maybe_invalidate_previous_present_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell)
FEValuesBase & operator=(const FEValuesBase &)=delete
const std::vector< DerivativeForm< 1, spacedim, dim > > & get_inverse_jacobians() const
const unsigned int max_n_quadrature_points
static constexpr unsigned int dimension
Abstract base class for mapping classes.
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcAccessToUninitializedField(std::string arg1)
#define Assert(cond, exc)
static ::ExceptionBase & ExcNotReinited()
static ::ExceptionBase & ExcNeedsDoFHandler()
static ::ExceptionBase & ExcShapeFunctionNotPrimitive(int arg1)
#define AssertIndexRange(index, range)
#define DeclExceptionMsg(Exception, defaulttext)
static ::ExceptionBase & ExcIndexRange(std::size_t arg1, std::size_t arg2, std::size_t arg3)
#define DeclException1(Exception1, type1, outsequence)
static ::ExceptionBase & ExcFEDontMatch()
static ::ExceptionBase & ExcFENotPrimitive()
typename ActiveSelector::cell_iterator cell_iterator
TriaIterator< CellAccessor< dim, spacedim > > cell_iterator
@ update_jacobian_pushed_forward_2nd_derivatives
@ update_jacobian_pushed_forward_grads
@ update_hessians
Second derivatives of shape functions.
@ update_jacobian_3rd_derivatives
@ update_values
Shape function values.
@ update_jacobian_grads
Gradient of volume element.
@ update_normal_vectors
Normal vectors.
@ update_3rd_derivatives
Third derivatives of shape functions.
@ 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.
@ update_jacobian_pushed_forward_3rd_derivatives
@ update_jacobian_2nd_derivatives
boost::integer_range< IncrementableType > iota_view
std::vector< Lazy<::FEValuesViews::Vector< dim, spacedim > > > vectors
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