Commit 9161bd98 authored by Steve Plimpton's avatar Steve Plimpton
Browse files

fixed bug with pair hybrid/overaly and manybody potentials finding the right skip neighbor method

parent 81a2db8a
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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,
+1 −1
Original line number Diff line number Diff line
@@ -57,10 +57,10 @@ namespace LAMMPS_NS {

template<class T>
class MyPage {
 public:
  int ndatum;      // total # of stored datums
  int nchunk;      // total # of stored chunks

 public:
  MyPage() {
    ndatum = nchunk = 0;
    pages = NULL;
+1 −0
Original line number Diff line number Diff line
@@ -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)
+43 −15
Original line number Diff line number Diff line
@@ -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,18 +1479,37 @@ int Neighbor::choose_pair(NeighRequest *rq)
    if (ssaflag != (mask & NP_SSA)) continue;
    if (ompflag != (mask & NP_OMP)) continue;
    if (intelflag != (mask & NP_INTEL)) continue;
    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;
    // 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 (newtflag && !(mask & NP_NEWTON)) continue;
    if (!newtflag && !(mask & NP_NEWTOFF)) continue;
    if (triclinic) {
      if (!(mask & NP_TRI)) continue;
    } else if (!triclinic) {
      if (!(mask & NP_ORTHO)) continue;
    }

    // Kokkos flags

    if (!triclinic && !(mask & NP_ORTHO)) continue;
    if (triclinic && !(mask & NP_TRI)) continue;
    if (kokkos_device_flag != (mask & NP_KOKKOS_DEVICE)) continue;
    if (kokkos_host_flag != (mask & NP_KOKKOS_HOST)) 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]);
  }
+2 −1
Original line number Diff line number Diff line
@@ -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