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