40 template <
int dim,
int spacedim>
47 template <
int dim,
int spacedim>
56 template <
int dim,
int spacedim>
59 const std::vector<bool> & r_i_a_f,
60 const std::vector<ComponentMask> &nonzero_c)
62 , adjust_quad_dof_index_for_face_orientation_table(dim == 3 ?
66 , adjust_line_dof_index_for_line_orientation_table(
67 dim == 3 ? this->dofs_per_line : 0)
68 , system_to_base_table(this->dofs_per_cell)
69 , face_system_to_base_table(this->dofs_per_face)
70 , component_to_base_table(this->components,
71 std::make_pair(
std::make_pair(0
U, 0
U), 0
U))
76 restriction_is_additive_flags(
77 r_i_a_f.size() == 1 ?
std::vector<
bool>(fe_data.dofs_per_cell, r_i_a_f[0]) :
80 nonzero_c.size() == 1 ?
83 , n_nonzero_components_table(compute_n_nonzero_components(nonzero_components))
84 , cached_primitivity(
std::find_if(n_nonzero_components_table.
begin(),
85 n_nonzero_components_table.
end(),
131 ref < RefinementCase<dim>::isotropic_refinement + 1;
147 template <
int dim,
int spacedim>
148 std::pair<std::unique_ptr<FiniteElement<dim, spacedim>>,
unsigned int>
151 return {this->
clone(), multiplicity};
156 template <
int dim,
int spacedim>
167 template <
int dim,
int spacedim>
171 const unsigned int)
const 179 template <
int dim,
int spacedim>
190 template <
int dim,
int spacedim>
194 const unsigned int)
const 202 template <
int dim,
int spacedim>
213 template <
int dim,
int spacedim>
218 const unsigned int)
const 226 template <
int dim,
int spacedim>
237 template <
int dim,
int spacedim>
242 const unsigned int)
const 250 template <
int dim,
int spacedim>
261 template <
int dim,
int spacedim>
266 const unsigned int)
const 273 template <
int dim,
int spacedim>
276 const bool isotropic_restriction_only,
277 const bool isotropic_prolongation_only)
280 ref_case <= RefinementCase<dim>::isotropic_refinement;
283 const unsigned int nc =
286 for (
unsigned int i = 0; i < nc; ++i)
289 (!isotropic_restriction_only ||
294 (!isotropic_prolongation_only ||
303 template <
int dim,
int spacedim>
306 const unsigned int child,
313 "Restriction matrices are only available for refined cells!"));
326 template <
int dim,
int spacedim>
329 const unsigned int child,
336 "Prolongation matrices are only available for refined cells!"));
351 template <
int dim,
int spacedim>
354 const unsigned int index)
const 363 template <
int dim,
int spacedim>
381 template <
int dim,
int spacedim>
387 this->n_components());
403 template <
int dim,
int spacedim>
410 this->n_components());
428 template <
int dim,
int spacedim>
442 component_mask[c] =
true;
449 template <
int dim,
int spacedim>
460 template <
int dim,
int spacedim>
471 template <
int dim,
int spacedim>
483 template <
int dim,
int spacedim>
508 if (component_mask[c] ==
true)
509 block_mask[block] =
true;
518 Assert(component_mask[c] == block_mask[block],
520 "The component mask argument given to this function " 521 "is not a mask where the individual components belonging " 522 "to one block of the finite element are either all " 523 "selected or not selected. You can't call this function " 524 "with a component mask that splits blocks."));
535 template <
int dim,
int spacedim>
538 const unsigned int face,
539 const bool face_orientation,
540 const bool face_flip,
541 const bool face_rotation)
const 559 if ((face_orientation !=
true) || (face_flip !=
false) ||
560 (face_rotation !=
false))
563 "The function in this base class can not handle this case. " 564 "Rather, the derived class you are using must provide " 565 "an overloaded version but apparently hasn't done so. See " 566 "the documentation of this function for more information."));
576 const unsigned int dof_index_on_vertex =
582 face, face_vertex, face_orientation, face_flip, face_rotation) *
584 dof_index_on_vertex);
594 const unsigned int dof_index_on_line = index % this->
dofs_per_line;
598 face, face_line, face_orientation, face_flip, face_rotation) *
616 template <
int dim,
int spacedim>
619 const unsigned int index,
620 const bool face_orientation,
621 const bool face_flip,
622 const bool face_rotation)
const 646 index, 4 * face_orientation + 2 * face_flip + face_rotation);
651 template <
int dim,
int spacedim>
654 const unsigned int index,
655 const bool line_orientation)
const 668 if (line_orientation)
676 template <
int dim,
int spacedim>
681 ref_case < RefinementCase<dim>::isotropic_refinement + 1;
683 for (
unsigned int c = 0;
704 template <
int dim,
int spacedim>
709 ref_case < RefinementCase<dim>::isotropic_refinement + 1;
711 for (
unsigned int c = 0;
732 template <
int dim,
int spacedim>
739 for (
unsigned int c = 0;
760 template <
int dim,
int spacedim>
767 for (
unsigned int c = 0;
788 template <
int dim,
int spacedim>
801 template <
int dim,
int spacedim>
810 template <
int dim,
int spacedim>
817 ExcMessage(
"Constraints for this element are only implemented " 818 "for the case that faces are refined isotropically " 819 "(which is always the case in 2d, and in 3d requires " 820 "that the neighboring cell of a coarse cell presents " 821 "exactly four children on the common face)."));
823 ExcMessage(
"The finite element for which you try to obtain " 824 "hanging node constraints does not appear to " 837 template <
int dim,
int spacedim>
851 this->dofs_per_face};
860 template <
int dim,
int spacedim>
876 template <
int dim,
int spacedim>
892 template <
int dim,
int spacedim>
909 template <
int dim,
int spacedim>
910 std::vector<std::pair<unsigned int, unsigned int>>
915 return std::vector<std::pair<unsigned int, unsigned int>>();
920 template <
int dim,
int spacedim>
921 std::vector<std::pair<unsigned int, unsigned int>>
926 return std::vector<std::pair<unsigned int, unsigned int>>();
931 template <
int dim,
int spacedim>
932 std::vector<std::pair<unsigned int, unsigned int>>
937 return std::vector<std::pair<unsigned int, unsigned int>>();
942 template <
int dim,
int spacedim>
952 template <
int dim,
int spacedim>
956 const unsigned int)
const 964 template <
int dim,
int spacedim>
971 return ((
typeid(*
this) ==
typeid(f)) && (this->
get_name() == f.
get_name()) &&
979 template <
int dim,
int spacedim>
984 return !(*
this == f);
989 template <
int dim,
int spacedim>
990 const std::vector<Point<dim>> &
1005 template <
int dim,
int spacedim>
1014 template <
int dim,
int spacedim>
1015 const std::vector<Point<dim>> &
1027 template <
int dim,
int spacedim>
1036 template <
int dim,
int spacedim>
1048 template <
int dim,
int spacedim>
1049 const std::vector<
Point<dim - 1>> &
1064 template <
int dim,
int spacedim>
1073 template <
int dim,
int spacedim>
1076 const unsigned int index)
const 1086 template <
int dim,
int spacedim>
1089 const unsigned int)
const 1096 template <
int dim,
int spacedim>
1102 const unsigned int n_total_components = this->
n_components();
1103 Assert((n_total_components == mask.
size()) || (mask.
size() == 0),
1104 ExcMessage(
"The given ComponentMask has the wrong size."));
1106 const unsigned int n_selected =
1109 ExcMessage(
"You need at least one selected component."));
1111 const unsigned int first_selected =
1116 for (
unsigned int c = 0; c < n_total_components; ++c)
1117 Assert((c < first_selected && (!mask[c])) ||
1118 (c >= first_selected && c < first_selected + n_selected &&
1120 (c >= first_selected + n_selected && !mask[c]),
1121 ExcMessage(
"Error: the given ComponentMask is not contiguous!"));
1124 return get_sub_fe(first_selected, n_selected);
1129 template <
int dim,
int spacedim>
1132 const unsigned int first_component,
1133 const unsigned int n_selected_components)
const 1139 "You can only select a whole FiniteElement, not a part of one."));
1141 (void)first_component;
1142 (void)n_selected_components;
1148 template <
int dim,
int spacedim>
1149 std::pair<Table<2, bool>, std::vector<unsigned int>>
1153 return std::pair<Table<2, bool>, std::vector<unsigned int>>(
1160 template <
int dim,
int spacedim>
1165 std::vector<double> &)
const 1168 ExcMessage(
"The element for which you are calling the current " 1169 "function does not have generalized support points (see " 1170 "the glossary for a definition of generalized support " 1171 "points). Consequently, the current function can not " 1172 "be defined and is not implemented by the element."));
1178 template <
int dim,
int spacedim>
1199 template <
int dim,
int spacedim>
1200 std::vector<unsigned int>
1204 std::vector<unsigned int> retval(nonzero_components.size());
1205 for (
unsigned int i = 0; i < nonzero_components.size(); ++i)
1206 retval[i] = nonzero_components[i].n_selected_components();
1214 template <
int dim,
int spacedim>
1215 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1232 template <
int dim,
int spacedim>
1233 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1250 template <
int dim,
int spacedim>
static ::ExceptionBase & ExcFEHasNoSupportPoints()
bool represents_the_all_selected_mask() const
static const unsigned int invalid_unsigned_int
BlockMask block_mask(const FEValuesExtractors::Scalar &scalar) const
virtual Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
std::vector< std::vector< FullMatrix< double > > > restriction
#define AssertDimension(dim1, dim2)
virtual std::size_t memory_consumption() const
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
virtual bool operator==(const FiniteElement< dim, spacedim > &fe) const
virtual Point< dim - 1 > unit_face_support_point(const unsigned int index) const
std::vector< Point< dim > > generalized_support_points
virtual Tensor< 3, dim > shape_3rd_derivative(const unsigned int i, const Point< dim > &p) const
FullMatrix< double > interface_constraints
bool operator!=(const FiniteElement< dim, spacedim > &) const
FiniteElement(const FiniteElementData< dim > &fe_data, const std::vector< bool > &restriction_is_additive_flags, const std::vector< ComponentMask > &nonzero_components)
const FiniteElement< dim, spacedim > & get_sub_fe(const ComponentMask &mask) const
virtual double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
virtual void get_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
static ::ExceptionBase & ExcUnitShapeValuesDoNotExist()
virtual Point< dim > unit_support_point(const unsigned int index) const
const std::vector< Point< dim - 1 > > & get_unit_face_support_points() const
bool restriction_is_implemented() const
const std::vector< Point< dim > > & get_generalized_support_points() const
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const
virtual Tensor< 3, dim > shape_3rd_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
#define AssertIndexRange(index, range)
const unsigned int dofs_per_quad
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
bool isotropic_prolongation_is_implemented() const
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > component_to_base_table
bool has_generalized_support_points() const
bool represents_the_all_selected_mask() const
std::vector< Point< dim - 1 > > unit_face_support_points
ComponentMask component_mask(const FEValuesExtractors::Scalar &scalar) const
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const =0
#define AssertThrow(cond, exc)
static std::vector< unsigned int > compute_n_nonzero_components(const std::vector< ComponentMask > &nonzero_components)
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
bool is_primitive() const
const std::vector< unsigned int > n_nonzero_components_table
const unsigned int dofs_per_line
size_type n_elements() const
unsigned int n_blocks() const
bool has_face_support_points() const
std::vector< Point< dim > > unit_support_points
const unsigned int first_face_line_index
bool has_support_points() 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 component_to_block_index(const unsigned int component) const
static ::ExceptionBase & ExcMessage(std::string arg1)
const FullMatrix< double > & constraints(const ::internal::SubfaceCase< dim > &subface_case=::internal::SubfaceCase< dim >::case_isotropic) const
virtual Tensor< 1, dim > shape_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
const unsigned int first_quad_index
virtual std::size_t memory_consumption() const
std::vector< std::vector< FullMatrix< double > > > prolongation
#define Assert(cond, exc)
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
virtual FiniteElementDomination::Domination compare_for_face_domination(const FiniteElement< dim, spacedim > &fe_other) const final
Abstract base class for mapping classes.
void reinit(const unsigned int n_blocks, const size_type n_elements_per_block)
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix) const
#define DEAL_II_NAMESPACE_CLOSE
bool constraints_are_implemented(const ::internal::SubfaceCase< dim > &subface_case=::internal::SubfaceCase< dim >::case_isotropic) const
static ::ExceptionBase & ExcWrongInterfaceMatrixSize(int arg1, int arg2)
VectorType::value_type * end(VectorType &V)
unsigned int size() const
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) const
virtual std::string get_name() const =0
static ::ExceptionBase & ExcProjectionVoid()
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
virtual unsigned int face_to_cell_index(const unsigned int face_dof_index, const unsigned int face, const bool face_orientation=true, const bool face_flip=false, const bool face_rotation=false) const
virtual void convert_generalized_support_point_values_to_dof_values(const std::vector< Vector< double >> &support_point_values, std::vector< double > &nodal_values) const
const unsigned int dofs_per_cell
types::global_dof_index first_block_of_base(const unsigned int b) const
static unsigned int n_children(const RefinementCase< dim > &refinement_case)
unsigned int adjust_line_dof_index_for_line_orientation(const unsigned int index, const bool line_orientation) const
const std::vector< Point< dim > > & get_unit_support_points() const
virtual std::unique_ptr< InternalDataBase > get_face_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim - 1 > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
Table< 2, int > adjust_quad_dof_index_for_face_orientation_table
virtual FiniteElementDomination::Domination compare_for_domination(const FiniteElement< dim, spacedim > &fe_other, const unsigned int codim=0) const
static ::ExceptionBase & ExcEmbeddingVoid()
virtual double shape_value(const unsigned int i, const Point< dim > &p) const
unsigned int n_components() const
const unsigned int first_face_quad_index
#define DEAL_II_NAMESPACE_OPEN
VectorType::value_type * begin(VectorType &V)
std::vector< std::pair< unsigned int, unsigned int > > system_to_component_table
virtual bool hp_constraints_are_implemented() const
unsigned int first_selected_component(const unsigned int overall_number_of_components=numbers::invalid_unsigned_int) const
unsigned int n_selected_components(const unsigned int overall_number_of_components=numbers::invalid_unsigned_int) const
const unsigned int dofs_per_face
bool prolongation_is_implemented() const
const unsigned int first_line_index
virtual Tensor< 4, dim > shape_4th_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const
const std::vector< ComponentMask > nonzero_components
void reinit_restriction_and_prolongation_matrices(const bool isotropic_restriction_only=false, const bool isotropic_prolongation_only=false)
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > system_to_base_table
static ::ExceptionBase & ExcNotImplemented()
const unsigned int dofs_per_vertex
std::vector< std::pair< unsigned int, unsigned int > > face_system_to_component_table
bool isotropic_restriction_is_implemented() const
BlockIndices base_to_block_indices
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > face_system_to_base_table
virtual Tensor< 4, dim > shape_4th_derivative(const unsigned int i, const Point< dim > &p) const
unsigned int size() const
unsigned int size() const
unsigned int adjust_quad_dof_index_for_face_orientation(const unsigned int index, const bool face_orientation, const bool face_flip, const bool face_rotation) const
std::vector< int > adjust_line_dof_index_for_line_orientation_table
TableIndices< 2 > interface_constraints_size() const
virtual std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const
void fill(InputIterator entries, const bool C_style_indexing=true)
const std::vector< bool > restriction_is_additive_flags
std::pair< std::unique_ptr< FiniteElement< dim, spacedim > >, unsigned int > operator^(const unsigned int multiplicity) const
std::enable_if< std::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const
virtual std::unique_ptr< InternalDataBase > get_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const =0
static ::ExceptionBase & ExcInternalError()