parallel_mesh.h
Go to the documentation of this file.00001 // The libMesh Finite Element Library. 00002 // Copyright (C) 2002-2012 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 (unsigned int dim=1); 00060 00065 ParallelMesh (const UnstructuredMesh& other_mesh); 00066 00071 ParallelMesh (const ParallelMesh& other_mesh); 00072 00076 virtual AutoPtr<MeshBase> clone () const 00077 { return AutoPtr<MeshBase>(new ParallelMesh(*this)); } 00078 00082 virtual ~ParallelMesh(); 00083 00087 virtual void clear(); 00088 00094 virtual void redistribute (); 00095 00100 virtual void update_post_partitioning (); 00101 00106 virtual bool is_serial () const 00107 { return _is_serial; } 00108 00114 template <typename T> 00115 void libmesh_assert_valid_parallel_object_ids(const mapvector<T*,dof_id_type>&) const; 00116 00122 virtual void libmesh_assert_valid_parallel_ids() const; 00123 00129 void libmesh_assert_valid_parallel_flags() const; 00130 00136 template <typename T> 00137 dof_id_type renumber_dof_objects (mapvector<T*,dof_id_type>&); 00138 00142 virtual void renumber_nodes_and_elements (); 00143 00148 virtual void allgather(); 00149 00155 virtual void delete_remote_elements(); 00156 00162 virtual void insert_extra_ghost_elem(Elem* e); 00163 00164 // Cached methods that can be called in serial 00165 virtual dof_id_type n_nodes () const { return _n_nodes; } 00166 virtual dof_id_type max_node_id () const { return _max_node_id; } 00167 virtual void reserve_nodes (const dof_id_type) { } 00168 virtual dof_id_type n_elem () const { return _n_elem; } 00169 virtual dof_id_type n_active_elem () const; 00170 virtual dof_id_type max_elem_id () const { return _max_elem_id; } 00171 virtual void reserve_elem (const dof_id_type) { } 00172 00173 // Parallel only method to update the caches 00174 virtual void update_parallel_id_counts (); 00175 00176 // And more parallel only methods to test non-cached values 00177 dof_id_type parallel_n_nodes () const; 00178 dof_id_type parallel_max_node_id () const; 00179 dof_id_type parallel_n_elem () const; 00180 dof_id_type parallel_max_elem_id () const; 00181 00182 virtual const Point& point (const dof_id_type i) const ; 00183 virtual const Node& node (const dof_id_type i) const ; 00184 virtual Node& node (const dof_id_type i) ; 00185 virtual const Node* node_ptr (const dof_id_type i) const ; 00186 virtual Node* node_ptr (const dof_id_type i) ; 00187 virtual const Node* query_node_ptr (const dof_id_type i) const ; 00188 virtual Node* query_node_ptr (const dof_id_type i) ; 00189 virtual const Elem* elem (const dof_id_type i) const ; 00190 virtual Elem* elem (const dof_id_type i) ; 00191 virtual const Elem* query_elem (const dof_id_type i) const ; 00192 virtual Elem* query_elem (const dof_id_type i) ; 00193 00197 virtual Node* add_point (const Point& p, 00198 const dof_id_type id = 00199 DofObject::invalid_id, 00200 const processor_id_type proc_id = 00201 DofObject::invalid_processor_id); 00202 virtual Node* add_node (Node* n) ; 00203 virtual Node* insert_node (Node* n); 00204 virtual void delete_node (Node* n) ; 00205 virtual void renumber_node (dof_id_type old_id, dof_id_type new_id); 00206 virtual Elem* add_elem (Elem* e) ; 00207 virtual Elem* insert_elem (Elem* e) ; 00208 virtual void delete_elem (Elem* e) ; 00209 virtual void renumber_elem (dof_id_type old_id, dof_id_type new_id); 00210 00217 virtual void fix_broken_node_and_element_numbering (); 00218 00219 public: 00223 element_iterator elements_begin (); 00224 element_iterator elements_end (); 00225 00226 element_iterator active_elements_begin (); 00227 element_iterator active_elements_end (); 00228 00229 element_iterator ancestor_elements_begin (); 00230 element_iterator ancestor_elements_end (); 00231 00232 element_iterator subactive_elements_begin (); 00233 element_iterator subactive_elements_end (); 00234 00235 element_iterator not_active_elements_begin (); 00236 element_iterator not_active_elements_end (); 00237 00238 element_iterator not_ancestor_elements_begin (); 00239 element_iterator not_ancestor_elements_end (); 00240 00241 element_iterator not_subactive_elements_begin (); 00242 element_iterator not_subactive_elements_end (); 00243 00244 element_iterator local_elements_begin (); 00245 element_iterator local_elements_end (); 00246 00247 element_iterator not_local_elements_begin (); 00248 element_iterator not_local_elements_end (); 00249 00250 element_iterator active_local_elements_begin (); 00251 element_iterator active_local_elements_end (); 00252 00253 element_iterator active_not_local_elements_begin (); 00254 element_iterator active_not_local_elements_end (); 00255 00256 element_iterator level_elements_begin (const unsigned int level); 00257 element_iterator level_elements_end (const unsigned int level); 00258 00259 element_iterator not_level_elements_begin (const unsigned int level); 00260 element_iterator not_level_elements_end (const unsigned int level); 00261 00262 element_iterator local_level_elements_begin (const unsigned int level); 00263 element_iterator local_level_elements_end (const unsigned int level); 00264 00265 element_iterator local_not_level_elements_begin (const unsigned int level); 00266 element_iterator local_not_level_elements_end (const unsigned int level); 00267 00268 element_iterator pid_elements_begin (const processor_id_type proc_id); 00269 element_iterator pid_elements_end (const processor_id_type proc_id); 00270 00271 element_iterator type_elements_begin (const ElemType type); 00272 element_iterator type_elements_end (const ElemType type); 00273 00274 element_iterator active_type_elements_begin (const ElemType type); 00275 element_iterator active_type_elements_end (const ElemType type); 00276 00277 element_iterator active_pid_elements_begin (const processor_id_type proc_id); 00278 element_iterator active_pid_elements_end (const processor_id_type proc_id); 00279 00280 element_iterator unpartitioned_elements_begin (); 00281 element_iterator unpartitioned_elements_end (); 00282 00283 element_iterator active_local_subdomain_elements_begin (const subdomain_id_type subdomain_id); 00284 element_iterator active_local_subdomain_elements_end (const subdomain_id_type subdomain_id); 00285 00286 element_iterator active_subdomain_elements_begin (const subdomain_id_type subdomain_id); 00287 element_iterator active_subdomain_elements_end (const subdomain_id_type subdomain_id); 00288 00289 00293 const_element_iterator elements_begin() const; 00294 const_element_iterator elements_end() const; 00295 00296 const_element_iterator active_elements_begin() const; 00297 const_element_iterator active_elements_end() const; 00298 00299 const_element_iterator ancestor_elements_begin() const; 00300 const_element_iterator ancestor_elements_end() const; 00301 00302 const_element_iterator subactive_elements_begin() const; 00303 const_element_iterator subactive_elements_end() const; 00304 00305 const_element_iterator not_active_elements_begin() const; 00306 const_element_iterator not_active_elements_end() const; 00307 00308 const_element_iterator not_ancestor_elements_begin() const; 00309 const_element_iterator not_ancestor_elements_end() const; 00310 00311 const_element_iterator not_subactive_elements_begin() const; 00312 const_element_iterator not_subactive_elements_end() const; 00313 00314 const_element_iterator local_elements_begin () const; 00315 const_element_iterator local_elements_end () const; 00316 00317 const_element_iterator not_local_elements_begin () const; 00318 const_element_iterator not_local_elements_end () const; 00319 00320 const_element_iterator active_local_elements_begin () const; 00321 const_element_iterator active_local_elements_end () const; 00322 00323 const_element_iterator active_not_local_elements_begin () const; 00324 const_element_iterator active_not_local_elements_end () const; 00325 00326 const_element_iterator level_elements_begin (const unsigned int level) const; 00327 const_element_iterator level_elements_end (const unsigned int level) const; 00328 00329 const_element_iterator not_level_elements_begin (const unsigned int level) const; 00330 const_element_iterator not_level_elements_end (const unsigned int level) const; 00331 00332 const_element_iterator local_level_elements_begin (const unsigned int level) const; 00333 const_element_iterator local_level_elements_end (const unsigned int level) const; 00334 00335 const_element_iterator local_not_level_elements_begin (const unsigned int level) const; 00336 const_element_iterator local_not_level_elements_end (const unsigned int level) const; 00337 00338 const_element_iterator pid_elements_begin (const processor_id_type proc_id) const; 00339 const_element_iterator pid_elements_end (const processor_id_type proc_id) const; 00340 00341 const_element_iterator type_elements_begin (const ElemType type) const; 00342 const_element_iterator type_elements_end (const ElemType type) const; 00343 00344 const_element_iterator active_type_elements_begin (const ElemType type) const; 00345 const_element_iterator active_type_elements_end (const ElemType type) const; 00346 00347 const_element_iterator active_pid_elements_begin (const processor_id_type proc_id) const; 00348 const_element_iterator active_pid_elements_end (const processor_id_type proc_id) const; 00349 00350 const_element_iterator unpartitioned_elements_begin () const; 00351 const_element_iterator unpartitioned_elements_end () const; 00352 00353 const_element_iterator active_local_subdomain_elements_begin (const subdomain_id_type subdomain_id) const; 00354 const_element_iterator active_local_subdomain_elements_end (const subdomain_id_type subdomain_id) const; 00355 00356 const_element_iterator active_subdomain_elements_begin (const subdomain_id_type subdomain_id) const; 00357 const_element_iterator active_subdomain_elements_end (const subdomain_id_type subdomain_id) const; 00358 00359 00360 00361 00362 00366 node_iterator nodes_begin(); 00367 node_iterator nodes_end(); 00368 00369 node_iterator active_nodes_begin(); 00370 node_iterator active_nodes_end(); 00371 00372 node_iterator local_nodes_begin (); 00373 node_iterator local_nodes_end (); 00374 00375 node_iterator pid_nodes_begin (const processor_id_type proc_id); 00376 node_iterator pid_nodes_end (const processor_id_type proc_id); 00377 00381 const_node_iterator nodes_begin() const; 00382 const_node_iterator nodes_end() const; 00383 00384 const_node_iterator active_nodes_begin() const; 00385 const_node_iterator active_nodes_end() const; 00386 00387 const_node_iterator local_nodes_begin () const; 00388 const_node_iterator local_nodes_end () const; 00389 00390 const_node_iterator pid_nodes_begin (const processor_id_type proc_id) const; 00391 const_node_iterator pid_nodes_end (const processor_id_type proc_id) const; 00392 00393 protected: 00394 00398 mapvector<Node*,dof_id_type> _nodes; 00399 00403 mapvector<Elem*,dof_id_type> _elements; 00404 00408 bool _is_serial; 00409 00413 dof_id_type _n_nodes, _n_elem, _max_node_id, _max_elem_id; 00414 00419 dof_id_type _next_free_local_node_id, 00420 _next_free_local_elem_id; 00421 dof_id_type _next_free_unpartitioned_node_id, 00422 _next_free_unpartitioned_elem_id; 00423 00428 std::set<Elem *> _extra_ghost_elems; 00429 00430 private: 00431 00436 typedef mapvector<Elem*,dof_id_type>::veclike_iterator elem_iterator_imp; 00437 typedef mapvector<Elem*,dof_id_type>::const_veclike_iterator const_elem_iterator_imp; 00438 00443 typedef mapvector<Node*,dof_id_type>::veclike_iterator node_iterator_imp; 00444 typedef mapvector<Node*,dof_id_type>::const_veclike_iterator const_node_iterator_imp; 00445 }; 00446 00447 00448 } // namespace libMesh 00449 00450 #endif // LIBMESH_PARALLEL_MESH_H
Site Created By: libMesh Developers
Last modified: February 05 2013 19:54:48 UTC
Hosted By: