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