429template <
int dim,
int spacedim>
441 initialize(update_flags);
446template <
int dim,
int spacedim>
452 hp::QCollection<dim - 1>(quadrature),
458template <
int dim,
int spacedim>
464 fe.n_dofs_per_cell(),
470 initialize(update_flags);
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> (
500 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase> (
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>
541 const unsigned int face_no)
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>
570 const auto face_n = cell->face_iterator_to_index(face);
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>
601 const auto face_n = cell->face_iterator_to_index(face);
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>
666 initialize(update_flags);
671template <
int dim,
int spacedim>
684template <
int dim,
int spacedim>
690 fe.n_dofs_per_cell(),
696 initialize(update_flags);
701template <
int dim,
int spacedim>
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>
766 const unsigned int face_no,
767 const unsigned int subface_no)
773 cell->get_dof_handler().get_fe(cell->active_fe_index())),
776 Assert(cell->has_periodic_neighbor(face_no) ?
777 cell->periodic_neighbor(face_no)
778 ->face(cell->periodic_neighbor_face_no(face_no))
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."));
790 (cell->has_periodic_neighbor(face_no) ?
791 cell->periodic_neighbor(face_no)
792 ->face(cell->periodic_neighbor_face_no(face_no))
793 ->n_active_descendants() :
794 cell->face(face_no)->n_active_descendants()));
796 Assert(cell->has_children() ==
false,
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>
821 cell->face_iterator_to_index(face),
822 face->child_iterator_to_index(subface));
827template <
int dim,
int spacedim>
831 const unsigned int face_no,
832 const unsigned int subface_no)
835 Assert(cell->has_periodic_neighbor(face_no) ?
836 cell->periodic_neighbor(face_no)
837 ->face(cell->periodic_neighbor_face_no(face_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."));
849 (cell->has_periodic_neighbor(face_no) ?
850 cell->periodic_neighbor(face_no)
851 ->face(cell->periodic_neighbor_face_no(face_no))
852 ->n_active_descendants() :
853 cell->face(face_no)->n_active_descendants()));
855 Assert(cell->has_children() ==
false,
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>
879 cell->face_iterator_to_index(face),
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);
907 switch (cell->subface_case(face_no))
912 subface_index = cell->face(face_no)->child_index(subface_no);
916 subface_index = cell->face(face_no)
917 ->child(subface_no / 2)
918 ->child_index(subface_no % 2);
927 cell->face(face_no)->child(0)->child_index(subface_no);
930 subface_index = cell->face(face_no)->child_index(1);
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"