Commit 5caeb2c2 authored by Steve Plimpton's avatar Steve Plimpton
Browse files

generalize to allow GridComm to be called from Fixes or Computes

parent 8b76e47d
Loading
Loading
Loading
Loading
+36 −32
Original line number Diff line number Diff line
@@ -879,18 +879,19 @@ int GridComm2::ghost_adjacent_tiled()
   use swap list in forward order to acquire copy of all needed ghost grid pts
------------------------------------------------------------------------- */

void GridComm2::forward_comm(KSpace *kspace, int nper, int nbyte, int which,
void GridComm2::forward_comm_kspace(KSpace *kspace, int nper, int nbyte, int which,
				    void *buf1, void *buf2, MPI_Datatype datatype)
{
  if (layout == REGULAR)
    forward_comm_regular(kspace,nper,nbyte,which,buf1,buf2,datatype);
    forward_comm_kspace_regular(kspace,nper,nbyte,which,buf1,buf2,datatype);
  else
    forward_comm_tiled(kspace,nper,nbyte,which,buf1,buf2,datatype);
    forward_comm_kspace_tiled(kspace,nper,nbyte,which,buf1,buf2,datatype);
}

/* ---------------------------------------------------------------------- */

void GridComm2::forward_comm_regular(KSpace *kspace, int nper, int nbyte, int which,
void GridComm2::
forward_comm_kspace_regular(KSpace *kspace, int nper, int nbyte, int which,
			    void *buf1, void *buf2, MPI_Datatype datatype)
{
  int m;
@@ -898,9 +899,9 @@ void GridComm2::forward_comm_regular(KSpace *kspace, int nper, int nbyte, int wh

  for (m = 0; m < nswap; m++) {
    if (swap[m].sendproc == me)
      kspace->pack_forward2(which,buf2,swap[m].npack,swap[m].packlist);
      kspace->pack_forward_grid(which,buf2,swap[m].npack,swap[m].packlist);
    else
      kspace->pack_forward2(which,buf1,swap[m].npack,swap[m].packlist);
      kspace->pack_forward_grid(which,buf1,swap[m].npack,swap[m].packlist);

    if (swap[m].sendproc != me) {
      if (swap[m].nunpack) MPI_Irecv(buf2,nper*swap[m].nunpack,datatype,
@@ -910,13 +911,14 @@ void GridComm2::forward_comm_regular(KSpace *kspace, int nper, int nbyte, int wh
      if (swap[m].nunpack) MPI_Wait(&request,MPI_STATUS_IGNORE);
    }

    kspace->unpack_forward2(which,buf2,swap[m].nunpack,swap[m].unpacklist);
    kspace->unpack_forward_grid(which,buf2,swap[m].nunpack,swap[m].unpacklist);
  }
}

/* ---------------------------------------------------------------------- */

void GridComm2::forward_comm_tiled(KSpace *kspace, int nper, int nbyte, int which,
void GridComm2::
forward_comm_kspace_tiled(KSpace *kspace, int nper, int nbyte, int which,
			  void *buf1, void *vbuf2, MPI_Datatype datatype)
{
  int i,m,offset;
@@ -934,15 +936,15 @@ void GridComm2::forward_comm_tiled(KSpace *kspace, int nper, int nbyte, int whic
  // perform all sends to other procs

  for (m = 0; m < nsend; m++) {
    kspace->pack_forward2(which,buf1,send[m].npack,send[m].packlist);
    kspace->pack_forward_grid(which,buf1,send[m].npack,send[m].packlist);
    MPI_Send(buf1,nper*send[m].npack,datatype,send[m].proc,0,gridcomm);
  }

  // perform all copies to self

  for (m = 0; m < ncopy; m++) {
    kspace->pack_forward2(which,buf1,copy[m].npack,copy[m].packlist);
    kspace->unpack_forward2(which,buf1,copy[m].nunpack,copy[m].unpacklist);
    kspace->pack_forward_grid(which,buf1,copy[m].npack,copy[m].packlist);
    kspace->unpack_forward_grid(which,buf1,copy[m].nunpack,copy[m].unpacklist);
  }

  // unpack all received data
@@ -950,7 +952,7 @@ void GridComm2::forward_comm_tiled(KSpace *kspace, int nper, int nbyte, int whic
  for (i = 0; i < nrecv; i++) {
    MPI_Waitany(nrecv,requests,&m,MPI_STATUS_IGNORE);
    offset = nper * recv[m].offset * nbyte;
    kspace->unpack_forward2(which,(void *) &buf2[offset],
    kspace->unpack_forward_grid(which,(void *) &buf2[offset],
				recv[m].nunpack,recv[m].unpacklist);
  }
}
@@ -960,18 +962,19 @@ void GridComm2::forward_comm_tiled(KSpace *kspace, int nper, int nbyte, int whic
   for each owned grid pt that some other proc has copy of as a ghost grid pt
------------------------------------------------------------------------- */

void GridComm2::reverse_comm(KSpace *kspace, int nper, int nbyte, int which,
void GridComm2::reverse_comm_kspace(KSpace *kspace, int nper, int nbyte, int which,
				    void *buf1, void *buf2, MPI_Datatype datatype)
{
  if (layout == REGULAR)
    reverse_comm_regular(kspace,nper,nbyte,which,buf1,buf2,datatype);
    reverse_comm_kspace_regular(kspace,nper,nbyte,which,buf1,buf2,datatype);
  else
    reverse_comm_tiled(kspace,nper,nbyte,which,buf1,buf2,datatype);
    reverse_comm_kspace_tiled(kspace,nper,nbyte,which,buf1,buf2,datatype);
}

/* ---------------------------------------------------------------------- */

void GridComm2::reverse_comm_regular(KSpace *kspace, int nper, int nbyte, int which,
void GridComm2::
reverse_comm_kspace_regular(KSpace *kspace, int nper, int nbyte, int which,
			    void *buf1, void *buf2, MPI_Datatype datatype)
{
  int m;
@@ -979,9 +982,9 @@ void GridComm2::reverse_comm_regular(KSpace *kspace, int nper, int nbyte, int wh

  for (m = nswap-1; m >= 0; m--) {
    if (swap[m].recvproc == me)
      kspace->pack_reverse2(which,buf2,swap[m].nunpack,swap[m].unpacklist);
      kspace->pack_reverse_grid(which,buf2,swap[m].nunpack,swap[m].unpacklist);
    else
      kspace->pack_reverse2(which,buf1,swap[m].nunpack,swap[m].unpacklist);
      kspace->pack_reverse_grid(which,buf1,swap[m].nunpack,swap[m].unpacklist);

    if (swap[m].recvproc != me) {
      if (swap[m].npack) MPI_Irecv(buf2,nper*swap[m].npack,datatype,
@@ -991,13 +994,14 @@ void GridComm2::reverse_comm_regular(KSpace *kspace, int nper, int nbyte, int wh
      if (swap[m].npack) MPI_Wait(&request,MPI_STATUS_IGNORE);
    }

    kspace->unpack_reverse2(which,buf2,swap[m].npack,swap[m].packlist);
    kspace->unpack_reverse_grid(which,buf2,swap[m].npack,swap[m].packlist);
  }
}

/* ---------------------------------------------------------------------- */

void GridComm2::reverse_comm_tiled(KSpace *kspace, int nper, int nbyte, int which,
void GridComm2::
reverse_comm_kspace_tiled(KSpace *kspace, int nper, int nbyte, int which,
			  void *buf1, void *vbuf2, MPI_Datatype datatype)
{
  int i,m,offset;
@@ -1015,15 +1019,15 @@ void GridComm2::reverse_comm_tiled(KSpace *kspace, int nper, int nbyte, int whic
  // perform all sends to other procs

  for (m = 0; m < nrecv; m++) {
    kspace->pack_reverse2(which,buf1,recv[m].nunpack,recv[m].unpacklist);
    kspace->pack_reverse_grid(which,buf1,recv[m].nunpack,recv[m].unpacklist);
    MPI_Send(buf1,nper*recv[m].nunpack,datatype,recv[m].proc,0,gridcomm);
  }

  // perform all copies to self

  for (m = 0; m < ncopy; m++) {
    kspace->pack_reverse2(which,buf1,copy[m].nunpack,copy[m].unpacklist);
    kspace->unpack_reverse2(which,buf1,copy[m].npack,copy[m].packlist);
    kspace->pack_reverse_grid(which,buf1,copy[m].nunpack,copy[m].unpacklist);
    kspace->unpack_reverse_grid(which,buf1,copy[m].npack,copy[m].packlist);
  }

  // unpack all received data
@@ -1031,7 +1035,7 @@ void GridComm2::reverse_comm_tiled(KSpace *kspace, int nper, int nbyte, int whic
  for (i = 0; i < nsend; i++) {
    MPI_Waitany(nsend,requests,&m,MPI_STATUS_IGNORE);
    offset = nper * send[m].offset * nbyte;
    kspace->unpack_reverse2(which,(void *) &buf2[offset],
    kspace->unpack_reverse_grid(which,(void *) &buf2[offset],
				send[m].npack,send[m].packlist);
  }
}
+12 −10
Original line number Diff line number Diff line
@@ -30,8 +30,10 @@ class GridComm2 : protected Pointers {
  ~GridComm2();
  void setup(int &, int &);
  int ghost_adjacent();
  void forward_comm(class KSpace *, int, int, int, void *, void *, MPI_Datatype);
  void reverse_comm(class KSpace *, int, int, int, void *, void *, MPI_Datatype);
  void forward_comm_kspace(class KSpace *, int, int, int,
			   void *, void *, MPI_Datatype);
  void reverse_comm_kspace(class KSpace *, int, int, int,
			   void *, void *, MPI_Datatype);

 private:
  int me,nprocs;
@@ -181,13 +183,13 @@ class GridComm2 : protected Pointers {
  int ghost_adjacent_regular();
  int ghost_adjacent_tiled();
  
  void forward_comm_regular(class KSpace *, int, int, int,
  void forward_comm_kspace_regular(class KSpace *, int, int, int,
				   void *, void *, MPI_Datatype);
  void forward_comm_tiled(class KSpace *, int, int, int,
  void forward_comm_kspace_tiled(class KSpace *, int, int, int,
				 void *, void *, MPI_Datatype);
  void reverse_comm_regular(class KSpace *, int, int, int,
  void reverse_comm_kspace_regular(class KSpace *, int, int, int,
				   void *, void *, MPI_Datatype);
  void reverse_comm_tiled(class KSpace *, int, int, int,
  void reverse_comm_kspace_tiled(class KSpace *, int, int, int,
				 void *, void *, MPI_Datatype);

  void grow_swap();
+18 −18
Original line number Diff line number Diff line
@@ -642,7 +642,7 @@ void PPPM2::compute(int eflag, int vflag)
  //   to fully sum contribution in their 3d bricks
  // remap from 3d decomposition to FFT decomposition

  gc->reverse_comm(this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
  gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
			  gc_buf1,gc_buf2,MPI_FFT_SCALAR);
  brick2fft();

@@ -657,20 +657,20 @@ void PPPM2::compute(int eflag, int vflag)
  // to fill ghost cells surrounding their 3d bricks

  if (differentiation_flag == 1)
    gc->forward_comm(this,1,sizeof(FFT_SCALAR),FORWARD_AD,
    gc->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD,
			    gc_buf1,gc_buf2,MPI_FFT_SCALAR);
  else
    gc->forward_comm(this,3,sizeof(FFT_SCALAR),FORWARD_IK,
    gc->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK,
			    gc_buf1,gc_buf2,MPI_FFT_SCALAR);

  // extra per-atom energy/virial communication

  if (evflag_atom) {
    if (differentiation_flag == 1 && vflag_atom)
      gc->forward_comm(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM,
      gc->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM,
			      gc_buf1,gc_buf2,MPI_FFT_SCALAR);
    else if (differentiation_flag == 0)
      gc->forward_comm(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM,
      gc->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM,
			      gc_buf1,gc_buf2,MPI_FFT_SCALAR);
  }

@@ -2633,7 +2633,7 @@ void PPPM2::fieldforce_peratom()
   pack own values to buf to send to another proc
------------------------------------------------------------------------- */

void PPPM2::pack_forward2(int flag, void *pbuf, int nlist, int *list)
void PPPM2::pack_forward_grid(int flag, void *pbuf, int nlist, int *list)
{
  FFT_SCALAR *buf = (FFT_SCALAR *) pbuf;
  
@@ -2693,7 +2693,7 @@ void PPPM2::pack_forward2(int flag, void *pbuf, int nlist, int *list)
   unpack another proc's own values from buf and set own ghost values
------------------------------------------------------------------------- */

void PPPM2::unpack_forward2(int flag, void *pbuf, int nlist, int *list)
void PPPM2::unpack_forward_grid(int flag, void *pbuf, int nlist, int *list)
{
  FFT_SCALAR *buf = (FFT_SCALAR *) pbuf;

@@ -2753,7 +2753,7 @@ void PPPM2::unpack_forward2(int flag, void *pbuf, int nlist, int *list)
   pack ghost values into buf to send to another proc
------------------------------------------------------------------------- */

void PPPM2::pack_reverse2(int flag, void *pbuf, int nlist, int *list)
void PPPM2::pack_reverse_grid(int flag, void *pbuf, int nlist, int *list)
{
  FFT_SCALAR *buf = (FFT_SCALAR *) pbuf;
    
@@ -2768,7 +2768,7 @@ void PPPM2::pack_reverse2(int flag, void *pbuf, int nlist, int *list)
   unpack another proc's ghost values from buf and add to own values
------------------------------------------------------------------------- */

void PPPM2::unpack_reverse2(int flag, void *pbuf, int nlist, int *list)
void PPPM2::unpack_reverse_grid(int flag, void *pbuf, int nlist, int *list)
{
  FFT_SCALAR *buf = (FFT_SCALAR *) pbuf;

@@ -3142,7 +3142,7 @@ void PPPM2::compute_group_group(int groupbit_A, int groupbit_B, int AA_flag)
  density_brick = density_A_brick;
  density_fft = density_A_fft;

  gc->reverse_comm(this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
  gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
			  gc_buf1,gc_buf2,MPI_FFT_SCALAR);
  brick2fft();

@@ -3151,7 +3151,7 @@ void PPPM2::compute_group_group(int groupbit_A, int groupbit_B, int AA_flag)
  density_brick = density_B_brick;
  density_fft = density_B_fft;

  gc->reverse_comm(this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
  gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
			  gc_buf1,gc_buf2,MPI_FFT_SCALAR);
  brick2fft();

+4 −4
Original line number Diff line number Diff line
@@ -163,10 +163,10 @@ class PPPM2 : public KSpace {

  // grid communication

  virtual void pack_forward2(int, void *, int, int *);
  virtual void unpack_forward2(int, void *, int, int *);
  virtual void pack_reverse2(int, void *, int, int *);
  virtual void unpack_reverse2(int, void *, int, int *);
  virtual void pack_forward_grid(int, void *, int, int *);
  virtual void unpack_forward_grid(int, void *, int, int *);
  virtual void pack_reverse_grid(int, void *, int, int *);
  virtual void unpack_reverse_grid(int, void *, int, int *);

  // triclinic

+5 −4
Original line number Diff line number Diff line
@@ -121,15 +121,16 @@ class KSpace : protected Pointers {
  virtual void compute(int, int) = 0;
  virtual void compute_group_group(int, int, int) {};

  // can remove these 4 when done with new GridComm
  virtual void pack_forward(int, FFT_SCALAR *, int, int *) {};
  virtual void unpack_forward(int, FFT_SCALAR *, int, int *) {};
  virtual void pack_reverse(int, FFT_SCALAR *, int, int *) {};
  virtual void unpack_reverse(int, FFT_SCALAR *, int, int *) {};

  virtual void pack_forward2(int, void *, int, int *) {};
  virtual void unpack_forward2(int, void *, int, int *) {};
  virtual void pack_reverse2(int, void *, int, int *) {};
  virtual void unpack_reverse2(int, void *, int, int *) {};
  virtual void pack_forward_grid(int, void *, int, int *) {};
  virtual void unpack_forward_grid(int, void *, int, int *) {};
  virtual void pack_reverse_grid(int, void *, int, int *) {};
  virtual void unpack_reverse_grid(int, void *, int, int *) {};

  virtual int timing(int, double &, double &) {return 0;}
  virtual int timing_1d(int, double &) {return 0;}