00001
00002
00003
00004
00005
00006
00007
00008
00009
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
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
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
01086 #endif
01087
01088