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