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