34#include <boost/container/small_vector.hpp>
47 template <
int dim,
int spacedim>
50 const unsigned int n_quadrature_points,
52 const UpdateFlags flags)
62 unsigned int n_nonzero_shape_components = 0;
104 template <
int dim,
int spacedim>
121template <
int dim,
int spacedim>
126template <
int dim,
int spacedim>
132 fe.n_dofs_per_cell(),
143template <
int dim,
int spacedim>
145 const FiniteElement<dim, spacedim> &fe,
146 const hp::QCollection<dim> &q,
148 : FEValues(
mapping, fe, q[0], update_flags)
155template <
int dim,
int spacedim>
157 const Quadrature<dim> &q,
159 : FEValuesBase<dim, spacedim>(
161 fe.n_dofs_per_cell(),
172template <
int dim,
int spacedim>
174 const hp::QCollection<dim> &q,
176 : FEValues(fe, q[0], update_flags)
183template <
int dim,
int spacedim>
189 if (dim != spacedim - 1)
191 ExcMessage(
"You can only pass the 'update_normal_vectors' "
192 "flag to FEFaceValues or FESubfaceValues objects, "
193 "but not to an FEValues object unless the "
194 "triangulation it refers to is embedded in a higher "
195 "dimensional space."));
197 const UpdateFlags flags = this->compute_update_flags(update_flags);
201 this->mapping_output.initialize(this->max_n_quadrature_points, flags);
202 this->finite_element_output.initialize(this->max_n_quadrature_points,
209 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>>
211 return this->fe->get_data(flags,
214 this->finite_element_output);
218 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>>
224 this->update_flags = flags;
227 this->fe_data = std::move(fe_get_data.return_value());
229 this->mapping_data = std::move(mapping_get_data.return_value());
232 std::make_unique<typename Mapping<dim, spacedim>::InternalDataBase>();
237template <
int dim,
int spacedim>
245 "You are trying to call FEValues::reinit() with a cell of type " +
247 " with a Mapping that is not compatible with it."));
251 this->maybe_invalidate_previous_present_cell(cell);
252 this->check_cell_similarity(cell);
254 this->present_cell = {cell};
264template <
int dim,
int spacedim>
268 const TriaIterator<DoFCellAccessor<dim, spacedim, lda>> &cell)
272 Assert(
static_cast<const FiniteElementData<dim> &
>(*this->fe) ==
273 static_cast<const FiniteElementData<dim> &
>(cell->get_fe()),
279 "You are trying to call FEValues::reinit() with a cell of type " +
281 " with a Mapping that is not compatible with it."));
283 this->maybe_invalidate_previous_present_cell(cell);
284 this->check_cell_similarity(cell);
286 this->present_cell = {cell};
296template <
int dim,
int spacedim>
306 this->cell_similarity =
307 this->get_mapping().fill_fe_values(this->present_cell,
308 this->cell_similarity,
311 this->mapping_output);
318 this->get_fe().fill_fe_values(this->present_cell,
319 this->cell_similarity,
323 this->mapping_output,
325 this->finite_element_output);
330template <
int dim,
int spacedim>
342template <
int dim,
int spacedim>
346 const Mapping<dim, spacedim> &
mapping,
347 const FiniteElement<dim, spacedim> &fe,
348 const Quadrature<dim - 1> &quadrature)
353 hp::QCollection<dim - 1>(quadrature))
358template <
int dim,
int spacedim>
362 const Mapping<dim, spacedim> &
mapping,
363 const FiniteElement<dim, spacedim> &fe,
364 const hp::QCollection<dim - 1> &quadrature)
365 : FEValuesBase<dim, spacedim>(quadrature.max_n_quadrature_points(),
371 , quadrature(quadrature)
380template <
int dim,
int spacedim>
381const std::vector<Tensor<1, spacedim>> &
386 "update_boundary_forms")));
387 return this->mapping_output.boundary_forms;
392template <
int dim,
int spacedim>
405template <
int dim,
int spacedim>
410template <
int dim,
int spacedim>
415template <
int dim,
int spacedim>
420 const UpdateFlags update_flags)
423 hp::QCollection<dim - 1>(quadrature),
429template <
int dim,
int spacedim>
434 const UpdateFlags update_flags)
446template <
int dim,
int spacedim>
450 const UpdateFlags update_flags)
452 hp::QCollection<dim - 1>(quadrature),
458template <
int dim,
int spacedim>
464 fe.n_dofs_per_cell(),
475template <
int dim,
int spacedim>
479 const UpdateFlags flags = this->compute_update_flags(update_flags);
483 this->mapping_output.initialize(this->max_n_quadrature_points, flags);
484 this->finite_element_output.initialize(this->max_n_quadrature_points,
491 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase> (
492 FiniteElement<dim, spacedim>::*finite_element_get_face_data)(
494 const Mapping<dim, spacedim> &,
495 const hp::QCollection<dim - 1> &,
496 ::internal::FEValuesImplementation::FiniteElementRelatedData<dim,
500 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> (
501 Mapping<dim, spacedim>::*mapping_get_face_data)(
502 const UpdateFlags,
const hp::QCollection<dim - 1> &)
const =
507 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>>
513 this->finite_element_output);
515 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>>
523 this->update_flags = flags;
526 this->fe_data = std::move(fe_get_data.return_value());
528 this->mapping_data = std::move(mapping_get_data.return_value());
531 std::make_unique<typename Mapping<dim, spacedim>::InternalDataBase>();
536template <
int dim,
int spacedim>
540 const TriaIterator<DoFCellAccessor<dim, spacedim, lda>> &cell,
541 const unsigned int face_no)
545 Assert(
static_cast<const FiniteElementData<dim> &
>(*this->fe) ==
546 static_cast<const FiniteElementData<dim> &
>(
547 cell->get_dof_handler().get_fe(cell->active_fe_index())),
552 this->maybe_invalidate_previous_present_cell(cell);
553 this->present_cell = {cell};
563template <
int dim,
int spacedim>
567 const TriaIterator<DoFCellAccessor<dim, spacedim, lda>> &cell,
576template <
int dim,
int spacedim>
580 const unsigned int face_no)
584 this->maybe_invalidate_previous_present_cell(cell);
585 this->present_cell = {cell};
595template <
int dim,
int spacedim>
607template <
int dim,
int spacedim>
611 this->present_face_no = face_no;
616 this->present_face_index = cell->
face_index(face_no);
620 this->get_mapping().fill_fe_face_values(this->present_cell,
624 this->mapping_output);
627 this->get_fe().fill_fe_face_values(this->present_cell,
632 this->mapping_output,
634 this->finite_element_output);
636 const_cast<unsigned int &
>(this->n_quadrature_points) =
637 this->quadrature[this->quadrature.
size() == 1 ? 0 : face_no].size();
644template <
int dim,
int spacedim>
649template <
int dim,
int spacedim>
654template <
int dim,
int spacedim>
656 const Mapping<dim, spacedim> &
mapping,
657 const FiniteElement<dim, spacedim> &fe,
658 const Quadrature<dim - 1> &quadrature,
660 : FEFaceValuesBase<dim, spacedim>(fe.n_dofs_per_cell(),
671template <
int dim,
int spacedim>
673 const Mapping<dim, spacedim> &
mapping,
674 const FiniteElement<dim, spacedim> &fe,
675 const hp::QCollection<dim - 1> &quadrature,
677 : FESubfaceValues(
mapping, fe, quadrature[0], update_flags)
684template <
int dim,
int spacedim>
686 const FiniteElement<dim, spacedim> &fe,
687 const Quadrature<dim - 1> &quadrature,
689 : FEFaceValuesBase<dim, spacedim>(
690 fe.n_dofs_per_cell(),
701template <
int dim,
int spacedim>
703 const FiniteElement<dim, spacedim> &fe,
704 const hp::QCollection<dim - 1> &quadrature,
706 : FESubfaceValues(fe, quadrature[0], update_flags)
713template <
int dim,
int spacedim>
717 const UpdateFlags flags = this->compute_update_flags(update_flags);
721 this->mapping_output.initialize(this->max_n_quadrature_points, flags);
722 this->finite_element_output.initialize(this->max_n_quadrature_points,
730 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>>
737 this->finite_element_output);
739 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>>
746 this->quadrature[0]);
748 this->update_flags = flags;
751 this->fe_data = std::move(fe_get_data.return_value());
753 this->mapping_data = std::move(mapping_get_data.return_value());
756 std::make_unique<typename Mapping<dim, spacedim>::InternalDataBase>();
761template <
int dim,
int spacedim>
765 const TriaIterator<DoFCellAccessor<dim, spacedim, lda>> &cell,
766 const unsigned int face_no,
767 const unsigned int subface_no)
771 Assert(
static_cast<const FiniteElementData<dim> &
>(*this->fe) ==
772 static_cast<const FiniteElementData<dim> &
>(
773 cell->get_dof_handler().get_fe(cell->active_fe_index())),
780 cell->
face(face_no)->has_children(),
781 ExcMessage(
"You can only reinit() an FESubfaceValues object in case "
782 "the neighboring cell is more refined than the one this "
783 "object is initialized on."));
793 ->n_active_descendants() :
794 cell->
face(face_no)->n_active_descendants()));
797 ExcMessage(
"You can't use subface data for cells that are "
798 "already refined. Iterate over their children "
799 "instead in these cases."));
801 this->maybe_invalidate_previous_present_cell(cell);
802 this->present_cell = {cell};
807 do_reinit(face_no, subface_no);
812template <
int dim,
int spacedim>
816 const TriaIterator<DoFCellAccessor<dim, spacedim, lda>> &cell,
822 face->child_iterator_to_index(subface));
827template <
int dim,
int spacedim>
831 const unsigned int face_no,
832 const unsigned int subface_no)
839 cell->
face(face_no)->has_children(),
840 ExcMessage(
"You can only reinit() an FESubfaceValues object in case "
841 "the neighboring cell is more refined than the one this "
842 "object is initialized on."));
852 ->n_active_descendants() :
853 cell->
face(face_no)->n_active_descendants()));
856 ExcMessage(
"You can't use subface data for cells that are "
857 "already refined. Iterate over their children "
858 "instead in these cases."));
860 this->maybe_invalidate_previous_present_cell(cell);
861 this->present_cell = {cell};
866 do_reinit(face_no, subface_no);
871template <
int dim,
int spacedim>
880 face->child_iterator_to_index(subface));
885template <
int dim,
int spacedim>
888 const unsigned int subface_no)
890 this->present_face_no = face_no;
896 if (!cell->
face(face_no)->has_children())
899 this->present_face_index = cell->
face_index(face_no);
901 this->present_face_index = cell->
face(face_no)->child_index(subface_no);
909 case internal::SubfaceCase<3>::case_x:
910 case internal::SubfaceCase<3>::case_y:
911 case internal::SubfaceCase<3>::case_xy:
912 subface_index = cell->
face(face_no)->child_index(subface_no);
914 case internal::SubfaceCase<3>::case_x1y2y:
915 case internal::SubfaceCase<3>::case_y1x2x:
916 subface_index = cell->
face(face_no)
917 ->child(subface_no / 2)
918 ->child_index(subface_no % 2);
920 case internal::SubfaceCase<3>::case_x1y:
921 case internal::SubfaceCase<3>::case_y1x:
927 cell->
face(face_no)->child(0)->child_index(subface_no);
930 subface_index = cell->
face(face_no)->child_index(1);
936 case internal::SubfaceCase<3>::case_x2y:
937 case internal::SubfaceCase<3>::case_y2x:
941 subface_index = cell->
face(face_no)->child_index(0);
946 cell->
face(face_no)->child(1)->child_index(subface_no - 1);
958 this->present_face_index = subface_index;
964 this->get_mapping().fill_fe_subface_values(this->present_cell,
969 this->mapping_output);
972 this->get_fe().fill_fe_subface_values(this->present_cell,
978 this->mapping_output,
980 this->finite_element_output);
986#include "fe/fe_values.inst"
TriaIterator< CellAccessor< dim, spacedim > > periodic_neighbor(const unsigned int i) const
internal::SubfaceCase< dim > subface_case(const unsigned int face_no) 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
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
ReferenceCell< dim > reference_cell() 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
bool has_children() const
ReferenceCell< structdim > reference_cell() const
unsigned int size() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ASSERT_UNREACHABLE()
static ::ExceptionBase & ExcAccessToUninitializedField(std::string arg1)
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
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)
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< dim > &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)
constexpr unsigned int invalid_unsigned_int
* const unsigned int dofs_per_cell
static constexpr unsigned int faces_per_cell