1 // clang-format off
2 /* ----------------------------------------------------------------------
3    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
4    https://www.lammps.org/, Sandia National Laboratories
5    Steve Plimpton, sjplimp@sandia.gov
6 
7    Copyright (2003) Sandia Corporation.  Under the terms of Contract
8    DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
9    certain rights in this software.  This software is distributed under
10    the GNU General Public License.
11 
12    See the README file in the top-level LAMMPS directory.
13 ------------------------------------------------------------------------- */
14 
15 #include "npair_skip_respa.h"
16 
17 #include "atom.h"
18 #include "error.h"
19 #include "my_page.h"
20 #include "neigh_list.h"
21 
22 using namespace LAMMPS_NS;
23 
24 /* ---------------------------------------------------------------------- */
25 
NPairSkipRespa(LAMMPS * lmp)26 NPairSkipRespa::NPairSkipRespa(LAMMPS *lmp) : NPair(lmp) {}
27 
28 /* ----------------------------------------------------------------------
29    build skip list for subset of types from parent list
30    iskip and ijskip flag which atom types and type pairs to skip
31    this is for respa lists, copy the inner/middle values from parent
32 ------------------------------------------------------------------------- */
33 
build(NeighList * list)34 void NPairSkipRespa::build(NeighList *list)
35 {
36   int i,j,ii,jj,n,itype,jnum,joriginal,n_inner,n_middle;
37   int *neighptr,*jlist,*neighptr_inner,*neighptr_middle;
38 
39   int *type = atom->type;
40 
41   int *ilist = list->ilist;
42   int *numneigh = list->numneigh;
43   int **firstneigh = list->firstneigh;
44   MyPage<int> *ipage = list->ipage;
45 
46   int *ilist_skip = list->listskip->ilist;
47   int *numneigh_skip = list->listskip->numneigh;
48   int **firstneigh_skip = list->listskip->firstneigh;
49   int inum_skip = list->listskip->inum;
50 
51   int *iskip = list->iskip;
52   int **ijskip = list->ijskip;
53 
54   int *ilist_inner = list->ilist_inner;
55   int *numneigh_inner = list->numneigh_inner;
56   int **firstneigh_inner = list->firstneigh_inner;
57   MyPage<int> *ipage_inner = list->ipage_inner;
58   int *numneigh_inner_skip = list->listskip->numneigh_inner;
59   int **firstneigh_inner_skip = list->listskip->firstneigh_inner;
60 
61   int *ilist_middle,*numneigh_middle,**firstneigh_middle;
62   MyPage<int> *ipage_middle;
63   int *numneigh_middle_skip,**firstneigh_middle_skip;
64   int respamiddle = list->respamiddle;
65   if (respamiddle) {
66     ilist_middle = list->ilist_middle;
67     numneigh_middle = list->numneigh_middle;
68     firstneigh_middle = list->firstneigh_middle;
69     ipage_middle = list->ipage_middle;
70     numneigh_middle_skip = list->listskip->numneigh_middle;
71     firstneigh_middle_skip = list->listskip->firstneigh_middle;
72   }
73 
74   int inum = 0;
75   ipage->reset();
76   ipage_inner->reset();
77   if (respamiddle) ipage_middle->reset();
78 
79   // loop over atoms in other list
80   // skip I atom entirely if iskip is set for type[I]
81   // skip I,J pair if ijskip is set for type[I],type[J]
82 
83   for (ii = 0; ii < inum_skip; ii++) {
84     i = ilist_skip[ii];
85     itype = type[i];
86     if (iskip[itype]) continue;
87 
88     n = n_inner = 0;
89     neighptr = ipage->vget();
90     neighptr_inner = ipage_inner->vget();
91     if (respamiddle) {
92       n_middle = 0;
93       neighptr_middle = ipage_middle->vget();
94     }
95 
96     // loop over parent outer rRESPA list
97 
98     jlist = firstneigh_skip[i];
99     jnum = numneigh_skip[i];
100 
101     for (jj = 0; jj < jnum; jj++) {
102       joriginal = jlist[jj];
103       j = joriginal & NEIGHMASK;
104       if (ijskip[itype][type[j]]) continue;
105       neighptr[n++] = joriginal;
106     }
107 
108     // loop over parent inner rRESPA list
109 
110     jlist = firstneigh_inner_skip[i];
111     jnum = numneigh_inner_skip[i];
112 
113     for (jj = 0; jj < jnum; jj++) {
114       joriginal = jlist[jj];
115       j = joriginal & NEIGHMASK;
116       if (ijskip[itype][type[j]]) continue;
117       neighptr_inner[n_inner++] = joriginal;
118     }
119 
120     // loop over parent middle rRESPA list
121 
122     if (respamiddle) {
123       jlist = firstneigh_middle_skip[i];
124       jnum = numneigh_middle_skip[i];
125 
126       for (jj = 0; jj < jnum; jj++) {
127         joriginal = jlist[jj];
128         j = joriginal & NEIGHMASK;
129         if (ijskip[itype][type[j]]) continue;
130         neighptr_middle[n_middle++] = joriginal;
131       }
132     }
133 
134     ilist[inum] = i;
135     firstneigh[i] = neighptr;
136     numneigh[i] = n;
137     ipage->vgot(n);
138     if (ipage->status())
139       error->one(FLERR,"Neighbor list overflow, boost neigh_modify one");
140 
141     ilist_inner[inum] = i;
142     firstneigh_inner[i] = neighptr_inner;
143     numneigh_inner[i] = n_inner;
144     ipage_inner->vgot(n);
145     if (ipage_inner->status())
146       error->one(FLERR,"Neighbor list overflow, boost neigh_modify one");
147 
148     if (respamiddle) {
149       ilist_middle[inum] = i;
150       firstneigh_middle[i] = neighptr_middle;
151       numneigh_middle[i] = n_middle;
152       ipage_middle->vgot(n);
153       if (ipage_middle->status())
154         error->one(FLERR,"Neighbor list overflow, boost neigh_modify one");
155     }
156 
157     inum++;
158   }
159 
160   list->inum = inum;
161   list->inum_inner = inum;
162   if (respamiddle) list->inum_middle = inum;
163 }
164