git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@2085 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user