14 #include <stk_mesh/baseImpl/BucketImpl.hpp> 15 #include <stk_mesh/base/Bucket.hpp> 16 #include <stk_mesh/base/BulkData.hpp> 17 #include <stk_mesh/base/FindRestriction.hpp> 28 void memory_copy(
unsigned char * dst ,
const unsigned char * src ,
unsigned n )
29 { std::memcpy( dst , src , n ); }
32 void memory_zero(
unsigned char * dst ,
unsigned n )
33 { std::memset( dst , 0 , n ); }
39 void BucketImpl::update_state()
41 const MetaData & meta = MetaData::get(m_mesh);
42 const std::vector<FieldBase*> & field_set = meta.get_fields();
44 for (
unsigned i = 0 ; i < field_set.size() ; ) {
46 DataMap *
const tmp = &m_field_map[0] + i ;
47 const FieldBase & field = * field_set[i] ;
48 const unsigned num_state = field.number_of_states();
51 if ( 1 < num_state && tmp->m_size ) {
52 unsigned offset[ MaximumFieldStates ] ;
54 offset[0] = tmp[num_state-1].m_base;
55 for (
unsigned j = 1 ; j < num_state ; ++j ) {
56 offset[j] = tmp[j-1].m_base ;
59 for (
unsigned j = 0 ; j < num_state ; ++j ) {
60 tmp[j].m_base = offset[j] ;
70 Bucket * BucketImpl::last_bucket_in_family()
const 72 Bucket * last = last_bucket_in_family_impl();
74 ThrowRequireMsg( NULL != last,
"Last is NULL");
75 ThrowRequireMsg( last->size() != 0,
"Last bucket is empty");
80 Bucket * BucketImpl::last_bucket_in_family_impl()
const 82 bool this_is_first_bucket_in_family = (bucket_counter() == 0);
86 if (this_is_first_bucket_in_family) {
89 last = m_bucket->m_bucketImpl.m_bucket;
97 Bucket * BucketImpl::first_bucket_in_family()
const 99 return last_bucket_in_family_impl()->m_bucketImpl.m_bucket;
104 void BucketImpl::set_last_bucket_in_family( Bucket * last_bucket )
106 Bucket * last = last_bucket_in_family_impl();
107 Bucket * first = last->m_bucketImpl.m_bucket;
108 first->m_bucketImpl.m_bucket = last_bucket;
113 void BucketImpl::set_first_bucket_in_family( Bucket * first_bucket )
115 m_bucket = first_bucket;
120 BucketImpl::DataMap * BucketImpl::get_field_map()
122 return &m_field_map[0];
127 void BucketImpl::initialize_fields(
unsigned i_dst )
129 const std::vector<FieldBase*> & field_set =
130 MetaData::get(m_mesh).get_fields();
132 unsigned char *
const p = m_field_data;
133 const DataMap * i = &m_field_map[0];
134 const DataMap *
const e = i + field_set.size();
136 for (std::vector<FieldBase*>::const_iterator field_iter=field_set.begin() ;
137 i != e ; ++i, ++field_iter ) {
139 if (i->m_size == 0) {
143 const unsigned char* init_val =
reinterpret_cast<const unsigned char*
>((*field_iter)->get_initial_value());
144 if (init_val != NULL) {
145 memory_copy( p + i->m_base + i->m_size * i_dst , init_val, i->m_size );
148 memory_zero( p + i->m_base + i->m_size * i_dst , i->m_size );
153 void BucketImpl::replace_fields(
unsigned i_dst , Bucket & k_src ,
unsigned i_src )
155 const std::vector<FieldBase*> & field_set =
156 MetaData::get(m_mesh).get_fields();
158 unsigned char *
const s = k_src.m_bucketImpl.m_field_data;
159 unsigned char *
const d = m_field_data;
160 const DataMap * j = &(k_src.m_bucketImpl.m_field_map[0]);
161 const DataMap * i = &m_field_map[0];
162 const DataMap *
const e = i + field_set.size();
164 for (std::vector<FieldBase*>::const_iterator field_iter=field_set.begin() ;
165 i != e ; ++i , ++j, ++field_iter ) {
169 ThrowAssertMsg( i->m_size == j->m_size,
170 "Incompatible field sizes: " << i->m_size <<
" != " << j->m_size );
172 memory_copy( d + i->m_base + i->m_size * i_dst ,
173 s + j->m_base + j->m_size * i_src , i->m_size );
176 const unsigned char* init_val =
reinterpret_cast<const unsigned char*
>((*field_iter)->get_initial_value());
177 if (init_val != NULL) {
178 memory_copy( d + i->m_base + i->m_size * i_dst ,
179 init_val, i->m_size );
182 memory_zero( d + i->m_base + i->m_size * i_dst , i->m_size );
191 inline unsigned align(
size_t nb )
193 enum { BYTE_ALIGN = 16 };
194 const unsigned gap = nb % BYTE_ALIGN ;
195 if ( gap ) { nb += BYTE_ALIGN - gap ; }
202 BucketImpl::BucketImpl( BulkData & arg_mesh,
203 EntityRank arg_entity_rank,
204 const std::vector<unsigned> & arg_key,
208 , m_entity_rank(arg_entity_rank)
210 , m_capacity(arg_capacity)
213 , m_field_map( m_mesh.mesh_meta_data().get_fields().size()+1)
214 , m_entities(arg_capacity)
216 , m_field_data_end(NULL)
220 const std::vector< FieldBase * > & field_set =
221 arg_mesh.mesh_meta_data().get_fields();
223 const size_t num_fields = field_set.size();
227 if (arg_capacity != 0) {
228 for (
size_t i = 0; i<num_fields; ++i) {
229 const FieldBase & field = * field_set[i] ;
230 unsigned num_bytes_per_entity = 0 ;
232 const FieldBase::Restriction & restriction =
233 find_restriction( field, arg_entity_rank, &m_key[1], &m_key[1]+(m_key[0]-1), PartOrdLess());
235 if ( restriction.dimension() > 0 ) {
237 const unsigned type_stride = field.data_traits().stride_of ;
238 const unsigned field_rank = field.rank();
240 num_bytes_per_entity = type_stride *
241 ( field_rank ? restriction.stride( field_rank - 1 ) : 1 );
244 m_field_map[i].m_size = num_bytes_per_entity ;
245 m_field_map[i].m_stride = &restriction.stride(0);
251 m_field_map[ num_fields ].m_size = 0 ;
252 m_field_map[ num_fields ].m_stride = NULL ;
256 FieldBase::Restriction::size_type empty_stride[ MaximumFieldDimension ];
257 Copy<MaximumFieldDimension>( empty_stride , FieldBase::Restriction::size_type(0) );
259 for (
size_t i = 0; i<num_fields; ++i) {
260 m_field_map[i].m_base = 0 ;
261 m_field_map[i].m_size = 0 ;
262 m_field_map[i].m_stride = empty_stride;
264 m_field_map[ num_fields ].m_base = 0 ;
265 m_field_map[ num_fields ].m_size = 0 ;
266 m_field_map[ num_fields ].m_stride = NULL ;
unsigned field_data_size(const FieldBase &field) const
Query the size of this field data specified by FieldBase.