mesh_base.h

Go to the documentation of this file.
00001 // $Id: mesh_base.h 3547 2009-11-08 22:22:13Z benkirk $
00002 
00003 // The libMesh Finite Element Library.
00004 // Copyright (C) 2002-2008 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
00005   
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License, or (at your option) any later version.
00010   
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015   
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 
00020 
00021 
00022 #ifndef __mesh_base_h__
00023 #define __mesh_base_h__
00024 
00025 
00026 
00027 // C++ Includes   -----------------------------------
00028 #include <string>
00029 
00030 // forward declarations
00031 class Elem;
00032 class Node;
00033 class Point;
00034 class BoundaryInfo;
00035 class PointLocatorBase;
00036 class MeshData;
00037 
00038 // Local Includes -----------------------------------
00039 #include "auto_ptr.h"
00040 #include "dof_object.h" // for invalid_processor_id
00041 #include "enum_elem_type.h"
00042 #include "libmesh_common.h"
00043 #include "multi_predicates.h"
00044 #include "partitioner.h"
00045 #include "variant_filter_iterator.h"
00046 
00047 
00048 
00049 
00067 // ------------------------------------------------------------
00068 // MeshBase class definition
00069 class MeshBase
00070 {
00071 public:
00072 
00076   MeshBase (unsigned int d);
00077   
00081   MeshBase (const MeshBase& other_mesh);
00082 
00086   virtual AutoPtr<MeshBase> clone() const = 0;
00087 
00091   virtual ~MeshBase ();
00092 
00098   AutoPtr<BoundaryInfo> boundary_info;
00099 
00103   virtual AutoPtr<Partitioner> &partitioner() { return _partitioner; }
00104   
00108   virtual void clear ();
00109   
00114   bool is_prepared () const
00115   { return _is_prepared; }
00116   
00121   virtual bool is_serial () const 
00122   { return true; }
00123   
00128   virtual void allgather () {}
00129   
00135   virtual void delete_remote_elements () {}
00136   
00140   unsigned int mesh_dimension () const
00141   { return static_cast<unsigned int>(_dim); }
00142   
00147   void set_mesh_dimension (unsigned int d)
00148   { libmesh_assert(!this->n_elem()); _dim = d; }
00149   
00154   unsigned int spatial_dimension () const
00155   { return static_cast<unsigned int>(LIBMESH_DIM); }
00156   
00162   virtual unsigned int n_nodes () const = 0; 
00163 
00167   unsigned int n_nodes_on_proc (const unsigned int proc) const;
00168 
00172   unsigned int n_local_nodes () const
00173   { return this->n_nodes_on_proc (libMesh::processor_id()); }
00174 
00178   unsigned int n_unpartitioned_nodes () const
00179   { return this->n_nodes_on_proc (DofObject::invalid_processor_id); }
00180 
00185   virtual unsigned int max_node_id () const = 0;
00186 
00194   virtual void reserve_nodes (const unsigned int nn) = 0; 
00195   
00199   virtual unsigned int n_elem () const = 0; 
00200 
00205   virtual unsigned int max_elem_id () const = 0;
00206 
00214   virtual void reserve_elem (const unsigned int ne) = 0; 
00215 
00220   virtual void update_parallel_id_counts () = 0;
00221 
00226   virtual unsigned int n_active_elem () const = 0;
00227 
00231   unsigned int n_elem_on_proc (const unsigned int proc) const;
00232 
00236   unsigned int n_local_elem () const
00237   { return this->n_elem_on_proc (libMesh::processor_id()); }
00238 
00242   unsigned int n_unpartitioned_elem () const
00243   { return this->n_elem_on_proc (DofObject::invalid_processor_id); }
00244 
00248   unsigned int n_active_elem_on_proc (const unsigned int proc) const;
00249 
00253   unsigned int n_active_local_elem () const
00254   { return this->n_active_elem_on_proc (libMesh::processor_id()); }
00255   
00263   unsigned int n_sub_elem () const;
00264 
00268   unsigned int n_active_sub_elem () const;
00269   
00274   virtual const Point& point (const unsigned int i) const = 0;
00275 
00280   virtual const Node& node (const unsigned int i) const = 0;
00281   
00285   virtual Node& node (const unsigned int i) = 0;
00286   
00290   virtual const Node* node_ptr (const unsigned int i) const = 0;
00291 
00295   virtual Node* & node_ptr (const unsigned int i) = 0;
00296 
00300   virtual Elem* elem (const unsigned int i) const = 0;
00301 
00312   virtual Node* add_point (const Point& p,
00313                            const unsigned int id = DofObject::invalid_id,
00314                            const unsigned int proc_id =
00315                              DofObject::invalid_processor_id) = 0;
00316 
00320   virtual Node* add_node (Node* n) = 0;
00321 
00325   virtual void delete_node (Node* n) = 0;
00326   
00332   virtual void renumber_node (unsigned int old_id, unsigned int new_id) = 0;
00333                       
00340   virtual Elem* add_elem (Elem* e) = 0;
00341 
00346   virtual Elem* insert_elem (Elem* e) = 0;
00347 
00354   virtual void delete_elem (Elem* e) = 0;
00355 
00361   virtual void renumber_elem (unsigned int old_id, unsigned int new_id) = 0;
00362 
00375   virtual void find_neighbors (const bool reset_remote_elements = false,
00376                                const bool reset_current_list    = true) = 0;
00377   
00383   virtual void renumber_nodes_and_elements () = 0;    
00384 
00385 #ifdef LIBMESH_ENABLE_AMR
00386 
00391   virtual bool contract () = 0;
00392 #endif
00393 
00406   void prepare_for_use (const bool skip_renumber_nodes_and_elements=false);
00407   
00411   void partition (const unsigned int n_parts=libMesh::n_processors());
00412   
00420   unsigned int n_subdomains () const;
00421 
00428   unsigned int n_partitions () const
00429   { return _n_parts; }
00430   
00435   unsigned int n_processors () const
00436   { return libMesh::n_processors(); }
00437 
00441   unsigned int processor_id () const
00442   { return libMesh::processor_id(); }
00443 
00448   std::string get_info () const;
00449 
00453   void print_info (std::ostream& os=std::cout) const;
00454 
00460   friend std::ostream& operator << (std::ostream& os, const MeshBase& m);
00461 
00466   virtual void read  (const std::string& name, MeshData* mesh_data=NULL,
00467                       bool skip_renumber_nodes_and_elements=false) = 0;
00468   virtual void write (const std::string& name, MeshData* mesh_data=NULL) = 0;
00469 
00476   virtual void all_first_order () = 0;
00477 
00489   virtual void all_second_order (const bool full_ordered=true) = 0;
00490 
00495   typedef Predicates::multi_predicate Predicate;
00496 
00503   struct element_iterator;
00504   struct const_element_iterator;
00505 
00512   struct node_iterator;
00513   struct const_node_iterator;
00514 
00524   unsigned int recalculate_n_partitions();
00525 
00530   const PointLocatorBase & point_locator () const;
00531 
00535   void clear_point_locator ();
00536 
00537 
00538 
00539 public:
00540 
00541 
00542   
00547   virtual element_iterator elements_begin                   () = 0;
00548   virtual element_iterator elements_end                     () = 0;
00549   virtual element_iterator active_elements_begin            () = 0;
00550   virtual element_iterator active_elements_end              () = 0;
00551   virtual element_iterator ancestor_elements_begin          () = 0;
00552   virtual element_iterator ancestor_elements_end            () = 0;
00553   virtual element_iterator subactive_elements_begin         () = 0;
00554   virtual element_iterator subactive_elements_end           () = 0;
00555   virtual element_iterator not_active_elements_begin        () = 0;
00556   virtual element_iterator not_active_elements_end          () = 0;
00557   virtual element_iterator not_ancestor_elements_begin      () = 0;
00558   virtual element_iterator not_ancestor_elements_end        () = 0;
00559   virtual element_iterator not_subactive_elements_begin     () = 0;
00560   virtual element_iterator not_subactive_elements_end       () = 0;
00561   virtual element_iterator local_elements_begin             () = 0;
00562   virtual element_iterator local_elements_end               () = 0;
00563   virtual element_iterator not_local_elements_begin         () = 0;
00564   virtual element_iterator not_local_elements_end           () = 0;
00565   virtual element_iterator active_local_elements_begin      () = 0;
00566   virtual element_iterator active_local_elements_end        () = 0;
00567   virtual element_iterator active_not_local_elements_begin  () = 0;
00568   virtual element_iterator active_not_local_elements_end    () = 0;
00569   virtual element_iterator level_elements_begin             (const unsigned int level  ) = 0;
00570   virtual element_iterator level_elements_end               (const unsigned int level  ) = 0;
00571   virtual element_iterator not_level_elements_begin         (const unsigned int level  ) = 0;
00572   virtual element_iterator not_level_elements_end           (const unsigned int level  ) = 0;
00573   virtual element_iterator local_level_elements_begin       (const unsigned int level  ) = 0;
00574   virtual element_iterator local_level_elements_end         (const unsigned int level  ) = 0;
00575   virtual element_iterator local_not_level_elements_begin   (const unsigned int level  ) = 0;
00576   virtual element_iterator local_not_level_elements_end     (const unsigned int level  ) = 0;
00577   virtual element_iterator pid_elements_begin               (const unsigned int proc_id) = 0;
00578   virtual element_iterator pid_elements_end                 (const unsigned int proc_id) = 0;
00579   virtual element_iterator type_elements_begin              (const ElemType type       ) = 0;
00580   virtual element_iterator type_elements_end                (const ElemType type       ) = 0;
00581   virtual element_iterator active_type_elements_begin       (const ElemType type       ) = 0;
00582   virtual element_iterator active_type_elements_end         (const ElemType type       ) = 0;
00583   virtual element_iterator active_pid_elements_begin        (const unsigned int proc_id) = 0;
00584   virtual element_iterator active_pid_elements_end          (const unsigned int proc_id) = 0;
00585   virtual element_iterator unpartitioned_elements_begin     () = 0;
00586   virtual element_iterator unpartitioned_elements_end       () = 0;
00587   virtual element_iterator active_local_subdomain_elements_begin         (const unsigned int subdomain_id) = 0;
00588   virtual element_iterator active_local_subdomain_elements_end           (const unsigned int subdomain_id) = 0;
00589   
00590 
00591   
00592   
00596   virtual const_element_iterator elements_begin                   () const = 0;
00597   virtual const_element_iterator elements_end                     () const = 0;
00598   virtual const_element_iterator active_elements_begin            () const = 0;
00599   virtual const_element_iterator active_elements_end              () const = 0;
00600   virtual const_element_iterator ancestor_elements_begin          () const = 0;
00601   virtual const_element_iterator ancestor_elements_end            () const = 0;
00602   virtual const_element_iterator subactive_elements_begin         () const = 0;
00603   virtual const_element_iterator subactive_elements_end           () const = 0;
00604   virtual const_element_iterator not_active_elements_begin        () const = 0;
00605   virtual const_element_iterator not_active_elements_end          () const = 0;
00606   virtual const_element_iterator not_ancestor_elements_begin      () const = 0;
00607   virtual const_element_iterator not_ancestor_elements_end        () const = 0;
00608   virtual const_element_iterator not_subactive_elements_begin     () const = 0;
00609   virtual const_element_iterator not_subactive_elements_end       () const = 0;
00610   virtual const_element_iterator local_elements_begin             () const = 0;
00611   virtual const_element_iterator local_elements_end               () const = 0;
00612   virtual const_element_iterator not_local_elements_begin         () const = 0;
00613   virtual const_element_iterator not_local_elements_end           () const = 0;
00614   virtual const_element_iterator active_local_elements_begin      () const = 0;
00615   virtual const_element_iterator active_local_elements_end        () const = 0;
00616   virtual const_element_iterator active_not_local_elements_begin  () const = 0;
00617   virtual const_element_iterator active_not_local_elements_end    () const = 0;
00618   virtual const_element_iterator level_elements_begin             (const unsigned int level)   const = 0;
00619   virtual const_element_iterator level_elements_end               (const unsigned int level)   const = 0;
00620   virtual const_element_iterator not_level_elements_begin         (const unsigned int level)   const = 0;
00621   virtual const_element_iterator not_level_elements_end           (const unsigned int level)   const = 0;
00622   virtual const_element_iterator local_level_elements_begin       (const unsigned int level)   const = 0;
00623   virtual const_element_iterator local_level_elements_end         (const unsigned int level)   const = 0;
00624   virtual const_element_iterator local_not_level_elements_begin   (const unsigned int level)   const = 0;
00625   virtual const_element_iterator local_not_level_elements_end     (const unsigned int level)   const = 0;
00626   virtual const_element_iterator pid_elements_begin               (const unsigned int proc_id) const = 0;
00627   virtual const_element_iterator pid_elements_end                 (const unsigned int proc_id) const = 0;
00628   virtual const_element_iterator type_elements_begin              (const ElemType type)        const = 0;
00629   virtual const_element_iterator type_elements_end                (const ElemType type)        const = 0;
00630   virtual const_element_iterator active_type_elements_begin       (const ElemType type)        const = 0;
00631   virtual const_element_iterator active_type_elements_end         (const ElemType type)        const = 0;
00632   virtual const_element_iterator active_pid_elements_begin        (const unsigned int proc_id) const = 0;
00633   virtual const_element_iterator active_pid_elements_end          (const unsigned int proc_id) const = 0;
00634   virtual const_element_iterator unpartitioned_elements_begin     () const = 0;
00635   virtual const_element_iterator unpartitioned_elements_end       () const = 0;
00636   virtual const_element_iterator active_local_subdomain_elements_begin (const unsigned int subdomain_id) const = 0;
00637   virtual const_element_iterator active_local_subdomain_elements_end   (const unsigned int subdomain_id) const = 0;
00638 
00639   
00643   virtual node_iterator nodes_begin        () = 0;
00644   virtual node_iterator nodes_end          () = 0;
00645   virtual node_iterator active_nodes_begin () = 0;
00646   virtual node_iterator active_nodes_end   () = 0;
00647   virtual node_iterator local_nodes_begin  () = 0;
00648   virtual node_iterator local_nodes_end    () = 0;
00649   virtual node_iterator pid_nodes_begin    (const unsigned int proc_id) = 0;
00650   virtual node_iterator pid_nodes_end      (const unsigned int proc_id) = 0;
00651 
00652 
00656   virtual const_node_iterator nodes_begin        () const = 0;
00657   virtual const_node_iterator nodes_end          () const = 0;
00658   virtual const_node_iterator active_nodes_begin () const = 0;
00659   virtual const_node_iterator active_nodes_end   () const = 0;
00660   virtual const_node_iterator local_nodes_begin  () const = 0;
00661   virtual const_node_iterator local_nodes_end    () const = 0;
00662   virtual const_node_iterator pid_nodes_begin    (const unsigned int proc_id) const = 0;
00663   virtual const_node_iterator pid_nodes_end      (const unsigned int proc_id) const = 0;
00664 
00665 
00666   
00667 protected:
00668 
00669 
00670 
00671   
00672   
00673 
00677   unsigned int& set_n_partitions ()
00678   { return _n_parts; }
00679   
00689   unsigned int _n_parts;
00690   
00694   unsigned int _dim;
00695 
00699   bool _is_prepared;
00700   
00708   mutable AutoPtr<PointLocatorBase> _point_locator;
00709 
00716   AutoPtr<Partitioner> _partitioner;
00717   
00722   friend class Partitioner;
00723 
00728   friend class BoundaryInfo;
00729 
00730 };
00731 
00732 
00733 
00734 
00735 
00736 
00737 
00738 
00739 
00740 
00741 
00745 struct
00746 MeshBase::element_iterator :
00747 variant_filter_iterator<MeshBase::Predicate,
00748                         Elem*>
00749 {
00750   // Templated forwarding ctor -- forwards to appropriate variant_filter_iterator ctor
00751   template <typename PredType, typename IterType>
00752   element_iterator (const IterType& d,
00753                     const IterType& e,
00754                     const PredType& p ) :
00755     variant_filter_iterator<MeshBase::Predicate,
00756                             Elem*>(d,e,p) {}
00757 };
00758 
00759 
00760 
00761 
00766 struct
00767 MeshBase::const_element_iterator :
00768 variant_filter_iterator<MeshBase::Predicate,
00769                         Elem* const,
00770                         Elem* const&,
00771                         Elem* const*>
00772 {
00773   // Templated forwarding ctor -- forwards to appropriate variant_filter_iterator ctor
00774   template <typename PredType, typename IterType>
00775   const_element_iterator (const IterType& d,
00776                           const IterType& e,
00777                           const PredType& p ) :
00778     variant_filter_iterator<MeshBase::Predicate,
00779                             Elem* const,
00780                             Elem* const&,
00781                             Elem* const*>(d,e,p)  {}
00782 
00783 
00784   // The conversion-to-const ctor.  Takes a regular iterator and calls the appropriate
00785   // variant_filter_iterator copy constructor.  Note that this one is *not* templated!
00786   const_element_iterator (const MeshBase::element_iterator& rhs) :
00787     variant_filter_iterator<Predicate,
00788                             Elem* const,
00789                             Elem* const&,
00790                             Elem* const*>(rhs)
00791   {
00792     // std::cout << "Called element_iterator conversion-to-const ctor." << std::endl;
00793   }
00794 };
00795 
00796 
00797 
00798 
00799 
00800 
00801 
00805 struct
00806 MeshBase::node_iterator :
00807 variant_filter_iterator<MeshBase::Predicate,
00808                         Node*>
00809 {
00810   // Templated forwarding ctor -- forwards to appropriate variant_filter_iterator ctor
00811   template <typename PredType, typename IterType>
00812   node_iterator (const IterType& d,
00813                  const IterType& e,
00814                  const PredType& p ) :
00815     variant_filter_iterator<MeshBase::Predicate,
00816                             Node*>(d,e,p) {}
00817 };
00818 
00819 
00820 
00821 
00826 struct
00827 MeshBase::const_node_iterator :
00828 variant_filter_iterator<MeshBase::Predicate,
00829                         Node* const,
00830                         Node* const &,
00831                         Node* const *>
00832 {
00833   // Templated forwarding ctor -- forwards to appropriate variant_filter_iterator ctor
00834   template <typename PredType, typename IterType>
00835   const_node_iterator (const IterType& d,
00836                        const IterType& e,
00837                        const PredType& p ) :
00838     variant_filter_iterator<MeshBase::Predicate,
00839                             Node* const,
00840                             Node* const &,
00841                             Node* const *>(d,e,p)  {}
00842 
00843 
00844   // The conversion-to-const ctor.  Takes a regular iterator and calls the appropriate
00845   // variant_filter_iterator copy constructor.  Note that this one is *not* templated!
00846   const_node_iterator (const MeshBase::node_iterator& rhs) :
00847     variant_filter_iterator<Predicate,
00848                             Node* const,
00849                             Node* const &,
00850                             Node* const *>(rhs)
00851   {
00852     // std::cout << "Called node_iterator conversion-to-const ctor." << std::endl;
00853   }
00854 };
00855 
00856 
00857 #endif

Site Created By: libMesh Developers
Last modified: November 25 2009 03:43:45.

Hosted By:
SourceForge.net Logo