Merge branch release-4-6 into release-5-0
[alexxy/gromacs.git] / src / gromacs / gmxlib / nonbonded / nb_kernel_avx_256_single / nb_kernel_ElecRFCut_VdwLJSw_GeomW3W3_avx_256_single.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012,2013, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 /*
36  * Note: this file was generated by the GROMACS avx_256_single kernel generator.
37  */
38 #ifdef HAVE_CONFIG_H
39 #include <config.h>
40 #endif
41
42 #include <math.h>
43
44 #include "../nb_kernel.h"
45 #include "types/simple.h"
46 #include "vec.h"
47 #include "nrnb.h"
48
49 #include "gromacs/simd/math_x86_avx_256_single.h"
50 #include "kernelutil_x86_avx_256_single.h"
51
52 /*
53  * Gromacs nonbonded kernel:   nb_kernel_ElecRFCut_VdwLJSw_GeomW3W3_VF_avx_256_single
54  * Electrostatics interaction: ReactionField
55  * VdW interaction:            LennardJones
56  * Geometry:                   Water3-Water3
57  * Calculate force/pot:        PotentialAndForce
58  */
59 void
60 nb_kernel_ElecRFCut_VdwLJSw_GeomW3W3_VF_avx_256_single
61                     (t_nblist                    * gmx_restrict       nlist,
62                      rvec                        * gmx_restrict          xx,
63                      rvec                        * gmx_restrict          ff,
64                      t_forcerec                  * gmx_restrict          fr,
65                      t_mdatoms                   * gmx_restrict     mdatoms,
66                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
67                      t_nrnb                      * gmx_restrict        nrnb)
68 {
69     /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or 
70      * just 0 for non-waters.
71      * Suffixes A,B,C,D,E,F,G,H refer to j loop unrolling done with AVX, e.g. for the eight different
72      * jnr indices corresponding to data put in the four positions in the SIMD register.
73      */
74     int              i_shift_offset,i_coord_offset,outeriter,inneriter;
75     int              j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
76     int              jnrA,jnrB,jnrC,jnrD;
77     int              jnrE,jnrF,jnrG,jnrH;
78     int              jnrlistA,jnrlistB,jnrlistC,jnrlistD;
79     int              jnrlistE,jnrlistF,jnrlistG,jnrlistH;
80     int              j_coord_offsetA,j_coord_offsetB,j_coord_offsetC,j_coord_offsetD;
81     int              j_coord_offsetE,j_coord_offsetF,j_coord_offsetG,j_coord_offsetH;
82     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
83     real             rcutoff_scalar;
84     real             *shiftvec,*fshift,*x,*f;
85     real             *fjptrA,*fjptrB,*fjptrC,*fjptrD,*fjptrE,*fjptrF,*fjptrG,*fjptrH;
86     real             scratch[4*DIM];
87     __m256           tx,ty,tz,fscal,rcutoff,rcutoff2,jidxall;
88     real *           vdwioffsetptr0;
89     __m256           ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
90     real *           vdwioffsetptr1;
91     __m256           ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
92     real *           vdwioffsetptr2;
93     __m256           ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
94     int              vdwjidx0A,vdwjidx0B,vdwjidx0C,vdwjidx0D,vdwjidx0E,vdwjidx0F,vdwjidx0G,vdwjidx0H;
95     __m256           jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
96     int              vdwjidx1A,vdwjidx1B,vdwjidx1C,vdwjidx1D,vdwjidx1E,vdwjidx1F,vdwjidx1G,vdwjidx1H;
97     __m256           jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
98     int              vdwjidx2A,vdwjidx2B,vdwjidx2C,vdwjidx2D,vdwjidx2E,vdwjidx2F,vdwjidx2G,vdwjidx2H;
99     __m256           jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
100     __m256           dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
101     __m256           dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01;
102     __m256           dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02;
103     __m256           dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10;
104     __m256           dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
105     __m256           dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
106     __m256           dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20;
107     __m256           dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
108     __m256           dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
109     __m256           velec,felec,velecsum,facel,crf,krf,krf2;
110     real             *charge;
111     int              nvdwtype;
112     __m256           rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
113     int              *vdwtype;
114     real             *vdwparam;
115     __m256           one_sixth   = _mm256_set1_ps(1.0/6.0);
116     __m256           one_twelfth = _mm256_set1_ps(1.0/12.0);
117     __m256           rswitch,swV3,swV4,swV5,swF2,swF3,swF4,d,d2,sw,dsw;
118     real             rswitch_scalar,d_scalar;
119     __m256           dummy_mask,cutoff_mask;
120     __m256           signbit = _mm256_castsi256_ps( _mm256_set1_epi32(0x80000000) );
121     __m256           one     = _mm256_set1_ps(1.0);
122     __m256           two     = _mm256_set1_ps(2.0);
123     x                = xx[0];
124     f                = ff[0];
125
126     nri              = nlist->nri;
127     iinr             = nlist->iinr;
128     jindex           = nlist->jindex;
129     jjnr             = nlist->jjnr;
130     shiftidx         = nlist->shift;
131     gid              = nlist->gid;
132     shiftvec         = fr->shift_vec[0];
133     fshift           = fr->fshift[0];
134     facel            = _mm256_set1_ps(fr->epsfac);
135     charge           = mdatoms->chargeA;
136     krf              = _mm256_set1_ps(fr->ic->k_rf);
137     krf2             = _mm256_set1_ps(fr->ic->k_rf*2.0);
138     crf              = _mm256_set1_ps(fr->ic->c_rf);
139     nvdwtype         = fr->ntype;
140     vdwparam         = fr->nbfp;
141     vdwtype          = mdatoms->typeA;
142
143     /* Setup water-specific parameters */
144     inr              = nlist->iinr[0];
145     iq0              = _mm256_mul_ps(facel,_mm256_set1_ps(charge[inr+0]));
146     iq1              = _mm256_mul_ps(facel,_mm256_set1_ps(charge[inr+1]));
147     iq2              = _mm256_mul_ps(facel,_mm256_set1_ps(charge[inr+2]));
148     vdwioffsetptr0   = vdwparam+2*nvdwtype*vdwtype[inr+0];
149
150     jq0              = _mm256_set1_ps(charge[inr+0]);
151     jq1              = _mm256_set1_ps(charge[inr+1]);
152     jq2              = _mm256_set1_ps(charge[inr+2]);
153     vdwjidx0A        = 2*vdwtype[inr+0];
154     qq00             = _mm256_mul_ps(iq0,jq0);
155     c6_00            = _mm256_set1_ps(vdwioffsetptr0[vdwjidx0A]);
156     c12_00           = _mm256_set1_ps(vdwioffsetptr0[vdwjidx0A+1]);
157     qq01             = _mm256_mul_ps(iq0,jq1);
158     qq02             = _mm256_mul_ps(iq0,jq2);
159     qq10             = _mm256_mul_ps(iq1,jq0);
160     qq11             = _mm256_mul_ps(iq1,jq1);
161     qq12             = _mm256_mul_ps(iq1,jq2);
162     qq20             = _mm256_mul_ps(iq2,jq0);
163     qq21             = _mm256_mul_ps(iq2,jq1);
164     qq22             = _mm256_mul_ps(iq2,jq2);
165
166     /* When we use explicit cutoffs the value must be identical for elec and VdW, so use elec as an arbitrary choice */
167     rcutoff_scalar   = fr->rcoulomb;
168     rcutoff          = _mm256_set1_ps(rcutoff_scalar);
169     rcutoff2         = _mm256_mul_ps(rcutoff,rcutoff);
170
171     rswitch_scalar   = fr->rvdw_switch;
172     rswitch          = _mm256_set1_ps(rswitch_scalar);
173     /* Setup switch parameters */
174     d_scalar         = rcutoff_scalar-rswitch_scalar;
175     d                = _mm256_set1_ps(d_scalar);
176     swV3             = _mm256_set1_ps(-10.0/(d_scalar*d_scalar*d_scalar));
177     swV4             = _mm256_set1_ps( 15.0/(d_scalar*d_scalar*d_scalar*d_scalar));
178     swV5             = _mm256_set1_ps( -6.0/(d_scalar*d_scalar*d_scalar*d_scalar*d_scalar));
179     swF2             = _mm256_set1_ps(-30.0/(d_scalar*d_scalar*d_scalar));
180     swF3             = _mm256_set1_ps( 60.0/(d_scalar*d_scalar*d_scalar*d_scalar));
181     swF4             = _mm256_set1_ps(-30.0/(d_scalar*d_scalar*d_scalar*d_scalar*d_scalar));
182
183     /* Avoid stupid compiler warnings */
184     jnrA = jnrB = jnrC = jnrD = jnrE = jnrF = jnrG = jnrH = 0;
185     j_coord_offsetA = 0;
186     j_coord_offsetB = 0;
187     j_coord_offsetC = 0;
188     j_coord_offsetD = 0;
189     j_coord_offsetE = 0;
190     j_coord_offsetF = 0;
191     j_coord_offsetG = 0;
192     j_coord_offsetH = 0;
193
194     outeriter        = 0;
195     inneriter        = 0;
196
197     for(iidx=0;iidx<4*DIM;iidx++)
198     {
199         scratch[iidx] = 0.0;
200     }
201
202     /* Start outer loop over neighborlists */
203     for(iidx=0; iidx<nri; iidx++)
204     {
205         /* Load shift vector for this list */
206         i_shift_offset   = DIM*shiftidx[iidx];
207
208         /* Load limits for loop over neighbors */
209         j_index_start    = jindex[iidx];
210         j_index_end      = jindex[iidx+1];
211
212         /* Get outer coordinate index */
213         inr              = iinr[iidx];
214         i_coord_offset   = DIM*inr;
215
216         /* Load i particle coords and add shift vector */
217         gmx_mm256_load_shift_and_3rvec_broadcast_ps(shiftvec+i_shift_offset,x+i_coord_offset,
218                                                     &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2);
219
220         fix0             = _mm256_setzero_ps();
221         fiy0             = _mm256_setzero_ps();
222         fiz0             = _mm256_setzero_ps();
223         fix1             = _mm256_setzero_ps();
224         fiy1             = _mm256_setzero_ps();
225         fiz1             = _mm256_setzero_ps();
226         fix2             = _mm256_setzero_ps();
227         fiy2             = _mm256_setzero_ps();
228         fiz2             = _mm256_setzero_ps();
229
230         /* Reset potential sums */
231         velecsum         = _mm256_setzero_ps();
232         vvdwsum          = _mm256_setzero_ps();
233
234         /* Start inner kernel loop */
235         for(jidx=j_index_start; jidx<j_index_end && jjnr[jidx+7]>=0; jidx+=8)
236         {
237
238             /* Get j neighbor index, and coordinate index */
239             jnrA             = jjnr[jidx];
240             jnrB             = jjnr[jidx+1];
241             jnrC             = jjnr[jidx+2];
242             jnrD             = jjnr[jidx+3];
243             jnrE             = jjnr[jidx+4];
244             jnrF             = jjnr[jidx+5];
245             jnrG             = jjnr[jidx+6];
246             jnrH             = jjnr[jidx+7];
247             j_coord_offsetA  = DIM*jnrA;
248             j_coord_offsetB  = DIM*jnrB;
249             j_coord_offsetC  = DIM*jnrC;
250             j_coord_offsetD  = DIM*jnrD;
251             j_coord_offsetE  = DIM*jnrE;
252             j_coord_offsetF  = DIM*jnrF;
253             j_coord_offsetG  = DIM*jnrG;
254             j_coord_offsetH  = DIM*jnrH;
255
256             /* load j atom coordinates */
257             gmx_mm256_load_3rvec_8ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
258                                                  x+j_coord_offsetC,x+j_coord_offsetD,
259                                                  x+j_coord_offsetE,x+j_coord_offsetF,
260                                                  x+j_coord_offsetG,x+j_coord_offsetH,
261                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
262
263             /* Calculate displacement vector */
264             dx00             = _mm256_sub_ps(ix0,jx0);
265             dy00             = _mm256_sub_ps(iy0,jy0);
266             dz00             = _mm256_sub_ps(iz0,jz0);
267             dx01             = _mm256_sub_ps(ix0,jx1);
268             dy01             = _mm256_sub_ps(iy0,jy1);
269             dz01             = _mm256_sub_ps(iz0,jz1);
270             dx02             = _mm256_sub_ps(ix0,jx2);
271             dy02             = _mm256_sub_ps(iy0,jy2);
272             dz02             = _mm256_sub_ps(iz0,jz2);
273             dx10             = _mm256_sub_ps(ix1,jx0);
274             dy10             = _mm256_sub_ps(iy1,jy0);
275             dz10             = _mm256_sub_ps(iz1,jz0);
276             dx11             = _mm256_sub_ps(ix1,jx1);
277             dy11             = _mm256_sub_ps(iy1,jy1);
278             dz11             = _mm256_sub_ps(iz1,jz1);
279             dx12             = _mm256_sub_ps(ix1,jx2);
280             dy12             = _mm256_sub_ps(iy1,jy2);
281             dz12             = _mm256_sub_ps(iz1,jz2);
282             dx20             = _mm256_sub_ps(ix2,jx0);
283             dy20             = _mm256_sub_ps(iy2,jy0);
284             dz20             = _mm256_sub_ps(iz2,jz0);
285             dx21             = _mm256_sub_ps(ix2,jx1);
286             dy21             = _mm256_sub_ps(iy2,jy1);
287             dz21             = _mm256_sub_ps(iz2,jz1);
288             dx22             = _mm256_sub_ps(ix2,jx2);
289             dy22             = _mm256_sub_ps(iy2,jy2);
290             dz22             = _mm256_sub_ps(iz2,jz2);
291
292             /* Calculate squared distance and things based on it */
293             rsq00            = gmx_mm256_calc_rsq_ps(dx00,dy00,dz00);
294             rsq01            = gmx_mm256_calc_rsq_ps(dx01,dy01,dz01);
295             rsq02            = gmx_mm256_calc_rsq_ps(dx02,dy02,dz02);
296             rsq10            = gmx_mm256_calc_rsq_ps(dx10,dy10,dz10);
297             rsq11            = gmx_mm256_calc_rsq_ps(dx11,dy11,dz11);
298             rsq12            = gmx_mm256_calc_rsq_ps(dx12,dy12,dz12);
299             rsq20            = gmx_mm256_calc_rsq_ps(dx20,dy20,dz20);
300             rsq21            = gmx_mm256_calc_rsq_ps(dx21,dy21,dz21);
301             rsq22            = gmx_mm256_calc_rsq_ps(dx22,dy22,dz22);
302
303             rinv00           = gmx_mm256_invsqrt_ps(rsq00);
304             rinv01           = gmx_mm256_invsqrt_ps(rsq01);
305             rinv02           = gmx_mm256_invsqrt_ps(rsq02);
306             rinv10           = gmx_mm256_invsqrt_ps(rsq10);
307             rinv11           = gmx_mm256_invsqrt_ps(rsq11);
308             rinv12           = gmx_mm256_invsqrt_ps(rsq12);
309             rinv20           = gmx_mm256_invsqrt_ps(rsq20);
310             rinv21           = gmx_mm256_invsqrt_ps(rsq21);
311             rinv22           = gmx_mm256_invsqrt_ps(rsq22);
312
313             rinvsq00         = _mm256_mul_ps(rinv00,rinv00);
314             rinvsq01         = _mm256_mul_ps(rinv01,rinv01);
315             rinvsq02         = _mm256_mul_ps(rinv02,rinv02);
316             rinvsq10         = _mm256_mul_ps(rinv10,rinv10);
317             rinvsq11         = _mm256_mul_ps(rinv11,rinv11);
318             rinvsq12         = _mm256_mul_ps(rinv12,rinv12);
319             rinvsq20         = _mm256_mul_ps(rinv20,rinv20);
320             rinvsq21         = _mm256_mul_ps(rinv21,rinv21);
321             rinvsq22         = _mm256_mul_ps(rinv22,rinv22);
322
323             fjx0             = _mm256_setzero_ps();
324             fjy0             = _mm256_setzero_ps();
325             fjz0             = _mm256_setzero_ps();
326             fjx1             = _mm256_setzero_ps();
327             fjy1             = _mm256_setzero_ps();
328             fjz1             = _mm256_setzero_ps();
329             fjx2             = _mm256_setzero_ps();
330             fjy2             = _mm256_setzero_ps();
331             fjz2             = _mm256_setzero_ps();
332
333             /**************************
334              * CALCULATE INTERACTIONS *
335              **************************/
336
337             if (gmx_mm256_any_lt(rsq00,rcutoff2))
338             {
339
340             r00              = _mm256_mul_ps(rsq00,rinv00);
341
342             /* REACTION-FIELD ELECTROSTATICS */
343             velec            = _mm256_mul_ps(qq00,_mm256_sub_ps(_mm256_add_ps(rinv00,_mm256_mul_ps(krf,rsq00)),crf));
344             felec            = _mm256_mul_ps(qq00,_mm256_sub_ps(_mm256_mul_ps(rinv00,rinvsq00),krf2));
345
346             /* LENNARD-JONES DISPERSION/REPULSION */
347
348             rinvsix          = _mm256_mul_ps(_mm256_mul_ps(rinvsq00,rinvsq00),rinvsq00);
349             vvdw6            = _mm256_mul_ps(c6_00,rinvsix);
350             vvdw12           = _mm256_mul_ps(c12_00,_mm256_mul_ps(rinvsix,rinvsix));
351             vvdw             = _mm256_sub_ps( _mm256_mul_ps(vvdw12,one_twelfth) , _mm256_mul_ps(vvdw6,one_sixth) );
352             fvdw             = _mm256_mul_ps(_mm256_sub_ps(vvdw12,vvdw6),rinvsq00);
353
354             d                = _mm256_sub_ps(r00,rswitch);
355             d                = _mm256_max_ps(d,_mm256_setzero_ps());
356             d2               = _mm256_mul_ps(d,d);
357             sw               = _mm256_add_ps(one,_mm256_mul_ps(d2,_mm256_mul_ps(d,_mm256_add_ps(swV3,_mm256_mul_ps(d,_mm256_add_ps(swV4,_mm256_mul_ps(d,swV5)))))));
358
359             dsw              = _mm256_mul_ps(d2,_mm256_add_ps(swF2,_mm256_mul_ps(d,_mm256_add_ps(swF3,_mm256_mul_ps(d,swF4)))));
360
361             /* Evaluate switch function */
362             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
363             fvdw             = _mm256_sub_ps( _mm256_mul_ps(fvdw,sw) , _mm256_mul_ps(rinv00,_mm256_mul_ps(vvdw,dsw)) );
364             vvdw             = _mm256_mul_ps(vvdw,sw);
365             cutoff_mask      = _mm256_cmp_ps(rsq00,rcutoff2,_CMP_LT_OQ);
366
367             /* Update potential sum for this i atom from the interaction with this j atom. */
368             velec            = _mm256_and_ps(velec,cutoff_mask);
369             velecsum         = _mm256_add_ps(velecsum,velec);
370             vvdw             = _mm256_and_ps(vvdw,cutoff_mask);
371             vvdwsum          = _mm256_add_ps(vvdwsum,vvdw);
372
373             fscal            = _mm256_add_ps(felec,fvdw);
374
375             fscal            = _mm256_and_ps(fscal,cutoff_mask);
376
377             /* Calculate temporary vectorial force */
378             tx               = _mm256_mul_ps(fscal,dx00);
379             ty               = _mm256_mul_ps(fscal,dy00);
380             tz               = _mm256_mul_ps(fscal,dz00);
381
382             /* Update vectorial force */
383             fix0             = _mm256_add_ps(fix0,tx);
384             fiy0             = _mm256_add_ps(fiy0,ty);
385             fiz0             = _mm256_add_ps(fiz0,tz);
386
387             fjx0             = _mm256_add_ps(fjx0,tx);
388             fjy0             = _mm256_add_ps(fjy0,ty);
389             fjz0             = _mm256_add_ps(fjz0,tz);
390
391             }
392
393             /**************************
394              * CALCULATE INTERACTIONS *
395              **************************/
396
397             if (gmx_mm256_any_lt(rsq01,rcutoff2))
398             {
399
400             /* REACTION-FIELD ELECTROSTATICS */
401             velec            = _mm256_mul_ps(qq01,_mm256_sub_ps(_mm256_add_ps(rinv01,_mm256_mul_ps(krf,rsq01)),crf));
402             felec            = _mm256_mul_ps(qq01,_mm256_sub_ps(_mm256_mul_ps(rinv01,rinvsq01),krf2));
403
404             cutoff_mask      = _mm256_cmp_ps(rsq01,rcutoff2,_CMP_LT_OQ);
405
406             /* Update potential sum for this i atom from the interaction with this j atom. */
407             velec            = _mm256_and_ps(velec,cutoff_mask);
408             velecsum         = _mm256_add_ps(velecsum,velec);
409
410             fscal            = felec;
411
412             fscal            = _mm256_and_ps(fscal,cutoff_mask);
413
414             /* Calculate temporary vectorial force */
415             tx               = _mm256_mul_ps(fscal,dx01);
416             ty               = _mm256_mul_ps(fscal,dy01);
417             tz               = _mm256_mul_ps(fscal,dz01);
418
419             /* Update vectorial force */
420             fix0             = _mm256_add_ps(fix0,tx);
421             fiy0             = _mm256_add_ps(fiy0,ty);
422             fiz0             = _mm256_add_ps(fiz0,tz);
423
424             fjx1             = _mm256_add_ps(fjx1,tx);
425             fjy1             = _mm256_add_ps(fjy1,ty);
426             fjz1             = _mm256_add_ps(fjz1,tz);
427
428             }
429
430             /**************************
431              * CALCULATE INTERACTIONS *
432              **************************/
433
434             if (gmx_mm256_any_lt(rsq02,rcutoff2))
435             {
436
437             /* REACTION-FIELD ELECTROSTATICS */
438             velec            = _mm256_mul_ps(qq02,_mm256_sub_ps(_mm256_add_ps(rinv02,_mm256_mul_ps(krf,rsq02)),crf));
439             felec            = _mm256_mul_ps(qq02,_mm256_sub_ps(_mm256_mul_ps(rinv02,rinvsq02),krf2));
440
441             cutoff_mask      = _mm256_cmp_ps(rsq02,rcutoff2,_CMP_LT_OQ);
442
443             /* Update potential sum for this i atom from the interaction with this j atom. */
444             velec            = _mm256_and_ps(velec,cutoff_mask);
445             velecsum         = _mm256_add_ps(velecsum,velec);
446
447             fscal            = felec;
448
449             fscal            = _mm256_and_ps(fscal,cutoff_mask);
450
451             /* Calculate temporary vectorial force */
452             tx               = _mm256_mul_ps(fscal,dx02);
453             ty               = _mm256_mul_ps(fscal,dy02);
454             tz               = _mm256_mul_ps(fscal,dz02);
455
456             /* Update vectorial force */
457             fix0             = _mm256_add_ps(fix0,tx);
458             fiy0             = _mm256_add_ps(fiy0,ty);
459             fiz0             = _mm256_add_ps(fiz0,tz);
460
461             fjx2             = _mm256_add_ps(fjx2,tx);
462             fjy2             = _mm256_add_ps(fjy2,ty);
463             fjz2             = _mm256_add_ps(fjz2,tz);
464
465             }
466
467             /**************************
468              * CALCULATE INTERACTIONS *
469              **************************/
470
471             if (gmx_mm256_any_lt(rsq10,rcutoff2))
472             {
473
474             /* REACTION-FIELD ELECTROSTATICS */
475             velec            = _mm256_mul_ps(qq10,_mm256_sub_ps(_mm256_add_ps(rinv10,_mm256_mul_ps(krf,rsq10)),crf));
476             felec            = _mm256_mul_ps(qq10,_mm256_sub_ps(_mm256_mul_ps(rinv10,rinvsq10),krf2));
477
478             cutoff_mask      = _mm256_cmp_ps(rsq10,rcutoff2,_CMP_LT_OQ);
479
480             /* Update potential sum for this i atom from the interaction with this j atom. */
481             velec            = _mm256_and_ps(velec,cutoff_mask);
482             velecsum         = _mm256_add_ps(velecsum,velec);
483
484             fscal            = felec;
485
486             fscal            = _mm256_and_ps(fscal,cutoff_mask);
487
488             /* Calculate temporary vectorial force */
489             tx               = _mm256_mul_ps(fscal,dx10);
490             ty               = _mm256_mul_ps(fscal,dy10);
491             tz               = _mm256_mul_ps(fscal,dz10);
492
493             /* Update vectorial force */
494             fix1             = _mm256_add_ps(fix1,tx);
495             fiy1             = _mm256_add_ps(fiy1,ty);
496             fiz1             = _mm256_add_ps(fiz1,tz);
497
498             fjx0             = _mm256_add_ps(fjx0,tx);
499             fjy0             = _mm256_add_ps(fjy0,ty);
500             fjz0             = _mm256_add_ps(fjz0,tz);
501
502             }
503
504             /**************************
505              * CALCULATE INTERACTIONS *
506              **************************/
507
508             if (gmx_mm256_any_lt(rsq11,rcutoff2))
509             {
510
511             /* REACTION-FIELD ELECTROSTATICS */
512             velec            = _mm256_mul_ps(qq11,_mm256_sub_ps(_mm256_add_ps(rinv11,_mm256_mul_ps(krf,rsq11)),crf));
513             felec            = _mm256_mul_ps(qq11,_mm256_sub_ps(_mm256_mul_ps(rinv11,rinvsq11),krf2));
514
515             cutoff_mask      = _mm256_cmp_ps(rsq11,rcutoff2,_CMP_LT_OQ);
516
517             /* Update potential sum for this i atom from the interaction with this j atom. */
518             velec            = _mm256_and_ps(velec,cutoff_mask);
519             velecsum         = _mm256_add_ps(velecsum,velec);
520
521             fscal            = felec;
522
523             fscal            = _mm256_and_ps(fscal,cutoff_mask);
524
525             /* Calculate temporary vectorial force */
526             tx               = _mm256_mul_ps(fscal,dx11);
527             ty               = _mm256_mul_ps(fscal,dy11);
528             tz               = _mm256_mul_ps(fscal,dz11);
529
530             /* Update vectorial force */
531             fix1             = _mm256_add_ps(fix1,tx);
532             fiy1             = _mm256_add_ps(fiy1,ty);
533             fiz1             = _mm256_add_ps(fiz1,tz);
534
535             fjx1             = _mm256_add_ps(fjx1,tx);
536             fjy1             = _mm256_add_ps(fjy1,ty);
537             fjz1             = _mm256_add_ps(fjz1,tz);
538
539             }
540
541             /**************************
542              * CALCULATE INTERACTIONS *
543              **************************/
544
545             if (gmx_mm256_any_lt(rsq12,rcutoff2))
546             {
547
548             /* REACTION-FIELD ELECTROSTATICS */
549             velec            = _mm256_mul_ps(qq12,_mm256_sub_ps(_mm256_add_ps(rinv12,_mm256_mul_ps(krf,rsq12)),crf));
550             felec            = _mm256_mul_ps(qq12,_mm256_sub_ps(_mm256_mul_ps(rinv12,rinvsq12),krf2));
551
552             cutoff_mask      = _mm256_cmp_ps(rsq12,rcutoff2,_CMP_LT_OQ);
553
554             /* Update potential sum for this i atom from the interaction with this j atom. */
555             velec            = _mm256_and_ps(velec,cutoff_mask);
556             velecsum         = _mm256_add_ps(velecsum,velec);
557
558             fscal            = felec;
559
560             fscal            = _mm256_and_ps(fscal,cutoff_mask);
561
562             /* Calculate temporary vectorial force */
563             tx               = _mm256_mul_ps(fscal,dx12);
564             ty               = _mm256_mul_ps(fscal,dy12);
565             tz               = _mm256_mul_ps(fscal,dz12);
566
567             /* Update vectorial force */
568             fix1             = _mm256_add_ps(fix1,tx);
569             fiy1             = _mm256_add_ps(fiy1,ty);
570             fiz1             = _mm256_add_ps(fiz1,tz);
571
572             fjx2             = _mm256_add_ps(fjx2,tx);
573             fjy2             = _mm256_add_ps(fjy2,ty);
574             fjz2             = _mm256_add_ps(fjz2,tz);
575
576             }
577
578             /**************************
579              * CALCULATE INTERACTIONS *
580              **************************/
581
582             if (gmx_mm256_any_lt(rsq20,rcutoff2))
583             {
584
585             /* REACTION-FIELD ELECTROSTATICS */
586             velec            = _mm256_mul_ps(qq20,_mm256_sub_ps(_mm256_add_ps(rinv20,_mm256_mul_ps(krf,rsq20)),crf));
587             felec            = _mm256_mul_ps(qq20,_mm256_sub_ps(_mm256_mul_ps(rinv20,rinvsq20),krf2));
588
589             cutoff_mask      = _mm256_cmp_ps(rsq20,rcutoff2,_CMP_LT_OQ);
590
591             /* Update potential sum for this i atom from the interaction with this j atom. */
592             velec            = _mm256_and_ps(velec,cutoff_mask);
593             velecsum         = _mm256_add_ps(velecsum,velec);
594
595             fscal            = felec;
596
597             fscal            = _mm256_and_ps(fscal,cutoff_mask);
598
599             /* Calculate temporary vectorial force */
600             tx               = _mm256_mul_ps(fscal,dx20);
601             ty               = _mm256_mul_ps(fscal,dy20);
602             tz               = _mm256_mul_ps(fscal,dz20);
603
604             /* Update vectorial force */
605             fix2             = _mm256_add_ps(fix2,tx);
606             fiy2             = _mm256_add_ps(fiy2,ty);
607             fiz2             = _mm256_add_ps(fiz2,tz);
608
609             fjx0             = _mm256_add_ps(fjx0,tx);
610             fjy0             = _mm256_add_ps(fjy0,ty);
611             fjz0             = _mm256_add_ps(fjz0,tz);
612
613             }
614
615             /**************************
616              * CALCULATE INTERACTIONS *
617              **************************/
618
619             if (gmx_mm256_any_lt(rsq21,rcutoff2))
620             {
621
622             /* REACTION-FIELD ELECTROSTATICS */
623             velec            = _mm256_mul_ps(qq21,_mm256_sub_ps(_mm256_add_ps(rinv21,_mm256_mul_ps(krf,rsq21)),crf));
624             felec            = _mm256_mul_ps(qq21,_mm256_sub_ps(_mm256_mul_ps(rinv21,rinvsq21),krf2));
625
626             cutoff_mask      = _mm256_cmp_ps(rsq21,rcutoff2,_CMP_LT_OQ);
627
628             /* Update potential sum for this i atom from the interaction with this j atom. */
629             velec            = _mm256_and_ps(velec,cutoff_mask);
630             velecsum         = _mm256_add_ps(velecsum,velec);
631
632             fscal            = felec;
633
634             fscal            = _mm256_and_ps(fscal,cutoff_mask);
635
636             /* Calculate temporary vectorial force */
637             tx               = _mm256_mul_ps(fscal,dx21);
638             ty               = _mm256_mul_ps(fscal,dy21);
639             tz               = _mm256_mul_ps(fscal,dz21);
640
641             /* Update vectorial force */
642             fix2             = _mm256_add_ps(fix2,tx);
643             fiy2             = _mm256_add_ps(fiy2,ty);
644             fiz2             = _mm256_add_ps(fiz2,tz);
645
646             fjx1             = _mm256_add_ps(fjx1,tx);
647             fjy1             = _mm256_add_ps(fjy1,ty);
648             fjz1             = _mm256_add_ps(fjz1,tz);
649
650             }
651
652             /**************************
653              * CALCULATE INTERACTIONS *
654              **************************/
655
656             if (gmx_mm256_any_lt(rsq22,rcutoff2))
657             {
658
659             /* REACTION-FIELD ELECTROSTATICS */
660             velec            = _mm256_mul_ps(qq22,_mm256_sub_ps(_mm256_add_ps(rinv22,_mm256_mul_ps(krf,rsq22)),crf));
661             felec            = _mm256_mul_ps(qq22,_mm256_sub_ps(_mm256_mul_ps(rinv22,rinvsq22),krf2));
662
663             cutoff_mask      = _mm256_cmp_ps(rsq22,rcutoff2,_CMP_LT_OQ);
664
665             /* Update potential sum for this i atom from the interaction with this j atom. */
666             velec            = _mm256_and_ps(velec,cutoff_mask);
667             velecsum         = _mm256_add_ps(velecsum,velec);
668
669             fscal            = felec;
670
671             fscal            = _mm256_and_ps(fscal,cutoff_mask);
672
673             /* Calculate temporary vectorial force */
674             tx               = _mm256_mul_ps(fscal,dx22);
675             ty               = _mm256_mul_ps(fscal,dy22);
676             tz               = _mm256_mul_ps(fscal,dz22);
677
678             /* Update vectorial force */
679             fix2             = _mm256_add_ps(fix2,tx);
680             fiy2             = _mm256_add_ps(fiy2,ty);
681             fiz2             = _mm256_add_ps(fiz2,tz);
682
683             fjx2             = _mm256_add_ps(fjx2,tx);
684             fjy2             = _mm256_add_ps(fjy2,ty);
685             fjz2             = _mm256_add_ps(fjz2,tz);
686
687             }
688
689             fjptrA             = f+j_coord_offsetA;
690             fjptrB             = f+j_coord_offsetB;
691             fjptrC             = f+j_coord_offsetC;
692             fjptrD             = f+j_coord_offsetD;
693             fjptrE             = f+j_coord_offsetE;
694             fjptrF             = f+j_coord_offsetF;
695             fjptrG             = f+j_coord_offsetG;
696             fjptrH             = f+j_coord_offsetH;
697
698             gmx_mm256_decrement_3rvec_8ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,fjptrE,fjptrF,fjptrG,fjptrH,
699                                                       fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
700
701             /* Inner loop uses 358 flops */
702         }
703
704         if(jidx<j_index_end)
705         {
706
707             /* Get j neighbor index, and coordinate index */
708             jnrlistA         = jjnr[jidx];
709             jnrlistB         = jjnr[jidx+1];
710             jnrlistC         = jjnr[jidx+2];
711             jnrlistD         = jjnr[jidx+3];
712             jnrlistE         = jjnr[jidx+4];
713             jnrlistF         = jjnr[jidx+5];
714             jnrlistG         = jjnr[jidx+6];
715             jnrlistH         = jjnr[jidx+7];
716             /* Sign of each element will be negative for non-real atoms.
717              * This mask will be 0xFFFFFFFF for dummy entries and 0x0 for real ones,
718              * so use it as val = _mm_andnot_ps(mask,val) to clear dummy entries.
719              */
720             dummy_mask = gmx_mm256_set_m128(gmx_mm_castsi128_ps(_mm_cmplt_epi32(_mm_loadu_si128((const __m128i *)(jjnr+jidx+4)),_mm_setzero_si128())),
721                                             gmx_mm_castsi128_ps(_mm_cmplt_epi32(_mm_loadu_si128((const __m128i *)(jjnr+jidx)),_mm_setzero_si128())));
722                                             
723             jnrA       = (jnrlistA>=0) ? jnrlistA : 0;
724             jnrB       = (jnrlistB>=0) ? jnrlistB : 0;
725             jnrC       = (jnrlistC>=0) ? jnrlistC : 0;
726             jnrD       = (jnrlistD>=0) ? jnrlistD : 0;
727             jnrE       = (jnrlistE>=0) ? jnrlistE : 0;
728             jnrF       = (jnrlistF>=0) ? jnrlistF : 0;
729             jnrG       = (jnrlistG>=0) ? jnrlistG : 0;
730             jnrH       = (jnrlistH>=0) ? jnrlistH : 0;
731             j_coord_offsetA  = DIM*jnrA;
732             j_coord_offsetB  = DIM*jnrB;
733             j_coord_offsetC  = DIM*jnrC;
734             j_coord_offsetD  = DIM*jnrD;
735             j_coord_offsetE  = DIM*jnrE;
736             j_coord_offsetF  = DIM*jnrF;
737             j_coord_offsetG  = DIM*jnrG;
738             j_coord_offsetH  = DIM*jnrH;
739
740             /* load j atom coordinates */
741             gmx_mm256_load_3rvec_8ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
742                                                  x+j_coord_offsetC,x+j_coord_offsetD,
743                                                  x+j_coord_offsetE,x+j_coord_offsetF,
744                                                  x+j_coord_offsetG,x+j_coord_offsetH,
745                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
746
747             /* Calculate displacement vector */
748             dx00             = _mm256_sub_ps(ix0,jx0);
749             dy00             = _mm256_sub_ps(iy0,jy0);
750             dz00             = _mm256_sub_ps(iz0,jz0);
751             dx01             = _mm256_sub_ps(ix0,jx1);
752             dy01             = _mm256_sub_ps(iy0,jy1);
753             dz01             = _mm256_sub_ps(iz0,jz1);
754             dx02             = _mm256_sub_ps(ix0,jx2);
755             dy02             = _mm256_sub_ps(iy0,jy2);
756             dz02             = _mm256_sub_ps(iz0,jz2);
757             dx10             = _mm256_sub_ps(ix1,jx0);
758             dy10             = _mm256_sub_ps(iy1,jy0);
759             dz10             = _mm256_sub_ps(iz1,jz0);
760             dx11             = _mm256_sub_ps(ix1,jx1);
761             dy11             = _mm256_sub_ps(iy1,jy1);
762             dz11             = _mm256_sub_ps(iz1,jz1);
763             dx12             = _mm256_sub_ps(ix1,jx2);
764             dy12             = _mm256_sub_ps(iy1,jy2);
765             dz12             = _mm256_sub_ps(iz1,jz2);
766             dx20             = _mm256_sub_ps(ix2,jx0);
767             dy20             = _mm256_sub_ps(iy2,jy0);
768             dz20             = _mm256_sub_ps(iz2,jz0);
769             dx21             = _mm256_sub_ps(ix2,jx1);
770             dy21             = _mm256_sub_ps(iy2,jy1);
771             dz21             = _mm256_sub_ps(iz2,jz1);
772             dx22             = _mm256_sub_ps(ix2,jx2);
773             dy22             = _mm256_sub_ps(iy2,jy2);
774             dz22             = _mm256_sub_ps(iz2,jz2);
775
776             /* Calculate squared distance and things based on it */
777             rsq00            = gmx_mm256_calc_rsq_ps(dx00,dy00,dz00);
778             rsq01            = gmx_mm256_calc_rsq_ps(dx01,dy01,dz01);
779             rsq02            = gmx_mm256_calc_rsq_ps(dx02,dy02,dz02);
780             rsq10            = gmx_mm256_calc_rsq_ps(dx10,dy10,dz10);
781             rsq11            = gmx_mm256_calc_rsq_ps(dx11,dy11,dz11);
782             rsq12            = gmx_mm256_calc_rsq_ps(dx12,dy12,dz12);
783             rsq20            = gmx_mm256_calc_rsq_ps(dx20,dy20,dz20);
784             rsq21            = gmx_mm256_calc_rsq_ps(dx21,dy21,dz21);
785             rsq22            = gmx_mm256_calc_rsq_ps(dx22,dy22,dz22);
786
787             rinv00           = gmx_mm256_invsqrt_ps(rsq00);
788             rinv01           = gmx_mm256_invsqrt_ps(rsq01);
789             rinv02           = gmx_mm256_invsqrt_ps(rsq02);
790             rinv10           = gmx_mm256_invsqrt_ps(rsq10);
791             rinv11           = gmx_mm256_invsqrt_ps(rsq11);
792             rinv12           = gmx_mm256_invsqrt_ps(rsq12);
793             rinv20           = gmx_mm256_invsqrt_ps(rsq20);
794             rinv21           = gmx_mm256_invsqrt_ps(rsq21);
795             rinv22           = gmx_mm256_invsqrt_ps(rsq22);
796
797             rinvsq00         = _mm256_mul_ps(rinv00,rinv00);
798             rinvsq01         = _mm256_mul_ps(rinv01,rinv01);
799             rinvsq02         = _mm256_mul_ps(rinv02,rinv02);
800             rinvsq10         = _mm256_mul_ps(rinv10,rinv10);
801             rinvsq11         = _mm256_mul_ps(rinv11,rinv11);
802             rinvsq12         = _mm256_mul_ps(rinv12,rinv12);
803             rinvsq20         = _mm256_mul_ps(rinv20,rinv20);
804             rinvsq21         = _mm256_mul_ps(rinv21,rinv21);
805             rinvsq22         = _mm256_mul_ps(rinv22,rinv22);
806
807             fjx0             = _mm256_setzero_ps();
808             fjy0             = _mm256_setzero_ps();
809             fjz0             = _mm256_setzero_ps();
810             fjx1             = _mm256_setzero_ps();
811             fjy1             = _mm256_setzero_ps();
812             fjz1             = _mm256_setzero_ps();
813             fjx2             = _mm256_setzero_ps();
814             fjy2             = _mm256_setzero_ps();
815             fjz2             = _mm256_setzero_ps();
816
817             /**************************
818              * CALCULATE INTERACTIONS *
819              **************************/
820
821             if (gmx_mm256_any_lt(rsq00,rcutoff2))
822             {
823
824             r00              = _mm256_mul_ps(rsq00,rinv00);
825             r00              = _mm256_andnot_ps(dummy_mask,r00);
826
827             /* REACTION-FIELD ELECTROSTATICS */
828             velec            = _mm256_mul_ps(qq00,_mm256_sub_ps(_mm256_add_ps(rinv00,_mm256_mul_ps(krf,rsq00)),crf));
829             felec            = _mm256_mul_ps(qq00,_mm256_sub_ps(_mm256_mul_ps(rinv00,rinvsq00),krf2));
830
831             /* LENNARD-JONES DISPERSION/REPULSION */
832
833             rinvsix          = _mm256_mul_ps(_mm256_mul_ps(rinvsq00,rinvsq00),rinvsq00);
834             vvdw6            = _mm256_mul_ps(c6_00,rinvsix);
835             vvdw12           = _mm256_mul_ps(c12_00,_mm256_mul_ps(rinvsix,rinvsix));
836             vvdw             = _mm256_sub_ps( _mm256_mul_ps(vvdw12,one_twelfth) , _mm256_mul_ps(vvdw6,one_sixth) );
837             fvdw             = _mm256_mul_ps(_mm256_sub_ps(vvdw12,vvdw6),rinvsq00);
838
839             d                = _mm256_sub_ps(r00,rswitch);
840             d                = _mm256_max_ps(d,_mm256_setzero_ps());
841             d2               = _mm256_mul_ps(d,d);
842             sw               = _mm256_add_ps(one,_mm256_mul_ps(d2,_mm256_mul_ps(d,_mm256_add_ps(swV3,_mm256_mul_ps(d,_mm256_add_ps(swV4,_mm256_mul_ps(d,swV5)))))));
843
844             dsw              = _mm256_mul_ps(d2,_mm256_add_ps(swF2,_mm256_mul_ps(d,_mm256_add_ps(swF3,_mm256_mul_ps(d,swF4)))));
845
846             /* Evaluate switch function */
847             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
848             fvdw             = _mm256_sub_ps( _mm256_mul_ps(fvdw,sw) , _mm256_mul_ps(rinv00,_mm256_mul_ps(vvdw,dsw)) );
849             vvdw             = _mm256_mul_ps(vvdw,sw);
850             cutoff_mask      = _mm256_cmp_ps(rsq00,rcutoff2,_CMP_LT_OQ);
851
852             /* Update potential sum for this i atom from the interaction with this j atom. */
853             velec            = _mm256_and_ps(velec,cutoff_mask);
854             velec            = _mm256_andnot_ps(dummy_mask,velec);
855             velecsum         = _mm256_add_ps(velecsum,velec);
856             vvdw             = _mm256_and_ps(vvdw,cutoff_mask);
857             vvdw             = _mm256_andnot_ps(dummy_mask,vvdw);
858             vvdwsum          = _mm256_add_ps(vvdwsum,vvdw);
859
860             fscal            = _mm256_add_ps(felec,fvdw);
861
862             fscal            = _mm256_and_ps(fscal,cutoff_mask);
863
864             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
865
866             /* Calculate temporary vectorial force */
867             tx               = _mm256_mul_ps(fscal,dx00);
868             ty               = _mm256_mul_ps(fscal,dy00);
869             tz               = _mm256_mul_ps(fscal,dz00);
870
871             /* Update vectorial force */
872             fix0             = _mm256_add_ps(fix0,tx);
873             fiy0             = _mm256_add_ps(fiy0,ty);
874             fiz0             = _mm256_add_ps(fiz0,tz);
875
876             fjx0             = _mm256_add_ps(fjx0,tx);
877             fjy0             = _mm256_add_ps(fjy0,ty);
878             fjz0             = _mm256_add_ps(fjz0,tz);
879
880             }
881
882             /**************************
883              * CALCULATE INTERACTIONS *
884              **************************/
885
886             if (gmx_mm256_any_lt(rsq01,rcutoff2))
887             {
888
889             /* REACTION-FIELD ELECTROSTATICS */
890             velec            = _mm256_mul_ps(qq01,_mm256_sub_ps(_mm256_add_ps(rinv01,_mm256_mul_ps(krf,rsq01)),crf));
891             felec            = _mm256_mul_ps(qq01,_mm256_sub_ps(_mm256_mul_ps(rinv01,rinvsq01),krf2));
892
893             cutoff_mask      = _mm256_cmp_ps(rsq01,rcutoff2,_CMP_LT_OQ);
894
895             /* Update potential sum for this i atom from the interaction with this j atom. */
896             velec            = _mm256_and_ps(velec,cutoff_mask);
897             velec            = _mm256_andnot_ps(dummy_mask,velec);
898             velecsum         = _mm256_add_ps(velecsum,velec);
899
900             fscal            = felec;
901
902             fscal            = _mm256_and_ps(fscal,cutoff_mask);
903
904             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
905
906             /* Calculate temporary vectorial force */
907             tx               = _mm256_mul_ps(fscal,dx01);
908             ty               = _mm256_mul_ps(fscal,dy01);
909             tz               = _mm256_mul_ps(fscal,dz01);
910
911             /* Update vectorial force */
912             fix0             = _mm256_add_ps(fix0,tx);
913             fiy0             = _mm256_add_ps(fiy0,ty);
914             fiz0             = _mm256_add_ps(fiz0,tz);
915
916             fjx1             = _mm256_add_ps(fjx1,tx);
917             fjy1             = _mm256_add_ps(fjy1,ty);
918             fjz1             = _mm256_add_ps(fjz1,tz);
919
920             }
921
922             /**************************
923              * CALCULATE INTERACTIONS *
924              **************************/
925
926             if (gmx_mm256_any_lt(rsq02,rcutoff2))
927             {
928
929             /* REACTION-FIELD ELECTROSTATICS */
930             velec            = _mm256_mul_ps(qq02,_mm256_sub_ps(_mm256_add_ps(rinv02,_mm256_mul_ps(krf,rsq02)),crf));
931             felec            = _mm256_mul_ps(qq02,_mm256_sub_ps(_mm256_mul_ps(rinv02,rinvsq02),krf2));
932
933             cutoff_mask      = _mm256_cmp_ps(rsq02,rcutoff2,_CMP_LT_OQ);
934
935             /* Update potential sum for this i atom from the interaction with this j atom. */
936             velec            = _mm256_and_ps(velec,cutoff_mask);
937             velec            = _mm256_andnot_ps(dummy_mask,velec);
938             velecsum         = _mm256_add_ps(velecsum,velec);
939
940             fscal            = felec;
941
942             fscal            = _mm256_and_ps(fscal,cutoff_mask);
943
944             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
945
946             /* Calculate temporary vectorial force */
947             tx               = _mm256_mul_ps(fscal,dx02);
948             ty               = _mm256_mul_ps(fscal,dy02);
949             tz               = _mm256_mul_ps(fscal,dz02);
950
951             /* Update vectorial force */
952             fix0             = _mm256_add_ps(fix0,tx);
953             fiy0             = _mm256_add_ps(fiy0,ty);
954             fiz0             = _mm256_add_ps(fiz0,tz);
955
956             fjx2             = _mm256_add_ps(fjx2,tx);
957             fjy2             = _mm256_add_ps(fjy2,ty);
958             fjz2             = _mm256_add_ps(fjz2,tz);
959
960             }
961
962             /**************************
963              * CALCULATE INTERACTIONS *
964              **************************/
965
966             if (gmx_mm256_any_lt(rsq10,rcutoff2))
967             {
968
969             /* REACTION-FIELD ELECTROSTATICS */
970             velec            = _mm256_mul_ps(qq10,_mm256_sub_ps(_mm256_add_ps(rinv10,_mm256_mul_ps(krf,rsq10)),crf));
971             felec            = _mm256_mul_ps(qq10,_mm256_sub_ps(_mm256_mul_ps(rinv10,rinvsq10),krf2));
972
973             cutoff_mask      = _mm256_cmp_ps(rsq10,rcutoff2,_CMP_LT_OQ);
974
975             /* Update potential sum for this i atom from the interaction with this j atom. */
976             velec            = _mm256_and_ps(velec,cutoff_mask);
977             velec            = _mm256_andnot_ps(dummy_mask,velec);
978             velecsum         = _mm256_add_ps(velecsum,velec);
979
980             fscal            = felec;
981
982             fscal            = _mm256_and_ps(fscal,cutoff_mask);
983
984             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
985
986             /* Calculate temporary vectorial force */
987             tx               = _mm256_mul_ps(fscal,dx10);
988             ty               = _mm256_mul_ps(fscal,dy10);
989             tz               = _mm256_mul_ps(fscal,dz10);
990
991             /* Update vectorial force */
992             fix1             = _mm256_add_ps(fix1,tx);
993             fiy1             = _mm256_add_ps(fiy1,ty);
994             fiz1             = _mm256_add_ps(fiz1,tz);
995
996             fjx0             = _mm256_add_ps(fjx0,tx);
997             fjy0             = _mm256_add_ps(fjy0,ty);
998             fjz0             = _mm256_add_ps(fjz0,tz);
999
1000             }
1001
1002             /**************************
1003              * CALCULATE INTERACTIONS *
1004              **************************/
1005
1006             if (gmx_mm256_any_lt(rsq11,rcutoff2))
1007             {
1008
1009             /* REACTION-FIELD ELECTROSTATICS */
1010             velec            = _mm256_mul_ps(qq11,_mm256_sub_ps(_mm256_add_ps(rinv11,_mm256_mul_ps(krf,rsq11)),crf));
1011             felec            = _mm256_mul_ps(qq11,_mm256_sub_ps(_mm256_mul_ps(rinv11,rinvsq11),krf2));
1012
1013             cutoff_mask      = _mm256_cmp_ps(rsq11,rcutoff2,_CMP_LT_OQ);
1014
1015             /* Update potential sum for this i atom from the interaction with this j atom. */
1016             velec            = _mm256_and_ps(velec,cutoff_mask);
1017             velec            = _mm256_andnot_ps(dummy_mask,velec);
1018             velecsum         = _mm256_add_ps(velecsum,velec);
1019
1020             fscal            = felec;
1021
1022             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1023
1024             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
1025
1026             /* Calculate temporary vectorial force */
1027             tx               = _mm256_mul_ps(fscal,dx11);
1028             ty               = _mm256_mul_ps(fscal,dy11);
1029             tz               = _mm256_mul_ps(fscal,dz11);
1030
1031             /* Update vectorial force */
1032             fix1             = _mm256_add_ps(fix1,tx);
1033             fiy1             = _mm256_add_ps(fiy1,ty);
1034             fiz1             = _mm256_add_ps(fiz1,tz);
1035
1036             fjx1             = _mm256_add_ps(fjx1,tx);
1037             fjy1             = _mm256_add_ps(fjy1,ty);
1038             fjz1             = _mm256_add_ps(fjz1,tz);
1039
1040             }
1041
1042             /**************************
1043              * CALCULATE INTERACTIONS *
1044              **************************/
1045
1046             if (gmx_mm256_any_lt(rsq12,rcutoff2))
1047             {
1048
1049             /* REACTION-FIELD ELECTROSTATICS */
1050             velec            = _mm256_mul_ps(qq12,_mm256_sub_ps(_mm256_add_ps(rinv12,_mm256_mul_ps(krf,rsq12)),crf));
1051             felec            = _mm256_mul_ps(qq12,_mm256_sub_ps(_mm256_mul_ps(rinv12,rinvsq12),krf2));
1052
1053             cutoff_mask      = _mm256_cmp_ps(rsq12,rcutoff2,_CMP_LT_OQ);
1054
1055             /* Update potential sum for this i atom from the interaction with this j atom. */
1056             velec            = _mm256_and_ps(velec,cutoff_mask);
1057             velec            = _mm256_andnot_ps(dummy_mask,velec);
1058             velecsum         = _mm256_add_ps(velecsum,velec);
1059
1060             fscal            = felec;
1061
1062             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1063
1064             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
1065
1066             /* Calculate temporary vectorial force */
1067             tx               = _mm256_mul_ps(fscal,dx12);
1068             ty               = _mm256_mul_ps(fscal,dy12);
1069             tz               = _mm256_mul_ps(fscal,dz12);
1070
1071             /* Update vectorial force */
1072             fix1             = _mm256_add_ps(fix1,tx);
1073             fiy1             = _mm256_add_ps(fiy1,ty);
1074             fiz1             = _mm256_add_ps(fiz1,tz);
1075
1076             fjx2             = _mm256_add_ps(fjx2,tx);
1077             fjy2             = _mm256_add_ps(fjy2,ty);
1078             fjz2             = _mm256_add_ps(fjz2,tz);
1079
1080             }
1081
1082             /**************************
1083              * CALCULATE INTERACTIONS *
1084              **************************/
1085
1086             if (gmx_mm256_any_lt(rsq20,rcutoff2))
1087             {
1088
1089             /* REACTION-FIELD ELECTROSTATICS */
1090             velec            = _mm256_mul_ps(qq20,_mm256_sub_ps(_mm256_add_ps(rinv20,_mm256_mul_ps(krf,rsq20)),crf));
1091             felec            = _mm256_mul_ps(qq20,_mm256_sub_ps(_mm256_mul_ps(rinv20,rinvsq20),krf2));
1092
1093             cutoff_mask      = _mm256_cmp_ps(rsq20,rcutoff2,_CMP_LT_OQ);
1094
1095             /* Update potential sum for this i atom from the interaction with this j atom. */
1096             velec            = _mm256_and_ps(velec,cutoff_mask);
1097             velec            = _mm256_andnot_ps(dummy_mask,velec);
1098             velecsum         = _mm256_add_ps(velecsum,velec);
1099
1100             fscal            = felec;
1101
1102             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1103
1104             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
1105
1106             /* Calculate temporary vectorial force */
1107             tx               = _mm256_mul_ps(fscal,dx20);
1108             ty               = _mm256_mul_ps(fscal,dy20);
1109             tz               = _mm256_mul_ps(fscal,dz20);
1110
1111             /* Update vectorial force */
1112             fix2             = _mm256_add_ps(fix2,tx);
1113             fiy2             = _mm256_add_ps(fiy2,ty);
1114             fiz2             = _mm256_add_ps(fiz2,tz);
1115
1116             fjx0             = _mm256_add_ps(fjx0,tx);
1117             fjy0             = _mm256_add_ps(fjy0,ty);
1118             fjz0             = _mm256_add_ps(fjz0,tz);
1119
1120             }
1121
1122             /**************************
1123              * CALCULATE INTERACTIONS *
1124              **************************/
1125
1126             if (gmx_mm256_any_lt(rsq21,rcutoff2))
1127             {
1128
1129             /* REACTION-FIELD ELECTROSTATICS */
1130             velec            = _mm256_mul_ps(qq21,_mm256_sub_ps(_mm256_add_ps(rinv21,_mm256_mul_ps(krf,rsq21)),crf));
1131             felec            = _mm256_mul_ps(qq21,_mm256_sub_ps(_mm256_mul_ps(rinv21,rinvsq21),krf2));
1132
1133             cutoff_mask      = _mm256_cmp_ps(rsq21,rcutoff2,_CMP_LT_OQ);
1134
1135             /* Update potential sum for this i atom from the interaction with this j atom. */
1136             velec            = _mm256_and_ps(velec,cutoff_mask);
1137             velec            = _mm256_andnot_ps(dummy_mask,velec);
1138             velecsum         = _mm256_add_ps(velecsum,velec);
1139
1140             fscal            = felec;
1141
1142             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1143
1144             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
1145
1146             /* Calculate temporary vectorial force */
1147             tx               = _mm256_mul_ps(fscal,dx21);
1148             ty               = _mm256_mul_ps(fscal,dy21);
1149             tz               = _mm256_mul_ps(fscal,dz21);
1150
1151             /* Update vectorial force */
1152             fix2             = _mm256_add_ps(fix2,tx);
1153             fiy2             = _mm256_add_ps(fiy2,ty);
1154             fiz2             = _mm256_add_ps(fiz2,tz);
1155
1156             fjx1             = _mm256_add_ps(fjx1,tx);
1157             fjy1             = _mm256_add_ps(fjy1,ty);
1158             fjz1             = _mm256_add_ps(fjz1,tz);
1159
1160             }
1161
1162             /**************************
1163              * CALCULATE INTERACTIONS *
1164              **************************/
1165
1166             if (gmx_mm256_any_lt(rsq22,rcutoff2))
1167             {
1168
1169             /* REACTION-FIELD ELECTROSTATICS */
1170             velec            = _mm256_mul_ps(qq22,_mm256_sub_ps(_mm256_add_ps(rinv22,_mm256_mul_ps(krf,rsq22)),crf));
1171             felec            = _mm256_mul_ps(qq22,_mm256_sub_ps(_mm256_mul_ps(rinv22,rinvsq22),krf2));
1172
1173             cutoff_mask      = _mm256_cmp_ps(rsq22,rcutoff2,_CMP_LT_OQ);
1174
1175             /* Update potential sum for this i atom from the interaction with this j atom. */
1176             velec            = _mm256_and_ps(velec,cutoff_mask);
1177             velec            = _mm256_andnot_ps(dummy_mask,velec);
1178             velecsum         = _mm256_add_ps(velecsum,velec);
1179
1180             fscal            = felec;
1181
1182             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1183
1184             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
1185
1186             /* Calculate temporary vectorial force */
1187             tx               = _mm256_mul_ps(fscal,dx22);
1188             ty               = _mm256_mul_ps(fscal,dy22);
1189             tz               = _mm256_mul_ps(fscal,dz22);
1190
1191             /* Update vectorial force */
1192             fix2             = _mm256_add_ps(fix2,tx);
1193             fiy2             = _mm256_add_ps(fiy2,ty);
1194             fiz2             = _mm256_add_ps(fiz2,tz);
1195
1196             fjx2             = _mm256_add_ps(fjx2,tx);
1197             fjy2             = _mm256_add_ps(fjy2,ty);
1198             fjz2             = _mm256_add_ps(fjz2,tz);
1199
1200             }
1201
1202             fjptrA             = (jnrlistA>=0) ? f+j_coord_offsetA : scratch;
1203             fjptrB             = (jnrlistB>=0) ? f+j_coord_offsetB : scratch;
1204             fjptrC             = (jnrlistC>=0) ? f+j_coord_offsetC : scratch;
1205             fjptrD             = (jnrlistD>=0) ? f+j_coord_offsetD : scratch;
1206             fjptrE             = (jnrlistE>=0) ? f+j_coord_offsetE : scratch;
1207             fjptrF             = (jnrlistF>=0) ? f+j_coord_offsetF : scratch;
1208             fjptrG             = (jnrlistG>=0) ? f+j_coord_offsetG : scratch;
1209             fjptrH             = (jnrlistH>=0) ? f+j_coord_offsetH : scratch;
1210
1211             gmx_mm256_decrement_3rvec_8ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,fjptrE,fjptrF,fjptrG,fjptrH,
1212                                                       fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
1213
1214             /* Inner loop uses 359 flops */
1215         }
1216
1217         /* End of innermost loop */
1218
1219         gmx_mm256_update_iforce_3atom_swizzle_ps(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,
1220                                                  f+i_coord_offset,fshift+i_shift_offset);
1221
1222         ggid                        = gid[iidx];
1223         /* Update potential energies */
1224         gmx_mm256_update_1pot_ps(velecsum,kernel_data->energygrp_elec+ggid);
1225         gmx_mm256_update_1pot_ps(vvdwsum,kernel_data->energygrp_vdw+ggid);
1226
1227         /* Increment number of inner iterations */
1228         inneriter                  += j_index_end - j_index_start;
1229
1230         /* Outer loop uses 20 flops */
1231     }
1232
1233     /* Increment number of outer iterations */
1234     outeriter        += nri;
1235
1236     /* Update outer/inner flops */
1237
1238     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3W3_VF,outeriter*20 + inneriter*359);
1239 }
1240 /*
1241  * Gromacs nonbonded kernel:   nb_kernel_ElecRFCut_VdwLJSw_GeomW3W3_F_avx_256_single
1242  * Electrostatics interaction: ReactionField
1243  * VdW interaction:            LennardJones
1244  * Geometry:                   Water3-Water3
1245  * Calculate force/pot:        Force
1246  */
1247 void
1248 nb_kernel_ElecRFCut_VdwLJSw_GeomW3W3_F_avx_256_single
1249                     (t_nblist                    * gmx_restrict       nlist,
1250                      rvec                        * gmx_restrict          xx,
1251                      rvec                        * gmx_restrict          ff,
1252                      t_forcerec                  * gmx_restrict          fr,
1253                      t_mdatoms                   * gmx_restrict     mdatoms,
1254                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
1255                      t_nrnb                      * gmx_restrict        nrnb)
1256 {
1257     /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or 
1258      * just 0 for non-waters.
1259      * Suffixes A,B,C,D,E,F,G,H refer to j loop unrolling done with AVX, e.g. for the eight different
1260      * jnr indices corresponding to data put in the four positions in the SIMD register.
1261      */
1262     int              i_shift_offset,i_coord_offset,outeriter,inneriter;
1263     int              j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
1264     int              jnrA,jnrB,jnrC,jnrD;
1265     int              jnrE,jnrF,jnrG,jnrH;
1266     int              jnrlistA,jnrlistB,jnrlistC,jnrlistD;
1267     int              jnrlistE,jnrlistF,jnrlistG,jnrlistH;
1268     int              j_coord_offsetA,j_coord_offsetB,j_coord_offsetC,j_coord_offsetD;
1269     int              j_coord_offsetE,j_coord_offsetF,j_coord_offsetG,j_coord_offsetH;
1270     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
1271     real             rcutoff_scalar;
1272     real             *shiftvec,*fshift,*x,*f;
1273     real             *fjptrA,*fjptrB,*fjptrC,*fjptrD,*fjptrE,*fjptrF,*fjptrG,*fjptrH;
1274     real             scratch[4*DIM];
1275     __m256           tx,ty,tz,fscal,rcutoff,rcutoff2,jidxall;
1276     real *           vdwioffsetptr0;
1277     __m256           ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
1278     real *           vdwioffsetptr1;
1279     __m256           ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
1280     real *           vdwioffsetptr2;
1281     __m256           ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
1282     int              vdwjidx0A,vdwjidx0B,vdwjidx0C,vdwjidx0D,vdwjidx0E,vdwjidx0F,vdwjidx0G,vdwjidx0H;
1283     __m256           jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
1284     int              vdwjidx1A,vdwjidx1B,vdwjidx1C,vdwjidx1D,vdwjidx1E,vdwjidx1F,vdwjidx1G,vdwjidx1H;
1285     __m256           jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
1286     int              vdwjidx2A,vdwjidx2B,vdwjidx2C,vdwjidx2D,vdwjidx2E,vdwjidx2F,vdwjidx2G,vdwjidx2H;
1287     __m256           jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
1288     __m256           dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
1289     __m256           dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01;
1290     __m256           dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02;
1291     __m256           dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10;
1292     __m256           dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
1293     __m256           dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
1294     __m256           dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20;
1295     __m256           dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
1296     __m256           dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
1297     __m256           velec,felec,velecsum,facel,crf,krf,krf2;
1298     real             *charge;
1299     int              nvdwtype;
1300     __m256           rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
1301     int              *vdwtype;
1302     real             *vdwparam;
1303     __m256           one_sixth   = _mm256_set1_ps(1.0/6.0);
1304     __m256           one_twelfth = _mm256_set1_ps(1.0/12.0);
1305     __m256           rswitch,swV3,swV4,swV5,swF2,swF3,swF4,d,d2,sw,dsw;
1306     real             rswitch_scalar,d_scalar;
1307     __m256           dummy_mask,cutoff_mask;
1308     __m256           signbit = _mm256_castsi256_ps( _mm256_set1_epi32(0x80000000) );
1309     __m256           one     = _mm256_set1_ps(1.0);
1310     __m256           two     = _mm256_set1_ps(2.0);
1311     x                = xx[0];
1312     f                = ff[0];
1313
1314     nri              = nlist->nri;
1315     iinr             = nlist->iinr;
1316     jindex           = nlist->jindex;
1317     jjnr             = nlist->jjnr;
1318     shiftidx         = nlist->shift;
1319     gid              = nlist->gid;
1320     shiftvec         = fr->shift_vec[0];
1321     fshift           = fr->fshift[0];
1322     facel            = _mm256_set1_ps(fr->epsfac);
1323     charge           = mdatoms->chargeA;
1324     krf              = _mm256_set1_ps(fr->ic->k_rf);
1325     krf2             = _mm256_set1_ps(fr->ic->k_rf*2.0);
1326     crf              = _mm256_set1_ps(fr->ic->c_rf);
1327     nvdwtype         = fr->ntype;
1328     vdwparam         = fr->nbfp;
1329     vdwtype          = mdatoms->typeA;
1330
1331     /* Setup water-specific parameters */
1332     inr              = nlist->iinr[0];
1333     iq0              = _mm256_mul_ps(facel,_mm256_set1_ps(charge[inr+0]));
1334     iq1              = _mm256_mul_ps(facel,_mm256_set1_ps(charge[inr+1]));
1335     iq2              = _mm256_mul_ps(facel,_mm256_set1_ps(charge[inr+2]));
1336     vdwioffsetptr0   = vdwparam+2*nvdwtype*vdwtype[inr+0];
1337
1338     jq0              = _mm256_set1_ps(charge[inr+0]);
1339     jq1              = _mm256_set1_ps(charge[inr+1]);
1340     jq2              = _mm256_set1_ps(charge[inr+2]);
1341     vdwjidx0A        = 2*vdwtype[inr+0];
1342     qq00             = _mm256_mul_ps(iq0,jq0);
1343     c6_00            = _mm256_set1_ps(vdwioffsetptr0[vdwjidx0A]);
1344     c12_00           = _mm256_set1_ps(vdwioffsetptr0[vdwjidx0A+1]);
1345     qq01             = _mm256_mul_ps(iq0,jq1);
1346     qq02             = _mm256_mul_ps(iq0,jq2);
1347     qq10             = _mm256_mul_ps(iq1,jq0);
1348     qq11             = _mm256_mul_ps(iq1,jq1);
1349     qq12             = _mm256_mul_ps(iq1,jq2);
1350     qq20             = _mm256_mul_ps(iq2,jq0);
1351     qq21             = _mm256_mul_ps(iq2,jq1);
1352     qq22             = _mm256_mul_ps(iq2,jq2);
1353
1354     /* When we use explicit cutoffs the value must be identical for elec and VdW, so use elec as an arbitrary choice */
1355     rcutoff_scalar   = fr->rcoulomb;
1356     rcutoff          = _mm256_set1_ps(rcutoff_scalar);
1357     rcutoff2         = _mm256_mul_ps(rcutoff,rcutoff);
1358
1359     rswitch_scalar   = fr->rvdw_switch;
1360     rswitch          = _mm256_set1_ps(rswitch_scalar);
1361     /* Setup switch parameters */
1362     d_scalar         = rcutoff_scalar-rswitch_scalar;
1363     d                = _mm256_set1_ps(d_scalar);
1364     swV3             = _mm256_set1_ps(-10.0/(d_scalar*d_scalar*d_scalar));
1365     swV4             = _mm256_set1_ps( 15.0/(d_scalar*d_scalar*d_scalar*d_scalar));
1366     swV5             = _mm256_set1_ps( -6.0/(d_scalar*d_scalar*d_scalar*d_scalar*d_scalar));
1367     swF2             = _mm256_set1_ps(-30.0/(d_scalar*d_scalar*d_scalar));
1368     swF3             = _mm256_set1_ps( 60.0/(d_scalar*d_scalar*d_scalar*d_scalar));
1369     swF4             = _mm256_set1_ps(-30.0/(d_scalar*d_scalar*d_scalar*d_scalar*d_scalar));
1370
1371     /* Avoid stupid compiler warnings */
1372     jnrA = jnrB = jnrC = jnrD = jnrE = jnrF = jnrG = jnrH = 0;
1373     j_coord_offsetA = 0;
1374     j_coord_offsetB = 0;
1375     j_coord_offsetC = 0;
1376     j_coord_offsetD = 0;
1377     j_coord_offsetE = 0;
1378     j_coord_offsetF = 0;
1379     j_coord_offsetG = 0;
1380     j_coord_offsetH = 0;
1381
1382     outeriter        = 0;
1383     inneriter        = 0;
1384
1385     for(iidx=0;iidx<4*DIM;iidx++)
1386     {
1387         scratch[iidx] = 0.0;
1388     }
1389
1390     /* Start outer loop over neighborlists */
1391     for(iidx=0; iidx<nri; iidx++)
1392     {
1393         /* Load shift vector for this list */
1394         i_shift_offset   = DIM*shiftidx[iidx];
1395
1396         /* Load limits for loop over neighbors */
1397         j_index_start    = jindex[iidx];
1398         j_index_end      = jindex[iidx+1];
1399
1400         /* Get outer coordinate index */
1401         inr              = iinr[iidx];
1402         i_coord_offset   = DIM*inr;
1403
1404         /* Load i particle coords and add shift vector */
1405         gmx_mm256_load_shift_and_3rvec_broadcast_ps(shiftvec+i_shift_offset,x+i_coord_offset,
1406                                                     &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2);
1407
1408         fix0             = _mm256_setzero_ps();
1409         fiy0             = _mm256_setzero_ps();
1410         fiz0             = _mm256_setzero_ps();
1411         fix1             = _mm256_setzero_ps();
1412         fiy1             = _mm256_setzero_ps();
1413         fiz1             = _mm256_setzero_ps();
1414         fix2             = _mm256_setzero_ps();
1415         fiy2             = _mm256_setzero_ps();
1416         fiz2             = _mm256_setzero_ps();
1417
1418         /* Start inner kernel loop */
1419         for(jidx=j_index_start; jidx<j_index_end && jjnr[jidx+7]>=0; jidx+=8)
1420         {
1421
1422             /* Get j neighbor index, and coordinate index */
1423             jnrA             = jjnr[jidx];
1424             jnrB             = jjnr[jidx+1];
1425             jnrC             = jjnr[jidx+2];
1426             jnrD             = jjnr[jidx+3];
1427             jnrE             = jjnr[jidx+4];
1428             jnrF             = jjnr[jidx+5];
1429             jnrG             = jjnr[jidx+6];
1430             jnrH             = jjnr[jidx+7];
1431             j_coord_offsetA  = DIM*jnrA;
1432             j_coord_offsetB  = DIM*jnrB;
1433             j_coord_offsetC  = DIM*jnrC;
1434             j_coord_offsetD  = DIM*jnrD;
1435             j_coord_offsetE  = DIM*jnrE;
1436             j_coord_offsetF  = DIM*jnrF;
1437             j_coord_offsetG  = DIM*jnrG;
1438             j_coord_offsetH  = DIM*jnrH;
1439
1440             /* load j atom coordinates */
1441             gmx_mm256_load_3rvec_8ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
1442                                                  x+j_coord_offsetC,x+j_coord_offsetD,
1443                                                  x+j_coord_offsetE,x+j_coord_offsetF,
1444                                                  x+j_coord_offsetG,x+j_coord_offsetH,
1445                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
1446
1447             /* Calculate displacement vector */
1448             dx00             = _mm256_sub_ps(ix0,jx0);
1449             dy00             = _mm256_sub_ps(iy0,jy0);
1450             dz00             = _mm256_sub_ps(iz0,jz0);
1451             dx01             = _mm256_sub_ps(ix0,jx1);
1452             dy01             = _mm256_sub_ps(iy0,jy1);
1453             dz01             = _mm256_sub_ps(iz0,jz1);
1454             dx02             = _mm256_sub_ps(ix0,jx2);
1455             dy02             = _mm256_sub_ps(iy0,jy2);
1456             dz02             = _mm256_sub_ps(iz0,jz2);
1457             dx10             = _mm256_sub_ps(ix1,jx0);
1458             dy10             = _mm256_sub_ps(iy1,jy0);
1459             dz10             = _mm256_sub_ps(iz1,jz0);
1460             dx11             = _mm256_sub_ps(ix1,jx1);
1461             dy11             = _mm256_sub_ps(iy1,jy1);
1462             dz11             = _mm256_sub_ps(iz1,jz1);
1463             dx12             = _mm256_sub_ps(ix1,jx2);
1464             dy12             = _mm256_sub_ps(iy1,jy2);
1465             dz12             = _mm256_sub_ps(iz1,jz2);
1466             dx20             = _mm256_sub_ps(ix2,jx0);
1467             dy20             = _mm256_sub_ps(iy2,jy0);
1468             dz20             = _mm256_sub_ps(iz2,jz0);
1469             dx21             = _mm256_sub_ps(ix2,jx1);
1470             dy21             = _mm256_sub_ps(iy2,jy1);
1471             dz21             = _mm256_sub_ps(iz2,jz1);
1472             dx22             = _mm256_sub_ps(ix2,jx2);
1473             dy22             = _mm256_sub_ps(iy2,jy2);
1474             dz22             = _mm256_sub_ps(iz2,jz2);
1475
1476             /* Calculate squared distance and things based on it */
1477             rsq00            = gmx_mm256_calc_rsq_ps(dx00,dy00,dz00);
1478             rsq01            = gmx_mm256_calc_rsq_ps(dx01,dy01,dz01);
1479             rsq02            = gmx_mm256_calc_rsq_ps(dx02,dy02,dz02);
1480             rsq10            = gmx_mm256_calc_rsq_ps(dx10,dy10,dz10);
1481             rsq11            = gmx_mm256_calc_rsq_ps(dx11,dy11,dz11);
1482             rsq12            = gmx_mm256_calc_rsq_ps(dx12,dy12,dz12);
1483             rsq20            = gmx_mm256_calc_rsq_ps(dx20,dy20,dz20);
1484             rsq21            = gmx_mm256_calc_rsq_ps(dx21,dy21,dz21);
1485             rsq22            = gmx_mm256_calc_rsq_ps(dx22,dy22,dz22);
1486
1487             rinv00           = gmx_mm256_invsqrt_ps(rsq00);
1488             rinv01           = gmx_mm256_invsqrt_ps(rsq01);
1489             rinv02           = gmx_mm256_invsqrt_ps(rsq02);
1490             rinv10           = gmx_mm256_invsqrt_ps(rsq10);
1491             rinv11           = gmx_mm256_invsqrt_ps(rsq11);
1492             rinv12           = gmx_mm256_invsqrt_ps(rsq12);
1493             rinv20           = gmx_mm256_invsqrt_ps(rsq20);
1494             rinv21           = gmx_mm256_invsqrt_ps(rsq21);
1495             rinv22           = gmx_mm256_invsqrt_ps(rsq22);
1496
1497             rinvsq00         = _mm256_mul_ps(rinv00,rinv00);
1498             rinvsq01         = _mm256_mul_ps(rinv01,rinv01);
1499             rinvsq02         = _mm256_mul_ps(rinv02,rinv02);
1500             rinvsq10         = _mm256_mul_ps(rinv10,rinv10);
1501             rinvsq11         = _mm256_mul_ps(rinv11,rinv11);
1502             rinvsq12         = _mm256_mul_ps(rinv12,rinv12);
1503             rinvsq20         = _mm256_mul_ps(rinv20,rinv20);
1504             rinvsq21         = _mm256_mul_ps(rinv21,rinv21);
1505             rinvsq22         = _mm256_mul_ps(rinv22,rinv22);
1506
1507             fjx0             = _mm256_setzero_ps();
1508             fjy0             = _mm256_setzero_ps();
1509             fjz0             = _mm256_setzero_ps();
1510             fjx1             = _mm256_setzero_ps();
1511             fjy1             = _mm256_setzero_ps();
1512             fjz1             = _mm256_setzero_ps();
1513             fjx2             = _mm256_setzero_ps();
1514             fjy2             = _mm256_setzero_ps();
1515             fjz2             = _mm256_setzero_ps();
1516
1517             /**************************
1518              * CALCULATE INTERACTIONS *
1519              **************************/
1520
1521             if (gmx_mm256_any_lt(rsq00,rcutoff2))
1522             {
1523
1524             r00              = _mm256_mul_ps(rsq00,rinv00);
1525
1526             /* REACTION-FIELD ELECTROSTATICS */
1527             felec            = _mm256_mul_ps(qq00,_mm256_sub_ps(_mm256_mul_ps(rinv00,rinvsq00),krf2));
1528
1529             /* LENNARD-JONES DISPERSION/REPULSION */
1530
1531             rinvsix          = _mm256_mul_ps(_mm256_mul_ps(rinvsq00,rinvsq00),rinvsq00);
1532             vvdw6            = _mm256_mul_ps(c6_00,rinvsix);
1533             vvdw12           = _mm256_mul_ps(c12_00,_mm256_mul_ps(rinvsix,rinvsix));
1534             vvdw             = _mm256_sub_ps( _mm256_mul_ps(vvdw12,one_twelfth) , _mm256_mul_ps(vvdw6,one_sixth) );
1535             fvdw             = _mm256_mul_ps(_mm256_sub_ps(vvdw12,vvdw6),rinvsq00);
1536
1537             d                = _mm256_sub_ps(r00,rswitch);
1538             d                = _mm256_max_ps(d,_mm256_setzero_ps());
1539             d2               = _mm256_mul_ps(d,d);
1540             sw               = _mm256_add_ps(one,_mm256_mul_ps(d2,_mm256_mul_ps(d,_mm256_add_ps(swV3,_mm256_mul_ps(d,_mm256_add_ps(swV4,_mm256_mul_ps(d,swV5)))))));
1541
1542             dsw              = _mm256_mul_ps(d2,_mm256_add_ps(swF2,_mm256_mul_ps(d,_mm256_add_ps(swF3,_mm256_mul_ps(d,swF4)))));
1543
1544             /* Evaluate switch function */
1545             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1546             fvdw             = _mm256_sub_ps( _mm256_mul_ps(fvdw,sw) , _mm256_mul_ps(rinv00,_mm256_mul_ps(vvdw,dsw)) );
1547             cutoff_mask      = _mm256_cmp_ps(rsq00,rcutoff2,_CMP_LT_OQ);
1548
1549             fscal            = _mm256_add_ps(felec,fvdw);
1550
1551             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1552
1553             /* Calculate temporary vectorial force */
1554             tx               = _mm256_mul_ps(fscal,dx00);
1555             ty               = _mm256_mul_ps(fscal,dy00);
1556             tz               = _mm256_mul_ps(fscal,dz00);
1557
1558             /* Update vectorial force */
1559             fix0             = _mm256_add_ps(fix0,tx);
1560             fiy0             = _mm256_add_ps(fiy0,ty);
1561             fiz0             = _mm256_add_ps(fiz0,tz);
1562
1563             fjx0             = _mm256_add_ps(fjx0,tx);
1564             fjy0             = _mm256_add_ps(fjy0,ty);
1565             fjz0             = _mm256_add_ps(fjz0,tz);
1566
1567             }
1568
1569             /**************************
1570              * CALCULATE INTERACTIONS *
1571              **************************/
1572
1573             if (gmx_mm256_any_lt(rsq01,rcutoff2))
1574             {
1575
1576             /* REACTION-FIELD ELECTROSTATICS */
1577             felec            = _mm256_mul_ps(qq01,_mm256_sub_ps(_mm256_mul_ps(rinv01,rinvsq01),krf2));
1578
1579             cutoff_mask      = _mm256_cmp_ps(rsq01,rcutoff2,_CMP_LT_OQ);
1580
1581             fscal            = felec;
1582
1583             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1584
1585             /* Calculate temporary vectorial force */
1586             tx               = _mm256_mul_ps(fscal,dx01);
1587             ty               = _mm256_mul_ps(fscal,dy01);
1588             tz               = _mm256_mul_ps(fscal,dz01);
1589
1590             /* Update vectorial force */
1591             fix0             = _mm256_add_ps(fix0,tx);
1592             fiy0             = _mm256_add_ps(fiy0,ty);
1593             fiz0             = _mm256_add_ps(fiz0,tz);
1594
1595             fjx1             = _mm256_add_ps(fjx1,tx);
1596             fjy1             = _mm256_add_ps(fjy1,ty);
1597             fjz1             = _mm256_add_ps(fjz1,tz);
1598
1599             }
1600
1601             /**************************
1602              * CALCULATE INTERACTIONS *
1603              **************************/
1604
1605             if (gmx_mm256_any_lt(rsq02,rcutoff2))
1606             {
1607
1608             /* REACTION-FIELD ELECTROSTATICS */
1609             felec            = _mm256_mul_ps(qq02,_mm256_sub_ps(_mm256_mul_ps(rinv02,rinvsq02),krf2));
1610
1611             cutoff_mask      = _mm256_cmp_ps(rsq02,rcutoff2,_CMP_LT_OQ);
1612
1613             fscal            = felec;
1614
1615             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1616
1617             /* Calculate temporary vectorial force */
1618             tx               = _mm256_mul_ps(fscal,dx02);
1619             ty               = _mm256_mul_ps(fscal,dy02);
1620             tz               = _mm256_mul_ps(fscal,dz02);
1621
1622             /* Update vectorial force */
1623             fix0             = _mm256_add_ps(fix0,tx);
1624             fiy0             = _mm256_add_ps(fiy0,ty);
1625             fiz0             = _mm256_add_ps(fiz0,tz);
1626
1627             fjx2             = _mm256_add_ps(fjx2,tx);
1628             fjy2             = _mm256_add_ps(fjy2,ty);
1629             fjz2             = _mm256_add_ps(fjz2,tz);
1630
1631             }
1632
1633             /**************************
1634              * CALCULATE INTERACTIONS *
1635              **************************/
1636
1637             if (gmx_mm256_any_lt(rsq10,rcutoff2))
1638             {
1639
1640             /* REACTION-FIELD ELECTROSTATICS */
1641             felec            = _mm256_mul_ps(qq10,_mm256_sub_ps(_mm256_mul_ps(rinv10,rinvsq10),krf2));
1642
1643             cutoff_mask      = _mm256_cmp_ps(rsq10,rcutoff2,_CMP_LT_OQ);
1644
1645             fscal            = felec;
1646
1647             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1648
1649             /* Calculate temporary vectorial force */
1650             tx               = _mm256_mul_ps(fscal,dx10);
1651             ty               = _mm256_mul_ps(fscal,dy10);
1652             tz               = _mm256_mul_ps(fscal,dz10);
1653
1654             /* Update vectorial force */
1655             fix1             = _mm256_add_ps(fix1,tx);
1656             fiy1             = _mm256_add_ps(fiy1,ty);
1657             fiz1             = _mm256_add_ps(fiz1,tz);
1658
1659             fjx0             = _mm256_add_ps(fjx0,tx);
1660             fjy0             = _mm256_add_ps(fjy0,ty);
1661             fjz0             = _mm256_add_ps(fjz0,tz);
1662
1663             }
1664
1665             /**************************
1666              * CALCULATE INTERACTIONS *
1667              **************************/
1668
1669             if (gmx_mm256_any_lt(rsq11,rcutoff2))
1670             {
1671
1672             /* REACTION-FIELD ELECTROSTATICS */
1673             felec            = _mm256_mul_ps(qq11,_mm256_sub_ps(_mm256_mul_ps(rinv11,rinvsq11),krf2));
1674
1675             cutoff_mask      = _mm256_cmp_ps(rsq11,rcutoff2,_CMP_LT_OQ);
1676
1677             fscal            = felec;
1678
1679             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1680
1681             /* Calculate temporary vectorial force */
1682             tx               = _mm256_mul_ps(fscal,dx11);
1683             ty               = _mm256_mul_ps(fscal,dy11);
1684             tz               = _mm256_mul_ps(fscal,dz11);
1685
1686             /* Update vectorial force */
1687             fix1             = _mm256_add_ps(fix1,tx);
1688             fiy1             = _mm256_add_ps(fiy1,ty);
1689             fiz1             = _mm256_add_ps(fiz1,tz);
1690
1691             fjx1             = _mm256_add_ps(fjx1,tx);
1692             fjy1             = _mm256_add_ps(fjy1,ty);
1693             fjz1             = _mm256_add_ps(fjz1,tz);
1694
1695             }
1696
1697             /**************************
1698              * CALCULATE INTERACTIONS *
1699              **************************/
1700
1701             if (gmx_mm256_any_lt(rsq12,rcutoff2))
1702             {
1703
1704             /* REACTION-FIELD ELECTROSTATICS */
1705             felec            = _mm256_mul_ps(qq12,_mm256_sub_ps(_mm256_mul_ps(rinv12,rinvsq12),krf2));
1706
1707             cutoff_mask      = _mm256_cmp_ps(rsq12,rcutoff2,_CMP_LT_OQ);
1708
1709             fscal            = felec;
1710
1711             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1712
1713             /* Calculate temporary vectorial force */
1714             tx               = _mm256_mul_ps(fscal,dx12);
1715             ty               = _mm256_mul_ps(fscal,dy12);
1716             tz               = _mm256_mul_ps(fscal,dz12);
1717
1718             /* Update vectorial force */
1719             fix1             = _mm256_add_ps(fix1,tx);
1720             fiy1             = _mm256_add_ps(fiy1,ty);
1721             fiz1             = _mm256_add_ps(fiz1,tz);
1722
1723             fjx2             = _mm256_add_ps(fjx2,tx);
1724             fjy2             = _mm256_add_ps(fjy2,ty);
1725             fjz2             = _mm256_add_ps(fjz2,tz);
1726
1727             }
1728
1729             /**************************
1730              * CALCULATE INTERACTIONS *
1731              **************************/
1732
1733             if (gmx_mm256_any_lt(rsq20,rcutoff2))
1734             {
1735
1736             /* REACTION-FIELD ELECTROSTATICS */
1737             felec            = _mm256_mul_ps(qq20,_mm256_sub_ps(_mm256_mul_ps(rinv20,rinvsq20),krf2));
1738
1739             cutoff_mask      = _mm256_cmp_ps(rsq20,rcutoff2,_CMP_LT_OQ);
1740
1741             fscal            = felec;
1742
1743             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1744
1745             /* Calculate temporary vectorial force */
1746             tx               = _mm256_mul_ps(fscal,dx20);
1747             ty               = _mm256_mul_ps(fscal,dy20);
1748             tz               = _mm256_mul_ps(fscal,dz20);
1749
1750             /* Update vectorial force */
1751             fix2             = _mm256_add_ps(fix2,tx);
1752             fiy2             = _mm256_add_ps(fiy2,ty);
1753             fiz2             = _mm256_add_ps(fiz2,tz);
1754
1755             fjx0             = _mm256_add_ps(fjx0,tx);
1756             fjy0             = _mm256_add_ps(fjy0,ty);
1757             fjz0             = _mm256_add_ps(fjz0,tz);
1758
1759             }
1760
1761             /**************************
1762              * CALCULATE INTERACTIONS *
1763              **************************/
1764
1765             if (gmx_mm256_any_lt(rsq21,rcutoff2))
1766             {
1767
1768             /* REACTION-FIELD ELECTROSTATICS */
1769             felec            = _mm256_mul_ps(qq21,_mm256_sub_ps(_mm256_mul_ps(rinv21,rinvsq21),krf2));
1770
1771             cutoff_mask      = _mm256_cmp_ps(rsq21,rcutoff2,_CMP_LT_OQ);
1772
1773             fscal            = felec;
1774
1775             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1776
1777             /* Calculate temporary vectorial force */
1778             tx               = _mm256_mul_ps(fscal,dx21);
1779             ty               = _mm256_mul_ps(fscal,dy21);
1780             tz               = _mm256_mul_ps(fscal,dz21);
1781
1782             /* Update vectorial force */
1783             fix2             = _mm256_add_ps(fix2,tx);
1784             fiy2             = _mm256_add_ps(fiy2,ty);
1785             fiz2             = _mm256_add_ps(fiz2,tz);
1786
1787             fjx1             = _mm256_add_ps(fjx1,tx);
1788             fjy1             = _mm256_add_ps(fjy1,ty);
1789             fjz1             = _mm256_add_ps(fjz1,tz);
1790
1791             }
1792
1793             /**************************
1794              * CALCULATE INTERACTIONS *
1795              **************************/
1796
1797             if (gmx_mm256_any_lt(rsq22,rcutoff2))
1798             {
1799
1800             /* REACTION-FIELD ELECTROSTATICS */
1801             felec            = _mm256_mul_ps(qq22,_mm256_sub_ps(_mm256_mul_ps(rinv22,rinvsq22),krf2));
1802
1803             cutoff_mask      = _mm256_cmp_ps(rsq22,rcutoff2,_CMP_LT_OQ);
1804
1805             fscal            = felec;
1806
1807             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1808
1809             /* Calculate temporary vectorial force */
1810             tx               = _mm256_mul_ps(fscal,dx22);
1811             ty               = _mm256_mul_ps(fscal,dy22);
1812             tz               = _mm256_mul_ps(fscal,dz22);
1813
1814             /* Update vectorial force */
1815             fix2             = _mm256_add_ps(fix2,tx);
1816             fiy2             = _mm256_add_ps(fiy2,ty);
1817             fiz2             = _mm256_add_ps(fiz2,tz);
1818
1819             fjx2             = _mm256_add_ps(fjx2,tx);
1820             fjy2             = _mm256_add_ps(fjy2,ty);
1821             fjz2             = _mm256_add_ps(fjz2,tz);
1822
1823             }
1824
1825             fjptrA             = f+j_coord_offsetA;
1826             fjptrB             = f+j_coord_offsetB;
1827             fjptrC             = f+j_coord_offsetC;
1828             fjptrD             = f+j_coord_offsetD;
1829             fjptrE             = f+j_coord_offsetE;
1830             fjptrF             = f+j_coord_offsetF;
1831             fjptrG             = f+j_coord_offsetG;
1832             fjptrH             = f+j_coord_offsetH;
1833
1834             gmx_mm256_decrement_3rvec_8ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,fjptrE,fjptrF,fjptrG,fjptrH,
1835                                                       fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
1836
1837             /* Inner loop uses 301 flops */
1838         }
1839
1840         if(jidx<j_index_end)
1841         {
1842
1843             /* Get j neighbor index, and coordinate index */
1844             jnrlistA         = jjnr[jidx];
1845             jnrlistB         = jjnr[jidx+1];
1846             jnrlistC         = jjnr[jidx+2];
1847             jnrlistD         = jjnr[jidx+3];
1848             jnrlistE         = jjnr[jidx+4];
1849             jnrlistF         = jjnr[jidx+5];
1850             jnrlistG         = jjnr[jidx+6];
1851             jnrlistH         = jjnr[jidx+7];
1852             /* Sign of each element will be negative for non-real atoms.
1853              * This mask will be 0xFFFFFFFF for dummy entries and 0x0 for real ones,
1854              * so use it as val = _mm_andnot_ps(mask,val) to clear dummy entries.
1855              */
1856             dummy_mask = gmx_mm256_set_m128(gmx_mm_castsi128_ps(_mm_cmplt_epi32(_mm_loadu_si128((const __m128i *)(jjnr+jidx+4)),_mm_setzero_si128())),
1857                                             gmx_mm_castsi128_ps(_mm_cmplt_epi32(_mm_loadu_si128((const __m128i *)(jjnr+jidx)),_mm_setzero_si128())));
1858                                             
1859             jnrA       = (jnrlistA>=0) ? jnrlistA : 0;
1860             jnrB       = (jnrlistB>=0) ? jnrlistB : 0;
1861             jnrC       = (jnrlistC>=0) ? jnrlistC : 0;
1862             jnrD       = (jnrlistD>=0) ? jnrlistD : 0;
1863             jnrE       = (jnrlistE>=0) ? jnrlistE : 0;
1864             jnrF       = (jnrlistF>=0) ? jnrlistF : 0;
1865             jnrG       = (jnrlistG>=0) ? jnrlistG : 0;
1866             jnrH       = (jnrlistH>=0) ? jnrlistH : 0;
1867             j_coord_offsetA  = DIM*jnrA;
1868             j_coord_offsetB  = DIM*jnrB;
1869             j_coord_offsetC  = DIM*jnrC;
1870             j_coord_offsetD  = DIM*jnrD;
1871             j_coord_offsetE  = DIM*jnrE;
1872             j_coord_offsetF  = DIM*jnrF;
1873             j_coord_offsetG  = DIM*jnrG;
1874             j_coord_offsetH  = DIM*jnrH;
1875
1876             /* load j atom coordinates */
1877             gmx_mm256_load_3rvec_8ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
1878                                                  x+j_coord_offsetC,x+j_coord_offsetD,
1879                                                  x+j_coord_offsetE,x+j_coord_offsetF,
1880                                                  x+j_coord_offsetG,x+j_coord_offsetH,
1881                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
1882
1883             /* Calculate displacement vector */
1884             dx00             = _mm256_sub_ps(ix0,jx0);
1885             dy00             = _mm256_sub_ps(iy0,jy0);
1886             dz00             = _mm256_sub_ps(iz0,jz0);
1887             dx01             = _mm256_sub_ps(ix0,jx1);
1888             dy01             = _mm256_sub_ps(iy0,jy1);
1889             dz01             = _mm256_sub_ps(iz0,jz1);
1890             dx02             = _mm256_sub_ps(ix0,jx2);
1891             dy02             = _mm256_sub_ps(iy0,jy2);
1892             dz02             = _mm256_sub_ps(iz0,jz2);
1893             dx10             = _mm256_sub_ps(ix1,jx0);
1894             dy10             = _mm256_sub_ps(iy1,jy0);
1895             dz10             = _mm256_sub_ps(iz1,jz0);
1896             dx11             = _mm256_sub_ps(ix1,jx1);
1897             dy11             = _mm256_sub_ps(iy1,jy1);
1898             dz11             = _mm256_sub_ps(iz1,jz1);
1899             dx12             = _mm256_sub_ps(ix1,jx2);
1900             dy12             = _mm256_sub_ps(iy1,jy2);
1901             dz12             = _mm256_sub_ps(iz1,jz2);
1902             dx20             = _mm256_sub_ps(ix2,jx0);
1903             dy20             = _mm256_sub_ps(iy2,jy0);
1904             dz20             = _mm256_sub_ps(iz2,jz0);
1905             dx21             = _mm256_sub_ps(ix2,jx1);
1906             dy21             = _mm256_sub_ps(iy2,jy1);
1907             dz21             = _mm256_sub_ps(iz2,jz1);
1908             dx22             = _mm256_sub_ps(ix2,jx2);
1909             dy22             = _mm256_sub_ps(iy2,jy2);
1910             dz22             = _mm256_sub_ps(iz2,jz2);
1911
1912             /* Calculate squared distance and things based on it */
1913             rsq00            = gmx_mm256_calc_rsq_ps(dx00,dy00,dz00);
1914             rsq01            = gmx_mm256_calc_rsq_ps(dx01,dy01,dz01);
1915             rsq02            = gmx_mm256_calc_rsq_ps(dx02,dy02,dz02);
1916             rsq10            = gmx_mm256_calc_rsq_ps(dx10,dy10,dz10);
1917             rsq11            = gmx_mm256_calc_rsq_ps(dx11,dy11,dz11);
1918             rsq12            = gmx_mm256_calc_rsq_ps(dx12,dy12,dz12);
1919             rsq20            = gmx_mm256_calc_rsq_ps(dx20,dy20,dz20);
1920             rsq21            = gmx_mm256_calc_rsq_ps(dx21,dy21,dz21);
1921             rsq22            = gmx_mm256_calc_rsq_ps(dx22,dy22,dz22);
1922
1923             rinv00           = gmx_mm256_invsqrt_ps(rsq00);
1924             rinv01           = gmx_mm256_invsqrt_ps(rsq01);
1925             rinv02           = gmx_mm256_invsqrt_ps(rsq02);
1926             rinv10           = gmx_mm256_invsqrt_ps(rsq10);
1927             rinv11           = gmx_mm256_invsqrt_ps(rsq11);
1928             rinv12           = gmx_mm256_invsqrt_ps(rsq12);
1929             rinv20           = gmx_mm256_invsqrt_ps(rsq20);
1930             rinv21           = gmx_mm256_invsqrt_ps(rsq21);
1931             rinv22           = gmx_mm256_invsqrt_ps(rsq22);
1932
1933             rinvsq00         = _mm256_mul_ps(rinv00,rinv00);
1934             rinvsq01         = _mm256_mul_ps(rinv01,rinv01);
1935             rinvsq02         = _mm256_mul_ps(rinv02,rinv02);
1936             rinvsq10         = _mm256_mul_ps(rinv10,rinv10);
1937             rinvsq11         = _mm256_mul_ps(rinv11,rinv11);
1938             rinvsq12         = _mm256_mul_ps(rinv12,rinv12);
1939             rinvsq20         = _mm256_mul_ps(rinv20,rinv20);
1940             rinvsq21         = _mm256_mul_ps(rinv21,rinv21);
1941             rinvsq22         = _mm256_mul_ps(rinv22,rinv22);
1942
1943             fjx0             = _mm256_setzero_ps();
1944             fjy0             = _mm256_setzero_ps();
1945             fjz0             = _mm256_setzero_ps();
1946             fjx1             = _mm256_setzero_ps();
1947             fjy1             = _mm256_setzero_ps();
1948             fjz1             = _mm256_setzero_ps();
1949             fjx2             = _mm256_setzero_ps();
1950             fjy2             = _mm256_setzero_ps();
1951             fjz2             = _mm256_setzero_ps();
1952
1953             /**************************
1954              * CALCULATE INTERACTIONS *
1955              **************************/
1956
1957             if (gmx_mm256_any_lt(rsq00,rcutoff2))
1958             {
1959
1960             r00              = _mm256_mul_ps(rsq00,rinv00);
1961             r00              = _mm256_andnot_ps(dummy_mask,r00);
1962
1963             /* REACTION-FIELD ELECTROSTATICS */
1964             felec            = _mm256_mul_ps(qq00,_mm256_sub_ps(_mm256_mul_ps(rinv00,rinvsq00),krf2));
1965
1966             /* LENNARD-JONES DISPERSION/REPULSION */
1967
1968             rinvsix          = _mm256_mul_ps(_mm256_mul_ps(rinvsq00,rinvsq00),rinvsq00);
1969             vvdw6            = _mm256_mul_ps(c6_00,rinvsix);
1970             vvdw12           = _mm256_mul_ps(c12_00,_mm256_mul_ps(rinvsix,rinvsix));
1971             vvdw             = _mm256_sub_ps( _mm256_mul_ps(vvdw12,one_twelfth) , _mm256_mul_ps(vvdw6,one_sixth) );
1972             fvdw             = _mm256_mul_ps(_mm256_sub_ps(vvdw12,vvdw6),rinvsq00);
1973
1974             d                = _mm256_sub_ps(r00,rswitch);
1975             d                = _mm256_max_ps(d,_mm256_setzero_ps());
1976             d2               = _mm256_mul_ps(d,d);
1977             sw               = _mm256_add_ps(one,_mm256_mul_ps(d2,_mm256_mul_ps(d,_mm256_add_ps(swV3,_mm256_mul_ps(d,_mm256_add_ps(swV4,_mm256_mul_ps(d,swV5)))))));
1978
1979             dsw              = _mm256_mul_ps(d2,_mm256_add_ps(swF2,_mm256_mul_ps(d,_mm256_add_ps(swF3,_mm256_mul_ps(d,swF4)))));
1980
1981             /* Evaluate switch function */
1982             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1983             fvdw             = _mm256_sub_ps( _mm256_mul_ps(fvdw,sw) , _mm256_mul_ps(rinv00,_mm256_mul_ps(vvdw,dsw)) );
1984             cutoff_mask      = _mm256_cmp_ps(rsq00,rcutoff2,_CMP_LT_OQ);
1985
1986             fscal            = _mm256_add_ps(felec,fvdw);
1987
1988             fscal            = _mm256_and_ps(fscal,cutoff_mask);
1989
1990             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
1991
1992             /* Calculate temporary vectorial force */
1993             tx               = _mm256_mul_ps(fscal,dx00);
1994             ty               = _mm256_mul_ps(fscal,dy00);
1995             tz               = _mm256_mul_ps(fscal,dz00);
1996
1997             /* Update vectorial force */
1998             fix0             = _mm256_add_ps(fix0,tx);
1999             fiy0             = _mm256_add_ps(fiy0,ty);
2000             fiz0             = _mm256_add_ps(fiz0,tz);
2001
2002             fjx0             = _mm256_add_ps(fjx0,tx);
2003             fjy0             = _mm256_add_ps(fjy0,ty);
2004             fjz0             = _mm256_add_ps(fjz0,tz);
2005
2006             }
2007
2008             /**************************
2009              * CALCULATE INTERACTIONS *
2010              **************************/
2011
2012             if (gmx_mm256_any_lt(rsq01,rcutoff2))
2013             {
2014
2015             /* REACTION-FIELD ELECTROSTATICS */
2016             felec            = _mm256_mul_ps(qq01,_mm256_sub_ps(_mm256_mul_ps(rinv01,rinvsq01),krf2));
2017
2018             cutoff_mask      = _mm256_cmp_ps(rsq01,rcutoff2,_CMP_LT_OQ);
2019
2020             fscal            = felec;
2021
2022             fscal            = _mm256_and_ps(fscal,cutoff_mask);
2023
2024             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
2025
2026             /* Calculate temporary vectorial force */
2027             tx               = _mm256_mul_ps(fscal,dx01);
2028             ty               = _mm256_mul_ps(fscal,dy01);
2029             tz               = _mm256_mul_ps(fscal,dz01);
2030
2031             /* Update vectorial force */
2032             fix0             = _mm256_add_ps(fix0,tx);
2033             fiy0             = _mm256_add_ps(fiy0,ty);
2034             fiz0             = _mm256_add_ps(fiz0,tz);
2035
2036             fjx1             = _mm256_add_ps(fjx1,tx);
2037             fjy1             = _mm256_add_ps(fjy1,ty);
2038             fjz1             = _mm256_add_ps(fjz1,tz);
2039
2040             }
2041
2042             /**************************
2043              * CALCULATE INTERACTIONS *
2044              **************************/
2045
2046             if (gmx_mm256_any_lt(rsq02,rcutoff2))
2047             {
2048
2049             /* REACTION-FIELD ELECTROSTATICS */
2050             felec            = _mm256_mul_ps(qq02,_mm256_sub_ps(_mm256_mul_ps(rinv02,rinvsq02),krf2));
2051
2052             cutoff_mask      = _mm256_cmp_ps(rsq02,rcutoff2,_CMP_LT_OQ);
2053
2054             fscal            = felec;
2055
2056             fscal            = _mm256_and_ps(fscal,cutoff_mask);
2057
2058             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
2059
2060             /* Calculate temporary vectorial force */
2061             tx               = _mm256_mul_ps(fscal,dx02);
2062             ty               = _mm256_mul_ps(fscal,dy02);
2063             tz               = _mm256_mul_ps(fscal,dz02);
2064
2065             /* Update vectorial force */
2066             fix0             = _mm256_add_ps(fix0,tx);
2067             fiy0             = _mm256_add_ps(fiy0,ty);
2068             fiz0             = _mm256_add_ps(fiz0,tz);
2069
2070             fjx2             = _mm256_add_ps(fjx2,tx);
2071             fjy2             = _mm256_add_ps(fjy2,ty);
2072             fjz2             = _mm256_add_ps(fjz2,tz);
2073
2074             }
2075
2076             /**************************
2077              * CALCULATE INTERACTIONS *
2078              **************************/
2079
2080             if (gmx_mm256_any_lt(rsq10,rcutoff2))
2081             {
2082
2083             /* REACTION-FIELD ELECTROSTATICS */
2084             felec            = _mm256_mul_ps(qq10,_mm256_sub_ps(_mm256_mul_ps(rinv10,rinvsq10),krf2));
2085
2086             cutoff_mask      = _mm256_cmp_ps(rsq10,rcutoff2,_CMP_LT_OQ);
2087
2088             fscal            = felec;
2089
2090             fscal            = _mm256_and_ps(fscal,cutoff_mask);
2091
2092             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
2093
2094             /* Calculate temporary vectorial force */
2095             tx               = _mm256_mul_ps(fscal,dx10);
2096             ty               = _mm256_mul_ps(fscal,dy10);
2097             tz               = _mm256_mul_ps(fscal,dz10);
2098
2099             /* Update vectorial force */
2100             fix1             = _mm256_add_ps(fix1,tx);
2101             fiy1             = _mm256_add_ps(fiy1,ty);
2102             fiz1             = _mm256_add_ps(fiz1,tz);
2103
2104             fjx0             = _mm256_add_ps(fjx0,tx);
2105             fjy0             = _mm256_add_ps(fjy0,ty);
2106             fjz0             = _mm256_add_ps(fjz0,tz);
2107
2108             }
2109
2110             /**************************
2111              * CALCULATE INTERACTIONS *
2112              **************************/
2113
2114             if (gmx_mm256_any_lt(rsq11,rcutoff2))
2115             {
2116
2117             /* REACTION-FIELD ELECTROSTATICS */
2118             felec            = _mm256_mul_ps(qq11,_mm256_sub_ps(_mm256_mul_ps(rinv11,rinvsq11),krf2));
2119
2120             cutoff_mask      = _mm256_cmp_ps(rsq11,rcutoff2,_CMP_LT_OQ);
2121
2122             fscal            = felec;
2123
2124             fscal            = _mm256_and_ps(fscal,cutoff_mask);
2125
2126             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
2127
2128             /* Calculate temporary vectorial force */
2129             tx               = _mm256_mul_ps(fscal,dx11);
2130             ty               = _mm256_mul_ps(fscal,dy11);
2131             tz               = _mm256_mul_ps(fscal,dz11);
2132
2133             /* Update vectorial force */
2134             fix1             = _mm256_add_ps(fix1,tx);
2135             fiy1             = _mm256_add_ps(fiy1,ty);
2136             fiz1             = _mm256_add_ps(fiz1,tz);
2137
2138             fjx1             = _mm256_add_ps(fjx1,tx);
2139             fjy1             = _mm256_add_ps(fjy1,ty);
2140             fjz1             = _mm256_add_ps(fjz1,tz);
2141
2142             }
2143
2144             /**************************
2145              * CALCULATE INTERACTIONS *
2146              **************************/
2147
2148             if (gmx_mm256_any_lt(rsq12,rcutoff2))
2149             {
2150
2151             /* REACTION-FIELD ELECTROSTATICS */
2152             felec            = _mm256_mul_ps(qq12,_mm256_sub_ps(_mm256_mul_ps(rinv12,rinvsq12),krf2));
2153
2154             cutoff_mask      = _mm256_cmp_ps(rsq12,rcutoff2,_CMP_LT_OQ);
2155
2156             fscal            = felec;
2157
2158             fscal            = _mm256_and_ps(fscal,cutoff_mask);
2159
2160             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
2161
2162             /* Calculate temporary vectorial force */
2163             tx               = _mm256_mul_ps(fscal,dx12);
2164             ty               = _mm256_mul_ps(fscal,dy12);
2165             tz               = _mm256_mul_ps(fscal,dz12);
2166
2167             /* Update vectorial force */
2168             fix1             = _mm256_add_ps(fix1,tx);
2169             fiy1             = _mm256_add_ps(fiy1,ty);
2170             fiz1             = _mm256_add_ps(fiz1,tz);
2171
2172             fjx2             = _mm256_add_ps(fjx2,tx);
2173             fjy2             = _mm256_add_ps(fjy2,ty);
2174             fjz2             = _mm256_add_ps(fjz2,tz);
2175
2176             }
2177
2178             /**************************
2179              * CALCULATE INTERACTIONS *
2180              **************************/
2181
2182             if (gmx_mm256_any_lt(rsq20,rcutoff2))
2183             {
2184
2185             /* REACTION-FIELD ELECTROSTATICS */
2186             felec            = _mm256_mul_ps(qq20,_mm256_sub_ps(_mm256_mul_ps(rinv20,rinvsq20),krf2));
2187
2188             cutoff_mask      = _mm256_cmp_ps(rsq20,rcutoff2,_CMP_LT_OQ);
2189
2190             fscal            = felec;
2191
2192             fscal            = _mm256_and_ps(fscal,cutoff_mask);
2193
2194             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
2195
2196             /* Calculate temporary vectorial force */
2197             tx               = _mm256_mul_ps(fscal,dx20);
2198             ty               = _mm256_mul_ps(fscal,dy20);
2199             tz               = _mm256_mul_ps(fscal,dz20);
2200
2201             /* Update vectorial force */
2202             fix2             = _mm256_add_ps(fix2,tx);
2203             fiy2             = _mm256_add_ps(fiy2,ty);
2204             fiz2             = _mm256_add_ps(fiz2,tz);
2205
2206             fjx0             = _mm256_add_ps(fjx0,tx);
2207             fjy0             = _mm256_add_ps(fjy0,ty);
2208             fjz0             = _mm256_add_ps(fjz0,tz);
2209
2210             }
2211
2212             /**************************
2213              * CALCULATE INTERACTIONS *
2214              **************************/
2215
2216             if (gmx_mm256_any_lt(rsq21,rcutoff2))
2217             {
2218
2219             /* REACTION-FIELD ELECTROSTATICS */
2220             felec            = _mm256_mul_ps(qq21,_mm256_sub_ps(_mm256_mul_ps(rinv21,rinvsq21),krf2));
2221
2222             cutoff_mask      = _mm256_cmp_ps(rsq21,rcutoff2,_CMP_LT_OQ);
2223
2224             fscal            = felec;
2225
2226             fscal            = _mm256_and_ps(fscal,cutoff_mask);
2227
2228             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
2229
2230             /* Calculate temporary vectorial force */
2231             tx               = _mm256_mul_ps(fscal,dx21);
2232             ty               = _mm256_mul_ps(fscal,dy21);
2233             tz               = _mm256_mul_ps(fscal,dz21);
2234
2235             /* Update vectorial force */
2236             fix2             = _mm256_add_ps(fix2,tx);
2237             fiy2             = _mm256_add_ps(fiy2,ty);
2238             fiz2             = _mm256_add_ps(fiz2,tz);
2239
2240             fjx1             = _mm256_add_ps(fjx1,tx);
2241             fjy1             = _mm256_add_ps(fjy1,ty);
2242             fjz1             = _mm256_add_ps(fjz1,tz);
2243
2244             }
2245
2246             /**************************
2247              * CALCULATE INTERACTIONS *
2248              **************************/
2249
2250             if (gmx_mm256_any_lt(rsq22,rcutoff2))
2251             {
2252
2253             /* REACTION-FIELD ELECTROSTATICS */
2254             felec            = _mm256_mul_ps(qq22,_mm256_sub_ps(_mm256_mul_ps(rinv22,rinvsq22),krf2));
2255
2256             cutoff_mask      = _mm256_cmp_ps(rsq22,rcutoff2,_CMP_LT_OQ);
2257
2258             fscal            = felec;
2259
2260             fscal            = _mm256_and_ps(fscal,cutoff_mask);
2261
2262             fscal            = _mm256_andnot_ps(dummy_mask,fscal);
2263
2264             /* Calculate temporary vectorial force */
2265             tx               = _mm256_mul_ps(fscal,dx22);
2266             ty               = _mm256_mul_ps(fscal,dy22);
2267             tz               = _mm256_mul_ps(fscal,dz22);
2268
2269             /* Update vectorial force */
2270             fix2             = _mm256_add_ps(fix2,tx);
2271             fiy2             = _mm256_add_ps(fiy2,ty);
2272             fiz2             = _mm256_add_ps(fiz2,tz);
2273
2274             fjx2             = _mm256_add_ps(fjx2,tx);
2275             fjy2             = _mm256_add_ps(fjy2,ty);
2276             fjz2             = _mm256_add_ps(fjz2,tz);
2277
2278             }
2279
2280             fjptrA             = (jnrlistA>=0) ? f+j_coord_offsetA : scratch;
2281             fjptrB             = (jnrlistB>=0) ? f+j_coord_offsetB : scratch;
2282             fjptrC             = (jnrlistC>=0) ? f+j_coord_offsetC : scratch;
2283             fjptrD             = (jnrlistD>=0) ? f+j_coord_offsetD : scratch;
2284             fjptrE             = (jnrlistE>=0) ? f+j_coord_offsetE : scratch;
2285             fjptrF             = (jnrlistF>=0) ? f+j_coord_offsetF : scratch;
2286             fjptrG             = (jnrlistG>=0) ? f+j_coord_offsetG : scratch;
2287             fjptrH             = (jnrlistH>=0) ? f+j_coord_offsetH : scratch;
2288
2289             gmx_mm256_decrement_3rvec_8ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,fjptrE,fjptrF,fjptrG,fjptrH,
2290                                                       fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
2291
2292             /* Inner loop uses 302 flops */
2293         }
2294
2295         /* End of innermost loop */
2296
2297         gmx_mm256_update_iforce_3atom_swizzle_ps(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,
2298                                                  f+i_coord_offset,fshift+i_shift_offset);
2299
2300         /* Increment number of inner iterations */
2301         inneriter                  += j_index_end - j_index_start;
2302
2303         /* Outer loop uses 18 flops */
2304     }
2305
2306     /* Increment number of outer iterations */
2307     outeriter        += nri;
2308
2309     /* Update outer/inner flops */
2310
2311     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3W3_F,outeriter*18 + inneriter*302);
2312 }