19 #include <deal.II/base/config.h> 21 #include <deal.II/fe/block_mask.h> 22 #include <deal.II/fe/component_mask.h> 23 #include <deal.II/fe/fe_base.h> 24 #include <deal.II/fe/fe_update_flags.h> 25 #include <deal.II/fe/fe_values_extractors.h> 26 #include <deal.II/fe/mapping.h> 31 DEAL_II_NAMESPACE_OPEN
33 template <
int dim,
int spacedim>
35 template <
int dim,
int spacedim>
37 template <
int dim,
int spacedim>
39 template <
int dim,
int spacedim>
41 template <
int dim,
int spacedim>
644 template <
int dim,
int spacedim = dim>
793 std::pair<std::unique_ptr<FiniteElement<dim, spacedim>>,
unsigned int>
794 operator^(
const unsigned int multiplicity)
const;
807 virtual std::unique_ptr<FiniteElement<dim, spacedim>>
845 operator[](
const unsigned int fe_index)
const;
884 const unsigned int component)
const;
919 const unsigned int component)
const;
954 const unsigned int component)
const;
989 const unsigned int component)
const;
1024 const unsigned int component)
const;
1037 const unsigned int face_index)
const;
1207 constraints(const ::internal::SubfaceCase<dim> &subface_case =
1227 const ::internal::SubfaceCase<dim> &subface_case =
1307 const unsigned int subface,
1332 virtual std::vector<std::pair<unsigned int, unsigned int>>
1339 virtual std::vector<std::pair<unsigned int, unsigned int>>
1346 virtual std::vector<std::pair<unsigned int, unsigned int>>
1439 std::pair<unsigned int, unsigned int>
1453 const unsigned int index)
const;
1464 std::pair<unsigned int, unsigned int>
1477 const bool face_orientation,
1478 const bool face_flip,
1479 const bool face_rotation)
const;
1535 virtual unsigned int 1537 const unsigned int face,
1538 const bool face_orientation =
true,
1539 const bool face_flip =
false,
1540 const bool face_rotation =
false)
const;
1551 const bool line_orientation)
const;
1723 get_sub_fe(
const unsigned int first_component,
1724 const unsigned int n_selected_components)
const;
1748 std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>
1759 std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>
1781 std::pair<unsigned int, unsigned int>
1789 std::pair<unsigned int, unsigned int>
1795 std::pair<unsigned int, types::global_dof_index>
1977 virtual std::pair<Table<2, bool>, std::vector<unsigned int>>
2017 const std::vector<Point<dim>> &
2081 const std::vector<
Point<dim - 1>> &
2099 virtual Point<dim - 1>
2114 const std::vector<Point<dim>> &
2138 const std::vector<
Point<dim - 1>> &
2284 std::vector<double> & nodal_values)
const;
2306 <<
"The shape function with index " << arg1
2307 <<
" is not primitive, i.e. it is vector-valued and " 2308 <<
"has more than one non-zero vector component. This " 2309 <<
"function cannot be called for these shape functions. " 2310 <<
"Maybe you want to use the same function with the " 2311 <<
"_component suffix?");
2325 "You are trying to access the values or derivatives of shape functions " 2326 "on the reference cell of an element that does not define its shape " 2327 "functions through mapping from the reference cell. Consequently, " 2328 "you cannot ask for shape function values or derivatives on the " 2338 "You are trying to access the support points of a finite " 2339 "element that either has no support points at all, or for " 2340 "which the corresponding tables have not been implemented.");
2349 "You are trying to access the matrices that describe how " 2350 "to embed a finite element function on one cell into the " 2351 "finite element space on one of its children (i.e., the " 2352 "'embedding' or 'prolongation' matrices). However, the " 2353 "current finite element can either not define this sort of " 2354 "operation, or it has not yet been implemented.");
2364 "You are trying to access the matrices that describe how " 2365 "to restrict a finite element function from the children " 2366 "of one cell to the finite element space defined on their " 2367 "parent (i.e., the 'restriction' or 'projection' matrices). " 2368 "However, the current finite element can either not define " 2369 "this sort of operation, or it has not yet been " 2379 <<
"The interface matrix has a size of " << arg1 <<
"x" << arg2
2380 <<
", which is not reasonable for the current element " 2381 "in the present dimension.");
2404 const bool isotropic_restriction_only =
false,
2405 const bool isotropic_prolongation_only =
false);
2524 std::vector<std::pair<unsigned int, unsigned int>>
2543 std::vector<std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>>
2549 std::vector<std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>>
2578 std::vector<std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>>
2632 static std::vector<unsigned int>
2634 const std::vector<ComponentMask> &nonzero_components);
2735 virtual std::unique_ptr<InternalDataBase>
2740 FiniteElementRelatedData<dim, spacedim> &output_data)
const = 0;
2783 virtual std::unique_ptr<InternalDataBase>
2788 FiniteElementRelatedData<dim, spacedim> &output_data)
const;
2831 virtual std::unique_ptr<InternalDataBase>
2838 &output_data)
const;
2927 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
2933 &output_data)
const = 0;
2980 const unsigned int face_no,
2984 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
2990 &output_data)
const = 0;
3040 const unsigned int face_no,
3041 const unsigned int sub_no,
3045 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
3051 &output_data)
const = 0;
3055 friend class FEValues<dim, spacedim>;
3058 friend class FESystem<dim, spacedim>;
3062 #ifndef DEAL_II_MSVC 3063 static_assert(dim <= spacedim,
3064 "The dimension <dim> of a FiniteElement must be less than or " 3065 "equal to the space dimension <spacedim> in which it lives.");
3073 template <
int dim,
int spacedim>
3079 ExcMessage(
"A fe_index of zero is the only index allowed here"));
3085 template <
int dim,
int spacedim>
3086 inline std::pair<unsigned int, unsigned int>
3088 const unsigned int index)
const 3100 template <
int dim,
int spacedim>
3109 template <
int dim,
int spacedim>
3112 const unsigned int index)
const 3119 template <
int dim,
int spacedim>
3122 const unsigned int component,
3123 const unsigned int index)
const 3126 const std::vector<std::pair<unsigned int, unsigned int>>::const_iterator it =
3129 std::pair<unsigned int, unsigned int>(component, index));
3132 ExcMessage(
"You are asking for the number of the shape function " 3133 "within a system element that corresponds to vector " 3136 " and within this to " 3140 "shape function exists."));
3146 template <
int dim,
int spacedim>
3147 inline std::pair<unsigned int, unsigned int>
3149 const unsigned int index)
const 3176 template <
int dim,
int spacedim>
3177 inline std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>
3179 const unsigned int index)
const 3188 template <
int dim,
int spacedim>
3189 inline std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>
3191 const unsigned int index)
const 3200 template <
int dim,
int spacedim>
3203 const unsigned int index)
const 3210 template <
int dim,
int spacedim>
3211 inline std::pair<unsigned int, unsigned int>
3213 const unsigned int index)
const 3223 template <
int dim,
int spacedim>
3224 inline std::pair<unsigned int, unsigned int>
3226 const unsigned int index)
const 3233 template <
int dim,
int spacedim>
3234 inline std::pair<unsigned int, types::global_dof_index>
3236 const unsigned int index)
const 3243 return std::pair<unsigned int, types::global_dof_index>(
3251 template <
int dim,
int spacedim>
3254 const unsigned int index)
const 3263 template <
int dim,
int spacedim>
3273 template <
int dim,
int spacedim>
3283 template <
int dim,
int spacedim>
3292 template <
int dim,
int spacedim>
3315 template <
int dim,
int spacedim>
3318 const unsigned int cell_dof_index)
const 3337 DEAL_II_NAMESPACE_CLOSE
static::ExceptionBase & ExcFEHasNoSupportPoints()
virtual double shape_value(const unsigned int i, const Point< dim > &p) const
const unsigned int first_hex_index
bool prolongation_is_implemented() const
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const =0
virtual std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const
const std::vector< Point< dim > > & get_unit_support_points() const
std::vector< std::vector< FullMatrix< double > > > restriction
#define DeclException2(Exception2, type1, type2, outsequence)
std::pair< unsigned int, types::global_dof_index > system_to_block_index(const unsigned int component) const
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
std::vector< Point< dim > > generalized_support_points
FullMatrix< double > interface_constraints
FiniteElement(const FiniteElementData< dim > &fe_data, const std::vector< bool > &restriction_is_additive_flags, const std::vector< ComponentMask > &nonzero_components)
unsigned int component_to_system_index(const unsigned int component, const unsigned int index) const
virtual Tensor< 3, dim > shape_3rd_derivative(const unsigned int i, const Point< dim > &p) const
static::ExceptionBase & ExcUnitShapeValuesDoNotExist()
bool isotropic_restriction_is_implemented() const
const std::vector< Point< dim-1 > > & get_generalized_face_support_points() const
virtual void get_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
bool constraints_are_implemented(const ::internal::SubfaceCase< dim > &subface_case=::internal::SubfaceCase< dim >::case_isotropic) const
#define AssertIndexRange(index, range)
virtual ~InternalDataBase()=default
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > component_to_base_table
std::vector< Point< dim-1 > > unit_face_support_points
virtual bool hp_constraints_are_implemented() const
bool isotropic_prolongation_is_implemented() const
const FiniteElement< dim, spacedim > & get_sub_fe(const ComponentMask &mask) const
TableIndices< 2 > interface_constraints_size() const
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const =0
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const
static std::vector< unsigned int > compute_n_nonzero_components(const std::vector< ComponentMask > &nonzero_components)
bool operator!=(const FiniteElement< dim, spacedim > &) const
bool is_primitive() const
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const
virtual void fill_fe_face_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const Quadrature< dim-1 > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const ::internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const InternalDataBase &fe_internal,::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const =0
static::ExceptionBase & ExcInterpolationNotImplemented()
std::vector< Point< dim-1 > > generalized_face_support_points
const std::vector< unsigned int > n_nonzero_components_table
static::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
BlockMask block_mask(const FEValuesExtractors::Scalar &scalar) const
unsigned long long int global_dof_index
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
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
std::vector< Point< dim > > unit_support_points
bool restriction_is_implemented() const
unsigned int element_multiplicity(const unsigned int index) const
size_type block_start(const unsigned int i) const
static::ExceptionBase & ExcFENotPrimitive()
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
static::ExceptionBase & ExcMessage(std::string arg1)
const unsigned int first_quad_index
#define DeclException1(Exception1, type1, outsequence)
std::vector< std::vector< FullMatrix< double > > > prolongation
std::pair< unsigned int, unsigned int > block_to_base_index(const unsigned int block) const
#define Assert(cond, exc)
unsigned int component_to_block_index(const unsigned int component) const
virtual Tensor< 1, dim > shape_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
unsigned int n_nonzero_components(const unsigned int i) const
virtual double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) 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
Abstract base class for mapping classes.
std::pair< unsigned int, unsigned int > component_to_base_index(const unsigned int component) const
#define DeclExceptionMsg(Exception, defaulttext)
#define DeclException0(Exception0)
unsigned int adjust_line_dof_index_for_line_orientation(const unsigned int index, const bool line_orientation) const
static::ExceptionBase & ExcWrongInterfaceMatrixSize(int arg1, int arg2)
GeometryPrimitive get_associated_geometry_primitive(const unsigned int cell_dof_index) const
const ComponentMask & get_nonzero_components(const unsigned int i) const
virtual Point< dim > unit_support_point(const unsigned int index) const
const FullMatrix< double > & constraints(const ::internal::SubfaceCase< dim > &subface_case=::internal::SubfaceCase< dim >::case_isotropic) const
virtual std::string get_name() const =0
unsigned int n_base_elements() const
static::ExceptionBase & ExcProjectionVoid()
bool has_generalized_support_points() const
virtual Point< dim-1 > unit_face_support_point(const unsigned int index) const
virtual bool operator==(const FiniteElement< dim, spacedim > &fe) const
unsigned int n_components() const
std::pair< unsigned int, unsigned int > face_system_to_component_index(const unsigned int index) const
std::pair< std::pair< unsigned int, unsigned int >, unsigned int > system_to_base_index(const unsigned int index) const
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const
std::pair< unsigned int, size_type > global_to_local(const size_type i) const
std::string int_to_string(const unsigned int value, const unsigned int digits=numbers::invalid_unsigned_int)
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix) const
size_type block_size(const unsigned int i) const
const FiniteElement< dim, spacedim > & operator[](const unsigned int fe_index) const
const unsigned int dofs_per_cell
static::ExceptionBase & ExcShapeFunctionNotPrimitive(int arg1)
const std::vector< Point< dim > > & get_generalized_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
bool restriction_is_additive(const unsigned int index) const
virtual Tensor< 3, dim > shape_3rd_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) 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
Table< 2, int > adjust_quad_dof_index_for_face_orientation_table
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 const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
static::ExceptionBase & ExcEmbeddingVoid()
std::pair< std::pair< unsigned int, unsigned int >, unsigned int > face_system_to_base_index(const unsigned int index) const
virtual std::size_t memory_consumption() const
std::pair< unsigned int, unsigned int > system_to_component_index(const unsigned int index) const
virtual FiniteElementDomination::Domination compare_for_face_domination(const FiniteElement< dim, spacedim > &fe_other) const
std::vector< std::pair< unsigned int, unsigned int > > system_to_component_table
virtual Tensor< 4, dim > shape_4th_derivative(const unsigned int i, const Point< dim > &p) const
ComponentMask component_mask(const FEValuesExtractors::Scalar &scalar) const
virtual void fill_fe_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const CellSimilarity::Similarity cell_similarity, const Quadrature< dim > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const ::internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const InternalDataBase &fe_internal,::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const =0
const unsigned int first_line_index
const bool cached_primitivity
const std::vector< ComponentMask > nonzero_components
void reinit_restriction_and_prolongation_matrices(const bool isotropic_restriction_only=false, const bool isotropic_prolongation_only=false)
virtual Tensor< 4, dim > shape_4th_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > system_to_base_table
bool has_generalized_face_support_points() const
unsigned int size() const
std::vector< std::pair< unsigned int, unsigned int > > face_system_to_component_table
virtual ~FiniteElement() override=default
std::pair< std::unique_ptr< FiniteElement< dim, spacedim > >, unsigned int > operator^(const unsigned int multiplicity) const
virtual void fill_fe_subface_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int sub_no, const Quadrature< dim-1 > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const ::internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const InternalDataBase &fe_internal,::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const =0
const std::vector< Point< dim-1 > > & get_unit_face_support_points() const
BlockIndices base_to_block_indices
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > face_system_to_base_table
bool has_support_points() const
types::global_dof_index first_block_of_base(const unsigned int b) const
static const unsigned int space_dimension
bool has_face_support_points() const
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) const
std::vector< int > adjust_line_dof_index_for_line_orientation_table
const std::vector< bool > restriction_is_additive_flags
virtual void convert_generalized_support_point_values_to_dof_values(const std::vector< Vector< double >> &support_point_values, std::vector< double > &nodal_values) const
virtual Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const