$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_SERIAL_MESH_H 00021 #define LIBMESH_SERIAL_MESH_H 00022 00023 // Local Includes ----------------------------------- 00024 #include "libmesh/unstructured_mesh.h" 00025 #include "libmesh/boundary_info.h" 00026 00027 // C++ Includes ----------------------------------- 00028 #include <cstddef> 00029 00030 namespace libMesh 00031 { 00032 00033 00034 00035 00036 00037 00045 // ------------------------------------------------------------ 00046 // Mesh class definition 00047 class SerialMesh : public UnstructuredMesh 00048 { 00049 public: 00050 00056 explicit 00057 SerialMesh (const Parallel::Communicator &comm_in, 00058 unsigned char dim=1); 00059 00060 #ifndef LIBMESH_DISABLE_COMMWORLD 00061 00066 explicit 00067 SerialMesh (unsigned char dim=1); 00068 #endif 00069 00070 00075 SerialMesh (const UnstructuredMesh& other_mesh); 00076 00081 SerialMesh (const SerialMesh& other_mesh); 00082 00086 virtual UniquePtr<MeshBase> clone () const 00087 { return UniquePtr<MeshBase>(new SerialMesh(*this)); } 00088 00092 virtual ~SerialMesh(); 00093 00097 virtual void clear(); 00098 00102 virtual void renumber_nodes_and_elements (); 00103 00104 virtual dof_id_type n_nodes () const 00105 { return cast_int<dof_id_type>(_nodes.size()); } 00106 00107 virtual dof_id_type parallel_n_nodes () const 00108 { return cast_int<dof_id_type>(_nodes.size()); } 00109 00110 virtual dof_id_type max_node_id () const 00111 { return cast_int<dof_id_type>(_nodes.size()); } 00112 00113 virtual void reserve_nodes (const dof_id_type nn) 00114 { _nodes.reserve (nn); } 00115 00116 virtual dof_id_type n_elem () const 00117 { return cast_int<dof_id_type>(_elements.size()); } 00118 00119 virtual dof_id_type parallel_n_elem () const 00120 { return cast_int<dof_id_type>(_elements.size()); } 00121 00122 virtual dof_id_type n_active_elem () const; 00123 00124 virtual dof_id_type max_elem_id () const 00125 { return cast_int<dof_id_type>(_elements.size()); } 00126 00127 virtual void reserve_elem (const dof_id_type ne) { _elements.reserve (ne); } 00128 00129 // SerialMesh has no caches to update 00130 virtual void update_parallel_id_counts () {} 00131 00132 virtual const Point& point (const dof_id_type i) const ; 00133 virtual const Node& node (const dof_id_type i) const ; 00134 virtual Node& node (const dof_id_type i) ; 00135 virtual const Node* node_ptr (const dof_id_type i) const ; 00136 virtual Node* node_ptr (const dof_id_type i) ; 00137 virtual const Node* query_node_ptr (const dof_id_type i) const ; 00138 virtual Node* query_node_ptr (const dof_id_type i) ; 00139 virtual const Elem* elem (const dof_id_type i) const ; 00140 virtual Elem* elem (const dof_id_type i) ; 00141 virtual const Elem* query_elem (const dof_id_type i) const ; 00142 virtual Elem* query_elem (const dof_id_type i) ; 00143 00147 virtual Node* add_point (const Point& p, 00148 const dof_id_type id = 00149 DofObject::invalid_id, 00150 const processor_id_type proc_id = 00151 DofObject::invalid_processor_id); 00152 virtual Node* add_node (Node* n) ; 00153 00165 virtual Node* insert_node(Node* n); 00166 00167 virtual void delete_node (Node* n) ; 00168 virtual void renumber_node (dof_id_type old_id, dof_id_type new_id); 00169 virtual Elem* add_elem (Elem* e) ; 00170 virtual Elem* insert_elem (Elem* e) ; 00171 virtual void delete_elem (Elem* e) ; 00172 virtual void renumber_elem (dof_id_type old_id, dof_id_type new_id); 00173 00180 virtual void fix_broken_node_and_element_numbering (); 00181 00200 void stitch_meshes (SerialMesh& other_mesh, 00201 boundary_id_type this_mesh_boundary, 00202 boundary_id_type other_mesh_boundary, 00203 Real tol=TOLERANCE, 00204 bool clear_stitched_boundary_ids=false, 00205 bool verbose=true, 00206 bool use_binary_search=true, 00207 bool enforce_all_nodes_match_on_boundaries=false); 00208 00212 void stitch_surfaces (boundary_id_type boundary_id_1, 00213 boundary_id_type boundary_id_2, 00214 Real tol=TOLERANCE, 00215 bool clear_stitched_boundary_ids=false, 00216 bool verbose=true, 00217 bool use_binary_search=true, 00218 bool enforce_all_nodes_match_on_boundaries=false); 00219 00220 public: 00224 element_iterator elements_begin (); 00225 element_iterator elements_end (); 00226 00227 element_iterator active_elements_begin (); 00228 element_iterator active_elements_end (); 00229 00230 element_iterator ancestor_elements_begin (); 00231 element_iterator ancestor_elements_end (); 00232 00233 element_iterator subactive_elements_begin (); 00234 element_iterator subactive_elements_end (); 00235 00236 element_iterator not_active_elements_begin (); 00237 element_iterator not_active_elements_end (); 00238 00239 element_iterator not_ancestor_elements_begin (); 00240 element_iterator not_ancestor_elements_end (); 00241 00242 element_iterator not_subactive_elements_begin (); 00243 element_iterator not_subactive_elements_end (); 00244 00245 element_iterator local_elements_begin (); 00246 element_iterator local_elements_end (); 00247 00248 element_iterator semilocal_elements_begin (); 00249 element_iterator semilocal_elements_end (); 00250 00251 element_iterator facelocal_elements_begin (); 00252 element_iterator facelocal_elements_end (); 00253 00254 element_iterator not_local_elements_begin (); 00255 element_iterator not_local_elements_end (); 00256 00257 element_iterator active_local_elements_begin (); 00258 element_iterator active_local_elements_end (); 00259 00260 element_iterator active_not_local_elements_begin (); 00261 element_iterator active_not_local_elements_end (); 00262 00263 element_iterator level_elements_begin (const unsigned int level); 00264 element_iterator level_elements_end (const unsigned int level); 00265 00266 element_iterator not_level_elements_begin (const unsigned int level); 00267 element_iterator not_level_elements_end (const unsigned int level); 00268 00269 element_iterator local_level_elements_begin (const unsigned int level); 00270 element_iterator local_level_elements_end (const unsigned int level); 00271 00272 element_iterator local_not_level_elements_begin (const unsigned int level); 00273 element_iterator local_not_level_elements_end (const unsigned int level); 00274 00275 element_iterator pid_elements_begin (const processor_id_type proc_id); 00276 element_iterator pid_elements_end (const processor_id_type proc_id); 00277 00278 element_iterator type_elements_begin (const ElemType type); 00279 element_iterator type_elements_end (const ElemType type); 00280 00281 element_iterator active_type_elements_begin (const ElemType type); 00282 element_iterator active_type_elements_end (const ElemType type); 00283 00284 element_iterator active_pid_elements_begin (const processor_id_type proc_id); 00285 element_iterator active_pid_elements_end (const processor_id_type proc_id); 00286 00287 element_iterator unpartitioned_elements_begin (); 00288 element_iterator unpartitioned_elements_end (); 00289 00290 element_iterator active_local_subdomain_elements_begin (const subdomain_id_type subdomain_id); 00291 element_iterator active_local_subdomain_elements_end (const subdomain_id_type subdomain_id); 00292 00293 element_iterator active_subdomain_elements_begin (const subdomain_id_type subdomain_id); 00294 element_iterator active_subdomain_elements_end (const subdomain_id_type subdomain_id); 00295 00299 const_element_iterator elements_begin() const; 00300 const_element_iterator elements_end() const; 00301 00302 const_element_iterator active_elements_begin() const; 00303 const_element_iterator active_elements_end() const; 00304 00305 const_element_iterator ancestor_elements_begin() const; 00306 const_element_iterator ancestor_elements_end() const; 00307 00308 const_element_iterator subactive_elements_begin() const; 00309 const_element_iterator subactive_elements_end() const; 00310 00311 const_element_iterator not_active_elements_begin() const; 00312 const_element_iterator not_active_elements_end() const; 00313 00314 const_element_iterator not_ancestor_elements_begin() const; 00315 const_element_iterator not_ancestor_elements_end() const; 00316 00317 const_element_iterator not_subactive_elements_begin() const; 00318 const_element_iterator not_subactive_elements_end() const; 00319 00320 const_element_iterator local_elements_begin () const; 00321 const_element_iterator local_elements_end () const; 00322 00323 const_element_iterator semilocal_elements_begin () const; 00324 const_element_iterator semilocal_elements_end () const; 00325 00326 const_element_iterator facelocal_elements_begin () const; 00327 const_element_iterator facelocal_elements_end () const; 00328 00329 const_element_iterator not_local_elements_begin () const; 00330 const_element_iterator not_local_elements_end () const; 00331 00332 const_element_iterator active_local_elements_begin () const; 00333 const_element_iterator active_local_elements_end () const; 00334 00335 const_element_iterator active_not_local_elements_begin () const; 00336 const_element_iterator active_not_local_elements_end () const; 00337 00338 const_element_iterator level_elements_begin (const unsigned int level) const; 00339 const_element_iterator level_elements_end (const unsigned int level) const; 00340 00341 const_element_iterator not_level_elements_begin (const unsigned int level) const; 00342 const_element_iterator not_level_elements_end (const unsigned int level) const; 00343 00344 const_element_iterator local_level_elements_begin (const unsigned int level) const; 00345 const_element_iterator local_level_elements_end (const unsigned int level) const; 00346 00347 const_element_iterator local_not_level_elements_begin (const unsigned int level) const; 00348 const_element_iterator local_not_level_elements_end (const unsigned int level) const; 00349 00350 const_element_iterator pid_elements_begin (const processor_id_type proc_id) const; 00351 const_element_iterator pid_elements_end (const processor_id_type proc_id) const; 00352 00353 const_element_iterator type_elements_begin (const ElemType type) const; 00354 const_element_iterator type_elements_end (const ElemType type) const; 00355 00356 const_element_iterator active_type_elements_begin (const ElemType type) const; 00357 const_element_iterator active_type_elements_end (const ElemType type) const; 00358 00359 const_element_iterator active_pid_elements_begin (const processor_id_type proc_id) const; 00360 const_element_iterator active_pid_elements_end (const processor_id_type proc_id) const; 00361 00362 const_element_iterator unpartitioned_elements_begin () const; 00363 const_element_iterator unpartitioned_elements_end () const; 00364 00365 const_element_iterator active_local_subdomain_elements_begin (const subdomain_id_type subdomain_id) const; 00366 const_element_iterator active_local_subdomain_elements_end (const subdomain_id_type subdomain_id) const; 00367 00368 const_element_iterator active_subdomain_elements_begin (const subdomain_id_type subdomain_id) const; 00369 const_element_iterator active_subdomain_elements_end (const subdomain_id_type subdomain_id) const; 00370 00371 00372 00373 00374 00375 00379 node_iterator nodes_begin(); 00380 node_iterator nodes_end(); 00381 00382 node_iterator active_nodes_begin(); 00383 node_iterator active_nodes_end(); 00384 00385 node_iterator local_nodes_begin (); 00386 node_iterator local_nodes_end (); 00387 00388 node_iterator pid_nodes_begin (const processor_id_type proc_id); 00389 node_iterator pid_nodes_end (const processor_id_type proc_id); 00390 00394 const_node_iterator nodes_begin() const; 00395 const_node_iterator nodes_end() const; 00396 00397 const_node_iterator active_nodes_begin() const; 00398 const_node_iterator active_nodes_end() const; 00399 00400 const_node_iterator local_nodes_begin () const; 00401 const_node_iterator local_nodes_end () const; 00402 00403 const_node_iterator pid_nodes_begin (const processor_id_type proc_id) const; 00404 const_node_iterator pid_nodes_end (const processor_id_type proc_id) const; 00405 00406 protected: 00407 00408 #ifdef LIBMESH_ENABLE_UNIQUE_ID 00409 00413 virtual void assign_unique_ids(); 00414 #endif 00415 00419 std::vector<Node*> _nodes; 00420 00424 std::vector<Elem*> _elements; 00425 00426 private: 00427 00432 void stitching_helper (SerialMesh* other_mesh, 00433 boundary_id_type boundary_id_1, 00434 boundary_id_type boundary_id_2, 00435 Real tol, 00436 bool clear_stitched_boundary_ids, 00437 bool verbose, 00438 bool use_binary_search, 00439 bool enforce_all_nodes_match_on_boundaries, 00440 bool skip_find_neighbors); 00441 00446 typedef std::vector<Elem*>::iterator elem_iterator_imp; 00447 typedef std::vector<Elem*>::const_iterator const_elem_iterator_imp; 00448 00453 typedef std::vector<Node*>::iterator node_iterator_imp; 00454 typedef std::vector<Node*>::const_iterator const_node_iterator_imp; 00455 }; 00456 00457 00458 00459 } // namespace libMesh 00460 00461 00462 00463 #endif // LIBMESH_SERIAL_MESH_H