20 #include <deal.II/base/config.h>
21 #include <deal.II/base/geometry_info.h>
22 #include <deal.II/fe/fe_base.h>
23 #include <deal.II/fe/fe_values_extractors.h>
24 #include <deal.II/fe/component_mask.h>
25 #include <deal.II/fe/block_mask.h>
32 template <
int dim,
int spacedim>
class FEValues;
35 template <
int dim,
int spacedim>
class FESystem;
36 template <
class POLY,
int dim,
int spacedim>
class FE_PolyTensor;
39 template <
int dim,
int spacedim>
class FECollection;
352 template <
int dim,
int spacedim=dim>
416 virtual std::string
get_name ()
const = 0;
471 const unsigned int component)
const;
500 const unsigned int component)
const;
534 const unsigned int component)
const;
546 const unsigned int face_index)
const;
805 const unsigned int subface,
833 std::vector<std::pair<unsigned int, unsigned int> >
841 std::vector<std::pair<unsigned int, unsigned int> >
849 std::vector<std::pair<unsigned int, unsigned int> >
907 std::pair<unsigned int, unsigned int>
920 const unsigned int index)
const;
931 std::pair<unsigned int, unsigned int>
988 const unsigned int face,
989 const bool face_orientation =
true,
990 const bool face_flip =
false,
991 const bool face_rotation =
false)
const;
1002 const bool face_orientation,
1003 const bool face_flip,
1004 const bool face_rotation)
const;
1014 const bool line_orientation)
const;
1116 std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>
1127 std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>
1148 std::pair<unsigned int, unsigned int>
1156 std::pair<unsigned int,unsigned int>
1162 std::pair<unsigned int,types::global_dof_index>
1352 const std::vector<Point<dim> > &
1414 const std::vector<
Point<dim-1> > &
1441 const std::vector<Point<dim> > &
1456 const std::vector<
Point<dim-1> > &
1457 get_generalized_face_support_points ()
const;
1478 virtual void interpolate(std::vector<double> &local_dofs,
1479 const std::vector<double> &values)
const;
1490 virtual void interpolate(std::vector<double> &local_dofs,
1492 unsigned int offset = 0)
const;
1499 std::vector<double> &local_dofs,
1500 const VectorSlice<
const std::vector<std::vector<double> > > &values)
const;
1520 <<
"The shape function with index " << arg1
1521 <<
" is not primitive, i.e. it is vector-valued and "
1522 <<
"has more than one non-zero vector component. This "
1523 <<
"function cannot be called for these shape functions. "
1524 <<
"Maybe you want to use the same function with the "
1525 <<
"_component suffix?");
1579 <<
"The interface matrix has a size of " << arg1
1581 <<
", which is not reasonable in the present dimension.");
1588 <<
"The component-index pair (" << arg1 <<
", " << arg2
1589 <<
") is invalid, i.e. non-existent.");
1625 const bool isotropic_prolongation_only=
false);
1749 const unsigned int offset,
1751 InternalDataBase &fe_internal,
1760 std::vector<unsigned int>
1836 std::vector<std::pair<std::pair<unsigned int,unsigned int>,
unsigned int> >
1842 std::vector<std::pair<std::pair<unsigned int,unsigned int>,
unsigned int> >
1871 std::vector<std::pair<std::pair<unsigned int, unsigned int>,
unsigned int> >
1983 CellSimilarity::Similarity &cell_similarity)
const = 0;
1995 const unsigned int face_no,
2011 const unsigned int face_no,
2012 const unsigned int sub_no,
2018 friend class InternalDataBase;
2020 friend class FEValues<dim,spacedim>;
2023 template <
int,
int >
friend class FESystem;
2024 template <
class POLY,
int dim_,
int spacedim_>
friend class FE_PolyTensor;
2033 template <
int dim,
int spacedim>
2039 ExcMessage (
"A fe_index of zero is the only index allowed here"));
2045 template <
int dim,
int spacedim>
2047 std::pair<unsigned int,unsigned int>
2050 Assert (index < system_to_component_table.size(),
2052 Assert (is_primitive (index),
2054 return system_to_component_table[index];
2059 template <
int dim,
int spacedim>
2064 return base_to_block_indices.size();
2069 template <
int dim,
int spacedim>
2074 return static_cast<unsigned int>(base_to_block_indices.block_size(index));
2079 template <
int dim,
int spacedim>
2083 const unsigned int index)
const
2085 std::vector< std::pair<unsigned int, unsigned int> >::const_iterator
2086 it = std::find(system_to_component_table.begin(), system_to_component_table.end(),
2087 std::pair<unsigned int, unsigned int>(component, index));
2089 Assert(it != system_to_component_table.end(), ExcComponentIndexInvalid(component, index));
2090 return std::distance(system_to_component_table.begin(), it);
2095 template <
int dim,
int spacedim>
2097 std::pair<unsigned int,unsigned int>
2100 Assert(index < face_system_to_component_table.size(),
2101 ExcIndexRange(index, 0, face_system_to_component_table.size()));
2116 Assert (is_primitive(this->face_to_cell_index(index, 0)),
2119 return face_system_to_component_table[index];
2124 template <
int dim,
int spacedim>
2126 std::pair<std::pair<unsigned int,unsigned int>,
unsigned int>
2129 Assert (index < system_to_base_table.size(),
2131 return system_to_base_table[index];
2137 template <
int dim,
int spacedim>
2139 std::pair<std::pair<unsigned int,unsigned int>,
unsigned int>
2142 Assert(index < face_system_to_base_table.size(),
2144 return face_system_to_base_table[index];
2149 template <
int dim,
int spacedim>
2154 return base_to_block_indices.block_start(index);
2159 template <
int dim,
int spacedim>
2161 std::pair<unsigned int,unsigned int>
2164 Assert(index < component_to_base_table.size(),
2167 return component_to_base_table[index].first;
2172 template <
int dim,
int spacedim>
2174 std::pair<unsigned int,unsigned int>
2177 return base_to_block_indices.global_to_local(index);
2182 template <
int dim,
int spacedim>
2184 std::pair<unsigned int,types::global_dof_index>
2187 Assert (index < this->dofs_per_cell,
2192 return std::pair<unsigned int, types::global_dof_index>(
2193 first_block_of_base(system_to_base_table[index].first.first)
2194 + system_to_base_table[index].first.second,
2195 system_to_base_table[index].second);
2200 template <
int dim,
int spacedim>
2205 Assert(index < this->dofs_per_cell,
2207 return restriction_is_additive_flags[index];
2212 template <
int dim,
int spacedim>
2218 return nonzero_components[i];
2223 template <
int dim,
int spacedim>
2229 return n_nonzero_components_table[i];
2234 template <
int dim,
int spacedim>
2253 return (is_primitive() ||
2254 (n_nonzero_components_table[i] == 1));
2259 DEAL_II_NAMESPACE_CLOSE
virtual void fill_fe_values(const Mapping< dim, spacedim > &mapping, const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Quadrature< dim > &quadrature, typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, typename Mapping< dim, spacedim >::InternalDataBase &fe_internal, FEValuesData< dim, spacedim > &data, CellSimilarity::Similarity &cell_similarity) const =0
bool prolongation_is_implemented() const
std::vector< std::pair< unsigned int, unsigned int > > face_system_to_component_table
std::vector< std::vector< FullMatrix< double > > > restriction
std::pair< unsigned int, types::global_dof_index > system_to_block_index(const unsigned int component) const
virtual Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
virtual void fill_fe_subface_values(const Mapping< dim, spacedim > &mapping, const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int sub_no, const Quadrature< dim-1 > &quadrature, typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, typename Mapping< dim, spacedim >::InternalDataBase &fe_internal, FEValuesData< dim, spacedim > &data) const =0
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
void initialize_2nd(const FiniteElement< dim, spacedim > *element, const Mapping< dim, spacedim > &mapping, const Quadrature< dim > &quadrature)
bool isotropic_restriction_is_implemented() const
const std::vector< Point< dim-1 > > & get_unit_face_support_points() const
bool constraints_are_implemented(const ::internal::SubfaceCase< dim > &subface_case=::internal::SubfaceCase< dim >::case_isotropic) const
void compute_2nd(const Mapping< dim, spacedim > &mapping, const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int offset, typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, InternalDataBase &fe_internal, FEValuesData< dim, spacedim > &data) const
::ExceptionBase & ExcMessage(std::string arg1)
Auxiliary class aiding in the handling of block structures like in BlockVector or FESystem...
Table< 2, int > adjust_quad_dof_index_for_face_orientation_table
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > component_to_base_table
bool is_primitive() const
virtual std::size_t memory_consumption() const
bool isotropic_prolongation_is_implemented() const
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > face_system_to_base_table
virtual Tensor< 1, dim > shape_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) const
const std::vector< unsigned int > n_nonzero_components_table
BlockMask block_mask(const FEValuesExtractors::Scalar &scalar) 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
std::vector< Point< dim > > unit_support_points
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
bool restriction_is_implemented() const
virtual ~InternalDataBase()
unsigned int element_multiplicity(const unsigned int index) const
virtual void interpolate(std::vector< double > &local_dofs, const std::vector< double > &values) const
std::vector< std::pair< unsigned int, unsigned int > > system_to_component_table
virtual Point< dim-1 > unit_face_support_point(const unsigned int index) const
std::vector< std::vector< FullMatrix< double > > > prolongation
unsigned int global_dof_index
const std::vector< Point< dim > > & get_generalized_support_points() const
std::pair< unsigned int, unsigned int > block_to_base_index(const unsigned int block) const
DeclException1(ExcShapeFunctionNotPrimitive, int,<< "The shape function with index "<< arg1<< " is not primitive, i.e. it is vector-valued and "<< "has more than one non-zero vector component. This "<< "function cannot be called for these shape functions. "<< "Maybe you want to use the same function with the "<< "_component suffix?")
#define Assert(cond, exc)
unsigned int component_to_block_index(const unsigned int component) const
DeclException0(ExcFENotPrimitive)
virtual void get_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
unsigned int n_nonzero_components(const unsigned int i) const
bool operator==(const FiniteElement< dim, spacedim > &) 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< Point< dim-1 > > unit_face_support_points
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
std::pair< unsigned int, unsigned int > component_to_base_index(const unsigned int component) const
virtual Mapping< dim, spacedim >::InternalDataBase * get_subface_data(const UpdateFlags flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim-1 > &quadrature) const
virtual UpdateFlags update_once(const UpdateFlags flags) const =0
unsigned int adjust_line_dof_index_for_line_orientation(const unsigned int index, const bool line_orientation) const
const ComponentMask & get_nonzero_components(const unsigned int i) const
::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
virtual std::string get_name() const =0
unsigned int n_base_elements() const
bool has_generalized_support_points() const
static std::vector< unsigned int > compute_n_nonzero_components(const std::vector< ComponentMask > &nonzero_components)
std::pair< unsigned int, unsigned int > face_system_to_component_index(const unsigned int index) const
virtual Mapping< dim, spacedim >::InternalDataBase * get_face_data(const UpdateFlags flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim-1 > &quadrature) const
std::pair< std::pair< unsigned int, unsigned int >, unsigned int > system_to_base_index(const unsigned int index) const
virtual bool hp_constraints_are_implemented() const
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const
virtual Mapping< dim, spacedim >::InternalDataBase * get_data(const UpdateFlags flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim > &quadrature) const =0
const FiniteElement< dim, spacedim > & operator[](const unsigned int fe_index) const
std::vector< Point< dim-1 > > generalized_face_support_points
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const
static const double fd_step_length
std::vector< FEValues< dim, spacedim > * > differences
virtual UpdateFlags update_each(const UpdateFlags flags) const =0
bool restriction_is_additive(const unsigned int index) const
virtual Point< dim > unit_support_point(const unsigned int index) const
std::pair< std::pair< unsigned int, unsigned int >, unsigned int > face_system_to_base_index(const unsigned int index) const
std::pair< unsigned int, unsigned int > system_to_component_index(const unsigned int index) const
ComponentMask component_mask(const FEValuesExtractors::Scalar &scalar) const
virtual void fill_fe_face_values(const Mapping< dim, spacedim > &mapping, const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const Quadrature< dim-1 > &quadrature, typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, typename Mapping< dim, spacedim >::InternalDataBase &fe_internal, FEValuesData< dim, spacedim > &data) const =0
const std::vector< ComponentMask > nonzero_components
void reinit_restriction_and_prolongation_matrices(const bool isotropic_restriction_only=false, const bool isotropic_prolongation_only=false)
const std::vector< Point< dim > > & get_unit_support_points() const
DeclException2(ExcWrongInterfaceMatrixSize, int, int,<< "The interface matrix has a size of "<< arg1<< "x"<< arg2<< ", which is not reasonable in the present dimension.")
bool has_generalized_face_support_points() const
virtual FiniteElementDomination::Domination compare_for_face_domination(const FiniteElement< dim, spacedim > &fe_other) const
const FullMatrix< double > & constraints(const ::internal::SubfaceCase< dim > &subface_case=::internal::SubfaceCase< dim >::case_isotropic) const
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
virtual double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix) const
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
virtual FiniteElement< dim, spacedim > * clone() const =0
BlockIndices base_to_block_indices
virtual double shape_value(const unsigned int i, const Point< dim > &p) const
bool has_support_points() const
types::global_dof_index first_block_of_base(const unsigned int b) const
bool has_face_support_points() const
TableIndices< 2 > interface_constraints_size() const
std::vector< int > adjust_line_dof_index_for_line_orientation_table
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
const std::vector< bool > restriction_is_additive_flags
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > system_to_base_table