From 4fbc6f42c05358592df37453f40109401183ad99 Mon Sep 17 00:00:00 2001 From: sjplimp Date: Thu, 21 Aug 2008 13:53:19 +0000 Subject: [PATCH] git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@2090 f3b2605a-c512-4ea7-a41b-209d697bcdaa --- src/comm.cpp | 26 +++++++++++++++++++------- src/comm.h | 1 + src/delete_atoms.cpp | 4 ++-- src/neighbor.cpp | 40 +++++++++++++++++----------------------- src/neighbor.h | 5 ++--- 5 files changed, 41 insertions(+), 35 deletions(-) diff --git a/src/comm.cpp b/src/comm.cpp index a286968810..ae24ab1712 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -62,6 +62,7 @@ Comm::Comm(LAMMPS *lmp) : Pointers(lmp) style = SINGLE; multilo = multihi = NULL; cutghostmulti = NULL; + cutghostuser = 0.0; // initialize comm buffers & exchange memory @@ -215,14 +216,14 @@ void Comm::init() /* ---------------------------------------------------------------------- setup spatial-decomposition communication patterns - function of neighbor cutoff(s) and current box size + function of neighbor cutoff(s) & cutghostuser & current box size single style sets slab boundaries (slablo,slabhi) based on max cutoff multi style sets type-dependent slab boundaries (multilo,multihi) ------------------------------------------------------------------------- */ void Comm::setup() { - // cutghost = max distance at which ghost atoms need to be acquired + // cutghost[] = max distance at which ghost atoms need to be acquired // for orthogonal: // cutghost is in box coords = neigh->cutghost in all 3 dims // for triclinic: @@ -235,17 +236,21 @@ void Comm::setup() int ntypes = atom->ntypes; double *prd,*sublo,*subhi; + double cut = MAX(neighbor->cutneighmax,cutghostuser); + if (triclinic == 0) { prd = domain->prd; sublo = domain->sublo; subhi = domain->subhi; - cutghost[0] = cutghost[1] = cutghost[2] = neighbor->cutghost; + cutghost[0] = cutghost[1] = cutghost[2] = cut; + if (style == MULTI) { double *cuttype = neighbor->cuttype; for (i = 1; i <= ntypes; i++) cutghostmulti[i][0] = cutghostmulti[i][1] = cutghostmulti[i][2] = cuttype[i]; } + } else { prd = domain->prd_lamda; sublo = domain->sublo_lamda; @@ -253,11 +258,12 @@ void Comm::setup() double *h_inv = domain->h_inv; double length0,length1,length2; length0 = sqrt(h_inv[0]*h_inv[0] + h_inv[5]*h_inv[5] + h_inv[4]*h_inv[4]); - cutghost[0] = neighbor->cutghost * length0; + cutghost[0] = cut * length0; length1 = sqrt(h_inv[1]*h_inv[1] + h_inv[3]*h_inv[3]); - cutghost[1] = neighbor->cutghost * length1; + cutghost[1] = cut * length1; length2 = h_inv[2]; - cutghost[2] = neighbor->cutghost * length2; + cutghost[2] = cut * length2; + if (style == MULTI) { double *cuttype = neighbor->cuttype; for (i = 1; i <= ntypes; i++) { @@ -1524,11 +1530,17 @@ void Comm::set(int narg, char **arg) if (iarg+2 > narg) error->all("Illegal communicate command"); bordergroup = group->find(arg[iarg+1]); if (bordergroup < 0) - error->all("Invalid group ID in communicate command"); + error->all("Invalid group in communicate command"); if (bordergroup && (atom->firstgroupname == NULL || strcmp(arg[iarg+1],atom->firstgroupname) != 0)) error->all("Communicate group != atom_modify first group"); iarg += 2; + } else if (strcmp(arg[iarg],"cutoff") == 0) { + if (iarg+2 > narg) error->all("Illegal communicate command"); + cutghostuser = atof(arg[iarg+1]); + if (cutghostuser < 0.0) + error->all("Invalid cutoff in communicate command"); + iarg += 2; } else error->all("Illegal communicate command"); } } diff --git a/src/comm.h b/src/comm.h index 54078ad950..b1b31a60ae 100644 --- a/src/comm.h +++ b/src/comm.h @@ -72,6 +72,7 @@ class Comm : protected Pointers { int map_style; // non-0 if global->local mapping is done int ***grid2proc; // which proc owns i,j,k loc in 3d grid int bordergroup; // only communicate this group in borders + double cutghostuser; // user-specified ghost cutoff int *firstrecv; // where to put 1st recv atom in each swap int **sendlist; // list of atoms to send in each swap diff --git a/src/delete_atoms.cpp b/src/delete_atoms.cpp index ed2b4765b2..03c6cf6f20 100644 --- a/src/delete_atoms.cpp +++ b/src/delete_atoms.cpp @@ -200,8 +200,8 @@ void DeleteAtoms::delete_overlap(int narg, char **arg) // error check on cutoff - if (cut > neighbor->cutghost) - error->all("Delete_atoms cutoff > ghost cutoff"); + if (cut > neighbor->cutneighmax) + error->all("Delete_atoms cutoff > neighbor cutoff"); // setup domain, communication and neighboring // acquire ghosts diff --git a/src/neighbor.cpp b/src/neighbor.cpp index e2fe51d4c4..4b75e1ea10 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -201,15 +201,9 @@ void Neighbor::init() // set neighbor cutoffs (force cutoff + skin) // trigger determines when atoms migrate and neighbor lists are rebuilt - // cutneigh and cutneighsq determine what pairs go into neighbor list - // set to 0 if cutforce = 0 - // cutneighmin/max used for neighbor bin sizes - // cutghost determines comm distance = max of cutneigh & skin - // skin is only > cutneighmax when cutneighmax = 0.0 due to pair = NULL - // in this case, are running a bond-only simulation - // still need ghost atom communication for bonds and atom exchange - // triggered by atoms moving 1/2 skin distance, but no neigh lists formed - // user should set skin big enough to find all bonds + // needs to be non-zero for migration distance check + // even if pair = NULL and no neighbor lists are used + // cutneigh = force cutoff + skin if cutforce > 0, else cutneigh = 0 triggersq = 0.25*skin*skin; @@ -240,7 +234,6 @@ void Neighbor::init() cutneighmax = MAX(cutneighmax,cut); } } - cutghost = MAX(cutneighmax,skin); cutneighmaxsq = cutneighmax * cutneighmax; // check other classes that can induce reneighboring in decide() @@ -1053,7 +1046,7 @@ void Neighbor::setup_bins() { // bbox lo/hi = bounding box of entire domain // bbox = size of bbox of entire domain - // bsubbox lo/hi = bounding box of my subdomain extended by ghost atoms + // bsubbox lo/hi = bounding box of my subdomain extended by comm->cutghost // for triclinic: // bbox bounds all 8 corners of tilted box // subdomain is in lamda coords @@ -1061,26 +1054,27 @@ void Neighbor::setup_bins() // domain->bbox() converts lamda extent to box coords and computes bbox double bbox[3],bsubboxlo[3],bsubboxhi[3]; + double *cutghost = comm->cutghost; if (triclinic == 0) { bboxlo = domain->boxlo; bboxhi = domain->boxhi; - bsubboxlo[0] = domain->sublo[0] - cutghost; - bsubboxlo[1] = domain->sublo[1] - cutghost; - bsubboxlo[2] = domain->sublo[2] - cutghost; - bsubboxhi[0] = domain->subhi[0] + cutghost; - bsubboxhi[1] = domain->subhi[1] + cutghost; - bsubboxhi[2] = domain->subhi[2] + cutghost; + bsubboxlo[0] = domain->sublo[0] - cutghost[0]; + bsubboxlo[1] = domain->sublo[1] - cutghost[1]; + bsubboxlo[2] = domain->sublo[2] - cutghost[2]; + bsubboxhi[0] = domain->subhi[0] + cutghost[0]; + bsubboxhi[1] = domain->subhi[1] + cutghost[1]; + bsubboxhi[2] = domain->subhi[2] + cutghost[2]; } else { bboxlo = domain->boxlo_bound; bboxhi = domain->boxhi_bound; double lo[3],hi[3]; - lo[0] = domain->sublo_lamda[0] - comm->cutghost[0]; - lo[1] = domain->sublo_lamda[1] - comm->cutghost[1]; - lo[2] = domain->sublo_lamda[2] - comm->cutghost[2]; - hi[0] = domain->subhi_lamda[0] + comm->cutghost[0]; - hi[1] = domain->subhi_lamda[1] + comm->cutghost[1]; - hi[2] = domain->subhi_lamda[2] + comm->cutghost[2]; + lo[0] = domain->sublo_lamda[0] - cutghost[0]; + lo[1] = domain->sublo_lamda[1] - cutghost[1]; + lo[2] = domain->sublo_lamda[2] - cutghost[2]; + hi[0] = domain->subhi_lamda[0] + cutghost[0]; + hi[1] = domain->subhi_lamda[1] + cutghost[1]; + hi[2] = domain->subhi_lamda[2] + cutghost[2]; domain->bbox(lo,hi,bsubboxlo,bsubboxhi); } diff --git a/src/neighbor.h b/src/neighbor.h index 233eb3c8bb..a30f174959 100644 --- a/src/neighbor.h +++ b/src/neighbor.h @@ -29,7 +29,8 @@ class Neighbor : protected Pointers { int oneatom; // max # of neighbors for one atom double skin; // skin distance - double cutghost; // distance for acquiring ghost atoms + double cutneighmin; // min neighbor cutoff for all type pairs + double cutneighmax; // max neighbor cutoff for all type pairs double *cuttype; // for each type, max neigh cut w/ others int ncalls; // # of times build has been called @@ -81,8 +82,6 @@ class Neighbor : protected Pointers { int *fixchecklist; // which fixes to check double **cutneighsq; // neighbor cutneigh sq for each type pair - double cutneighmin; // min neighbor cutoff (for cutforce > 0) - double cutneighmax; // max neighbor cutoff for all type pairs double cutneighmaxsq; // cutneighmax squared double *cuttypesq; // cuttype squared