include/deal.II/multigrid/mg_dof_handler.h

00001 //---------------------------------------------------------------------------
00002 //    @f$Id: mg_dof_handler.h 25345 2012-03-31 08:37:04Z bangerth @f$
00003 //
00004 //    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 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__mg_dof_handler_h
00013 #define __deal2__mg_dof_handler_h
00014 
00015 
00016 #include <deal.II/base/config.h>
00017 #include <deal.II/dofs/dof_handler.h>
00018 #include <deal.II/multigrid/mg_dof_iterator_selector.h>
00019 
00020 DEAL_II_NAMESPACE_OPEN
00021 
00022 
00023 namespace internal
00024 {
00025   namespace MGDoFHandler
00026   {
00027     struct Implementation;
00028   }
00029 }
00030 
00031 
00034 
00035 
00054 template <int dim, int spacedim=dim>
00055 class MGDoFHandler : public DoFHandler<dim,spacedim>
00056 {
00057     typedef internal::MGDoFHandler::Iterators<dim,spacedim> IteratorSelector;
00058   public:
00059     typedef typename IteratorSelector::CellAccessor cell_accessor;
00060     typedef typename IteratorSelector::FaceAccessor face_accessor;
00061 
00062     typedef typename IteratorSelector::raw_line_iterator raw_line_iterator;
00063     typedef typename IteratorSelector::line_iterator line_iterator;
00064     typedef typename IteratorSelector::active_line_iterator active_line_iterator;
00065 
00066     typedef typename IteratorSelector::raw_quad_iterator raw_quad_iterator;
00067     typedef typename IteratorSelector::quad_iterator quad_iterator;
00068     typedef typename IteratorSelector::active_quad_iterator active_quad_iterator;
00069 
00070     typedef typename IteratorSelector::raw_hex_iterator raw_hex_iterator;
00071     typedef typename IteratorSelector::hex_iterator hex_iterator;
00072     typedef typename IteratorSelector::active_hex_iterator active_hex_iterator;
00073 
00074     typedef typename IteratorSelector::raw_cell_iterator raw_cell_iterator;
00075     typedef typename IteratorSelector::cell_iterator cell_iterator;
00076     typedef typename IteratorSelector::active_cell_iterator active_cell_iterator;
00077 
00078     typedef typename IteratorSelector::raw_face_iterator raw_face_iterator;
00079     typedef typename IteratorSelector::face_iterator face_iterator;
00080     typedef typename IteratorSelector::active_face_iterator active_face_iterator;
00081 
00086     static const unsigned int dimension = dim;
00087 
00088     static const unsigned int space_dimension = spacedim;
00089 
00095     MGDoFHandler ();
00096 
00101     MGDoFHandler (const Triangulation<dim, spacedim> &tria);
00102 
00106     virtual ~MGDoFHandler ();
00107 
00122     virtual void distribute_dofs (const FiniteElement<dim,spacedim> &,
00123                                   const unsigned int offset = 0);
00124 
00130     virtual void clear ();
00131 
00145     void renumber_dofs (const unsigned int               level,
00146                         const std::vector<unsigned int> &new_numbers);
00147 
00155     void renumber_dofs (const std::vector<unsigned int> &new_numbers);
00156 
00157                                      /*--------------------------------------*/
00158 
00174     raw_cell_iterator    begin_raw   (const unsigned int level = 0) const;
00175 
00184     cell_iterator        begin       (const unsigned int level = 0) const;
00185 
00195     active_cell_iterator begin_active(const unsigned int level = 0) const;
00196 
00208     raw_cell_iterator    end () const;
00209 
00217     cell_iterator        end (const unsigned int level) const;
00218 
00226     raw_cell_iterator    end_raw (const unsigned int level) const;
00227 
00235     active_cell_iterator end_active (const unsigned int level) const;
00236 
00245     raw_cell_iterator    last_raw () const;
00246 
00256     raw_cell_iterator    last_raw (const unsigned int level) const;
00257 
00266     cell_iterator        last () const;
00267 
00277     cell_iterator        last (const unsigned int level) const;
00278 
00287     active_cell_iterator last_active () const;
00288 
00298     active_cell_iterator last_active (const unsigned int level) const;
00300 
00301                                      /*---------------------------------------*/
00302 
00315     raw_face_iterator    begin_raw_face   () const;
00316 
00325     face_iterator        begin_face       () const;
00326 
00336     active_face_iterator begin_active_face() const;
00337 
00349     raw_face_iterator    end_face () const;
00350 
00361     raw_face_iterator    end_raw_face () const;
00362 
00373     active_face_iterator end_active_face () const;
00374 
00383     raw_face_iterator    last_raw_face () const;
00384 
00393     face_iterator        last_face () const;
00394 
00403     active_face_iterator last_active_face () const;
00405 
00406 
00407                                      /*---------------------------------------*/
00408 
00420     raw_line_iterator begin_raw_line (const unsigned int level = 0) const;
00421 
00426     line_iterator     begin_line (const unsigned int level = 0) const;
00427 
00432     active_line_iterator begin_active_line(const unsigned int level = 0) const;
00433 
00441     raw_line_iterator end_line () const;
00442 
00450     line_iterator        end_line (const unsigned int level) const;
00451 
00459     raw_line_iterator    end_raw_line (const unsigned int level) const;
00460 
00468     active_line_iterator end_active_line (const unsigned int level) const;
00469 
00470 
00475     raw_line_iterator    last_raw_line () const;
00476 
00482     raw_line_iterator    last_raw_line (const unsigned int level) const;
00483 
00488     line_iterator        last_line () const;
00489 
00495     line_iterator        last_line (const unsigned int level) const;
00496 
00501     active_line_iterator last_active_line () const;
00502 
00508     active_line_iterator last_active_line (const unsigned int level) const;
00511                                      /*---------------------------------------*/
00512 
00515 
00524     raw_quad_iterator    begin_raw_quad   (const unsigned int level = 0) const;
00525 
00530     quad_iterator        begin_quad       (const unsigned int level = 0) const;
00531 
00536     active_quad_iterator begin_active_quad(const unsigned int level = 0) const;
00537 
00545     raw_quad_iterator    end_quad () const;
00546 
00554     quad_iterator        end_quad (const unsigned int level) const;
00555 
00563     raw_quad_iterator    end_raw_quad (const unsigned int level) const;
00564 
00572     active_quad_iterator end_active_quad (const unsigned int level) const;
00573 
00574 
00579     raw_quad_iterator    last_raw_quad () const;
00580 
00586     raw_quad_iterator    last_raw_quad (const unsigned int level) const;
00587 
00592     quad_iterator        last_quad () const;
00593 
00599     quad_iterator        last_quad (const unsigned int level) const;
00600 
00605     active_quad_iterator last_active_quad () const;
00606 
00612     active_quad_iterator last_active_quad (const unsigned int level) const;
00615                                      /*---------------------------------------*/
00616 
00619 
00628     raw_hex_iterator    begin_raw_hex   (const unsigned int level = 0) const;
00629 
00634     hex_iterator        begin_hex       (const unsigned int level = 0) const;
00635 
00640     active_hex_iterator begin_active_hex(const unsigned int level = 0) const;
00641 
00649     raw_hex_iterator    end_hex () const;
00650 
00658     hex_iterator        end_hex (const unsigned int level) const;
00659 
00667     raw_hex_iterator    end_raw_hex (const unsigned int level) const;
00668 
00676     active_hex_iterator end_active_hex (const unsigned int level) const;
00677 
00678 
00683     raw_hex_iterator    last_raw_hex () const;
00684 
00690     raw_hex_iterator    last_raw_hex (const unsigned int level) const;
00691 
00696     hex_iterator        last_hex () const;
00697 
00703     hex_iterator        last_hex (const unsigned int level) const;
00704 
00709     active_hex_iterator last_active_hex () const;
00710 
00716     active_hex_iterator last_active_hex (const unsigned int level) const;
00719                                      /*---------------------------------------*/
00720 
00721 
00730     unsigned int n_dofs (const unsigned int level) const;
00731 
00739     unsigned int n_dofs () const;
00740 
00753     virtual std::size_t memory_consumption () const;
00754 
00755 
00759     DeclException1 (ExcInvalidLevel,
00760                     int,
00761                     << "The given level " << arg1
00762                     << " is not in the valid range!");
00766     DeclException0 (ExcFacesHaveNoLevel);
00771     DeclException1 (ExcEmptyLevel,
00772                     int,
00773                     << "You tried to do something on level " << arg1
00774                     << ", but this level is empty.");
00775 
00776   private:
00777 
00803     class MGVertexDoFs
00804     {
00805       public:
00806 
00818         MGVertexDoFs ();
00819 
00832         void init (const unsigned int coarsest_level,
00833                    const unsigned int finest_level,
00834                    const unsigned int dofs_per_vertex);
00835 
00839         ~MGVertexDoFs ();
00840 
00847         MGVertexDoFs & operator = (const MGVertexDoFs &vertex);
00848 
00866         void set_index (const unsigned int level,
00867                         const unsigned int dof_number,
00868                         const unsigned int dofs_per_vertex,
00869                         const unsigned int index);
00870 
00888         unsigned int get_index (const unsigned int level,
00889                                 const unsigned int dof_number,
00890                                 const unsigned int dofs_per_vertex) const;
00891 
00897         unsigned int get_coarsest_level () const;
00898 
00904         unsigned int get_finest_level () const;
00905 
00909         DeclException0 (ExcNoMemory);
00913         DeclException1 (ExcInvalidLevel,
00914                         int,
00915                         << "The given level number " << arg1 << " is outside "
00916                         << "the range of levels this vertex lives on.");
00917 
00918       private:
00926         unsigned int coarsest_level;
00927 
00936         unsigned int finest_level;
00937 
00941         unsigned int *indices;
00942     };
00943 
00944 
00949     template <int structdim>
00950     unsigned int get_dof_index (const unsigned int       obj_level,
00951                                 const unsigned int       obj_index,
00952                                 const unsigned int       fe_index,
00953                                 const unsigned int       local_index) const;
00958     template <int structdim>
00959     void set_dof_index (const unsigned int       obj_level,
00960                         const unsigned int       obj_index,
00961                         const unsigned int       fe_index,
00962                         const unsigned int       local_index,
00963                         const unsigned int       global_index) const;
00964 
00965 
00971     void reserve_space ();
00972 
00976     void clear_space ();
00977 
00988     std::vector<internal::DoFHandler::DoFLevel<dim>*>    mg_levels;
00989 
00994     internal::DoFHandler::DoFFaces<dim> *                mg_faces;
00995 
01003     std::vector<MGVertexDoFs>      mg_vertex_dofs;
01004 
01010     std::vector<unsigned int>      mg_used_dofs;
01011 
01015     template <int dim1, int dim2, int dim3> friend class MGDoFAccessor;
01016     friend struct internal::MGDoFHandler::Implementation;
01017 };
01018 
01021 /* ----------------------- Inline functions of MGDoFHandler -------------------*/
01022 
01023 template <int dim, int spacedim>
01024 inline
01025 unsigned int MGDoFHandler<dim,spacedim>::n_dofs() const
01026 {
01027   return DoFHandler<dim,spacedim>::n_dofs();
01028 }
01029 
01030 
01031 template <int dim, int spacedim>
01032 inline
01033 void MGDoFHandler<dim,spacedim>::renumber_dofs (const std::vector<unsigned int> &new_numbers)
01034 {
01035   return DoFHandler<dim,spacedim>::renumber_dofs (new_numbers);
01036 }
01037 
01038 
01039 /* ----------------------- Inline functions of MGVertexDoFs -------------------*/
01040 
01041 template <int dim, int spacedim>
01042 inline
01043 void MGDoFHandler<dim,spacedim>::MGVertexDoFs::set_index  (const unsigned int level,
01044                                                   const unsigned int dof_number,
01045                                                   const unsigned int dofs_per_vertex,
01046                                                   const unsigned int index) {
01047   Assert ((level >= coarsest_level) && (level <= finest_level),
01048           ExcInvalidLevel(level));
01049   Assert (dof_number < dofs_per_vertex,
01050           ExcIndexRange(dof_number, 0, dofs_per_vertex));
01051 
01052   indices[(level-coarsest_level)*dofs_per_vertex + dof_number] = index;
01053 }
01054 
01055 
01056 template <int dim, int spacedim>
01057 inline
01058 unsigned int
01059 MGDoFHandler<dim,spacedim>::MGVertexDoFs::get_index  (const unsigned int level,
01060                                              const unsigned int dof_number,
01061                                              const unsigned int dofs_per_vertex) const {
01062   Assert ((level >= coarsest_level) && (level <= finest_level),
01063           ExcInvalidLevel(level));
01064   Assert (dof_number < dofs_per_vertex,
01065           ExcIndexRange (dof_number, 0, dofs_per_vertex));
01066 
01067   return indices[(level-coarsest_level)*dofs_per_vertex + dof_number];
01068 }
01069 
01070 
01071 
01072 template <>
01073 void MGDoFHandler<1>::renumber_dofs (const unsigned int  level,
01074                                      const std::vector<unsigned int>  &new_numbers);
01075 template <>
01076 void MGDoFHandler<2>::renumber_dofs (const unsigned int  level,
01077                                      const std::vector<unsigned int>  &new_numbers);
01078 template <>
01079 void MGDoFHandler<3>::renumber_dofs (const unsigned int  level,
01080                                      const std::vector<unsigned int>  &new_numbers);
01081 
01082 DEAL_II_NAMESPACE_CLOSE
01083 
01084 
01085 /*----------------------------   mg_dof.h     ---------------------------*/
01086 #endif
01087 /*----------------------------   mg_dof.h     ---------------------------*/
01088 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

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