mymapping_q1.h

Go to the documentation of this file.
00001 #ifndef _deal2__mymapping_q1_h
00002 #define _deal2__mymapping_q1_h
00003 
00004 
00005 #include <base/config.h>
00006 #include <base/table.h>
00007 #include <base/qprojector.h>
00008 #include <grid/tria_iterator.h>
00009 #include <dofs/dof_accessor.h>
00010 #include <fe/mapping.h>
00011 
00012 #include <cmath>
00013 #include <iostream>
00014 
00015 using namespace dealii;
00016 
00024 template <int dim>
00025 class MyMappingQ1 : public Mapping<dim>
00026 {
00027   public:
00031     MyMappingQ1 ();
00032 
00033     virtual Point<dim>
00034       transform_unit_to_real_cell (
00035           const typename Triangulation<dim>::cell_iterator &cell,
00036           const Point<dim>                                 &p) const;
00037 
00048     virtual Point<dim>
00049       transform_real_to_unit_cell (
00050           const typename Triangulation<dim>::cell_iterator &cell,
00051           const Point<dim>                                 &p) const;
00052           
00053 
00054     virtual void
00055       transform_covariant (const VectorSlice<const std::vector<Tensor<1,dim> > > input,
00056           const unsigned int                 offset,
00057           VectorSlice<std::vector<Tensor<1,dim> > > output,
00058           const typename Mapping<dim>::InternalDataBase &internal) const;
00059           
00060      
00061     virtual void
00062       transform_covariant (const VectorSlice<const std::vector<Tensor<2,dim> > > input,
00063           const unsigned int                 offset,
00064           VectorSlice<std::vector<Tensor<2,dim> > > output,
00065           const typename Mapping<dim>::InternalDataBase &internal) const;
00066           
00067     
00068     virtual void
00069       transform_contravariant (const VectorSlice<const std::vector<Tensor<1,dim> > > input,
00070           const unsigned int                 offset,
00071           VectorSlice<std::vector<Tensor<1,dim> > > output,
00072           const typename Mapping<dim>::InternalDataBase &internal) const;
00073           
00074 
00075     virtual void
00076       transform_contravariant (const VectorSlice<const std::vector<Tensor<2,dim> > > input,
00077           const unsigned int                 offset,
00078           VectorSlice<std::vector<Tensor<2,dim> > > output,
00079           const typename Mapping<dim>::InternalDataBase &internal) const;
00080           
00081     
00082     virtual UpdateFlags update_once (const UpdateFlags flags) const;
00083      
00084 
00085     virtual UpdateFlags update_each (const UpdateFlags flags) const;
00086 
00093     virtual
00094       Mapping<dim> * clone () const;
00095       
00100     class InternalData : public Mapping<dim>::InternalDataBase
00101   {
00102     public:
00107       InternalData(const unsigned int n_shape_functions);
00108 
00116       double shape (const unsigned int qpoint,
00117           const unsigned int shape_nr) const;
00118 
00123       double &shape (const unsigned int qpoint,
00124           const unsigned int shape_nr);
00125 
00133       double support_shape (const unsigned int point_no,
00134           const unsigned int shape_nr) const;
00135 
00140       double &support_shape (const unsigned int point_no,
00141           const unsigned int shape_nr);
00142 
00148       Tensor<1,dim> derivative (const unsigned int qpoint,
00149           const unsigned int shape_nr) const;
00150 
00156       Tensor<1,dim> &derivative (const unsigned int qpoint,
00157           const unsigned int shape_nr);
00158 
00164       Tensor<1,dim> support_derivative (const unsigned int point_no,
00165           const unsigned int shape_nr) const;
00166 
00172       Tensor<1,dim> &support_derivative (const unsigned int point_no,
00173           const unsigned int shape_nr);
00174 
00181       virtual unsigned int memory_consumption () const;
00182 
00190       std::vector<double> shape_values;
00191 
00199       std::vector<Tensor<1,dim> > shape_derivatives;
00200 
00214       std::vector<Tensor<2,dim> > covariant;
00215 
00227       std::vector<Tensor<2,dim> > contravariant;
00228 
00237       std::vector<double> support_values;
00238 
00248       std::vector<Tensor<1,dim> > support_derivatives;
00249 
00258       std::vector<std::vector<Tensor<1,dim> > > unit_tangentials;
00259 
00263       std::vector<std::vector<Tensor<1,dim> > > aux;
00264 
00270       std::vector<Point<dim> > mapping_support_points;
00271 
00277       std::vector<Point<dim> > mapping_generalized_support_points;
00278 
00284       typename Triangulation<dim>::cell_iterator cell_of_current_support_points;
00285 
00293       bool is_mapping_q1_data;
00294 
00308       unsigned int n_shape_functions;
00309   };
00310 
00311     DeclException0 (ExcAccessToUninitializedField);
00312 
00313   protected:
00314 
00322     typedef
00323       typename QProjector<dim>::DataSetDescriptor
00324       DataSetDescriptor;
00325 
00326   //virtual void
00327   //  fill_support_points (
00328   //      const typename Triangulation<dim>::cell_iterator &cell,
00329   //      typename Mapping<dim>::InternalDataBase          &mapping_data,
00330   //      const std::vector<Point<dim> >                   &generalized_support_points) const ;
00331 
00332 
00337   virtual void
00338     fill_fe_values (
00339         const typename Triangulation<dim>::cell_iterator &cell,
00340         const Quadrature<dim>                            &quadrature,
00341         typename Mapping<dim>::InternalDataBase          &mapping_data,
00342         typename std::vector<Point<dim> >                &quadrature_points,
00343         std::vector<double>                              &JxW_values,
00344         std::vector<Tensor<2,dim> >                      &jacobians, 
00345         std::vector<Tensor<3,dim> >                      &jacobian_grads,
00346         std::vector< Tensor< 2, dim > >                  &inverse_jacobians) const;
00347 
00352     virtual void
00353       fill_fe_face_values (const typename Triangulation<dim>::cell_iterator &cell,
00354           const unsigned int face_no,
00355           const Quadrature<dim-1>& quadrature,
00356           typename Mapping<dim>::InternalDataBase &mapping_data,
00357           typename std::vector<Point<dim> >        &quadrature_points,
00358           std::vector<double>             &JxW_values,
00359           typename std::vector<Tensor<1,dim> >        &boundary_form,
00360           typename std::vector<Point<dim> >        &normal_vectors,
00361           std::vector<double>             &cell_JxW_values) const ;
00362 
00367     virtual void
00368       fill_fe_subface_values (const typename Triangulation<dim>::cell_iterator &cell,
00369           const unsigned int face_no,
00370           const unsigned int sub_no,
00371           const Quadrature<dim-1>& quadrature,
00372           typename Mapping<dim>::InternalDataBase &mapping_data,
00373           typename std::vector<Point<dim> >        &quadrature_points,
00374           std::vector<double>             &JxW_values,
00375           typename std::vector<Tensor<1,dim> >        &boundary_form,
00376           typename std::vector<Point<dim> >        &normal_vectors,
00377           std::vector<double>             &cell_JxW_values) const ;
00378 
00391     void compute_shapes (
00392         const std::vector<Point<dim> > &quadrature_points,
00393         InternalData &data) const;
00394 
00403     void compute_data (
00404         const UpdateFlags               flags,
00405         const std::vector<Point<dim> > &quadrature_points,
00406         const unsigned int              n_orig_q_points,
00407         InternalData                   &data) const;
00408 
00409     //void compute_data (
00410     //    const UpdateFlags               flags,
00411     //    const std::vector<Point<dim> > &generalized_support_points,
00412     //    const std::vector<Point<dim> > &quadrature_points,
00413     //    const unsigned int              n_orig_q_points,
00414     //    InternalData                   &data) const;
00415 
00428     void compute_face_data (
00429         const UpdateFlags flags,
00430         const Quadrature<dim> &quadrature,
00431         const unsigned int n_orig_q_points,
00432         InternalData &data) const;
00433 
00438     void compute_fill (const typename Triangulation<dim>::cell_iterator &cell,
00439         const unsigned int      npts,
00440         const DataSetDescriptor data_set,
00441         InternalData           &data,
00442         std::vector<Point<dim> > &quadrature_points) const;
00443 
00448     void compute_fill_face (const typename Triangulation<dim>::cell_iterator &cell,
00449         const unsigned int      face_no,
00450         const bool              is_subface,
00451         const unsigned int      npts,
00452         const DataSetDescriptor data_set,
00453         const std::vector<double>   &weights,
00454         InternalData           &mapping_data,
00455         std::vector<Point<dim> >    &quadrature_points,
00456         std::vector<double>         &JxW_values,
00457         std::vector<Tensor<1,dim> > &boundary_form,
00458         std::vector<Point<dim> > &normal_vectors,
00459         std::vector<double>         &cell_JxW_values) const;
00460 
00465     virtual void compute_shapes_virtual (
00466         const std::vector<Point<dim> > &quadrature_points,
00467         InternalData &data) const;
00468 
00495     Point<dim> transform_unit_to_real_cell_internal (const InternalData &mdata) const;
00496 
00531     void transform_real_to_unit_cell_internal (const typename Triangulation<dim>::cell_iterator &cell,
00532         const Point<dim> &p,
00533         InternalData &mdata,
00534         Point<dim> &p_unit) const;
00535 
00536   private:
00537     virtual
00538       typename Mapping<dim>::InternalDataBase *
00539       get_data (
00540           const UpdateFlags,
00541           const Quadrature<dim>          & quadrature) const;
00542 
00543     //virtual
00544     //  typename Mapping<dim>::InternalDataBase *
00545     //  get_data (
00546     //      const UpdateFlags,
00547     //      const Quadrature<dim>          & quadrature,
00548     //      const std::vector<Point<dim> > & points) const;
00549 
00550     virtual
00551       typename Mapping<dim>::InternalDataBase *
00552       get_face_data (const UpdateFlags flags,
00553           const Quadrature<dim-1>& quadrature) const;
00554 
00555     virtual
00556       typename Mapping<dim>::InternalDataBase *
00557       get_subface_data (const UpdateFlags flags,
00558           const Quadrature<dim-1>& quadrature) const;
00559 
00576     virtual void compute_mapping_support_points(
00577         const typename Triangulation<dim>::cell_iterator &cell,
00578         std::vector<Point<dim> > &a) const;
00579 
00585     static const unsigned int n_shape_functions = GeometryInfo<dim>::vertices_per_cell;
00586 };
00587 
00588 
00589 //template <int dim>
00590 //struct StaticMappingQ1
00591 //{
00592 //  static MyMappingQ1<dim> mapping;
00593 //};
00594 
00595 
00596 
00597 /*----------------------------------------------------------------------*/
00598 
00599 template<int dim>
00600 inline
00601 double
00602 MyMappingQ1<dim>::InternalData::shape (const unsigned int qpoint,
00603     const unsigned int shape_nr) const
00604 {
00605   Assert(qpoint*n_shape_functions + shape_nr < shape_values.size(),
00606       ExcIndexRange(qpoint*n_shape_functions + shape_nr, 0,
00607         shape_values.size()));
00608   return shape_values [qpoint*n_shape_functions + shape_nr];
00609 }
00610 
00611 
00612 
00613 template <int dim>
00614 inline
00615   double &
00616 MyMappingQ1<dim>::InternalData::shape (const unsigned int qpoint,
00617     const unsigned int shape_nr)
00618 {
00619   Assert(qpoint*n_shape_functions + shape_nr < shape_values.size(),
00620       ExcIndexRange(qpoint*n_shape_functions + shape_nr, 0,
00621         shape_values.size()));
00622   return shape_values [qpoint*n_shape_functions + shape_nr];
00623 }
00624 
00625 template<int dim>
00626 inline
00627 double
00628 MyMappingQ1<dim>::InternalData::support_shape (const unsigned int point_no,
00629     const unsigned int shape_nr) const
00630 {
00631   Assert(point_no*n_shape_functions + shape_nr < support_values.size(),
00632       ExcIndexRange(point_no*n_shape_functions + shape_nr, 0,
00633         support_values.size()));
00634   return support_values [point_no*n_shape_functions + shape_nr];
00635 }
00636 
00637 
00638 
00639 template <int dim>
00640 inline
00641   double &
00642 MyMappingQ1<dim>::InternalData::support_shape (const unsigned int point_no,
00643     const unsigned int shape_nr)
00644 {
00645   Assert(point_no*n_shape_functions + shape_nr < support_values.size(),
00646       ExcIndexRange(point_no*n_shape_functions + shape_nr, 0,
00647         support_values.size()));
00648   return support_values [point_no*n_shape_functions + shape_nr];
00649 }
00650 
00651 template <int dim>
00652 inline
00653 Tensor<1,dim>
00654 MyMappingQ1<dim>::InternalData::derivative (const unsigned int qpoint,
00655     const unsigned int shape_nr) const
00656 {
00657   Assert(qpoint*n_shape_functions + shape_nr < shape_derivatives.size(),
00658       ExcIndexRange(qpoint*n_shape_functions + shape_nr, 0,
00659         shape_derivatives.size()));
00660   return shape_derivatives [qpoint*n_shape_functions + shape_nr];
00661 }
00662 
00663 template <int dim>
00664 inline
00665   Tensor<1,dim> &
00666 MyMappingQ1<dim>::InternalData::derivative (const unsigned int qpoint,
00667     const unsigned int shape_nr)
00668 {
00669   Assert(qpoint*n_shape_functions + shape_nr < shape_derivatives.size(),
00670       ExcIndexRange(qpoint*n_shape_functions + shape_nr, 0,
00671         shape_derivatives.size()));
00672   return shape_derivatives [qpoint*n_shape_functions + shape_nr];
00673 }
00674 
00675 template <int dim>
00676 inline
00677 Tensor<1,dim>
00678 MyMappingQ1<dim>::InternalData::support_derivative (const unsigned int point_no,
00679     const unsigned int shape_nr) const
00680 {
00681   Assert(point_no*n_shape_functions + shape_nr < support_derivatives.size(),
00682       ExcIndexRange(point_no*n_shape_functions + shape_nr, 0,
00683         support_derivatives.size()));
00684   return support_derivatives [point_no*n_shape_functions + shape_nr];
00685 }
00686 
00687 template <int dim>
00688 inline
00689   Tensor<1,dim> &
00690 MyMappingQ1<dim>::InternalData::support_derivative (const unsigned int point_no,
00691     const unsigned int shape_nr)
00692 {
00693   Assert(point_no*n_shape_functions + shape_nr < support_derivatives.size(),
00694       ExcIndexRange(point_no*n_shape_functions + shape_nr, 0,
00695         support_derivatives.size()));
00696   return support_derivatives [point_no*n_shape_functions + shape_nr];
00697 }
00698 
00699 
00700 /* -------------- declaration of explicit specializations ------------- */
00701 
00702 #ifndef DOXYGEN
00703 
00704 template<> void MyMappingQ1<1>::compute_shapes_virtual (
00705     const std::vector<Point<1> > &quadrature_points,
00706     InternalData& data) const;
00707 template<> void MyMappingQ1<2>::compute_shapes_virtual (
00708     const std::vector<Point<2> > &quadrature_points,
00709     InternalData &data) const;
00710 template<> void MyMappingQ1<3>::compute_shapes_virtual (
00711     const std::vector<Point<3> > &quadrature_points,
00712     InternalData &data) const;
00713 
00714 template <>
00715 void
00716 MyMappingQ1<1>::compute_face_data (const UpdateFlags,
00717     const Quadrature<1> &,
00718     const unsigned int,
00719     InternalData &) const;
00720 
00721 template <> void MyMappingQ1<1>::compute_fill_face (
00722     const Triangulation<1>::cell_iterator &,
00723     const unsigned int,
00724     const bool,
00725     const unsigned int,
00726     const DataSetDescriptor,
00727     const std::vector<double> &,
00728     InternalData &,
00729     std::vector<Point<1> > &,
00730     std::vector<double> &,
00731     std::vector<Tensor<1,1> > &,
00732     std::vector<Point<1> > &,
00733     std::vector<double> &) const;
00734 
00735 template <> void MyMappingQ1<1>::fill_fe_face_values (
00736     const Triangulation<1>::cell_iterator &,
00737     const unsigned,
00738     const Quadrature<0>&,
00739     Mapping<1>::InternalDataBase&,
00740     std::vector<Point<1> >&,
00741     std::vector<double>&,
00742     std::vector<Tensor<1,1> >&,
00743     std::vector<Point<1> >&,
00744     std::vector<double>&) const;
00745 
00746 template <> void MyMappingQ1<1>::fill_fe_subface_values (
00747     const Triangulation<1>::cell_iterator &,
00748     const unsigned,
00749     const unsigned,
00750     const Quadrature<0>&,
00751     Mapping<1>::InternalDataBase&,
00752     std::vector<Point<1> >&,
00753     std::vector<double>&,
00754     std::vector<Tensor<1,1> >&,
00755     std::vector<Point<1> >&,
00756     std::vector<double>&) const;
00757 
00758 #endif // DOXYGEN
00759 
00760 #endif // _deal2__mymapping_q1_h

Generated on Thu Oct 9 14:52:44 2008 for Additional Finite Elements for deal.II by  doxygen 1.5.3