include/deal.II/fe/fe_system.h

00001 //---------------------------------------------------------------------------
00002 //    @f$Id: fe_system.h 25345 2012-03-31 08:37:04Z bangerth @f$
00003 //
00004 //    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 by the deal.II authors
00005 //
00006 //    This file is subject to QPL and may not be  distributed
00007 //    without copyright and license information. Please refer
00008 //    to the file deal.II/doc/license.html for the  text  and
00009 //    further information on this license.
00010 //
00011 //---------------------------------------------------------------------------
00012 #ifndef __deal2__fe_system_h
00013 #define __deal2__fe_system_h
00014 
00015 
00016 /*----------------------------   fe_system.h     ---------------------------*/
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 /*----------------------------  fe_system.h  ---------------------------*/
01280 #endif
01281 /*----------------------------  fe_system.h  ---------------------------*/
01282 
01283 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

deal.II documentation generated on Tue May 22 2012 12:06:08 by doxygen 1.7.3