diff --git a/src/proxy.c b/src/proxy.c index 8ff182e386c29d49e303e5c31bd01c1f1a48fe09..41ae0308b5f914ab4e043f4501c7e216cb1fe4e0 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -195,13 +195,14 @@ void proxy_parts_exch1(struct proxy *p) { #ifdef WITH_MPI /* Send the number of particles. */ - int buff_out[2] = {p->nr_parts_out, p->nr_gparts_out}; - if (MPI_Isend(buff_out, 2, MPI_INT, p->nodeID, + p->buff_out[0] = p->nr_parts_out; + p->buff_out[1] = p->nr_gparts_out; + if (MPI_Isend(p->buff_out, 2, MPI_INT, p->nodeID, p->mynodeID * proxy_tag_shift + proxy_tag_count, MPI_COMM_WORLD, &p->req_parts_count_out) != MPI_SUCCESS) error("Failed to isend nr of parts."); - // message( "isent particle count (%i) from node %i to node %i." , - // p->nr_parts_out , p->mynodeID , p->nodeID ); fflush(stdout); + /* message( "isent particle counts [%i, %i] from node %i to node %i." , + p->buff_out[0], p->buff_out[1], p->mynodeID , p->nodeID ); fflush(stdout); */ /* Send the particle buffers. */ if (p->nr_parts_out > 0) { @@ -211,11 +212,7 @@ void proxy_parts_exch1(struct proxy *p) { MPI_Isend(p->xparts_out, sizeof(struct xpart) * p->nr_parts_out, MPI_BYTE, p->nodeID, p->mynodeID * proxy_tag_shift + proxy_tag_xparts, - MPI_COMM_WORLD, &p->req_xparts_out) != MPI_SUCCESS || - MPI_Isend(p->gparts_out, sizeof(struct gpart) * p->nr_gparts_out, - MPI_BYTE, p->nodeID, - p->mynodeID * proxy_tag_shift + proxy_tag_gparts, - MPI_COMM_WORLD, &p->req_gparts_out) != MPI_SUCCESS) + MPI_COMM_WORLD, &p->req_xparts_out) != MPI_SUCCESS) error("Failed to isend part data."); // message( "isent particle data (%i) to node %i." , p->nr_parts_out , // p->nodeID ); fflush(stdout); @@ -224,17 +221,21 @@ void proxy_parts_exch1(struct proxy *p) { p->parts_out[k].id, p->parts_out[k].x[0], p->parts_out[k].x[1], p->parts_out[k].x[2], p->parts_out[k].h, p->nodeID);*/ } + if (p->nr_gparts_out > 0) { + if (MPI_Isend(p->gparts_out, sizeof(struct gpart) * p->nr_gparts_out, + MPI_BYTE, p->nodeID, + p->mynodeID * proxy_tag_shift + proxy_tag_gparts, + MPI_COMM_WORLD, &p->req_gparts_out) != MPI_SUCCESS) + error("Failed to isend part data."); + // message( "isent gpart data (%i) to node %i." , p->nr_parts_out , + // p->nodeID ); fflush(stdout); + } /* Receive the number of particles. */ - int buff_in[2]; - if (MPI_Irecv(buff_in, 2, MPI_INT, p->nodeID, + if (MPI_Irecv(p->buff_in, 2, MPI_INT, p->nodeID, p->nodeID * proxy_tag_shift + proxy_tag_count, MPI_COMM_WORLD, &p->req_parts_count_in) != MPI_SUCCESS) error("Failed to irecv nr of parts."); - p->nr_parts_in = buff_in[0]; - p->nr_gparts_in = buff_in[1]; -// message( "irecv particle count on node %i from node %i." , p->mynodeID , -// p->nodeID ); fflush(stdout); #else error("SWIFT was not compiled with MPI support."); @@ -245,6 +246,10 @@ void proxy_parts_exch2(struct proxy *p) { #ifdef WITH_MPI + /* Unpack the incomming parts counts. */ + p->nr_parts_in = p->buff_in[0]; + p->nr_gparts_in = p->buff_in[1]; + /* Is there enough space in the buffer? */ if (p->nr_parts_in > p->size_parts_in) { do { @@ -275,14 +280,19 @@ void proxy_parts_exch2(struct proxy *p) { MPI_COMM_WORLD, &p->req_parts_in) != MPI_SUCCESS || MPI_Irecv(p->xparts_in, sizeof(struct xpart) * p->nr_parts_in, MPI_BYTE, p->nodeID, p->nodeID * proxy_tag_shift + proxy_tag_xparts, - MPI_COMM_WORLD, &p->req_xparts_in) != MPI_SUCCESS || - MPI_Irecv(p->gparts_in, sizeof(struct gpart) * p->nr_gparts_in, MPI_BYTE, - p->nodeID, p->nodeID * proxy_tag_shift + proxy_tag_gparts, - MPI_COMM_WORLD, &p->req_gparts_in) != MPI_SUCCESS) + MPI_COMM_WORLD, &p->req_xparts_in) != MPI_SUCCESS) error("Failed to irecv part data."); // message( "irecv particle data (%i) from node %i." , p->nr_parts_in , // p->nodeID ); fflush(stdout); } + if (p->nr_gparts_in > 0) { + if (MPI_Irecv(p->gparts_in, sizeof(struct gpart) * p->nr_gparts_in, MPI_BYTE, + p->nodeID, p->nodeID * proxy_tag_shift + proxy_tag_gparts, + MPI_COMM_WORLD, &p->req_gparts_in) != MPI_SUCCESS) + error("Failed to irecv gpart data."); + // message( "irecv gpart data (%i) from node %i." , p->nr_gparts_in , + // p->nodeID ); fflush(stdout); + } #else error("SWIFT was not compiled with MPI support."); diff --git a/src/proxy.h b/src/proxy.h index 014fb2e16631644f5d345589f917aa2a29bcf1a8..595147c0b60da5fc44359eff2d38fc4016293945 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -59,6 +59,9 @@ struct proxy { int nr_parts_in, nr_parts_out; int size_gparts_in, size_gparts_out; int nr_gparts_in, nr_gparts_out; + + /* Buffer to hold the incomming/outgoing particle counts. */ + int buff_out[2], buff_in[2]; /* MPI request handles. */ #ifdef WITH_MPI