13#ifndef dealii_fe_values_base_h
14#define dealii_fe_values_base_h
44#include <boost/signals2/connection.hpp>
153template <
int dim,
int spacedim>
275 shape_value(
const unsigned int i,
const unsigned int q_point)
const;
299 const unsigned int q_point,
300 const unsigned int component)
const;
328 shape_grad(
const unsigned int i,
const unsigned int q_point)
const;
348 const unsigned int q_point,
349 const unsigned int component)
const;
391 const unsigned int q_point,
392 const unsigned int component)
const;
434 const unsigned int q_point,
435 const unsigned int component)
const;
485 template <
typename Number>
488 std::vector<Number> &values)
const;
503 template <
typename Number>
564 template <
typename Number>
568 std::vector<Number> &values)
const;
578 template <
typename Number>
606 template <
typename Number>
611 const bool quadrature_points_fastest)
const;
659 template <
typename Number>
681 template <
typename Number>
695 template <
typename Number>
710 template <
typename Number>
716 const bool quadrature_points_fastest =
false)
const;
761 template <
typename Number>
784 template <
typename Number>
789 const bool quadrature_points_fastest =
false)
const;
799 template <
typename Number>
814 template <
typename Number>
820 const bool quadrature_points_fastest =
false)
const;
862 template <
typename Number>
865 std::vector<Number> &laplacians)
const;
886 template <
typename Number>
899 template <
typename Number>
904 std::vector<Number> &laplacians)
const;
914 template <
typename Number>
929 template <
typename Number>
934 std::vector<std::vector<Number>> &laplacians,
935 const bool quadrature_points_fastest =
false)
const;
979 template <
typename Number>
1004 template <
typename Number>
1009 const bool quadrature_points_fastest =
false)
const;
1019 template <
typename Number>
1034 template <
typename Number>
1040 const bool quadrature_points_fastest =
false)
const;
1182 const std::vector<Point<spacedim>> &
1202 JxW(
const unsigned int q_point)
const;
1207 const std::vector<double> &
1225 const std::vector<DerivativeForm<1, dim, spacedim>> &
1244 const std::vector<DerivativeForm<2, dim, spacedim>> &
1264 const std::vector<Tensor<3, spacedim>> &
1283 const std::vector<DerivativeForm<3, dim, spacedim>> &
1304 const std::vector<Tensor<4, spacedim>> &
1324 const std::vector<DerivativeForm<4, dim, spacedim>> &
1345 const std::vector<Tensor<5, spacedim>> &
1363 const std::vector<DerivativeForm<1, spacedim, dim>> &
1395 const std::vector<Tensor<1, spacedim>> &
1504 <<
"You are requesting information from an FEValues/FEFaceValues/FESubfaceValues "
1505 <<
"object for which this kind of information has not been computed. What "
1506 <<
"information these objects compute is determined by the update_* flags you "
1507 <<
"pass to the constructor. Here, the operation you are attempting requires "
1509 <<
"> flag to be set, but it was apparently not specified "
1510 <<
"upon construction.");
1518 "FEValues object is not reinit'ed to any cell");
1528 "The FiniteElement you provided to FEValues and the FiniteElement that belongs "
1529 "to the DoFHandler that provided the cell iterator do not match. "
1530 "In most cases, this is a bug: You're calling FEValues::reinit() with a cell "
1531 "from the wrong DoFHandler.\n"
1533 "On the other hand, there are cases where you want to only use an FEValues "
1534 "object with the geometric information of a cell, without the information "
1535 "about degrees of freedom associated with this cell. In those cases, you "
1536 "may want to cast the cell iterator to one that only has the "
1537 "geometric information of the triangulation, and initialize with that instead:\n"
1538 "\tfe_values.reinit(\n"
1539 "\t\tstatic_cast<Triangulation<dim, spacedim>::cell_iterator>(cell));");
1547 <<
"The shape function with index " << arg1
1548 <<
" is not primitive, i.e. it is vector-valued and "
1549 <<
"has more than one non-zero vector component. This "
1550 <<
"function cannot be called for these shape functions. "
1551 <<
"Maybe you want to use the same function with the "
1552 <<
"_component suffix?");
1562 "The given FiniteElement is not a primitive element but the requested operation "
1563 "only works for those. See FiniteElement::is_primitive() for more information.");
1587 "You have previously called the FEValues::reinit() function with a "
1588 "cell iterator of type Triangulation<dim,spacedim>::cell_iterator. However, "
1589 "when you do this, you cannot call some functions in the FEValues "
1590 "class, such as the get_function_values/gradients/hessians/third_derivatives "
1591 "functions. If you need these functions, then you need to call "
1592 "FEValues::reinit() with an iterator type that allows to extract "
1593 "degrees of freedom, such as DoFHandler<dim,spacedim>::cell_iterator.");
1644 template <
typename Number>
1656 std::variant<typename Triangulation<dim, spacedim>::cell_iterator,
1708 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
1731 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1792 template <
int,
int,
int>
1794 template <
int,
int,
int>
1808 template <
int dim,
int spacedim>
1809 std::vector<unsigned int>
1817template <
int dim,
int spacedim>
1824 return fe_values_views_cache.
scalars[
scalar.component].value_or_initialize(
1832template <
int dim,
int spacedim>
1838 fe_values_views_cache.
vectors.size());
1841 .value_or_initialize([vector,
this]() {
1849template <
int dim,
int spacedim>
1861 return fe_values_views_cache
1863 .value_or_initialize([tensor,
this]() {
1871template <
int dim,
int spacedim>
1879 return fe_values_views_cache
1881 .value_or_initialize([tensor,
this]() {
1889template <
int dim,
int spacedim>
1890inline const double &
1892 const unsigned int q_point)
const
1896 ExcAccessToUninitializedField(
"update_values"));
1897 Assert(fe->is_primitive(i), ExcShapeFunctionNotPrimitive(i));
1901 if (fe->is_primitive())
1902 return this->finite_element_output.shape_values(i, q_point);
1913 const unsigned int row =
1914 this->finite_element_output
1915 .shape_function_to_row_table[i * fe->n_components() +
1916 fe->system_to_component_index(i).first];
1917 return this->finite_element_output.shape_values(row, q_point);
1923template <
int dim,
int spacedim>
1926 const unsigned int i,
1927 const unsigned int q_point,
1928 const unsigned int component)
const
1932 ExcAccessToUninitializedField(
"update_values"));
1939 if (fe->get_nonzero_components(i)[component] ==
false)
1945 const unsigned int row =
1946 this->finite_element_output
1947 .shape_function_to_row_table[i * fe->n_components() +
component];
1948 return this->finite_element_output.shape_values(row, q_point);
1953template <
int dim,
int spacedim>
1956 const unsigned int q_point)
const
1960 ExcAccessToUninitializedField(
"update_gradients"));
1961 Assert(fe->is_primitive(i), ExcShapeFunctionNotPrimitive(i));
1965 if (fe->is_primitive())
1966 return this->finite_element_output.shape_gradients[i][q_point];
1977 const unsigned int row =
1978 this->finite_element_output
1979 .shape_function_to_row_table[i * fe->n_components() +
1980 fe->system_to_component_index(i).first];
1981 return this->finite_element_output.shape_gradients[row][q_point];
1987template <
int dim,
int spacedim>
1990 const unsigned int i,
1991 const unsigned int q_point,
1992 const unsigned int component)
const
1996 ExcAccessToUninitializedField(
"update_gradients"));
2002 if (fe->get_nonzero_components(i)[component] ==
false)
2008 const unsigned int row =
2009 this->finite_element_output
2010 .shape_function_to_row_table[i * fe->n_components() +
component];
2011 return this->finite_element_output.shape_gradients[row][q_point];
2016template <
int dim,
int spacedim>
2019 const unsigned int q_point)
const
2023 ExcAccessToUninitializedField(
"update_hessians"));
2024 Assert(fe->is_primitive(i), ExcShapeFunctionNotPrimitive(i));
2028 if (fe->is_primitive())
2029 return this->finite_element_output.shape_hessians[i][q_point];
2040 const unsigned int row =
2041 this->finite_element_output
2042 .shape_function_to_row_table[i * fe->n_components() +
2043 fe->system_to_component_index(i).first];
2044 return this->finite_element_output.shape_hessians[row][q_point];
2050template <
int dim,
int spacedim>
2053 const unsigned int i,
2054 const unsigned int q_point,
2055 const unsigned int component)
const
2059 ExcAccessToUninitializedField(
"update_hessians"));
2065 if (fe->get_nonzero_components(i)[component] ==
false)
2071 const unsigned int row =
2072 this->finite_element_output
2073 .shape_function_to_row_table[i * fe->n_components() +
component];
2074 return this->finite_element_output.shape_hessians[row][q_point];
2079template <
int dim,
int spacedim>
2082 const unsigned int i,
2083 const unsigned int q_point)
const
2087 ExcAccessToUninitializedField(
"update_3rd_derivatives"));
2088 Assert(fe->is_primitive(i), ExcShapeFunctionNotPrimitive(i));
2092 if (fe->is_primitive())
2093 return this->finite_element_output.shape_3rd_derivatives[i][q_point];
2104 const unsigned int row =
2105 this->finite_element_output
2106 .shape_function_to_row_table[i * fe->n_components() +
2107 fe->system_to_component_index(i).first];
2108 return this->finite_element_output.shape_3rd_derivatives[row][q_point];
2114template <
int dim,
int spacedim>
2117 const unsigned int i,
2118 const unsigned int q_point,
2119 const unsigned int component)
const
2123 ExcAccessToUninitializedField(
"update_3rd_derivatives"));
2129 if (fe->get_nonzero_components(i)[component] ==
false)
2135 const unsigned int row =
2136 this->finite_element_output
2137 .shape_function_to_row_table[i * fe->n_components() +
component];
2138 return this->finite_element_output.shape_3rd_derivatives[row][q_point];
2143template <
int dim,
int spacedim>
2152template <
int dim,
int spacedim>
2161template <
int dim,
int spacedim>
2165 return this->update_flags;
2170template <
int dim,
int spacedim>
2171inline const std::vector<Point<spacedim>> &
2175 ExcAccessToUninitializedField(
"update_quadrature_points"));
2177 return this->mapping_output.quadrature_points;
2182template <
int dim,
int spacedim>
2183inline const std::vector<double> &
2187 ExcAccessToUninitializedField(
"update_JxW_values"));
2189 return this->mapping_output.JxW_values;
2194template <
int dim,
int spacedim>
2195inline const std::vector<DerivativeForm<1, dim, spacedim>> &
2199 ExcAccessToUninitializedField(
"update_jacobians"));
2201 return this->mapping_output.jacobians;
2206template <
int dim,
int spacedim>
2207inline const std::vector<DerivativeForm<2, dim, spacedim>> &
2211 ExcAccessToUninitializedField(
"update_jacobians_grads"));
2213 return this->mapping_output.jacobian_grads;
2218template <
int dim,
int spacedim>
2221 const unsigned int q_point)
const
2224 ExcAccessToUninitializedField(
"update_jacobian_pushed_forward_grads"));
2226 return this->mapping_output.jacobian_pushed_forward_grads[q_point];
2231template <
int dim,
int spacedim>
2232inline const std::vector<Tensor<3, spacedim>> &
2236 ExcAccessToUninitializedField(
"update_jacobian_pushed_forward_grads"));
2238 return this->mapping_output.jacobian_pushed_forward_grads;
2243template <
int dim,
int spacedim>
2246 const unsigned int q_point)
const
2249 ExcAccessToUninitializedField(
"update_jacobian_2nd_derivatives"));
2251 return this->mapping_output.jacobian_2nd_derivatives[q_point];
2256template <
int dim,
int spacedim>
2257inline const std::vector<DerivativeForm<3, dim, spacedim>> &
2261 ExcAccessToUninitializedField(
"update_jacobian_2nd_derivatives"));
2263 return this->mapping_output.jacobian_2nd_derivatives;
2268template <
int dim,
int spacedim>
2271 const unsigned int q_point)
const
2274 ExcAccessToUninitializedField(
2275 "update_jacobian_pushed_forward_2nd_derivatives"));
2277 return this->mapping_output.jacobian_pushed_forward_2nd_derivatives[q_point];
2282template <
int dim,
int spacedim>
2283inline const std::vector<Tensor<4, spacedim>> &
2287 ExcAccessToUninitializedField(
2288 "update_jacobian_pushed_forward_2nd_derivatives"));
2290 return this->mapping_output.jacobian_pushed_forward_2nd_derivatives;
2295template <
int dim,
int spacedim>
2298 const unsigned int q_point)
const
2301 ExcAccessToUninitializedField(
"update_jacobian_3rd_derivatives"));
2303 return this->mapping_output.jacobian_3rd_derivatives[q_point];
2308template <
int dim,
int spacedim>
2309inline const std::vector<DerivativeForm<4, dim, spacedim>> &
2313 ExcAccessToUninitializedField(
"update_jacobian_3rd_derivatives"));
2315 return this->mapping_output.jacobian_3rd_derivatives;
2320template <
int dim,
int spacedim>
2323 const unsigned int q_point)
const
2326 ExcAccessToUninitializedField(
2327 "update_jacobian_pushed_forward_3rd_derivatives"));
2329 return this->mapping_output.jacobian_pushed_forward_3rd_derivatives[q_point];
2334template <
int dim,
int spacedim>
2335inline const std::vector<Tensor<5, spacedim>> &
2339 ExcAccessToUninitializedField(
2340 "update_jacobian_pushed_forward_3rd_derivatives"));
2342 return this->mapping_output.jacobian_pushed_forward_3rd_derivatives;
2347template <
int dim,
int spacedim>
2348inline const std::vector<DerivativeForm<1, spacedim, dim>> &
2352 ExcAccessToUninitializedField(
"update_inverse_jacobians"));
2354 return this->mapping_output.inverse_jacobians;
2359template <
int dim,
int spacedim>
2369template <
int dim,
int spacedim>
2372 const unsigned int start_dof_index)
const
2374 Assert(start_dof_index <= dofs_per_cell,
2377 start_dof_index, dofs_per_cell);
2382template <
int dim,
int spacedim>
2385 const unsigned int end_dof_index)
const
2387 Assert(end_dof_index < dofs_per_cell,
2390 0U, end_dof_index + 1);
2395template <
int dim,
int spacedim>
2400 0U, n_quadrature_points);
2405template <
int dim,
int spacedim>
2410 ExcAccessToUninitializedField(
"update_quadrature_points"));
2414 return this->mapping_output.quadrature_points[q_point];
2419template <
int dim,
int spacedim>
2424 ExcAccessToUninitializedField(
"update_JxW_values"));
2428 return this->mapping_output.JxW_values[q_point];
2433template <
int dim,
int spacedim>
2438 ExcAccessToUninitializedField(
"update_jacobians"));
2442 return this->mapping_output.jacobians[q_point];
2447template <
int dim,
int spacedim>
2452 ExcAccessToUninitializedField(
"update_jacobians_grads"));
2456 return this->mapping_output.jacobian_grads[q_point];
2461template <
int dim,
int spacedim>
2466 ExcAccessToUninitializedField(
"update_inverse_jacobians"));
2470 return this->mapping_output.inverse_jacobians[q_point];
2475template <
int dim,
int spacedim>
2481 "update_normal_vectors")));
2485 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
void get_interpolated_dof_values(const ReadVector< Number > &in, ArrayView< Number > out) 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
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
void get_function_values(const ReadVector< Number > &fe_function, std::vector< Number > &values) const
const std::vector< Point< spacedim > > & get_quadrature_points() const
boost::signals2::connection tria_listener_any_change
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
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
* * * ScaleZFunction< dim, Number, components >::ScaleZFunction * component(component)
std::vector< unsigned int > make_shape_function_to_row_table(const FiniteElement< dim, spacedim > &fe)
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