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