11 #ifdef MOAB_HAVE_ZOLTAN
21 : comm( joincomm ), compid1( coid1 ), compid2( coid2 )
37 if( MPI_SUCCESS != mpierr )
41 if( MPI_SUCCESS != mpierr )
84 MPI_Comm_group( joincomm, &global_grp );
88 MPI_Group_size( group, &grp_size );
89 std::vector< int > rks( grp_size );
90 ranks.resize( grp_size );
92 for(
int i = 0; i < grp_size; i++ )
95 MPI_Group_translate_ranks( group, grp_size, rks.data(), global_grp, ranks.data() );
96 MPI_Group_free( &global_grp );
108 if( numElemsPerTaskInGroup1.size() !=
senderTasks.size() )
113 std::vector< int > accum;
114 accum.push_back( 0 );
118 for(
size_t k = 0; k < numElemsPerTaskInGroup1.size(); k++ )
120 total_elems += numElemsPerTaskInGroup1[k];
121 accum.push_back( total_elems );
126 int num_per_receiver = (int)( total_elems / num_recv );
127 int leftover = total_elems - num_per_receiver * num_recv;
130 std::vector< int > starts;
131 starts.resize( num_recv + 1 );
133 for(
int k = 0; k < num_recv; k++ )
135 starts[k + 1] = starts[k] + num_per_receiver;
136 if( k < leftover ) starts[k + 1]++;
141 int lastUsedReceiverRank = 0;
142 for(
int j = 0; j < num_senders; j++ )
146 for(
int k = lastUsedReceiverRank; k < num_recv; k++ )
149 if( starts[k] < accum[j + 1] && starts[k + 1] > accum[j] )
157 if( starts[k] >= accum[j] )
159 if( starts[k + 1] >= accum[j + 1] )
160 sizeOverlap = accum[j + 1] - starts[k];
162 sizeOverlap = starts[k + 1] - starts[k];
166 if( starts[k + 1] >= accum[j + 1] )
167 sizeOverlap = accum[j + 1] - accum[j];
169 sizeOverlap = starts[k + 1] - accum[j];
174 if( starts[k] > accum[j + 1] )
176 lastUsedReceiverRank = k - 1;
201 std::cout <<
" WARNING: empty partitions, some receiver tasks will receive nothing.\n";
203 for( std::map<
int, std::vector< int > >::iterator it =
recv_graph.begin(); it !=
recv_graph.end(); it++ )
205 int recv = it->first;
206 std::vector< int >&
senders = it->second;
207 packed_recv_array.push_back( recv );
208 packed_recv_array.push_back( (
int)
senders.size() );
210 for(
int k = 0; k < (int)
senders.size(); k++ )
211 packed_recv_array.push_back(
senders[k] );
220 std::vector< int >& distribution =
sender_sizes[senderTask];
222 if( distribution.size() !=
receivers.size() )
225 Range current = owned;
228 Range rleftover = current;
229 for(
size_t k = 0; k <
receivers.size(); k++ )
235 rleftover =
subtract( current, newr );
248 Range current = owned;
251 Range rleftover = current;
252 for(
size_t k = 0; k <
corr_tasks.size(); k++ )
258 rleftover =
subtract( current, newr );
275 std::vector< int > packed_recv_array;
279 int size_pack_array = (int)packed_recv_array.size();
282 for(
int k = 0; k < size_pack_array; k++ )
291 ierr = MPI_Isend( &
comm_graph[1], size_pack_array, MPI_INT,
receiver( 0 ), mtag, jcomm,
293 if( ierr != 0 )
return MB_FAILURE;
319 int receiver_proc = it->first;
320 Range ents = it->second;
327 std::cout <<
" can't get adjacencies. for entities to send\n";
332 buffer->reset_ptr(
sizeof(
int ) );
336 std::cout <<
" can't pack buffer for entities to send\n";
339 int size_pack =
buffer->get_current_size();
348 ierr = MPI_Isend(
buffer->mem_ptr, size_pack, MPI_UNSIGNED_CHAR, receiver_proc, mtag, jcomm,
350 if( ierr != 0 )
return MB_FAILURE;
362 MPI_Comm receive = pco->
comm();
363 int size_pack_array, ierr;
376 ierr = MPI_Probe(
sender( 0 ), mtag, jcomm, &status );
379 std::cout <<
" MPI_Probe failure: " << ierr <<
"\n";
383 ierr = MPI_Get_count( &status, MPI_INT, &size_pack_array );
386 std::cout <<
" MPI_Get_count failure: " << ierr <<
"\n";
390 std::cout <<
" receive comm graph size: " << size_pack_array <<
"\n";
392 pack_array.resize( size_pack_array );
393 ierr = MPI_Recv( pack_array.data(), size_pack_array, MPI_INT,
sender( 0 ), mtag, jcomm, &status );
394 if( 0 != ierr )
return MB_FAILURE;
396 std::cout <<
" receive comm graph ";
397 for(
int k = 0; k < (int)pack_array.size(); k++ )
398 std::cout <<
" " << pack_array[k];
404 ierr = MPI_Bcast( &size_pack_array, 1, MPI_INT, 0, receive );
405 if( 0 != ierr )
return MB_FAILURE;
406 pack_array.resize( size_pack_array );
407 ierr = MPI_Bcast( pack_array.data(), size_pack_array, MPI_INT, 0, receive );
408 if( 0 != ierr )
return MB_FAILURE;
415 std::vector< int >& senders_local )
431 "can't create original sending processor tag" );
433 if( !senders_local.empty() )
435 for(
size_t k = 0; k < senders_local.size(); k++ )
437 int sender1 = senders_local[k];
447 ierr = MPI_Probe( sender1, mtag, jcomm, &status );
450 std::cout <<
" MPI_Probe failure in ParCommGraph::receive_mesh " << ierr <<
"\n";
455 ierr = MPI_Get_count( &status, MPI_CHAR, &size_pack );
458 std::cout <<
" MPI_Get_count failure in ParCommGraph::receive_mesh " << ierr <<
"\n";
468 ierr = MPI_Recv(
buffer->mem_ptr, size_pack, MPI_UNSIGNED_CHAR, sender1, mtag, jcomm, &status );
471 std::cout <<
" MPI_Recv failure in ParCommGraph::receive_mesh " << ierr <<
"\n";
476 std::vector< std::vector< EntityHandle > > L1hloc, L1hrem;
477 std::vector< std::vector< int > > L1p;
478 std::vector< EntityHandle > L2hloc, L2hrem;
479 std::vector< unsigned int > L2p;
481 buffer->reset_ptr(
sizeof(
int ) );
482 std::vector< EntityHandle > entities_vec( entities.
size() );
483 std::copy( entities.
begin(), entities.
end(), entities_vec.begin() );
484 rval = pco->
unpack_buffer(
buffer->buff_ptr,
false, -1, -1, L1hloc, L1hrem, L1p, L2hloc, L2hrem, L2p,
489 std::copy( entities_vec.begin(), entities_vec.end(),
range_inserter( entities ) );
496 if( local_primary_ents.
empty() )
500 local_primary_ents = verts;
506 std::vector< int > orig_senders( local_primary_ents.
size(), sender1 );
507 rval = pco->
get_moab()->
tag_set_data( orgSendProcTag, local_primary_ents, orig_senders.data() );
511 newEnts.
merge( entities );
516 std::ostringstream partial_outFile;
518 partial_outFile <<
"part_send_" << sender1 <<
"."
523 std::cout <<
" writing from receiver " <<
rankInJoin <<
" from sender " << sender1
524 <<
" entities: " << entities.
size() << std::endl;
533 if( newEnts.
empty() )
535 std::cout <<
" WARNING: this task did not receive any entities \n";
540 newEnts =
subtract( newEnts, local_verts );
552 MB_CHK_ERR(
mb->get_connectivity( eh, conn, num_nodes ) );
563 int ierr, nsize = (int)
sendReqs.size();
564 std::vector< MPI_Status > mult_status;
565 mult_status.resize(
sendReqs.size() );
566 ierr = MPI_Waitall( nsize,
sendReqs.data(), mult_status.data() );
568 if( ierr != 0 )
return MB_FAILURE;
572 std::vector< ParallelComm::Buffer* >::iterator vit;
584 std::vector< Tag >& tag_handles )
592 int total_bytes_per_entity = 0;
594 std::vector< int > vect_bytes_per_tag;
596 std::vector< int > tag_sizes;
598 for(
size_t i = 0; i < tag_handles.size(); i++ )
601 MB_CHK_ERR(
mb->tag_get_bytes( tag_handles[i], bytes_per_tag ) );
603 MB_CHK_ERR(
mb->tag_get_length( tag_handles[i], tag_size1 ) );
605 bytes_per_tag = bytes_per_tag / tag_size1;
607 total_bytes_per_entity += bytes_per_tag;
608 vect_bytes_per_tag.push_back( bytes_per_tag );
611 MB_CHK_ERR(
mb->tag_get_length( tag_handles[i], tag_size ) );
612 tag_sizes.push_back( tag_size );
625 int receiver_proc = it->first;
626 Range ents = it->second;
627 int size_buffer = 4 + total_bytes_per_entity *
631 buffer->reset_ptr(
sizeof(
int ) );
632 for(
size_t i = 0; i < tag_handles.size(); i++ )
638 buffer->buff_ptr += vect_bytes_per_tag[i] * ents.
size();
640 *( (
int*)
buffer->mem_ptr ) = size_buffer;
643 ierr = MPI_Isend(
buffer->mem_ptr, size_buffer, MPI_UNSIGNED_CHAR, receiver_proc, mtag, jcomm,
645 if( ierr != 0 )
return MB_FAILURE;
655 Tag gidTag =
mb->globalId_tag();
656 std::vector< int > gids;
657 gids.resize( owned.
size() );
658 MB_CHK_ERR(
mb->tag_get_data( gidTag, owned, gids.data() ) );
659 std::map< int, EntityHandle > gidToHandle;
664 gidToHandle[gids[i++]] = eh;
668 for( std::map<
int, std::vector< int > >::iterator mit =
involved_IDs_map.begin();
671 int receiver_proc = mit->first;
672 std::vector< int >& eids = mit->second;
673 int size_buffer = 4 + total_bytes_per_entity *
676 buffer->reset_ptr(
sizeof(
int ) );
678 std::ofstream dbfile;
679 std::stringstream outf;
680 outf <<
"from_" <<
rankInJoin <<
"_send_to_" << receiver_proc <<
".txt";
681 dbfile.open( outf.str().c_str() );
682 dbfile <<
"from " <<
rankInJoin <<
" send to " << receiver_proc <<
"\n";
688 for( std::vector< int >::iterator it = eids.begin(); it != eids.end(); it++ )
692 for( i = 0; i < tag_handles.size(); i++ )
694 rval =
mb->tag_get_data( tag_handles[i], &eh, 1, (
void*)(
buffer->buff_ptr ) );
702 dbfile <<
"global ID " << eID <<
" local handle " <<
mb->id_from_handle( eh ) <<
" vals: ";
703 double* vals = (
double*)(
buffer->buff_ptr );
704 for(
int kk = 0; kk < tag_sizes[i]; kk++ )
706 dbfile <<
" " << *vals;
711 buffer->buff_ptr += vect_bytes_per_tag[i];
718 *( (
int*)
buffer->mem_ptr ) = size_buffer;
720 ierr = MPI_Isend(
buffer->mem_ptr, size_buffer, MPI_UNSIGNED_CHAR, receiver_proc, mtag, jcomm,
722 if( ierr != 0 )
return MB_FAILURE;
732 std::vector< std::vector< double > > valuesTags;
733 valuesTags.resize( tag_handles.size() );
734 for(
size_t i = 0; i < tag_handles.size(); i++ )
737 MB_CHK_ERR(
mb->tag_get_bytes( tag_handles[i], bytes_per_tag ) );
738 valuesTags[i].resize( owned.
size() * bytes_per_tag /
sizeof(
double ) );
740 MB_CHK_ERR(
mb->tag_get_data( tag_handles[i], owned, (
void*)( valuesTags[i].data() ) ) );
744 for( std::map<
int, std::vector< int > >::iterator mit =
involved_IDs_map.begin();
747 int receiver_proc = mit->first;
748 std::vector< int >& eids = mit->second;
749 std::vector< int >& index_in_values =
map_index[receiver_proc];
750 std::vector< int >& index_ptr =
map_ptr[receiver_proc];
751 int size_buffer = 4 + total_bytes_per_entity *
754 buffer->reset_ptr(
sizeof(
int ) );
756 std::ofstream dbfile;
757 std::stringstream outf;
758 outf <<
"from_" <<
rankInJoin <<
"_send_to_" << receiver_proc <<
".txt";
759 dbfile.open( outf.str().c_str() );
760 dbfile <<
"from " <<
rankInJoin <<
" send to " << receiver_proc <<
"\n";
765 for( std::vector< int >::iterator it = eids.begin(); it != eids.end(); it++, j++ )
767 int index_in_v = index_in_values[index_ptr[j]];
768 for(
size_t i = 0; i < tag_handles.size(); i++ )
771 *( (
double*)(
buffer->buff_ptr ) ) = valuesTags[i][index_in_v];
775 *( (
int*)
buffer->mem_ptr ) = size_buffer;
777 ierr = MPI_Isend(
buffer->mem_ptr, size_buffer, MPI_UNSIGNED_CHAR, receiver_proc, mtag, jcomm,
779 if( ierr != 0 )
return MB_FAILURE;
790 std::vector< Tag >& tag_handles )
801 int total_bytes_per_entity = 0;
802 std::vector< int > vect_bytes_per_tag;
804 std::vector< int > tag_sizes;
806 for(
size_t i = 0; i < tag_handles.size(); i++ )
809 MB_CHK_ERR(
mb->tag_get_bytes( tag_handles[i], bytes_per_tag ) );
810 total_bytes_per_entity += bytes_per_tag;
811 vect_bytes_per_tag.push_back( bytes_per_tag );
814 MB_CHK_ERR(
mb->tag_get_length( tag_handles[i], tag_size ) );
815 tag_sizes.push_back( tag_size );
829 int sender_proc = it->first;
830 Range ents = it->second;
831 int size_buffer = 4 + total_bytes_per_entity *
835 buffer->reset_ptr(
sizeof(
int ) );
837 *( (
int*)
buffer->mem_ptr ) = size_buffer;
840 ierr = MPI_Recv(
buffer->mem_ptr, size_buffer, MPI_UNSIGNED_CHAR, sender_proc, mtag, jcomm, &status );
841 if( ierr != 0 )
return MB_FAILURE;
845 for(
size_t i = 0; i < tag_handles.size(); i++ )
847 rval =
mb->tag_set_data( tag_handles[i], ents, (
void*)(
buffer->buff_ptr ) );
848 buffer->buff_ptr += vect_bytes_per_tag[i] * ents.
size();
858 Tag gidTag =
mb->globalId_tag();
859 std::vector< int > gids;
860 gids.resize( owned.
size() );
861 MB_CHK_ERR(
mb->tag_get_data( gidTag, owned, gids.data() ) );
862 std::map< int, EntityHandle > gidToHandle;
867 gidToHandle[gids[i++]] = eh;
871 for( std::map<
int, std::vector< int > >::iterator mit =
involved_IDs_map.begin();
874 int sender_proc = mit->first;
875 std::vector< int >& eids = mit->second;
876 int size_buffer = 4 + total_bytes_per_entity *
879 buffer->reset_ptr(
sizeof(
int ) );
880 *( (
int*)
buffer->mem_ptr ) = size_buffer;
883 ierr = MPI_Recv(
buffer->mem_ptr, size_buffer, MPI_UNSIGNED_CHAR, sender_proc, mtag, jcomm, &status );
884 if( ierr != 0 )
return MB_FAILURE;
887 std::ofstream dbfile;
888 std::stringstream outf;
889 outf <<
"recvFrom_" << sender_proc <<
"_on_proc_" <<
rankInJoin <<
".txt";
890 dbfile.open( outf.str().c_str() );
891 dbfile <<
"recvFrom_" << sender_proc <<
" on proc " <<
rankInJoin <<
"\n";
899 for( std::vector< int >::iterator it = eids.begin(); it != eids.end(); ++it )
902 std::map< int, EntityHandle >::iterator mit2 = gidToHandle.find( eID );
903 if( mit2 == gidToHandle.end() )
905 std::cout <<
" on rank: " <<
rankInJoin <<
" cannot find entity handle with global ID " << eID
910 for( i = 0; i < tag_handles.size(); i++ )
912 MB_CHK_ERR(
mb->tag_set_data( tag_handles[i], &eh, 1, (
void*)(
buffer->buff_ptr ) ) );
914 dbfile <<
"global ID " << eID <<
" local handle " <<
mb->id_from_handle( eh ) <<
" vals: ";
915 double* vals = (
double*)(
buffer->buff_ptr );
916 for(
int kk = 0; kk < tag_sizes[i]; kk++ )
918 dbfile <<
" " << *vals;
923 buffer->buff_ptr += vect_bytes_per_tag[i];
940 std::vector< std::vector< double > > valuesTags;
941 valuesTags.resize( tag_handles.size() );
942 for(
size_t i = 0; i < tag_handles.size(); i++ )
945 MB_CHK_ERR(
mb->tag_get_bytes( tag_handles[i], bytes_per_tag ) );
946 valuesTags[i].resize( owned.
size() * bytes_per_tag /
sizeof(
double ) );
953 for( std::map<
int, std::vector< int > >::iterator mit =
involved_IDs_map.begin();
956 int sender_proc = mit->first;
957 std::vector< int >& eids = mit->second;
958 std::vector< int >& index_in_values =
map_index[sender_proc];
959 std::vector< int >& index_ptr =
map_ptr[sender_proc];
960 int size_buffer = 4 + total_bytes_per_entity *
963 buffer->reset_ptr(
sizeof(
int ) );
966 ierr = MPI_Recv(
buffer->mem_ptr, size_buffer, MPI_UNSIGNED_CHAR, sender_proc, mtag, jcomm, &status );
967 if( ierr != 0 )
return MB_FAILURE;
970 for( std::vector< int >::iterator it = eids.begin(); it != eids.end(); ++it, ++j )
972 for(
size_t i = 0; i < tag_handles.size(); i++ )
975 double val = *( (
double*)(
buffer->buff_ptr ) );
977 for(
int k = index_ptr[j]; k < index_ptr[j + 1]; k++ )
978 valuesTags[i][index_in_values[k]] = val;
985 for(
size_t i = 0; i < tag_handles.size(); i++ )
988 MB_CHK_ERR(
mb->tag_set_data( tag_handles[i], owned, (
void*)( valuesTags[i].data() ) ) );
1000 int n = TLcovIDs.
get_n();
1002 for(
int i = 0; i < n; i++ )
1004 int to_proc = TLcovIDs.
vi_wr[2 * i];
1005 int globalIdElem = TLcovIDs.
vi_wr[2 * i + 1];
1012 std::cout <<
" towards task " << mit->first <<
" send: " << mit->second.size() <<
" cells " << std::endl;
1013 for(
size_t i = 0; i < mit->second.size(); i++ )
1015 std::cout <<
" " << mit->second[i];
1017 std::cout << std::endl;
1025 std::map<
int, std::set< int > >& idsFromProcs )
1027 for(
auto mt = idsFromProcs.begin(); mt != idsFromProcs.end(); ++mt )
1029 int fromProc = mt->first;
1030 std::set< int >& setIds = mt->second;
1034 for( std::set< int >::iterator st = setIds.begin(); st != setIds.end(); st++ )
1037 listIDs[indx++] = valueID;
1048 int n = TLBackToComp.
get_n();
1051 std::map< int, std::set< int > > uniqueIDs;
1052 for(
int i = 0; i < n; i++ )
1054 int to_proc = TLBackToComp.
vi_wr[3 * i + 2];
1055 int globalId = TLBackToComp.
vi_wr[3 * i + 1];
1056 uniqueIDs[to_proc].insert( globalId );
1061 std::vector< std::pair< int, int > > vp;
1062 vp.reserve( valuesComp.size() );
1066 for(
size_t i = 0; i < valuesComp.size(); ++i )
1068 vp.push_back( std::make_pair( valuesComp[i], i ) );
1071 sort( vp.begin(), vp.end() );
1076 for(
auto it = uniqueIDs.begin(); it != uniqueIDs.end(); ++it )
1078 int procId = it->first;
1079 std::set< int >& nums = it->second;
1080 std::vector< int >& indx =
map_ptr[procId];
1081 std::vector< int >& indices =
map_index[procId];
1082 indx.resize( nums.size() + 1 );
1086 for(
auto sst = nums.begin(); sst != nums.end(); ++sst, ++indexVal )
1090 indx[indexVal + 1] = indx[indexVal];
1091 while( ( indexInVp < (
int)valuesComp.size() ) && ( vp[indexInVp].first <= val ) )
1093 if( vp[indexInVp].
first == val )
1095 indx[indexVal + 1]++;
1096 indices.push_back( vp[indexInVp].second );
1103 std::stringstream f1;
1104 std::ofstream dbfile;
1105 f1 <<
"Involve_" << comp <<
"_" <<
rankInJoin <<
".txt";
1106 dbfile.open( f1.str().c_str() );
1109 int corrTask = mit->first;
1110 std::vector< int >& corrIds = mit->second;
1111 std::vector< int >& indx =
map_ptr[corrTask];
1112 std::vector< int >& indices =
map_index[corrTask];
1114 dbfile <<
" towards proc " << corrTask <<
" \n";
1115 for(
int i = 0; i < (int)corrIds.size(); i++ )
1117 dbfile << corrIds[i] <<
" [" << indx[i] <<
"," << indx[i + 1] <<
") : ";
1118 for(
int j = indx[i]; j < indx[i + 1]; j++ )
1119 dbfile << indices[j] <<
" ";
1152 int primaryDim =
mb->dimension_from_handle( *owned.
rbegin() );
1153 int interfaceDim = primaryDim - 1;
1159 Tag gidTag =
mb->globalId_tag();
1161 unsigned char pstatus;
1163 std::multimap< int, int > extraGraphEdges;
1165 std::map< int, int > extraCellsProc;
1174 std::cout <<
" on sender task " << pco->
rank() <<
" number of shared interface cells " << sharedEdges.
size()
1184 std::map< EntityHandle, int > edgeToCell;
1192 if( adjEnts.
size() > 0 )
1196 MB_CHK_ERR(
mb->tag_get_data( gidTag, &adjCell, 1, &gid ) );
1198 int n = TLe.
get_n();
1199 TLe.
vi_wr[2 * n] = shprocs[0];
1200 TLe.
vi_wr[2 * n + 1] = gid;
1201 TLe.
vul_wr[n] = shhandles[0];
1202 edgeToCell[
edge] = gid;
1208 std::stringstream ff2;
1209 ff2 <<
"TLe_" << pco->
rank() <<
".txt";
1216 int ne = TLe.
get_n();
1217 for(
int i = 0; i < ne; i++ )
1219 int sharedProc = TLe.
vi_rd[2 * i];
1220 int remoteCellID = TLe.
vi_rd[2 * i + 1];
1222 int localCellId = edgeToCell[localCell];
1224 std::pair< int, int > extraAdj = std::make_pair( localCellId, remoteCellID );
1225 extraGraphEdges.insert( extraAdj );
1227 extraCellsProc[remoteCellID] = sharedProc;
1229 std::cout <<
"local ID " << edgeToCell[localCell] <<
" remote cell ID: " << remoteCellID <<
"\n";
1234 if(
rootSender ) std::cout <<
" time preparing the input for Zoltan:" << t2 - t1 <<
" seconds. \n";
1236 #ifdef MOAB_HAVE_ZOLTAN
1240 std::map< int, Range > distribution;
1245 distribution, met ) );
1246 for( std::map< int, Range >::iterator mit = distribution.begin(); mit != distribution.end(); mit++ )
1248 int part_index = mit->first;
1249 assert( part_index < numNewPartitions );
1257 if(
rootSender ) std::cout <<
" time spent by Zoltan " << t3 - t2 <<
" seconds. \n";
1267 int numberReceivers =
1271 std::vector< int > displs( 1 );
1272 std::vector< int > counts( 1 );
1275 displs.resize( nSenders + 1 );
1276 counts.resize( nSenders );
1279 int ierr = MPI_Gather( &numberReceivers, 1, MPI_INT, counts.data(), 1, MPI_INT, 0, pco->
comm() );
1280 if( ierr != MPI_SUCCESS )
return MB_FAILURE;
1285 for(
int k = 0; k < nSenders; k++ )
1287 displs[k + 1] = displs[k] + counts[k];
1290 std::vector< int >
buffer;
1293 std::vector< int > recvs;
1296 recvs.push_back( mit->first );
1298 ierr = MPI_Gatherv( recvs.data(), numberReceivers, MPI_INT,
buffer.data(), counts.data(), displs.data(), MPI_INT, 0,
1300 if( ierr != MPI_SUCCESS )
return MB_FAILURE;
1307 std::ofstream dbfileSender;
1308 std::stringstream outf;
1309 outf <<
"S_" <<
compid1 <<
"_R_" <<
compid2 <<
"_SenderGraph.txt";
1310 dbfileSender.open( outf.str().c_str() );
1311 dbfileSender <<
" number senders: " << nSenders <<
"\n";
1312 dbfileSender <<
" senderRank \treceivers \n";
1313 for(
int k = 0; k < nSenders; k++ )
1315 int indexInBuff = displs[k];
1317 dbfileSender << senderTask <<
"\t\t";
1318 for(
int j = 0; j < counts[k]; j++ )
1320 int recvTask =
buffer[indexInBuff + j];
1321 dbfileSender << recvTask <<
" ";
1323 dbfileSender <<
"\n";
1325 dbfileSender.close();
1327 for(
int k = 0; k < nSenders; k++ )
1329 int indexInBuff = displs[k];
1331 for(
int j = 0; j < counts[k]; j++ )
1333 int recvTask =
buffer[indexInBuff + j];
1334 recv_graph[recvTask].push_back( senderTask );
1339 std::ofstream dbfile;
1340 std::stringstream outf2;
1341 outf2 <<
"S_" <<
compid1 <<
"_R_" <<
compid2 <<
"_RecvGraph.txt";
1342 dbfile.open( outf2.str().c_str() );
1343 dbfile <<
" number receivers: " <<
recv_graph.size() <<
"\n";
1344 dbfile <<
" receiverRank \tsenders \n";
1345 for( std::map<
int, std::vector< int > >::iterator mit =
recv_graph.begin(); mit !=
recv_graph.end(); mit++ )
1347 int recvTask = mit->first;
1348 std::vector< int >&
senders = mit->second;
1349 dbfile << recvTask <<
"\t\t";
1350 for( std::vector< int >::iterator vit =
senders.begin(); vit !=
senders.end(); vit++ )
1351 dbfile << *vit <<
" ";
1369 std::ofstream dbfile;
1370 std::stringstream outf;
1372 dbfile.open( outf.str().c_str() );
1376 for( std::map<
int, std::vector< int > >::iterator mit =
involved_IDs_map.begin();
1379 int receiver_proc = mit->first;
1380 std::vector< int >& eids = mit->second;
1381 dbfile <<
"receiver: " << receiver_proc <<
" size:" << eids.size() <<
"\n";
1388 int receiver_proc = mit->first;
1389 Range& eids = mit->second;
1390 dbfile <<
"receiver: " << receiver_proc <<
" size:" << eids.
size() <<
"\n";
1395 for( std::map<
int, std::vector< int > >::iterator mit =
involved_IDs_map.begin();
1398 int receiver_proc = mit->first;
1399 dbfile <<
"receiver: " << receiver_proc <<
" size:" << mit->second.size() <<
"\n";
1406 std::ofstream dbfile;
1407 std::stringstream outf;
1410 dbfile.open( outf.str().c_str() );
1414 for( std::map<
int, std::vector< int > >::iterator mit =
involved_IDs_map.begin();
1417 int sender_proc = mit->first;
1418 std::vector< int >& eids = mit->second;
1419 dbfile <<
"sender: " << sender_proc <<
" size:" << eids.size() <<
"\n";
1426 int sender_proc = mit->first;
1427 Range& eids = mit->second;
1428 dbfile <<
"sender: " << sender_proc <<
" size:" << eids.
size() <<
"\n";
1433 for( std::map<
int, std::vector< int > >::iterator mit =
involved_IDs_map.begin();
1436 int sender_proc = mit->first;
1437 dbfile <<
"receiver: " << sender_proc <<
" size:" << mit->second.size() <<
"\n";