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