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