00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __mesh_base_h__
00023 #define __mesh_base_h__
00024
00025
00026
00027
00028 #include <string>
00029
00030
00031 class Elem;
00032 class Node;
00033 class Point;
00034 class BoundaryInfo;
00035 class PointLocatorBase;
00036 class MeshData;
00037
00038
00039 #include "auto_ptr.h"
00040 #include "dof_object.h"
00041 #include "enum_elem_type.h"
00042 #include "libmesh_common.h"
00043 #include "multi_predicates.h"
00044 #include "partitioner.h"
00045 #include "variant_filter_iterator.h"
00046
00047
00048
00049
00067
00068
00069 class MeshBase
00070 {
00071 public:
00072
00076 MeshBase (unsigned int d);
00077
00081 MeshBase (const MeshBase& other_mesh);
00082
00086 virtual AutoPtr<MeshBase> clone() const = 0;
00087
00091 virtual ~MeshBase ();
00092
00098 AutoPtr<BoundaryInfo> boundary_info;
00099
00103 virtual AutoPtr<Partitioner> &partitioner() { return _partitioner; }
00104
00108 virtual void clear ();
00109
00114 bool is_prepared () const
00115 { return _is_prepared; }
00116
00121 virtual bool is_serial () const
00122 { return true; }
00123
00128 virtual void allgather () {}
00129
00135 virtual void delete_remote_elements () {}
00136
00140 unsigned int mesh_dimension () const
00141 { return static_cast<unsigned int>(_dim); }
00142
00147 void set_mesh_dimension (unsigned int d)
00148 { libmesh_assert(!this->n_elem()); _dim = d; }
00149
00154 unsigned int spatial_dimension () const
00155 { return static_cast<unsigned int>(LIBMESH_DIM); }
00156
00162 virtual unsigned int n_nodes () const = 0;
00163
00167 unsigned int n_nodes_on_proc (const unsigned int proc) const;
00168
00172 unsigned int n_local_nodes () const
00173 { return this->n_nodes_on_proc (libMesh::processor_id()); }
00174
00178 unsigned int n_unpartitioned_nodes () const
00179 { return this->n_nodes_on_proc (DofObject::invalid_processor_id); }
00180
00185 virtual unsigned int max_node_id () const = 0;
00186
00194 virtual void reserve_nodes (const unsigned int nn) = 0;
00195
00199 virtual unsigned int n_elem () const = 0;
00200
00205 virtual unsigned int max_elem_id () const = 0;
00206
00214 virtual void reserve_elem (const unsigned int ne) = 0;
00215
00220 virtual void update_parallel_id_counts () = 0;
00221
00226 virtual unsigned int n_active_elem () const = 0;
00227
00231 unsigned int n_elem_on_proc (const unsigned int proc) const;
00232
00236 unsigned int n_local_elem () const
00237 { return this->n_elem_on_proc (libMesh::processor_id()); }
00238
00242 unsigned int n_unpartitioned_elem () const
00243 { return this->n_elem_on_proc (DofObject::invalid_processor_id); }
00244
00248 unsigned int n_active_elem_on_proc (const unsigned int proc) const;
00249
00253 unsigned int n_active_local_elem () const
00254 { return this->n_active_elem_on_proc (libMesh::processor_id()); }
00255
00263 unsigned int n_sub_elem () const;
00264
00268 unsigned int n_active_sub_elem () const;
00269
00274 virtual const Point& point (const unsigned int i) const = 0;
00275
00280 virtual const Node& node (const unsigned int i) const = 0;
00281
00285 virtual Node& node (const unsigned int i) = 0;
00286
00290 virtual const Node* node_ptr (const unsigned int i) const = 0;
00291
00295 virtual Node* & node_ptr (const unsigned int i) = 0;
00296
00300 virtual Elem* elem (const unsigned int i) const = 0;
00301
00312 virtual Node* add_point (const Point& p,
00313 const unsigned int id = DofObject::invalid_id,
00314 const unsigned int proc_id =
00315 DofObject::invalid_processor_id) = 0;
00316
00320 virtual Node* add_node (Node* n) = 0;
00321
00325 virtual void delete_node (Node* n) = 0;
00326
00332 virtual void renumber_node (unsigned int old_id, unsigned int new_id) = 0;
00333
00340 virtual Elem* add_elem (Elem* e) = 0;
00341
00346 virtual Elem* insert_elem (Elem* e) = 0;
00347
00354 virtual void delete_elem (Elem* e) = 0;
00355
00361 virtual void renumber_elem (unsigned int old_id, unsigned int new_id) = 0;
00362
00375 virtual void find_neighbors (const bool reset_remote_elements = false,
00376 const bool reset_current_list = true) = 0;
00377
00383 virtual void renumber_nodes_and_elements () = 0;
00384
00385 #ifdef LIBMESH_ENABLE_AMR
00386
00391 virtual bool contract () = 0;
00392 #endif
00393
00406 void prepare_for_use (const bool skip_renumber_nodes_and_elements=false);
00407
00411 void partition (const unsigned int n_parts=libMesh::n_processors());
00412
00420 unsigned int n_subdomains () const;
00421
00428 unsigned int n_partitions () const
00429 { return _n_parts; }
00430
00435 unsigned int n_processors () const
00436 { return libMesh::n_processors(); }
00437
00441 unsigned int processor_id () const
00442 { return libMesh::processor_id(); }
00443
00448 std::string get_info () const;
00449
00453 void print_info (std::ostream& os=std::cout) const;
00454
00460 friend std::ostream& operator << (std::ostream& os, const MeshBase& m);
00461
00466 virtual void read (const std::string& name, MeshData* mesh_data=NULL,
00467 bool skip_renumber_nodes_and_elements=false) = 0;
00468 virtual void write (const std::string& name, MeshData* mesh_data=NULL) = 0;
00469
00476 virtual void all_first_order () = 0;
00477
00489 virtual void all_second_order (const bool full_ordered=true) = 0;
00490
00495 typedef Predicates::multi_predicate Predicate;
00496
00503 struct element_iterator;
00504 struct const_element_iterator;
00505
00512 struct node_iterator;
00513 struct const_node_iterator;
00514
00524 unsigned int recalculate_n_partitions();
00525
00530 const PointLocatorBase & point_locator () const;
00531
00535 void clear_point_locator ();
00536
00537
00538
00539 public:
00540
00541
00542
00547 virtual element_iterator elements_begin () = 0;
00548 virtual element_iterator elements_end () = 0;
00549 virtual element_iterator active_elements_begin () = 0;
00550 virtual element_iterator active_elements_end () = 0;
00551 virtual element_iterator ancestor_elements_begin () = 0;
00552 virtual element_iterator ancestor_elements_end () = 0;
00553 virtual element_iterator subactive_elements_begin () = 0;
00554 virtual element_iterator subactive_elements_end () = 0;
00555 virtual element_iterator not_active_elements_begin () = 0;
00556 virtual element_iterator not_active_elements_end () = 0;
00557 virtual element_iterator not_ancestor_elements_begin () = 0;
00558 virtual element_iterator not_ancestor_elements_end () = 0;
00559 virtual element_iterator not_subactive_elements_begin () = 0;
00560 virtual element_iterator not_subactive_elements_end () = 0;
00561 virtual element_iterator local_elements_begin () = 0;
00562 virtual element_iterator local_elements_end () = 0;
00563 virtual element_iterator not_local_elements_begin () = 0;
00564 virtual element_iterator not_local_elements_end () = 0;
00565 virtual element_iterator active_local_elements_begin () = 0;
00566 virtual element_iterator active_local_elements_end () = 0;
00567 virtual element_iterator active_not_local_elements_begin () = 0;
00568 virtual element_iterator active_not_local_elements_end () = 0;
00569 virtual element_iterator level_elements_begin (const unsigned int level ) = 0;
00570 virtual element_iterator level_elements_end (const unsigned int level ) = 0;
00571 virtual element_iterator not_level_elements_begin (const unsigned int level ) = 0;
00572 virtual element_iterator not_level_elements_end (const unsigned int level ) = 0;
00573 virtual element_iterator local_level_elements_begin (const unsigned int level ) = 0;
00574 virtual element_iterator local_level_elements_end (const unsigned int level ) = 0;
00575 virtual element_iterator local_not_level_elements_begin (const unsigned int level ) = 0;
00576 virtual element_iterator local_not_level_elements_end (const unsigned int level ) = 0;
00577 virtual element_iterator pid_elements_begin (const unsigned int proc_id) = 0;
00578 virtual element_iterator pid_elements_end (const unsigned int proc_id) = 0;
00579 virtual element_iterator type_elements_begin (const ElemType type ) = 0;
00580 virtual element_iterator type_elements_end (const ElemType type ) = 0;
00581 virtual element_iterator active_type_elements_begin (const ElemType type ) = 0;
00582 virtual element_iterator active_type_elements_end (const ElemType type ) = 0;
00583 virtual element_iterator active_pid_elements_begin (const unsigned int proc_id) = 0;
00584 virtual element_iterator active_pid_elements_end (const unsigned int proc_id) = 0;
00585 virtual element_iterator unpartitioned_elements_begin () = 0;
00586 virtual element_iterator unpartitioned_elements_end () = 0;
00587 virtual element_iterator active_local_subdomain_elements_begin (const unsigned int subdomain_id) = 0;
00588 virtual element_iterator active_local_subdomain_elements_end (const unsigned int subdomain_id) = 0;
00589
00590
00591
00592
00596 virtual const_element_iterator elements_begin () const = 0;
00597 virtual const_element_iterator elements_end () const = 0;
00598 virtual const_element_iterator active_elements_begin () const = 0;
00599 virtual const_element_iterator active_elements_end () const = 0;
00600 virtual const_element_iterator ancestor_elements_begin () const = 0;
00601 virtual const_element_iterator ancestor_elements_end () const = 0;
00602 virtual const_element_iterator subactive_elements_begin () const = 0;
00603 virtual const_element_iterator subactive_elements_end () const = 0;
00604 virtual const_element_iterator not_active_elements_begin () const = 0;
00605 virtual const_element_iterator not_active_elements_end () const = 0;
00606 virtual const_element_iterator not_ancestor_elements_begin () const = 0;
00607 virtual const_element_iterator not_ancestor_elements_end () const = 0;
00608 virtual const_element_iterator not_subactive_elements_begin () const = 0;
00609 virtual const_element_iterator not_subactive_elements_end () const = 0;
00610 virtual const_element_iterator local_elements_begin () const = 0;
00611 virtual const_element_iterator local_elements_end () const = 0;
00612 virtual const_element_iterator not_local_elements_begin () const = 0;
00613 virtual const_element_iterator not_local_elements_end () const = 0;
00614 virtual const_element_iterator active_local_elements_begin () const = 0;
00615 virtual const_element_iterator active_local_elements_end () const = 0;
00616 virtual const_element_iterator active_not_local_elements_begin () const = 0;
00617 virtual const_element_iterator active_not_local_elements_end () const = 0;
00618 virtual const_element_iterator level_elements_begin (const unsigned int level) const = 0;
00619 virtual const_element_iterator level_elements_end (const unsigned int level) const = 0;
00620 virtual const_element_iterator not_level_elements_begin (const unsigned int level) const = 0;
00621 virtual const_element_iterator not_level_elements_end (const unsigned int level) const = 0;
00622 virtual const_element_iterator local_level_elements_begin (const unsigned int level) const = 0;
00623 virtual const_element_iterator local_level_elements_end (const unsigned int level) const = 0;
00624 virtual const_element_iterator local_not_level_elements_begin (const unsigned int level) const = 0;
00625 virtual const_element_iterator local_not_level_elements_end (const unsigned int level) const = 0;
00626 virtual const_element_iterator pid_elements_begin (const unsigned int proc_id) const = 0;
00627 virtual const_element_iterator pid_elements_end (const unsigned int proc_id) const = 0;
00628 virtual const_element_iterator type_elements_begin (const ElemType type) const = 0;
00629 virtual const_element_iterator type_elements_end (const ElemType type) const = 0;
00630 virtual const_element_iterator active_type_elements_begin (const ElemType type) const = 0;
00631 virtual const_element_iterator active_type_elements_end (const ElemType type) const = 0;
00632 virtual const_element_iterator active_pid_elements_begin (const unsigned int proc_id) const = 0;
00633 virtual const_element_iterator active_pid_elements_end (const unsigned int proc_id) const = 0;
00634 virtual const_element_iterator unpartitioned_elements_begin () const = 0;
00635 virtual const_element_iterator unpartitioned_elements_end () const = 0;
00636 virtual const_element_iterator active_local_subdomain_elements_begin (const unsigned int subdomain_id) const = 0;
00637 virtual const_element_iterator active_local_subdomain_elements_end (const unsigned int subdomain_id) const = 0;
00638
00639
00643 virtual node_iterator nodes_begin () = 0;
00644 virtual node_iterator nodes_end () = 0;
00645 virtual node_iterator active_nodes_begin () = 0;
00646 virtual node_iterator active_nodes_end () = 0;
00647 virtual node_iterator local_nodes_begin () = 0;
00648 virtual node_iterator local_nodes_end () = 0;
00649 virtual node_iterator pid_nodes_begin (const unsigned int proc_id) = 0;
00650 virtual node_iterator pid_nodes_end (const unsigned int proc_id) = 0;
00651
00652
00656 virtual const_node_iterator nodes_begin () const = 0;
00657 virtual const_node_iterator nodes_end () const = 0;
00658 virtual const_node_iterator active_nodes_begin () const = 0;
00659 virtual const_node_iterator active_nodes_end () const = 0;
00660 virtual const_node_iterator local_nodes_begin () const = 0;
00661 virtual const_node_iterator local_nodes_end () const = 0;
00662 virtual const_node_iterator pid_nodes_begin (const unsigned int proc_id) const = 0;
00663 virtual const_node_iterator pid_nodes_end (const unsigned int proc_id) const = 0;
00664
00665
00666
00667 protected:
00668
00669
00670
00671
00672
00673
00677 unsigned int& set_n_partitions ()
00678 { return _n_parts; }
00679
00689 unsigned int _n_parts;
00690
00694 unsigned int _dim;
00695
00699 bool _is_prepared;
00700
00708 mutable AutoPtr<PointLocatorBase> _point_locator;
00709
00716 AutoPtr<Partitioner> _partitioner;
00717
00722 friend class Partitioner;
00723
00728 friend class BoundaryInfo;
00729
00730 };
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00745 struct
00746 MeshBase::element_iterator :
00747 variant_filter_iterator<MeshBase::Predicate,
00748 Elem*>
00749 {
00750
00751 template <typename PredType, typename IterType>
00752 element_iterator (const IterType& d,
00753 const IterType& e,
00754 const PredType& p ) :
00755 variant_filter_iterator<MeshBase::Predicate,
00756 Elem*>(d,e,p) {}
00757 };
00758
00759
00760
00761
00766 struct
00767 MeshBase::const_element_iterator :
00768 variant_filter_iterator<MeshBase::Predicate,
00769 Elem* const,
00770 Elem* const&,
00771 Elem* const*>
00772 {
00773
00774 template <typename PredType, typename IterType>
00775 const_element_iterator (const IterType& d,
00776 const IterType& e,
00777 const PredType& p ) :
00778 variant_filter_iterator<MeshBase::Predicate,
00779 Elem* const,
00780 Elem* const&,
00781 Elem* const*>(d,e,p) {}
00782
00783
00784
00785
00786 const_element_iterator (const MeshBase::element_iterator& rhs) :
00787 variant_filter_iterator<Predicate,
00788 Elem* const,
00789 Elem* const&,
00790 Elem* const*>(rhs)
00791 {
00792
00793 }
00794 };
00795
00796
00797
00798
00799
00800
00801
00805 struct
00806 MeshBase::node_iterator :
00807 variant_filter_iterator<MeshBase::Predicate,
00808 Node*>
00809 {
00810
00811 template <typename PredType, typename IterType>
00812 node_iterator (const IterType& d,
00813 const IterType& e,
00814 const PredType& p ) :
00815 variant_filter_iterator<MeshBase::Predicate,
00816 Node*>(d,e,p) {}
00817 };
00818
00819
00820
00821
00826 struct
00827 MeshBase::const_node_iterator :
00828 variant_filter_iterator<MeshBase::Predicate,
00829 Node* const,
00830 Node* const &,
00831 Node* const *>
00832 {
00833
00834 template <typename PredType, typename IterType>
00835 const_node_iterator (const IterType& d,
00836 const IterType& e,
00837 const PredType& p ) :
00838 variant_filter_iterator<MeshBase::Predicate,
00839 Node* const,
00840 Node* const &,
00841 Node* const *>(d,e,p) {}
00842
00843
00844
00845
00846 const_node_iterator (const MeshBase::node_iterator& rhs) :
00847 variant_filter_iterator<Predicate,
00848 Node* const,
00849 Node* const &,
00850 Node* const *>(rhs)
00851 {
00852
00853 }
00854 };
00855
00856
00857 #endif