Commit 569a6a37 authored by sjplimp's avatar sjplimp
Browse files

git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@2085 f3b2605a-c512-4ea7-a41b-209d697bcdaa
parent 7f0fad18
Loading
Loading
Loading
Loading
+176 −155
Original line number Diff line number Diff line
@@ -190,6 +190,16 @@ void PPPM::init()
  }

  // setup FFT grid resolution and g_ewald
  // normally one iteration thru while loop is all that is required
  // if grid stencil extends beyond neighbor proc, reduce order and try again

  int iteration = 0;

  while (order > 0) {

    if (iteration && me == 0)
      error->warning("Reducing PPPM order b/c stencil extends beyond neighbor processor");
    iteration++;

    set_grid();

@@ -301,7 +311,7 @@ void PPPM::init()
    // nlo_ghost,nhi_ghost = # of planes I will recv from 6 directions
    //   that overlay domain I own
    // proc in that direction tells me via sendrecv()
  // if no neighbor proc, value comes from self since I have ghosts regardless
    // if no neighbor proc, value is from self since I have ghosts regardless

    int nplanes;
    MPI_Status status;
@@ -309,37 +319,43 @@ void PPPM::init()
    nplanes = nxlo_in - nxlo_out;
    if (comm->procneigh[0][0] != me)
      MPI_Sendrecv(&nplanes,1,MPI_INT,comm->procneigh[0][0],0,
		 &nxhi_ghost,1,MPI_INT,comm->procneigh[0][1],0,world,&status);
		   &nxhi_ghost,1,MPI_INT,comm->procneigh[0][1],0,
		   world,&status);
    else nxhi_ghost = nplanes;

    nplanes = nxhi_out - nxhi_in;
    if (comm->procneigh[0][1] != me)
      MPI_Sendrecv(&nplanes,1,MPI_INT,comm->procneigh[0][1],0,
		 &nxlo_ghost,1,MPI_INT,comm->procneigh[0][0],0,world,&status);
		   &nxlo_ghost,1,MPI_INT,comm->procneigh[0][0],
		   0,world,&status);
    else nxlo_ghost = nplanes;

    nplanes = nylo_in - nylo_out;
    if (comm->procneigh[1][0] != me)
      MPI_Sendrecv(&nplanes,1,MPI_INT,comm->procneigh[1][0],0,
		 &nyhi_ghost,1,MPI_INT,comm->procneigh[1][1],0,world,&status);
		   &nyhi_ghost,1,MPI_INT,comm->procneigh[1][1],0,
		   world,&status);
    else nyhi_ghost = nplanes;

    nplanes = nyhi_out - nyhi_in;
    if (comm->procneigh[1][1] != me)
      MPI_Sendrecv(&nplanes,1,MPI_INT,comm->procneigh[1][1],0,
		 &nylo_ghost,1,MPI_INT,comm->procneigh[1][0],0,world,&status);
		   &nylo_ghost,1,MPI_INT,comm->procneigh[1][0],0,
		   world,&status);
    else nylo_ghost = nplanes;

    nplanes = nzlo_in - nzlo_out;
    if (comm->procneigh[2][0] != me)
      MPI_Sendrecv(&nplanes,1,MPI_INT,comm->procneigh[2][0],0,
		 &nzhi_ghost,1,MPI_INT,comm->procneigh[2][1],0,world,&status);
		   &nzhi_ghost,1,MPI_INT,comm->procneigh[2][1],0,
		   world,&status);
    else nzhi_ghost = nplanes;

    nplanes = nzhi_out - nzhi_in;
    if (comm->procneigh[2][1] != me)
      MPI_Sendrecv(&nplanes,1,MPI_INT,comm->procneigh[2][1],0,
		 &nzlo_ghost,1,MPI_INT,comm->procneigh[2][0],0,world,&status);
		   &nzlo_ghost,1,MPI_INT,comm->procneigh[2][0],0,
		   world,&status);
    else nzlo_ghost = nplanes;

    // test that ghost overlap is not bigger than my sub-domain
@@ -355,8 +371,11 @@ void PPPM::init()
    int flag_all;
    MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world);

  if (flag_all)
    error->all("PPPM stencil extends too far, reduce PPPM order");
    if (flag_all == 0) break;
    order--;
  }

  if (order == 0) error->all("PPPM order has been reduced to 0");

  // decomposition of FFT mesh
  // global indices range from 0 to N-1
@@ -944,11 +963,13 @@ void PPPM::set_grid()
    if (screen) {
      fprintf(screen,"  G vector = %g\n",g_ewald);
      fprintf(screen,"  grid = %d %d %d\n",nx_pppm,ny_pppm,nz_pppm);
      fprintf(screen,"  stencil order = %d\n",order);
      fprintf(screen,"  RMS precision = %g\n",MAX(lpr,spr));
    }
    if (logfile) {
      fprintf(logfile,"  G vector = %g\n",g_ewald);
      fprintf(logfile,"  grid = %d %d %d\n",nx_pppm,ny_pppm,nz_pppm);
      fprintf(logfile,"  stencil order = %d\n",order);
      fprintf(logfile,"  RMS precision = %g\n",MAX(lpr,spr));
    }
  }