include/deal.II/fe/fe_dgp_nonparametric.h

00001 //---------------------------------------------------------------------------
00002 //    @f$Id: fe_dgp_nonparametric.h 25345 2012-03-31 08:37:04Z bangerth @f$
00003 //
00004 //    Copyright (C) 2002, 2003, 2004, 2005, 2006, 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_dgp_nonparametric_h
00013 #define __deal2__fe_dgp_nonparametric_h
00014 
00015 #include <deal.II/base/config.h>
00016 #include <deal.II/base/polynomial.h>
00017 #include <deal.II/base/polynomial_space.h>
00018 #include <deal.II/fe/fe.h>
00019 
00020 DEAL_II_NAMESPACE_OPEN
00021 
00022 template <int dim> class PolynomialSpace;
00023 template <int dim, int spacedim> class MappingQ;
00024 
00025 
00028 
00052 template <int dim, int spacedim=dim>
00053 class FE_DGPNonparametric : public FiniteElement<dim,spacedim>
00054 {
00055   public:
00060     FE_DGPNonparametric (const unsigned int k);
00061 
00071     virtual std::string get_name () const;
00072 
00082     virtual double shape_value (const unsigned int i,
00083                                 const Point<dim> &p) const;
00084 
00103     virtual double shape_value_component (const unsigned int i,
00104                                           const Point<dim> &p,
00105                                           const unsigned int component) const;
00106 
00116     virtual Tensor<1,dim> shape_grad (const unsigned int  i,
00117                                       const Point<dim>   &p) const;
00118 
00137     virtual Tensor<1,dim> shape_grad_component (const unsigned int i,
00138                                                 const Point<dim> &p,
00139                                                 const unsigned int component) const;
00140 
00151     virtual Tensor<2,dim> shape_grad_grad (const unsigned int  i,
00152                                            const Point<dim> &p) const;
00153 
00172     virtual Tensor<2,dim> shape_grad_grad_component (const unsigned int i,
00173                                                      const Point<dim> &p,
00174                                                      const unsigned int component) const;
00175 
00182     unsigned int get_degree () const;
00183 
00205     virtual void
00206     get_face_interpolation_matrix (const FiniteElement<dim,spacedim> &source,
00207                                    FullMatrix<double>       &matrix) const;
00208 
00230     virtual void
00231     get_subface_interpolation_matrix (const FiniteElement<dim,spacedim> &source,
00232                                       const unsigned int        subface,
00233                                       FullMatrix<double>       &matrix) const;
00234 
00278     virtual
00279     std::vector<std::pair<unsigned int, unsigned int> >
00280     hp_vertex_dof_identities (const FiniteElement<dim,spacedim> &fe_other) const;
00281 
00293     virtual
00294     std::vector<std::pair<unsigned int, unsigned int> >
00295     hp_line_dof_identities (const FiniteElement<dim,spacedim> &fe_other) const;
00296 
00308     virtual
00309     std::vector<std::pair<unsigned int, unsigned int> >
00310     hp_quad_dof_identities (const FiniteElement<dim,spacedim> &fe_other) const;
00311 
00325     virtual bool hp_constraints_are_implemented () const;
00326 
00339     virtual
00340     FiniteElementDomination::Domination
00341     compare_for_face_domination (const FiniteElement<dim,spacedim> &fe_other) const;
00342 
00360     virtual bool has_support_on_face (const unsigned int shape_index,
00361                                       const unsigned int face_index) const;
00362 
00374     virtual std::size_t memory_consumption () const;
00375 
00376 
00377   private:
00388     struct Matrices
00389     {
00396         static const double * const embedding[][GeometryInfo<dim>::max_children_per_cell];
00397 
00407         static const unsigned int n_embedding_matrices;
00408 
00413         static const double * const projection_matrices[][GeometryInfo<dim>::max_children_per_cell];
00414 
00421         static const unsigned int n_projection_matrices;
00422     };
00423 
00424   protected:
00425 
00433     virtual FiniteElement<dim,spacedim> *clone() const;
00434 
00440     virtual
00441     typename Mapping<dim,spacedim>::InternalDataBase *
00442     get_data (const UpdateFlags,
00443               const Mapping<dim,spacedim>& mapping,
00444               const Quadrature<dim>& quadrature) const ;
00445 
00451     virtual void
00452     fill_fe_values (const Mapping<dim,spacedim> &mapping,
00453                     const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00454                     const Quadrature<dim>                                 &quadrature,
00455                     typename Mapping<dim,spacedim>::InternalDataBase      &mapping_internal,
00456                     typename Mapping<dim,spacedim>::InternalDataBase      &fe_internal,
00457                     FEValuesData<dim,spacedim>                            &data,
00458                     CellSimilarity::Similarity                       &cell_similarity) const;
00459 
00465     virtual void
00466     fill_fe_face_values (const Mapping<dim,spacedim> &mapping,
00467                          const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00468                          const unsigned int                    face_no,
00469                          const Quadrature<dim-1>                &quadrature,
00470                          typename Mapping<dim,spacedim>::InternalDataBase      &mapping_internal,
00471                          typename Mapping<dim,spacedim>::InternalDataBase      &fe_internal,
00472                          FEValuesData<dim,spacedim>& data) const ;
00473 
00479     virtual void
00480     fill_fe_subface_values (const Mapping<dim,spacedim> &mapping,
00481                             const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00482                             const unsigned int                    face_no,
00483                             const unsigned int                    sub_no,
00484                             const Quadrature<dim-1>                &quadrature,
00485                             typename Mapping<dim,spacedim>::InternalDataBase      &mapping_internal,
00486                             typename Mapping<dim,spacedim>::InternalDataBase      &fe_internal,
00487                             FEValuesData<dim,spacedim>& data) const ;
00488 
00489   private:
00490 
00501     static std::vector<unsigned int> get_dpo_vector (const unsigned int degree);
00502 
00522     virtual UpdateFlags update_once (const UpdateFlags flags) const;
00523 
00540     virtual UpdateFlags update_each (const UpdateFlags flags) const;
00541 
00545     const unsigned int degree;
00546 
00552     const PolynomialSpace<dim> polynomial_space;
00553 
00562     class InternalData : public FiniteElement<dim,spacedim>::InternalDataBase
00563     {
00564       public:
00565                                        // have some scratch arrays
00566       std::vector<double> values;
00567       std::vector<Tensor<1,dim> > grads;
00568       std::vector<Tensor<2,dim> > grad_grads;
00569     };
00570 
00574     template <int, int> friend class FE_DGPNonparametric;
00575 
00581     template <int, int> friend class MappingQ;
00582 //    friend class MappingQ<dim>;
00583 };
00584 
00587 #ifndef DOXYGEN
00588 
00589 // declaration of explicit specializations of member variables, if the
00590 // compiler allows us to do that (the standard says we must)
00591 #ifndef DEAL_II_MEMBER_VAR_SPECIALIZATION_BUG
00592 template <>
00593 const double * const FE_DGPNonparametric<1,1>::Matrices::embedding[][GeometryInfo<1>::max_children_per_cell];
00594 
00595 template <>
00596 const unsigned int FE_DGPNonparametric<1,1>::Matrices::n_embedding_matrices;
00597 
00598 template <>
00599 const double * const FE_DGPNonparametric<1,1>::Matrices::projection_matrices[][GeometryInfo<1>::max_children_per_cell];
00600 
00601 template <>
00602 const unsigned int FE_DGPNonparametric<1,1>::Matrices::n_projection_matrices;
00603 
00604 template <>
00605 const double * const FE_DGPNonparametric<2,2>::Matrices::embedding[][GeometryInfo<2>::max_children_per_cell];
00606 
00607 template <>
00608 const unsigned int FE_DGPNonparametric<2,2>::Matrices::n_embedding_matrices;
00609 
00610 template <>
00611 const double * const FE_DGPNonparametric<2,2>::Matrices::projection_matrices[][GeometryInfo<2>::max_children_per_cell];
00612 
00613 template <>
00614 const unsigned int FE_DGPNonparametric<2,2>::Matrices::n_projection_matrices;
00615 
00616 template <>
00617 const double * const FE_DGPNonparametric<3,3>::Matrices::embedding[][GeometryInfo<3>::max_children_per_cell];
00618 
00619 template <>
00620 const unsigned int FE_DGPNonparametric<3,3>::Matrices::n_embedding_matrices;
00621 
00622 template <>
00623 const double * const FE_DGPNonparametric<3,3>::Matrices::projection_matrices[][GeometryInfo<3>::max_children_per_cell];
00624 
00625 template <>
00626 const unsigned int FE_DGPNonparametric<3,3>::Matrices::n_projection_matrices;
00627 #endif
00628 
00629 #endif // DOXYGEN
00630 
00631 DEAL_II_NAMESPACE_CLOSE
00632 
00633 #endif
00634 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

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