@@ -274,8 +274,8 @@ Vector3 SphManager::computeViscosityAcceleration(SphParticle& particle) {
274
274
void SphManager::exchangeRimParticles (SphParticle::ParticleType particle_type) {
275
275
// target domain id, source domain id, rim particles from source in direction of target domain
276
276
std::unordered_map<int , std::unordered_map<int , std::unordered_map<int , std::vector<SphParticle>>>> target_source_map;
277
- std::vector<std::array <int , 5 >> meta_list;
278
- std::vector<std::array< int , 2 > > size_list;
277
+ std::vector<std::vector <int >> meta_list;
278
+ std::vector<int > size_list;
279
279
std::vector<MPI_Request> requests;
280
280
std::unordered_map<int , std::unordered_map<int , std::vector<SphParticle>>> new_rim_particles;
281
281
int target_domain_id, source_domain_id;
@@ -302,17 +302,15 @@ void SphManager::exchangeRimParticles(SphParticle::ParticleType particle_type) {
302
302
// send meta meta data
303
303
for (int i = 0 ; i < slave_comm_size; i++) {
304
304
if (i != mpi_rank) {
305
- int meta_count = META_RIM_TAG;
306
305
int size = 0 ;
307
306
for (auto & target : target_source_map[i]) {
308
307
size += static_cast <int >(target.second .size ());
309
308
}
310
- size_list.push_back ({ size, meta_count} );
309
+ size_list.push_back (size);
311
310
312
311
requests.push_back (MPI_Request ());
313
- std::cout << mpi_rank << " send meta meta for " << size_list.back ()[0 ] << " to " << i << std::endl;
314
- MPI_Isend (size_list.back ().data (), 2 , MPI_INT, i, META_META_RIM_TAG, slave_comm, &requests.back ());
315
- meta_count+= size;
312
+ std::cout << mpi_rank << " send meta meta for " << size_list.back () << " to " << i << std::endl;
313
+ MPI_Isend (&size_list.back (), 1 , MPI_INT, i, META_META_RIM_TAG, slave_comm, &requests.back ());
316
314
}
317
315
}
318
316
MPI_Waitall (requests.size (), requests.data (), MPI_STATUS_IGNORE);
@@ -323,56 +321,56 @@ void SphManager::exchangeRimParticles(SphParticle::ParticleType particle_type) {
323
321
// receive meta meta from all other processors and post meta receives
324
322
for (int i = 0 ; i < slave_comm_size; i++) {
325
323
if (i != mpi_rank) {
326
- std::array<int , 2 > meta_meta;
327
- MPI_Recv (meta_meta.data (), 2 , MPI_INT, i, META_META_RIM_TAG, slave_comm, MPI_STATUS_IGNORE);
328
- for (int l = 0 ; l < meta_meta[0 ]; l++) {
329
- int tag = meta_meta[1 ] + l;
330
- meta_list.push_back (std::array<int , 5 >());
331
- requests.push_back (MPI_Request ());
332
- MPI_Irecv (meta_list.back ().data () + 1 , 5 , MPI_INT, i, tag, slave_comm, &requests.back ());
333
- std::cout << mpi_rank << " post meta Tag " << tag << " receive for " << i << std::endl;
334
- meta_list.back ()[0 ] = i;
335
- }
336
- // std::cout << mpi_rank << " post " << meta_meta[0] << " >= Tag " << meta_meta[1] << " receives for " << i << std::endl;
324
+ int meta_count;
325
+ requests.push_back (MPI_Request ());
326
+ MPI_Recv (&meta_count, 2 , MPI_INT, i, META_META_RIM_TAG, slave_comm, MPI_STATUS_IGNORE);
327
+ meta_list.push_back (std::vector<int >(1 + meta_count * 4 ));
328
+ MPI_Irecv (meta_list.back ().data () + 1 , 4 * meta_count, MPI_INT, i, META_RIM_TAG, slave_comm, &requests.back ());
329
+ meta_list.back ()[0 ] = i;
330
+ // std::cout << mpi_rank << " post " << meta_count[0] << " >= Tag " << meta_count[1] << " receives for " << i << std::endl;
337
331
}
338
332
}
339
333
std::cout << mpi_rank << " finished posting meta receives" << std::endl;
340
334
MPI_Barrier (slave_comm);
341
335
342
-
343
336
// send meta data
344
337
for (int i = 0 ; i < slave_comm_size; i++) {
345
338
if (i != mpi_rank) {
346
- int meta_count = META_RIM_TAG;
347
339
int count = RIM_TAG;
348
340
for (auto & target : target_source_map[i]) {
341
+ std::vector<int > meta;
349
342
for (auto & source : target.second ) {
350
343
// target domain id, source domain id, tag der richtigen Nachricht, größe der richtigen Nachricht
351
- std::array<int , 4 > meta = { target.first , source.first , count, static_cast <int >(source.second .size ()) };
352
- MPI_Ssend (meta.data (), 4 , MPI_INT, i, meta_count, slave_comm);
353
-
354
- std::cout << mpi_rank << " send meta " << meta_count << " tag " << count << " for " << meta[3 ] << " to " << i << std::endl;
355
-
344
+ meta.push_back (target.first );
345
+ meta.push_back (source.first );
346
+ meta.push_back (count);
347
+ meta.push_back (static_cast <int >(source.second .size ()));
356
348
// increment unique tag
357
349
count++;
358
- meta_count++;
359
350
}
351
+ MPI_Ssend (meta.data (), meta.size () , MPI_INT, i, META_RIM_TAG, slave_comm);
360
352
}
361
353
}
362
354
}
363
355
364
- for (auto & request : requests) {
365
- std::cout << mpi_rank << " failed sending meta with code " << MPI_Wait (&request, MPI_STATUS_IGNORE) << std::endl;
366
- }
356
+ MPI_Waitall (requests.size (), requests.data (), MPI_STATUS_IGNORE);
367
357
requests.clear ();
368
358
std::cout << mpi_rank << " finished sending meta" << std::endl;
369
359
MPI_Barrier (slave_comm);
370
360
371
361
// post receive for particles
372
362
for (auto & each_meta : meta_list) {
373
- new_rim_particles[each_meta[1 ]][each_meta[2 ]] = std::vector<SphParticle>(each_meta[4 ]);
374
- requests.push_back (MPI_Request ());
375
- MPI_Irecv (new_rim_particles[each_meta[1 ]][each_meta[2 ]].data (), each_meta[4 ] * sizeof (SphParticle), MPI_BYTE, each_meta[0 ], each_meta[3 ], slave_comm, &requests.back ());
363
+ int process_id = each_meta[0 ];
364
+ int meta_count = each_meta.size () / 4 ;
365
+ for (int i = 0 ; i < meta_count; i++) {
366
+ int target = each_meta[1 + i * 4 ];
367
+ int source = each_meta[2 + i * 4 ];
368
+ int tag = each_meta[3 + i * 4 ];
369
+ int count = each_meta[4 + i * 4 ];
370
+ new_rim_particles[target][source] = std::vector<SphParticle>(count);
371
+ requests.push_back (MPI_Request ());
372
+ MPI_Irecv (new_rim_particles[target][source].data (), count * sizeof (SphParticle), MPI_BYTE, process_id, tag, slave_comm, &requests.back ());
373
+ }
376
374
std::cout << mpi_rank << " post receive Tag " << each_meta[3 ] << " for " << each_meta[4 ] << " to " << each_meta[0 ] << std::endl;
377
375
}
378
376
0 commit comments