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