36#include <boost/container/small_vector.hpp>
47 template <
int dim,
int spacedim>
48 inline std::vector<unsigned int>
51 std::vector<unsigned int> shape_function_to_row_table(
60 unsigned int nth_nonzero_component = 0;
65 row + nth_nonzero_component;
66 ++nth_nonzero_component;
71 return shape_function_to_row_table;
81 template <
int dim,
int spacedim>
84 const unsigned int n_quadrature_points,
86 const UpdateFlags flags)
96 unsigned int n_nonzero_shape_components = 0;
107 n_quadrature_points);
114 n_quadrature_points);
122 n_quadrature_points);
130 n_quadrature_points);
138 template <
int dim,
int spacedim>
155template <
int dim,
int spacedim>
160template <
int dim,
int spacedim>
166 fe.n_dofs_per_cell(),
177template <
int dim,
int spacedim>
179 const FiniteElement<dim, spacedim> &fe,
180 const hp::QCollection<dim> &q,
182 : FEValues(
mapping, fe, q[0], update_flags)
189template <
int dim,
int spacedim>
191 const Quadrature<dim> &q,
193 : FEValuesBase<dim, spacedim>(
195 fe.n_dofs_per_cell(),
206template <
int dim,
int spacedim>
208 const hp::QCollection<dim> &q,
210 : FEValues(fe, q[0], update_flags)
217template <
int dim,
int spacedim>
223 if (dim != spacedim - 1)
225 ExcMessage(
"You can only pass the 'update_normal_vectors' "
226 "flag to FEFaceValues or FESubfaceValues objects, "
227 "but not to an FEValues object unless the "
228 "triangulation it refers to is embedded in a higher "
229 "dimensional space."));
231 const UpdateFlags flags = this->compute_update_flags(update_flags);
235 this->mapping_output.initialize(this->max_n_quadrature_points, flags);
236 this->finite_element_output.initialize(this->max_n_quadrature_points,
243 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>>
245 return this->fe->get_data(flags,
248 this->finite_element_output);
252 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>>
258 this->update_flags = flags;
261 this->fe_data = std::move(fe_get_data.return_value());
263 this->mapping_data = std::move(mapping_get_data.return_value());
266 std::make_unique<typename Mapping<dim, spacedim>::InternalDataBase>();
271template <
int dim,
int spacedim>
279 "You are trying to call FEValues::reinit() with a cell of type " +
281 " with a Mapping that is not compatible with it."));
285 this->maybe_invalidate_previous_present_cell(cell);
286 this->check_cell_similarity(cell);
288 this->present_cell = {cell};
298template <
int dim,
int spacedim>
302 const TriaIterator<DoFCellAccessor<dim, spacedim, lda>> &cell)
306 Assert(
static_cast<const FiniteElementData<dim> &
>(*this->fe) ==
307 static_cast<const FiniteElementData<dim> &
>(cell->get_fe()),
313 "You are trying to call FEValues::reinit() with a cell of type " +
315 " with a Mapping that is not compatible with it."));
317 this->maybe_invalidate_previous_present_cell(cell);
318 this->check_cell_similarity(cell);
320 this->present_cell = {cell};
330template <
int dim,
int spacedim>
340 this->cell_similarity =
341 this->get_mapping().fill_fe_values(this->present_cell,
342 this->cell_similarity,
345 this->mapping_output);
352 this->get_fe().fill_fe_values(this->present_cell,
353 this->cell_similarity,
357 this->mapping_output,
359 this->finite_element_output);
364template <
int dim,
int spacedim>
376template <
int dim,
int spacedim>
378 const unsigned int dofs_per_cell,
380 const Mapping<dim, spacedim> &
mapping,
381 const FiniteElement<dim, spacedim> &fe,
382 const Quadrature<dim - 1> &quadrature)
383 : FEFaceValuesBase<dim, spacedim>(dofs_per_cell,
387 hp::QCollection<dim - 1>(quadrature))
392template <
int dim,
int spacedim>
394 const unsigned int dofs_per_cell,
396 const Mapping<dim, spacedim> &
mapping,
397 const FiniteElement<dim, spacedim> &fe,
398 const hp::QCollection<dim - 1> &quadrature)
399 : FEValuesBase<dim, spacedim>(quadrature.max_n_quadrature_points(),
404 , present_face_index(numbers::invalid_unsigned_int)
405 , quadrature(quadrature)
414template <
int dim,
int spacedim>
415const std::vector<Tensor<1, spacedim>> &
420 "update_boundary_forms")));
421 return this->mapping_output.boundary_forms;
426template <
int dim,
int spacedim>
439template <
int dim,
int spacedim>
444template <
int dim,
int spacedim>
449template <
int dim,
int spacedim>
454 const UpdateFlags update_flags)
457 hp::QCollection<dim - 1>(quadrature),
463template <
int dim,
int spacedim>
468 const UpdateFlags update_flags)
480template <
int dim,
int spacedim>
486 hp::QCollection<dim - 1>(quadrature),
492template <
int dim,
int spacedim>
494 const FiniteElement<dim, spacedim> &fe,
495 const hp::QCollection<dim - 1> &quadrature,
497 : FEFaceValuesBase<dim, spacedim>(
498 fe.n_dofs_per_cell(),
509template <
int dim,
int spacedim>
513 const UpdateFlags flags = this->compute_update_flags(update_flags);
517 this->mapping_output.initialize(this->max_n_quadrature_points, flags);
518 this->finite_element_output.initialize(this->max_n_quadrature_points,
525 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase> (
526 FiniteElement<dim, spacedim>::*finite_element_get_face_data)(
528 const Mapping<dim, spacedim> &,
529 const hp::QCollection<dim - 1> &,
530 ::internal::FEValuesImplementation::FiniteElementRelatedData<dim,
534 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> (
535 Mapping<dim, spacedim>::*mapping_get_face_data)(
536 const UpdateFlags,
const hp::QCollection<dim - 1> &)
const =
541 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>>
547 this->finite_element_output);
549 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>>
557 this->update_flags = flags;
560 this->fe_data = std::move(fe_get_data.return_value());
562 this->mapping_data = std::move(mapping_get_data.return_value());
565 std::make_unique<typename Mapping<dim, spacedim>::InternalDataBase>();
570template <
int dim,
int spacedim>
574 const TriaIterator<DoFCellAccessor<dim, spacedim, lda>> &cell,
575 const unsigned int face_no)
579 Assert(
static_cast<const FiniteElementData<dim> &
>(*this->fe) ==
580 static_cast<const FiniteElementData<dim> &
>(
581 cell->get_dof_handler().get_fe(cell->active_fe_index())),
586 this->maybe_invalidate_previous_present_cell(cell);
587 this->present_cell = {cell};
597template <
int dim,
int spacedim>
601 const TriaIterator<DoFCellAccessor<dim, spacedim, lda>> &cell,
610template <
int dim,
int spacedim>
614 const unsigned int face_no)
618 this->maybe_invalidate_previous_present_cell(cell);
619 this->present_cell = {cell};
629template <
int dim,
int spacedim>
641template <
int dim,
int spacedim>
645 this->present_face_no = face_no;
650 this->present_face_index = cell->
face_index(face_no);
654 this->get_mapping().fill_fe_face_values(this->present_cell,
658 this->mapping_output);
661 this->get_fe().fill_fe_face_values(this->present_cell,
666 this->mapping_output,
668 this->finite_element_output);
670 const_cast<unsigned int &
>(this->n_quadrature_points) =
671 this->quadrature[this->quadrature.
size() == 1 ? 0 : face_no].size();
678template <
int dim,
int spacedim>
683template <
int dim,
int spacedim>
688template <
int dim,
int spacedim>
690 const Mapping<dim, spacedim> &
mapping,
691 const FiniteElement<dim, spacedim> &fe,
692 const Quadrature<dim - 1> &quadrature,
694 : FEFaceValuesBase<dim, spacedim>(fe.n_dofs_per_cell(),
705template <
int dim,
int spacedim>
707 const Mapping<dim, spacedim> &
mapping,
708 const FiniteElement<dim, spacedim> &fe,
709 const hp::QCollection<dim - 1> &quadrature,
711 : FESubfaceValues(
mapping, fe, quadrature[0], update_flags)
718template <
int dim,
int spacedim>
720 const FiniteElement<dim, spacedim> &fe,
721 const Quadrature<dim - 1> &quadrature,
723 : FEFaceValuesBase<dim, spacedim>(
724 fe.n_dofs_per_cell(),
735template <
int dim,
int spacedim>
737 const FiniteElement<dim, spacedim> &fe,
738 const hp::QCollection<dim - 1> &quadrature,
740 : FESubfaceValues(fe, quadrature[0], update_flags)
747template <
int dim,
int spacedim>
751 const UpdateFlags flags = this->compute_update_flags(update_flags);
755 this->mapping_output.initialize(this->max_n_quadrature_points, flags);
756 this->finite_element_output.initialize(this->max_n_quadrature_points,
764 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>>
771 this->finite_element_output);
773 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>>
780 this->quadrature[0]);
782 this->update_flags = flags;
785 this->fe_data = std::move(fe_get_data.return_value());
787 this->mapping_data = std::move(mapping_get_data.return_value());
790 std::make_unique<typename Mapping<dim, spacedim>::InternalDataBase>();
795template <
int dim,
int spacedim>
799 const TriaIterator<DoFCellAccessor<dim, spacedim, lda>> &cell,
800 const unsigned int face_no,
801 const unsigned int subface_no)
805 Assert(
static_cast<const FiniteElementData<dim> &
>(*this->fe) ==
806 static_cast<const FiniteElementData<dim> &
>(
807 cell->get_dof_handler().get_fe(cell->active_fe_index())),
819 Assert(!cell->
face(face_no)->has_children() ||
820 subface_no < cell->face(face_no)->n_active_descendants(),
823 cell->
face(face_no)->n_active_descendants()));
825 ExcMessage(
"You can't use subface data for cells that are "
826 "already refined. Iterate over their children "
827 "instead in these cases."));
829 this->maybe_invalidate_previous_present_cell(cell);
830 this->present_cell = {cell};
835 do_reinit(face_no, subface_no);
840template <
int dim,
int spacedim>
844 const TriaIterator<DoFCellAccessor<dim, spacedim, lda>> &cell,
850 face->child_iterator_to_index(subface));
855template <
int dim,
int spacedim>
859 const unsigned int face_no,
860 const unsigned int subface_no)
872 cell->
face(face_no)->n_children()));
874 this->maybe_invalidate_previous_present_cell(cell);
875 this->present_cell = {cell};
880 do_reinit(face_no, subface_no);
885template <
int dim,
int spacedim>
894 face->child_iterator_to_index(subface));
899template <
int dim,
int spacedim>
902 const unsigned int subface_no)
904 this->present_face_no = face_no;
910 if (!cell->
face(face_no)->has_children())
913 this->present_face_index = cell->
face_index(face_no);
915 this->present_face_index = cell->
face(face_no)->child_index(subface_no);
923 case internal::SubfaceCase<3>::case_x:
924 case internal::SubfaceCase<3>::case_y:
925 case internal::SubfaceCase<3>::case_xy:
926 subface_index = cell->
face(face_no)->child_index(subface_no);
928 case internal::SubfaceCase<3>::case_x1y2y:
929 case internal::SubfaceCase<3>::case_y1x2x:
930 subface_index = cell->
face(face_no)
931 ->child(subface_no / 2)
932 ->child_index(subface_no % 2);
934 case internal::SubfaceCase<3>::case_x1y:
935 case internal::SubfaceCase<3>::case_y1x:
941 cell->
face(face_no)->child(0)->child_index(subface_no);
944 subface_index = cell->
face(face_no)->child_index(1);
950 case internal::SubfaceCase<3>::case_x2y:
951 case internal::SubfaceCase<3>::case_y2x:
955 subface_index = cell->
face(face_no)->child_index(0);
960 cell->
face(face_no)->child(1)->child_index(subface_no - 1);
972 this->present_face_index = subface_index;
978 this->get_mapping().fill_fe_subface_values(this->present_cell,
983 this->mapping_output);
986 this->get_fe().fill_fe_subface_values(this->present_cell,
992 this->mapping_output,
994 this->finite_element_output);
1000#include "fe_values.inst"
TriaIterator< CellAccessor< dim, spacedim > > periodic_neighbor(const unsigned int i) const
unsigned int face_index(const unsigned int i) const
bool has_periodic_neighbor(const unsigned int i) const
TriaIterator< TriaAccessor< dim - 1, dim, spacedim > > face(const unsigned int i) const
unsigned int face_iterator_to_index(const TriaIterator< TriaAccessor< dim - 1, dim, spacedim > > &face) const
::internal::SubfaceCase< dim > subface_case(const unsigned int face_no) const
unsigned int periodic_neighbor_face_no(const unsigned int i) const
FEFaceValuesBase(const unsigned int dofs_per_cell, const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const Quadrature< dim - 1 > &quadrature)
std::size_t memory_consumption() const
const std::vector< Tensor< 1, spacedim > > & get_boundary_forms() const
void initialize(const UpdateFlags update_flags)
static constexpr unsigned int integral_dimension
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access > > &cell, const unsigned int face_no)
void do_reinit(const unsigned int face_no)
FEFaceValues(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const Quadrature< dim - 1 > &quadrature, const UpdateFlags update_flags)
static constexpr unsigned int dimension
FESubfaceValues(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const Quadrature< dim - 1 > &face_quadrature, const UpdateFlags update_flags)
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access > > &cell, const unsigned int face_no, const unsigned int subface_no)
static constexpr unsigned int integral_dimension
void initialize(const UpdateFlags update_flags)
static constexpr unsigned int dimension
void do_reinit(const unsigned int face_no, const unsigned int subface_no)
std::size_t memory_consumption() const
FEValues(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const Quadrature< dim > &quadrature, const UpdateFlags update_flags)
void initialize(const UpdateFlags update_flags)
static constexpr unsigned int integral_dimension
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access > > &cell)
std::size_t memory_consumption() const
unsigned int n_dofs_per_cell() const
unsigned int n_components() const
ReferenceCell reference_cell() const
const ComponentMask & get_nonzero_components(const unsigned int i) const
virtual std::unique_ptr< InternalDataBase > get_face_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const hp::QCollection< dim - 1 > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const
virtual std::unique_ptr< InternalDataBase > get_subface_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim - 1 > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const
unsigned int n_nonzero_components(const unsigned int i) const
virtual std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > get_data(const UpdateFlags, const Quadrature< dim > &quadrature) const override
Abstract base class for mapping classes.
virtual std::unique_ptr< InternalDataBase > get_face_data(const UpdateFlags update_flags, const hp::QCollection< dim - 1 > &quadrature) const
virtual std::unique_ptr< InternalDataBase > get_subface_data(const UpdateFlags update_flags, const Quadrature< dim - 1 > &quadrature) const =0
unsigned int n_faces() const
std::string to_string() const
bool has_children() const
ReferenceCell reference_cell() const
unsigned int size() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcAccessToUninitializedField(std::string arg1)
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcIndexRange(std::size_t arg1, std::size_t arg2, std::size_t arg3)
static ::ExceptionBase & ExcFEDontMatch()
static ::ExceptionBase & ExcMessage(std::string arg1)
TriaIterator< TriaAccessor< dim - 1, dim, spacedim > > face_iterator
TriaIterator< CellAccessor< dim, spacedim > > cell_iterator
@ update_hessians
Second derivatives of shape functions.
@ update_values
Shape function values.
@ update_normal_vectors
Normal vectors.
@ update_3rd_derivatives
Third derivatives of shape functions.
@ update_gradients
Shape function gradients.
@ update_default
No update.
@ update_boundary_forms
Outer normal vector, not normalized.
Task< RT > new_task(const std::function< RT()> &function)
#define DEAL_II_ASSERT_UNREACHABLE()
const Mapping< dim, spacedim > & get_default_linear_mapping(const Triangulation< dim, spacedim > &triangulation)
MappingQ< dim, spacedim > StaticMappingQ1< dim, spacedim >::mapping
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell &reference_cell)
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
void reinit(MatrixBlock< MatrixType > &v, const BlockSparsityPattern &p)
std::vector< unsigned int > make_shape_function_to_row_table(const FiniteElement< dim, spacedim > &fe)
static const unsigned int invalid_unsigned_int
static constexpr unsigned int max_children_per_face
static constexpr unsigned int faces_per_cell