forked from lijiext/lammps
git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@12219 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
parent
24f79216b1
commit
e4915201df
|
@ -176,6 +176,8 @@ void CommTiled::init()
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
setup spatial-decomposition communication patterns
|
setup spatial-decomposition communication patterns
|
||||||
function of neighbor cutoff(s) & cutghostuser & current box size and tiling
|
function of neighbor cutoff(s) & cutghostuser & current box size and tiling
|
||||||
|
sets nsendproc, nrecvproc, sendproc, recvproc
|
||||||
|
sets sendother, sendself, pbc_flag, pbc, sendbox
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
void CommTiled::setup()
|
void CommTiled::setup()
|
||||||
|
@ -203,7 +205,12 @@ void CommTiled::setup()
|
||||||
error->all(FLERR,"Communication cutoff for comm_style tiled "
|
error->all(FLERR,"Communication cutoff for comm_style tiled "
|
||||||
"cannot exceed periodic box length");
|
"cannot exceed periodic box length");
|
||||||
|
|
||||||
// allocate overlap
|
// NOTE: allocate overlap (to Nprocs?)
|
||||||
|
// NOTE: allocate 2nd dim of sendproc, recvproc, sendbox
|
||||||
|
// NOTE: func pointers for box_drop and box_other
|
||||||
|
// NOTE: write box_drop and box_other methods
|
||||||
|
// NOTE: for tiled, must do one-time gather of RCB cuts and proc boxes
|
||||||
|
|
||||||
int *overlap;
|
int *overlap;
|
||||||
int noverlap,noverlap1,indexme;
|
int noverlap,noverlap1,indexme;
|
||||||
double lo1[3],hi1[3],lo2[3],hi2[3];
|
double lo1[3],hi1[3],lo2[3],hi2[3];
|
||||||
|
@ -211,134 +218,155 @@ void CommTiled::setup()
|
||||||
|
|
||||||
nswap = 0;
|
nswap = 0;
|
||||||
for (int idim = 0; idim < dimension; idim++) {
|
for (int idim = 0; idim < dimension; idim++) {
|
||||||
|
for (int iswap = 0; iswap < 2; iswap++) {
|
||||||
|
|
||||||
// ghost box in lower direction
|
// ghost box in lower direction
|
||||||
|
|
||||||
one = 1;
|
one = 1;
|
||||||
lo1[0] = sublo[0]; lo1[1] = sublo[1]; lo1[2] = sublo[2];
|
lo1[0] = sublo[0]; lo1[1] = sublo[1]; lo1[2] = sublo[2];
|
||||||
hi1[0] = subhi[0]; hi1[1] = subhi[1]; hi1[2] = subhi[2];
|
hi1[0] = subhi[0]; hi1[1] = subhi[1]; hi1[2] = subhi[2];
|
||||||
lo1[idim] = sublo[idim] - cut;
|
if (iswap == 0) {
|
||||||
hi1[idim] = sublo[idim];
|
lo1[idim] = sublo[idim] - cut;
|
||||||
|
hi1[idim] = sublo[idim];
|
||||||
two = 0;
|
|
||||||
if (periodicity[idim] && lo1[idim] < boxlo[idim]) {
|
|
||||||
two = 1;
|
|
||||||
lo2[0] = sublo[0]; lo2[1] = sublo[1]; lo2[2] = sublo[2];
|
|
||||||
hi2[0] = subhi[0]; hi2[1] = subhi[1]; hi2[2] = subhi[2];
|
|
||||||
lo2[idim] = lo1[idim] + prd[idim];
|
|
||||||
hi2[idim] = hi1[idim] + prd[idim];
|
|
||||||
if (sublo[idim] == boxlo[idim]) {
|
|
||||||
one = 0;
|
|
||||||
hi2[idim] = boxhi[idim];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
indexme = -1;
|
|
||||||
noverlap = 0;
|
|
||||||
if (one) {
|
|
||||||
if (layout == LAYOUT_UNIFORM)
|
|
||||||
box_drop_uniform(idim,lo1,hi1,noverlap,overlap,indexme);
|
|
||||||
else if (layout == LAYOUT_NONUNIFORM)
|
|
||||||
box_drop_nonuniform(idim,lo1,hi1,noverlap,overlap,indexme);
|
|
||||||
else
|
|
||||||
box_drop_tiled(lo1,hi1,0,nprocs-1,noverlap,overlap,indexme);
|
|
||||||
}
|
|
||||||
|
|
||||||
noverlap1 = noverlap;
|
|
||||||
if (two) {
|
|
||||||
if (layout == LAYOUT_UNIFORM)
|
|
||||||
box_drop_uniform(idim,lo2,hi2,noverlap,overlap,indexme);
|
|
||||||
else if (layout == LAYOUT_NONUNIFORM)
|
|
||||||
box_drop_nonuniform(idim,lo2,hi2,noverlap,overlap,indexme);
|
|
||||||
else
|
|
||||||
box_drop_tiled(lo2,hi2,0,nprocs-1,noverlap,overlap,indexme);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if this (self) proc is in overlap list, move it to end of list
|
|
||||||
|
|
||||||
if (indexme >= 0) {
|
|
||||||
int tmp = overlap[noverlap-1];
|
|
||||||
overlap[noverlap-1] = overlap[indexme];
|
|
||||||
overlap[indexme] = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
// overlap how has list of noverlap procs
|
|
||||||
// includes PBC effects
|
|
||||||
|
|
||||||
if (overlap[noverlap-1] == me) sendself[nswap] = 1;
|
|
||||||
else sendself[nswap] = 0;
|
|
||||||
if (noverlap-sendself[nswap]) sendother[nswap] = 1;
|
|
||||||
else sendother[nswap] = 0;
|
|
||||||
|
|
||||||
nsendproc[nswap] = noverlap;
|
|
||||||
for (i = 0; i < noverlap; i++) sendproc[nswap][i] = overlap[i];
|
|
||||||
nrecvproc[nswap+1] = noverlap;
|
|
||||||
for (i = 0; i < noverlap; i++) recvproc[nswap+1][i] = overlap[i];
|
|
||||||
|
|
||||||
// compute sendbox for each of my sends
|
|
||||||
// ibox = intersection of ghostbox with other proc's sub-domain
|
|
||||||
// sendbox = ibox displaced by cutoff in dim
|
|
||||||
|
|
||||||
// NOTE: need to extend send box in lower dims by cutoff
|
|
||||||
// NOTE: this logic for overlapping boxes is not correct for sending
|
|
||||||
|
|
||||||
double oboxlo[3],oboxhi[3],sbox[6];
|
|
||||||
|
|
||||||
for (i = 0; i < noverlap; i++) {
|
|
||||||
pbc_flag[nswap][i] = 0;
|
|
||||||
pbc[nswap][i][0] = pbc[nswap][i][1] = pbc[nswap][i][2] =
|
|
||||||
pbc[nswap][i][3] = pbc[nswap][i][4] = pbc[nswap][i][5] = 0;
|
|
||||||
|
|
||||||
if (layout == LAYOUT_UNIFORM)
|
|
||||||
box_other_uniform(overlap[i],oboxlo,oboxhi);
|
|
||||||
else if (layout == LAYOUT_NONUNIFORM)
|
|
||||||
box_other_nonuniform(overlap[i],oboxlo,oboxhi);
|
|
||||||
else
|
|
||||||
box_other_tiled(overlap[i],oboxlo,oboxhi);
|
|
||||||
|
|
||||||
if (i < noverlap1) {
|
|
||||||
sbox[0] = MAX(oboxlo[0],lo1[0]);
|
|
||||||
sbox[1] = MAX(oboxlo[1],lo1[1]);
|
|
||||||
sbox[2] = MAX(oboxlo[2],lo1[2]);
|
|
||||||
sbox[3] = MIN(oboxhi[0],hi1[0]);
|
|
||||||
sbox[4] = MIN(oboxhi[1],hi1[1]);
|
|
||||||
sbox[5] = MIN(oboxhi[2],hi1[2]);
|
|
||||||
sbox[idim] += cut;
|
|
||||||
sbox[3+idim] += cut;
|
|
||||||
if (sbox[idim] == lo1[idim]) sbox[idim] = sublo[idim];
|
|
||||||
} else {
|
} else {
|
||||||
pbc_flag[nswap][i] = 1;
|
lo1[idim] = subhi[idim];
|
||||||
pbc[nswap][i][idim] = 1;
|
hi1[idim] = subhi[idim] + cut;
|
||||||
sbox[0] = MAX(oboxlo[0],lo2[0]);
|
}
|
||||||
sbox[1] = MAX(oboxlo[1],lo2[1]);
|
|
||||||
sbox[2] = MAX(oboxlo[2],lo2[2]);
|
two = 0;
|
||||||
sbox[3] = MIN(oboxhi[0],hi2[0]);
|
if (iswap == 0 && periodicity[idim] && lo1[idim] < boxlo[idim]) two = 1;
|
||||||
sbox[4] = MIN(oboxhi[1],hi2[1]);
|
if (iswap == 1 && periodicity[idim] && hi1[idim] > boxhi[idim]) two = 1;
|
||||||
sbox[5] = MIN(oboxhi[2],hi2[2]);
|
|
||||||
sbox[idim] -= prd[idim] - cut;
|
if (two) {
|
||||||
sbox[3+idim] -= prd[idim] + cut;
|
lo2[0] = sublo[0]; lo2[1] = sublo[1]; lo2[2] = sublo[2];
|
||||||
if (sbox[idim] == lo1[idim]) sbox[idim] = sublo[idim];
|
hi2[0] = subhi[0]; hi2[1] = subhi[1]; hi2[2] = subhi[2];
|
||||||
|
if (iswap == 0) {
|
||||||
|
lo2[idim] = lo1[idim] + prd[idim];
|
||||||
|
hi2[idim] = hi1[idim] + prd[idim];
|
||||||
|
if (sublo[idim] == boxlo[idim]) {
|
||||||
|
one = 0;
|
||||||
|
hi2[idim] = boxhi[idim];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lo2[idim] = lo1[idim] - prd[idim];
|
||||||
|
hi2[idim] = hi1[idim] - prd[idim];
|
||||||
|
if (subhi[idim] == boxhi[idim]) {
|
||||||
|
one = 0;
|
||||||
|
lo2[idim] = boxlo[idim];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (idim >= 1) {
|
indexme = -1;
|
||||||
if (sbox[0] == sublo[0]) sbox[0] -= cut;
|
noverlap = 0;
|
||||||
if (sbox[4] == subhi[0]) sbox[4] += cut;
|
if (one) {
|
||||||
}
|
if (layout == LAYOUT_UNIFORM)
|
||||||
if (idim == 2) {
|
box_drop_uniform(idim,lo1,hi1,noverlap,overlap,indexme);
|
||||||
if (sbox[1] == sublo[1]) sbox[1] -= cut;
|
else if (layout == LAYOUT_NONUNIFORM)
|
||||||
if (sbox[5] == subhi[1]) sbox[5] += cut;
|
box_drop_nonuniform(idim,lo1,hi1,noverlap,overlap,indexme);
|
||||||
|
else
|
||||||
|
box_drop_tiled(lo1,hi1,0,nprocs-1,noverlap,overlap,indexme);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(sendbox[nswap][i],sbox,6*sizeof(double));
|
noverlap1 = noverlap;
|
||||||
|
if (two) {
|
||||||
|
if (layout == LAYOUT_UNIFORM)
|
||||||
|
box_drop_uniform(idim,lo2,hi2,noverlap,overlap,indexme);
|
||||||
|
else if (layout == LAYOUT_NONUNIFORM)
|
||||||
|
box_drop_nonuniform(idim,lo2,hi2,noverlap,overlap,indexme);
|
||||||
|
else
|
||||||
|
box_drop_tiled(lo2,hi2,0,nprocs-1,noverlap,overlap,indexme);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if this (self) proc is in overlap list, move it to end of list
|
||||||
|
|
||||||
|
if (indexme >= 0) {
|
||||||
|
int tmp = overlap[noverlap-1];
|
||||||
|
overlap[noverlap-1] = overlap[indexme];
|
||||||
|
overlap[indexme] = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// overlap how has list of noverlap procs
|
||||||
|
// includes PBC effects
|
||||||
|
|
||||||
|
if (overlap[noverlap-1] == me) sendself[nswap] = 1;
|
||||||
|
else sendself[nswap] = 0;
|
||||||
|
if (noverlap-sendself[nswap]) sendother[nswap] = 1;
|
||||||
|
else sendother[nswap] = 0;
|
||||||
|
|
||||||
|
nsendproc[nswap] = noverlap;
|
||||||
|
for (i = 0; i < noverlap; i++) sendproc[nswap][i] = overlap[i];
|
||||||
|
if (iswap == 0) {
|
||||||
|
nrecvproc[nswap+1] = noverlap;
|
||||||
|
for (i = 0; i < noverlap; i++) recvproc[nswap+1][i] = overlap[i];
|
||||||
|
} else {
|
||||||
|
nrecvproc[nswap-1] = noverlap;
|
||||||
|
for (i = 0; i < noverlap; i++) recvproc[nswap-1][i] = overlap[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// compute sendbox for each of my sends
|
||||||
|
// obox = intersection of ghostbox with other proc's sub-domain
|
||||||
|
// sbox = what I need to send to other proc
|
||||||
|
// = sublo to MIN(sublo+cut,subhi) in idim, for iswap = 0
|
||||||
|
// = MIN(subhi-cut,sublo) to subhi in idim, for iswap = 1
|
||||||
|
// = obox in other 2 dims
|
||||||
|
// if sbox touches sub-box boundaries in lower dims,
|
||||||
|
// extend sbox in those lower dims to include ghost atoms
|
||||||
|
|
||||||
|
double oboxlo[3],oboxhi[3],sbox[6];
|
||||||
|
|
||||||
|
for (i = 0; i < noverlap; i++) {
|
||||||
|
pbc_flag[nswap][i] = 0;
|
||||||
|
pbc[nswap][i][0] = pbc[nswap][i][1] = pbc[nswap][i][2] =
|
||||||
|
pbc[nswap][i][3] = pbc[nswap][i][4] = pbc[nswap][i][5] = 0;
|
||||||
|
|
||||||
|
if (layout == LAYOUT_UNIFORM)
|
||||||
|
box_other_uniform(overlap[i],oboxlo,oboxhi);
|
||||||
|
else if (layout == LAYOUT_NONUNIFORM)
|
||||||
|
box_other_nonuniform(overlap[i],oboxlo,oboxhi);
|
||||||
|
else
|
||||||
|
box_other_tiled(overlap[i],oboxlo,oboxhi);
|
||||||
|
|
||||||
|
if (i < noverlap1) {
|
||||||
|
sbox[0] = MAX(oboxlo[0],lo1[0]);
|
||||||
|
sbox[1] = MAX(oboxlo[1],lo1[1]);
|
||||||
|
sbox[2] = MAX(oboxlo[2],lo1[2]);
|
||||||
|
sbox[3] = MIN(oboxhi[0],hi1[0]);
|
||||||
|
sbox[4] = MIN(oboxhi[1],hi1[1]);
|
||||||
|
sbox[5] = MIN(oboxhi[2],hi1[2]);
|
||||||
|
} else {
|
||||||
|
pbc_flag[nswap][i] = 1;
|
||||||
|
pbc[nswap][i][idim] = 1;
|
||||||
|
sbox[0] = MAX(oboxlo[0],lo2[0]);
|
||||||
|
sbox[1] = MAX(oboxlo[1],lo2[1]);
|
||||||
|
sbox[2] = MAX(oboxlo[2],lo2[2]);
|
||||||
|
sbox[3] = MIN(oboxhi[0],hi2[0]);
|
||||||
|
sbox[4] = MIN(oboxhi[1],hi2[1]);
|
||||||
|
sbox[5] = MIN(oboxhi[2],hi2[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iswap == 0) {
|
||||||
|
sbox[idim] = sublo[idim];
|
||||||
|
sbox[3+idim] = MIN(sublo[idim]+cut,subhi[idim]);
|
||||||
|
} else {
|
||||||
|
sbox[idim] = MAX(subhi[idim]-cut,sublo[idim]);
|
||||||
|
sbox[3+idim] = subhi[idim];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idim >= 1) {
|
||||||
|
if (sbox[0] == sublo[0]) sbox[0] -= cut;
|
||||||
|
if (sbox[4] == subhi[0]) sbox[4] += cut;
|
||||||
|
}
|
||||||
|
if (idim == 2) {
|
||||||
|
if (sbox[1] == sublo[1]) sbox[1] -= cut;
|
||||||
|
if (sbox[5] == subhi[1]) sbox[5] += cut;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(sendbox[nswap][i],sbox,6*sizeof(double));
|
||||||
|
}
|
||||||
|
|
||||||
|
nswap++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ghost box in upper direction
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
nswap += 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1064,7 +1092,7 @@ int CommTiled::exchange_variable(int n, double *inbuf, double *&outbuf)
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
determine overlap list of Noverlap procs the lo/hi box overlaps
|
determine overlap list of Noverlap procs the lo/hi box overlaps
|
||||||
overlap = non-zero area in common between box and proc sub-domain
|
overlap = non-zero area in common between box and proc sub-domain
|
||||||
box is onwed by me and extends in dim
|
box is owned by me and extends in dim
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
void CommTiled::box_drop_uniform(int dim, double *lo, double *hi,
|
void CommTiled::box_drop_uniform(int dim, double *lo, double *hi,
|
||||||
|
@ -1086,7 +1114,8 @@ void CommTiled::box_drop_nonuniform(int dim, double *lo, double *hi,
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
determine overlap list of Noverlap procs the lo/hi box overlaps
|
determine overlap list of Noverlap procs the lo/hi box overlaps
|
||||||
overlap = non-zero area in common between box and proc sub-domain
|
overlap = non-zero area in common between box and proc sub-domain
|
||||||
recursive routine for traversing an RCB tree of cuts
|
recursive method for traversing an RCB tree of cuts
|
||||||
|
no need to split lo/hi box as recurse b/c OK if box extends outside RCB box
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
void CommTiled::box_drop_tiled(double *lo, double *hi,
|
void CommTiled::box_drop_tiled(double *lo, double *hi,
|
||||||
|
@ -1103,7 +1132,7 @@ void CommTiled::box_drop_tiled(double *lo, double *hi,
|
||||||
}
|
}
|
||||||
|
|
||||||
// drop box on each side of cut it extends beyond
|
// drop box on each side of cut it extends beyond
|
||||||
// use > and < criteria to not include procs it only touches
|
// use > and < criteria so does not include a box it only touches
|
||||||
// procmid = 1st processor in upper half of partition
|
// procmid = 1st processor in upper half of partition
|
||||||
// = location in tree that stores this cut
|
// = location in tree that stores this cut
|
||||||
// dim = 0,1,2 dimension of cut
|
// dim = 0,1,2 dimension of cut
|
||||||
|
|
Loading…
Reference in New Issue