$extrastylesheet
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