include/deal.II/grid/tria.h

00001 //---------------------------------------------------------------------------
00002 //    @f$Id: tria.h 25531 2012-05-21 22:22:06Z maier @f$
00003 //
00004 //    Copyright (C) 1998, 1999, 2000, 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__tria_h
00013 #define __deal2__tria_h
00014 
00015 
00016 #include <deal.II/base/config.h>
00017 #include <deal.II/base/point.h>
00018 #include <deal.II/base/subscriptor.h>
00019 #include <deal.II/base/smartpointer.h>
00020 #include <deal.II/base/geometry_info.h>
00021 #include <deal.II/base/std_cxx1x/function.h>
00022 #include <deal.II/grid/tria_iterator_selector.h>
00023 #include <deal.II/grid/tria_faces.h>
00024 #include <deal.II/grid/tria_levels.h>
00025 
00026 #include <boost/signals2.hpp>
00027 #include <boost/serialization/vector.hpp>
00028 #include <boost/serialization/map.hpp>
00029 #include <boost/serialization/split_member.hpp>
00030 
00031 #include <vector>
00032 #include <list>
00033 #include <map>
00034 
00035 
00036 DEAL_II_NAMESPACE_OPEN
00037 
00038 template <int dim, int spacedim> class Boundary;
00039 template <int dim, int spacedim> class StraightBoundary;
00040 
00041 template <int, int, int> class TriaAccessor;
00042 template <int spacedim> class TriaAccessor<0,1,spacedim>;
00043 
00044 namespace internal
00045 {
00046   namespace Triangulation
00047   {
00048     template <int dim> class TriaLevel;
00049     template <int dim> class TriaFaces;
00050 
00058     struct Implementation;
00059   }
00060 
00061   namespace TriaAccessor
00062   {
00063     struct Implementation;
00064   }
00065 }
00066 
00067 template <int dim, int spacedim> class DoFHandler;
00068 namespace hp
00069 {
00070   template <int dim, int spacedim> class DoFHandler;
00071 }
00072 template <int dim, int spacedim> class MGDoFHandler;
00073 
00074 
00075 /*------------------------------------------------------------------------*/
00076 
00090 template <int structdim>
00091 struct CellData
00092 {
00097     unsigned int vertices[GeometryInfo<structdim>::vertices_per_cell];
00098 
00111     union
00112     {
00113         types::boundary_id_t boundary_id;
00114         types::material_id_t material_id;
00115     };
00116 };
00117 
00118 
00119 
00145 struct SubCellData
00146 {
00152     std::vector<CellData<1> > boundary_lines;
00153 
00159     std::vector<CellData<2> > boundary_quads;
00160 
00174     bool check_consistency (const unsigned int dim) const;
00175 };
00176 
00177 
00178 /*------------------------------------------------------------------------*/
00179 
00180 
00181 namespace internal
00182 {
00187   namespace Triangulation
00188   {
00189 
00204     template <int dim>
00205     struct NumberCache
00206     {
00207     };
00208 
00222     template <>
00223     struct NumberCache<1>
00224     {
00230         unsigned int n_levels;
00231 
00236         unsigned int n_lines;
00237 
00242         std::vector<unsigned int> n_lines_level;
00243 
00248         unsigned int n_active_lines;
00249 
00254         std::vector<unsigned int> n_active_lines_level;
00255 
00260         NumberCache ();
00261 
00267         std::size_t memory_consumption () const;
00268 
00273         template <class Archive>
00274         void serialize (Archive & ar,
00275                         const unsigned int version);
00276     };
00277 
00278 
00294     template <>
00295     struct NumberCache<2> : public NumberCache<1>
00296     {
00301         unsigned int n_quads;
00302 
00307         std::vector<unsigned int> n_quads_level;
00308 
00313         unsigned int n_active_quads;
00314 
00319         std::vector<unsigned int> n_active_quads_level;
00320 
00325         NumberCache ();
00326 
00332         std::size_t memory_consumption () const;
00333 
00338         template <class Archive>
00339         void serialize (Archive & ar,
00340                         const unsigned int version);
00341     };
00342 
00343 
00359     template <>
00360     struct NumberCache<3> : public NumberCache<2>
00361     {
00366         unsigned int n_hexes;
00367 
00372         std::vector<unsigned int> n_hexes_level;
00373 
00378         unsigned int n_active_hexes;
00379 
00384         std::vector<unsigned int> n_active_hexes_level;
00385 
00390         NumberCache ();
00391 
00397         std::size_t memory_consumption () const;
00398 
00403         template <class Archive>
00404         void serialize (Archive & ar,
00405                         const unsigned int version);
00406     };
00407   }
00408 }
00409 
00410 
00411 /*------------------------------------------------------------------------*/
00412 
00413 
01431 template <int dim, int spacedim=dim>
01432 class Triangulation : public Subscriptor
01433 {
01434   private:
01435 
01441     typedef internal::Triangulation::Iterators<dim, spacedim> IteratorSelector;
01442 
01443   public:
01450     static const StraightBoundary<dim,spacedim> straight_boundary;
01451 
01459     enum MeshSmoothing
01460     {
01461           none                               = 0x0,
01462           limit_level_difference_at_vertices = 0x1,
01463           eliminate_unrefined_islands        = 0x2,
01464           patch_level_1                      = 0x4,
01465           coarsest_level_1                   = 0x8,
01466 
01467           allow_anisotropic_smoothing        = 0x10,
01468 
01469           eliminate_refined_inner_islands    = 0x100,
01470           eliminate_refined_boundary_islands = 0x200,
01471           do_not_produce_unrefined_islands   = 0x400,
01472 
01473           smoothing_on_refinement            = (limit_level_difference_at_vertices |
01474                                                 eliminate_unrefined_islands),
01475           smoothing_on_coarsening            = (eliminate_refined_inner_islands |
01476                                                 eliminate_refined_boundary_islands |
01477                                                 do_not_produce_unrefined_islands),
01478 
01479           maximum_smoothing                  = 0xffff ^ allow_anisotropic_smoothing
01480     };
01481 
01482 
01483     typedef typename IteratorSelector::CellAccessor         cell_accessor;
01484     typedef typename IteratorSelector::FaceAccessor         face_accessor;
01485 
01486     typedef typename IteratorSelector::raw_line_iterator    raw_line_iterator;
01487     typedef typename IteratorSelector::line_iterator        line_iterator;
01488     typedef typename IteratorSelector::active_line_iterator active_line_iterator;
01489 
01490     typedef typename IteratorSelector::raw_quad_iterator    raw_quad_iterator;
01491     typedef typename IteratorSelector::quad_iterator        quad_iterator;
01492     typedef typename IteratorSelector::active_quad_iterator active_quad_iterator;
01493 
01494     typedef typename IteratorSelector::raw_hex_iterator    raw_hex_iterator;
01495     typedef typename IteratorSelector::hex_iterator        hex_iterator;
01496     typedef typename IteratorSelector::active_hex_iterator active_hex_iterator;
01497 
01498     typedef typename IteratorSelector::raw_cell_iterator    raw_cell_iterator;
01499     typedef typename IteratorSelector::cell_iterator        cell_iterator;
01500     typedef typename IteratorSelector::active_cell_iterator active_cell_iterator;
01501 
01502     typedef typename IteratorSelector::raw_face_iterator    raw_face_iterator;
01503     typedef typename IteratorSelector::face_iterator        face_iterator;
01504     typedef typename IteratorSelector::active_face_iterator active_face_iterator;
01505 
01521     class RefinementListener
01522     {
01523       public:
01536         virtual ~RefinementListener ();
01537 
01552         virtual
01553         void
01554         pre_refinement_notification (const Triangulation<dim, spacedim> &tria);
01555 
01570         virtual
01571         void
01572         post_refinement_notification (const Triangulation<dim, spacedim> &tria);
01573 
01595         virtual
01596         void
01597         copy_notification (const Triangulation<dim, spacedim> &old_tria,
01598                            const Triangulation<dim, spacedim> &new_tria);
01599 
01618         virtual
01619         void
01620         create_notification (const Triangulation<dim, spacedim> &tria);
01621     };
01622 
01657     struct DistortedCellList : public ::ExceptionBase
01658     {
01670         virtual ~DistortedCellList () throw();
01671 
01679         std::list<typename Triangulation<dim,spacedim>::cell_iterator>
01680         distorted_cells;
01681     };
01682 
01683 
01688     static const unsigned int dimension = dim;
01689 
01694     static const unsigned int space_dimension = spacedim;
01695 
01722     Triangulation (const MeshSmoothing smooth_grid = none,
01723                    const bool check_for_distorted_cells = false);
01724 
01757     Triangulation (const Triangulation<dim, spacedim> &t);
01758 
01763     virtual ~Triangulation ();
01764 
01774     virtual void clear ();
01775 
01784     virtual void set_mesh_smoothing (const MeshSmoothing mesh_smoothing);
01785 
01839     void set_boundary (const types::boundary_id_t   number,
01840                        const Boundary<dim,spacedim> &boundary_object);
01841 
01851     void set_boundary (const types::boundary_id_t number);
01852 
01860     const Boundary<dim,spacedim> & get_boundary (const types::boundary_id_t number) const;
01861 
01875     std::vector<types::boundary_id_t> get_boundary_indicators() const;
01876 
01926     virtual void copy_triangulation (const Triangulation<dim, spacedim> &old_tria);
01927 
02013     virtual void create_triangulation (const std::vector<Point<spacedim> >    &vertices,
02014                                        const std::vector<CellData<dim> > &cells,
02015                                        const SubCellData                 &subcelldata);
02016 
02033     virtual void create_triangulation_compatibility (
02034       const std::vector<Point<spacedim> >    &vertices,
02035       const std::vector<CellData<dim> > &cells,
02036       const SubCellData                 &subcelldata);
02037 
02048     void flip_all_direction_flags();
02049 
02068     void distort_random (const double factor,
02069                          const bool   keep_boundary=true);
02070 
02071 
02088     void set_all_refine_flags ();
02089 
02113     void refine_global (const unsigned int times);
02114 
02172     virtual void execute_coarsening_and_refinement ();
02173 
02226     bool prepare_coarsening_and_refinement ();
02249     void add_refinement_listener (RefinementListener &listener) const;
02250 
02267     void remove_refinement_listener (RefinementListener &listener) const;
02268 
02277     struct Signals
02278     {
02279       boost::signals2::signal<void ()> create;
02280       boost::signals2::signal<void ()> pre_refinement;
02281       boost::signals2::signal<void ()> post_refinement;
02282       boost::signals2::signal<void (const Triangulation<dim, spacedim> &original_tria)> copy;
02283       boost::signals2::signal<void ()> clear;
02284       boost::signals2::signal<void ()> any_change;
02285     };
02286 
02290     mutable Signals signals;
02291 
02305     void save_refine_flags (std::ostream &out) const;
02306 
02311     void save_refine_flags (std::vector<bool> &v) const;
02312 
02317     void load_refine_flags (std::istream &in);
02318 
02323     void load_refine_flags (const std::vector<bool> &v);
02324 
02328     void save_coarsen_flags (std::ostream &out) const;
02329 
02334     void save_coarsen_flags (std::vector<bool> &v) const;
02335 
02339     void load_coarsen_flags (std::istream &out);
02340 
02344     void load_coarsen_flags (const std::vector<bool> &v);
02345 
02351     bool get_anisotropic_refinement_flag() const;
02362     void clear_user_flags ();
02363 
02371     void save_user_flags (std::ostream &out) const;
02372 
02379     void save_user_flags (std::vector<bool> &v) const;
02380 
02385     void load_user_flags (std::istream &in);
02386 
02391     void load_user_flags (const std::vector<bool> &v);
02392 
02396     void clear_user_flags_line ();
02397 
02401     void save_user_flags_line (std::ostream &out) const;
02402 
02409     void save_user_flags_line (std::vector<bool> &v) const;
02410 
02414     void load_user_flags_line (std::istream &in);
02415 
02419     void load_user_flags_line (const std::vector<bool> &v);
02420 
02424     void clear_user_flags_quad ();
02425 
02429     void save_user_flags_quad (std::ostream &out) const;
02430 
02437     void save_user_flags_quad (std::vector<bool> &v) const;
02438 
02442     void load_user_flags_quad (std::istream &in);
02443 
02447     void load_user_flags_quad (const std::vector<bool> &v);
02448 
02449 
02453     void clear_user_flags_hex ();
02454 
02458     void save_user_flags_hex (std::ostream &out) const;
02459 
02466     void save_user_flags_hex (std::vector<bool> &v) const;
02467 
02471     void load_user_flags_hex (std::istream &in);
02472 
02476     void load_user_flags_hex (const std::vector<bool> &v);
02477 
02483     void clear_user_data ();
02484 
02491     void clear_user_pointers ();
02492 
02498     void save_user_indices (std::vector<unsigned int> &v) const;
02499 
02504     void load_user_indices (const std::vector<unsigned int> &v);
02505 
02511     void save_user_pointers (std::vector<void *> &v) const;
02512 
02517     void load_user_pointers (const std::vector<void *> &v);
02518 
02524     void save_user_indices_line (std::vector<unsigned int> &v) const;
02525 
02530     void load_user_indices_line (const std::vector<unsigned int> &v);
02531 
02537     void save_user_indices_quad (std::vector<unsigned int> &v) const;
02538 
02543     void load_user_indices_quad (const std::vector<unsigned int> &v);
02544 
02550     void save_user_indices_hex (std::vector<unsigned int> &v) const;
02551 
02556     void load_user_indices_hex (const std::vector<unsigned int> &v);
02562     void save_user_pointers_line (std::vector<void *> &v) const;
02563 
02568     void load_user_pointers_line (const std::vector<void *> &v);
02569 
02575     void save_user_pointers_quad (std::vector<void *> &v) const;
02576 
02581     void load_user_pointers_quad (const std::vector<void *> &v);
02582 
02588     void save_user_pointers_hex (std::vector<void *> &v) const;
02589 
02594     void load_user_pointers_hex (const std::vector<void *> &v);
02611     raw_cell_iterator    begin_raw   (const unsigned int level = 0) const;
02612 
02620     cell_iterator        begin       (const unsigned int level = 0) const;
02621 
02630     active_cell_iterator begin_active(const unsigned int level = 0) const;
02631 
02641     raw_cell_iterator    end () const;
02642 
02649     cell_iterator        end (const unsigned int level) const;
02650 
02657     raw_cell_iterator    end_raw (const unsigned int level) const;
02658 
02665     active_cell_iterator end_active (const unsigned int level) const;
02666 
02667 
02675     raw_cell_iterator    last_raw () const;
02676 
02685     raw_cell_iterator    last_raw (const unsigned int level) const;
02686 
02694     cell_iterator        last () const;
02695 
02703     cell_iterator        last (const unsigned int level) const;
02704 
02713     active_cell_iterator last_active () const;
02714 
02722     active_cell_iterator last_active (const unsigned int level) const;
02725                                      /*---------------------------------------*/
02726                                      /*---------------------------------------*/
02727 
02740     raw_face_iterator    begin_raw_face   () const;
02741 
02748     face_iterator        begin_face       () const;
02749 
02758     active_face_iterator begin_active_face() const;
02759 
02769     raw_face_iterator    end_face () const;
02770 
02777     raw_face_iterator    end_raw_face () const;
02778 
02785     active_face_iterator end_active_face () const;
02786 
02794     raw_face_iterator    last_raw_face () const;
02795 
02803     face_iterator        last_face () const;
02804 
02813     active_face_iterator last_active_face () const;
02814 
02818                                      /*---------------------------------------*/
02819 
02834     raw_line_iterator
02835     begin_raw_line   (const unsigned int level = 0) const;
02836 
02841     line_iterator
02842     begin_line       (const unsigned int level = 0) const;
02843 
02848     active_line_iterator
02849     begin_active_line(const unsigned int level = 0) const;
02850 
02857     raw_line_iterator
02858     end_line () const;
02859 
02866     line_iterator        end_line (const unsigned int level) const;
02867 
02874     raw_line_iterator    end_raw_line (const unsigned int level) const;
02875 
02882     active_line_iterator end_active_line (const unsigned int level) const;
02883 
02888     raw_line_iterator
02889     last_raw_line () const;
02890 
02896     raw_line_iterator
02897     last_raw_line (const unsigned int level) const;
02898 
02903     line_iterator
02904     last_line () const;
02905 
02910     line_iterator
02911     last_line (const unsigned int level) const;
02912 
02917     active_line_iterator
02918     last_active_line () const;
02919 
02924     active_line_iterator
02925     last_active_line (const unsigned int level) const;
02928                                      /*---------------------------------------*/
02929 
02933 
02944     raw_quad_iterator
02945     begin_raw_quad   (const unsigned int level = 0) const;
02946 
02951     quad_iterator
02952     begin_quad       (const unsigned int level = 0) const;
02953 
02958     active_quad_iterator
02959     begin_active_quad(const unsigned int level = 0) const;
02960 
02967     raw_quad_iterator    end_quad () const;
02968 
02975     quad_iterator        end_quad (const unsigned int level) const;
02976 
02983     raw_quad_iterator    end_raw_quad (const unsigned int level) const;
02984 
02991     active_quad_iterator end_active_quad (const unsigned int level) const;
02992 
02997     raw_quad_iterator
02998     last_raw_quad () const;
02999 
03006     raw_quad_iterator
03007     last_raw_quad (const unsigned int level) const;
03008 
03013     quad_iterator
03014     last_quad () const;
03015 
03020     quad_iterator
03021     last_quad (const unsigned int level) const;
03022 
03027     active_quad_iterator
03028     last_active_quad () const;
03029 
03034     active_quad_iterator
03035     last_active_quad (const unsigned int level) const;
03038                                      /*---------------------------------------*/
03039 
03043 
03051     raw_hex_iterator
03052     begin_raw_hex   (const unsigned int level = 0) const;
03053 
03058     hex_iterator
03059     begin_hex       (const unsigned int level = 0) const;
03060 
03065     active_hex_iterator
03066     begin_active_hex(const unsigned int level = 0) const;
03067 
03074     raw_hex_iterator    end_hex () const;
03075 
03082     hex_iterator        end_hex (const unsigned int level) const;
03083 
03090     raw_hex_iterator    end_raw_hex (const unsigned int level) const;
03091 
03098     active_hex_iterator end_active_hex (const unsigned int level) const;
03099 
03104     raw_hex_iterator    last_raw_hex () const;
03105 
03112     raw_hex_iterator
03113     last_raw_hex (const unsigned int level) const;
03114 
03119     hex_iterator
03120     last_hex () const;
03121 
03126     hex_iterator
03127     last_hex (const unsigned int level) const;
03128 
03133     active_hex_iterator
03134     last_active_hex () const;
03135 
03140     active_hex_iterator
03141     last_active_hex (const unsigned int level) const;
03144                                      /*---------------------------------------*/
03145 
03150 
03172     unsigned int n_raw_lines () const;
03173 
03178     unsigned int n_raw_lines (const unsigned int level) const;
03179 
03184     unsigned int n_lines () const;
03185 
03190     unsigned int n_lines (const unsigned int level) const;
03191 
03195     unsigned int n_active_lines () const;
03196 
03201     unsigned int n_active_lines (const unsigned int level) const;
03202 
03207     unsigned int n_raw_quads () const;
03208 
03213     unsigned int n_raw_quads (const unsigned int level) const;
03214 
03219     unsigned int n_quads () const;
03220 
03225     unsigned int n_quads (const unsigned int level) const;
03226 
03231     unsigned int n_active_quads () const;
03232 
03237     unsigned int n_active_quads (const unsigned int level) const;
03238 
03243     unsigned int n_raw_hexs () const;
03244 
03249     unsigned int n_raw_hexs (const unsigned int level) const;
03250 
03255     unsigned int n_hexs() const;
03256 
03262     unsigned int n_hexs(const unsigned int level) const;
03263 
03268     unsigned int n_active_hexs() const;
03269 
03275     unsigned int n_active_hexs(const unsigned int level) const;
03276 
03281     unsigned int n_raw_cells (const unsigned int level) const;
03282 
03289     unsigned int n_cells () const;
03290 
03297     unsigned int n_cells (const unsigned int level) const;
03298 
03304     unsigned int n_active_cells () const;
03305 
03312     unsigned int n_active_cells (const unsigned int level) const;
03313 
03320     unsigned int n_raw_faces () const;
03321 
03330     unsigned int n_faces () const;
03331 
03340     unsigned int n_active_faces () const;
03341 
03352     unsigned int n_levels () const;
03353 
03368     unsigned int n_vertices () const;
03369 
03387     const std::vector<Point<spacedim> > &
03388     get_vertices () const;
03389 
03396     unsigned int n_used_vertices () const;
03397 
03402     bool vertex_used (const unsigned int index) const;
03403 
03411     const std::vector<bool> &
03412     get_used_vertices () const;
03413 
03437     unsigned int max_adjacent_cells () const;
03438 
03450     virtual types::subdomain_id_t locally_owned_subdomain () const;
03465     virtual std::size_t memory_consumption () const;
03466 
03479     template <class Archive>
03480     void save (Archive & ar, const unsigned int version) const;
03481 
03506     template <class Archive>
03507     void load (Archive & ar, const unsigned int version);
03508 
03509     BOOST_SERIALIZATION_SPLIT_MEMBER()
03510 
03511                                      
03519     DeclException1 (ExcInvalidLevel,
03520                     int,
03521                     << "The given level " << arg1
03522                     << " is not in the valid range!");
03532     DeclException0 (ExcTriangulationNotEmpty);
03538     DeclException0 (ExcGridReadError);
03543     DeclException0 (ExcFacesHaveNoLevel);
03550     DeclException1 (ExcEmptyLevel,
03551                     int,
03552                     << "You tried to do something on level " << arg1
03553                     << ", but this level is empty.");
03558     DeclException0 (ExcNonOrientableTriangulation);
03560   protected:
03567     MeshSmoothing                    smooth_grid;
03568 
03595     static void write_bool_vector (const unsigned int       magic_number1,
03596                                    const std::vector<bool> &v,
03597                                    const unsigned int       magic_number2,
03598                                    std::ostream            &out);
03599 
03605     static void read_bool_vector (const unsigned int       magic_number1,
03606                                   std::vector<bool>       &v,
03607                                   const unsigned int       magic_number2,
03608                                   std::istream            &in);
03609 
03610   private:
03634     void clear_despite_subscriptions ();
03635 
03656     DistortedCellList execute_refinement ();
03657 
03666     void execute_coarsening ();
03667 
03673     void fix_coarsen_flags ();
03674 
03680     std::vector<internal::Triangulation::TriaLevel<dim>*> levels;
03681 
03689     internal::Triangulation::TriaFaces<dim> * faces;
03690 
03691 
03696     std::vector<Point<spacedim> >              vertices;
03697 
03702     std::vector<bool>                     vertices_used;
03703 
03710     std::map<types::boundary_id_t, SmartPointer<const Boundary<dim, spacedim> , Triangulation<dim, spacedim> > >  boundary;
03711 
03717     bool                             anisotropic_refinement;
03718 
03719 
03726     const bool check_for_distorted_cells;
03727 
03744     internal::Triangulation::NumberCache<dim> number_cache;
03745 
03769     std::map<unsigned int, types::boundary_id_t> *vertex_to_boundary_id_map_1d;
03770 
03782     mutable
03783     std::multimap<const RefinementListener*, std::vector<boost::signals2::connection> >
03784     refinement_listener_map;
03785 
03786                                      // make a couple of classes
03787                                      // friends
03788     template <int,int,int> friend class TriaAccessorBase;
03789     template <int,int,int> friend class TriaAccessor;
03790     friend class TriaAccessor<0, 1, spacedim>;
03791 
03792     friend class CellAccessor<dim, spacedim>;
03793 
03794     friend struct internal::TriaAccessor::Implementation;
03795 
03796     friend class hp::DoFHandler<dim,spacedim>;
03797 
03798     friend struct internal::Triangulation::Implementation;
03799 };
03800 
03801 
03802 #ifndef DOXYGEN
03803 
03804 namespace internal
03805 {
03806   namespace Triangulation
03807   {
03808     template <class Archive>
03809     void NumberCache<1>::serialize (Archive & ar,
03810                                     const unsigned int)
03811     {
03812       ar & n_levels;
03813       ar & n_lines & n_lines_level;
03814       ar & n_active_lines & n_active_lines_level;
03815     }
03816 
03817 
03818     template <class Archive>
03819     void NumberCache<2>::serialize (Archive & ar,
03820                                     const unsigned int version)
03821     {
03822       this->NumberCache<1>::serialize (ar, version);
03823 
03824       ar & n_quads & n_quads_level;
03825       ar & n_active_quads & n_active_quads_level;
03826     }
03827 
03828 
03829     template <class Archive>
03830     void NumberCache<3>::serialize (Archive & ar,
03831                                     const unsigned int version)
03832     {
03833       this->NumberCache<2>::serialize (ar, version);
03834 
03835       ar & n_hexes & n_hexes_level;
03836       ar & n_active_hexes & n_active_hexes_level;
03837     }
03838 
03839   }
03840 }
03841 
03842 
03843 template <int dim, int spacedim>
03844 inline
03845 bool
03846 Triangulation<dim,spacedim>::vertex_used(const unsigned int index) const
03847 {
03848   Assert (index < vertices_used.size(),
03849           ExcIndexRange(index, 0, vertices_used.size()));
03850   return vertices_used[index];
03851 }
03852 
03853 
03854 
03855 template <int dim, int spacedim>
03856 inline
03857 unsigned int Triangulation<dim, spacedim>::n_levels () const
03858 {
03859   return number_cache.n_levels;
03860 }
03861 
03862 
03863 
03864 template <int dim, int spacedim>
03865 inline
03866 unsigned int
03867 Triangulation<dim, spacedim>::n_vertices () const
03868 {
03869   return vertices.size();
03870 }
03871 
03872 
03873 
03874 template <int dim, int spacedim>
03875 inline
03876 const std::vector<Point<spacedim> > &
03877 Triangulation<dim, spacedim>::get_vertices () const
03878 {
03879   return vertices;
03880 }
03881 
03882 
03883 template <int dim, int spacedim>
03884 template <class Archive>
03885 void
03886 Triangulation<dim,spacedim>::save (Archive & ar,
03887                                    const unsigned int) const
03888 {
03889                                    // as discussed in the documentation, do
03890                                    // not store the signals as well as
03891                                    // boundary and manifold descrption
03892                                    // but everything else
03893   ar & smooth_grid;
03894   ar & levels;
03895   ar & faces;
03896   ar & vertices;
03897   ar & vertices_used;
03898 
03899   ar & anisotropic_refinement;
03900   ar & number_cache;
03901 
03902   ar & check_for_distorted_cells;
03903 
03904   if (dim == 1)
03905     ar & vertex_to_boundary_id_map_1d;
03906 }
03907 
03908 
03909 
03910 template <int dim, int spacedim>
03911 template <class Archive>
03912 void
03913 Triangulation<dim,spacedim>::load (Archive & ar,
03914                                    const unsigned int)
03915 {
03916                                    // clear previous content. this also calls
03917                                    // the respective signal
03918   clear ();
03919 
03920                                    // as discussed in the documentation, do
03921                                    // not store the signals as well as
03922                                    // boundary and manifold descrption
03923                                    // but everything else
03924   ar & smooth_grid;
03925   ar & levels;
03926   ar & faces;
03927   ar & vertices;
03928   ar & vertices_used;
03929 
03930   ar & anisotropic_refinement;
03931   ar & number_cache;
03932 
03933   bool my_check_for_distorted_cells;
03934   ar & my_check_for_distorted_cells;
03935 
03936   Assert (my_check_for_distorted_cells == check_for_distorted_cells,
03937           ExcMessage ("The triangulation loaded into here must have the "
03938                       "same setting with regard to reporting distorted "
03939                       "cell as the one previously stored."));
03940 
03941   if (dim == 1)
03942     ar & vertex_to_boundary_id_map_1d;
03943 
03944                                    // trigger the create signal to indicate
03945                                    // that new content has been imported into
03946                                    // the triangulation
03947   signals.create();
03948 }
03949 
03950 
03951 /* -------------- declaration of explicit specializations ------------- */
03952 
03953 template <> unsigned int Triangulation<1,1>::n_raw_lines (const unsigned int level) const;
03954 template <> unsigned int Triangulation<1,1>::n_quads () const;
03955 template <> unsigned int Triangulation<1,1>::n_quads (const unsigned int level) const;
03956 template <> unsigned int Triangulation<1,1>::n_raw_quads (const unsigned int level) const;
03957 template <> unsigned int Triangulation<2,2>::n_raw_quads (const unsigned int level) const;
03958 template <> unsigned int Triangulation<1,1>::n_raw_hexs (const unsigned int level) const;
03959 template <> unsigned int Triangulation<1,1>::n_active_quads (const unsigned int level) const;
03960 template <> unsigned int Triangulation<1,1>::n_active_quads () const;
03961 template <> unsigned int Triangulation<1,1>::max_adjacent_cells () const;
03962 
03963 
03964 // -------------------------------------------------------------------
03965 // -- Explicit specializations for codimension one grids
03966 
03967 
03968 template <> unsigned int Triangulation<1,2>::n_raw_lines (const unsigned int level) const;
03969 template <> unsigned int Triangulation<1,2>::n_quads () const;
03970 template <> unsigned int Triangulation<1,2>::n_quads (const unsigned int level) const;
03971 template <> unsigned int Triangulation<1,2>::n_raw_quads (const unsigned int level) const;
03972 template <> unsigned int Triangulation<2,3>::n_raw_quads (const unsigned int level) const;
03973 template <> unsigned int Triangulation<1,2>::n_raw_hexs (const unsigned int level) const;
03974 template <> unsigned int Triangulation<1,2>::n_active_quads (const unsigned int level) const;
03975 template <> unsigned int Triangulation<1,2>::n_active_quads () const;
03976 template <> unsigned int Triangulation<1,2>::max_adjacent_cells () const;
03977 
03978 // -------------------------------------------------------------------
03979 // -- Explicit specializations for codimension two grids
03980 
03981 
03982 template <> unsigned int Triangulation<1,3>::n_raw_lines (const unsigned int level) const;
03983 template <> unsigned int Triangulation<1,3>::n_quads () const;
03984 template <> unsigned int Triangulation<1,3>::n_quads (const unsigned int level) const;
03985 template <> unsigned int Triangulation<1,3>::n_raw_quads (const unsigned int level) const;
03986 template <> unsigned int Triangulation<2,3>::n_raw_quads (const unsigned int level) const;
03987 template <> unsigned int Triangulation<1,3>::n_raw_hexs (const unsigned int level) const;
03988 template <> unsigned int Triangulation<1,3>::n_active_quads (const unsigned int level) const;
03989 template <> unsigned int Triangulation<1,3>::n_active_quads () const;
03990 template <> unsigned int Triangulation<1,3>::max_adjacent_cells () const;
03991 
03992 
03993 // -------------------------------------------------------------------
03994 
03995 
03996 
03997 
03998 #endif // DOXYGEN
03999 
04000 DEAL_II_NAMESPACE_CLOSE
04001 
04002 // Include tria_accessor.h here, so that it is possible for an end user to
04003 // use the iterators of Triangulation<dim> directly without the need to
04004 // include tria_accessor.h separately. (Otherwise the iterators are an
04005 // 'opaque' or 'incomplete' type.)
04006 #include <deal.II/grid/tria_accessor.h>
04007 
04008 #endif
04009 
 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