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