include/deal.II/fe/mapping_q.h

00001 //---------------------------------------------------------------------------
00002 //    @f$Id: mapping_q.h 25345 2012-03-31 08:37:04Z bangerth @f$
00003 //
00004 //    Copyright (C) 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__mapping_q_h
00013 #define __deal2__mapping_q_h
00014 
00015 
00016 #include <deal.II/base/config.h>
00017 #include <deal.II/base/table.h>
00018 #include <deal.II/fe/mapping_q1.h>
00019 #include <deal.II/fe/fe_q.h>
00020 
00021 DEAL_II_NAMESPACE_OPEN
00022 
00023 template <int dim> class TensorProductPolynomials;
00024 
00025 
00028 
00044 template <int dim, int spacedim=dim>
00045 class MappingQ : public MappingQ1<dim,spacedim>
00046 {
00047   public:
00074     MappingQ (const unsigned int p,
00075               const bool use_mapping_q_on_all_cells = false);
00076 
00085     MappingQ (const MappingQ<dim,spacedim> &mapping);
00086 
00090     virtual ~MappingQ ();
00091 
00098     virtual Point<spacedim>
00099     transform_unit_to_real_cell (
00100       const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00101       const Point<dim>                                 &p) const;
00102 
00120     virtual Point<dim>
00121     transform_real_to_unit_cell (
00122       const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00123       const Point<spacedim>                            &p) const;
00124 
00125     virtual void
00126     transform (const VectorSlice<const std::vector<Tensor<1,dim> > > input,
00127                VectorSlice<std::vector<Tensor<1,spacedim> > > output,
00128                const typename Mapping<dim,spacedim>::InternalDataBase &internal,
00129                const MappingType type) const;
00130 
00131     virtual void
00132     transform (const VectorSlice<const std::vector<DerivativeForm<1, dim, spacedim> > >    input,
00133                VectorSlice<std::vector<Tensor<2,spacedim> > > output,
00134                const typename Mapping<dim,spacedim>::InternalDataBase &internal,
00135                const MappingType type) const;
00136 
00137     virtual
00138     void
00139     transform (const VectorSlice<const std::vector<Tensor<2, dim> > >     input,
00140                VectorSlice<std::vector<Tensor<2,spacedim> > >             output,
00141                const typename Mapping<dim,spacedim>::InternalDataBase &internal,
00142                const MappingType type) const;
00143 
00149     unsigned int get_degree () const;
00150 
00156     virtual
00157     Mapping<dim,spacedim> * clone () const;
00158 
00163     class InternalData : public MappingQ1<dim,spacedim>::InternalData
00164     {
00165       public:
00169         InternalData (const unsigned int n_shape_functions);
00170 
00171 
00178         virtual std::size_t memory_consumption () const;
00179 
00191         std::vector<std::vector<Point<dim> > > unit_normals;
00192 
00204         bool use_mapping_q1_on_current_cell;
00205 
00210         typename MappingQ1<dim,spacedim>::InternalData mapping_q1_data;
00211     };
00212 
00213   protected:
00218     virtual void
00219     fill_fe_values (const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00220                     const Quadrature<dim>                                     &quadrature,
00221                     typename Mapping<dim,spacedim>::InternalDataBase          &mapping_data,
00222                     typename std::vector<Point<spacedim> >                    &quadrature_points,
00223                     std::vector<double>                                       &JxW_values,
00224                     std::vector<DerivativeForm<1,dim,spacedim> >       &jacobians,
00225                     std::vector<DerivativeForm<2,dim,spacedim> >       &jacobian_grads,
00226                     std::vector<DerivativeForm<1,spacedim,dim> >      &inverse_jacobians,
00227                     std::vector<Point<spacedim> >                             &cell_normal_vectors,
00228                     CellSimilarity::Similarity                           &cell_similarity) const ;
00229 
00234     virtual void
00235     fill_fe_face_values (const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00236                          const unsigned int face_no,
00237                          const Quadrature<dim-1>& quadrature,
00238                          typename Mapping<dim,spacedim>::InternalDataBase &mapping_data,
00239                          typename std::vector<Point<spacedim> >        &quadrature_points,
00240                          std::vector<double>             &JxW_values,
00241                          typename std::vector<Tensor<1,spacedim> >        &exterior_form,
00242                          typename std::vector<Point<spacedim> >        &normal_vectors) const ;
00243 
00248     virtual void
00249     fill_fe_subface_values (const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00250                             const unsigned int face_no,
00251                             const unsigned int sub_no,
00252                             const Quadrature<dim-1>& quadrature,
00253                             typename Mapping<dim,spacedim>::InternalDataBase &mapping_data,
00254                             typename std::vector<Point<spacedim> >        &quadrature_points,
00255                             std::vector<double>             &JxW_values,
00256                             typename std::vector<Tensor<1,spacedim> >        &exterior_form,
00257                             typename std::vector<Point<spacedim> >        &normal_vectors) const ;
00258 
00282     virtual void
00283     add_line_support_points (const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00284                              std::vector<Point<spacedim> > &a) const;
00285 
00310     virtual void
00311     add_quad_support_points(const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00312                             std::vector<Point<spacedim> > &a) const;
00313 
00314   private:
00315 
00316     virtual
00317     typename Mapping<dim,spacedim>::InternalDataBase *
00318     get_data (const UpdateFlags,
00319               const Quadrature<dim>& quadrature) const;
00320 
00321     virtual
00322     typename Mapping<dim,spacedim>::InternalDataBase *
00323     get_face_data (const UpdateFlags flags,
00324                    const Quadrature<dim-1>& quadrature) const;
00325 
00326     virtual
00327     typename Mapping<dim,spacedim>::InternalDataBase *
00328     get_subface_data (const UpdateFlags flags,
00329                       const Quadrature<dim-1>& quadrature) const;
00330 
00335     virtual void
00336     compute_shapes_virtual (const std::vector<Point<dim> > &unit_points,
00337                             typename MappingQ1<dim,spacedim>::InternalData &data) const;
00338 
00356     void
00357     set_laplace_on_quad_vector(Table<2,double> &loqvs) const;
00358 
00375     void set_laplace_on_hex_vector(Table<2,double> &lohvs) const;
00376 
00391     void compute_laplace_vector(Table<2,double> &lvs) const;
00392 
00411     void apply_laplace_vector(const Table<2,double>   &lvs,
00412                               std::vector<Point<spacedim> > &a) const;
00413 
00418     virtual void compute_mapping_support_points(
00419       const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00420       std::vector<Point<spacedim> > &a) const;
00421 
00436     void compute_support_points_laplace(
00437       const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00438       std::vector<Point<spacedim> > &a) const;
00439 
00460     Table<2,double> laplace_on_quad_vector;
00461 
00472     Table<2,double> laplace_on_hex_vector;
00473 
00477     DeclException1 (ExcLaplaceVectorNotSet,
00478                     int,
00479                     << "laplace_vector not set for degree=" << arg1 << ".");
00480 
00487     const unsigned int degree;
00488 
00493     const unsigned int n_inner;
00494 
00499     const unsigned int n_outer;
00500 
00509     const TensorProductPolynomials<dim> *tensor_pols;
00510 
00515     const unsigned int n_shape_functions;
00516 
00523     const std::vector<unsigned int> renumber;
00524 
00531     const bool use_mapping_q_on_all_cells;
00532 
00544     const FE_Q<dim> feq;
00545 };
00546 
00549 /* -------------- declaration of explicit specializations ------------- */
00550 
00551 #ifndef DOXYGEN
00552 
00553 template<> MappingQ<1>::MappingQ (const unsigned int,
00554                                   const bool);
00555 template<> MappingQ<1>::~MappingQ ();
00556 template<> void MappingQ<1>::compute_shapes_virtual (
00557   const std::vector<Point<1> > &unit_points,
00558   MappingQ1<1>::InternalData   &data) const;
00559 template <> void MappingQ<1>::set_laplace_on_quad_vector(
00560   Table<2,double> &) const;
00561 template <> void MappingQ<3>::set_laplace_on_hex_vector(
00562   Table<2,double> &lohvs) const;
00563 template <> void MappingQ<1>::compute_laplace_vector(
00564   Table<2,double> &) const;
00565 template <> void MappingQ<1>::add_line_support_points (
00566   const Triangulation<1>::cell_iterator &,
00567   std::vector<Point<1> > &) const;
00568 template<> void MappingQ<3>::add_quad_support_points(
00569   const Triangulation<3>::cell_iterator &cell,
00570   std::vector<Point<3> >                &a) const;
00571 
00572 #endif // DOXYGEN
00573 
00574 DEAL_II_NAMESPACE_CLOSE
00575 
00576 #endif
00577 
 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