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