git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@12017 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
@ -13,10 +13,21 @@
|
||||
|
||||
#include "lmptype.h"
|
||||
#include "comm_tiled.h"
|
||||
#include "atom.h"
|
||||
#include "atom_vec.h"
|
||||
#include "domain.h"
|
||||
#include "pair.h"
|
||||
#include "modify.h"
|
||||
#include "fix.h"
|
||||
#include "compute.h"
|
||||
#include "dump.h"
|
||||
#include "memory.h"
|
||||
#include "error.h"
|
||||
|
||||
using namespace LAMMPS_NS;
|
||||
|
||||
#define BUFFACTOR 1.5
|
||||
|
||||
enum{SINGLE,MULTI}; // same as in Comm
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
@ -39,6 +50,28 @@ CommTiled::~CommTiled()
|
||||
|
||||
void CommTiled::init()
|
||||
{
|
||||
triclinic = domain->triclinic;
|
||||
map_style = atom->map_style;
|
||||
|
||||
// comm_only = 1 if only x,f are exchanged in forward/reverse comm
|
||||
// comm_x_only = 0 if ghost_velocity since velocities are added
|
||||
|
||||
comm_x_only = atom->avec->comm_x_only;
|
||||
comm_f_only = atom->avec->comm_f_only;
|
||||
if (ghost_velocity) comm_x_only = 0;
|
||||
|
||||
// set per-atom sizes for forward/reverse/border comm
|
||||
// augment by velocity and fix quantities if needed
|
||||
|
||||
size_forward = atom->avec->size_forward;
|
||||
size_reverse = atom->avec->size_reverse;
|
||||
size_border = atom->avec->size_border;
|
||||
|
||||
if (ghost_velocity) size_forward += atom->avec->size_velocity;
|
||||
if (ghost_velocity) size_border += atom->avec->size_velocity;
|
||||
|
||||
for (int i = 0; i < modify->nfix; i++)
|
||||
size_border += modify->fix[i]->comm_border;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
@ -50,6 +83,13 @@ void CommTiled::init()
|
||||
|
||||
void CommTiled::setup()
|
||||
{
|
||||
// error on triclinic or multi?
|
||||
// set nswap
|
||||
// setup neighbor proc info for exchange()
|
||||
// setup nsendproc and nrecvproc bounts
|
||||
// setup sendproc and recvproc lists
|
||||
// setup sendbox
|
||||
// reallocate requests and statuses
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
@ -59,83 +99,78 @@ void CommTiled::setup()
|
||||
|
||||
void CommTiled::forward_comm(int dummy)
|
||||
{
|
||||
/*
|
||||
|
||||
int n;
|
||||
MPI_Request request;
|
||||
int i,irecv,n;
|
||||
MPI_Status status;
|
||||
AtomVec *avec = atom->avec;
|
||||
double **x = atom->x;
|
||||
double *buf;
|
||||
|
||||
// exchange data with another proc
|
||||
// if other proc is self, just copy
|
||||
// exchange data with another set of procs in each swap
|
||||
// if first proc in set is self, then is just self across PBC, just copy
|
||||
// if comm_x_only set, exchange or copy directly to x, don't unpack
|
||||
|
||||
for (int iswap = 0; iswap < nswap; iswap++) {
|
||||
if (sendproc[iswap] != me) {
|
||||
if (sendproc[iswap][0] != me) {
|
||||
if (comm_x_only) {
|
||||
// loop over recvs
|
||||
if (size_forward_recv[iswap]) buf = x[firstrecv[iswap]];
|
||||
else buf = NULL;
|
||||
if (size_forward_recv[iswap])
|
||||
MPI_Irecv(buf,size_forward_recv[iswap],MPI_DOUBLE,
|
||||
recvproc[iswap],0,world,&request);
|
||||
// loop over sends
|
||||
n = avec->pack_comm(sendnum[iswap],sendlist[iswap],
|
||||
buf_send,pbc_flag[iswap],pbc[iswap]);
|
||||
if (n) MPI_Send(buf_send,n,MPI_DOUBLE,sendproc[iswap],0,world);
|
||||
// wait any or all?
|
||||
if (size_forward_recv[iswap]) MPI_Wait(&request,&status);
|
||||
for (i = 0; i < nrecvproc[iswap]; i++)
|
||||
MPI_Irecv(x[firstrecv[iswap][i]],size_forward_recv[iswap][i],
|
||||
MPI_DOUBLE,recvproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
n = avec->pack_comm(sendnum[iswap][i],sendlist[iswap][i],
|
||||
buf_send,pbc_flag[iswap][i],pbc[iswap][i]);
|
||||
MPI_Send(buf_send,n,MPI_DOUBLE,sendproc[iswap][i],0,world);
|
||||
}
|
||||
MPI_Waitall(nrecvproc[iswap],requests,statuses);
|
||||
|
||||
} else if (ghost_velocity) {
|
||||
// loop over recvs
|
||||
if (size_forward_recv[iswap])
|
||||
MPI_Irecv(buf_recv,size_forward_recv[iswap],MPI_DOUBLE,
|
||||
recvproc[iswap],0,world,&request);
|
||||
// loop over sends
|
||||
n = avec->pack_comm_vel(sendnum[iswap],sendlist[iswap],
|
||||
buf_send,pbc_flag[iswap],pbc[iswap]);
|
||||
if (n) MPI_Send(buf_send,n,MPI_DOUBLE,sendproc[iswap],0,world);
|
||||
// wait any or all?
|
||||
if (size_forward_recv[iswap]) MPI_Wait(&request,&status);
|
||||
// loop over recvs and unpack each
|
||||
avec->unpack_comm_vel(recvnum[iswap],firstrecv[iswap],buf_recv);
|
||||
for (i = 0; i < nrecvproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[forward_recv_offset[iswap][i]],
|
||||
size_forward_recv[iswap][i],
|
||||
MPI_DOUBLE,recvproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
n = avec->pack_comm_vel(sendnum[iswap][i],sendlist[iswap][i],
|
||||
buf_send,pbc_flag[iswap][i],pbc[iswap][i]);
|
||||
MPI_Send(buf_send,n,MPI_DOUBLE,sendproc[iswap][i],0,world);
|
||||
}
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
MPI_Waitany(nrecvproc[iswap],requests,&irecv,&status);
|
||||
avec->unpack_comm_vel(recvnum[iswap][i],firstrecv[iswap][irecv],
|
||||
&buf_recv[forward_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
|
||||
} else {
|
||||
// loop over recvs
|
||||
if (size_forward_recv[iswap])
|
||||
MPI_Irecv(buf_recv,size_forward_recv[iswap],MPI_DOUBLE,
|
||||
recvproc[iswap],0,world,&request);
|
||||
// loop over sends
|
||||
n = avec->pack_comm(sendnum[iswap],sendlist[iswap],
|
||||
buf_send,pbc_flag[iswap],pbc[iswap]);
|
||||
if (n) MPI_Send(buf_send,n,MPI_DOUBLE,sendproc[iswap],0,world);
|
||||
// wait any or all?
|
||||
if (size_forward_recv[iswap]) MPI_Wait(&request,&status);
|
||||
// loop over recvs and unpack each
|
||||
avec->unpack_comm(recvnum[iswap],firstrecv[iswap],buf_recv);
|
||||
for (i = 0; i < nrecvproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[forward_recv_offset[iswap][i]],
|
||||
size_forward_recv[iswap][i],
|
||||
MPI_DOUBLE,recvproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
n = avec->pack_comm(sendnum[iswap][i],sendlist[iswap][i],
|
||||
buf_send,pbc_flag[iswap][i],pbc[iswap][i]);
|
||||
MPI_Send(buf_send,n,MPI_DOUBLE,sendproc[iswap][i],0,world);
|
||||
}
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
MPI_Waitany(nrecvproc[iswap],requests,&irecv,&status);
|
||||
avec->unpack_comm(recvnum[iswap][i],firstrecv[iswap][irecv],
|
||||
&buf_recv[forward_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
if (comm_x_only) {
|
||||
// single copy
|
||||
if (sendnum[iswap])
|
||||
n = avec->pack_comm(sendnum[iswap],sendlist[iswap],
|
||||
x[firstrecv[iswap]],pbc_flag[iswap],
|
||||
pbc[iswap]);
|
||||
if (sendnum[iswap][0])
|
||||
n = avec->pack_comm(sendnum[iswap][0],sendlist[iswap][0],
|
||||
x[firstrecv[iswap][0]],pbc_flag[iswap][0],
|
||||
pbc[iswap][0]);
|
||||
} else if (ghost_velocity) {
|
||||
// single copy
|
||||
n = avec->pack_comm_vel(sendnum[iswap],sendlist[iswap],
|
||||
buf_send,pbc_flag[iswap],pbc[iswap]);
|
||||
avec->unpack_comm_vel(recvnum[iswap],firstrecv[iswap],buf_send);
|
||||
n = avec->pack_comm_vel(sendnum[iswap][0],sendlist[iswap][0],
|
||||
buf_send,pbc_flag[iswap][0],pbc[iswap][0]);
|
||||
avec->unpack_comm_vel(recvnum[iswap][0],firstrecv[iswap][0],buf_send);
|
||||
} else {
|
||||
// single copy
|
||||
n = avec->pack_comm(sendnum[iswap],sendlist[iswap],
|
||||
buf_send,pbc_flag[iswap],pbc[iswap]);
|
||||
avec->unpack_comm(recvnum[iswap],firstrecv[iswap],buf_send);
|
||||
n = avec->pack_comm(sendnum[iswap][0],sendlist[iswap][0],
|
||||
buf_send,pbc_flag[iswap][0],pbc[iswap][0]);
|
||||
avec->unpack_comm(recvnum[iswap][0],firstrecv[iswap][0],buf_send);
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
@ -145,63 +180,60 @@ void CommTiled::forward_comm(int dummy)
|
||||
|
||||
void CommTiled::reverse_comm()
|
||||
{
|
||||
/*
|
||||
int n;
|
||||
int i,irecv,n;
|
||||
MPI_Request request;
|
||||
MPI_Status status;
|
||||
AtomVec *avec = atom->avec;
|
||||
double **f = atom->f;
|
||||
double *buf;
|
||||
|
||||
// exchange data with other procs in each swap
|
||||
// if other proc is self, just copy
|
||||
// exchange data with another set of procs in each swap
|
||||
// if first proc in set is self, then is just self across PBC, just copy
|
||||
// if comm_f_only set, exchange or copy directly from f, don't pack
|
||||
|
||||
for (int iswap = nswap-1; iswap >= 0; iswap--) {
|
||||
if (!selfflag[iswap]) {
|
||||
if (sendproc[iswap][0] != me) {
|
||||
if (comm_f_only) {
|
||||
// loop over recvs
|
||||
if (size_reverse_recv[iswap])
|
||||
MPI_Irecv(buf_recv,size_reverse_recv[iswap],MPI_DOUBLE,
|
||||
sendproc[iswap],0,world,&request);
|
||||
// loop over sends
|
||||
if (size_reverse_send[iswap]) buf = f[firstrecv[iswap]];
|
||||
else buf = NULL;
|
||||
if (size_reverse_send[iswap])
|
||||
MPI_Send(buf,size_reverse_send[iswap],MPI_DOUBLE,
|
||||
recvproc[iswap],0,world);
|
||||
// wait any or all?
|
||||
if (size_reverse_recv[iswap]) MPI_Wait(&request,&status);
|
||||
// loop over recvs and unpack each
|
||||
avec->unpack_reverse(sendnum[iswap],sendlist[iswap],buf_recv);
|
||||
for (i = 0; i < nsendproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[reverse_recv_offset[iswap][i]],
|
||||
size_reverse_recv[iswap][i],MPI_DOUBLE,
|
||||
sendproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nrecvproc[iswap]; i++)
|
||||
MPI_Send(f[firstrecv[iswap][i]],size_reverse_send[iswap][i],
|
||||
MPI_DOUBLE,recvproc[iswap][i],0,world);
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
MPI_Waitany(nsendproc[iswap],requests,&irecv,&status);
|
||||
avec->unpack_reverse(sendnum[iswap][irecv],sendlist[iswap][irecv],
|
||||
&buf_recv[reverse_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
|
||||
} else {
|
||||
// loop over recvs
|
||||
if (size_reverse_recv[iswap])
|
||||
MPI_Irecv(buf_recv,size_reverse_recv[iswap],MPI_DOUBLE,
|
||||
sendproc[iswap],0,world,&request);
|
||||
// loop over sends
|
||||
n = avec->pack_reverse(recvnum[iswap],firstrecv[iswap],buf_send);
|
||||
if (n) MPI_Send(buf_send,n,MPI_DOUBLE,recvproc[iswap],0,world);
|
||||
// wait any or all?
|
||||
if (size_reverse_recv[iswap]) MPI_Wait(&request,&status);
|
||||
// loop over recvs and unpack each
|
||||
avec->unpack_reverse(sendnum[iswap],sendlist[iswap],buf_recv);
|
||||
for (i = 0; i < nsendproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[reverse_recv_offset[iswap][i]],
|
||||
size_reverse_recv[iswap][i],MPI_DOUBLE,
|
||||
sendproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
n = avec->pack_reverse(recvnum[iswap][i],firstrecv[iswap][i],
|
||||
buf_send);
|
||||
MPI_Send(buf_send,n,MPI_DOUBLE,recvproc[iswap][i],0,world);
|
||||
}
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
MPI_Waitany(nsendproc[iswap],requests,&irecv,&status);
|
||||
avec->unpack_reverse(sendnum[iswap][irecv],sendlist[iswap][irecv],
|
||||
&buf_recv[reverse_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
if (comm_f_only) {
|
||||
// single copy
|
||||
if (sendnum[iswap])
|
||||
avec->unpack_reverse(sendnum[iswap],sendlist[iswap],
|
||||
f[firstrecv[iswap]]);
|
||||
if (sendnum[iswap][0])
|
||||
avec->unpack_reverse(sendnum[iswap][0],sendlist[iswap][0],
|
||||
f[firstrecv[iswap][0]]);
|
||||
} else {
|
||||
// single copy
|
||||
n = avec->pack_reverse(recvnum[iswap],firstrecv[iswap],buf_send);
|
||||
avec->unpack_reverse(sendnum[iswap],sendlist[iswap],buf_send);
|
||||
n = avec->pack_reverse(recvnum[iswap][0],firstrecv[iswap][0],buf_send);
|
||||
avec->unpack_reverse(sendnum[iswap][0],sendlist[iswap][0],buf_send);
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
@ -221,32 +253,247 @@ void CommTiled::exchange()
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
borders: list nearby atoms to send to neighboring procs at every timestep
|
||||
one list is created for every swap that will be made
|
||||
as list is made, actually do swaps
|
||||
this does equivalent of a communicate, so don't need to explicitly
|
||||
call communicate routine on reneighboring timestep
|
||||
one list is created per swap/proc that will be made
|
||||
as list is made, actually do communication
|
||||
this does equivalent of a forward_comm(), so don't need to explicitly
|
||||
call forward_comm() on reneighboring timestep
|
||||
this routine is called before every reneighboring
|
||||
for triclinic, atoms must be in lamda coords (0-1) before borders is called
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void CommTiled::borders()
|
||||
{
|
||||
int i,n,irecv,ngroup,nlast,nsend,rmaxswap;
|
||||
double xlo,xhi,ylo,yhi,zlo,zhi;
|
||||
double *bbox;
|
||||
double **x;
|
||||
MPI_Status status;
|
||||
AtomVec *avec = atom->avec;
|
||||
|
||||
// smax = max size of single send in a swap/proc
|
||||
// rmax = max size of recvs from all procs for a swap
|
||||
|
||||
int smax = 0;
|
||||
int rmax = 0;
|
||||
|
||||
// loop over all swaps in all dimensions
|
||||
|
||||
for (int iswap = 0; iswap < nswap; iswap++) {
|
||||
|
||||
// find atoms within rectangles using <= and >=
|
||||
// for x-dim swaps, check owned atoms
|
||||
// for yz-dim swaps, check owned and ghost atoms
|
||||
// store sent atom indices in list for use in future timesteps
|
||||
// NOTE: assume SINGLE mode, add back in logic for MULTI mode later
|
||||
|
||||
x = atom->x;
|
||||
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
bbox = sendbox[iswap][i];
|
||||
xlo = bbox[0]; xhi = bbox[1];
|
||||
ylo = bbox[2]; yhi = bbox[3];
|
||||
zlo = bbox[4]; zhi = bbox[5];
|
||||
|
||||
ngroup = atom->nfirst;
|
||||
if (iswap < 2) nlast = atom->nlocal;
|
||||
else nlast = atom->nlocal + atom->nghost;
|
||||
|
||||
nsend = 0;
|
||||
for (i = 0; i < ngroup; i++)
|
||||
if (x[i][0] >= xlo && x[i][0] <= xhi &&
|
||||
x[i][1] >= ylo && x[i][1] <= yhi &&
|
||||
x[i][2] >= zlo && x[i][2] <= zhi) {
|
||||
if (nsend == maxsendlist[iswap][i]) grow_list(iswap,i,nsend);
|
||||
sendlist[iswap][i][nsend++] = i;
|
||||
}
|
||||
for (i = atom->nlocal; i < nlast; i++)
|
||||
if (x[i][0] >= xlo && x[i][0] <= xhi &&
|
||||
x[i][1] >= ylo && x[i][1] <= yhi &&
|
||||
x[i][2] >= zlo && x[i][2] <= zhi) {
|
||||
if (nsend == maxsendlist[iswap][i]) grow_list(iswap,i,nsend);
|
||||
sendlist[iswap][i][nsend++] = i;
|
||||
}
|
||||
sendnum[iswap][i] = nsend;
|
||||
smax = MAX(smax,nsend);
|
||||
}
|
||||
|
||||
// send sendnum counts to procs who recv from me
|
||||
|
||||
if (sendproc[iswap][0] != me) {
|
||||
for (i = 0; i < nrecvproc[iswap]; i++)
|
||||
MPI_Irecv(&recvnum[iswap][i],1,MPI_INT,
|
||||
recvproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nsendproc[iswap]; i++)
|
||||
MPI_Send(&sendnum[iswap][i],1,MPI_INT,sendproc[iswap][i],0,world);
|
||||
MPI_Waitall(nrecvproc[iswap],requests,statuses);
|
||||
|
||||
} else recvnum[iswap][0] = sendnum[iswap][0];
|
||||
|
||||
// setup other per swap/proc values from sendnum and recvnum
|
||||
|
||||
rmaxswap = 0;
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
rmaxswap += recvnum[iswap][i];
|
||||
size_forward_recv[iswap][i] = recvnum[iswap][i]*size_forward;
|
||||
size_reverse_send[iswap][i] = recvnum[iswap][i]*size_reverse;
|
||||
size_reverse_recv[iswap][i] = sendnum[iswap][i]*size_reverse;
|
||||
if (i == 0) {
|
||||
firstrecv[iswap][0] = atom->nlocal + atom->nghost;
|
||||
forward_recv_offset[iswap][0] = 0;
|
||||
} else {
|
||||
firstrecv[iswap][i] = firstrecv[iswap][i-1] + recvnum[iswap][i-1];
|
||||
forward_recv_offset[iswap][i] =
|
||||
forward_recv_offset[iswap][i-1] + recvnum[iswap][i-1];
|
||||
}
|
||||
}
|
||||
rmax = MAX(rmax,rmaxswap);
|
||||
|
||||
// insure send/recv buffers are large enough for border comm
|
||||
|
||||
if (smax*size_border > maxsend) grow_send(smax*size_border,0);
|
||||
if (rmax*size_border > maxrecv) grow_recv(rmax*size_border);
|
||||
|
||||
// swap atoms with other procs using pack_border(), unpack_border()
|
||||
|
||||
if (sendproc[iswap][0] != me) {
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
if (ghost_velocity) {
|
||||
for (i = 0; i < nrecvproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[forward_recv_offset[iswap][i]],
|
||||
recvnum[iswap][i]*size_border,
|
||||
MPI_DOUBLE,recvproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
n = avec->pack_border_vel(sendnum[iswap][i],sendlist[iswap][i],
|
||||
buf_send,pbc_flag[iswap][i],
|
||||
pbc[iswap][i]);
|
||||
MPI_Send(buf_send,n*size_border,MPI_DOUBLE,
|
||||
sendproc[iswap][i],0,world);
|
||||
}
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
MPI_Waitany(nrecvproc[iswap],requests,&irecv,&status);
|
||||
avec->unpack_border(recvnum[iswap][i],firstrecv[iswap][irecv],
|
||||
&buf_recv[forward_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
|
||||
} else {
|
||||
for (i = 0; i < nrecvproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[forward_recv_offset[iswap][i]],
|
||||
recvnum[iswap][i]*size_border,
|
||||
MPI_DOUBLE,recvproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
n = avec->pack_border(sendnum[iswap][i],sendlist[iswap][i],
|
||||
buf_send,pbc_flag[iswap][i],pbc[iswap][i]);
|
||||
MPI_Send(buf_send,n*size_border,MPI_DOUBLE,
|
||||
sendproc[iswap][i],0,world);
|
||||
}
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
MPI_Waitany(nrecvproc[iswap],requests,&irecv,&status);
|
||||
avec->unpack_border(recvnum[iswap][i],firstrecv[iswap][irecv],
|
||||
&buf_recv[forward_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
if (ghost_velocity) {
|
||||
n = avec->pack_border_vel(sendnum[iswap][0],sendlist[iswap][0],
|
||||
buf_send,pbc_flag[iswap][0],pbc[iswap][0]);
|
||||
avec->unpack_border_vel(recvnum[iswap][0],firstrecv[iswap][0],buf_send);
|
||||
} else {
|
||||
n = avec->pack_border(sendnum[iswap][0],sendlist[iswap][0],
|
||||
buf_send,pbc_flag[iswap][0],pbc[iswap][0]);
|
||||
avec->unpack_border(recvnum[iswap][0],firstrecv[iswap][0],buf_send);
|
||||
}
|
||||
}
|
||||
|
||||
// increment ghost atoms
|
||||
|
||||
n = nrecvproc[iswap];
|
||||
atom->nghost += forward_recv_offset[iswap][n-1] + recvnum[iswap][n-1];
|
||||
}
|
||||
|
||||
// insure send/recv buffers are long enough for all forward & reverse comm
|
||||
|
||||
int max = MAX(maxforward*smax,maxreverse*rmax);
|
||||
if (max > maxsend) grow_send(max,0);
|
||||
max = MAX(maxforward*rmax,maxreverse*smax);
|
||||
if (max > maxrecv) grow_recv(max);
|
||||
|
||||
// reset global->local map
|
||||
|
||||
if (map_style) atom->map_set();
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
forward communication invoked by a Pair
|
||||
n = constant number of datums per atom
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void CommTiled::forward_comm_pair(Pair *pair)
|
||||
{
|
||||
int i,irecv,n;
|
||||
MPI_Status status;
|
||||
|
||||
for (int iswap = 0; iswap < nswap; iswap++) {
|
||||
if (sendproc[iswap][0] != me) {
|
||||
for (i = 0; i < nrecvproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[forward_recv_offset[iswap][i]],
|
||||
size_forward_recv[iswap][i],
|
||||
MPI_DOUBLE,recvproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
n = pair->pack_comm(sendnum[iswap][i],sendlist[iswap][i],
|
||||
buf_send,pbc_flag[iswap][i],pbc[iswap][i]);
|
||||
MPI_Send(buf_send,n*sendnum[iswap][i],MPI_DOUBLE,
|
||||
sendproc[iswap][i],0,world);
|
||||
}
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
MPI_Waitany(nrecvproc[iswap],requests,&irecv,&status);
|
||||
pair->unpack_comm(recvnum[iswap][irecv],firstrecv[iswap][irecv],
|
||||
&buf_recv[forward_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
|
||||
} else {
|
||||
n = pair->pack_comm(sendnum[iswap][0],sendlist[iswap][0],
|
||||
buf_send,pbc_flag[iswap][0],pbc[iswap][0]);
|
||||
pair->unpack_comm(recvnum[iswap][0],firstrecv[iswap][0],buf_send);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
reverse communication invoked by a Pair
|
||||
n = constant number of datums per atom
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void CommTiled::reverse_comm_pair(Pair *pair)
|
||||
{
|
||||
int i,irecv,n;
|
||||
MPI_Status status;
|
||||
|
||||
for (int iswap = nswap-1; iswap >= 0; iswap--) {
|
||||
if (sendproc[iswap][0] != me) {
|
||||
for (i = 0; i < nsendproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[reverse_recv_offset[iswap][i]],
|
||||
size_reverse_recv[iswap][i],MPI_DOUBLE,
|
||||
sendproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
n = pair->pack_reverse_comm(recvnum[iswap][i],firstrecv[iswap][i],
|
||||
buf_send);
|
||||
MPI_Send(buf_send,n*recvnum[iswap][i],MPI_DOUBLE,
|
||||
recvproc[iswap][i],0,world);
|
||||
}
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
MPI_Waitany(nsendproc[iswap],requests,&irecv,&status);
|
||||
pair->unpack_reverse_comm(sendnum[iswap][irecv],sendlist[iswap][irecv],
|
||||
&buf_recv[reverse_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
|
||||
} else {
|
||||
n = pair->pack_reverse_comm(recvnum[iswap][0],firstrecv[iswap][0],
|
||||
buf_send);
|
||||
pair->unpack_reverse_comm(sendnum[iswap][0],sendlist[iswap][0],buf_send);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
@ -256,6 +503,33 @@ void CommTiled::reverse_comm_pair(Pair *pair)
|
||||
|
||||
void CommTiled::forward_comm_fix(Fix *fix)
|
||||
{
|
||||
int i,irecv,n;
|
||||
MPI_Status status;
|
||||
|
||||
for (int iswap = 0; iswap < nswap; iswap++) {
|
||||
if (sendproc[iswap][0] != me) {
|
||||
for (i = 0; i < nrecvproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[forward_recv_offset[iswap][i]],
|
||||
size_forward_recv[iswap][i],
|
||||
MPI_DOUBLE,recvproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
n = fix->pack_comm(sendnum[iswap][i],sendlist[iswap][i],
|
||||
buf_send,pbc_flag[iswap][i],pbc[iswap][i]);
|
||||
MPI_Send(buf_send,n*sendnum[iswap][i],MPI_DOUBLE,
|
||||
sendproc[iswap][i],0,world);
|
||||
}
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
MPI_Waitany(nrecvproc[iswap],requests,&irecv,&status);
|
||||
fix->unpack_comm(recvnum[iswap][irecv],firstrecv[iswap][irecv],
|
||||
&buf_recv[forward_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
|
||||
} else {
|
||||
n = fix->pack_comm(sendnum[iswap][0],sendlist[iswap][0],
|
||||
buf_send,pbc_flag[iswap][0],pbc[iswap][0]);
|
||||
fix->unpack_comm(recvnum[iswap][0],firstrecv[iswap][0],buf_send);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
@ -265,11 +539,39 @@ void CommTiled::forward_comm_fix(Fix *fix)
|
||||
|
||||
void CommTiled::reverse_comm_fix(Fix *fix)
|
||||
{
|
||||
int i,irecv,n;
|
||||
MPI_Status status;
|
||||
|
||||
for (int iswap = nswap-1; iswap >= 0; iswap--) {
|
||||
if (sendproc[iswap][0] != me) {
|
||||
for (i = 0; i < nsendproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[reverse_recv_offset[iswap][i]],
|
||||
size_reverse_recv[iswap][i],MPI_DOUBLE,
|
||||
sendproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
n = fix->pack_reverse_comm(recvnum[iswap][i],firstrecv[iswap][i],
|
||||
buf_send);
|
||||
MPI_Send(buf_send,n*recvnum[iswap][i],MPI_DOUBLE,
|
||||
recvproc[iswap][i],0,world);
|
||||
}
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
MPI_Waitany(nsendproc[iswap],requests,&irecv,&status);
|
||||
fix->unpack_reverse_comm(sendnum[iswap][irecv],sendlist[iswap][irecv],
|
||||
&buf_recv[reverse_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
|
||||
} else {
|
||||
n = fix->pack_reverse_comm(recvnum[iswap][0],firstrecv[iswap][0],
|
||||
buf_send);
|
||||
fix->unpack_reverse_comm(sendnum[iswap][0],sendlist[iswap][0],buf_send);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
forward communication invoked by a Fix
|
||||
n = total datums for all atoms, allows for variable number/atom
|
||||
NOTE: complicated b/c don't know # to recv a priori
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void CommTiled::forward_comm_variable_fix(Fix *fix)
|
||||
@ -287,34 +589,148 @@ void CommTiled::reverse_comm_variable_fix(Fix *fix)
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
forward communication invoked by a Compute
|
||||
n = constant number of datums per atom
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void CommTiled::forward_comm_compute(Compute *compute)
|
||||
{
|
||||
int i,irecv,n;
|
||||
MPI_Status status;
|
||||
|
||||
for (int iswap = 0; iswap < nswap; iswap++) {
|
||||
if (sendproc[iswap][0] != me) {
|
||||
for (i = 0; i < nrecvproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[forward_recv_offset[iswap][i]],
|
||||
size_forward_recv[iswap][i],
|
||||
MPI_DOUBLE,recvproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
n = compute->pack_comm(sendnum[iswap][i],sendlist[iswap][i],
|
||||
buf_send,pbc_flag[iswap][i],pbc[iswap][i]);
|
||||
MPI_Send(buf_send,n*sendnum[iswap][i],MPI_DOUBLE,
|
||||
sendproc[iswap][i],0,world);
|
||||
}
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
MPI_Waitany(nrecvproc[iswap],requests,&irecv,&status);
|
||||
compute->unpack_comm(recvnum[iswap][irecv],firstrecv[iswap][irecv],
|
||||
&buf_recv[forward_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
|
||||
} else {
|
||||
n = compute->pack_comm(sendnum[iswap][0],sendlist[iswap][0],
|
||||
buf_send,pbc_flag[iswap][0],pbc[iswap][0]);
|
||||
compute->unpack_comm(recvnum[iswap][0],firstrecv[iswap][0],buf_send);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
reverse communication invoked by a Compute
|
||||
n = constant number of datums per atom
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void CommTiled::reverse_comm_compute(Compute *compute)
|
||||
{
|
||||
int i,irecv,n;
|
||||
MPI_Status status;
|
||||
|
||||
for (int iswap = nswap-1; iswap >= 0; iswap--) {
|
||||
if (sendproc[iswap][0] != me) {
|
||||
for (i = 0; i < nsendproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[reverse_recv_offset[iswap][i]],
|
||||
size_reverse_recv[iswap][i],MPI_DOUBLE,
|
||||
sendproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
n = compute->pack_reverse_comm(recvnum[iswap][i],firstrecv[iswap][i],
|
||||
buf_send);
|
||||
MPI_Send(buf_send,n*recvnum[iswap][i],MPI_DOUBLE,
|
||||
recvproc[iswap][i],0,world);
|
||||
}
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
MPI_Waitany(nsendproc[iswap],requests,&irecv,&status);
|
||||
compute->
|
||||
unpack_reverse_comm(sendnum[iswap][irecv],sendlist[iswap][irecv],
|
||||
&buf_recv[reverse_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
|
||||
} else {
|
||||
n = compute->pack_reverse_comm(recvnum[iswap][0],firstrecv[iswap][0],
|
||||
buf_send);
|
||||
compute->unpack_reverse_comm(sendnum[iswap][0],sendlist[iswap][0],
|
||||
buf_send);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
forward communication invoked by a Dump
|
||||
n = constant number of datums per atom
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void CommTiled::forward_comm_dump(Dump *dump)
|
||||
{
|
||||
int i,irecv,n;
|
||||
MPI_Status status;
|
||||
|
||||
for (int iswap = 0; iswap < nswap; iswap++) {
|
||||
if (sendproc[iswap][0] != me) {
|
||||
for (i = 0; i < nrecvproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[forward_recv_offset[iswap][i]],
|
||||
size_forward_recv[iswap][i],
|
||||
MPI_DOUBLE,recvproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
n = dump->pack_comm(sendnum[iswap][i],sendlist[iswap][i],
|
||||
buf_send,pbc_flag[iswap][i],pbc[iswap][i]);
|
||||
MPI_Send(buf_send,n*sendnum[iswap][i],MPI_DOUBLE,
|
||||
sendproc[iswap][i],0,world);
|
||||
}
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
MPI_Waitany(nrecvproc[iswap],requests,&irecv,&status);
|
||||
dump->unpack_comm(recvnum[iswap][irecv],firstrecv[iswap][irecv],
|
||||
&buf_recv[forward_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
|
||||
} else {
|
||||
n = dump->pack_comm(sendnum[iswap][0],sendlist[iswap][0],
|
||||
buf_send,pbc_flag[iswap][0],pbc[iswap][0]);
|
||||
dump->unpack_comm(recvnum[iswap][0],firstrecv[iswap][0],buf_send);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
reverse communication invoked by a Dump
|
||||
n = constant number of datums per atom
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void CommTiled::reverse_comm_dump(Dump *dump)
|
||||
{
|
||||
int i,irecv,n;
|
||||
MPI_Status status;
|
||||
|
||||
for (int iswap = nswap-1; iswap >= 0; iswap--) {
|
||||
if (sendproc[iswap][0] != me) {
|
||||
for (i = 0; i < nsendproc[iswap]; i++)
|
||||
MPI_Irecv(&buf_recv[reverse_recv_offset[iswap][i]],
|
||||
size_reverse_recv[iswap][i],MPI_DOUBLE,
|
||||
sendproc[iswap][i],0,world,&requests[i]);
|
||||
for (i = 0; i < nrecvproc[iswap]; i++) {
|
||||
n = dump->pack_reverse_comm(recvnum[iswap][i],firstrecv[iswap][i],
|
||||
buf_send);
|
||||
MPI_Send(buf_send,n*recvnum[iswap][i],MPI_DOUBLE,
|
||||
recvproc[iswap][i],0,world);
|
||||
}
|
||||
for (i = 0; i < nsendproc[iswap]; i++) {
|
||||
MPI_Waitany(nsendproc[iswap],requests,&irecv,&status);
|
||||
dump->unpack_reverse_comm(sendnum[iswap][irecv],sendlist[iswap][irecv],
|
||||
&buf_recv[reverse_recv_offset[iswap][irecv]]);
|
||||
}
|
||||
|
||||
} else {
|
||||
n = dump->pack_reverse_comm(recvnum[iswap][0],firstrecv[iswap][0],
|
||||
buf_send);
|
||||
dump->unpack_reverse_comm(sendnum[iswap][0],sendlist[iswap][0],buf_send);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
@ -335,6 +751,45 @@ int CommTiled::exchange_variable(int n, double *inbuf, double *&outbuf)
|
||||
return nrecv;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
realloc the size of the send buffer as needed with BUFFACTOR and bufextra
|
||||
if flag = 1, realloc
|
||||
if flag = 0, don't need to realloc with copy, just free/malloc
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void CommTiled::grow_send(int n, int flag)
|
||||
{
|
||||
maxsend = static_cast<int> (BUFFACTOR * n);
|
||||
if (flag)
|
||||
memory->grow(buf_send,maxsend+bufextra,"comm:buf_send");
|
||||
else {
|
||||
memory->destroy(buf_send);
|
||||
memory->create(buf_send,maxsend+bufextra,"comm:buf_send");
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
free/malloc the size of the recv buffer as needed with BUFFACTOR
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void CommTiled::grow_recv(int n)
|
||||
{
|
||||
maxrecv = static_cast<int> (BUFFACTOR * n);
|
||||
memory->destroy(buf_recv);
|
||||
memory->create(buf_recv,maxrecv,"comm:buf_recv");
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
realloc the size of the iswap sendlist as needed with BUFFACTOR
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void CommTiled::grow_list(int iswap, int iwhich, int n)
|
||||
{
|
||||
maxsendlist[iswap][iwhich] = static_cast<int> (BUFFACTOR * n);
|
||||
memory->grow(sendlist[iswap][iwhich],maxsendlist[iswap][iwhich],
|
||||
"comm:sendlist[iswap]");
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
return # of bytes of allocated memory
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
Reference in New Issue
Block a user