14#ifndef dealii_matrix_free_fe_evaluation_data_h
15#define dealii_matrix_free_fe_evaluation_data_h
49 <<
"You are requesting information from an FEEvaluation/FEFaceEvaluation "
50 <<
"object for which this kind of information has not been computed. What "
51 <<
"information these objects compute is determined by the update_* flags "
52 <<
"you pass to MatrixFree::reinit() via MatrixFree::AdditionalData. "
53 <<
"Here, the operation you are attempting requires the <" << arg1
54 <<
"> flag to be set, but it was apparently not specified "
55 <<
"upon initialization.");
61 int n_q_points_1d = fe_degree + 1,
62 int n_components_ = 1,
63 typename Number = double,
76 namespace MatrixFreeFunctions
78 template <
int,
typename>
79 class MappingDataOnTheFly;
112template <
int dim,
typename Number,
bool is_face>
118 MappingInfoStorage<(is_face ? dim - 1 : dim), dim, Number>;
165 const unsigned int n_components);
194 JxW(
const unsigned int q_point)
const;
377 internal::MatrixFreeFunctions::GeometryType
397 const
std::vector<
unsigned int> &
510 const std::array<unsigned int, n_lanes> &
541 const std::array<unsigned int, n_lanes> &
582 template <
typename T>
608 template <
typename T,
int D>
618 template <
typename T>
630 template <
typename T>
642 template <
typename T>
679 const std::shared_ptr<
1030 template <
int,
int,
typename,
bool,
typename>
1033 template <
int,
int,
int,
int,
typename,
typename>
1054template <
int dim,
typename Number,
bool is_face>
1059 InitializationData{&shape_info, nullptr, nullptr, 0, 0, nullptr},
1066template <
int dim,
typename Number,
bool is_face>
1068 const InitializationData &initialization_data,
1072 :
data(initialization_data.shape_info)
1120template <
int dim,
typename Number,
bool is_face>
1122 const std::shared_ptr<
1160template <
int dim,
typename Number,
bool is_face>
1215template <
int dim,
typename Number,
bool is_face>
1226 const unsigned int tensor_dofs_per_component =
1227 Utilities::fixed_power<dim>(
data->data.front().fe_degree + 1);
1230 const unsigned int size_scratch_data =
1234 const unsigned int size_data_arrays =
1236 (
n_components * ((dim * (dim + 1)) / 2 + 2 * dim + 2) *
1241 const unsigned int allocated_size = size_scratch_data + size_data_arrays + 12;
1274template <
int dim,
typename Number,
bool is_face>
1280 ExcMessage(
"Faces can only be set if the is_face template parameter "
1305template <
int dim,
typename Number,
bool is_face>
1308 const unsigned int q_point)
const
1313 "update_normal_vectors"));
1323template <
int dim,
typename Number,
bool is_face>
1326 const unsigned int q_point)
const
1333template <
int dim,
typename Number,
bool is_face>
1340 "update_values|update_gradients"));
1352template <
int dim,
typename Number,
bool is_face>
1355 const unsigned int q)
const
1360 "update_quadrature_points"));
1365 if (is_face ==
false &&
1373 for (
unsigned int d = 0;
d < dim; ++
d)
1374 point[d] += jac[d][d] *
static_cast<typename Number::value_type
>(
1377 for (
unsigned int d = 0;
d < dim; ++
d)
1378 for (
unsigned int e = 0;
e < dim; ++
e)
1379 point[d] += jac[d][e] *
static_cast<typename Number::value_type
>(
1389template <
int dim,
typename Number,
bool is_face>
1392 const unsigned int q_point)
const
1397 "update_gradients"));
1406template <
int dim,
typename Number,
bool is_face>
1415template <
int dim,
typename Number,
bool is_face>
1428template <
int dim,
typename Number,
bool is_face>
1442template <
int dim,
typename Number,
bool is_face>
1456template <
int dim,
typename Number,
bool is_face>
1470template <
int dim,
typename Number,
bool is_face>
1484template <
int dim,
typename Number,
bool is_face>
1497template <
int dim,
typename Number,
bool is_face>
1510template <
int dim,
typename Number,
bool is_face>
1527template <
int dim,
typename Number,
bool is_face>
1540template <
int dim,
typename Number,
bool is_face>
1550template <
int dim,
typename Number,
bool is_face>
1556 "FEEvaluation was not initialized with a MatrixFree object!"));
1562template <
int dim,
typename Number,
bool is_face>
1563inline const std::vector<unsigned int> &
1566 return data->lexicographic_numbering;
1571template <
int dim,
typename Number,
bool is_face>
1580template <
int dim,
typename Number,
bool is_face>
1593template <
int dim,
typename Number,
bool is_face>
1602template <
int dim,
typename Number,
bool is_face>
1611template <
int dim,
typename Number,
bool is_face>
1620template <
int dim,
typename Number,
bool is_face>
1629template <
int dim,
typename Number,
bool is_face>
1638 ExcMessage(
"All face numbers can only be queried for ECL at exterior "
1639 "faces. Use get_face_no() in other cases."));
1646template <
int dim,
typename Number,
bool is_face>
1655template <
int dim,
typename Number,
bool is_face>
1658 const unsigned int v)
const
1665 ExcMessage(
"All face numbers can only be queried for ECL at exterior "
1666 "faces. Use get_face_no() in other cases."));
1673template <
int dim,
typename Number,
bool is_face>
1682template <
int dim,
typename Number,
bool is_face>
1691template <
int dim,
typename Number,
bool is_face>
1703 template <std::size_t
N,
1704 typename VectorOfArrayType,
1708 process_cell_or_face_data(
const std::array<unsigned int, N> indices,
1709 VectorOfArrayType &array,
1713 for (
unsigned int i = 0; i <
N; ++i)
1717 fu(out[i], array[indices[i] / N][indices[i] % N]);
1721 template <std::
size_t N,
typename VectorOfArrayType,
typename ArrayType>
1723 set_valid_element_to_array(
const std::array<unsigned int, N> indices,
1724 const VectorOfArrayType &array,
1730 std::size_t
index = 0;
1734 for (
unsigned int i = 0; i <
N; ++i)
1735 out[i] = array[indices[
index] / N][indices[
index] % N];
1741template <
int dim,
typename Number,
bool is_face>
1742template <
typename T>
1748 internal::set_valid_element_to_array(this->get_cell_ids(), array, out);
1749 internal::process_cell_or_face_data(this->get_cell_ids(),
1752 [](
auto &local,
const auto &global) {
1759template <
int dim,
typename Number,
bool is_face>
1760template <
typename T,
int D>
1766 static_assert(D >= 2,
"Table dimension must be at least 2");
1769 for (
unsigned int d = 0;
d < D - 1; ++
d)
1770 Assert(dst.size(d) == src.size(d + 1),
1771 ExcMessage(
"Dimension mismatch between src and dst tables."));
1773 for (
unsigned int lane = 0; lane < n_lanes; ++lane)
1776 const unsigned int src_index = this->get_cell_ids()[lane] / n_lanes;
1777 const unsigned int array_lane = this->get_cell_ids()[lane] % n_lanes;
1783 auto copy_recursively = [&](
auto self,
1785 const auto &src_slice,
1786 unsigned int depth) ->
void {
1787 if constexpr (std::is_same_v<std::decay_t<
decltype(dst_slice)>, T>)
1790 dst_slice[lane] = src_slice[array_lane];
1798 for (
unsigned int i = 0; i < src.size(depth); ++i)
1799 self(self, dst_slice[i], src_slice[i], depth + 1);
1803 copy_recursively(copy_recursively, dst, src[src_index], 1);
1809template <
int dim,
typename Number,
bool is_face>
1810template <
typename T>
1815 internal::process_cell_or_face_data(this->get_cell_ids(),
1818 [](
const auto &local,
auto &global) {
1825template <
int dim,
typename Number,
bool is_face>
1826template <
typename T>
1832 internal::set_valid_element_to_array(this->get_cell_ids(), array, out);
1833 internal::process_cell_or_face_data(this->get_face_ids(),
1836 [](
auto &local,
const auto &global) {
1844template <
int dim,
typename Number,
bool is_face>
1845template <
typename T>
1850 internal::process_cell_or_face_data(this->get_face_ids(),
1853 [](
const auto &local,
auto &global) {
void resize_fast(const size_type new_size)
void resize(const size_type new_size)
void reinit(value_type *starting_element, const std::size_t n_elements)
AlignedVector< VectorizedArrayType > * scratch_data_array
bool hessians_quad_submitted
internal::MatrixFreeFunctions::GeometryType get_cell_type() const
const Tensor< 2, dim, Number > * jacobian
const MappingInfoStorageType::QuadratureDescriptor * descriptor
const unsigned int n_quadrature_points
const MappingInfoStorageType * mapping_data
internal::MatrixFreeFunctions::DoFInfo::DoFAccessIndex dof_access_index
std::uint8_t get_face_no(const unsigned int v=0) const
ArrayView< Number > scratch_data
internal::MatrixFreeFunctions::DoFInfo::DoFAccessIndex get_dof_access_index() const
const Point< dim, Number > * quadrature_points
unsigned int subface_index
const Tensor< 1, dim *(dim+1)/2, Tensor< 1, dim, Number > > * jacobian_gradients_non_inverse
ScalarNumber shape_info_number_type
bool values_quad_submitted
FEEvaluationData(const FEEvaluationData &other)=default
const ShapeInfoType & get_shape_info() const
void set_face_data(AlignedVector< T > &array, const T &value) const
FEEvaluationData(const InitializationData &initialization_data, const bool is_interior_face, const unsigned int quadrature_index, const unsigned int first_selected_component)
internal::MatrixFreeFunctions::ShapeInfo< typename internal::VectorizedArrayTrait< VectorizedArrayType >::value_type > ShapeInfoType
void reinit_face(const internal::MatrixFreeFunctions::FaceToCellTopology< n_lanes > &face)
Number JxW(const unsigned int q_point) const
const std::array< unsigned int, n_lanes > & get_face_ids() const
unsigned int get_first_selected_component() const
const unsigned int n_fe_components
const ShapeInfoType * data
T read_face_data(const AlignedVector< T > &array) const
Number * gradients_from_hessians_quad
std::shared_ptr< internal::MatrixFreeFunctions::MappingDataOnTheFly< dim, Number > > mapped_geometry
internal::MatrixFreeFunctions::DoFInfo DoFInfo
unsigned int get_active_quadrature_index() const
const internal::MatrixFreeFunctions::DoFInfo & get_dof_info() const
const std::array< unsigned int, n_lanes > & get_cell_ids() const
unsigned int get_mapping_data_index_offset() const
bool gradients_quad_initialized
void set_data_pointers(AlignedVector< Number > *scratch_data, const unsigned int n_components)
Tensor< 2, dim, Number > inverse_jacobian(const unsigned int q_point) const
std::array< std::uint8_t, n_lanes > face_numbers
const unsigned int active_fe_index
static constexpr unsigned int n_lanes
const Tensor< 1, dim, Number > * normal_vectors
internal::MatrixFreeFunctions::GeometryType cell_type
const Number * begin_gradients() const
const std::array< unsigned int, n_lanes > & get_cell_or_face_ids() const
Tensor< 1, dim, Number > normal_vector(const unsigned int q_point) const
std::array< unsigned int, n_lanes > cell_ids
unsigned int get_current_cell_index() const
unsigned int get_subface_index() const
bool divergence_is_requested
Tensor< 1, dim, Number > get_normal_vector(const unsigned int q_point) const
const unsigned int active_quad_index
unsigned int get_active_fe_index() const
Number * values_from_gradients_quad
void set_cell_data(AlignedVector< T > &array, const T &value) const
bool gradients_quad_submitted
const unsigned int quadrature_index
unsigned int get_quadrature_index() const
const ScalarNumber * quadrature_weights
const Tensor< 1, dim *(dim+1)/2, Tensor< 1, dim, Number > > * jacobian_gradients
const Tensor< 1, dim, Number > * normal_x_jacobian
bool is_interior_face() const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > quadrature_point_indices() const
const std::vector< unsigned int > & get_internal_dof_numbering() const
FEEvaluationData & operator=(const FEEvaluationData &other)
virtual ~FEEvaluationData()=default
ArrayView< Number > get_scratch_data() const
T read_cell_data(const AlignedVector< T > &array) const
static constexpr unsigned int dimension
FEEvaluationData(const std::shared_ptr< internal::MatrixFreeFunctions::MappingDataOnTheFly< dim, Number > > &mapping_data, const unsigned int n_fe_components, const unsigned int first_selected_component)
bool values_quad_initialized
FEEvaluationData(const ShapeInfoType &shape_info, const bool is_interior_face=true)
Point< dim, Number > quadrature_point(const unsigned int q) const
std::array< types::geometric_orientation, n_lanes > face_orientations
const Number * begin_values() const
bool dof_values_initialized
typename internal::VectorizedArrayTrait< Number >::value_type ScalarNumber
std::array< unsigned int, n_lanes > face_ids
void read_cell_data(const Table< D, T > &src, Table< D - 1, T > &dst) const
const Number * begin_dof_values() const
std::uint8_t get_face_orientation(const unsigned int v=0) const
const Number * begin_hessians() const
bool hessians_quad_initialized
unsigned int get_cell_or_face_batch_id() const
const unsigned int first_selected_component
const unsigned int dofs_per_component
const unsigned int n_q_points
static constexpr unsigned int n_components
const Point< dim > & point(const unsigned int i) const
#define DEAL_II_ALWAYS_INLINE
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_DEPRECATED_WITH_COMMENT(comment)
constexpr bool running_in_debug_mode()
#define DEAL_II_NAMESPACE_CLOSE
#define DeclException0(Exception0)
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcAccessToUninitializedField()
static ::ExceptionBase & ExcNotInitialized()
#define DeclException1(Exception1, type1, outsequence)
static ::ExceptionBase & ExcMatrixFreeAccessToUninitializedMappingField(std::string arg1)
static ::ExceptionBase & ExcMessage(std::string arg1)
std::vector< index_type > data
@ general
No special properties.
Point< spacedim > point(const gp_Pnt &p, const double tolerance=1e-10)
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
* * * RotationFunction< dim, Number >::RotationFunction Number(dim)
constexpr unsigned int invalid_unsigned_int
constexpr types::geometric_orientation default_geometric_orientation
boost::integer_range< IncrementableType > iota_view
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
const MappingInfoStorageType * mapping_data
unsigned int active_quad_index
const MappingInfoStorageType::QuadratureDescriptor * descriptor
const ShapeInfoType * shape_info
unsigned int active_fe_index
@ dof_access_face_exterior
@ dof_access_face_interior
unsigned char subface_index
unsigned char interior_face_no
std::array< unsigned int, vectorization_width > cells_interior
types::boundary_id exterior_face_no
std::array< unsigned int, vectorization_width > cells_exterior
unsigned char face_orientation
Quadrature< structdim > quadrature
AlignedVector< unsigned int > data_index_offsets
static constexpr std::size_t width()