From 9161bd98bf091bab712a079d0f7e44eb32724749 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 21 Dec 2016 09:50:29 -0700 Subject: [PATCH] fixed bug with pair hybrid/overaly and manybody potentials finding the right skip neighbor method --- src/atom_vec_body.cpp | 4 +++ src/my_page.h | 2 +- src/neigh_list.cpp | 1 + src/neighbor.cpp | 60 +++++++++++++++++++++++++++++++------------ src/npair_skip.h | 3 ++- 5 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/atom_vec_body.cpp b/src/atom_vec_body.cpp index 30efb33e7b..86d3ed8720 100644 --- a/src/atom_vec_body.cpp +++ b/src/atom_vec_body.cpp @@ -847,6 +847,7 @@ void AtomVecBody::unpack_border(int n, int first, double *buf) inertia[2] = buf[m++]; bonus[j].ninteger = (int) ubuf(buf[m++]).i; bonus[j].ndouble = (int) ubuf(buf[m++]).i; + // corresponding put() calls are in clear_bonus() bonus[j].ivalue = icp->get(bonus[j].ninteger,bonus[j].iindex); bonus[j].dvalue = dcp->get(bonus[j].ndouble,bonus[j].dindex); m += bptr->unpack_border_body(&bonus[j],&buf[m]); @@ -897,6 +898,7 @@ void AtomVecBody::unpack_border_vel(int n, int first, double *buf) inertia[2] = buf[m++]; bonus[j].ninteger = (int) ubuf(buf[m++]).i; bonus[j].ndouble = (int) ubuf(buf[m++]).i; + // corresponding put() calls are in clear_bonus() bonus[j].ivalue = icp->get(bonus[j].ninteger,bonus[j].iindex); bonus[j].dvalue = dcp->get(bonus[j].ndouble,bonus[j].dindex); m += bptr->unpack_border_body(&bonus[j],&buf[m]); @@ -946,6 +948,7 @@ int AtomVecBody::unpack_border_hybrid(int n, int first, double *buf) inertia[2] = buf[m++]; bonus[j].ninteger = (int) ubuf(buf[m++]).i; bonus[j].ndouble = (int) ubuf(buf[m++]).i; + // corresponding put() calls are in clear_bonus() bonus[j].ivalue = icp->get(bonus[j].ninteger,bonus[j].iindex); bonus[j].dvalue = dcp->get(bonus[j].ndouble,bonus[j].dindex); m += bptr->unpack_border_body(&bonus[j],&buf[m]); @@ -1050,6 +1053,7 @@ int AtomVecBody::unpack_exchange(double *buf) inertia[2] = buf[m++]; bonus[nlocal_bonus].ninteger = (int) ubuf(buf[m++]).i; bonus[nlocal_bonus].ndouble = (int) ubuf(buf[m++]).i; + // corresponding put() calls are in copy() bonus[nlocal_bonus].ivalue = icp->get(bonus[nlocal_bonus].ninteger, bonus[nlocal_bonus].iindex); bonus[nlocal_bonus].dvalue = dcp->get(bonus[nlocal_bonus].ndouble, diff --git a/src/my_page.h b/src/my_page.h index a6b69db1b5..5d95217968 100644 --- a/src/my_page.h +++ b/src/my_page.h @@ -57,10 +57,10 @@ namespace LAMMPS_NS { template class MyPage { + public: int ndatum; // total # of stored datums int nchunk; // total # of stored chunks - public: MyPage() { ndatum = nchunk = 0; pages = NULL; diff --git a/src/neigh_list.cpp b/src/neigh_list.cpp index f8d496fc6b..a66c85ba75 100644 --- a/src/neigh_list.cpp +++ b/src/neigh_list.cpp @@ -192,6 +192,7 @@ void NeighList::setup_pages(int pgsize_caller, int oneatom_caller) gran calls grow() in granhistory respaouter calls grow() in respainner, respamiddle triggered by neighbor list build + not called if a copy list ------------------------------------------------------------------------- */ void NeighList::grow(int nlocal, int nall) diff --git a/src/neighbor.cpp b/src/neighbor.cpp index f968be1dd0..b02d88955c 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -1369,6 +1369,8 @@ int Neighbor::choose_pair(NeighRequest *rq) "with ghost neighbors"); // flags for settings the request + system requires of NPair class + // some are set to 0/1, others are set to mask bit + // comparisons below in loop over classes reflect that // copyflag = no/yes copy request // skipflag = no/yes skip request // halfflag = half request (gran and respa are also half lists) @@ -1402,7 +1404,7 @@ int Neighbor::choose_pair(NeighRequest *rq) // NOTE: exactly one of these request flags is set (see neigh_request.h) // this requires gran/respaouter also set halfflag // can simplify this logic, if follow NOTE in neigh_request.h - // all why do size/off2on and size/off2on/oneside set NP_HALF + // why do size/off2on and size/off2on/oneside set NP_HALF // either should set both half & full, or half should be in file name // to be consistent with how other NP classes use "half" @@ -1433,9 +1435,8 @@ int Neighbor::choose_pair(NeighRequest *rq) else if (rq->newton == 1) newtflag = 1; else if (rq->newton == 2) newtflag = 0; - // use flags to match exactly one of NPair class masks, bit by bit - // copyflag match returns with no further checks - // exactly one of halfflag,fullflag,halffullflag is set and thus must match + // use flags to match exactly one of NPair class masks + // sequence of checks is bit by bit in NeighConst int mask; @@ -1447,13 +1448,21 @@ int Neighbor::choose_pair(NeighRequest *rq) for (int i = 0; i < npclass; i++) { mask = pairmasks[i]; - if (copyflag && (mask & NP_COPY)) { + // if copyflag set, return or continue with no further checks + + if (copyflag) { + if (!(mask & NP_COPY)) continue; if (kokkos_device_flag != (mask & NP_KOKKOS_DEVICE)) continue; if (kokkos_host_flag != (mask & NP_KOKKOS_HOST)) continue; return i+1; } + + // skipflag must match along with other flags, so do not return + if (skipflag != (mask & NP_SKIP)) continue; + // exactly one of halfflag,fullflag,halffullflag is set and must match + if (halfflag) { if (!(mask & NP_HALF)) continue; } else if (fullflag) { @@ -1470,19 +1479,38 @@ int Neighbor::choose_pair(NeighRequest *rq) if (ssaflag != (mask & NP_SSA)) continue; if (ompflag != (mask & NP_OMP)) continue; if (intelflag != (mask & NP_INTEL)) continue; + + // style is one of NSQ,BIN,MULTI and must match + + if (style == NSQ) { + if (!(mask & NP_NSQ)) continue; + } else if (style == BIN) { + if (!(mask & NP_BIN)) continue; + } else if (style == MULTI) { + if (!(mask & NP_MULTI)) continue; + } + + // newtflag is on or off and must match + + if (newtflag) { + if (!(mask & NP_NEWTON)) continue; + } else if (!newtflag) { + if (!(mask & NP_NEWTOFF)) continue; + } + + // triclinic flag is on or off and must match + + if (triclinic) { + if (!(mask & NP_TRI)) continue; + } else if (!triclinic) { + if (!(mask & NP_ORTHO)) continue; + } + + // Kokkos flags + if (kokkos_device_flag != (mask & NP_KOKKOS_DEVICE)) continue; if (kokkos_host_flag != (mask & NP_KOKKOS_HOST)) continue; - if (style == NSQ && !(mask & NP_NSQ)) continue; - if (style == BIN && !(mask & NP_BIN)) continue; - if (style == MULTI && !(mask & NP_MULTI)) continue; - - if (newtflag && !(mask & NP_NEWTON)) continue; - if (!newtflag && !(mask & NP_NEWTOFF)) continue; - - if (!triclinic && !(mask & NP_ORTHO)) continue; - if (triclinic && !(mask & NP_TRI)) continue; - return i+1; } @@ -1727,7 +1755,7 @@ void Neighbor::build(int topoflag) for (i = 0; i < npair_perpetual; i++) { m = plist[i]; - lists[m]->grow(nlocal,nall); + if (!lists[m]->copy) lists[m]->grow(nlocal,nall); neigh_pair[m]->build_setup(); neigh_pair[m]->build(lists[m]); } diff --git a/src/npair_skip.h b/src/npair_skip.h index 872fd9cb58..f4cbdbcc6e 100644 --- a/src/npair_skip.h +++ b/src/npair_skip.h @@ -15,7 +15,8 @@ NPairStyle(skip, NPairSkip, - NP_SKIP | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | + NP_SKIP | NP_HALF | NP_FULL | NP_HALFFULL | + NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else