38 int IFACE_START, IFACE_END;
39 int GHOST_START, GHOST_END;
40 int SHAREDV_START, SHAREDV_END;
41 int RESOLVE_START, RESOLVE_END;
42 int ENTITIES_START, ENTITIES_END;
43 int RHANDLES_START, RHANDLES_END;
44 int OWNED_START, OWNED_END;
54 std::vector< ParallelComm::Buffer* >
msgs;
58 #ifdef DEBUG_PACKING_TIMES
61 if( __PACK_num == (unsigned int)n && __PACK_string == m ) \
65 if( __PACK_count > 1 ) std::cerr << " (" << __PACK_count << "x)"; \
69 std::cerr << std::endl << "PACK: " << n << m; \
74 if( __UNPACK_num == (unsigned int)n && __UNPACK_string == m ) \
78 if( __UNPACK_count > 1 ) std::cerr << "(" << __UNPACK_count << "x)"; \
80 __UNPACK_string = m; \
82 std::cerr << std::endl << "UNPACK: " << n << m; \
90 template <
typename T >
91 static inline void UNPACK(
unsigned char*& buff, T* val,
size_t count )
93 memcpy( val, buff, count *
sizeof( T ) );
94 buff += count *
sizeof( T );
97 template <
typename T >
98 static inline void PACK(
unsigned char*& buff,
const T* val,
size_t count )
100 memcpy( buff, val, count *
sizeof( T ) );
101 buff += count *
sizeof( T );
104 static inline void PACK_INTS(
unsigned char*& buff,
const int* int_val,
size_t num )
106 PACK( buff, int_val, num );
110 static inline void PACK_INT(
unsigned char*& buff,
int int_val )
115 static inline void PACK_DBLS(
unsigned char*& buff,
const double* dbl_val,
size_t num )
117 PACK( buff, dbl_val, num );
118 PC( num,
" doubles" );
127 PACK( buff, eh_val, num );
128 PC( num,
" handles" );
139 static inline void PACK_VOID(
unsigned char*& buff,
const void* val,
size_t num )
141 PACK( buff,
reinterpret_cast< const unsigned char*
>( val ), num );
145 static inline void PACK_BYTES(
unsigned char*& buff,
const void* val,
int num )
160 PC( rng.
psize(),
"-subranged range" );
163 static inline void UNPACK_INTS(
unsigned char*& buff,
int* int_val,
size_t num )
165 UNPACK( buff, int_val, num );
169 static inline void UNPACK_INT(
unsigned char*& buff,
int& int_val )
174 static inline void UNPACK_DBLS(
unsigned char*& buff,
double* dbl_val,
size_t num )
176 UNPACK( buff, dbl_val, num );
177 UPC( num,
" doubles" );
180 static inline void UNPACK_DBL(
unsigned char*& buff,
double& dbl_val )
187 UNPACK( buff, eh_val, num );
188 UPC( num,
" handles" );
199 static inline void UNPACK_VOID(
unsigned char*& buff,
void* val,
size_t num )
201 UNPACK( buff,
reinterpret_cast< unsigned char*
>( val ), num );
205 static inline void UNPACK_TYPE(
unsigned char*& buff, EntityType& type )
209 type =
static_cast< EntityType
>( int_type );
218 for(
int i = 0; i < num_subs; i++ )
220 UPC( num_subs,
"-subranged range" );
222 rng.
insert( eh[0], eh[1] );
245 #define PRINT_DEBUG_ISEND( A, B, C, D, E ) print_debug_isend( ( A ), ( B ), ( C ), ( D ), ( E ) )
246 #define PRINT_DEBUG_IRECV( A, B, C, D, E, F ) print_debug_irecv( ( A ), ( B ), ( C ), ( D ), ( E ), ( F ) )
247 #define PRINT_DEBUG_RECD( A ) print_debug_recd( ( A ) )
248 #define PRINT_DEBUG_WAITANY( A, B, C ) print_debug_waitany( ( A ), ( B ), ( C ) )
252 myDebug->
tprintf( 3,
"Isend, %d->%d, buffer ptr = %p, tag=%d, size=%d\n", from, to, (
void*)buff, tag, sz );
257 myDebug->
tprintf( 3,
"Irecv, %d<-%d, buffer ptr = %p, tag=%d, size=%d", to, from, (
void*)buff, tag, sz );
271 int success = MPI_Get_count( &status, MPI_UNSIGNED_CHAR, &this_count );
272 if( MPI_SUCCESS != success ) this_count = -1;
273 myDebug->
tprintf( 3,
"Received from %d, count = %d, tag = %d\n", status.MPI_SOURCE, this_count,
289 for(
unsigned int i = 0; i < reqs.size(); i++ )
311 #define PARALLEL_COMM_TAG_NAME "__PARALLEL_COMM"
314 : mbImpl( impl ), procConfig( cm ), sharedpTag( 0 ), sharedpsTag( 0 ), sharedhTag( 0 ), sharedhsTag( 0 ),
315 pstatusTag( 0 ), ifaceSetsTag( 0 ), partitionTag( 0 ), globalPartCount( -1 ), partitioningSet( 0 ),
324 : mbImpl( impl ), procConfig( cm ), sharedpTag( 0 ), sharedpsTag( 0 ), sharedhTag( 0 ), sharedhsTag( 0 ),
325 pstatusTag( 0 ), ifaceSetsTag( 0 ), partitionTag( 0 ), globalPartCount( -1 ), partitioningSet( 0 ),
349 int retval = MPI_Initialized( &flag );
350 if( MPI_SUCCESS != retval || !flag )
356 retval = MPI_Init( &argc, &argv );
357 assert( MPI_SUCCESS == retval );
379 assert( 0 != pc_tag );
394 pc_array[
index] = pc;
408 std::vector< ParallelComm* >::iterator pc_it = std::find( pc_array.begin(), pc_array.end(), pc );
409 assert(
MB_SUCCESS == result && pc_it != pc_array.end() );
424 const bool largest_dim_only,
426 const bool owned_only )
430 std::vector< unsigned char > pstatus;
431 for(
int dim = 0; dim <= dimension; dim++ )
433 if( dim == 0 || !largest_dim_only || dim == dimension )
436 MB_CHK_SET_ERR( result,
"Failed to get vertices in assign_global_ids" );
440 pstatus.resize( entities[dim].
size() );
442 MB_CHK_SET_ERR( result,
"Failed to get pstatus in assign_global_ids" );
447 for( rit = entities[dim].begin(), i = 0; rit != entities[dim].
end(); ++rit, i++ )
449 entities[dim] =
subtract( entities[dim], dum_range );
461 const bool owned_only )
463 int local_num_elements[4];
465 for(
int dim = 0; dim <= dimension; dim++ )
467 local_num_elements[dim] = entities[dim].
size();
476 MPI_Allgather( local_num_elements, 4, MPI_INT, num_elements.data(), 4, MPI_INT,
procConfig.
proc_comm() );
477 if( 0 != retval )
return MB_FAILURE;
481 for(
int dim = 0; dim < 4; dim++ )
482 num_elements[dim] = local_num_elements[dim];
485 int total_elems[4] = { start_id, start_id, start_id, start_id };
489 for(
int dim = 0; dim < 4; dim++ )
490 total_elems[dim] += num_elements[4 * proc + dim];
496 for(
int dim = 0; dim < 4; dim++ )
498 if( entities[dim].empty() )
continue;
499 num_elements.resize( entities[dim].
size() );
502 num_elements[i++] = total_elems[dim]++;
505 MB_CHK_SET_ERR( result,
"Failed to set global id tag in assign_global_ids" );
511 for(
int dim = 1; dim < 4; dim++ )
512 entities[0].merge( entities[dim] );
520 std::vector< unsigned int >::iterator vit = std::find(
buffProcs.begin(),
buffProcs.end(), to_proc );
525 buffProcs.push_back( (
unsigned int)to_proc );
528 if( is_new ) *is_new =
true;
533 if( is_new ) *is_new =
false;
541 const bool adjacencies,
544 #ifndef MOAB_HAVE_MPI
560 result =
pack_buffer( entities, adjacencies, tags,
false, -1, &buff );
561 MB_CHK_SET_ERR( result,
"Failed to compute buffer size in broadcast_entities" );
567 if( MPI_SUCCESS != success )
569 MB_SET_ERR( MB_FAILURE,
"MPI_Bcast of buffer size failed" );
582 if( MPI_SUCCESS != success )
584 MB_SET_ERR( MB_FAILURE,
"MPI_Bcast of buffer failed" );
593 std::vector< std::vector< EntityHandle > > dum1a, dum1b;
594 std::vector< std::vector< int > > dum1p;
595 std::vector< EntityHandle > dum2, dum4;
596 std::vector< unsigned int > dum3;
598 result =
unpack_buffer( buff.
buff_ptr,
false, from_proc, -1, dum1a, dum1b, dum1p, dum2, dum2, dum3, dum4 );
599 MB_CHK_SET_ERR( result,
"Failed to unpack buffer in broadcast_entities" );
600 std::copy( dum4.begin(), dum4.end(),
range_inserter( entities ) );
608 std::vector< Range >& entities,
609 const bool adjacencies,
612 #ifndef MOAB_HAVE_MPI
616 int i, success, buff_size, prev_size;
618 int* sendCounts =
new int[nProcs];
619 int* displacements =
new int[nProcs];
620 sendCounts[0] =
sizeof( int );
621 displacements[0] = 0;
628 if( my_proc == (
unsigned int)from_proc )
630 for( i = 1; i < nProcs; i++ )
633 buff.
reset_ptr( prev_size +
sizeof(
int ) );
637 result =
pack_buffer( entities[i], adjacencies, tags,
false, -1, &buff );
641 delete[] displacements;
642 MB_SET_ERR( result,
"Failed to pack buffer in scatter_entities" );
646 *( (
int*)( buff.
mem_ptr + prev_size ) ) = buff_size;
647 sendCounts[i] = buff_size;
653 if( MPI_SUCCESS != success )
656 delete[] displacements;
657 MB_SET_ERR( MB_FAILURE,
"MPI_Bcast of buffer size failed" );
660 for( i = 1; i < nProcs; i++ )
662 displacements[i] = displacements[i - 1] + sendCounts[i - 1];
666 rec_buff.
reserve( sendCounts[my_proc] );
669 success = MPI_Scatterv( buff.
mem_ptr, sendCounts, displacements, MPI_UNSIGNED_CHAR, rec_buff.
mem_ptr,
672 if( MPI_SUCCESS != success )
675 delete[] displacements;
676 MB_SET_ERR( MB_FAILURE,
"MPI_Scatterv of buffer failed" );
680 if( my_proc != (
unsigned int)from_proc )
682 std::vector< std::vector< EntityHandle > > dum1a, dum1b;
683 std::vector< std::vector< int > > dum1p;
684 std::vector< EntityHandle > dum2, dum4;
685 std::vector< unsigned int > dum3;
687 result =
unpack_buffer( rec_buff.
buff_ptr,
false, from_proc, -1, dum1a, dum1b, dum1p, dum2, dum2, dum3, dum4 );
691 delete[] displacements;
692 MB_SET_ERR( result,
"Failed to unpack buffer in scatter_entities" );
695 std::copy( dum4.begin(), dum4.end(),
range_inserter( entities[my_proc] ) );
699 delete[] displacements;
709 const bool store_remote_handles,
715 std::vector< MPI_Request >& recv_remoteh_reqs,
718 #ifndef MOAB_HAVE_MPI
733 if( !tmp_range.
empty() )
735 orig_ents =
subtract( orig_ents, tmp_range );
739 MB_CHK_SET_ERR( result,
"Failed to pack buffer in send_entities" );
747 &recv_remoteh_reqs[2 * ind], &incoming2 );
755 std::vector< Range* >& send_ents,
758 const bool store_remote_handles )
778 unsigned int n_proc = send_procs.size();
779 for( i = 0; i < n_proc; i++ )
789 if( !tmp_range.
empty() )
791 *send_ents[i] =
subtract( *send_ents[i], tmp_range );
799 Range allsent, tmp_range;
802 for( i = 0; i < n_proc; i++ )
804 int n_ents = send_ents[i]->size();
808 allsent.
merge( *send_ents[i] );
817 for( i = 0; i < n_proc; i++ )
819 for(
Range::iterator rit = send_ents[i]->begin(); rit != send_ents[i]->end(); ++rit )
821 entprocs.
vi_wr[entprocs.
get_n()] = send_procs[i];
829 sort_buffer.buffer_init( npairs );
830 entprocs.
sort( 1, &sort_buffer );
835 (
unsigned long)allsent.
size() );
840 for( i = 0; i < n_proc; i++ )
842 if( send_ents[i]->
size() > 0 )
845 myDebug->
tprintf( 1,
"Sent ents compactness (size) = %f (%lu)\n", send_ents[i]->compactness(),
846 (
unsigned long)send_ents[i]->
size() );
883 for(
int i = 0; i < size; i++ )
888 std::vector< std::vector< int > >& msgsizes,
889 std::vector< std::vector< EntityHandle > >& senddata,
890 std::vector< std::vector< EntityHandle > >& recvdata )
917 std::vector< MPI_Request > recv_ent_reqs( 3 *
buffProcs.size(), MPI_REQUEST_NULL );
921 std::vector< unsigned int >::iterator sit;
931 if( success != MPI_SUCCESS )
933 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv in send_recv_entities" );
938 for( i = 0; i < (int)send_procs.size(); i++ )
944 int buff_size = msgsizes[i].size() *
sizeof( int ) + senddata[i].
size() *
sizeof(
EntityHandle );
948 std::vector< int > msg;
949 msg.insert( msg.end(), msgsizes[i].begin(), msgsizes[i].end() );
952 std::vector< EntityHandle > entities;
953 entities.insert( entities.end(), senddata[i].begin(), senddata[i].end() );
965 recv_ent_reqs[3 * ind + 2], &ack_buff, incoming );
977 int index_in_recv_requests;
980 success = MPI_Waitany( 3 *
buffProcs.size(), recv_ent_reqs.data(), &index_in_recv_requests, &status );
981 if( MPI_SUCCESS != success )
983 MB_SET_ERR( MB_FAILURE,
"Failed in waitany in send_recv_entities" );
987 ind = index_in_recv_requests / 3;
997 recv_ent_reqs[3 * ind + 1],
998 recv_ent_reqs[3 * ind + 2],
1010 int from_proc = status.MPI_SOURCE;
1011 int idx = std::find( send_procs.begin(), send_procs.end(), from_proc ) - send_procs.begin();
1013 int msg = msgsizes[idx].size();
1014 std::vector< int > recvmsg( msg );
1015 int ndata = senddata[idx].size();
1016 std::vector< EntityHandle > dum_vec( ndata );
1021 recvdata[idx].insert( recvdata[idx].end(), dum_vec.begin(), dum_vec.end() );
1036 std::vector< int >& procs,
1037 std::vector< EntityHandle >& handles )
1042 int procmin = *std::min_element( procs.begin(), procs.end() );
1044 if( (
int)
rank() > procmin )
1055 if( (
int)procs.size() > 1 )
1057 procs.push_back(
rank() );
1058 handles.push_back( entity );
1060 int idx = std::find( procs.begin(), procs.end(), procmin ) - procs.begin();
1062 std::iter_swap( procs.begin(), procs.begin() + idx );
1063 std::iter_swap( handles.begin(), handles.begin() + idx );
1084 std::vector< EntityHandle > newents;
1094 const bool store_remote_handles,
1095 const bool is_iface,
1099 std::vector< std::vector< EntityHandle > >& L1hloc,
1100 std::vector< std::vector< EntityHandle > >& L1hrem,
1101 std::vector< std::vector< int > >& L1p,
1102 std::vector< EntityHandle >& L2hloc,
1103 std::vector< EntityHandle >& L2hrem,
1104 std::vector< unsigned int >& L2p,
1105 std::vector< MPI_Request >& recv_remoteh_reqs,
1108 #ifndef MOAB_HAVE_MPI
1118 if( success != MPI_SUCCESS )
1120 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv in ghost exchange" );
1124 return recv_messages( from_proc, store_remote_handles, is_iface, final_ents, incoming1, incoming2, L1hloc, L1hrem,
1125 L1p, L2hloc, L2hrem, L2p, recv_remoteh_reqs );
1132 const bool store_remote_handles,
1133 const bool migrate )
1139 int success, ind, i;
1142 std::vector< std::vector< EntityHandle > > recd_ents(
buffProcs.size() );
1143 std::vector< std::vector< EntityHandle > > L1hloc(
buffProcs.size() ), L1hrem(
buffProcs.size() );
1144 std::vector< std::vector< int > > L1p(
buffProcs.size() );
1145 std::vector< EntityHandle > L2hloc, L2hrem;
1146 std::vector< unsigned int > L2p;
1147 std::vector< EntityHandle > new_ents;
1156 if( MPI_SUCCESS != success )
1158 MB_SET_ERR( MB_FAILURE,
"Failed in waitany in owned entity exchange" );
1168 unsigned int base_ind = 2 * ( ind / 2 );
1186 ind / 2, L1hloc, L1hrem, L1p, L2hloc, L2hrem, L2p, new_ents,
true );
1189 std::cout <<
"Failed to unpack entities. Buffer contents:" << std::endl;
1207 if( success != MPI_SUCCESS )
1209 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv for remote handles in ghost exchange" );
1231 MB_SET_ERR( MB_FAILURE,
"Requests length doesn't match proc count in entity exchange" );
1234 #ifdef MOAB_HAVE_MPE
1244 std::set< unsigned int >::iterator it = recv_procs.begin();
1245 std::set< unsigned int >::iterator eit = recv_procs.end();
1246 for( ; it != eit; ++it )
1273 if( MPI_SUCCESS != success )
1275 MB_SET_ERR( MB_FAILURE,
"Failed in waitany in owned entity exchange" );
1283 unsigned int base_ind = 2 * ( ind / 2 );
1304 #ifdef MOAB_HAVE_MPE
1317 const bool store_remote_handles,
1318 const bool is_iface,
1322 std::vector< std::vector< EntityHandle > >& L1hloc,
1323 std::vector< std::vector< EntityHandle > >& L1hrem,
1324 std::vector< std::vector< int > >& L1p,
1325 std::vector< EntityHandle >& L2hloc,
1326 std::vector< EntityHandle >& L2hrem,
1327 std::vector< unsigned int >& L2p,
1328 std::vector< MPI_Request >& recv_remoteh_reqs )
1330 #ifndef MOAB_HAVE_MPI
1337 std::vector< EntityHandle > new_ents;
1343 success = MPI_Waitany( 2, &
recvReqs[2 * ind1], &ind2, &status );
1344 if( MPI_SUCCESS != success )
1346 MB_SET_ERR( MB_FAILURE,
"Failed in waitany in recv_messages" );
1357 unsigned int base_ind = 2 * ( ind2 / 2 );
1363 ( !is_iface && store_remote_handles ?
localOwnedBuffs[ind2 / 2] : NULL ),
1372 L1hloc, L1hrem, L1p, L2hloc, L2hrem, L2p, new_ents );
1373 MB_CHK_SET_ERR( result,
"Failed to unpack buffer in recev_messages" );
1375 std::copy( new_ents.begin(), new_ents.end(),
range_inserter( final_ents ) );
1381 result =
pack_remote_handles( L1hloc[ind2 / 2], L1hrem[ind2 / 2], L1p[ind2 / 2], from_proc,
1387 recv_remoteh_reqs[ind2 + 1], (
int*)(
localOwnedBuffs[ind2 / 2]->mem_ptr ),
1400 std::vector< EntityHandle >& L2hloc,
1401 std::vector< EntityHandle >& L2hrem,
1402 std::vector< unsigned int >& L2p,
1403 std::vector< MPI_Request >& recv_remoteh_reqs )
1405 #ifndef MOAB_HAVE_MPI
1416 success = MPI_Waitany( 2, &recv_remoteh_reqs[2 * ind1], &ind2, &status );
1417 if( MPI_SUCCESS != success )
1419 MB_SET_ERR( MB_FAILURE,
"Failed in waitany in recv_remote_handle_messages" );
1429 unsigned int base_ind = 2 * ( ind2 / 2 );
1451 const bool store_remote_handles,
1465 std::vector< Tag > all_tags;
1466 std::vector< Range > tag_ranges;
1471 result =
pack_entities( orig_ents, buff, store_remote_handles, to_proc,
false, entprocs, allsent );
1475 result =
pack_sets( orig_ents, buff, store_remote_handles, to_proc );
1484 result =
pack_tags( orig_ents, all_tags, all_tags, tag_ranges, buff, store_remote_handles, to_proc );
1498 const bool store_remote_handles,
1499 const int from_proc,
1501 std::vector< std::vector< EntityHandle > >& L1hloc,
1502 std::vector< std::vector< EntityHandle > >& L1hrem,
1503 std::vector< std::vector< int > >& L1p,
1504 std::vector< EntityHandle >& L2hloc,
1505 std::vector< EntityHandle >& L2hrem,
1506 std::vector< unsigned int >& L2p,
1507 std::vector< EntityHandle >& new_ents,
1508 const bool created_iface )
1510 unsigned char* tmp_buff = buff_ptr;
1512 result =
unpack_entities( buff_ptr, store_remote_handles, ind,
false, L1hloc, L1hrem, L1p, L2hloc, L2hrem, L2p,
1513 new_ents, created_iface );
1517 myDebug->
tprintf( 4,
"unpack_entities buffer space: %ld bytes.\n", (
long int)( buff_ptr - tmp_buff ) );
1518 tmp_buff = buff_ptr;
1520 result =
unpack_sets( buff_ptr, new_ents, store_remote_handles, from_proc );
1524 myDebug->
tprintf( 4,
"unpack_sets buffer space: %ld bytes.\n", (
long int)( buff_ptr - tmp_buff ) );
1525 tmp_buff = buff_ptr;
1527 result =
unpack_tags( buff_ptr, new_ents, store_remote_handles, from_proc );
1531 myDebug->
tprintf( 4,
"unpack_tags buffer space: %ld bytes.\n", (
long int)( buff_ptr - tmp_buff ) );
1543 std::vector< EntityHandle > dum_connect_vec;
1549 buff_size += 2 *
sizeof( int ) + 3 *
sizeof(
double ) * num_verts;
1550 if( store_remote_handles ) buff_size +=
sizeof(
EntityHandle ) * num_verts;
1562 buff_size += 3 *
sizeof( int );
1565 buff_size += ( num_connect + 1 ) *
sizeof(
EntityHandle ) * num_ents;
1569 buff_size +=
sizeof( int );
1577 int buff_size =
sizeof( int );
1583 for( ; rit != entities.
end(); ++rit )
1585 unsigned int options;
1589 buff_size +=
sizeof( int );
1601 else if( options & MESHSET_ORDERED )
1609 buff_size +=
sizeof(
EntityHandle ) * num_ents +
sizeof(
int );
1613 int num_par, num_ch;
1619 buff_size += ( num_ch + num_par ) *
sizeof(
EntityHandle ) + 2 *
sizeof( int );
1627 const bool store_remote_handles,
1643 if( buff_size < 0 )
MB_SET_ERR( MB_FAILURE,
"Failed to estimate ents buffer size" );
1645 myDebug->
tprintf( 3,
"estimate buffer size for %d entities: %d \n", (
int)entities.
size(), buff_size );
1647 unsigned int num_ents;
1650 std::vector< EntityHandle > entities_vec( entities.
size() );
1651 std::copy( entities.
begin(), entities.
end(), entities_vec.begin() );
1655 if( store_remote_handles )
1667 std::vector< int > sharedp_vals( entities.
size() );
1670 std::vector< char > pstatus_vals( entities.
size() );
1677 std::set< unsigned int > dumprocs;
1680 for( rit = entities.
begin(), i = 0; rit != entities.
end(); ++rit, i++ )
1684 assert( ind < entprocs->get_n() );
1686 while( ind < entprocs->get_n() && entprocs->
vul_rd[ind] == *rit )
1687 dumprocs.insert( entprocs->
vi_rd[ind++] );
1689 result =
build_sharedhps_list( *rit, pstatus_vals[i], sharedp_vals[i], dumprocs, num_ents, tmp_procs,
1703 unsigned int dp = 0;
1705 dumprocs.insert( tmp_procs[dp] );
1706 assert( dumprocs.size() == dp );
1714 num_ents = these_ents.
size();
1718 buff_size = 2 *
sizeof( int ) + 3 * num_ents *
sizeof(
double );
1725 std::vector< double > tmp_coords( 3 * num_ents );
1730 myDebug->
tprintf( 4,
"Packed %lu ents of type %s\n", (
unsigned long)these_ents.
size(),
1737 int last_nodes = -1;
1744 while( start_rit != entities.
end() || !these_ents.
empty() )
1754 if( start_rit != entities.
end() )
1758 if( NULL == seq )
return MB_FAILURE;
1763 if( !these_ents.
empty() &&
1766 result =
pack_entity_seq( last_nodes, store_remote_handles, to_proc, these_ents, entities_vec, buff );
1767 MB_CHK_SET_ERR( result,
"Failed to pack entities from a sequence" );
1780 last_type = eseq->
type();
1786 start_rit = end_rit;
1798 const unsigned char pstatus,
1804 const std::set< unsigned int >& procs,
1805 unsigned int& num_ents,
1810 unsigned char pstat;
1813 assert( pstat == pstatus );
1824 assert(
"If not owned, I should be shared too" && pstatus &
PSTATUS_SHARED && 1 == num_ents );
1826 tmp_handles[1] = entity;
1832 assert(
"shared and owned, should be only 1 sharing proc" && 1 == num_ents );
1833 tmp_procs[1] = tmp_procs[0];
1835 tmp_handles[1] = tmp_handles[0];
1836 tmp_handles[0] = entity;
1843 tmp_handles[0] = entity;
1848 int tmp_ps = num_ents;
1852 for( std::set< unsigned int >::iterator sit = procs.begin(); sit != procs.end(); ++sit )
1855 if( tmp_ps && std::find( tmp_procs, tmp_procs + tmp_ps, *sit ) != tmp_procs + tmp_ps )
1857 std::cerr <<
"Trouble with something already in shared list on proc " <<
procConfig.
proc_rank()
1858 <<
". Entity:" << std::endl;
1860 std::cerr <<
"pstatus = " << (int)pstatus <<
", sharedp = " << sharedp << std::endl;
1861 std::cerr <<
"tmp_ps = ";
1862 for(
int i = 0; i < tmp_ps; i++ )
1863 std::cerr << tmp_procs[i] <<
" ";
1864 std::cerr << std::endl;
1865 std::cerr <<
"procs = ";
1866 for( std::set< unsigned int >::iterator sit2 = procs.begin(); sit2 != procs.end(); ++sit2 )
1867 std::cerr << *sit2 <<
" ";
1871 tmp_procs[num_ents] = *sit;
1872 tmp_handles[num_ents] = 0;
1879 tmp_procs[num_ents] = -1;
1880 tmp_handles[num_ents] = 0;
1887 const bool store_remote_handles,
1890 std::vector< EntityHandle >& entities_vec,
1893 int tmp_space = 3 *
sizeof( int ) + nodes_per_entity * these_ents.
size() *
sizeof(
EntityHandle );
1907 std::vector< EntityHandle > connect;
1914 assert( (
int)connect.size() == nodes_per_entity );
1915 result =
get_remote_handles( store_remote_handles, connect.data(), connect.data(), connect.size(), to_proc,
1921 myDebug->
tprintf( 3,
"Packed %lu ents of type %s\n", (
unsigned long)these_ents.
size(),
1932 const std::vector< EntityHandle >& new_ents )
1940 std::vector< EntityHandle > tmp_vector;
1942 if( to_vec == from_vec )
1944 tmp_vector.resize( num_ents );
1945 to_vec = tmp_vector.data();
1948 if( !store_remote_handles )
1952 for(
int i = 0; i < num_ents; i++ )
1954 int ind = std::lower_bound( new_ents.begin(), new_ents.end(), from_vec[i] ) - new_ents.begin();
1955 assert( new_ents[ind] == from_vec[i] );
1957 assert( to_vec[i] != 0 && !err && -1 != ind );
1962 Tag shp_tag, shps_tag, shh_tag, shhs_tag, pstat_tag;
1967 std::vector< int > sharing_procs( num_ents );
1969 MB_CHK_SET_ERR( result,
"Failed to get shared handle tag for remote_handles" );
1971 MB_CHK_SET_ERR( result,
"Failed to get sharing proc tag in remote_handles" );
1972 for(
int j = 0; j < num_ents; j++ )
1974 if( to_vec[j] && sharing_procs[j] != to_proc ) to_vec[j] = 0;
1981 for( i = 0; i < num_ents; i++ )
1990 if( -1 == tmp_procs[j] )
1992 else if( tmp_procs[j] == to_proc )
1996 to_vec[i] = tmp_handles[j];
1997 assert( to_vec[i] );
2004 int j = std::lower_bound( new_ents.begin(), new_ents.end(), from_vec[i] ) - new_ents.begin();
2005 if( (
int)new_ents.size() == j )
2009 for(
int k = 0; k <= num_ents; k++ )
2010 std::cout << k <<
": " << from_vec[k] <<
" " << to_vec[k] << std::endl;
2011 MB_SET_ERR( MB_FAILURE,
"Failed to find new entity in send list" );
2017 MB_SET_ERR( MB_FAILURE,
"Failed to create handle in remote_handles" );
2025 if( to_vec_tmp == from_vec ) memcpy( from_vec, to_vec, num_ents *
sizeof(
EntityHandle ) );
2031 const Range& from_range,
2034 const std::vector< EntityHandle >& new_ents )
2041 if( !store_remote_handles )
2047 for( rit = from_range.
begin(), i = 0; rit != from_range.
end(); ++rit, i++ )
2049 int ind = std::lower_bound( new_ents.begin(), new_ents.end(), *rit ) - new_ents.begin();
2050 assert( new_ents[ind] == *rit );
2052 assert( to_vec[i] != 0 && !err && -1 != ind );
2057 Tag shp_tag, shps_tag, shh_tag, shhs_tag, pstat_tag;
2062 std::vector< int > sharing_procs( from_range.
size() );
2064 MB_CHK_SET_ERR( result,
"Failed to get shared handle tag for remote_handles" );
2066 MB_CHK_SET_ERR( result,
"Failed to get sharing proc tag in remote_handles" );
2067 for(
unsigned int j = 0; j < from_range.
size(); j++ )
2069 if( to_vec[j] && sharing_procs[j] != to_proc ) to_vec[j] = 0;
2077 for( rit = from_range.
begin(), i = 0; rit != from_range.
end(); ++rit, i++ )
2087 if( tmp_procs[j] == to_proc )
2089 to_vec[i] = tmp_handles[j];
2096 int j = std::lower_bound( new_ents.begin(), new_ents.end(), *rit ) - new_ents.begin();
2097 if( (
int)new_ents.size() == j )
2099 MB_SET_ERR( MB_FAILURE,
"Failed to find new entity in send list" );
2105 MB_SET_ERR( MB_FAILURE,
"Failed to create handle in remote_handles" );
2116 const Range& from_range,
2119 const std::vector< EntityHandle >& new_ents )
2121 std::vector< EntityHandle > to_vector( from_range.
size() );
2125 std::copy( to_vector.begin(), to_vector.end(),
range_inserter( to_range ) );
2130 const bool store_remote_handles,
2132 const bool is_iface,
2133 std::vector< std::vector< EntityHandle > >& L1hloc,
2134 std::vector< std::vector< EntityHandle > >& L1hrem,
2135 std::vector< std::vector< int > >& L1p,
2136 std::vector< EntityHandle >& L2hloc,
2137 std::vector< EntityHandle >& L2hrem,
2138 std::vector< unsigned int >& L2p,
2139 std::vector< EntityHandle >& new_ents,
2140 const bool created_iface )
2178 unsigned char* buff_save = buff_ptr;
2181 if( store_remote_handles )
2185 buff_save = buff_ptr;
2188 for( i = 0; i < num_ents; i++ )
2193 std::cout <<
"Should be non-negative # proc/handles.";
2197 buff_ptr += j * (
sizeof( int ) +
sizeof(
EntityHandle ) );
2201 std::vector< EntityHandle > msg_ents;
2213 int num_ents2, verts_per_entity = 0;
2217 if(
MBVERTEX != this_type && num_ents2 )
2224 for(
int e = 0; e < num_ents2; e++ )
2236 if( store_remote_handles )
2242 std::cout <<
"Shouldn't ever be fewer than 1 procs here." << std::endl;
2247 UNPACK_EH( buff_save, hs.data(), num_ps );
2257 UNPACK_EH( buff_ptr, connect, verts_per_entity );
2268 if( store_remote_handles )
2270 result =
find_existing_entity( is_iface, ps[0], hs[0], num_ps, connect, verts_per_entity, this_type,
2271 L2hloc, L2hrem, L2p, new_h );
2278 bool created_here =
false;
2279 if( !new_h && !is_iface )
2301 created_here =
true;
2313 msg_ents.push_back( new_h );
2316 if( created_here ) new_ents.push_back( new_h );
2318 if( new_h && store_remote_handles )
2320 unsigned char new_pstat = 0x0;
2325 int idx = std::min_element( ps.data(), ps.data() + num_ps ) - ps.data();
2328 std::swap( ps[0], ps[idx] );
2329 std::swap( hs[0], hs[idx] );
2335 else if( created_here )
2348 if( store_remote_handles && !is_iface && num_ps > 2 )
2350 L2hrem.push_back( hs[0] );
2351 L2hloc.push_back( new_h );
2352 L2p.push_back( ps[0] );
2358 for( j = 0; j < num_ps; j++ )
2362 if( idx == (
int)L1hloc.size() )
2364 L1hloc.resize( idx + 1 );
2365 L1hrem.resize( idx + 1 );
2366 L1p.resize( idx + 1 );
2370 std::vector< EntityHandle >::iterator vit =
2371 std::find( L1hloc[idx].begin(), L1hloc[idx].end(), new_h );
2372 if( vit != L1hloc[idx].end() )
2376 if( L1p[idx][vit - L1hloc[idx].begin()] != -1 && hs[j] )
2378 L1hrem[idx][vit - L1hloc[idx].begin()] = hs[j];
2379 L1p[idx][vit - L1hloc[idx].begin()] = -1;
2388 assert( -1 != ps[0] && num_ps > 2 );
2389 L1p[idx].push_back( ps[0] );
2390 L1hrem[idx].push_back( hs[0] );
2395 "either this remote handle isn't in the remote list, or "
2396 "it's for another proc" &&
2397 ( std::find( L1hrem[idx].begin(), L1hrem[idx].end(), hs[j] ) == L1hrem[idx].end() ||
2398 L1p[idx][std::find( L1hrem[idx].begin(), L1hrem[idx].end(), hs[j] ) -
2399 L1hrem[idx].begin()] != -1 ) );
2400 L1p[idx].push_back( -1 );
2401 L1hrem[idx].push_back( hs[j] );
2403 L1hloc[idx].push_back( new_h );
2408 assert(
"Shouldn't be here for non-shared entities" && -1 != num_ps );
2409 std::fill( ps.data(), &ps[num_ps], -1 );
2410 std::fill( hs.data(), &hs[num_ps], 0 );
2429 std::cerr <<
" sent";
2431 std::cerr <<
" received";
2432 std::cerr <<
" message type " << mesg_tag <<
" to/from proc " << from_proc <<
"; contents:" << std::endl;
2434 int msg_length, num_ents;
2435 unsigned char* orig_ptr = buff_ptr;
2437 std::cerr << msg_length <<
" bytes..." << std::endl;
2443 std::vector< int > ps;
2444 std::vector< EntityHandle > hs;
2447 std::cerr << num_ents <<
" entities..." << std::endl;
2450 for( i = 0; i < num_ents; i++ )
2453 if( 0 > j )
return MB_FAILURE;
2456 std::cerr <<
"Entity " << i <<
", # procs = " << j << std::endl;
2459 std::cerr <<
" Procs: ";
2460 for( k = 0; k < j; k++ )
2461 std::cerr << ps[k] <<
" ";
2462 std::cerr << std::endl;
2463 std::cerr <<
" Handles: ";
2464 for( k = 0; k < j; k++ )
2465 std::cerr << hs[k] <<
" ";
2466 std::cerr << std::endl;
2468 if( buff_ptr - orig_ptr > msg_length )
2470 std::cerr <<
"End of buffer..." << std::endl;
2486 int num_ents2, verts_per_entity = 0;
2490 if(
MBVERTEX != this_type && num_ents2 )
2495 std::cerr <<
"Type: " <<
CN::EntityTypeName( this_type ) <<
"; num_ents = " << num_ents2;
2496 if(
MBVERTEX != this_type ) std::cerr <<
"; verts_per_ent = " << verts_per_entity;
2497 std::cerr << std::endl;
2498 if( num_ents2 < 0 || num_ents2 > msg_length )
2500 std::cerr <<
"Wrong number of entities, returning." << std::endl;
2504 for(
int e = 0; e < num_ents2; e++ )
2511 std::cerr <<
"xyz = " << coords[0] <<
", " << coords[1] <<
", " << coords[2] << std::endl;
2517 UNPACK_EH( buff_ptr, connect, verts_per_entity );
2520 std::cerr <<
"Connectivity: ";
2521 for( k = 0; k < verts_per_entity; k++ )
2522 std::cerr << connect[k] <<
" ";
2523 std::cerr << std::endl;
2526 if( buff_ptr - orig_ptr > msg_length )
2528 std::cerr <<
"End of buffer..." << std::endl;
2538 std::cerr << num_ents <<
" entities..." << std::endl;
2539 if( 0 > num_ents || num_ents > msg_length )
2541 std::cerr <<
"Wrong number of entities, returning." << std::endl;
2544 std::vector< EntityHandle > L1hloc( num_ents ), L1hrem( num_ents );
2545 std::vector< int > L1p( num_ents );
2547 UNPACK_EH( buff_ptr, L1hrem.data(), num_ents );
2548 UNPACK_EH( buff_ptr, L1hloc.data(), num_ents );
2549 std::cerr << num_ents <<
" Entity pairs; hremote/hlocal/proc: " << std::endl;
2550 for(
int i = 0; i < num_ents; i++ )
2557 if( buff_ptr - orig_ptr > msg_length )
2559 std::cerr <<
"End of buffer..." << std::endl;
2566 int num_tags, dum1, data_type, tag_size;
2568 std::cerr <<
"Number of tags = " << num_tags << std::endl;
2569 for(
int i = 0; i < num_tags; i++ )
2571 std::cerr <<
"Tag " << i <<
":" << std::endl;
2575 std::cerr <<
"Tag size, type, data type = " << tag_size <<
", " << dum1 <<
", " << data_type << std::endl;
2577 std::cerr <<
"Default value size = " << dum1 << std::endl;
2580 std::string name( (
char*)buff_ptr, dum1 );
2581 std::cerr <<
"Tag name = " << name.c_str() << std::endl;
2584 std::cerr <<
"Number of ents = " << num_ents << std::endl;
2585 std::vector< EntityHandle > tmp_buff( num_ents );
2586 UNPACK_EH( buff_ptr, tmp_buff.data(), num_ents );
2588 for(
int j = 0; j < num_ents; j++ )
2596 std::cerr <<
"(variable, length = " << dum1 <<
")" << std::endl;
2602 std::cerr << dum_dbl << std::endl;
2608 std::cerr << dum_int << std::endl;
2612 std::cerr <<
"(opaque)" << std::endl;
2613 buff_ptr += tag_size;
2619 std::cerr << dum_eh << std::endl;
2623 std::cerr <<
"(bit)" << std::endl;
2624 buff_ptr += tag_size;
2647 shared_ents.
print(
"Shared entities:\n" );
2651 unsigned char pstat;
2654 unsigned int num_ps;
2657 for(
int i = 0; i < num_ents; i++ )
2663 std::cout <<
" coords: " << coords[0] <<
" " << coords[1] <<
" " << coords[2] <<
"\n";
2665 result =
get_sharing_data( ents[i], tmp_procs, tmp_handles, pstat, num_ps );
2668 std::cout <<
"Pstatus: ";
2670 std::cout <<
"local " << std::endl;
2678 std::cout << std::endl;
2679 for(
unsigned int j = 0; j < num_ps; j++ )
2681 std::cout <<
" proc " << tmp_procs[j] <<
" id (handle) " <<
mbImpl->
id_from_handle( tmp_handles[j] )
2682 <<
"(" << tmp_handles[j] <<
")" << std::endl;
2685 std::cout << std::endl;
2700 Range& remote_range,
2702 const unsigned char add_pstat )
2708 for( rit = local_range.
begin(), rit2 = remote_range.
begin(); rit != local_range.
end(); ++rit, ++rit2 )
2721 const unsigned char add_pstat
2736 unsigned char new_pstat;
2742 MB_CHK_SET_ERR( result,
"Failed to get sharing data in update_remote_data" );
2743 int num_exist = new_numps;
2746 new_pstat |= add_pstat;
2770 std::set< unsigned int > dumprocs;
2771 unsigned int dp = 0;
2772 for( ; (int)dp < num_ps && -1 != ps[dp]; dp++ )
2773 dumprocs.insert( ps[dp] );
2774 assert( dp == dumprocs.size() );
2782 new_hs[1] = new_hs[0];
2783 new_ps[1] = new_ps[0];
2791 for(
int i = 0; i < num_ps; i++ )
2793 idx = std::find( new_ps.data(), new_ps.data() + new_numps, ps[i] ) - new_ps.data();
2794 if( idx < new_numps )
2796 if( !new_hs[idx] && hs[i] )
2798 new_hs[idx] = hs[i];
2800 assert( !hs[i] || new_hs[idx] == hs[i] );
2806 MB_SET_ERR( MB_FAILURE,
"Exceeded MAX_SHARING_PROCS for "
2810 new_ps[new_numps] = ps[i];
2811 new_hs[new_numps] = hs[i];
2817 idx = std::find( new_ps.data(), new_ps.data() + new_numps,
rank() ) - new_ps.data();
2818 if( idx == new_numps )
2820 new_ps[new_numps] =
rank();
2821 new_hs[new_numps] = new_h;
2824 else if( !new_hs[idx] && new_numps > 2 )
2825 new_hs[idx] = new_h;
2842 result =
set_sharing_data( new_h, new_pstat, num_exist, new_numps, new_ps.data(), new_hs.data() );
2843 MB_CHK_SET_ERR( result,
"Failed to set sharing data in update_remote_data" );
2854 const unsigned char add_pstat )
2858 unsigned char pstat;
2861 unsigned int num_exist;
2868 std::set< unsigned int > dumprocs;
2869 unsigned int dp = 0;
2870 for( ; (int)dp < num_ps && -1 != ps[dp]; dp++ )
2871 dumprocs.insert( ps[dp] );
2872 assert( dp == dumprocs.size() );
2877 bool changed =
false;
2882 memcpy( tag_ps, ps, num_ps *
sizeof(
int ) );
2886 assert(
"I shouldn't be the only proc there." && ( 1 != num_exist || ps[0] != (
int)
procConfig.
proc_rank() ) );
2891 for(
int i = 0; i < num_ps; i++ )
2893 idx = std::find( tag_ps, tag_ps + num_exist, ps[i] ) - tag_ps;
2894 if( idx == (
int)num_exist )
2913 tag_ps[1] = tag_ps[0];
2914 tag_hs[1] = tag_hs[0];
2922 tag_ps[num_exist] = ps[i];
2923 tag_hs[num_exist] = hs[i];
2927 else if( 0 == tag_hs[idx] )
2929 tag_hs[idx] = hs[i];
2932 else if( 0 != hs[i] )
2934 assert( hs[i] == tag_hs[idx] );
2942 idx = std::min_element( tag_ps, tag_ps + num_exist ) - tag_ps;
2945 int tag_proc = tag_ps[idx];
2946 tag_ps[idx] = tag_ps[0];
2947 tag_ps[0] = tag_proc;
2949 tag_hs[idx] = tag_hs[0];
2958 assert(
"interface entities should have > 1 proc" && ( !( add_pstat &
PSTATUS_INTERFACE ) || num_exist > 1 ) );
2959 assert(
"ghost entities should have > 1 proc" && ( !( add_pstat &
PSTATUS_GHOST ) || num_exist > 1 ) );
2966 assert( idx < (
int)num_exist );
2967 if( !tag_hs[idx] ) tag_hs[idx] = new_h;
2978 else if( num_exist > 0 )
3009 std::set< unsigned int > dumprocs;
3010 unsigned int dp = 0;
3011 for( ; dp < num_exist && -1 != tag_ps[dp]; dp++ )
3012 dumprocs.insert( tag_ps[dp] );
3013 assert( dp == dumprocs.size() );
3017 else if( num_exist == 2 || num_exist == 1 )
3022 tag_ps[0] = tag_ps[1];
3023 tag_hs[0] = tag_hs[1];
3025 assert( tag_ps[0] != -1 && tag_hs[0] != 0 );
3047 unsigned char pstat;
3048 std::set< int > tmp_procs;
3055 MB_CHK_SET_ERR( result,
"Failed to get sharing data in get_sharing_data" );
3062 if( rit == entities.
begin() )
3064 std::copy( sp2, sp2 + num_ps, std::inserter( procs, procs.begin() ) );
3068 std::sort( sp2, sp2 + num_ps );
3071 std::set_union( procs.begin(), procs.end(), sp2, sp2 + num_ps,
3072 std::inserter( tmp_procs, tmp_procs.end() ) );
3074 std::set_intersection( procs.begin(), procs.end(), sp2, sp2 + num_ps,
3075 std::inserter( tmp_procs, tmp_procs.end() ) );
3078 assert(
"Unknown operation." &&
false );
3081 procs.swap( tmp_procs );
3092 unsigned char& pstat,
3093 unsigned int& num_ps )
3139 const int num_connect,
3140 const EntityType this_type,
3141 std::vector< EntityHandle >& L2hloc,
3142 std::vector< EntityHandle >& L2hrem,
3143 std::vector< unsigned int >& L2p,
3147 if( !is_iface && num_ps > 2 )
3149 for(
unsigned int i = 0; i < L2hrem.size(); i++ )
3151 if( L2hrem[i] == owner_h && owner_p == (
int)L2p[i] )
3165 if( !tmp_range.
empty() )
3168 new_h = *tmp_range.
begin();
3179 Range& local_handles,
3180 const std::vector< EntityHandle >& new_ents )
3182 std::vector< EntityHandle > rh_vec;
3183 rh_vec.reserve( remote_handles.
size() );
3184 std::copy( remote_handles.
begin(), remote_handles.
end(), std::back_inserter( rh_vec ) );
3186 std::copy( rh_vec.begin(), rh_vec.end(),
range_inserter( local_handles ) );
3192 std::vector< EntityHandle > tmp_ents;
3193 std::copy( new_ents.
begin(), new_ents.
end(), std::back_inserter( tmp_ents ) );
3199 const std::vector< EntityHandle >& new_ents )
3201 for(
int i = 0; i < num_ents; i++ )
3229 int tmp_num = ( *key_it ).second - ( *key_it ).first + 1;
3230 handle_map.
insert( ( *key_it ).first, val_start, tmp_num );
3231 val_start += tmp_num;
3257 if( buff_size < 0 )
MB_SET_ERR( MB_FAILURE,
"Failed to estimate sets buffer size" );
3264 std::vector< unsigned int > options( all_sets.
size() );
3266 std::vector< EntityHandle > members;
3268 for( rit = all_sets.
begin(), i = 0; rit != all_sets.
end(); ++rit, i++ )
3277 if( !all_sets.
empty() )
3280 int n_sets = all_sets.
size();
3281 bool b_pack =
false;
3282 std::vector< int > id_data( n_sets );
3285 MB_CHK_SET_ERR( result,
"Failed to create parallel geometry unique id tag" );
3291 for( i = 0; i < n_sets; i++ )
3293 if( id_data[i] != 0 )
3303 buff->
check_space( ( n_sets + 1 ) *
sizeof(
int ) );
3315 std::vector< EntityHandle > entities_vec( entities.
size() );
3316 std::copy( entities.
begin(), entities.
end(), entities_vec.begin() );
3317 for( rit = all_sets.
begin(), i = 0; rit != all_sets.
end(); ++rit, i++ )
3321 MB_CHK_SET_ERR( result,
"Failed to get entities in ordered set" );
3322 result =
get_remote_handles( store_remote_handles, members.data(), members.data(), members.size(), to_proc,
3331 if( !store_remote_handles )
3334 unsigned int tot_pch = 0;
3337 for( rit = all_sets.
begin(), i = 0; rit != all_sets.
end(); ++rit, i++ )
3352 members.reserve( tot_pch );
3353 std::vector< EntityHandle > tmp_pch;
3354 for( rit = all_sets.
begin(), i = 0; rit != all_sets.
end(); ++rit, i++ )
3358 std::copy( tmp_pch.begin(), tmp_pch.end(), std::back_inserter( members ) );
3362 std::copy( tmp_pch.begin(), tmp_pch.end(), std::back_inserter( members ) );
3365 assert( members.size() == tot_pch );
3366 if( !members.empty() )
3368 result =
get_remote_handles( store_remote_handles, members.data(), members.data(), members.size(), to_proc,
3370 MB_CHK_SET_ERR( result,
"Failed to get remote handles for set parent/child sets" );
3373 for(
unsigned int __j = 0; __j < members.size(); __j++ )
3385 for( rit = all_sets.
begin(); rit != all_sets.
end(); ++rit )
3393 if( store_remote_handles && !all_sets.
empty() )
3408 std::vector< EntityHandle >& entities,
3409 const bool store_remote_handles,
3410 const int from_proc )
3425 std::vector< EntityHandle > members;
3427 std::vector< unsigned int > options_vec( num_sets );
3429 if( num_sets )
UNPACK_VOID( buff_ptr, options_vec.data(), num_sets *
sizeof(
unsigned int ) );
3434 if( n_uid > 0 && n_uid != num_sets )
3436 std::cerr <<
"The number of Parallel geometry unique ids should be same." << std::endl;
3441 std::vector< int > uids( n_uid );
3447 MB_CHK_SET_ERR( result,
"Failed to create parallel geometry unique id tag" );
3450 for( i = 0; i < n_uid; i++ )
3454 void* tag_vals[] = { &uids[i] };
3459 if( !temp_sets.
empty() )
3461 set_handle = *temp_sets.
begin();
3468 MB_CHK_SET_ERR( result,
"Failed to set parallel geometry unique ids" );
3470 new_sets.
insert( set_handle );
3476 for( i = 0; i < num_sets; i++ )
3483 assert( set_handle > *new_sets.
rbegin() );
3484 new_sets.
insert( set_handle );
3488 std::copy( new_sets.
begin(), new_sets.
end(), std::back_inserter( entities ) );
3490 if( !no_sets ) std::sort( entities.begin(), entities.end() );
3492 for( rit = new_sets.
begin(), i = 0; rit != new_sets.
end(); ++rit, i++ )
3496 members.resize( num_ents );
3497 if( num_ents )
UNPACK_EH( buff_ptr, members.data(), num_ents );
3499 MB_CHK_SET_ERR( result,
"Failed to get local handles for ordered set contents" );
3501 MB_CHK_SET_ERR( result,
"Failed to add ents to ordered set in unpack" );
3504 std::vector< int > num_pch( 2 * new_sets.
size() );
3505 std::vector< int >::iterator vit;
3507 for( vit = num_pch.begin(); vit != num_pch.end(); ++vit )
3513 members.resize( tot_pch );
3514 UNPACK_EH( buff_ptr, members.data(), tot_pch );
3516 MB_CHK_SET_ERR( result,
"Failed to get local handle for parent/child sets" );
3520 for( rit = new_sets.
begin(); rit != new_sets.
end(); ++rit )
3523 int num_par = num_pch[num++], num_child = num_pch[num++];
3524 if( num_par + num_child )
3526 for( i = 0; i < num_par; i++ )
3528 assert( 0 != mem_ptr[i] );
3530 MB_CHK_SET_ERR( result,
"Failed to add parent to set in unpack" );
3533 for( i = 0; i < num_child; i++ )
3535 assert( 0 != mem_ptr[i] );
3537 MB_CHK_SET_ERR( result,
"Failed to add child to set in unpack" );
3539 mem_ptr += num_child;
3545 if( store_remote_handles && !new_sets.
empty() )
3578 const std::vector< Tag >& src_tags,
3579 const std::vector< Tag >& dst_tags,
3580 const std::vector< Range >& tag_ranges,
3582 const bool store_remote_handles,
3586 std::vector< Tag >::const_iterator tag_it, dst_it;
3587 std::vector< Range >::const_iterator rit;
3590 for( tag_it = src_tags.begin(), rit = tag_ranges.begin(); tag_it != src_tags.end(); ++tag_it, ++rit )
3597 count +=
sizeof( int );
3603 std::vector< EntityHandle > entities_vec( entities.
size() );
3604 std::copy( entities.
begin(), entities.
end(), entities_vec.begin() );
3606 for( tag_it = src_tags.begin(), dst_it = dst_tags.begin(), rit = tag_ranges.begin(); tag_it != src_tags.end();
3607 ++tag_it, ++dst_it, ++rit )
3609 result =
pack_tag( *tag_it, *dst_it, *rit, entities_vec, buff, store_remote_handles, to_proc );
3625 std::vector< int > var_len_sizes;
3626 std::vector< const void* > var_len_values;
3629 count +=
sizeof( int );
3633 count += 3 *
sizeof( int );
3636 count +=
sizeof( int );
3644 const int num_ent = tagged_entities.
size();
3646 count += num_ent *
sizeof( int );
3648 var_len_sizes.resize( num_ent );
3649 var_len_values.resize( num_ent );
3651 var_len_sizes.data() );
3652 MB_CHK_SET_ERR( result,
"Failed to get lenghts of variable-length tag values" );
3653 count += std::accumulate( var_len_sizes.begin(), var_len_sizes.end(), 0 );
3666 const Range& tagged_entities,
3667 const std::vector< EntityHandle >& whole_vec,
3669 const bool store_remote_handles,
3673 std::vector< int > var_len_sizes;
3674 std::vector< const void* > var_len_values;
3676 if( src_tag != dst_tag )
3717 std::vector< EntityHandle > dum_tagged_entities( tagged_entities.
size() );
3719 get_remote_handles( store_remote_handles, tagged_entities, dum_tagged_entities.data(), to_proc, whole_vec );
3724 std::cerr <<
"Failed to get remote handles for tagged entities:" << std::endl;
3725 tagged_entities.
print(
" " );
3727 MB_SET_ERR( result,
"Failed to get remote handles for tagged entities" );
3730 PACK_EH( buff->
buff_ptr, dum_tagged_entities.data(), dum_tagged_entities.size() );
3732 const size_t num_ent = tagged_entities.
size();
3735 var_len_sizes.resize( num_ent, 0 );
3736 var_len_values.resize( num_ent, 0 );
3737 result =
mbImpl->
tag_get_by_ptr( src_tag, tagged_entities, var_len_values.data(), var_len_sizes.data() );
3738 MB_CHK_SET_ERR( result,
"Failed to get variable-length tag data in pack_tags" );
3741 for(
unsigned int i = 0; i < num_ent; i++ )
3755 PC( num_ent * src_tag->
get_size(),
" void" );
3762 std::vector< Tag >& all_tags,
3763 std::vector< Range >& tag_ranges )
3765 std::vector< Tag > tmp_tags;
3769 std::vector< Tag >::iterator tag_it;
3770 for( tag_it = tmp_tags.begin(); tag_it != tmp_tags.end(); ++tag_it )
3772 std::string tag_name;
3774 if( tag_name.c_str()[0] ==
'_' && tag_name.c_str()[1] ==
'_' )
continue;
3777 result = ( *tag_it )->get_tagged_entities(
sequenceManager, tmp_range );
3778 MB_CHK_SET_ERR( result,
"Failed to get entities for tag in pack_tags" );
3779 tmp_range =
intersect( tmp_range, whole_range );
3781 if( tmp_range.
empty() )
continue;
3784 all_tags.push_back( *tag_it );
3785 tag_ranges.push_back(
Range() );
3786 tag_ranges.back().swap( tmp_range );
3793 std::vector< EntityHandle >& entities,
3796 const MPI_Op*
const mpi_op )
3807 std::vector< const void* > var_len_vals;
3808 std::vector< unsigned char > dum_vals;
3809 std::vector< EntityHandle > dum_ehvals;
3811 for(
int i = 0; i < num_tags; i++ )
3817 int tag_size, tag_data_type, tag_type;
3825 void* def_val_ptr = NULL;
3828 def_val_ptr = buff_ptr;
3829 buff_ptr += def_val_size;
3830 UPC( tag_size,
" void" );
3836 std::string tag_name(
reinterpret_cast< char*
>( buff_ptr ), name_len );
3837 buff_ptr += name_len;
3838 UPC( 64,
" chars" );
3854 std::vector< EntityHandle > dum_ents( num_ents );
3855 UNPACK_EH( buff_ptr, dum_ents.data(), num_ents );
3865 dum_ehvals.resize( num_ents );
3866 UNPACK_EH( buff_ptr, dum_ehvals.data(), num_ents );
3868 MB_CHK_SET_ERR( result,
"Failed to get local handles for tag vals" );
3875 if( !dum_ents.empty() )
3882 std::vector< int > var_lengths( num_ents );
3883 UNPACK_INTS( buff_ptr, var_lengths.data(), num_ents );
3884 UPC(
sizeof(
int ) * num_ents,
" void" );
3887 var_len_vals.resize( num_ents );
3888 for( std::vector< EntityHandle >::size_type j = 0; j < (std::vector< EntityHandle >::size_type)num_ents;
3891 var_len_vals[j] = buff_ptr;
3892 buff_ptr += var_lengths[j] * type_size;
3893 UPC( var_lengths[j],
" void" );
3896 var_lengths.data() );
3897 MB_CHK_SET_ERR( result,
"Failed to set tag data when unpacking variable-length tag" );
3902 dum_vals.resize( tag_size * num_ents );
3908 result =
mbImpl->
tag_get_data( tag_handle, dum_ents.data(), num_ents, dum_vals.data() );
3909 MB_CHK_SET_ERR( result,
"Failed to get existing value of dst tag on entities" );
3910 result =
reduce_void( tag_data_type, *mpi_op, tag_length * num_ents, dum_vals.data(), buff_ptr );
3911 MB_CHK_SET_ERR( result,
"Failed to perform mpi op on dst tags" );
3914 MB_CHK_SET_ERR( result,
"Failed to set range-based tag data when unpacking tag" );
3915 buff_ptr += num_ents * tag_size;
3916 UPC( num_ents * tag_size,
" void" );
3926 template <
class T >
3927 T
LAND(
const T& arg1,
const T& arg2 )
3929 return arg1 && arg2;
3931 template <
class T >
3932 T
LOR(
const T& arg1,
const T& arg2 )
3934 return arg1 || arg2;
3936 template <
class T >
3937 T
LXOR(
const T& arg1,
const T& arg2 )
3939 return ( ( arg1 && !arg2 ) || ( !arg1 && arg2 ) );
3941 template <
class T >
3942 T
MAX(
const T& arg1,
const T& arg2 )
3944 return ( arg1 > arg2 ? arg1 : arg2 );
3946 template <
class T >
3947 T
MIN(
const T& arg1,
const T& arg2 )
3949 return ( arg1 < arg2 ? arg1 : arg2 );
3951 template <
class T >
3952 T
ADD(
const T& arg1,
const T& arg2 )
3956 template <
class T >
3957 T
MULT(
const T& arg1,
const T& arg2 )
3962 template <
class T >
3965 T* old_tmp =
reinterpret_cast< T*
>( old_vals );
3969 std::vector< T > new_values;
3970 new_values.resize( num_ents );
3971 memcpy( new_values.data(), new_vals, num_ents *
sizeof( T ) );
3972 T* new_tmp = new_values.data();
3974 if( mpi_op == MPI_SUM )
3975 std::transform( old_tmp, old_tmp + num_ents, new_tmp, new_tmp, ADD< T > );
3976 else if( mpi_op == MPI_PROD )
3977 std::transform( old_tmp, old_tmp + num_ents, new_tmp, new_tmp, MULT< T > );
3978 else if( mpi_op == MPI_MAX )
3979 std::transform( old_tmp, old_tmp + num_ents, new_tmp, new_tmp, MAX< T > );
3980 else if( mpi_op == MPI_MIN )
3981 std::transform( old_tmp, old_tmp + num_ents, new_tmp, new_tmp, MIN< T > );
3982 else if( mpi_op == MPI_LAND )
3983 std::transform( old_tmp, old_tmp + num_ents, new_tmp, new_tmp, LAND< T > );
3984 else if( mpi_op == MPI_LOR )
3985 std::transform( old_tmp, old_tmp + num_ents, new_tmp, new_tmp, LOR< T > );
3986 else if( mpi_op == MPI_LXOR )
3987 std::transform( old_tmp, old_tmp + num_ents, new_tmp, new_tmp, LXOR< T > );
3988 else if( mpi_op == MPI_BAND || mpi_op == MPI_BOR || mpi_op == MPI_BXOR )
3990 std::cerr <<
"Bitwise operations not allowed in tag reductions." << std::endl;
3993 else if( mpi_op != MPI_OP_NULL )
3995 std::cerr <<
"Unknown MPI operation type." << std::endl;
4000 memcpy( new_vals, new_tmp, num_ents *
sizeof( T ) );
4001 std::vector< T >().swap( new_values );
4007 const MPI_Op mpi_op,
4013 switch( tag_data_type )
4016 result = reduce< int >( mpi_op, num_ents, old_vals, new_vals );
4019 result = reduce< double >( mpi_op, num_ents, old_vals, new_vals );
4022 result = reduce< unsigned char >( mpi_op, num_ents, old_vals, new_vals );
4058 proc_ents.
merge( tmp_ents );
4068 if( -1 == resolve_dim )
4074 if( resolve_dim > shared_dim &&
4079 proc_ents.
erase( lower, upper );
4094 #ifdef MOAB_HAVE_MPE
4105 if( resolve_dim < shared_dim )
4107 MB_SET_ERR( MB_FAILURE,
"MOAB does not support vertex-based partitions, only element-based ones" );
4110 if( -1 == shared_dim )
4112 if( !proc_ents.
empty() )
4114 else if( resolve_dim == 3 )
4117 int max_global_resolve_dim = -1;
4118 int err = MPI_Allreduce( &resolve_dim, &max_global_resolve_dim, 1, MPI_INT, MPI_MAX,
proc_config().proc_comm() );
4119 if( MPI_SUCCESS != err )
4121 MB_SET_ERR( MB_FAILURE,
"Unable to guess global resolve_dim" );
4123 if( shared_dim < 0 || resolve_dim < 0 )
4126 resolve_dim = max_global_resolve_dim;
4127 shared_dim = resolve_dim - 1;
4130 if( resolve_dim < 0 || shared_dim < 0 )
return MB_SUCCESS;
4134 Range tmp_skin_ents[4];
4138 int skin_dim = resolve_dim - 1;
4141 skin_ents = tmp_skin_ents;
4142 skin_ents[resolve_dim] = proc_ents;
4145 skinner.
find_skin( this_set, skin_ents[skin_dim + 1],
false, skin_ents[skin_dim], NULL,
true,
true,
true );
4147 myDebug->
tprintf( 1,
"Found skin: skin_dim: %d resolve_dim: %d , now resolving.\n", skin_dim, resolve_dim );
4148 myDebug->
tprintf( 3,
"skin_ents[0].size(): %d skin_ents[1].size(): %d \n", (
int)skin_ents[0].
size(),
4149 (
int)skin_ents[1].
size() );
4151 for(
int this_dim = skin_dim - 1; this_dim >= 0; this_dim-- )
4157 if( this_set && skin_dim == 2 && this_dim == 1 )
4164 else if( skin_ents[resolve_dim].empty() )
4165 skin_ents[resolve_dim] = proc_ents;
4173 bool tag_created =
false;
4176 &def_val, &tag_created );
4179 MB_SET_ERR( result,
"Failed to create/get gid tag handle" );
4181 else if( tag_created )
4194 MB_CHK_SET_ERR( result,
"Failed to get number of bytes per tag" );
4199 std::vector< long > lgid_data( skin_ents[0].
size() );
4205 MB_CHK_SET_ERR( result,
"Couldn't get gid tag for skin vertices" );
4207 else if( 4 == bytes_per_tag )
4209 std::vector< int > gid_data( lgid_data.size() );
4211 MB_CHK_SET_ERR( result,
"Failed to get gid tag for skin vertices" );
4212 std::copy( gid_data.begin(), gid_data.end(), lgid_data.begin() );
4217 MB_SET_ERR( MB_FAILURE,
"Unsupported id tag" );
4221 std::vector< Ulong > handle_vec;
4222 std::copy( skin_ents[0].begin(), skin_ents[0].end(), std::back_inserter( handle_vec ) );
4224 #ifdef MOAB_HAVE_MPE
4249 result = gsd->
initialize( skin_ents[0].
size(), lgid_data.data(), handle_vec.data(), 2, 1, 1, cd );
4253 Tag shp_tag, shps_tag, shh_tag, shhs_tag, pstat_tag;
4262 unsigned int i = 0, j = 0;
4263 for(
unsigned int p = 0; p < gsd->nlinfo->_np; p++ )
4264 for(
unsigned int np = 0; np < gsd->nlinfo->_nshared[p]; np++ )
4266 shared_verts.
vi_wr[i++] = gsd->nlinfo->_sh_ind[j];
4267 shared_verts.
vi_wr[i++] = gsd->nlinfo->_target[p];
4268 shared_verts.
vul_wr[j] = gsd->nlinfo->_ulabels[j];
4270 shared_verts.
inc_n();
4277 sort_buffer.buffer_init( max_size );
4278 shared_verts.
sort( 0, &sort_buffer );
4279 sort_buffer.
reset();
4284 std::fill( sharing_procs.begin(), sharing_procs.end(), maxp );
4289 std::map< std::vector< int >, std::vector< EntityHandle > > proc_nvecs;
4294 myDebug->
print( 3,
" resolve shared ents: proc verts ", proc_verts );
4295 result =
tag_shared_verts( shared_verts, skin_ents, proc_nvecs, proc_verts );
4298 #ifdef MOAB_HAVE_MPE
4306 result =
get_proc_nvecs( resolve_dim, shared_dim, skin_ents, proc_nvecs );
4309 shared_verts.
reset();
4313 for( std::map< std::vector< int >, std::vector< EntityHandle > >::const_iterator mit = proc_nvecs.begin();
4314 mit != proc_nvecs.end(); ++mit )
4317 for( std::vector< int >::const_iterator vit = ( mit->first ).begin(); vit != ( mit->first ).end(); ++vit )
4330 std::set< unsigned int > procs;
4336 MB_CHK_SET_ERR( result,
"Shared handle check failed after interface vertex exchange" );
4342 MB_CHK_SET_ERR( result,
"Failed to resolve shared entity remote handles" );
4346 MB_CHK_SET_ERR( result,
"Failed to create interface parent/child links" );
4351 #ifdef MOAB_HAVE_MPE
4368 #ifdef MOAB_HAVE_MPE
4373 MPE_Log_get_state_eventIDs( &IFACE_START, &IFACE_END );
4374 MPE_Log_get_state_eventIDs( &GHOST_START, &GHOST_END );
4375 MPE_Log_get_state_eventIDs( &SHAREDV_START, &SHAREDV_END );
4376 MPE_Log_get_state_eventIDs( &RESOLVE_START, &RESOLVE_END );
4377 MPE_Log_get_state_eventIDs( &ENTITIES_START, &ENTITIES_END );
4378 MPE_Log_get_state_eventIDs( &RHANDLES_START, &RHANDLES_END );
4379 MPE_Log_get_state_eventIDs( &OWNED_START, &OWNED_END );
4380 success =
MPE_Describe_state( IFACE_START, IFACE_END,
"Resolve interface ents",
"green" );
4382 success =
MPE_Describe_state( GHOST_START, GHOST_END,
"Exchange ghost ents",
"red" );
4384 success =
MPE_Describe_state( SHAREDV_START, SHAREDV_END,
"Resolve interface vertices",
"blue" );
4386 success =
MPE_Describe_state( RESOLVE_START, RESOLVE_END,
"Resolve shared ents",
"purple" );
4388 success =
MPE_Describe_state( ENTITIES_START, ENTITIES_END,
"Exchange shared ents",
"yellow" );
4390 success =
MPE_Describe_state( RHANDLES_START, RHANDLES_END,
"Remote handles",
"cyan" );
4392 success =
MPE_Describe_state( OWNED_START, OWNED_END,
"Exchange owned ents",
"black" );
4399 const unsigned int np,
4401 const int part_dim )
4403 std::vector< Range > verts( np );
4405 unsigned int p, i, j, v;
4407 for( p = 0; p < np; p++ )
4410 Range part_ents, skin_ents;
4413 rval = skinner.
find_skin( this_set, part_ents,
false, skin_ents, 0,
true,
true,
true );
4417 tot_verts += verts[p].size();
4421 shared_ents.
initialize( 2, 0, 1, 0, tot_verts );
4426 std::vector< int > gids;
4429 for( p = 0; p < np; p++ )
4433 gids.resize( verts[p].
size() );
4437 for( v = 0, rit = verts[p].begin(); v < gids.size(); v++, ++rit )
4439 shared_ents.
vi_wr[i++] = gids[v];
4440 shared_ents.
vi_wr[i++] = p;
4441 shared_ents.
vul_wr[j] = *rit;
4443 shared_ents.
inc_n();
4448 sort_buffer.buffer_init( tot_verts );
4449 shared_ents.
sort( 0, &sort_buffer );
4450 sort_buffer.
reset();
4454 std::vector< EntityHandle > handles;
4455 std::vector< int > procs;
4457 while( i < shared_ents.
get_n() )
4463 int this_gid = shared_ents.
vi_rd[j];
4464 while( i < shared_ents.
get_n() && shared_ents.
vi_rd[j] == this_gid )
4467 procs.push_back( shared_ents.
vi_rd[j++] );
4468 handles.push_back( shared_ents.
vul_rd[i++] );
4470 if( 1 == procs.size() )
continue;
4472 for( v = 0; v < procs.size(); v++ )
4474 rval = pc[procs[v]]->
update_remote_data( handles[v], procs.data(), handles.data(), procs.size(),
4475 ( procs[0] == (
int)pc[procs[v]]->
rank()
4482 std::set< unsigned int > psets;
4483 for( p = 0; p < np; p++ )
4493 shared_ents.
reset();
4501 Range iface_ents, tmp_ents, rmv_ents;
4502 std::vector< unsigned char > pstat;
4503 unsigned char set_pstat;
4512 MB_CHK_SET_ERR( result,
"Failed to get interface set contents" );
4513 pstat.resize( iface_ents.
size() );
4515 MB_CHK_SET_ERR( result,
"Failed to get pstatus values for interface set entities" );
4517 MB_CHK_SET_ERR( result,
"Failed to get pstatus values for interface set" );
4519 for( rit2 = iface_ents.
begin(), i = 0; rit2 != iface_ents.
end(); ++rit2, i++ )
4523 rmv_ents.
insert( *rit2 );
4528 MB_CHK_SET_ERR( result,
"Failed to remove entities from interface set" );
4534 iface_ents =
subtract( iface_ents, rmv_ents );
4540 [](
unsigned char c) { return c == 0x0; }
4546 unsigned int sz = iface_ents.
size();
4547 for( i = 0; i < sz; i++ )
4552 MB_CHK_SET_ERR( result,
"Failed to set pstatus values for interface set entities" );
4559 unsigned char pstatus_val,
4560 bool lower_dim_ents,
4564 std::vector< unsigned char > pstatus_vals( pstatus_ents.
size() );
4565 Range all_ents, *range_ptr = &pstatus_ents;
4567 if( lower_dim_ents || verts_too )
4569 all_ents = pstatus_ents;
4570 range_ptr = &all_ents;
4572 for( ; start_dim >= 0; start_dim-- )
4575 MB_CHK_SET_ERR( result,
"Failed to get adjacencies for pstatus entities" );
4582 for(
unsigned int i = 0; i < pstatus_vals.size(); i++ )
4583 pstatus_vals[i] |= pstatus_val;
4587 for(
unsigned int i = 0; i < pstatus_vals.size(); i++ )
4588 pstatus_vals[i] = pstatus_val;
4598 unsigned char pstatus_val,
4599 bool lower_dim_ents,
4603 std::vector< unsigned char > pstatus_vals( num_ents );
4605 if( lower_dim_ents || verts_too )
4609 std::copy( pstatus_ents, pstatus_ents + num_ents,
range_inserter( tmp_range ) );
4617 for(
unsigned int i = 0; i < (
unsigned int)num_ents; i++ )
4618 pstatus_vals[i] |= pstatus_val;
4622 for(
unsigned int i = 0; i < (
unsigned int)num_ents; i++ )
4623 pstatus_vals[i] = pstatus_val;
4636 for(
size_t i = 0; i < proc_list.size(); i++ )
4637 val ^= proc_list[i];
4638 srand( (
int)( val ) );
4639 return rand() % proc_list.size();
4658 int num_tags =
sizeof( shared_set_tag_names ) /
sizeof( shared_set_tag_names[0] );
4659 Range candidate_sets;
4671 for(
int d = 0; d < 4; d++ )
4673 candidate_sets.
clear();
4674 const void* vals[] = { &d };
4680 for(
int i = 1; i < num_tags; i++ )
4685 candidate_sets.
clear();
4694 for(
int i = 0; i < num_tags; i++ )
4707 all_sets =
subtract( all_sets, candidate_sets );
4709 while( it != all_sets.
end() )
4715 if( contents.
empty() )
4721 hint = candidate_sets.
insert( hint, *it );
4722 it = all_sets.
erase( it );
4727 Range prev_list = candidate_sets;
4728 while( !prev_list.
empty() )
4730 it = all_sets.
begin();
4732 hint = new_list.
begin();
4733 while( it != all_sets.
end() )
4737 if( !
intersect( prev_list, contents ).empty() )
4739 hint = new_list.
insert( hint, *it );
4740 it = all_sets.
erase( it );
4746 if( !
intersect( prev_list, contents ).empty() )
4748 hint = new_list.
insert( hint, *it );
4749 it = all_sets.
erase( it );
4758 candidate_sets.
merge( new_list );
4759 prev_list.
swap( new_list );
4768 for(
size_t i = 1; i < v.size(); i++ )
4769 if( v[i - 1] >= v[i] )
return false;
4783 std::vector< long > larray;
4784 std::vector< Ulong > handles;
4796 MB_CHK_SET_ERR( result,
"Failed getting number of bytes per tag" );
4808 larray.push_back(
dum );
4809 handles.push_back( *rit );
4810 tmp_sets.
insert( tmp_sets.
end(), *rit );
4813 else if( 4 == bytes_per_tag )
4819 larray.push_back(
dum );
4820 handles.push_back( *rit );
4821 tmp_sets.
insert( tmp_sets.
end(), *rit );
4826 const size_t nsets = handles.size();
4835 result = gsd->
initialize( nsets, larray.data(), handles.data(), 2, 1, 1, cd );
4843 for(
unsigned p = 0; p < gsd->nlinfo->_np; p++ )
4844 ntuple += gsd->nlinfo->_nshared[p];
4845 std::vector< set_tuple > tuples;
4846 tuples.reserve( ntuple );
4848 for(
unsigned p = 0; p < gsd->nlinfo->_np; p++ )
4850 for(
unsigned np = 0; np < gsd->nlinfo->_nshared[p]; np++ )
4853 t.
idx = gsd->nlinfo->_sh_ind[j];
4854 t.
proc = gsd->nlinfo->_target[p];
4855 t.
handle = gsd->nlinfo->_ulabels[j];
4856 tuples.push_back( t );
4860 std::sort( tuples.begin(), tuples.end() );
4869 std::vector< unsigned > procs;
4871 while( si != tmp_sets.
end() && ti < tuples.size() )
4873 assert( idx <= tuples[ti].idx );
4874 if( idx < tuples[ti].idx ) si += ( tuples[ti].idx - idx );
4875 idx = tuples[ti].idx;
4878 size_t ti_init = ti;
4879 while( ti < tuples.size() && tuples[ti].idx == idx )
4881 procs.push_back( tuples[ti].proc );
4889 std::cerr <<
"Failure at " __FILE__
":" << __LINE__ << std::endl;
4896 std::vector< unsigned >::iterator it = std::lower_bound( procs.begin(), procs.end(), rk );
4897 assert( it == procs.end() || *it > rk );
4898 procs.insert( it, rk );
4901 if( procs[owner_idx] == rk )
4903 else if( procs[owner_idx] > rk )
4904 owner_handle = tuples[ti_init + owner_idx - 1].handle;
4906 owner_handle = tuples[ti_init + owner_idx].handle;
4910 std::cerr <<
"Failure at " __FILE__
":" << __LINE__ << std::endl;
4932 int num_tags =
sizeof( shared_set_tag_names ) /
sizeof( shared_set_tag_names[0] );
4935 Tag* tags =
new Tag[num_tags + 1];
4937 int my_rank =
rank();
4938 int** tagVals =
new int*[num_tags];
4939 for(
int i = 0; i < num_tags; i++ )
4947 typedef std::map< int, EntityHandle > MVal;
4948 typedef std::map< int, EntityHandle >::iterator itMVal;
4949 MVal* localMaps =
new MVal[num_tags];
4951 for(
int i = 0; i < num_tags; i++ )
4958 "can't get sets with a tag" );
4960 if( rangeSets[i].
size() > 0 )
4962 tagVals[i] =
new int[rangeSets[i].
size()];
4966 for(
int j = 0; j < (int)rangeSets[i].
size(); j++ )
4968 localMaps[i][tagVals[i][j]] = rangeSets[i][j];
4986 remoteEnts.
initialize( 3, 0, 1, 0, initialSize );
4992 std::set< EntityHandle > own_and_sha;
4994 for( std::set< EntityHandle >::iterator vit =
sharedEnts.begin(); vit !=
sharedEnts.end(); ++vit )
4998 if( own_and_sha.find( geh ) != own_and_sha.end() )
5003 unsigned char pstat;
5007 for(
int i = 0; i < num_tags; i++ )
5008 delete[] tagVals[i];
5009 delete[] tagVals;
MB_CHK_SET_ERR( rval,
"Failed to get sharing data" );
5012 own_and_sha.insert( geh );
5013 for(
int i = 0; i < num_tags; i++ )
5015 for(
int j = 0; j < (int)rangeSets[i].
size(); j++ )
5022 for(
int k = 0; k < nprocs; k++ )
5024 if( procs[k] != my_rank )
5029 int oldSize = remoteEnts.
get_max();
5031 remoteEnts.
resize( oldSize + oldSize / 2 + 1 );
5033 remoteEnts.
vi_wr[ir++] = procs[k];
5034 remoteEnts.
vi_wr[ir++] = i;
5035 remoteEnts.
vi_wr[ir++] = tagVals[i][j];
5036 remoteEnts.
vul_wr[jr++] = handles[k];
5049 for(
int k = 0; k < nprocs; k++ )
5051 if( procs[k] != my_rank )
5056 int oldSize = remoteEnts.
get_max();
5058 remoteEnts.
resize( oldSize + oldSize / 2 + 1 );
5060 remoteEnts.
vi_wr[ir++] = procs[k];
5061 remoteEnts.
vi_wr[ir++] = num_tags;
5062 remoteEnts.
vi_wr[ir++] = gid;
5063 remoteEnts.
vul_wr[jr++] = handles[k];
5073 int sentEnts = remoteEnts.
get_n();
5074 assert( ( sentEnts == jr ) && ( 3 * sentEnts == ir ) );
5080 MB_CHK_SET_ERR( cd->gs_transfer( 1, remoteEnts, 0 ),
"Error in tuple transfer" );
5087 int received = remoteEnts.
get_n();
5088 for(
int i = 0; i < received; i++ )
5092 int from_proc = remoteEnts.
vi_rd[3 * i];
5093 if( my_rank == from_proc )
5094 std::cout <<
" unexpected receive from my rank " << my_rank <<
" during augmenting with ghosts\n ";
5095 int tag_type = remoteEnts.
vi_rd[3 * i + 1];
5096 assert( ( 0 <= tag_type ) && ( tag_type <= num_tags ) );
5097 int value = remoteEnts.
vi_rd[3 * i + 2];
5098 if( tag_type == num_tags )
5106 MVal& lmap = localMaps[tag_type];
5107 itMVal itm = lmap.find( value );
5108 if( itm == lmap.end() )
5113 lmap[value] = newSet;
5116 "can't set tag for new set" );
5129 for(
int i = 0; i < num_tags; i++ )
5130 delete[] tagVals[i];
5139 std::map< std::vector< int >, std::vector< EntityHandle > > proc_nvecs;
5146 unsigned char pstat;
5147 for( std::set< EntityHandle >::iterator vit =
sharedEnts.begin(); vit !=
sharedEnts.end(); ++vit )
5152 std::sort( procs, procs + nprocs );
5153 std::vector< int > tmp_procs( procs, procs + nprocs );
5154 assert( tmp_procs.size() != 2 );
5155 proc_nvecs[tmp_procs].push_back( *vit );
5161 MB_CHK_SET_ERR( result,
"Failed to get skin entities by dimension" );
5163 skinner.
find_skin( this_set, skin_ents[resolve_dim],
false, skin_ents[resolve_dim - 1], 0,
true,
true,
true );
5165 if( shared_dim > 1 )
5167 result =
mbImpl->
get_adjacencies( skin_ents[resolve_dim - 1], resolve_dim - 2,
true, skin_ents[resolve_dim - 2],
5172 result =
get_proc_nvecs( resolve_dim, shared_dim, skin_ents, proc_nvecs );
5183 Tag shp_tag, shps_tag, shh_tag, shhs_tag, pstat_tag;
5185 MB_CHK_SET_ERR( result,
"Failed to get shared proc tags in create_interface_sets" );
5189 std::vector< unsigned char > pstatus;
5190 for( std::map< std::vector< int >, std::vector< EntityHandle > >::iterator vit = proc_nvecs.begin();
5191 vit != proc_nvecs.end(); ++vit )
5200 assert( !vit->second.empty() );
5201 result =
mbImpl->
add_entities( new_set, ( vit->second ).data(), ( vit->second ).size() );
5202 MB_CHK_SET_ERR( result,
"Failed to add entities to interface set" );
5204 if( vit->first.size() == 1 )
5208 MB_CHK_SET_ERR( result,
"Failed to tag interface set with procs" );
5209 proc_handles[0] = 0;
5211 MB_CHK_SET_ERR( result,
"Failed to tag interface set with procs" );
5225 std::copy( vit->first.begin(), vit->first.end(), proc_ids );
5228 MB_CHK_SET_ERR( result,
"Failed to tag interface set with procs" );
5229 unsigned int ind = std::find( proc_ids, proc_ids + vit->first.size(),
procConfig.
proc_rank() ) - proc_ids;
5230 assert( ind < vit->
first.size() );
5232 proc_handles[ind] = new_set;
5234 MB_CHK_SET_ERR( result,
"Failed to tag interface set with procs" );
5238 int min_proc = ( vit->first )[0];
5243 MB_CHK_SET_ERR( result,
"Failed to tag interface set with pstatus" );
5247 std::vector< EntityHandle > verts;
5248 for( std::vector< EntityHandle >::iterator v2it = ( vit->second ).begin(); v2it != ( vit->second ).end();
5251 pstatus.resize( verts.size(), pval );
5252 if( !verts.empty() )
5254 result =
mbImpl->
tag_set_data( pstat_tag, verts.data(), verts.size(), pstatus.data() );
5255 MB_CHK_SET_ERR( result,
"Failed to tag interface set vertices with pstatus" );
5272 MB_CHK_SET_ERR( result,
"Failed to create temporary interface set tag" );
5275 std::vector< EntityHandle > tag_vals;
5283 MB_CHK_SET_ERR( result,
"Failed to get entities in interface set" );
5285 if( iface_ents.
empty() )
continue;
5287 tag_vals.resize( iface_ents.
size() );
5288 std::fill( tag_vals.begin(), tag_vals.end(), *rit );
5290 MB_CHK_SET_ERR( result,
"Failed to tag iface entities with interface set" );
5295 for(
int d = 2; d >= 0; d-- )
5307 MB_CHK_SET_ERR( result,
"Failed to get adjacencies for interface sets" );
5308 tag_vals.resize( tmp_ents2.
size() );
5310 MB_CHK_SET_ERR( result,
"Failed to get tmp iface tag for interface sets" );
5314 for(
unsigned int i = 0; i < tag_vals.size(); i++ )
5316 if( tag_vals[i] && tag_vals[i] != last_set )
5319 MB_CHK_SET_ERR( result,
"Failed to add parent/child link for interface set" );
5320 last_set = tag_vals[i];
5336 std::map< std::vector< int >, std::vector< EntityHandle > >& proc_nvecs )
5342 std::set< int > sharing_procs;
5343 std::vector< EntityHandle > dum_connect;
5344 std::vector< int > sp_vec;
5346 for(
int d = 3; d > 0; d-- )
5348 if( resolve_dim == d )
continue;
5354 MB_CHK_SET_ERR( result,
"Failed to get connectivity on non-vertex skin entities" );
5358 MB_CHK_SET_ERR( result,
"Failed to get sharing data in get_proc_nvecs" );
5359 if( sharing_procs.empty() ||
5365 if( sharing_procs.size() == 2 )
5367 std::set< int >::iterator it = sharing_procs.find(
proc_config().proc_rank() );
5368 assert( it != sharing_procs.end() );
5369 sharing_procs.erase( it );
5374 std::copy( sharing_procs.begin(), sharing_procs.end(), std::back_inserter( sp_vec ) );
5375 assert( sp_vec.size() != 2 );
5376 proc_nvecs[sp_vec].push_back( *rit );
5382 for( std::map< std::vector< int >, std::vector< EntityHandle > >::iterator mit = proc_nvecs.begin();
5383 mit != proc_nvecs.end(); ++mit )
5385 std::vector< EntityHandle > tmp_vec = ( mit->second );
5386 std::sort( tmp_vec.begin(), tmp_vec.end() );
5387 std::vector< EntityHandle >::iterator vit = std::unique( tmp_vec.begin(), tmp_vec.end() );
5388 assert( vit == tmp_vec.end() );
5399 std::map< std::vector< int >, std::vector< EntityHandle > >& proc_nvecs,
5401 unsigned int i_extra )
5403 Tag shp_tag, shps_tag, shh_tag, shhs_tag, pstat_tag;
5405 MB_CHK_SET_ERR( result,
"Failed to get shared proc tags in tag_shared_verts" );
5407 unsigned int j = 0, i = 0;
5408 std::vector< int > sharing_procs, sharing_procs2, tag_procs;
5409 std::vector< EntityHandle > sharing_handles, sharing_handles2, tag_lhandles, tag_rhandles;
5410 std::vector< unsigned char > pstatus;
5413 if( i_extra ) i += i_extra;
5414 while( j < 2 * shared_ents.
get_n() )
5418 int other_proc = -1;
5419 while( j < 2 * shared_ents.
get_n() && shared_ents.
vul_rd[j] == this_ent )
5425 if( shared_ents.
vul_rd[j] != other_ent || shared_ents.
vi_rd[i] != other_proc )
5427 assert( 0 != shared_ents.
vul_rd[j] );
5428 sharing_procs.push_back( shared_ents.
vi_rd[i] );
5429 sharing_handles.push_back( shared_ents.
vul_rd[j] );
5431 other_proc = shared_ents.
vi_rd[i];
5432 other_ent = shared_ents.
vul_rd[j];
5437 if( sharing_procs.size() > 1 )
5441 sharing_handles.push_back( this_ent );
5446 sharing_procs2 = sharing_procs;
5447 std::sort( sharing_procs2.begin(), sharing_procs2.end() );
5448 sharing_handles2.resize( sharing_handles.size() );
5449 for(
size_t k = 0; k < sharing_handles.size(); k++ )
5451 size_t idx = std::lower_bound( sharing_procs2.begin(), sharing_procs2.end(), sharing_procs[k] ) -
5452 sharing_procs2.begin();
5453 sharing_handles2[idx] = sharing_handles[k];
5455 sharing_procs.swap( sharing_procs2 );
5456 sharing_handles.swap( sharing_handles2 );
5459 assert( sharing_procs.size() != 2 );
5460 proc_nvecs[sharing_procs].push_back( this_ent );
5463 if( sharing_procs.size() == 1 )
5465 tag_procs.push_back( sharing_procs[0] );
5466 tag_lhandles.push_back( this_ent );
5467 tag_rhandles.push_back( sharing_handles[0] );
5468 pstatus.push_back( share_flag );
5476 std::cerr <<
"MAX_SHARING_PROCS exceeded for vertex " << this_ent <<
" on process "
5484 MB_CHK_SET_ERR( result,
"Failed to set sharedps tag on shared vertex" );
5486 MB_CHK_SET_ERR( result,
"Failed to set sharedhs tag on shared vertex" );
5488 MB_CHK_SET_ERR( result,
"Failed to set pstatus tag on shared vertex" );
5493 sharing_procs.clear();
5494 sharing_handles.clear();
5497 if( !tag_procs.empty() )
5499 result =
mbImpl->
tag_set_data( shp_tag, tag_lhandles.data(), tag_procs.size(), tag_procs.data() );
5500 MB_CHK_SET_ERR( result,
"Failed to set sharedp tag on shared vertex" );
5501 result =
mbImpl->
tag_set_data( shh_tag, tag_lhandles.data(), tag_procs.size(), tag_rhandles.data() );
5502 MB_CHK_SET_ERR( result,
"Failed to set sharedh tag on shared vertex" );
5503 result =
mbImpl->
tag_set_data( pstat_tag, tag_lhandles.data(), tag_procs.size(), pstatus.data() );
5504 MB_CHK_SET_ERR( result,
"Failed to set pstatus tag on shared vertex" );
5505 for( std::vector< EntityHandle >::iterator vvt = tag_lhandles.begin(); vvt != tag_lhandles.end(); vvt++ )
5511 for( std::map< std::vector< int >, std::vector< EntityHandle > >::iterator mit = proc_nvecs.begin();
5512 mit != proc_nvecs.end(); ++mit )
5514 std::vector< EntityHandle > tmp_vec = ( mit->second );
5515 std::sort( tmp_vec.begin(), tmp_vec.end() );
5516 std::vector< EntityHandle >::iterator vit = std::unique( tmp_vec.begin(), tmp_vec.end() );
5517 assert( vit == tmp_vec.end() );
5526 std::map< std::vector< int >, std::vector< EntityHandle > >& proc_nvecs,
5529 Tag shp_tag, shps_tag, shh_tag, shhs_tag, pstat_tag;
5531 MB_CHK_SET_ERR( result,
"Failed to get shared proc tags in tag_shared_verts" );
5533 unsigned int j = 0, i = 0;
5534 std::vector< int > sharing_procs, sharing_procs2;
5535 std::vector< EntityHandle > sharing_handles, sharing_handles2, skin_verts( skin_ents[0].
size() );
5536 for(
Range::iterator rit = skin_ents[0].begin(); rit != skin_ents[0].
end(); ++rit, i++ )
5537 skin_verts[i] = *rit;
5540 while( j < 2 * shared_ents.
get_n() )
5543 int this_idx = shared_ents.
vi_rd[j];
5545 while( j < 2 * shared_ents.
get_n() && shared_ents.
vi_rd[j] == this_idx )
5550 sharing_procs.push_back( shared_ents.
vi_rd[j++] );
5551 sharing_handles.push_back( shared_ents.
vul_rd[i++] );
5554 if( sharing_procs.size() > 1 )
5558 sharing_handles.push_back( this_ent );
5564 sharing_procs2 = sharing_procs;
5565 std::sort( sharing_procs2.begin(), sharing_procs2.end() );
5566 sharing_handles2.resize( sharing_handles.size() );
5567 for(
size_t k = 0; k < sharing_handles.size(); k++ )
5569 size_t idx = std::lower_bound( sharing_procs2.begin(), sharing_procs2.end(), sharing_procs[k] ) -
5570 sharing_procs2.begin();
5571 sharing_handles2[idx] = sharing_handles[k];
5573 sharing_procs.swap( sharing_procs2 );
5574 sharing_handles.swap( sharing_handles2 );
5576 assert( sharing_procs.size() != 2 );
5577 proc_nvecs[sharing_procs].push_back( this_ent );
5580 if( sharing_procs.size() == 1 )
5583 MB_CHK_SET_ERR( result,
"Failed to set sharedp tag on shared vertex" );
5585 MB_CHK_SET_ERR( result,
"Failed to set sharedh tag on shared vertex" );
5587 MB_CHK_SET_ERR( result,
"Failed to set pstatus tag on shared vertex" );
5596 std::cerr <<
"MAX_SHARING_PROCS exceeded for vertex " << this_ent <<
" on process "
5604 MB_CHK_SET_ERR( result,
"Failed to set sharedps tag on shared vertex" );
5606 MB_CHK_SET_ERR( result,
"Failed to set sharedhs tag on shared vertex" );
5608 MB_CHK_SET_ERR( result,
"Failed to set pstatus tag on shared vertex" );
5613 sharing_procs.clear();
5614 sharing_handles.clear();
5619 for( std::map< std::vector< int >, std::vector< EntityHandle > >::iterator mit = proc_nvecs.begin();
5620 mit != proc_nvecs.end(); ++mit )
5622 std::vector< EntityHandle > tmp_vec = ( mit->second );
5623 std::sort( tmp_vec.begin(), tmp_vec.end() );
5624 std::vector< EntityHandle >::iterator vit = std::unique( tmp_vec.begin(), tmp_vec.end() );
5625 assert( vit == tmp_vec.end() );
5642 MB_CHK_SET_ERR( result,
"Failed to get iface_proc for iface sets" );
5651 if( -1 != iface_proc[i] )
5654 procs_set.insert( (
unsigned int)iface_proc[i] );
5660 MB_CHK_SET_ERR( result,
"Failed to get iface_procs for iface set" );
5664 procs_set.insert( (
unsigned int)tmp_iface_procs[j] );
5665 else if( -1 == tmp_iface_procs[j] )
5667 std::fill( tmp_iface_procs, tmp_iface_procs + j, -1 );
5676 for( std::set< unsigned int >::iterator sit = procs_set.begin(); sit != procs_set.end(); ++sit )
5703 MB_CHK_SET_ERR( result,
"Failed to get entities of dimension " << dim );
5706 std::vector< unsigned char > pstatus( ents.
size() );
5713 for( ; rit != ents.
end(); i++, ++rit )
5716 pstatus_ents.
insert( *rit );
5721 for( ; rit != ents.
end(); i++, ++rit )
5724 pstatus_ents.
insert( *rit );
5732 const int dimension,
5734 const bool largest_dim_only,
5735 const bool parallel,
5736 const bool owned_only )
5743 void* tag_ptr = &def_val;
5745 MB_CHK_SET_ERR( result,
"Failed to get entities by MBVERTEX type and gid tag" );
5747 if( !dum_range.
empty() )
5750 result =
assign_global_ids( this_set, dimension, start_id, largest_dim_only, parallel, owned_only );
5762 if(
MB_SUCCESS == result && to_proc == sharing_procs[0] )
return true;
5769 if( to_proc == sharing_procs[i] )
5771 else if( -1 == sharing_procs[i] )
5779 unsigned char pstat,
5782 Range* returned_ents )
5789 if( returned_ents ) returned_ents->
clear();
5795 std::vector< unsigned char > shared_flags( ents.
size() ), shared_flags2;
5803 for( rit = ents.
begin(), i = 0; rit != ents.
end(); ++rit, i++ )
5805 if( ( ( shared_flags[i] & ~pstat ) ^ shared_flags[i] ) & pstat )
5807 hint = tmp_ents.
insert( hint, *rit );
5808 if( -1 != to_proc ) shared_flags2.push_back( shared_flags[i] );
5814 for( rit = ents.
begin(), i = 0; rit != ents.
end(); ++rit, i++ )
5816 if( ( shared_flags[i] & pstat ) == pstat )
5818 hint = tmp_ents.
insert( hint, *rit );
5819 if( -1 != to_proc ) shared_flags2.push_back( shared_flags[i] );
5825 for( rit = ents.
begin(), i = 0; rit != ents.
end(); ++rit, i++ )
5827 if( !( shared_flags[i] & pstat ) )
5829 hint = tmp_ents.
insert( hint, *rit );
5830 if( -1 != to_proc ) shared_flags2.push_back( shared_flags[i] );
5845 hint = tmp_ents2.
begin();
5847 for( rit = tmp_ents.
begin(), i = 0; rit != tmp_ents.
end(); ++rit, i++ )
5854 assert( -1 != sharing_procs[0] );
5858 if( sharing_procs[j] == to_proc )
5860 hint = tmp_ents2.
insert( hint, *rit );
5862 else if( -1 == sharing_procs[j] )
5865 sharing_procs[j] = -1;
5872 assert( -1 != sharing_procs[0] );
5873 if( sharing_procs[0] == to_proc ) hint = tmp_ents2.
insert( hint, *rit );
5874 sharing_procs[0] = -1;
5877 assert(
"should never get here" &&
false );
5880 tmp_ents.
swap( tmp_ents2 );
5884 returned_ents->
swap( tmp_ents );
5886 ents.
swap( tmp_ents );
5895 bool store_remote_handles,
5899 #ifdef MOAB_HAVE_MPE
5909 myDebug->
tprintf( 1,
"Entering exchange_ghost_cells with num_layers = %d\n", num_layers );
5918 assert( num_layers > 0 || store_remote_handles );
5920 const bool is_iface = !num_layers;
5926 int incoming1 = 0, incoming2 = 0;
5936 #ifdef MOAB_HAVE_MPE
5944 std::vector< MPI_Request > recv_ent_reqs( 3 *
buffProcs.size(), MPI_REQUEST_NULL ),
5945 recv_remoteh_reqs( 3 *
buffProcs.size(), MPI_REQUEST_NULL );
5946 std::vector< unsigned int >::iterator proc_it;
5949 for( ind = 0, proc_it =
buffProcs.begin(); proc_it !=
buffProcs.end(); ++proc_it, ind++ )
5956 if( success != MPI_SUCCESS )
5958 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv in ghost exchange" );
5968 result =
get_sent_ents( is_iface, bridge_dim, ghost_dim, num_layers, addl_ents, sent_ents, allsent, entprocs );
5973 if( addl_ents > 0 && file_set && !allsent.
empty() )
5976 MB_CHK_SET_ERR( result,
"Failed to add new sub-entities to set" );
5979 (
unsigned long)allsent.
size() );
5984 for( p = 0, proc_it =
buffProcs.begin(); proc_it !=
buffProcs.end(); ++proc_it, p++ )
5986 myDebug->
tprintf( 1,
"Sent ents compactness (size) = %f (%lu)\n", sent_ents[p].compactness(),
5987 (
unsigned long)sent_ents[p].
size() );
5994 &entprocs, &allsent );
6006 ( !is_iface && store_remote_handles ?
6009 &recv_remoteh_reqs[3 * p], &incoming2 );
6021 std::vector< std::vector< EntityHandle > > recd_ents(
buffProcs.size() );
6022 std::vector< std::vector< EntityHandle > > L1hloc(
buffProcs.size() ), L1hrem(
buffProcs.size() );
6023 std::vector< std::vector< int > > L1p(
buffProcs.size() );
6024 std::vector< EntityHandle > L2hloc, L2hrem;
6025 std::vector< unsigned int > L2p;
6026 std::vector< EntityHandle > new_ents;
6034 success = MPI_Waitany( 3 *
buffProcs.size(), recv_ent_reqs.data(), &ind, &status );
6035 if( MPI_SUCCESS != success )
6037 MB_SET_ERR( MB_FAILURE,
"Failed in waitany in ghost exchange" );
6047 unsigned int base_ind = 3 * ( ind / 3 );
6051 ( !is_iface && store_remote_handles ?
localOwnedBuffs[ind / 3] : NULL ),
6053 &recv_remoteh_reqs[base_ind + 1], &incoming2 );
6067 L1hloc, L1hrem, L1p, L2hloc, L2hrem, L2p, new_ents );
6070 std::cout <<
"Failed to unpack entities. Buffer contents:" << std::endl;
6075 if( recv_ent_reqs.size() != 3 *
buffProcs.size() )
6079 assert( !is_iface );
6080 recv_remoteh_reqs.resize( 3 *
buffProcs.size(), MPI_REQUEST_NULL );
6081 for(
unsigned int i = recv_ent_reqs.size(); i < 3 *
buffProcs.size(); i += 3 )
6089 &recv_remoteh_reqs[i] );
6090 if( success != MPI_SUCCESS )
6092 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv for remote handles in ghost exchange" );
6095 recv_ent_reqs.resize( 3 *
buffProcs.size(), MPI_REQUEST_NULL );
6102 if( recv_ent_reqs.size() != 3 *
buffProcs.size() )
6105 MB_SET_ERR( MB_FAILURE,
"Requests length doesn't match proc count in ghost exchange" );
6108 #ifdef MOAB_HAVE_MPE
6121 if(
MB_SUCCESS != result ) std::cout <<
"Failed check." << std::endl;
6129 if(
MB_SUCCESS != result ) std::cout <<
"Failed check." << std::endl;
6131 if(
MB_SUCCESS != result ) std::cout <<
"Failed check." << std::endl;
6134 #ifdef MOAB_HAVE_MPE
6153 success = MPI_Waitall( 3 *
buffProcs.size(), recv_ent_reqs.data(), mult_status );
6154 if( MPI_SUCCESS != success )
6156 MB_SET_ERR( MB_FAILURE,
"Failed in waitall in ghost exchange" );
6159 if( MPI_SUCCESS != success )
6161 MB_SET_ERR( MB_FAILURE,
"Failed in waitall in ghost exchange" );
6171 myDebug->
tprintf( 1,
"Exiting exchange_ghost_cells for is_iface==true \n" );
6187 if( MPI_SUCCESS != success )
6189 MB_SET_ERR( MB_FAILURE,
"Failed in waitall in ghost exchange" );
6197 for( p = 0, proc_it =
buffProcs.begin(); proc_it !=
buffProcs.end(); ++proc_it, p++ )
6213 recv_remoteh_reqs[3 * p + 2], &dum_ack_buff, incoming2 );
6223 success = MPI_Waitany( 3 *
buffProcs.size(), recv_remoteh_reqs.data(), &ind, &status );
6224 if( MPI_SUCCESS != success )
6226 MB_SET_ERR( MB_FAILURE,
"Failed in waitany in ghost exchange" );
6235 unsigned int base_ind = 3 * ( ind / 3 );
6255 #ifdef MOAB_HAVE_MPE
6275 success = MPI_Waitall( 3 *
buffProcs.size(), recv_remoteh_reqs.data(), mult_status );
6276 if( MPI_SUCCESS == success ) success = MPI_Waitall( 3 *
buffProcs.size(),
sendReqs.data(), mult_status );
6278 if( MPI_SUCCESS != success )
6280 MB_SET_ERR( MB_FAILURE,
"Failed in waitall in ghost exchange" );
6291 if( file_set && !new_ents.empty() )
6298 myDebug->
tprintf( 1,
"Exiting exchange_ghost_cells for is_iface==false \n" );
6306 MPI_Request& send_req,
6307 MPI_Request& ack_req,
6312 MPI_Request* next_recv_req,
6313 int* next_incoming )
6321 ( *next_incoming )++;
6326 if( success != MPI_SUCCESS )
6328 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv for next message in ghost exchange" );
6337 success = MPI_Irecv( (
void*)ack_buff,
sizeof(
int ), MPI_UNSIGNED_CHAR, to_proc, mesg_tag - 1,
6339 if( success != MPI_SUCCESS )
6341 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv for entity ack in ghost exchange" );
6351 if( success != MPI_SUCCESS )
return MB_FAILURE;
6357 const MPI_Status& mpi_status,
6359 MPI_Request& recv_req,
6363 MPI_Request& send_req,
6364 MPI_Request& sent_ack_req,
6368 MPI_Request* next_req,
6369 int* next_incoming )
6373 int from_proc = mpi_status.MPI_SOURCE;
6394 if( success != MPI_SUCCESS )
6396 MB_SET_ERR( MB_FAILURE,
"Failed to post 2nd iRecv in ghost exchange" );
6402 success = MPI_Isend( recv_buff->
mem_ptr,
sizeof(
int ), MPI_UNSIGNED_CHAR, from_proc, mesg_tag_expected - 1,
6404 if( success != MPI_SUCCESS )
6406 MB_SET_ERR( MB_FAILURE,
"Failed to send ack in ghost exchange" );
6409 else if( mpi_status.MPI_TAG == mesg_tag_expected - 1 )
6420 ( *next_incoming )++;
6426 if( success != MPI_SUCCESS )
6428 MB_SET_ERR( MB_FAILURE,
"Failed to post next irecv in ghost exchange" );
6436 assert( send_buff->
get_stored_size() - INITIAL_BUFF_SIZE < send_buff->alloc_size &&
6440 if( success != MPI_SUCCESS )
6442 MB_SET_ERR( MB_FAILURE,
"Failed to send 2nd message in ghost exchange" );
6446 mpi_status.MPI_TAG == mesg_tag_expected + 1 )
6467 else if( a.
procs[i] < 0 )
6480 typedef std::map< ProcList, Range > procmap_t;
6481 procmap_t old_procs, new_procs;
6486 unsigned char pstatus;
6490 for( rvit = allsent.
rbegin(); rvit != allsent.
rend(); ++rvit )
6494 assert(
"Should be shared with at least one other proc" &&
6499 int idx = std::find( sharedh, sharedh + nump, (
EntityHandle)0 ) - sharedh;
6500 if( idx == nump )
continue;
6503 std::sort( old_list.
procs, old_list.
procs + nump );
6504 old_procs[old_list].insert( *rvit );
6508 bool removed_owner = !idx;
6509 for( ++idx; idx < nump; ++idx )
6513 sharedh[new_nump] = sharedh[idx];
6514 sharedp.
procs[new_nump] = sharedp.
procs[idx];
6518 sharedp.
procs[new_nump] = -1;
6520 if( removed_owner && new_nump > 1 )
6525 idx = std::min_element( sharedp.
procs, sharedp.
procs + new_nump ) - sharedp.
procs;
6526 std::swap( sharedp.
procs[0], sharedp.
procs[idx] );
6527 std::swap( sharedh[0], sharedh[idx] );
6532 MB_CHK_SET_ERR( result,
"Failed to set sharing data in check_clean_iface" );
6543 sharedp.
procs[1] = -1;
6547 std::sort( sharedp.
procs, sharedp.
procs + new_nump );
6549 new_procs[sharedp].insert( *rvit );
6553 if( old_procs.empty() )
6555 assert( new_procs.empty() );
6560 procmap_t::iterator pmit;
6566 MB_CHK_SET_ERR( result,
"Failed to get sharing data for interface set" );
6567 assert( nump != 2 );
6568 std::sort( sharedp.
procs, sharedp.
procs + nump );
6571 pmit = old_procs.find( sharedp );
6572 if( pmit != old_procs.end() )
6575 MB_CHK_SET_ERR( result,
"Failed to remove entities from interface set" );
6578 pmit = new_procs.find( sharedp );
6579 if( pmit == new_procs.end() )
6583 MB_CHK_SET_ERR( result,
"Failed to get number of entities in interface set" );
6587 MB_CHK_SET_ERR( result,
"Failed to delete entities from interface set" );
6598 MB_CHK_SET_ERR( result,
"Failed to add entities to interface set" );
6602 new_procs.erase( pmit );
6609 for( pmit = new_procs.begin(); pmit != new_procs.end(); ++pmit )
6618 MB_CHK_SET_ERR( result,
"Failed to add entities to interface set" );
6620 assert( pmit->first.procs[0] >= 0 );
6622 if( pmit->first.procs[1] == -1 )
6624 int other = pmit->first.procs[0];
6627 MB_CHK_SET_ERR( result,
"Failed to tag interface set with procs" );
6630 MB_CHK_SET_ERR( result,
"Failed to tag interface set with procs" );
6636 MB_CHK_SET_ERR( result,
"Failed to tag interface set with procs" );
6638 MB_CHK_SET_ERR( result,
"Failed to tag interface set with procs" );
6644 MB_CHK_SET_ERR( result,
"Failed to tag interface set with pstatus" );
6648 MB_CHK_SET_ERR( result,
"Failed to tag interface entities with pstatus" );
6655 unsigned char pstatus,
6680 assert( new_nump > 1 &&
6694 std::set< unsigned int > dumprocs;
6696 for( ; dp < old_nump && -1 != ps[dp]; dp++ )
6697 dumprocs.insert( ps[dp] );
6698 assert( dp == (
int)dumprocs.size() );
6704 if( old_nump > 2 && new_nump < 3 )
6716 else if( ( old_nump < 3 && new_nump > 2 ) || ( old_nump > 1 && new_nump == 1 ) )
6727 assert(
"check for multishared/owner I'm first proc" &&
6729 ( ps[0] == (
int)
rank() ) ) &&
6730 "interface entities should have > 1 proc" && ( !( pstatus &
PSTATUS_INTERFACE ) || new_nump > 1 ) &&
6731 "ghost entities should have > 1 proc" && ( !( pstatus &
PSTATUS_GHOST ) || new_nump > 1 ) );
6744 assert( -1 != ps[j] );
6754 if( old_nump > 1 && new_nump < 2 )
sharedEnts.erase( ent );
6760 const int bridge_dim,
6761 const int ghost_dim,
6762 const int num_layers,
6763 const int addl_ents,
6770 std::vector< unsigned int >::iterator proc_it;
6775 for( ind = 0, proc_it =
buffProcs.begin(); proc_it !=
buffProcs.end(); ++proc_it, ind++ )
6793 if( !tmp_range.
empty() ) sent_ents[ind] =
subtract( sent_ents[ind], tmp_range );
6795 allsent.
merge( sent_ents[ind] );
6804 for( ind = 0; ind <
buffProcs.size(); ind++ )
6805 npairs += sent_ents[ind].
size();
6812 for( ind = 0, proc_it =
buffProcs.begin(); proc_it !=
buffProcs.end(); ++proc_it, ind++ )
6814 for(
Range::iterator rit = sent_ents[ind].begin(); rit != sent_ents[ind].
end(); ++rit )
6823 sort_buffer.buffer_init( npairs );
6824 entprocs.
sort( 1, &sort_buffer );
6827 sort_buffer.
reset();
6833 unsigned int num_procs,
6838 bool store_remote_handles,
6846 assert( num_layers > 0 || store_remote_handles );
6848 const bool is_iface = !num_layers;
6854 std::vector< Error* > ehs( num_procs );
6855 for(
unsigned int i = 0; i < num_procs; i++ )
6876 for(
unsigned int p = 0; p < num_procs; p++ )
6879 result = pc->
get_sent_ents( is_iface, bridge_dim, ghost_dim, num_layers, addl_ents, sent_ents[p], allsent[p],
6881 MB_CHK_SET_ERR( result,
"p = " << p <<
", get_sent_ents failed" );
6886 for( ind = 0; ind < pc->
buffProcs.size(); ind++ )
6891 pc->
buffProcs[ind], is_iface, &entprocs[p], &allsent[p] );
6892 MB_CHK_SET_ERR( result,
"p = " << p <<
", packing entities failed" );
6895 entprocs[p].
reset();
6909 for(
unsigned int p = 0; p < num_procs; p++ )
6911 L1hloc[p].resize( pcs[p]->
buffProcs.size() );
6912 L1hrem[p].resize( pcs[p]->
buffProcs.size() );
6913 L1p[p].resize( pcs[p]->
buffProcs.size() );
6916 for(
unsigned int p = 0; p < num_procs; p++ )
6920 for( ind = 0; ind < pc->
buffProcs.size(); ind++ )
6933 is_iface, L1hloc[to_p], L1hrem[to_p], L1p[to_p], L2hloc[to_p],
6934 L2hrem[to_p], L2p[to_p], new_ents[to_p] );
6935 MB_CHK_SET_ERR( result,
"p = " << p <<
", failed to unpack entities" );
6944 for(
unsigned int p = 0; p < num_procs; p++ )
6947 MB_CHK_SET_ERR( result,
"p = " << p <<
", failed to check on shared entities" );
6951 for(
unsigned int p = 0; p < num_procs; p++ )
6954 MB_CHK_SET_ERR( result,
"p = " << p <<
", failed to check on shared entities" );
6957 MB_CHK_SET_ERR( result,
"Failed to check on all shared handles" );
6966 std::vector< unsigned int >::iterator proc_it;
6967 for(
unsigned int p = 0; p < num_procs; p++ )
6971 for( ind = 0, proc_it = pc->
buffProcs.begin(); proc_it != pc->
buffProcs.end(); ++proc_it, ind++ )
6977 MB_CHK_SET_ERR( result,
"p = " << p <<
", failed to pack remote handles" );
6984 for(
unsigned int p = 0; p < num_procs; p++ )
6988 for( ind = 0, proc_it = pc->
buffProcs.begin(); proc_it != pc->
buffProcs.end(); ++proc_it, ind++ )
6994 L2hrem[to_p], L2p[to_p] );
6995 MB_CHK_SET_ERR( result,
"p = " << p <<
", failed to unpack remote handles" );
7000 for(
unsigned int p = 0; p < num_procs; p++ )
7003 MB_CHK_SET_ERR( result,
"p = " << p <<
", failed to check on shared entities" );
7007 MB_CHK_SET_ERR( result,
"Failed to check on all shared handles" );
7012 for(
unsigned int p = 0; p < num_procs; p++ )
7014 if( new_ents[p].empty() )
continue;
7016 MB_CHK_SET_ERR( result,
"p = " << p <<
", failed to add new entities to set" );
7026 int n_proc = exchange_procs.size();
7027 for(
int i = 0; i < n_proc; i++ )
7039 for(
int i = 0; i < n_proc; i++ )
7047 if( success != MPI_SUCCESS )
7049 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv in owned entity exchange" );
7059 int num = shared_procs.size();
7060 for(
int i = 0; i < num; i++ )
7064 for(
int i = 0; i < num; i++ )
7067 for(
int i = 0; i < num; i++ )
7078 std::set< unsigned int >::iterator it = recv_procs.begin();
7079 std::set< unsigned int >::iterator eit = recv_procs.end();
7080 for( ; it != eit; ++it )
7088 if( success != MPI_SUCCESS )
7090 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv in owned entity exchange" );
7098 std::vector< Range* >& exchange_ents,
7099 std::vector< MPI_Request >& recv_ent_reqs,
7100 std::vector< MPI_Request >& recv_remoteh_reqs,
7101 bool store_remote_handles,
7109 std::vector< unsigned int > exchange_procs_sets;
7110 std::vector< Range* > exchange_sets;
7111 int n_proc = exchange_procs.size();
7112 for(
int i = 0; i < n_proc; i++ )
7115 *exchange_ents[i] =
subtract( *exchange_ents[i], set_range );
7117 exchange_sets.push_back( tmp_range );
7118 exchange_procs_sets.push_back( exchange_procs[i] );
7125 store_remote_handles, wait_all, migrate );
7126 MB_CHK_SET_ERR( result,
"Failed to exchange owned mesh entities" );
7130 store_remote_handles, wait_all, migrate );
7135 result =
exchange_owned_mesh( exchange_procs, exchange_ents, recv_ent_reqs, recv_remoteh_reqs,
false,
7136 store_remote_handles, wait_all, migrate );
7137 MB_CHK_SET_ERR( result,
"Failed to exchange owned mesh entities" );
7140 result =
exchange_owned_mesh( exchange_procs_sets, exchange_sets, recv_ent_reqs, recv_remoteh_reqs,
false,
7141 store_remote_handles, wait_all, migrate );
7145 for(
int i = 0; i < n_proc; i++ )
7146 delete exchange_sets[i];
7149 std::map< std::vector< int >, std::vector< EntityHandle > > proc_nvecs;
7153 unsigned char pstat;
7154 for( std::set< EntityHandle >::iterator vit =
sharedEnts.begin(); vit !=
sharedEnts.end(); ++vit )
7158 MB_CHK_SET_ERR( result,
"Failed to get sharing data in exchange_owned_meshs" );
7159 std::sort( procs, procs + nprocs );
7160 std::vector< int > tmp_procs( procs, procs + nprocs );
7161 assert( tmp_procs.size() != 2 );
7162 proc_nvecs[tmp_procs].push_back( *vit );
7173 std::vector< Range* >& exchange_ents,
7174 std::vector< MPI_Request >& recv_ent_reqs,
7175 std::vector< MPI_Request >& recv_remoteh_reqs,
7176 const bool recv_posted,
7177 bool store_remote_handles,
7181 #ifdef MOAB_HAVE_MPE
7197 int incoming1 = 0, incoming2 = 0;
7200 unsigned int n_proc = exchange_procs.size();
7201 for( i = 0; i < n_proc; i++ )
7204 result =
add_verts( *exchange_ents[i] );
7211 if( !tmp_range.
empty() )
7213 *exchange_ents[i] =
subtract( *exchange_ents[i], tmp_range );
7220 #ifdef MOAB_HAVE_MPE
7231 recv_ent_reqs.resize( 3 *
buffProcs.size(), MPI_REQUEST_NULL );
7232 recv_remoteh_reqs.resize( 3 *
buffProcs.size(), MPI_REQUEST_NULL );
7235 for( i = 0; i < n_proc; i++ )
7243 if( success != MPI_SUCCESS )
7245 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv in owned entity exchange" );
7250 incoming1 += n_proc;
7256 Range allsent, tmp_range;
7260 for( i = 0; i < n_proc; i++ )
7262 int n_ents = exchange_ents[i]->size();
7266 allsent.
merge( *exchange_ents[i] );
7275 for( i = 0; i < n_proc; i++ )
7277 for(
Range::iterator rit = exchange_ents[i]->begin(); rit != exchange_ents[i]->end(); ++rit )
7279 entprocs.
vi_wr[entprocs.
get_n()] = exchange_procs[i];
7287 sort_buffer.buffer_init( npairs );
7288 entprocs.
sort( 1, &sort_buffer );
7289 sort_buffer.
reset();
7292 (
unsigned long)allsent.
size() );
7297 for( i = 0; i < n_proc; i++ )
7300 myDebug->
tprintf( 1,
"Sent ents compactness (size) = %f (%lu)\n", exchange_ents[i]->compactness(),
7301 (
unsigned long)exchange_ents[i]->
size() );
7316 ( store_remote_handles ?
localOwnedBuffs[ind] : NULL ), &recv_remoteh_reqs[3 * ind],
7328 std::vector< std::vector< EntityHandle > > recd_ents(
buffProcs.size() );
7329 std::vector< std::vector< EntityHandle > > L1hloc(
buffProcs.size() ), L1hrem(
buffProcs.size() );
7330 std::vector< std::vector< int > > L1p(
buffProcs.size() );
7331 std::vector< EntityHandle > L2hloc, L2hrem;
7332 std::vector< unsigned int > L2p;
7333 std::vector< EntityHandle > new_ents;
7341 success = MPI_Waitany( 3 *
buffProcs.size(), recv_ent_reqs.data(), &ind, &status );
7342 if( MPI_SUCCESS != success )
7344 MB_SET_ERR( MB_FAILURE,
"Failed in waitany in owned entity exchange" );
7354 unsigned int base_ind = 3 * ( ind / 3 );
7372 ind / 3, L1hloc, L1hrem, L1p, L2hloc, L2hrem, L2p, new_ents,
true );
7375 std::cout <<
"Failed to unpack entities. Buffer contents:" << std::endl;
7380 if( recv_ent_reqs.size() != 3 *
buffProcs.size() )
7383 recv_remoteh_reqs.resize( 3 *
buffProcs.size(), MPI_REQUEST_NULL );
7384 for( i = recv_ent_reqs.size(); i < 3 *
buffProcs.size(); i += 3 )
7392 &recv_remoteh_reqs[i] );
7393 if( success != MPI_SUCCESS )
7395 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv for remote handles in ghost exchange" );
7398 recv_ent_reqs.resize( 3 *
buffProcs.size(), MPI_REQUEST_NULL );
7414 if( recv_ent_reqs.size() != 3 *
buffProcs.size() )
7417 MB_SET_ERR( MB_FAILURE,
"Requests length doesn't match proc count in entity exchange" );
7420 #ifdef MOAB_HAVE_MPE
7438 if( MPI_SUCCESS != success )
7440 MB_SET_ERR( MB_FAILURE,
"Failed in waitall in exchange owned mesh" );
7448 for( i = 0; i < n_proc; i++ )
7464 recv_remoteh_reqs[3 * ind + 2], &dum_ack_buff, incoming2 );
7474 success = MPI_Waitany( 3 *
buffProcs.size(), recv_remoteh_reqs.data(), &ind, &status );
7475 if( MPI_SUCCESS != success )
7477 MB_SET_ERR( MB_FAILURE,
"Failed in waitany in owned entity exchange" );
7486 unsigned int base_ind = 3 * ( ind / 3 );
7508 #ifdef MOAB_HAVE_MPE
7528 success = MPI_Waitall( 3 *
buffProcs.size(), recv_remoteh_reqs.data(), mult_status );
7529 if( MPI_SUCCESS == success ) success = MPI_Waitall( 3 *
buffProcs.size(),
sendReqs.data(), mult_status );
7531 if( MPI_SUCCESS != success )
7533 MB_SET_ERR( MB_FAILURE,
"Failed in waitall in owned entity exchange" );
7553 if( -1 != other_proc && !
is_iface_proc( *rit, other_proc ) )
continue;
7594 MB_CHK_SET_ERR( result,
"Failed to remove entities from part set" );
7604 std::vector< unsigned char > pstat( allsent.
size() );
7607 std::vector< EntityHandle > handles( allsent.
size() );
7610 std::vector< int > procs( allsent.
size() );
7621 for( rit = allsent.
begin(), i = 0; rit != allsent.
end(); ++rit, i++ )
7623 if( -1 != procs[i] && 0 == handles[i] )
7624 bad_entities.
insert( *rit );
7632 MB_SET_ERR( result,
"Failed to get sharedps tag data" );
7638 int num_procs = ns_proc - dum_ps;
7641 EntityHandle* ns_handle = std::find( dum_hs, dum_hs + num_procs, 0 );
7642 int num_handles = ns_handle - dum_hs;
7643 assert( num_handles <= num_procs );
7644 if( num_handles != num_procs ) bad_entities.
insert( *rit );
7652 std::vector< EntityHandle >& L1hrem,
7653 std::vector< int >& L1p,
7657 assert( std::find( L1hloc.begin(), L1hloc.end(), (
EntityHandle)0 ) == L1hloc.end() );
7677 unsigned char*& buff_ptr,
7678 std::vector< EntityHandle >& L2hloc,
7679 std::vector< EntityHandle >& L2hrem,
7680 std::vector< unsigned int >& L2p )
7686 unsigned char* buff_proc = buff_ptr;
7687 buff_ptr += num_eh *
sizeof( int );
7688 unsigned char* buff_rem = buff_ptr + num_eh *
sizeof(
EntityHandle );
7692 for(
int i = 0; i < num_eh; i++ )
7704 L2hloc, L2hrem, L2p, new_h );
7711 if( !( hpair[0] && hpair[1] ) )
return MB_FAILURE;
7712 int this_proc = from_proc;
7714 MB_CHK_SET_ERR( result,
"Failed to set remote data range on sent entities in ghost exchange" );
7725 Range& ghosted_ents )
7730 assert( 0 < num_layers );
7736 if( bridge_dim == -1 )
7739 MB_CHK_SET_ERR( result,
"Failed to get bridge ents in the set" );
7744 MB_CHK_SET_ERR( result,
"Failed to get bridge ents in the set" );
7748 if( from_ents.
empty() )
continue;
7760 Range tmp_ents, tmp_owned, tmp_notowned;
7762 if( tmp_owned.
empty() )
return result;
7764 tmp_notowned = tmp_owned;
7770 tmp_notowned -= tmp_owned;
7773 if( 1 == addl_ents || 3 == addl_ents )
7776 MB_CHK_SET_ERR( result,
"Failed to get edge adjacencies for owned ghost entities" );
7778 MB_CHK_SET_ERR( result,
"Failed to get edge adjacencies for notowned ghost entities" );
7780 if( 2 == addl_ents || 3 == addl_ents )
7783 MB_CHK_SET_ERR( result,
"Failed to get face adjacencies for owned ghost entities" );
7785 MB_CHK_SET_ERR( result,
"Failed to get face adjacencies for notowned ghost entities" );
7788 ghosted_ents.
merge( tmp_ents );
7799 std::pair< Range::const_iterator, Range::const_iterator > set_range = sent_ents.
equal_range(
MBENTITYSET );
7811 MB_CHK_SET_ERR( result,
"Failed to get vertices adj to ghosted ents" );
7822 const std::vector< Tag >& dst_tags,
7823 const Range& entities_in )
7831 std::set< unsigned int > exch_procs;
7836 std::vector< MPI_Request > recv_tag_reqs( 3 *
buffProcs.size(), MPI_REQUEST_NULL );
7838 std::vector< unsigned int >::iterator sit;
7852 if( success != MPI_SUCCESS )
7854 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv in ghost exchange" );
7864 if( entities_in.
empty() )
7867 entities = entities_in;
7873 Range tag_ents = entities;
7880 if( !tag_ents.
empty() )
7887 std::vector< Range > tag_ranges;
7888 for( std::vector< Tag >::const_iterator vit = src_tags.begin(); vit != src_tags.end(); ++vit )
7896 tag_ranges.push_back(
intersect( tag_ents, tagged_ents ) );
7900 tag_ranges.push_back( tag_ents );
7909 MB_CHK_SET_ERR( result,
"Failed to count buffer in pack_send_tag" );
7913 recv_tag_reqs[3 * ind + 2], &dum_ack_buff, incoming );
7921 int index_in_recv_requests;
7923 success = MPI_Waitany( 3 *
buffProcs.size(), recv_tag_reqs.data(), &index_in_recv_requests, &status );
7924 if( MPI_SUCCESS != success )
7926 MB_SET_ERR( MB_FAILURE,
"Failed in waitany in tag exchange" );
7929 ind = index_in_recv_requests / 3;
7937 std::vector< EntityHandle > dum_vec;
7939 recv_tag_reqs[3 * ind + 1],
7940 recv_tag_reqs[3 * ind + 2],
7965 if( MPI_SUCCESS != success )
7967 MB_SET_ERR( MB_FAILURE,
"Failure in waitall in tag exchange" );
7972 assert( src_tags.size() == dst_tags.size() );
7973 if( src_tags != dst_tags )
7975 std::vector< unsigned char > data;
7977 if( entities_in.
empty() )
7980 owned_ents = entities_in;
7982 MB_CHK_SET_ERR( result,
"Failure to get subset of owned entities" );
7984 if( !owned_ents.
empty() )
7987 for(
size_t i = 0; i < src_tags.size(); i++ )
7989 if( src_tags[i] == dst_tags[i] )
continue;
7991 Range tagged_ents( owned_ents );
7994 MB_CHK_SET_ERR( result,
"get_entities_by_type_and_tag(type == MBMAXTYPE) failed" );
8003 MB_SET_ERR( MB_FAILURE,
"tag sizes don't match" );
8006 data.resize( sz * tagged_ents.
size() );
8021 const std::vector< Tag >& dst_tags,
8022 const MPI_Op mpi_op,
8023 const Range& entities_in )
8031 if( src_tags.size() != dst_tags.size() )
8033 MB_SET_ERR( MB_FAILURE,
"Source and destination tag handles must be specified for reduce_tags" );
8037 std::vector< Tag >::const_iterator vits, vitd;
8038 int tags_size, tagd_size;
8040 std::vector< unsigned char > vals;
8041 std::vector< int > tags_sizes;
8042 for( vits = src_tags.begin(), vitd = dst_tags.begin(); vits != src_tags.end(); ++vits, ++vitd )
8049 MB_SET_ERR( MB_FAILURE,
"Src/dst tags must have integer, double, or bit data type" );
8054 vals.resize( tags_size );
8058 tags_sizes.push_back( tags_size );
8061 if( *vits == *vitd )
continue;
8065 if( tags_size != tagd_size )
8067 MB_SET_ERR( MB_FAILURE,
"Sizes between src and dst tags don't match" );
8071 if( tags_type != tagd_type )
8073 MB_SET_ERR( MB_FAILURE,
"Src and dst tags must be of same data type" );
8078 std::set< unsigned int > exch_procs;
8083 std::vector< MPI_Request > recv_tag_reqs( 3 *
buffProcs.size(), MPI_REQUEST_NULL );
8085 std::vector< unsigned int >::iterator sit;
8099 if( success != MPI_SUCCESS )
8101 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv in ghost exchange" );
8111 if( entities_in.
empty() )
8114 entities = entities_in;
8117 std::vector< Tag >::const_iterator vit = src_tags.
begin(), vit2 = dst_tags.begin();
8118 std::vector< int >::const_iterator vsizes = tags_sizes.begin();
8119 for( ; vit != src_tags.end(); ++vit, ++vit2, ++vsizes )
8121 if( *vit == *vit2 )
continue;
8122 vals.resize( entities.
size() * ( *vsizes ) );
8133 Range tag_ents = entities;
8140 std::vector< Range > tag_ranges;
8141 for( vit = src_tags.begin(); vit != src_tags.end(); ++vit )
8149 tag_ranges.push_back(
intersect( tag_ents, tagged_ents ) );
8152 tag_ranges.push_back( tag_ents );
8160 MB_CHK_SET_ERR( result,
"Failed to count buffer in pack_send_tag" );
8164 recv_tag_reqs[3 * ind + 2], &dum_ack_buff, incoming );
8172 int index_in_recv_requests;
8174 success = MPI_Waitany( 3 *
buffProcs.size(), recv_tag_reqs.data(), &index_in_recv_requests, &status );
8175 if( MPI_SUCCESS != success )
8177 MB_SET_ERR( MB_FAILURE,
"Failed in waitany in ghost exchange" );
8179 ind = index_in_recv_requests / 3;
8187 std::vector< EntityHandle > dum_vec;
8189 recv_tag_reqs[3 * ind + 1],
8190 recv_tag_reqs[3 * ind + 2],
8215 if( MPI_SUCCESS != success )
8217 MB_SET_ERR( MB_FAILURE,
"Failure in waitall in tag exchange" );
8284 unsigned char tmp_pstatus = 0;
8312 if( create_if_missing )
8332 if( 0 == pc_tag )
return NULL;
8339 return pc_array[
index];
8354 if( pc_array[i] ) list.push_back( pc_array[i] );
8372 rval = impl->
tag_get_data( prtn_tag, &prtn, 1, &pcomm_id );
8380 if( !result )
return 0;
8383 rval = impl->
tag_set_data( prtn_tag, &prtn, 1, &pcomm_id );
8405 if( 0 == pc_tag )
return MB_FAILURE;
8408 if(
MB_SUCCESS != result )
return MB_FAILURE;
8409 int id = std::find( pcomm_arr, pcomm_arr +
MAX_SHARING_PROCS,
this ) - pcomm_arr;
8458 ents.
merge( tmp_ents );
8468 unsigned char pstat;
8483 owner = sharing_procs[0];
8486 handle = sharing_handles[0];
8492 owner = sharing_procs[0];
8495 handle = sharing_handles[0];
8509 return count_out < 0 ? MB_FAILURE :
MB_SUCCESS;
8564 if( pSets.
index( set_out ) < 0 )
8585 if( pSets.
index( part_id ) >= 0 )
8587 pSets.
erase( part_id );
8602 int& num_neighbors_out )
8609 num_neighbors_out = 0;
8612 int* parts[2] = { neighbors_out, tmp };
8615 unsigned char pstat;
8618 std::sort( curr, curr + n );
8620 int* k = std::set_union( parts[j], parts[j] + num_neighbors_out, curr, curr + n, parts[1 - j] );
8622 num_neighbors_out = k - parts[j];
8624 if( parts[j] != neighbors_out ) std::copy( parts[j], parts[j] + num_neighbors_out, neighbors_out );
8630 num_neighbors_out = std::remove( neighbors_out, neighbors_out + num_neighbors_out,
id ) - neighbors_out;
8645 while( i != iface_sets_out.
end() )
8647 unsigned char pstat;
8651 if( std::find( part_ids, part_ids + num_parts, *adj_part_id ) - part_ids != num_parts )
8654 i = iface_sets_out.
erase( i );
8666 unsigned char pstat;
8672 if( remote_handle ) *remote_handle = handle;
8680 if( owning_part_id != -1 )
8691 const void* part_id_list = 0;
8694 owning_part_id = ( (
const int*)part_id_list )[0];
8700 const void* handle_list = 0;
8704 *remote_handle = ( (
const EntityHandle*)handle_list )[0];
8710 int& num_part_ids_out,
8716 unsigned char pstat;
8722 if( remote_handles ) remote_handles[0] = entity;
8723 num_part_ids_out = 1;
8731 if( part_ids_out[0] != -1 )
8733 num_part_ids_out = 2;
8740 remote_handles[1] = entity;
8749 for( num_part_ids_out = 0; num_part_ids_out < MAX_SHARING_PROCS && part_ids_out[num_part_ids_out] >= 0;
8750 num_part_ids_out++ )
8754 int my_idx = std::find( part_ids_out, part_ids_out + num_part_ids_out,
proc_config().proc_rank() ) - part_ids_out;
8755 assert( my_idx < num_part_ids_out );
8764 assert( remote_handles[my_idx] == entity );
8775 int num_sharing, tmp_int;
8782 tmp.
owner = tmp_int;
8785 unsigned char pstat;
8788 for(
int j = 0; j < num_sharing; j++ )
8790 if( ent_procs[j] == (
int)
proc_config().proc_rank() )
continue;
8791 tmp.
local = handles[j];
8793 assert( -1 != ind );
8794 if( (
int)send_data.size() < ind + 1 ) send_data.resize( ind + 1 );
8795 send_data[ind].push_back( tmp );
8803 std::vector< std::vector< SharedEntityData > >& result )
8810 std::vector< MPI_Request > recv_req(
buffProcs.size(), MPI_REQUEST_NULL );
8811 std::vector< MPI_Request > send_req(
buffProcs.size(), MPI_REQUEST_NULL );
8814 std::vector< int > sizes_send( num_proc ), sizes_recv( num_proc );
8815 for(
int i = 0; i < num_proc; i++ )
8817 ierr = MPI_Irecv( &sizes_recv[i], 1, MPI_INT, procs[i], tag, cm, &recv_req[i] );
8822 assert( num_proc == (
int)send_data.size() );
8824 result.resize( num_proc );
8825 for(
int i = 0; i < num_proc; i++ )
8827 sizes_send[i] = send_data[i].size();
8828 ierr = MPI_Isend( &sizes_send[i], 1, MPI_INT,
buffProcs[i], tag, cm, &send_req[i] );
8833 std::vector< MPI_Status > stat( num_proc );
8834 ierr = MPI_Waitall( num_proc, recv_req.data(), stat.data() );
8838 ierr = MPI_Waitall( num_proc, send_req.data(), stat.data() );
8842 for(
int i = 0; i < num_proc; i++ )
8844 result[i].resize( sizes_recv[i] );
8845 ierr = MPI_Irecv( (
void*)( result[i].data() ),
sizeof(
SharedEntityData ) * sizes_recv[i], MPI_UNSIGNED_CHAR,
8851 for(
int i = 0; i < num_proc; i++ )
8853 ierr = MPI_Isend( (
void*)( send_data[i].data() ),
sizeof(
SharedEntityData ) * sizes_send[i], MPI_UNSIGNED_CHAR,
8859 ierr = MPI_Waitall( num_proc, recv_req.data(), stat.data() );
8863 ierr = MPI_Waitall( num_proc, send_req.data(), stat.data() );
8872 std::vector< std::vector< SharedEntityData > > shents(
buffProcs.size() ), send_data(
buffProcs.size() );
8906 #ifdef MOAB_HAVE_HDF5
8907 std::ostringstream ent_str;
8925 std::vector< EntityHandle > dum_connect;
8930 std::set< int > tmp_set, vset;
8933 unsigned char pstat;
8934 std::vector< EntityHandle > bad_ents;
8935 std::vector< std::string > errors;
8937 std::set< EntityHandle >::iterator vit;
8944 bad_ents.push_back( *vit );
8945 errors.push_back( std::string(
"Failure getting sharing data." ) );
8952 errors.push_back( std::string(
"Entity should be shared but isn't." ) ), bad =
true;
8956 errors.push_back( std::string(
"Entity not owned but is first proc." ) ), bad =
true;
8961 errors.push_back( std::string(
"Entity owned and multishared but not first proc or not first handle." ) ),
8966 bad_ents.push_back( *vit );
8974 int orig_ps = num_ps;
8976 std::copy( tmp_procs, tmp_procs + num_ps, std::inserter( vset, vset.begin() ) );
8982 bad_ents.push_back( *vit );
8983 errors.push_back( std::string(
"Failed to get connectivity." ) );
8987 for(
int i = 0; i < num_connect; i++ )
8992 bad_ents.push_back( *vit );
9000 std::sort( tmp_procs, tmp_procs + num_ps );
9002 std::set_intersection( tmp_procs, tmp_procs + num_ps, vset.begin(), vset.end(),
9003 std::inserter( tmp_set, tmp_set.end() ) );
9004 vset.swap( tmp_set );
9005 if( vset.empty() )
break;
9010 std::set_intersection( tmp_procs, tmp_procs + num_ps, vset.begin(), vset.end(),
9011 std::inserter( tmp_set, tmp_set.end() ) );
9012 if( orig_ps != (
int)tmp_set.size() )
9014 errors.push_back( std::string(
"Vertex proc set not same size as entity proc set." ) );
9015 bad_ents.push_back( *vit );
9016 for(
int i = 0; i < num_connect; i++ )
9018 bad_ents.push_back( connect[i] );
9019 errors.push_back( std::string(
"vertex in connect" ) );
9024 if( !bad_ents.empty() )
9026 std::cout <<
"Found bad entities in check_local_shared, proc rank " <<
procConfig.
proc_rank() <<
","
9028 std::vector< std::string >::iterator sit;
9029 std::vector< EntityHandle >::iterator rit;
9030 for( rit = bad_ents.begin(), sit = errors.begin(); rit != bad_ents.end(); ++rit, ++sit )
9033 std::cout <<
"Reason: " << *sit << std::endl;
9045 std::vector< std::vector< std::vector< SharedEntityData > > > shents, send_data;
9049 send_data.resize( num_pcs );
9050 for(
int p = 0; p < num_pcs; p++ )
9053 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
9058 shents.resize( num_pcs );
9059 for(
int p = 0; p < num_pcs; p++ )
9060 shents[p].resize( pcs[p]->
buffProcs.size() );
9062 for(
int p = 0; p < num_pcs; p++ )
9064 for(
unsigned int idx_p = 0; idx_p < pcs[p]->
buffProcs.size(); idx_p++ )
9069 assert( -1 != top_idx_p );
9070 shents[to_p][top_idx_p] = send_data[p][idx_p];
9074 for(
int p = 0; p < num_pcs; p++ )
9076 std::ostringstream ostr;
9077 ostr <<
"Processor " << p <<
" bad entities:";
9079 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
9086 const char* prefix )
9093 std::vector< EntityHandle > dum_vec;
9096 Range bad_ents, local_shared;
9097 std::vector< SharedEntityData >::iterator vit;
9098 unsigned char tmp_pstat;
9099 for(
unsigned int i = 0; i < shents.size(); i++ )
9104 for( vit = shents[i].begin(); vit != shents[i].end(); ++vit )
9106 EntityHandle localh = vit->local, remoteh = vit->remote, dumh;
9107 local_shared.
erase( localh );
9113 bad_ents.
insert( localh );
9116 if( !local_shared.
empty() ) bad_ents.
merge( local_shared );
9119 if( !bad_ents.
empty() )
9121 if( prefix ) std::cout << prefix << std::endl;
9133 const bool owned_filter )
9135 shared_ents.
clear();
9164 if( -1 != other_proc )
9175 for(
unsigned int i = 0; i < exchange_ents.size(); i++ )
9177 Range* ents = exchange_ents[i];
9178 int num_ents = ents->
size();
9181 for(
int n = 0; n < num_ents; n++ )
9217 unsigned& owner_rank,
9252 int root_proc_rank )
9255 int bytes_per_tag = 0;
9259 int sz_buffer =
sizeof( int ) + gather_ents.
size() * (
sizeof( int ) + bytes_per_tag );
9260 void* senddata = malloc( sz_buffer );
9261 ( (
int*)senddata )[0] = (int)gather_ents.
size();
9262 int* ptr_int = (
int*)senddata + 1;
9265 ptr_int = (
int*)( senddata ) + 1 + gather_ents.
size();
9268 std::vector< int > displs(
proc_config().proc_size(), 0 );
9269 MPI_Gather( &sz_buffer, 1, MPI_INT, displs.data(), 1, MPI_INT, root_proc_rank,
comm() );
9270 std::vector< int > recvcnts(
proc_config().proc_size(), 0 );
9271 std::copy( displs.begin(), displs.end(), recvcnts.begin() );
9272 std::partial_sum( displs.begin(), displs.end(), displs.begin() );
9273 std::vector< int >::iterator lastM1 = displs.end() - 1;
9274 std::copy_backward( displs.begin(), lastM1, displs.end() );
9278 if( (
int)
rank() != root_proc_rank )
9279 MPI_Gatherv( senddata, sz_buffer, MPI_BYTE, NULL, NULL, NULL, MPI_BYTE, root_proc_rank,
comm() );
9285 void* recvbuf = malloc( recvbuffsz );
9286 MPI_Gatherv( senddata, sz_buffer, MPI_BYTE, recvbuf, recvcnts.data(), displs.data(), MPI_BYTE, root_proc_rank,
9292 bool multiple_sequences =
false;
9293 if( gents.
psize() > 1 )
9294 multiple_sequences =
true;
9299 assert( NULL != gvals );
9300 assert( count > 0 );
9301 if( (
size_t)count != gents.
size() )
9303 multiple_sequences =
true;
9309 if( multiple_sequences )
9311 gvals = malloc( gents.
size() * bytes_per_tag );
9312 assert( NULL != gvals );
9315 for(
int i = 0; i != (int)
size(); i++ )
9317 int numents = *(
int*)( ( (
char*)recvbuf ) + displs[i] );
9318 int* id_ptr = (
int*)( ( (
char*)recvbuf ) + displs[i] +
sizeof(
int ) );
9319 char* val_ptr = (
char*)( id_ptr + numents );
9320 for(
int j = 0; j != numents; j++ )
9322 int idx = id_ptr[j];
9323 memcpy( (
char*)gvals + ( idx - 1 ) * bytes_per_tag, val_ptr + j * bytes_per_tag, bytes_per_tag );
9332 if( multiple_sequences )
9335 size_t start_idx = 0;
9336 while( iter != gents.
end() )
9341 assert( NULL != ptr );
9342 assert( count > 0 );
9343 memcpy( (
char*)ptr, (
char*)gvals + start_idx * bytes_per_tag, bytes_per_tag * count );
9348 assert( start_idx == gents.
size() );
9371 Range& shared_edges_owned,
9372 std::vector< std::vector< EntityHandle >* >& extraNodesVec,
9383 std::set< unsigned int > exch_procs;
9388 std::vector< MPI_Request > recv_intx_reqs( 3 *
buffProcs.size(), MPI_REQUEST_NULL );
9389 std::vector< unsigned int >::iterator sit;
9403 if( success != MPI_SUCCESS )
9405 MB_SET_ERR( MB_FAILURE,
"Failed to post irecv in settle intersection point" );
9414 Range& entities = shared_edges_owned;
9420 Range edges_to_send = entities;
9438 std::vector< EntityHandle > dum_remote_edges( edges_to_send.
size() );
9448 std::vector< EntityHandle > dum_vec;
9449 result =
get_remote_handles(
true, edges_to_send, dum_remote_edges.data(), *sit, dum_vec );
9452 count +=
sizeof( int ) * (
int)edges_to_send.
size();
9458 std::vector< EntityHandle >& intx_nodes = *( extraNodesVec[indx] );
9459 count += (int)intx_nodes.size() * 3 *
sizeof( double );
9464 PACK_EH( buff->
buff_ptr, dum_remote_edges.data(), dum_remote_edges.size() );
9470 std::vector< EntityHandle >& intx_nodes = *( extraNodesVec[indx] );
9475 buff->
buff_ptr += 3 *
sizeof( double ) * intx_nodes.size();
9483 recv_intx_reqs[3 * ind + 2], &dum_ack_buff, incoming );
9491 int index_in_recv_requests;
9493 success = MPI_Waitany( 3 *
buffProcs.size(), recv_intx_reqs.data(), &index_in_recv_requests, &status );
9494 if( MPI_SUCCESS != success )
9496 MB_SET_ERR( MB_FAILURE,
"Failed in waitany in ghost exchange" );
9499 ind = index_in_recv_requests / 3;
9508 recv_intx_reqs[3 * ind + 1],
9509 recv_intx_reqs[3 * ind + 2],
9527 std::vector< EntityHandle > rec_edges;
9528 rec_edges.resize( num_edges );
9530 for(
int i = 0; i < num_edges; i++ )
9534 std::vector< EntityHandle >& intx_nodes = *( extraNodesVec[indx] );
9538 std::vector< double > pos_from_owner;
9539 pos_from_owner.resize( 3 * nverts );
9541 std::vector< double > current_positions( 3 * intx_nodes.size() );
9542 result =
mbImpl->
get_coords( intx_nodes.data(), intx_nodes.size(), current_positions.data() );
9545 for(
int k = 0; k < (int)intx_nodes.size(); k++ )
9547 double* pk = ¤t_positions[3 * k];
9550 for(
int j = 0; j < nverts && !found; j++ )
9552 double* pj = &pos_from_owner[3 * j];
9553 double dist2 = ( pk[0] - pj[0] ) * ( pk[0] - pj[0] ) + ( pk[1] - pj[1] ) * ( pk[1] - pj[1] ) +
9554 ( pk[2] - pj[2] ) * ( pk[2] - pj[2] );
9567 std::cout <<
" pk:" << pk[0] <<
" " << pk[1] <<
" " << pk[2] <<
" not found \n";
9569 result = MB_FAILURE;
9573 result =
mbImpl->
set_coords( intx_nodes.data(), (int)intx_nodes.size(), current_positions.data() );
9589 if( MPI_SUCCESS != success )
9591 MB_SET_ERR( MB_FAILURE,
"Failure in waitall in tag exchange" );
9605 unsigned char pstat;
9608 unsigned int num_ps;
9618 if( rval !=
MB_SUCCESS || num_ps == 0 )
continue;
9620 for(
unsigned int p = 0; p < num_ps; p++ )
9622 ents_to_delete.
vi_wr[i] = tmp_procs[p];
9623 ents_to_delete.
vul_wr[i] = (
unsigned long)tmp_handles[p];
9625 ents_to_delete.
inc_n();
9632 MB_CHK_SET_ERR( cd->gs_transfer( 1, ents_to_delete, 0 ),
"Error in tuple transfer" );
9635 unsigned int received = ents_to_delete.
get_n();
9636 for( i = 0; i < received; i++ )
9639 unsigned long valrec = ents_to_delete.
vul_rd[i];
9644 std::set< EntityHandle > good_ents;
9645 for( std::set< EntityHandle >::iterator sst =
sharedEnts.begin(); sst !=
sharedEnts.end(); sst++ )
9649 if( -1 ==
index ) good_ents.insert( eh );
9659 std::ostringstream str;
9661 #define ppstat( a, b ) \
9663 if( pstat & ( a ) ) \
9665 if( num ) str << ", "; \
9684 std::cout << str.c_str() << std::endl;
9691 std::vector< std::vector< SharedEntityData > > shents(
buffProcs.size() ), send_data(
buffProcs.size() );
9731 unsigned char pstat;
9741 for(
int j = 1; j < num_sharing; j++ )
9744 int send_to_proc = ent_procs[j];
9745 tmp.
local = handles[j];
9747 assert( -1 != ind );
9748 for(
int k = 1; k < num_sharing; k++ )
9751 if( j == k )
continue;
9753 tmp.
owner = ent_procs[k];
9754 send_data[ind].push_back( tmp );
9763 for(
size_t i = 0; i < shents.size(); i++ )
9765 std::vector< SharedEntityData >& shEnts = shents[i];
9766 for(
size_t j = 0; j < shEnts.size(); j++ )
9772 unsigned char pstat;
9778 int proc_remote = tmp.
owner;
9779 if( std::find( ent_procs, ent_procs + num_sharing, proc_remote ) == ent_procs + num_sharing )
9784 std::cout <<
"THIN GHOST: we did not find on proc " <<
rank() <<
" for shared ent " << eh
9785 <<
" the proc " << proc_remote <<
"\n";
9789 handles[num_sharing] = tmp.
remote;
9790 handles[num_sharing + 1] = 0;
9791 ent_procs[num_sharing] = tmp.
owner;
9792 ent_procs[num_sharing + 1] = -1;
9797 if( 2 == num_sharing )