00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__fe_system_h
00013 #define __deal2__fe_system_h
00014
00015
00016
00017
00018
00019 #include <deal.II/base/config.h>
00020 #include <deal.II/fe/fe.h>
00021 #include <vector>
00022 #include <utility>
00023
00024 DEAL_II_NAMESPACE_OPEN
00025
00149 template <int dim, int spacedim=dim>
00150 class FESystem : public FiniteElement<dim,spacedim>
00151 {
00152 public:
00153
00174 FESystem (const FiniteElement<dim,spacedim> &fe,
00175 const unsigned int n_elements);
00176
00184 FESystem (const FiniteElement<dim,spacedim> &fe1, const unsigned int n1,
00185 const FiniteElement<dim,spacedim> &fe2, const unsigned int n2);
00186
00194 FESystem (const FiniteElement<dim,spacedim> &fe1, const unsigned int n1,
00195 const FiniteElement<dim,spacedim> &fe2, const unsigned int n2,
00196 const FiniteElement<dim,spacedim> &fe3, const unsigned int n3);
00197
00205 FESystem (const FiniteElement<dim,spacedim> &fe1, const unsigned int n1,
00206 const FiniteElement<dim,spacedim> &fe2, const unsigned int n2,
00207 const FiniteElement<dim,spacedim> &fe3, const unsigned int n3,
00208 const FiniteElement<dim,spacedim> &fe4, const unsigned int n4);
00209
00217 FESystem (const FiniteElement<dim,spacedim> &fe1, const unsigned int n1,
00218 const FiniteElement<dim,spacedim> &fe2, const unsigned int n2,
00219 const FiniteElement<dim,spacedim> &fe3, const unsigned int n3,
00220 const FiniteElement<dim,spacedim> &fe4, const unsigned int n4,
00221 const FiniteElement<dim,spacedim> &fe5, const unsigned int n5);
00222
00235 FESystem (const std::vector<const FiniteElement<dim,spacedim>*> &fes,
00236 const std::vector<unsigned int> &multiplicities);
00237
00241 virtual ~FESystem ();
00242
00259 virtual std::string get_name () const;
00260
00287 virtual double shape_value (const unsigned int i,
00288 const Point<dim> &p) const;
00289
00306 virtual double shape_value_component (const unsigned int i,
00307 const Point<dim> &p,
00308 const unsigned int component) const;
00309
00340 virtual Tensor<1,dim> shape_grad (const unsigned int i,
00341 const Point<dim> &p) const;
00342
00359 virtual Tensor<1,dim> shape_grad_component (const unsigned int i,
00360 const Point<dim> &p,
00361 const unsigned int component) const;
00362
00392 virtual Tensor<2,dim> shape_grad_grad (const unsigned int i,
00393 const Point<dim> &p) const;
00394
00411 virtual
00412 Tensor<2,dim>
00413 shape_grad_grad_component (const unsigned int i,
00414 const Point<dim> &p,
00415 const unsigned int component) const;
00416
00439 virtual void
00440 get_interpolation_matrix (const FiniteElement<dim,spacedim> &source,
00441 FullMatrix<double> &matrix) const;
00442
00455 virtual const FiniteElement<dim,spacedim> &
00456 base_element (const unsigned int index) const;
00457
00472 virtual bool has_support_on_face (const unsigned int shape_index,
00473 const unsigned int face_index) const;
00474
00480 virtual
00481 Point<dim>
00482 unit_support_point (const unsigned int index) const;
00483
00489 virtual
00490 Point<dim-1>
00491 unit_face_support_point (const unsigned int index) const;
00492
00509 virtual bool hp_constraints_are_implemented () const;
00510
00533 virtual void
00534 get_face_interpolation_matrix (const FiniteElement<dim,spacedim> &source,
00535 FullMatrix<double> &matrix) const;
00536
00537
00560 virtual void
00561 get_subface_interpolation_matrix (const FiniteElement<dim,spacedim> &source,
00562 const unsigned int subface,
00563 FullMatrix<double> &matrix) const;
00564
00599 virtual
00600 std::vector<std::pair<unsigned int, unsigned int> >
00601 hp_vertex_dof_identities (const FiniteElement<dim,spacedim> &fe_other) const;
00602
00610 virtual
00611 std::vector<std::pair<unsigned int, unsigned int> >
00612 hp_line_dof_identities (const FiniteElement<dim,spacedim> &fe_other) const;
00613
00621 virtual
00622 std::vector<std::pair<unsigned int, unsigned int> >
00623 hp_quad_dof_identities (const FiniteElement<dim,spacedim> &fe_other) const;
00624
00637 virtual
00638 FiniteElementDomination::Domination
00639 compare_for_face_domination (const FiniteElement<dim,spacedim> &fe_other) const;
00641
00653 virtual std::size_t memory_consumption () const;
00654
00655 protected:
00660 virtual UpdateFlags update_once (const UpdateFlags flags) const;
00661
00666 virtual UpdateFlags update_each (const UpdateFlags flags) const;
00667
00675 virtual FiniteElement<dim,spacedim> * clone() const;
00676
00677 virtual typename Mapping<dim,spacedim>::InternalDataBase*
00678 get_data (const UpdateFlags update_flags,
00679 const Mapping<dim,spacedim> &mapping,
00680 const Quadrature<dim> &quadrature) const ;
00681
00682 virtual typename Mapping<dim,spacedim>::InternalDataBase*
00683 get_face_data (const UpdateFlags update_flags,
00684 const Mapping<dim,spacedim> &mapping,
00685 const Quadrature<dim-1> &quadrature) const ;
00686
00687 virtual typename Mapping<dim,spacedim>::InternalDataBase*
00688 get_subface_data (const UpdateFlags update_flags,
00689 const Mapping<dim,spacedim> &mapping,
00690 const Quadrature<dim-1> &quadrature) const ;
00691
00703 virtual void
00704 fill_fe_values (const Mapping<dim,spacedim> &mapping,
00705 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00706 const Quadrature<dim> &quadrature,
00707 typename Mapping<dim,spacedim>::InternalDataBase &mapping_data,
00708 typename Mapping<dim,spacedim>::InternalDataBase &fe_data,
00709 FEValuesData<dim,spacedim> &data,
00710 CellSimilarity::Similarity &cell_similarity) const;
00711
00722 virtual void
00723 fill_fe_face_values (const Mapping<dim,spacedim> &mapping,
00724 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00725 const unsigned int face_no,
00726 const Quadrature<dim-1> &quadrature,
00727 typename Mapping<dim,spacedim>::InternalDataBase &mapping_data,
00728 typename Mapping<dim,spacedim>::InternalDataBase &fe_data,
00729 FEValuesData<dim,spacedim> &data) const ;
00730
00741 virtual void
00742 fill_fe_subface_values (const Mapping<dim,spacedim> &mapping,
00743 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00744 const unsigned int face_no,
00745 const unsigned int sub_no,
00746 const Quadrature<dim-1> &quadrature,
00747 typename Mapping<dim,spacedim>::InternalDataBase &mapping_data,
00748 typename Mapping<dim,spacedim>::InternalDataBase &fe_data,
00749 FEValuesData<dim,spacedim> &data) const ;
00750
00751
00774 template <int dim_1>
00775 void compute_fill (const Mapping<dim,spacedim> &mapping,
00776 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00777 const unsigned int face_no,
00778 const unsigned int sub_no,
00779 const Quadrature<dim_1> &quadrature,
00780 CellSimilarity::Similarity cell_similarity,
00781 typename Mapping<dim,spacedim>::InternalDataBase &mapping_data,
00782 typename Mapping<dim,spacedim>::InternalDataBase &fe_data,
00783 FEValuesData<dim,spacedim> &data) const ;
00784
00785 private:
00786
00792 static const unsigned int invalid_face_number = numbers::invalid_unsigned_int;
00793
00798 typedef std::pair<const FiniteElement<dim,spacedim> *, unsigned int> ElementPair;
00799
00811 std::vector<ElementPair> base_elements;
00812
00813
00821 void initialize_unit_support_points ();
00822
00830 void initialize_unit_face_support_points ();
00831
00839 void initialize_quad_dof_index_permutation ();
00840
00852 static FiniteElementData<dim>
00853 multiply_dof_numbers (const FiniteElementData<dim> &fe_data,
00854 const unsigned int N);
00855
00860 static FiniteElementData<dim>
00861 multiply_dof_numbers (const FiniteElementData<dim> &fe1,
00862 const unsigned int N1,
00863 const FiniteElementData<dim> &fe2,
00864 const unsigned int N2);
00865
00870 static FiniteElementData<dim>
00871 multiply_dof_numbers (const FiniteElementData<dim> &fe1,
00872 const unsigned int N1,
00873 const FiniteElementData<dim> &fe2,
00874 const unsigned int N2,
00875 const FiniteElementData<dim> &fe3,
00876 const unsigned int N3);
00877
00881 static FiniteElementData<dim>
00882 multiply_dof_numbers (const FiniteElementData<dim> &fe1,
00883 const unsigned int N1,
00884 const FiniteElementData<dim> &fe2,
00885 const unsigned int N2,
00886 const FiniteElementData<dim> &fe3,
00887 const unsigned int N3,
00888 const FiniteElementData<dim> &fe4,
00889 const unsigned int N4);
00890
00891
00895 static FiniteElementData<dim>
00896 multiply_dof_numbers (const FiniteElementData<dim> &fe1,
00897 const unsigned int N1,
00898 const FiniteElementData<dim> &fe2,
00899 const unsigned int N2,
00900 const FiniteElementData<dim> &fe3,
00901 const unsigned int N3,
00902 const FiniteElementData<dim> &fe4,
00903 const unsigned int N4,
00904 const FiniteElementData<dim> &fe5,
00905 const unsigned int N5);
00906
00911 static FiniteElementData<dim>
00912 multiply_dof_numbers (const std::vector<const FiniteElement<dim,spacedim>*> &fes,
00913 const std::vector<unsigned int> &multiplicities);
00914
00915
00916
00928 static std::vector<bool>
00929 compute_restriction_is_additive_flags (
00930 const FiniteElement<dim,spacedim> &fe,
00931 const unsigned int N);
00932
00937 static std::vector<bool>
00938 compute_restriction_is_additive_flags (
00939 const FiniteElement<dim,spacedim> &fe1,
00940 const unsigned int N1,
00941 const FiniteElement<dim,spacedim> &fe2,
00942 const unsigned int N2);
00943
00948 static std::vector<bool>
00949 compute_restriction_is_additive_flags (
00950 const FiniteElement<dim,spacedim> &fe1,
00951 const unsigned int N1,
00952 const FiniteElement<dim,spacedim> &fe2,
00953 const unsigned int N2,
00954 const FiniteElement<dim,spacedim> &fe3,
00955 const unsigned int N3);
00956
00960 static std::vector<bool>
00961 compute_restriction_is_additive_flags (
00962 const FiniteElement<dim,spacedim> &fe1,
00963 const unsigned int N1,
00964 const FiniteElement<dim,spacedim> &fe2,
00965 const unsigned int N2,
00966 const FiniteElement<dim,spacedim> &fe3,
00967 const unsigned int N3,
00968 const FiniteElement<dim,spacedim> &fe4,
00969 const unsigned int N4);
00970
00974 static std::vector<bool>
00975 compute_restriction_is_additive_flags (
00976 const FiniteElement<dim,spacedim> &fe1,
00977 const unsigned int N1,
00978 const FiniteElement<dim,spacedim> &fe2,
00979 const unsigned int N2,
00980 const FiniteElement<dim,spacedim> &fe3,
00981 const unsigned int N3,
00982 const FiniteElement<dim,spacedim> &fe4,
00983 const unsigned int N4,
00984 const FiniteElement<dim,spacedim> &fe5,
00985 const unsigned int N5);
00986
00995 static std::vector<bool>
00996 compute_restriction_is_additive_flags (
00997 const std::vector<const FiniteElement<dim,spacedim>*> &fes,
00998 const std::vector<unsigned int> &multiplicities);
00999
01000
01006 static std::vector<std::vector<bool> >
01007 compute_nonzero_components (const FiniteElement<dim,spacedim> &fe1,
01008 const unsigned int N1);
01009
01015 static std::vector<std::vector<bool> >
01016 compute_nonzero_components (const FiniteElement<dim,spacedim> &fe1,
01017 const unsigned int N1,
01018 const FiniteElement<dim,spacedim> &fe2,
01019 const unsigned int N2);
01020
01026 static std::vector<std::vector<bool> >
01027 compute_nonzero_components (const FiniteElement<dim,spacedim> &fe1,
01028 const unsigned int N1,
01029 const FiniteElement<dim,spacedim> &fe2,
01030 const unsigned int N2,
01031 const FiniteElement<dim,spacedim> &fe3,
01032 const unsigned int N3);
01033
01039 static std::vector<std::vector<bool> >
01040 compute_nonzero_components (const FiniteElement<dim,spacedim> &fe1,
01041 const unsigned int N1,
01042 const FiniteElement<dim,spacedim> &fe2,
01043 const unsigned int N2,
01044 const FiniteElement<dim,spacedim> &fe3,
01045 const unsigned int N3,
01046 const FiniteElement<dim,spacedim> &fe4,
01047 const unsigned int N4);
01048
01052 static std::vector<std::vector<bool> >
01053 compute_nonzero_components (const FiniteElement<dim,spacedim> &fe1,
01054 const unsigned int N1,
01055 const FiniteElement<dim,spacedim> &fe2,
01056 const unsigned int N2,
01057 const FiniteElement<dim,spacedim> &fe3,
01058 const unsigned int N3,
01059 const FiniteElement<dim,spacedim> &fe4,
01060 const unsigned int N4,
01061 const FiniteElement<dim,spacedim> &fe5,
01062 const unsigned int N5);
01063
01072 static std::vector<std::vector<bool> >
01073 compute_nonzero_components (const std::vector<const FiniteElement<dim,spacedim>*> &fes,
01074 const std::vector<unsigned int> &multiplicities);
01075
01086 void initialize();
01087
01091 void build_cell_tables();
01092
01096 void build_face_tables();
01097
01101 void build_interface_constraints ();
01102
01110 template <int structdim>
01111 std::vector<std::pair<unsigned int, unsigned int> >
01112 hp_object_dof_identities (const FiniteElement<dim,spacedim> &fe_other) const;
01113
01124 class InternalData : public FiniteElement<dim,spacedim>::InternalDataBase
01125 {
01126 public:
01135 InternalData (const unsigned int n_base_elements);
01136
01144 ~InternalData();
01145
01151 bool compute_hessians;
01152
01160 void set_fe_data(const unsigned int base_no,
01161 typename FiniteElement<dim,spacedim>::InternalDataBase *);
01162
01169 typename FiniteElement<dim,spacedim>::InternalDataBase &
01170 get_fe_data (const unsigned int base_no) const;
01171
01172
01180 void set_fe_values_data (const unsigned int base_no,
01181 FEValuesData<dim,spacedim> *);
01182
01189 FEValuesData<dim,spacedim> & get_fe_values_data (const unsigned int base_no) const;
01190
01210 void delete_fe_values_data (const unsigned int base_no);
01211
01226 virtual void clear_first_cell ();
01227
01228 private:
01229
01253 typename std::vector<typename FiniteElement<dim,spacedim>::InternalDataBase *> base_fe_datas;
01254
01272 std::vector<FEValuesData<dim,spacedim> *> base_fe_values_datas;
01273 };
01274 };
01275
01276
01277 DEAL_II_NAMESPACE_CLOSE
01278
01279
01280 #endif
01281
01282
01283