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