Sierra Toolkit Version of the Day
BucketRepository.hpp
00001 /*------------------------------------------------------------------------*/
00002 /*                 Copyright 2010 Sandia Corporation.                     */
00003 /*  Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive   */
00004 /*  license for use of this work by or on behalf of the U.S. Government.  */
00005 /*  Export of this program may require a license from the                 */
00006 /*  United States Government.                                             */
00007 /*------------------------------------------------------------------------*/
00008 
00009 #ifndef stk_mesh_BucketRepository_hpp
00010 #define stk_mesh_BucketRepository_hpp
00011 
00012 #include <stk_mesh/base/Types.hpp>
00013 #include <stk_mesh/base/Bucket.hpp>
00014 #include <stk_mesh/base/Iterators.hpp>
00015 
00016 namespace stk {
00017 namespace mesh {
00018 namespace impl {
00019 
00020 class EntityRepository;
00021 
00022 class BucketRepository {
00023 public:
00024   ~BucketRepository();
00025   BucketRepository(
00026       BulkData & mesh,
00027       unsigned bucket_capacity,
00028       unsigned entity_rank_count,
00029       EntityRepository & entity_repo
00030       );
00031 
00033   const std::vector<Bucket*> & buckets( EntityRank rank ) const ;
00034 
00035   /*  Entity modification consequences:
00036    *  1) Change entity relation => update via part relation => change parts
00037    *  2) Change parts => update forward relations via part relation
00038    *                  => update via field relation
00039    */
00040   void remove_entity( Bucket * , unsigned );
00041 
00042   //------------------------------------
00046   unsigned bucket_capacity() const { return m_bucket_capacity; }
00047 
00048 
00049   //------------------------------------
00050 
00062   void update_field_data_states() const ;
00063 
00064   // Destroy the last empty bucket in a family:
00065   void destroy_bucket( const unsigned & entity_rank , Bucket * last );
00066   void destroy_bucket( Bucket * bucket );
00067   void declare_nil_bucket();
00068   Bucket * get_nil_bucket() const { return m_nil_bucket; }
00069   Bucket * declare_bucket(
00070       const unsigned entity_rank ,
00071       const unsigned part_count ,
00072       const unsigned part_ord[] ,
00073       const std::vector< FieldBase * > & field_set
00074       );
00075   void copy_fields( Bucket & k_dst , unsigned i_dst ,
00076                            Bucket & k_src , unsigned i_src );
00077   void zero_fields( Bucket & k_dst , unsigned i_dst );
00078 
00079   void internal_sort_bucket_entities();
00080 
00081   void add_entity_to_bucket( Entity & entity, Bucket & bucket )
00082   {
00083     bucket.m_bucketImpl.replace_entity( bucket.size() , & entity ) ;
00084     bucket.m_bucketImpl.increment_size();
00085   }
00086 
00087   void internal_propagate_relocation( Entity & );
00088 
00089   AllBucketsRange get_bucket_range() const
00090   {
00091     return stk::mesh::get_bucket_range(m_buckets);
00092   }
00093 
00094   AllBucketsRange get_bucket_range(EntityRank entity_rank) const
00095   {
00096     std::vector< std::vector<Bucket*> >::const_iterator itr = m_buckets.begin() + entity_rank;
00097     return stk::mesh::get_bucket_range(m_buckets, itr);
00098   }
00099 
00100 private:
00101   BucketRepository();
00102 
00103   BulkData                            & m_mesh ; // Associated Bulk Data Aggregate
00104   unsigned                              m_bucket_capacity ; // Maximum number of entities per bucket
00105   std::vector< std::vector<Bucket*> >   m_buckets ; // Vector of bucket pointers by rank
00106   Bucket                              * m_nil_bucket ; // nil bucket
00107 
00108   EntityRepository                    & m_entity_repo ;
00109 };
00110 
00111 
00112 
00113 } // namespace impl
00114 } // namespace mesh
00115 } // namespace stk
00116 
00117 
00118 #endif // stk_mesh_BucketRepository_hpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends