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