$extrastylesheet
parallel_mesh.h
Go to the documentation of this file.
00001 // The libMesh Finite Element Library.
00002 // Copyright (C) 2002-2014 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
00003 
00004 // This library is free software; you can redistribute it and/or
00005 // modify it under the terms of the GNU Lesser General Public
00006 // License as published by the Free Software Foundation; either
00007 // version 2.1 of the License, or (at your option) any later version.
00008 
00009 // This library is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // Lesser General Public License for more details.
00013 
00014 // You should have received a copy of the GNU Lesser General Public
00015 // License along with this library; if not, write to the Free Software
00016 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017 
00018 
00019 
00020 #ifndef LIBMESH_PARALLEL_MESH_H
00021 #define LIBMESH_PARALLEL_MESH_H
00022 
00023 // Local Includes -----------------------------------
00024 #include "libmesh/mapvector.h"
00025 #include "libmesh/unstructured_mesh.h"
00026 
00027 // C++ Includes   -----------------------------------
00028 #include <cstddef>
00029 #include <set>
00030 
00031 namespace libMesh
00032 {
00033 
00034 // Forward declarations
00035 class Elem;
00036 class Node;
00037 
00038 
00047 // ------------------------------------------------------------
00048 // UnstructuredMesh class definition
00049 class ParallelMesh : public UnstructuredMesh
00050 {
00051 public:
00052 
00058   explicit
00059   ParallelMesh (const Parallel::Communicator &comm_in,
00060                 unsigned char dim=1);
00061 
00062 #ifndef LIBMESH_DISABLE_COMMWORLD
00063 
00068   explicit
00069   ParallelMesh (unsigned char dim=1);
00070 #endif
00071 
00072 
00077   ParallelMesh (const UnstructuredMesh& other_mesh);
00078 
00083   ParallelMesh (const ParallelMesh& other_mesh);
00084 
00088   virtual UniquePtr<MeshBase> clone () const
00089   { return UniquePtr<MeshBase>(new ParallelMesh(*this)); }
00090 
00094   virtual ~ParallelMesh();
00095 
00099   virtual void clear();
00100 
00106   virtual void redistribute ();
00107 
00112   virtual void update_post_partitioning ();
00113 
00118   virtual bool is_serial () const
00119   { return _is_serial; }
00120 
00126   template <typename T>
00127   void libmesh_assert_valid_parallel_object_ids(const mapvector<T*,dof_id_type>&) const;
00128 
00134   virtual void libmesh_assert_valid_parallel_ids() const;
00135 
00141   void libmesh_assert_valid_parallel_flags() const;
00142 
00148   template <typename T>
00149   dof_id_type renumber_dof_objects (mapvector<T*,dof_id_type>&);
00150 
00154   virtual void renumber_nodes_and_elements ();
00155 
00160   virtual void allgather();
00161 
00167   virtual void delete_remote_elements();
00168 
00174   virtual void add_extra_ghost_elem(Elem* e);
00175 
00179   virtual void clear_extra_ghost_elems() { _extra_ghost_elems.clear(); }
00180 
00181   // Cached methods that can be called in serial
00182   virtual dof_id_type n_nodes () const { return _n_nodes; }
00183   virtual dof_id_type max_node_id () const { return _max_node_id; }
00184   virtual void reserve_nodes (const dof_id_type) { }
00185   virtual dof_id_type n_elem () const { return _n_elem; }
00186   virtual dof_id_type n_active_elem () const;
00187   virtual dof_id_type max_elem_id () const { return _max_elem_id; }
00188   virtual void reserve_elem (const dof_id_type) { }
00189 
00190   // Parallel only method to update the caches
00191   virtual void update_parallel_id_counts ();
00192 
00193   // And more parallel only methods to test non-cached values
00194   dof_id_type parallel_n_nodes () const;
00195   dof_id_type parallel_max_node_id () const;
00196   dof_id_type parallel_n_elem () const;
00197   dof_id_type parallel_max_elem_id () const;
00198 
00199   virtual const Point& point (const dof_id_type i) const ;
00200   virtual const Node&  node  (const dof_id_type i) const ;
00201   virtual Node& node (const dof_id_type i) ;
00202   virtual const Node* node_ptr (const dof_id_type i) const ;
00203   virtual Node* node_ptr (const dof_id_type i) ;
00204   virtual const Node* query_node_ptr (const dof_id_type i) const ;
00205   virtual Node* query_node_ptr (const dof_id_type i) ;
00206   virtual const Elem* elem (const dof_id_type i) const ;
00207   virtual Elem* elem (const dof_id_type i) ;
00208   virtual const Elem* query_elem (const dof_id_type i) const ;
00209   virtual Elem* query_elem (const dof_id_type i) ;
00210 
00214   virtual Node* add_point (const Point& p,
00215                            const dof_id_type id =
00216                            DofObject::invalid_id,
00217                            const processor_id_type proc_id =
00218                            DofObject::invalid_processor_id);
00219   virtual Node* add_node (Node* n) ;
00220 
00224   virtual Node* insert_node(Node* n);
00225 
00226   virtual void delete_node (Node* n) ;
00227   virtual void renumber_node (dof_id_type old_id, dof_id_type new_id);
00228   virtual Elem* add_elem (Elem* e) ;
00229   virtual Elem* insert_elem (Elem* e) ;
00230   virtual void delete_elem (Elem* e) ;
00231   virtual void renumber_elem (dof_id_type old_id, dof_id_type new_id);
00232 
00239   virtual void fix_broken_node_and_element_numbering ();
00240 
00241 public:
00245   element_iterator elements_begin ();
00246   element_iterator elements_end   ();
00247 
00248   element_iterator active_elements_begin ();
00249   element_iterator active_elements_end   ();
00250 
00251   element_iterator ancestor_elements_begin ();
00252   element_iterator ancestor_elements_end   ();
00253 
00254   element_iterator subactive_elements_begin ();
00255   element_iterator subactive_elements_end   ();
00256 
00257   element_iterator not_active_elements_begin ();
00258   element_iterator not_active_elements_end   ();
00259 
00260   element_iterator not_ancestor_elements_begin ();
00261   element_iterator not_ancestor_elements_end   ();
00262 
00263   element_iterator not_subactive_elements_begin ();
00264   element_iterator not_subactive_elements_end   ();
00265 
00266   element_iterator local_elements_begin ();
00267   element_iterator local_elements_end   ();
00268 
00269   element_iterator semilocal_elements_begin ();
00270   element_iterator semilocal_elements_end   ();
00271 
00272   element_iterator facelocal_elements_begin ();
00273   element_iterator facelocal_elements_end   ();
00274 
00275   element_iterator not_local_elements_begin ();
00276   element_iterator not_local_elements_end   ();
00277 
00278   element_iterator active_local_elements_begin ();
00279   element_iterator active_local_elements_end   ();
00280 
00281   element_iterator active_not_local_elements_begin ();
00282   element_iterator active_not_local_elements_end   ();
00283 
00284   element_iterator level_elements_begin (const unsigned int level);
00285   element_iterator level_elements_end   (const unsigned int level);
00286 
00287   element_iterator not_level_elements_begin (const unsigned int level);
00288   element_iterator not_level_elements_end   (const unsigned int level);
00289 
00290   element_iterator local_level_elements_begin (const unsigned int level);
00291   element_iterator local_level_elements_end   (const unsigned int level);
00292 
00293   element_iterator local_not_level_elements_begin (const unsigned int level);
00294   element_iterator local_not_level_elements_end   (const unsigned int level);
00295 
00296   element_iterator pid_elements_begin (const processor_id_type proc_id);
00297   element_iterator pid_elements_end   (const processor_id_type proc_id);
00298 
00299   element_iterator type_elements_begin (const ElemType type);
00300   element_iterator type_elements_end   (const ElemType type);
00301 
00302   element_iterator active_type_elements_begin (const ElemType type);
00303   element_iterator active_type_elements_end   (const ElemType type);
00304 
00305   element_iterator active_pid_elements_begin (const processor_id_type proc_id);
00306   element_iterator active_pid_elements_end   (const processor_id_type proc_id);
00307 
00308   element_iterator unpartitioned_elements_begin ();
00309   element_iterator unpartitioned_elements_end ();
00310 
00311   element_iterator active_local_subdomain_elements_begin (const subdomain_id_type subdomain_id);
00312   element_iterator active_local_subdomain_elements_end   (const subdomain_id_type subdomain_id);
00313 
00314   element_iterator active_subdomain_elements_begin (const subdomain_id_type subdomain_id);
00315   element_iterator active_subdomain_elements_end   (const subdomain_id_type subdomain_id);
00316 
00317 
00321   const_element_iterator elements_begin() const;
00322   const_element_iterator elements_end()   const;
00323 
00324   const_element_iterator active_elements_begin() const;
00325   const_element_iterator active_elements_end()   const;
00326 
00327   const_element_iterator ancestor_elements_begin() const;
00328   const_element_iterator ancestor_elements_end()   const;
00329 
00330   const_element_iterator subactive_elements_begin() const;
00331   const_element_iterator subactive_elements_end()   const;
00332 
00333   const_element_iterator not_active_elements_begin() const;
00334   const_element_iterator not_active_elements_end()   const;
00335 
00336   const_element_iterator not_ancestor_elements_begin() const;
00337   const_element_iterator not_ancestor_elements_end()   const;
00338 
00339   const_element_iterator not_subactive_elements_begin() const;
00340   const_element_iterator not_subactive_elements_end()   const;
00341 
00342   const_element_iterator local_elements_begin () const;
00343   const_element_iterator local_elements_end   () const;
00344 
00345   const_element_iterator semilocal_elements_begin () const;
00346   const_element_iterator semilocal_elements_end   () const;
00347 
00348   const_element_iterator facelocal_elements_begin () const;
00349   const_element_iterator facelocal_elements_end   () const;
00350 
00351   const_element_iterator not_local_elements_begin () const;
00352   const_element_iterator not_local_elements_end   () const;
00353 
00354   const_element_iterator active_local_elements_begin () const;
00355   const_element_iterator active_local_elements_end   () const;
00356 
00357   const_element_iterator active_not_local_elements_begin () const;
00358   const_element_iterator active_not_local_elements_end   () const;
00359 
00360   const_element_iterator level_elements_begin (const unsigned int level) const;
00361   const_element_iterator level_elements_end   (const unsigned int level) const;
00362 
00363   const_element_iterator not_level_elements_begin (const unsigned int level) const;
00364   const_element_iterator not_level_elements_end   (const unsigned int level) const;
00365 
00366   const_element_iterator local_level_elements_begin (const unsigned int level) const;
00367   const_element_iterator local_level_elements_end   (const unsigned int level) const;
00368 
00369   const_element_iterator local_not_level_elements_begin (const unsigned int level) const;
00370   const_element_iterator local_not_level_elements_end   (const unsigned int level) const;
00371 
00372   const_element_iterator pid_elements_begin (const processor_id_type proc_id) const;
00373   const_element_iterator pid_elements_end   (const processor_id_type proc_id) const;
00374 
00375   const_element_iterator type_elements_begin (const ElemType type) const;
00376   const_element_iterator type_elements_end   (const ElemType type) const;
00377 
00378   const_element_iterator active_type_elements_begin (const ElemType type) const;
00379   const_element_iterator active_type_elements_end   (const ElemType type) const;
00380 
00381   const_element_iterator active_pid_elements_begin (const processor_id_type proc_id) const;
00382   const_element_iterator active_pid_elements_end   (const processor_id_type proc_id) const;
00383 
00384   const_element_iterator unpartitioned_elements_begin () const;
00385   const_element_iterator unpartitioned_elements_end () const;
00386 
00387   const_element_iterator active_local_subdomain_elements_begin (const subdomain_id_type subdomain_id) const;
00388   const_element_iterator active_local_subdomain_elements_end   (const subdomain_id_type subdomain_id) const;
00389 
00390   const_element_iterator active_subdomain_elements_begin (const subdomain_id_type subdomain_id) const;
00391   const_element_iterator active_subdomain_elements_end   (const subdomain_id_type subdomain_id) const;
00392 
00393 
00394 
00395 
00396 
00400   node_iterator nodes_begin();
00401   node_iterator nodes_end();
00402 
00403   node_iterator active_nodes_begin();
00404   node_iterator active_nodes_end();
00405 
00406   node_iterator local_nodes_begin  ();
00407   node_iterator local_nodes_end    ();
00408 
00409   node_iterator pid_nodes_begin (const processor_id_type proc_id);
00410   node_iterator pid_nodes_end   (const processor_id_type proc_id);
00411 
00415   const_node_iterator nodes_begin() const;
00416   const_node_iterator nodes_end()   const;
00417 
00418   const_node_iterator active_nodes_begin() const;
00419   const_node_iterator active_nodes_end()   const;
00420 
00421   const_node_iterator local_nodes_begin  () const;
00422   const_node_iterator local_nodes_end    () const;
00423 
00424   const_node_iterator pid_nodes_begin (const processor_id_type proc_id) const;
00425   const_node_iterator pid_nodes_end   (const processor_id_type proc_id) const;
00426 
00427 protected:
00428 
00433 #ifdef LIBMESH_ENABLE_UNIQUE_ID
00434   virtual void assign_unique_ids();
00435 #endif
00436 
00440   mapvector<Node*,dof_id_type> _nodes;
00441 
00445   mapvector<Elem*,dof_id_type> _elements;
00446 
00450   bool _is_serial;
00451 
00455   dof_id_type _n_nodes, _n_elem, _max_node_id, _max_elem_id;
00456 
00461   dof_id_type _next_free_local_node_id,
00462     _next_free_local_elem_id;
00463   dof_id_type _next_free_unpartitioned_node_id,
00464     _next_free_unpartitioned_elem_id;
00465 
00470   std::set<Elem *> _extra_ghost_elems;
00471 
00472 private:
00473 
00478   typedef mapvector<Elem*,dof_id_type>::veclike_iterator             elem_iterator_imp;
00479   typedef mapvector<Elem*,dof_id_type>::const_veclike_iterator const_elem_iterator_imp;
00480 
00485   typedef mapvector<Node*,dof_id_type>::veclike_iterator             node_iterator_imp;
00486   typedef mapvector<Node*,dof_id_type>::const_veclike_iterator const_node_iterator_imp;
00487 };
00488 
00489 
00490 } // namespace libMesh
00491 
00492 #endif // LIBMESH_PARALLEL_MESH_H