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