16 #ifndef dealii_fe_system_h 17 # define dealii_fe_system_h 23 # include <deal.II/base/config.h> 25 # include <deal.II/base/thread_management.h> 27 # include <deal.II/fe/fe.h> 28 # include <deal.II/fe/fe_tools.h> 31 # include <type_traits> 36 DEAL_II_NAMESPACE_OPEN
38 template <
int dim,
int spacedim>
169 template <
int dim,
int spacedim = dim>
204 const unsigned int n_elements);
213 const unsigned int n1,
215 const unsigned int n2);
224 const unsigned int n1,
226 const unsigned int n2,
228 const unsigned int n3);
237 const unsigned int n1,
239 const unsigned int n2,
241 const unsigned int n3,
243 const unsigned int n4);
252 const unsigned int n1,
254 const unsigned int n2,
256 const unsigned int n3,
258 const unsigned int n4,
260 const unsigned int n5);
448 const std::vector<unsigned int> &multiplicities);
450 # if !defined(__INTEL_COMPILER) || __INTEL_COMPILER >= 1900 495 typename =
typename enable_if_all<
496 (std::is_same<typename std::decay<FEPairs>::type,
497 std::pair<std::unique_ptr<FiniteElement<dim, spacedim>>,
498 unsigned int>>::value ||
499 std::is_base_of<FiniteElement<dim, spacedim>,
500 typename std::decay<FEPairs>::type>::value)...>::type>
516 const std::initializer_list<
548 virtual std::unique_ptr<FiniteElement<dim, spacedim>>
549 clone()
const override;
561 get_sub_fe(
const unsigned int first_component,
562 const unsigned int n_selected_components)
const override;
590 const unsigned int component)
const override;
620 const unsigned int component)
const override;
650 const unsigned int component)
const override;
681 const unsigned int component)
const override;
712 const unsigned int component)
const override;
744 const unsigned int face_index)
const override;
771 const unsigned int child,
804 const unsigned int child,
848 const unsigned int face,
849 const bool face_orientation =
true,
850 const bool face_flip =
false,
851 const bool face_rotation =
false)
const override;
862 virtual Point<dim - 1>
872 virtual std::pair<Table<2, bool>, std::vector<unsigned int>>
921 const unsigned int subface,
939 virtual std::vector<std::pair<unsigned int, unsigned int>>
947 virtual std::vector<std::pair<unsigned int, unsigned int>>
955 virtual std::vector<std::pair<unsigned int, unsigned int>>
990 std::vector<double> & dof_values)
const override;
1004 virtual std::unique_ptr<
1012 &output_data)
const override;
1014 virtual std::unique_ptr<
1022 &output_data)
const override;
1024 virtual std::unique_ptr<
1032 &output_data)
const override;
1041 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1047 &output_data)
const override;
1050 fill_fe_face_values(
1052 const unsigned int face_no,
1056 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1062 &output_data)
const override;
1065 fill_fe_subface_values(
1067 const unsigned int face_no,
1068 const unsigned int sub_no,
1072 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1078 &output_data)
const override;
1090 template <
int dim_1>
1095 const unsigned int face_no,
1096 const unsigned int sub_no,
1104 &output_data)
const;
1119 std::vector<std::pair<std::unique_ptr<const FiniteElement<dim, spacedim>>,
1144 const std::vector<unsigned int> &multiplicities);
1157 template <
int structdim>
1158 std::vector<std::pair<unsigned int, unsigned int>>
1188 const unsigned int base_no,
1217 typename std::vector<
1218 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>>
1229 mutable std::vector<
1247 namespace FESystemImplementation
1249 template <
int dim,
int spacedim>
1252 const std::initializer_list<
1256 return std::count_if(
1259 [](
const std::pair<std::unique_ptr<FiniteElement<dim, spacedim>>,
1260 unsigned int> &fe_system) {
1261 return fe_system.second > 0;
1267 template <
int dim,
int spacedim>
1268 std::pair<std::unique_ptr<FiniteElement<dim, spacedim>>,
unsigned int>
1271 return std::make_pair<std::unique_ptr<FiniteElement<dim, spacedim>>,
1272 unsigned int>(std::move(fe.
clone()), 1u);
1277 template <
int dim,
int spacedim>
1285 return std::forward<
1286 std::pair<std::unique_ptr<FiniteElement<dim, spacedim>>,
unsigned int>>(
1294 # if !defined(__INTEL_COMPILER) || __INTEL_COMPILER >= 1900 1299 template <
int dim,
int spacedim>
1300 template <
class... FEPairs,
typename>
1303 {internal::FESystemImplementation::promote_to_fe_pair<dim, spacedim>(
1304 std::forward<FEPairs>(fe_pairs))...})
1309 template <
int dim,
int spacedim>
1311 const std::initializer_list<
1315 FETools::Compositing::multiply_dof_numbers<dim, spacedim>(fe_systems),
1316 FETools::Compositing::compute_restriction_is_additive_flags<dim,
1319 FETools::Compositing::compute_nonzero_components<dim, spacedim>(
1323 std::vector<const FiniteElement<dim, spacedim> *> fes;
1324 std::vector<unsigned int> multiplicities;
1326 const auto extract =
1327 [&fes, &multiplicities](
1328 const std::pair<std::unique_ptr<FiniteElement<dim, spacedim>>,
1329 unsigned int> &fe_system) {
1330 fes.push_back(fe_system.first.get());
1331 multiplicities.push_back(fe_system.second);
1334 for (
const auto &p : fe_systems)
1343 DEAL_II_NAMESPACE_CLOSE
virtual std::size_t memory_consumption() const override
virtual Point< dim > unit_support_point(const unsigned int index) const override
std::vector< internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > > base_fe_output_objects
static const unsigned int invalid_unsigned_int
virtual double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
FiniteElement< dim, spacedim >::InternalDataBase & get_fe_data(const unsigned int base_no) const
void build_interface_constraints()
virtual std::string get_name() const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
virtual FiniteElementDomination::Domination compare_for_face_domination(const FiniteElement< dim, spacedim > &fe_other) const override
virtual Tensor< 4, dim > shape_4th_derivative(const unsigned int i, const Point< dim > &p) const override
virtual std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const override
virtual ~FESystem() override=default
virtual void convert_generalized_support_point_values_to_dof_values(const std::vector< Vector< double >> &support_point_values, std::vector< double > &dof_values) const override
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const override
virtual Tensor< 1, dim > shape_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) const override
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const =0
virtual double shape_value(const unsigned int i, const Point< dim > &p) const override
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 override
virtual const FiniteElement< dim, spacedim > & get_sub_fe(const unsigned int first_component, const unsigned int n_selected_components) const override
virtual Tensor< 4, dim > shape_4th_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
InternalData(const unsigned int n_base_elements)
virtual Tensor< 3, dim > shape_3rd_derivative(const unsigned int i, const Point< dim > &p) const override
std::vector< std::vector< std::size_t > > generalized_support_points_index_table
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const override
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
std::vector< std::pair< unsigned int, unsigned int > > hp_object_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
static const unsigned int invalid_face_number
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const override
Abstract base class for mapping classes.
void set_fe_data(const unsigned int base_no, std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase >)
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const override
internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > & get_fe_output_object(const unsigned int base_no) const
unsigned int n_base_elements() const
virtual bool hp_constraints_are_implemented() const override
virtual std::unique_ptr< typename FiniteElement< dim, spacedim >::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 override
std::vector< std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > > base_fe_datas
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
void initialize(const std::vector< const FiniteElement< dim, spacedim > * > &fes, const std::vector< unsigned int > &multiplicities)
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix) const override
virtual std::unique_ptr< typename FiniteElement< dim, spacedim >::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 override
virtual Tensor< 3, dim > shape_3rd_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual void get_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const override
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const override
FESystem(const FiniteElement< dim, spacedim > &fe, const unsigned int n_elements)
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const override
void compute_fill(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, const CellSimilarity::Similarity cell_similarity, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const typename FiniteElement< dim, spacedim >::InternalDataBase &fe_data, const internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const override
virtual Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > get_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim > &quadrature,::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
virtual Point< dim-1 > unit_face_support_point(const unsigned int index) const override
std::vector< std::pair< std::unique_ptr< const FiniteElement< dim, spacedim > >, unsigned int > > base_elements