Merge release-5-0 into master
[alexxy/gromacs.git] / src / gromacs / gmxlib / nonbonded / nb_kernel_avx_128_fma_single / nb_kernel_ElecEwSw_VdwLJSw_GeomW3W3_avx_128_fma_single.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 avx_128_fma_single kernel generator.
37  */
38 #include "gmxpre.h"
39
40 #include "config.h"
41
42 #include <math.h>
43
44 #include "../nb_kernel.h"
45 #include "gromacs/legacyheaders/types/simple.h"
46 #include "gromacs/math/vec.h"
47 #include "gromacs/legacyheaders/nrnb.h"
48
49 #include "gromacs/simd/math_x86_avx_128_fma_single.h"
50 #include "kernelutil_x86_avx_128_fma_single.h"
51
52 /*
53  * Gromacs nonbonded kernel:   nb_kernel_ElecEwSw_VdwLJSw_GeomW3W3_VF_avx_128_fma_single
54  * Electrostatics interaction: Ewald
55  * VdW interaction:            LennardJones
56  * Geometry:                   Water3-Water3
57  * Calculate force/pot:        PotentialAndForce
58  */
59 void
60 nb_kernel_ElecEwSw_VdwLJSw_GeomW3W3_VF_avx_128_fma_single
61                     (t_nblist                    * gmx_restrict       nlist,
62                      rvec                        * gmx_restrict          xx,
63                      rvec                        * gmx_restrict          ff,
64                      t_forcerec                  * gmx_restrict          fr,
65                      t_mdatoms                   * gmx_restrict     mdatoms,
66                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
67                      t_nrnb                      * gmx_restrict        nrnb)
68 {
69     /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or
70      * just 0 for non-waters.
71      * Suffixes A,B,C,D refer to j loop unrolling done with AVX_128, e.g. for the four different
72      * jnr indices corresponding to data put in the four positions in the SIMD register.
73      */
74     int              i_shift_offset,i_coord_offset,outeriter,inneriter;
75     int              j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
76     int              jnrA,jnrB,jnrC,jnrD;
77     int              jnrlistA,jnrlistB,jnrlistC,jnrlistD;
78     int              j_coord_offsetA,j_coord_offsetB,j_coord_offsetC,j_coord_offsetD;
79     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
80     real             rcutoff_scalar;
81     real             *shiftvec,*fshift,*x,*f;
82     real             *fjptrA,*fjptrB,*fjptrC,*fjptrD;
83     real             scratch[4*DIM];
84     __m128           fscal,rcutoff,rcutoff2,jidxall;
85     int              vdwioffset0;
86     __m128           ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
87     int              vdwioffset1;
88     __m128           ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
89     int              vdwioffset2;
90     __m128           ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
91     int              vdwjidx0A,vdwjidx0B,vdwjidx0C,vdwjidx0D;
92     __m128           jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
93     int              vdwjidx1A,vdwjidx1B,vdwjidx1C,vdwjidx1D;
94     __m128           jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
95     int              vdwjidx2A,vdwjidx2B,vdwjidx2C,vdwjidx2D;
96     __m128           jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
97     __m128           dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
98     __m128           dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01;
99     __m128           dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02;
100     __m128           dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10;
101     __m128           dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
102     __m128           dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
103     __m128           dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20;
104     __m128           dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
105     __m128           dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
106     __m128           velec,felec,velecsum,facel,crf,krf,krf2;
107     real             *charge;
108     int              nvdwtype;
109     __m128           rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
110     int              *vdwtype;
111     real             *vdwparam;
112     __m128           one_sixth   = _mm_set1_ps(1.0/6.0);
113     __m128           one_twelfth = _mm_set1_ps(1.0/12.0);
114     __m128i          ewitab;
115     __m128           ewtabscale,eweps,twoeweps,sh_ewald,ewrt,ewtabhalfspace,ewtabF,ewtabFn,ewtabD,ewtabV;
116     __m128           beta,beta2,beta3,zeta2,pmecorrF,pmecorrV,rinv3;
117     real             *ewtab;
118     __m128           rswitch,swV3,swV4,swV5,swF2,swF3,swF4,d,d2,sw,dsw;
119     real             rswitch_scalar,d_scalar;
120     __m128           dummy_mask,cutoff_mask;
121     __m128           signbit = _mm_castsi128_ps( _mm_set1_epi32(0x80000000) );
122     __m128           one     = _mm_set1_ps(1.0);
123     __m128           two     = _mm_set1_ps(2.0);
124     x                = xx[0];
125     f                = ff[0];
126
127     nri              = nlist->nri;
128     iinr             = nlist->iinr;
129     jindex           = nlist->jindex;
130     jjnr             = nlist->jjnr;
131     shiftidx         = nlist->shift;
132     gid              = nlist->gid;
133     shiftvec         = fr->shift_vec[0];
134     fshift           = fr->fshift[0];
135     facel            = _mm_set1_ps(fr->epsfac);
136     charge           = mdatoms->chargeA;
137     nvdwtype         = fr->ntype;
138     vdwparam         = fr->nbfp;
139     vdwtype          = mdatoms->typeA;
140
141     sh_ewald         = _mm_set1_ps(fr->ic->sh_ewald);
142     beta             = _mm_set1_ps(fr->ic->ewaldcoeff_q);
143     beta2            = _mm_mul_ps(beta,beta);
144     beta3            = _mm_mul_ps(beta,beta2);
145     ewtab            = fr->ic->tabq_coul_FDV0;
146     ewtabscale       = _mm_set1_ps(fr->ic->tabq_scale);
147     ewtabhalfspace   = _mm_set1_ps(0.5/fr->ic->tabq_scale);
148
149     /* Setup water-specific parameters */
150     inr              = nlist->iinr[0];
151     iq0              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+0]));
152     iq1              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+1]));
153     iq2              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+2]));
154     vdwioffset0      = 2*nvdwtype*vdwtype[inr+0];
155
156     jq0              = _mm_set1_ps(charge[inr+0]);
157     jq1              = _mm_set1_ps(charge[inr+1]);
158     jq2              = _mm_set1_ps(charge[inr+2]);
159     vdwjidx0A        = 2*vdwtype[inr+0];
160     qq00             = _mm_mul_ps(iq0,jq0);
161     c6_00            = _mm_set1_ps(vdwparam[vdwioffset0+vdwjidx0A]);
162     c12_00           = _mm_set1_ps(vdwparam[vdwioffset0+vdwjidx0A+1]);
163     qq01             = _mm_mul_ps(iq0,jq1);
164     qq02             = _mm_mul_ps(iq0,jq2);
165     qq10             = _mm_mul_ps(iq1,jq0);
166     qq11             = _mm_mul_ps(iq1,jq1);
167     qq12             = _mm_mul_ps(iq1,jq2);
168     qq20             = _mm_mul_ps(iq2,jq0);
169     qq21             = _mm_mul_ps(iq2,jq1);
170     qq22             = _mm_mul_ps(iq2,jq2);
171
172     /* When we use explicit cutoffs the value must be identical for elec and VdW, so use elec as an arbitrary choice */
173     rcutoff_scalar   = fr->rcoulomb;
174     rcutoff          = _mm_set1_ps(rcutoff_scalar);
175     rcutoff2         = _mm_mul_ps(rcutoff,rcutoff);
176
177     rswitch_scalar   = fr->rcoulomb_switch;
178     rswitch          = _mm_set1_ps(rswitch_scalar);
179     /* Setup switch parameters */
180     d_scalar         = rcutoff_scalar-rswitch_scalar;
181     d                = _mm_set1_ps(d_scalar);
182     swV3             = _mm_set1_ps(-10.0/(d_scalar*d_scalar*d_scalar));
183     swV4             = _mm_set1_ps( 15.0/(d_scalar*d_scalar*d_scalar*d_scalar));
184     swV5             = _mm_set1_ps( -6.0/(d_scalar*d_scalar*d_scalar*d_scalar*d_scalar));
185     swF2             = _mm_set1_ps(-30.0/(d_scalar*d_scalar*d_scalar));
186     swF3             = _mm_set1_ps( 60.0/(d_scalar*d_scalar*d_scalar*d_scalar));
187     swF4             = _mm_set1_ps(-30.0/(d_scalar*d_scalar*d_scalar*d_scalar*d_scalar));
188
189     /* Avoid stupid compiler warnings */
190     jnrA = jnrB = jnrC = jnrD = 0;
191     j_coord_offsetA = 0;
192     j_coord_offsetB = 0;
193     j_coord_offsetC = 0;
194     j_coord_offsetD = 0;
195
196     outeriter        = 0;
197     inneriter        = 0;
198
199     for(iidx=0;iidx<4*DIM;iidx++)
200     {
201         scratch[iidx] = 0.0;
202     }
203
204     /* Start outer loop over neighborlists */
205     for(iidx=0; iidx<nri; iidx++)
206     {
207         /* Load shift vector for this list */
208         i_shift_offset   = DIM*shiftidx[iidx];
209
210         /* Load limits for loop over neighbors */
211         j_index_start    = jindex[iidx];
212         j_index_end      = jindex[iidx+1];
213
214         /* Get outer coordinate index */
215         inr              = iinr[iidx];
216         i_coord_offset   = DIM*inr;
217
218         /* Load i particle coords and add shift vector */
219         gmx_mm_load_shift_and_3rvec_broadcast_ps(shiftvec+i_shift_offset,x+i_coord_offset,
220                                                  &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2);
221
222         fix0             = _mm_setzero_ps();
223         fiy0             = _mm_setzero_ps();
224         fiz0             = _mm_setzero_ps();
225         fix1             = _mm_setzero_ps();
226         fiy1             = _mm_setzero_ps();
227         fiz1             = _mm_setzero_ps();
228         fix2             = _mm_setzero_ps();
229         fiy2             = _mm_setzero_ps();
230         fiz2             = _mm_setzero_ps();
231
232         /* Reset potential sums */
233         velecsum         = _mm_setzero_ps();
234         vvdwsum          = _mm_setzero_ps();
235
236         /* Start inner kernel loop */
237         for(jidx=j_index_start; jidx<j_index_end && jjnr[jidx+3]>=0; jidx+=4)
238         {
239
240             /* Get j neighbor index, and coordinate index */
241             jnrA             = jjnr[jidx];
242             jnrB             = jjnr[jidx+1];
243             jnrC             = jjnr[jidx+2];
244             jnrD             = jjnr[jidx+3];
245             j_coord_offsetA  = DIM*jnrA;
246             j_coord_offsetB  = DIM*jnrB;
247             j_coord_offsetC  = DIM*jnrC;
248             j_coord_offsetD  = DIM*jnrD;
249
250             /* load j atom coordinates */
251             gmx_mm_load_3rvec_4ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
252                                               x+j_coord_offsetC,x+j_coord_offsetD,
253                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
254
255             /* Calculate displacement vector */
256             dx00             = _mm_sub_ps(ix0,jx0);
257             dy00             = _mm_sub_ps(iy0,jy0);
258             dz00             = _mm_sub_ps(iz0,jz0);
259             dx01             = _mm_sub_ps(ix0,jx1);
260             dy01             = _mm_sub_ps(iy0,jy1);
261             dz01             = _mm_sub_ps(iz0,jz1);
262             dx02             = _mm_sub_ps(ix0,jx2);
263             dy02             = _mm_sub_ps(iy0,jy2);
264             dz02             = _mm_sub_ps(iz0,jz2);
265             dx10             = _mm_sub_ps(ix1,jx0);
266             dy10             = _mm_sub_ps(iy1,jy0);
267             dz10             = _mm_sub_ps(iz1,jz0);
268             dx11             = _mm_sub_ps(ix1,jx1);
269             dy11             = _mm_sub_ps(iy1,jy1);
270             dz11             = _mm_sub_ps(iz1,jz1);
271             dx12             = _mm_sub_ps(ix1,jx2);
272             dy12             = _mm_sub_ps(iy1,jy2);
273             dz12             = _mm_sub_ps(iz1,jz2);
274             dx20             = _mm_sub_ps(ix2,jx0);
275             dy20             = _mm_sub_ps(iy2,jy0);
276             dz20             = _mm_sub_ps(iz2,jz0);
277             dx21             = _mm_sub_ps(ix2,jx1);
278             dy21             = _mm_sub_ps(iy2,jy1);
279             dz21             = _mm_sub_ps(iz2,jz1);
280             dx22             = _mm_sub_ps(ix2,jx2);
281             dy22             = _mm_sub_ps(iy2,jy2);
282             dz22             = _mm_sub_ps(iz2,jz2);
283
284             /* Calculate squared distance and things based on it */
285             rsq00            = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
286             rsq01            = gmx_mm_calc_rsq_ps(dx01,dy01,dz01);
287             rsq02            = gmx_mm_calc_rsq_ps(dx02,dy02,dz02);
288             rsq10            = gmx_mm_calc_rsq_ps(dx10,dy10,dz10);
289             rsq11            = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
290             rsq12            = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
291             rsq20            = gmx_mm_calc_rsq_ps(dx20,dy20,dz20);
292             rsq21            = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
293             rsq22            = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
294
295             rinv00           = gmx_mm_invsqrt_ps(rsq00);
296             rinv01           = gmx_mm_invsqrt_ps(rsq01);
297             rinv02           = gmx_mm_invsqrt_ps(rsq02);
298             rinv10           = gmx_mm_invsqrt_ps(rsq10);
299             rinv11           = gmx_mm_invsqrt_ps(rsq11);
300             rinv12           = gmx_mm_invsqrt_ps(rsq12);
301             rinv20           = gmx_mm_invsqrt_ps(rsq20);
302             rinv21           = gmx_mm_invsqrt_ps(rsq21);
303             rinv22           = gmx_mm_invsqrt_ps(rsq22);
304
305             rinvsq00         = _mm_mul_ps(rinv00,rinv00);
306             rinvsq01         = _mm_mul_ps(rinv01,rinv01);
307             rinvsq02         = _mm_mul_ps(rinv02,rinv02);
308             rinvsq10         = _mm_mul_ps(rinv10,rinv10);
309             rinvsq11         = _mm_mul_ps(rinv11,rinv11);
310             rinvsq12         = _mm_mul_ps(rinv12,rinv12);
311             rinvsq20         = _mm_mul_ps(rinv20,rinv20);
312             rinvsq21         = _mm_mul_ps(rinv21,rinv21);
313             rinvsq22         = _mm_mul_ps(rinv22,rinv22);
314
315             fjx0             = _mm_setzero_ps();
316             fjy0             = _mm_setzero_ps();
317             fjz0             = _mm_setzero_ps();
318             fjx1             = _mm_setzero_ps();
319             fjy1             = _mm_setzero_ps();
320             fjz1             = _mm_setzero_ps();
321             fjx2             = _mm_setzero_ps();
322             fjy2             = _mm_setzero_ps();
323             fjz2             = _mm_setzero_ps();
324
325             /**************************
326              * CALCULATE INTERACTIONS *
327              **************************/
328
329             if (gmx_mm_any_lt(rsq00,rcutoff2))
330             {
331
332             r00              = _mm_mul_ps(rsq00,rinv00);
333
334             /* EWALD ELECTROSTATICS */
335
336             /* Analytical PME correction */
337             zeta2            = _mm_mul_ps(beta2,rsq00);
338             rinv3            = _mm_mul_ps(rinvsq00,rinv00);
339             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
340             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
341             felec            = _mm_mul_ps(qq00,felec);
342             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
343             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv00);
344             velec            = _mm_mul_ps(qq00,velec);
345
346             /* LENNARD-JONES DISPERSION/REPULSION */
347
348             rinvsix          = _mm_mul_ps(_mm_mul_ps(rinvsq00,rinvsq00),rinvsq00);
349             vvdw6            = _mm_mul_ps(c6_00,rinvsix);
350             vvdw12           = _mm_mul_ps(c12_00,_mm_mul_ps(rinvsix,rinvsix));
351             vvdw             = _mm_msub_ps(vvdw12,one_twelfth,_mm_mul_ps(vvdw6,one_sixth));
352             fvdw             = _mm_mul_ps(_mm_sub_ps(vvdw12,vvdw6),rinvsq00);
353
354             d                = _mm_sub_ps(r00,rswitch);
355             d                = _mm_max_ps(d,_mm_setzero_ps());
356             d2               = _mm_mul_ps(d,d);
357             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
358
359             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
360
361             /* Evaluate switch function */
362             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
363             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv00,_mm_mul_ps(velec,dsw)) );
364             fvdw             = _mm_msub_ps( fvdw,sw , _mm_mul_ps(rinv00,_mm_mul_ps(vvdw,dsw)) );
365             velec            = _mm_mul_ps(velec,sw);
366             vvdw             = _mm_mul_ps(vvdw,sw);
367             cutoff_mask      = _mm_cmplt_ps(rsq00,rcutoff2);
368
369             /* Update potential sum for this i atom from the interaction with this j atom. */
370             velec            = _mm_and_ps(velec,cutoff_mask);
371             velecsum         = _mm_add_ps(velecsum,velec);
372             vvdw             = _mm_and_ps(vvdw,cutoff_mask);
373             vvdwsum          = _mm_add_ps(vvdwsum,vvdw);
374
375             fscal            = _mm_add_ps(felec,fvdw);
376
377             fscal            = _mm_and_ps(fscal,cutoff_mask);
378
379              /* Update vectorial force */
380             fix0             = _mm_macc_ps(dx00,fscal,fix0);
381             fiy0             = _mm_macc_ps(dy00,fscal,fiy0);
382             fiz0             = _mm_macc_ps(dz00,fscal,fiz0);
383
384             fjx0             = _mm_macc_ps(dx00,fscal,fjx0);
385             fjy0             = _mm_macc_ps(dy00,fscal,fjy0);
386             fjz0             = _mm_macc_ps(dz00,fscal,fjz0);
387
388             }
389
390             /**************************
391              * CALCULATE INTERACTIONS *
392              **************************/
393
394             if (gmx_mm_any_lt(rsq01,rcutoff2))
395             {
396
397             r01              = _mm_mul_ps(rsq01,rinv01);
398
399             /* EWALD ELECTROSTATICS */
400
401             /* Analytical PME correction */
402             zeta2            = _mm_mul_ps(beta2,rsq01);
403             rinv3            = _mm_mul_ps(rinvsq01,rinv01);
404             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
405             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
406             felec            = _mm_mul_ps(qq01,felec);
407             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
408             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv01);
409             velec            = _mm_mul_ps(qq01,velec);
410
411             d                = _mm_sub_ps(r01,rswitch);
412             d                = _mm_max_ps(d,_mm_setzero_ps());
413             d2               = _mm_mul_ps(d,d);
414             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
415
416             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
417
418             /* Evaluate switch function */
419             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
420             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv01,_mm_mul_ps(velec,dsw)) );
421             velec            = _mm_mul_ps(velec,sw);
422             cutoff_mask      = _mm_cmplt_ps(rsq01,rcutoff2);
423
424             /* Update potential sum for this i atom from the interaction with this j atom. */
425             velec            = _mm_and_ps(velec,cutoff_mask);
426             velecsum         = _mm_add_ps(velecsum,velec);
427
428             fscal            = felec;
429
430             fscal            = _mm_and_ps(fscal,cutoff_mask);
431
432              /* Update vectorial force */
433             fix0             = _mm_macc_ps(dx01,fscal,fix0);
434             fiy0             = _mm_macc_ps(dy01,fscal,fiy0);
435             fiz0             = _mm_macc_ps(dz01,fscal,fiz0);
436
437             fjx1             = _mm_macc_ps(dx01,fscal,fjx1);
438             fjy1             = _mm_macc_ps(dy01,fscal,fjy1);
439             fjz1             = _mm_macc_ps(dz01,fscal,fjz1);
440
441             }
442
443             /**************************
444              * CALCULATE INTERACTIONS *
445              **************************/
446
447             if (gmx_mm_any_lt(rsq02,rcutoff2))
448             {
449
450             r02              = _mm_mul_ps(rsq02,rinv02);
451
452             /* EWALD ELECTROSTATICS */
453
454             /* Analytical PME correction */
455             zeta2            = _mm_mul_ps(beta2,rsq02);
456             rinv3            = _mm_mul_ps(rinvsq02,rinv02);
457             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
458             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
459             felec            = _mm_mul_ps(qq02,felec);
460             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
461             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv02);
462             velec            = _mm_mul_ps(qq02,velec);
463
464             d                = _mm_sub_ps(r02,rswitch);
465             d                = _mm_max_ps(d,_mm_setzero_ps());
466             d2               = _mm_mul_ps(d,d);
467             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
468
469             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
470
471             /* Evaluate switch function */
472             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
473             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv02,_mm_mul_ps(velec,dsw)) );
474             velec            = _mm_mul_ps(velec,sw);
475             cutoff_mask      = _mm_cmplt_ps(rsq02,rcutoff2);
476
477             /* Update potential sum for this i atom from the interaction with this j atom. */
478             velec            = _mm_and_ps(velec,cutoff_mask);
479             velecsum         = _mm_add_ps(velecsum,velec);
480
481             fscal            = felec;
482
483             fscal            = _mm_and_ps(fscal,cutoff_mask);
484
485              /* Update vectorial force */
486             fix0             = _mm_macc_ps(dx02,fscal,fix0);
487             fiy0             = _mm_macc_ps(dy02,fscal,fiy0);
488             fiz0             = _mm_macc_ps(dz02,fscal,fiz0);
489
490             fjx2             = _mm_macc_ps(dx02,fscal,fjx2);
491             fjy2             = _mm_macc_ps(dy02,fscal,fjy2);
492             fjz2             = _mm_macc_ps(dz02,fscal,fjz2);
493
494             }
495
496             /**************************
497              * CALCULATE INTERACTIONS *
498              **************************/
499
500             if (gmx_mm_any_lt(rsq10,rcutoff2))
501             {
502
503             r10              = _mm_mul_ps(rsq10,rinv10);
504
505             /* EWALD ELECTROSTATICS */
506
507             /* Analytical PME correction */
508             zeta2            = _mm_mul_ps(beta2,rsq10);
509             rinv3            = _mm_mul_ps(rinvsq10,rinv10);
510             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
511             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
512             felec            = _mm_mul_ps(qq10,felec);
513             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
514             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv10);
515             velec            = _mm_mul_ps(qq10,velec);
516
517             d                = _mm_sub_ps(r10,rswitch);
518             d                = _mm_max_ps(d,_mm_setzero_ps());
519             d2               = _mm_mul_ps(d,d);
520             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
521
522             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
523
524             /* Evaluate switch function */
525             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
526             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv10,_mm_mul_ps(velec,dsw)) );
527             velec            = _mm_mul_ps(velec,sw);
528             cutoff_mask      = _mm_cmplt_ps(rsq10,rcutoff2);
529
530             /* Update potential sum for this i atom from the interaction with this j atom. */
531             velec            = _mm_and_ps(velec,cutoff_mask);
532             velecsum         = _mm_add_ps(velecsum,velec);
533
534             fscal            = felec;
535
536             fscal            = _mm_and_ps(fscal,cutoff_mask);
537
538              /* Update vectorial force */
539             fix1             = _mm_macc_ps(dx10,fscal,fix1);
540             fiy1             = _mm_macc_ps(dy10,fscal,fiy1);
541             fiz1             = _mm_macc_ps(dz10,fscal,fiz1);
542
543             fjx0             = _mm_macc_ps(dx10,fscal,fjx0);
544             fjy0             = _mm_macc_ps(dy10,fscal,fjy0);
545             fjz0             = _mm_macc_ps(dz10,fscal,fjz0);
546
547             }
548
549             /**************************
550              * CALCULATE INTERACTIONS *
551              **************************/
552
553             if (gmx_mm_any_lt(rsq11,rcutoff2))
554             {
555
556             r11              = _mm_mul_ps(rsq11,rinv11);
557
558             /* EWALD ELECTROSTATICS */
559
560             /* Analytical PME correction */
561             zeta2            = _mm_mul_ps(beta2,rsq11);
562             rinv3            = _mm_mul_ps(rinvsq11,rinv11);
563             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
564             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
565             felec            = _mm_mul_ps(qq11,felec);
566             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
567             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv11);
568             velec            = _mm_mul_ps(qq11,velec);
569
570             d                = _mm_sub_ps(r11,rswitch);
571             d                = _mm_max_ps(d,_mm_setzero_ps());
572             d2               = _mm_mul_ps(d,d);
573             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
574
575             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
576
577             /* Evaluate switch function */
578             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
579             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv11,_mm_mul_ps(velec,dsw)) );
580             velec            = _mm_mul_ps(velec,sw);
581             cutoff_mask      = _mm_cmplt_ps(rsq11,rcutoff2);
582
583             /* Update potential sum for this i atom from the interaction with this j atom. */
584             velec            = _mm_and_ps(velec,cutoff_mask);
585             velecsum         = _mm_add_ps(velecsum,velec);
586
587             fscal            = felec;
588
589             fscal            = _mm_and_ps(fscal,cutoff_mask);
590
591              /* Update vectorial force */
592             fix1             = _mm_macc_ps(dx11,fscal,fix1);
593             fiy1             = _mm_macc_ps(dy11,fscal,fiy1);
594             fiz1             = _mm_macc_ps(dz11,fscal,fiz1);
595
596             fjx1             = _mm_macc_ps(dx11,fscal,fjx1);
597             fjy1             = _mm_macc_ps(dy11,fscal,fjy1);
598             fjz1             = _mm_macc_ps(dz11,fscal,fjz1);
599
600             }
601
602             /**************************
603              * CALCULATE INTERACTIONS *
604              **************************/
605
606             if (gmx_mm_any_lt(rsq12,rcutoff2))
607             {
608
609             r12              = _mm_mul_ps(rsq12,rinv12);
610
611             /* EWALD ELECTROSTATICS */
612
613             /* Analytical PME correction */
614             zeta2            = _mm_mul_ps(beta2,rsq12);
615             rinv3            = _mm_mul_ps(rinvsq12,rinv12);
616             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
617             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
618             felec            = _mm_mul_ps(qq12,felec);
619             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
620             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv12);
621             velec            = _mm_mul_ps(qq12,velec);
622
623             d                = _mm_sub_ps(r12,rswitch);
624             d                = _mm_max_ps(d,_mm_setzero_ps());
625             d2               = _mm_mul_ps(d,d);
626             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
627
628             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
629
630             /* Evaluate switch function */
631             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
632             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv12,_mm_mul_ps(velec,dsw)) );
633             velec            = _mm_mul_ps(velec,sw);
634             cutoff_mask      = _mm_cmplt_ps(rsq12,rcutoff2);
635
636             /* Update potential sum for this i atom from the interaction with this j atom. */
637             velec            = _mm_and_ps(velec,cutoff_mask);
638             velecsum         = _mm_add_ps(velecsum,velec);
639
640             fscal            = felec;
641
642             fscal            = _mm_and_ps(fscal,cutoff_mask);
643
644              /* Update vectorial force */
645             fix1             = _mm_macc_ps(dx12,fscal,fix1);
646             fiy1             = _mm_macc_ps(dy12,fscal,fiy1);
647             fiz1             = _mm_macc_ps(dz12,fscal,fiz1);
648
649             fjx2             = _mm_macc_ps(dx12,fscal,fjx2);
650             fjy2             = _mm_macc_ps(dy12,fscal,fjy2);
651             fjz2             = _mm_macc_ps(dz12,fscal,fjz2);
652
653             }
654
655             /**************************
656              * CALCULATE INTERACTIONS *
657              **************************/
658
659             if (gmx_mm_any_lt(rsq20,rcutoff2))
660             {
661
662             r20              = _mm_mul_ps(rsq20,rinv20);
663
664             /* EWALD ELECTROSTATICS */
665
666             /* Analytical PME correction */
667             zeta2            = _mm_mul_ps(beta2,rsq20);
668             rinv3            = _mm_mul_ps(rinvsq20,rinv20);
669             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
670             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
671             felec            = _mm_mul_ps(qq20,felec);
672             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
673             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv20);
674             velec            = _mm_mul_ps(qq20,velec);
675
676             d                = _mm_sub_ps(r20,rswitch);
677             d                = _mm_max_ps(d,_mm_setzero_ps());
678             d2               = _mm_mul_ps(d,d);
679             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
680
681             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
682
683             /* Evaluate switch function */
684             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
685             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv20,_mm_mul_ps(velec,dsw)) );
686             velec            = _mm_mul_ps(velec,sw);
687             cutoff_mask      = _mm_cmplt_ps(rsq20,rcutoff2);
688
689             /* Update potential sum for this i atom from the interaction with this j atom. */
690             velec            = _mm_and_ps(velec,cutoff_mask);
691             velecsum         = _mm_add_ps(velecsum,velec);
692
693             fscal            = felec;
694
695             fscal            = _mm_and_ps(fscal,cutoff_mask);
696
697              /* Update vectorial force */
698             fix2             = _mm_macc_ps(dx20,fscal,fix2);
699             fiy2             = _mm_macc_ps(dy20,fscal,fiy2);
700             fiz2             = _mm_macc_ps(dz20,fscal,fiz2);
701
702             fjx0             = _mm_macc_ps(dx20,fscal,fjx0);
703             fjy0             = _mm_macc_ps(dy20,fscal,fjy0);
704             fjz0             = _mm_macc_ps(dz20,fscal,fjz0);
705
706             }
707
708             /**************************
709              * CALCULATE INTERACTIONS *
710              **************************/
711
712             if (gmx_mm_any_lt(rsq21,rcutoff2))
713             {
714
715             r21              = _mm_mul_ps(rsq21,rinv21);
716
717             /* EWALD ELECTROSTATICS */
718
719             /* Analytical PME correction */
720             zeta2            = _mm_mul_ps(beta2,rsq21);
721             rinv3            = _mm_mul_ps(rinvsq21,rinv21);
722             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
723             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
724             felec            = _mm_mul_ps(qq21,felec);
725             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
726             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv21);
727             velec            = _mm_mul_ps(qq21,velec);
728
729             d                = _mm_sub_ps(r21,rswitch);
730             d                = _mm_max_ps(d,_mm_setzero_ps());
731             d2               = _mm_mul_ps(d,d);
732             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
733
734             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
735
736             /* Evaluate switch function */
737             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
738             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv21,_mm_mul_ps(velec,dsw)) );
739             velec            = _mm_mul_ps(velec,sw);
740             cutoff_mask      = _mm_cmplt_ps(rsq21,rcutoff2);
741
742             /* Update potential sum for this i atom from the interaction with this j atom. */
743             velec            = _mm_and_ps(velec,cutoff_mask);
744             velecsum         = _mm_add_ps(velecsum,velec);
745
746             fscal            = felec;
747
748             fscal            = _mm_and_ps(fscal,cutoff_mask);
749
750              /* Update vectorial force */
751             fix2             = _mm_macc_ps(dx21,fscal,fix2);
752             fiy2             = _mm_macc_ps(dy21,fscal,fiy2);
753             fiz2             = _mm_macc_ps(dz21,fscal,fiz2);
754
755             fjx1             = _mm_macc_ps(dx21,fscal,fjx1);
756             fjy1             = _mm_macc_ps(dy21,fscal,fjy1);
757             fjz1             = _mm_macc_ps(dz21,fscal,fjz1);
758
759             }
760
761             /**************************
762              * CALCULATE INTERACTIONS *
763              **************************/
764
765             if (gmx_mm_any_lt(rsq22,rcutoff2))
766             {
767
768             r22              = _mm_mul_ps(rsq22,rinv22);
769
770             /* EWALD ELECTROSTATICS */
771
772             /* Analytical PME correction */
773             zeta2            = _mm_mul_ps(beta2,rsq22);
774             rinv3            = _mm_mul_ps(rinvsq22,rinv22);
775             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
776             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
777             felec            = _mm_mul_ps(qq22,felec);
778             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
779             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv22);
780             velec            = _mm_mul_ps(qq22,velec);
781
782             d                = _mm_sub_ps(r22,rswitch);
783             d                = _mm_max_ps(d,_mm_setzero_ps());
784             d2               = _mm_mul_ps(d,d);
785             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
786
787             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
788
789             /* Evaluate switch function */
790             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
791             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv22,_mm_mul_ps(velec,dsw)) );
792             velec            = _mm_mul_ps(velec,sw);
793             cutoff_mask      = _mm_cmplt_ps(rsq22,rcutoff2);
794
795             /* Update potential sum for this i atom from the interaction with this j atom. */
796             velec            = _mm_and_ps(velec,cutoff_mask);
797             velecsum         = _mm_add_ps(velecsum,velec);
798
799             fscal            = felec;
800
801             fscal            = _mm_and_ps(fscal,cutoff_mask);
802
803              /* Update vectorial force */
804             fix2             = _mm_macc_ps(dx22,fscal,fix2);
805             fiy2             = _mm_macc_ps(dy22,fscal,fiy2);
806             fiz2             = _mm_macc_ps(dz22,fscal,fiz2);
807
808             fjx2             = _mm_macc_ps(dx22,fscal,fjx2);
809             fjy2             = _mm_macc_ps(dy22,fscal,fjy2);
810             fjz2             = _mm_macc_ps(dz22,fscal,fjz2);
811
812             }
813
814             fjptrA             = f+j_coord_offsetA;
815             fjptrB             = f+j_coord_offsetB;
816             fjptrC             = f+j_coord_offsetC;
817             fjptrD             = f+j_coord_offsetD;
818
819             gmx_mm_decrement_3rvec_4ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,
820                                                    fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
821
822             /* Inner loop uses 495 flops */
823         }
824
825         if(jidx<j_index_end)
826         {
827
828             /* Get j neighbor index, and coordinate index */
829             jnrlistA         = jjnr[jidx];
830             jnrlistB         = jjnr[jidx+1];
831             jnrlistC         = jjnr[jidx+2];
832             jnrlistD         = jjnr[jidx+3];
833             /* Sign of each element will be negative for non-real atoms.
834              * This mask will be 0xFFFFFFFF for dummy entries and 0x0 for real ones,
835              * so use it as val = _mm_andnot_ps(mask,val) to clear dummy entries.
836              */
837             dummy_mask = gmx_mm_castsi128_ps(_mm_cmplt_epi32(_mm_loadu_si128((const __m128i *)(jjnr+jidx)),_mm_setzero_si128()));
838             jnrA       = (jnrlistA>=0) ? jnrlistA : 0;
839             jnrB       = (jnrlistB>=0) ? jnrlistB : 0;
840             jnrC       = (jnrlistC>=0) ? jnrlistC : 0;
841             jnrD       = (jnrlistD>=0) ? jnrlistD : 0;
842             j_coord_offsetA  = DIM*jnrA;
843             j_coord_offsetB  = DIM*jnrB;
844             j_coord_offsetC  = DIM*jnrC;
845             j_coord_offsetD  = DIM*jnrD;
846
847             /* load j atom coordinates */
848             gmx_mm_load_3rvec_4ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
849                                               x+j_coord_offsetC,x+j_coord_offsetD,
850                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
851
852             /* Calculate displacement vector */
853             dx00             = _mm_sub_ps(ix0,jx0);
854             dy00             = _mm_sub_ps(iy0,jy0);
855             dz00             = _mm_sub_ps(iz0,jz0);
856             dx01             = _mm_sub_ps(ix0,jx1);
857             dy01             = _mm_sub_ps(iy0,jy1);
858             dz01             = _mm_sub_ps(iz0,jz1);
859             dx02             = _mm_sub_ps(ix0,jx2);
860             dy02             = _mm_sub_ps(iy0,jy2);
861             dz02             = _mm_sub_ps(iz0,jz2);
862             dx10             = _mm_sub_ps(ix1,jx0);
863             dy10             = _mm_sub_ps(iy1,jy0);
864             dz10             = _mm_sub_ps(iz1,jz0);
865             dx11             = _mm_sub_ps(ix1,jx1);
866             dy11             = _mm_sub_ps(iy1,jy1);
867             dz11             = _mm_sub_ps(iz1,jz1);
868             dx12             = _mm_sub_ps(ix1,jx2);
869             dy12             = _mm_sub_ps(iy1,jy2);
870             dz12             = _mm_sub_ps(iz1,jz2);
871             dx20             = _mm_sub_ps(ix2,jx0);
872             dy20             = _mm_sub_ps(iy2,jy0);
873             dz20             = _mm_sub_ps(iz2,jz0);
874             dx21             = _mm_sub_ps(ix2,jx1);
875             dy21             = _mm_sub_ps(iy2,jy1);
876             dz21             = _mm_sub_ps(iz2,jz1);
877             dx22             = _mm_sub_ps(ix2,jx2);
878             dy22             = _mm_sub_ps(iy2,jy2);
879             dz22             = _mm_sub_ps(iz2,jz2);
880
881             /* Calculate squared distance and things based on it */
882             rsq00            = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
883             rsq01            = gmx_mm_calc_rsq_ps(dx01,dy01,dz01);
884             rsq02            = gmx_mm_calc_rsq_ps(dx02,dy02,dz02);
885             rsq10            = gmx_mm_calc_rsq_ps(dx10,dy10,dz10);
886             rsq11            = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
887             rsq12            = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
888             rsq20            = gmx_mm_calc_rsq_ps(dx20,dy20,dz20);
889             rsq21            = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
890             rsq22            = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
891
892             rinv00           = gmx_mm_invsqrt_ps(rsq00);
893             rinv01           = gmx_mm_invsqrt_ps(rsq01);
894             rinv02           = gmx_mm_invsqrt_ps(rsq02);
895             rinv10           = gmx_mm_invsqrt_ps(rsq10);
896             rinv11           = gmx_mm_invsqrt_ps(rsq11);
897             rinv12           = gmx_mm_invsqrt_ps(rsq12);
898             rinv20           = gmx_mm_invsqrt_ps(rsq20);
899             rinv21           = gmx_mm_invsqrt_ps(rsq21);
900             rinv22           = gmx_mm_invsqrt_ps(rsq22);
901
902             rinvsq00         = _mm_mul_ps(rinv00,rinv00);
903             rinvsq01         = _mm_mul_ps(rinv01,rinv01);
904             rinvsq02         = _mm_mul_ps(rinv02,rinv02);
905             rinvsq10         = _mm_mul_ps(rinv10,rinv10);
906             rinvsq11         = _mm_mul_ps(rinv11,rinv11);
907             rinvsq12         = _mm_mul_ps(rinv12,rinv12);
908             rinvsq20         = _mm_mul_ps(rinv20,rinv20);
909             rinvsq21         = _mm_mul_ps(rinv21,rinv21);
910             rinvsq22         = _mm_mul_ps(rinv22,rinv22);
911
912             fjx0             = _mm_setzero_ps();
913             fjy0             = _mm_setzero_ps();
914             fjz0             = _mm_setzero_ps();
915             fjx1             = _mm_setzero_ps();
916             fjy1             = _mm_setzero_ps();
917             fjz1             = _mm_setzero_ps();
918             fjx2             = _mm_setzero_ps();
919             fjy2             = _mm_setzero_ps();
920             fjz2             = _mm_setzero_ps();
921
922             /**************************
923              * CALCULATE INTERACTIONS *
924              **************************/
925
926             if (gmx_mm_any_lt(rsq00,rcutoff2))
927             {
928
929             r00              = _mm_mul_ps(rsq00,rinv00);
930             r00              = _mm_andnot_ps(dummy_mask,r00);
931
932             /* EWALD ELECTROSTATICS */
933
934             /* Analytical PME correction */
935             zeta2            = _mm_mul_ps(beta2,rsq00);
936             rinv3            = _mm_mul_ps(rinvsq00,rinv00);
937             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
938             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
939             felec            = _mm_mul_ps(qq00,felec);
940             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
941             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv00);
942             velec            = _mm_mul_ps(qq00,velec);
943
944             /* LENNARD-JONES DISPERSION/REPULSION */
945
946             rinvsix          = _mm_mul_ps(_mm_mul_ps(rinvsq00,rinvsq00),rinvsq00);
947             vvdw6            = _mm_mul_ps(c6_00,rinvsix);
948             vvdw12           = _mm_mul_ps(c12_00,_mm_mul_ps(rinvsix,rinvsix));
949             vvdw             = _mm_msub_ps(vvdw12,one_twelfth,_mm_mul_ps(vvdw6,one_sixth));
950             fvdw             = _mm_mul_ps(_mm_sub_ps(vvdw12,vvdw6),rinvsq00);
951
952             d                = _mm_sub_ps(r00,rswitch);
953             d                = _mm_max_ps(d,_mm_setzero_ps());
954             d2               = _mm_mul_ps(d,d);
955             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
956
957             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
958
959             /* Evaluate switch function */
960             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
961             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv00,_mm_mul_ps(velec,dsw)) );
962             fvdw             = _mm_msub_ps( fvdw,sw , _mm_mul_ps(rinv00,_mm_mul_ps(vvdw,dsw)) );
963             velec            = _mm_mul_ps(velec,sw);
964             vvdw             = _mm_mul_ps(vvdw,sw);
965             cutoff_mask      = _mm_cmplt_ps(rsq00,rcutoff2);
966
967             /* Update potential sum for this i atom from the interaction with this j atom. */
968             velec            = _mm_and_ps(velec,cutoff_mask);
969             velec            = _mm_andnot_ps(dummy_mask,velec);
970             velecsum         = _mm_add_ps(velecsum,velec);
971             vvdw             = _mm_and_ps(vvdw,cutoff_mask);
972             vvdw             = _mm_andnot_ps(dummy_mask,vvdw);
973             vvdwsum          = _mm_add_ps(vvdwsum,vvdw);
974
975             fscal            = _mm_add_ps(felec,fvdw);
976
977             fscal            = _mm_and_ps(fscal,cutoff_mask);
978
979             fscal            = _mm_andnot_ps(dummy_mask,fscal);
980
981              /* Update vectorial force */
982             fix0             = _mm_macc_ps(dx00,fscal,fix0);
983             fiy0             = _mm_macc_ps(dy00,fscal,fiy0);
984             fiz0             = _mm_macc_ps(dz00,fscal,fiz0);
985
986             fjx0             = _mm_macc_ps(dx00,fscal,fjx0);
987             fjy0             = _mm_macc_ps(dy00,fscal,fjy0);
988             fjz0             = _mm_macc_ps(dz00,fscal,fjz0);
989
990             }
991
992             /**************************
993              * CALCULATE INTERACTIONS *
994              **************************/
995
996             if (gmx_mm_any_lt(rsq01,rcutoff2))
997             {
998
999             r01              = _mm_mul_ps(rsq01,rinv01);
1000             r01              = _mm_andnot_ps(dummy_mask,r01);
1001
1002             /* EWALD ELECTROSTATICS */
1003
1004             /* Analytical PME correction */
1005             zeta2            = _mm_mul_ps(beta2,rsq01);
1006             rinv3            = _mm_mul_ps(rinvsq01,rinv01);
1007             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
1008             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
1009             felec            = _mm_mul_ps(qq01,felec);
1010             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
1011             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv01);
1012             velec            = _mm_mul_ps(qq01,velec);
1013
1014             d                = _mm_sub_ps(r01,rswitch);
1015             d                = _mm_max_ps(d,_mm_setzero_ps());
1016             d2               = _mm_mul_ps(d,d);
1017             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
1018
1019             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
1020
1021             /* Evaluate switch function */
1022             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1023             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv01,_mm_mul_ps(velec,dsw)) );
1024             velec            = _mm_mul_ps(velec,sw);
1025             cutoff_mask      = _mm_cmplt_ps(rsq01,rcutoff2);
1026
1027             /* Update potential sum for this i atom from the interaction with this j atom. */
1028             velec            = _mm_and_ps(velec,cutoff_mask);
1029             velec            = _mm_andnot_ps(dummy_mask,velec);
1030             velecsum         = _mm_add_ps(velecsum,velec);
1031
1032             fscal            = felec;
1033
1034             fscal            = _mm_and_ps(fscal,cutoff_mask);
1035
1036             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1037
1038              /* Update vectorial force */
1039             fix0             = _mm_macc_ps(dx01,fscal,fix0);
1040             fiy0             = _mm_macc_ps(dy01,fscal,fiy0);
1041             fiz0             = _mm_macc_ps(dz01,fscal,fiz0);
1042
1043             fjx1             = _mm_macc_ps(dx01,fscal,fjx1);
1044             fjy1             = _mm_macc_ps(dy01,fscal,fjy1);
1045             fjz1             = _mm_macc_ps(dz01,fscal,fjz1);
1046
1047             }
1048
1049             /**************************
1050              * CALCULATE INTERACTIONS *
1051              **************************/
1052
1053             if (gmx_mm_any_lt(rsq02,rcutoff2))
1054             {
1055
1056             r02              = _mm_mul_ps(rsq02,rinv02);
1057             r02              = _mm_andnot_ps(dummy_mask,r02);
1058
1059             /* EWALD ELECTROSTATICS */
1060
1061             /* Analytical PME correction */
1062             zeta2            = _mm_mul_ps(beta2,rsq02);
1063             rinv3            = _mm_mul_ps(rinvsq02,rinv02);
1064             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
1065             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
1066             felec            = _mm_mul_ps(qq02,felec);
1067             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
1068             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv02);
1069             velec            = _mm_mul_ps(qq02,velec);
1070
1071             d                = _mm_sub_ps(r02,rswitch);
1072             d                = _mm_max_ps(d,_mm_setzero_ps());
1073             d2               = _mm_mul_ps(d,d);
1074             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
1075
1076             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
1077
1078             /* Evaluate switch function */
1079             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1080             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv02,_mm_mul_ps(velec,dsw)) );
1081             velec            = _mm_mul_ps(velec,sw);
1082             cutoff_mask      = _mm_cmplt_ps(rsq02,rcutoff2);
1083
1084             /* Update potential sum for this i atom from the interaction with this j atom. */
1085             velec            = _mm_and_ps(velec,cutoff_mask);
1086             velec            = _mm_andnot_ps(dummy_mask,velec);
1087             velecsum         = _mm_add_ps(velecsum,velec);
1088
1089             fscal            = felec;
1090
1091             fscal            = _mm_and_ps(fscal,cutoff_mask);
1092
1093             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1094
1095              /* Update vectorial force */
1096             fix0             = _mm_macc_ps(dx02,fscal,fix0);
1097             fiy0             = _mm_macc_ps(dy02,fscal,fiy0);
1098             fiz0             = _mm_macc_ps(dz02,fscal,fiz0);
1099
1100             fjx2             = _mm_macc_ps(dx02,fscal,fjx2);
1101             fjy2             = _mm_macc_ps(dy02,fscal,fjy2);
1102             fjz2             = _mm_macc_ps(dz02,fscal,fjz2);
1103
1104             }
1105
1106             /**************************
1107              * CALCULATE INTERACTIONS *
1108              **************************/
1109
1110             if (gmx_mm_any_lt(rsq10,rcutoff2))
1111             {
1112
1113             r10              = _mm_mul_ps(rsq10,rinv10);
1114             r10              = _mm_andnot_ps(dummy_mask,r10);
1115
1116             /* EWALD ELECTROSTATICS */
1117
1118             /* Analytical PME correction */
1119             zeta2            = _mm_mul_ps(beta2,rsq10);
1120             rinv3            = _mm_mul_ps(rinvsq10,rinv10);
1121             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
1122             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
1123             felec            = _mm_mul_ps(qq10,felec);
1124             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
1125             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv10);
1126             velec            = _mm_mul_ps(qq10,velec);
1127
1128             d                = _mm_sub_ps(r10,rswitch);
1129             d                = _mm_max_ps(d,_mm_setzero_ps());
1130             d2               = _mm_mul_ps(d,d);
1131             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
1132
1133             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
1134
1135             /* Evaluate switch function */
1136             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1137             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv10,_mm_mul_ps(velec,dsw)) );
1138             velec            = _mm_mul_ps(velec,sw);
1139             cutoff_mask      = _mm_cmplt_ps(rsq10,rcutoff2);
1140
1141             /* Update potential sum for this i atom from the interaction with this j atom. */
1142             velec            = _mm_and_ps(velec,cutoff_mask);
1143             velec            = _mm_andnot_ps(dummy_mask,velec);
1144             velecsum         = _mm_add_ps(velecsum,velec);
1145
1146             fscal            = felec;
1147
1148             fscal            = _mm_and_ps(fscal,cutoff_mask);
1149
1150             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1151
1152              /* Update vectorial force */
1153             fix1             = _mm_macc_ps(dx10,fscal,fix1);
1154             fiy1             = _mm_macc_ps(dy10,fscal,fiy1);
1155             fiz1             = _mm_macc_ps(dz10,fscal,fiz1);
1156
1157             fjx0             = _mm_macc_ps(dx10,fscal,fjx0);
1158             fjy0             = _mm_macc_ps(dy10,fscal,fjy0);
1159             fjz0             = _mm_macc_ps(dz10,fscal,fjz0);
1160
1161             }
1162
1163             /**************************
1164              * CALCULATE INTERACTIONS *
1165              **************************/
1166
1167             if (gmx_mm_any_lt(rsq11,rcutoff2))
1168             {
1169
1170             r11              = _mm_mul_ps(rsq11,rinv11);
1171             r11              = _mm_andnot_ps(dummy_mask,r11);
1172
1173             /* EWALD ELECTROSTATICS */
1174
1175             /* Analytical PME correction */
1176             zeta2            = _mm_mul_ps(beta2,rsq11);
1177             rinv3            = _mm_mul_ps(rinvsq11,rinv11);
1178             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
1179             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
1180             felec            = _mm_mul_ps(qq11,felec);
1181             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
1182             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv11);
1183             velec            = _mm_mul_ps(qq11,velec);
1184
1185             d                = _mm_sub_ps(r11,rswitch);
1186             d                = _mm_max_ps(d,_mm_setzero_ps());
1187             d2               = _mm_mul_ps(d,d);
1188             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
1189
1190             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
1191
1192             /* Evaluate switch function */
1193             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1194             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv11,_mm_mul_ps(velec,dsw)) );
1195             velec            = _mm_mul_ps(velec,sw);
1196             cutoff_mask      = _mm_cmplt_ps(rsq11,rcutoff2);
1197
1198             /* Update potential sum for this i atom from the interaction with this j atom. */
1199             velec            = _mm_and_ps(velec,cutoff_mask);
1200             velec            = _mm_andnot_ps(dummy_mask,velec);
1201             velecsum         = _mm_add_ps(velecsum,velec);
1202
1203             fscal            = felec;
1204
1205             fscal            = _mm_and_ps(fscal,cutoff_mask);
1206
1207             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1208
1209              /* Update vectorial force */
1210             fix1             = _mm_macc_ps(dx11,fscal,fix1);
1211             fiy1             = _mm_macc_ps(dy11,fscal,fiy1);
1212             fiz1             = _mm_macc_ps(dz11,fscal,fiz1);
1213
1214             fjx1             = _mm_macc_ps(dx11,fscal,fjx1);
1215             fjy1             = _mm_macc_ps(dy11,fscal,fjy1);
1216             fjz1             = _mm_macc_ps(dz11,fscal,fjz1);
1217
1218             }
1219
1220             /**************************
1221              * CALCULATE INTERACTIONS *
1222              **************************/
1223
1224             if (gmx_mm_any_lt(rsq12,rcutoff2))
1225             {
1226
1227             r12              = _mm_mul_ps(rsq12,rinv12);
1228             r12              = _mm_andnot_ps(dummy_mask,r12);
1229
1230             /* EWALD ELECTROSTATICS */
1231
1232             /* Analytical PME correction */
1233             zeta2            = _mm_mul_ps(beta2,rsq12);
1234             rinv3            = _mm_mul_ps(rinvsq12,rinv12);
1235             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
1236             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
1237             felec            = _mm_mul_ps(qq12,felec);
1238             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
1239             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv12);
1240             velec            = _mm_mul_ps(qq12,velec);
1241
1242             d                = _mm_sub_ps(r12,rswitch);
1243             d                = _mm_max_ps(d,_mm_setzero_ps());
1244             d2               = _mm_mul_ps(d,d);
1245             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
1246
1247             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
1248
1249             /* Evaluate switch function */
1250             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1251             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv12,_mm_mul_ps(velec,dsw)) );
1252             velec            = _mm_mul_ps(velec,sw);
1253             cutoff_mask      = _mm_cmplt_ps(rsq12,rcutoff2);
1254
1255             /* Update potential sum for this i atom from the interaction with this j atom. */
1256             velec            = _mm_and_ps(velec,cutoff_mask);
1257             velec            = _mm_andnot_ps(dummy_mask,velec);
1258             velecsum         = _mm_add_ps(velecsum,velec);
1259
1260             fscal            = felec;
1261
1262             fscal            = _mm_and_ps(fscal,cutoff_mask);
1263
1264             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1265
1266              /* Update vectorial force */
1267             fix1             = _mm_macc_ps(dx12,fscal,fix1);
1268             fiy1             = _mm_macc_ps(dy12,fscal,fiy1);
1269             fiz1             = _mm_macc_ps(dz12,fscal,fiz1);
1270
1271             fjx2             = _mm_macc_ps(dx12,fscal,fjx2);
1272             fjy2             = _mm_macc_ps(dy12,fscal,fjy2);
1273             fjz2             = _mm_macc_ps(dz12,fscal,fjz2);
1274
1275             }
1276
1277             /**************************
1278              * CALCULATE INTERACTIONS *
1279              **************************/
1280
1281             if (gmx_mm_any_lt(rsq20,rcutoff2))
1282             {
1283
1284             r20              = _mm_mul_ps(rsq20,rinv20);
1285             r20              = _mm_andnot_ps(dummy_mask,r20);
1286
1287             /* EWALD ELECTROSTATICS */
1288
1289             /* Analytical PME correction */
1290             zeta2            = _mm_mul_ps(beta2,rsq20);
1291             rinv3            = _mm_mul_ps(rinvsq20,rinv20);
1292             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
1293             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
1294             felec            = _mm_mul_ps(qq20,felec);
1295             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
1296             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv20);
1297             velec            = _mm_mul_ps(qq20,velec);
1298
1299             d                = _mm_sub_ps(r20,rswitch);
1300             d                = _mm_max_ps(d,_mm_setzero_ps());
1301             d2               = _mm_mul_ps(d,d);
1302             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
1303
1304             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
1305
1306             /* Evaluate switch function */
1307             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1308             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv20,_mm_mul_ps(velec,dsw)) );
1309             velec            = _mm_mul_ps(velec,sw);
1310             cutoff_mask      = _mm_cmplt_ps(rsq20,rcutoff2);
1311
1312             /* Update potential sum for this i atom from the interaction with this j atom. */
1313             velec            = _mm_and_ps(velec,cutoff_mask);
1314             velec            = _mm_andnot_ps(dummy_mask,velec);
1315             velecsum         = _mm_add_ps(velecsum,velec);
1316
1317             fscal            = felec;
1318
1319             fscal            = _mm_and_ps(fscal,cutoff_mask);
1320
1321             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1322
1323              /* Update vectorial force */
1324             fix2             = _mm_macc_ps(dx20,fscal,fix2);
1325             fiy2             = _mm_macc_ps(dy20,fscal,fiy2);
1326             fiz2             = _mm_macc_ps(dz20,fscal,fiz2);
1327
1328             fjx0             = _mm_macc_ps(dx20,fscal,fjx0);
1329             fjy0             = _mm_macc_ps(dy20,fscal,fjy0);
1330             fjz0             = _mm_macc_ps(dz20,fscal,fjz0);
1331
1332             }
1333
1334             /**************************
1335              * CALCULATE INTERACTIONS *
1336              **************************/
1337
1338             if (gmx_mm_any_lt(rsq21,rcutoff2))
1339             {
1340
1341             r21              = _mm_mul_ps(rsq21,rinv21);
1342             r21              = _mm_andnot_ps(dummy_mask,r21);
1343
1344             /* EWALD ELECTROSTATICS */
1345
1346             /* Analytical PME correction */
1347             zeta2            = _mm_mul_ps(beta2,rsq21);
1348             rinv3            = _mm_mul_ps(rinvsq21,rinv21);
1349             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
1350             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
1351             felec            = _mm_mul_ps(qq21,felec);
1352             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
1353             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv21);
1354             velec            = _mm_mul_ps(qq21,velec);
1355
1356             d                = _mm_sub_ps(r21,rswitch);
1357             d                = _mm_max_ps(d,_mm_setzero_ps());
1358             d2               = _mm_mul_ps(d,d);
1359             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
1360
1361             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
1362
1363             /* Evaluate switch function */
1364             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1365             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv21,_mm_mul_ps(velec,dsw)) );
1366             velec            = _mm_mul_ps(velec,sw);
1367             cutoff_mask      = _mm_cmplt_ps(rsq21,rcutoff2);
1368
1369             /* Update potential sum for this i atom from the interaction with this j atom. */
1370             velec            = _mm_and_ps(velec,cutoff_mask);
1371             velec            = _mm_andnot_ps(dummy_mask,velec);
1372             velecsum         = _mm_add_ps(velecsum,velec);
1373
1374             fscal            = felec;
1375
1376             fscal            = _mm_and_ps(fscal,cutoff_mask);
1377
1378             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1379
1380              /* Update vectorial force */
1381             fix2             = _mm_macc_ps(dx21,fscal,fix2);
1382             fiy2             = _mm_macc_ps(dy21,fscal,fiy2);
1383             fiz2             = _mm_macc_ps(dz21,fscal,fiz2);
1384
1385             fjx1             = _mm_macc_ps(dx21,fscal,fjx1);
1386             fjy1             = _mm_macc_ps(dy21,fscal,fjy1);
1387             fjz1             = _mm_macc_ps(dz21,fscal,fjz1);
1388
1389             }
1390
1391             /**************************
1392              * CALCULATE INTERACTIONS *
1393              **************************/
1394
1395             if (gmx_mm_any_lt(rsq22,rcutoff2))
1396             {
1397
1398             r22              = _mm_mul_ps(rsq22,rinv22);
1399             r22              = _mm_andnot_ps(dummy_mask,r22);
1400
1401             /* EWALD ELECTROSTATICS */
1402
1403             /* Analytical PME correction */
1404             zeta2            = _mm_mul_ps(beta2,rsq22);
1405             rinv3            = _mm_mul_ps(rinvsq22,rinv22);
1406             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
1407             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
1408             felec            = _mm_mul_ps(qq22,felec);
1409             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
1410             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv22);
1411             velec            = _mm_mul_ps(qq22,velec);
1412
1413             d                = _mm_sub_ps(r22,rswitch);
1414             d                = _mm_max_ps(d,_mm_setzero_ps());
1415             d2               = _mm_mul_ps(d,d);
1416             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
1417
1418             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
1419
1420             /* Evaluate switch function */
1421             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1422             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv22,_mm_mul_ps(velec,dsw)) );
1423             velec            = _mm_mul_ps(velec,sw);
1424             cutoff_mask      = _mm_cmplt_ps(rsq22,rcutoff2);
1425
1426             /* Update potential sum for this i atom from the interaction with this j atom. */
1427             velec            = _mm_and_ps(velec,cutoff_mask);
1428             velec            = _mm_andnot_ps(dummy_mask,velec);
1429             velecsum         = _mm_add_ps(velecsum,velec);
1430
1431             fscal            = felec;
1432
1433             fscal            = _mm_and_ps(fscal,cutoff_mask);
1434
1435             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1436
1437              /* Update vectorial force */
1438             fix2             = _mm_macc_ps(dx22,fscal,fix2);
1439             fiy2             = _mm_macc_ps(dy22,fscal,fiy2);
1440             fiz2             = _mm_macc_ps(dz22,fscal,fiz2);
1441
1442             fjx2             = _mm_macc_ps(dx22,fscal,fjx2);
1443             fjy2             = _mm_macc_ps(dy22,fscal,fjy2);
1444             fjz2             = _mm_macc_ps(dz22,fscal,fjz2);
1445
1446             }
1447
1448             fjptrA             = (jnrlistA>=0) ? f+j_coord_offsetA : scratch;
1449             fjptrB             = (jnrlistB>=0) ? f+j_coord_offsetB : scratch;
1450             fjptrC             = (jnrlistC>=0) ? f+j_coord_offsetC : scratch;
1451             fjptrD             = (jnrlistD>=0) ? f+j_coord_offsetD : scratch;
1452
1453             gmx_mm_decrement_3rvec_4ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,
1454                                                    fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
1455
1456             /* Inner loop uses 504 flops */
1457         }
1458
1459         /* End of innermost loop */
1460
1461         gmx_mm_update_iforce_3atom_swizzle_ps(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,
1462                                               f+i_coord_offset,fshift+i_shift_offset);
1463
1464         ggid                        = gid[iidx];
1465         /* Update potential energies */
1466         gmx_mm_update_1pot_ps(velecsum,kernel_data->energygrp_elec+ggid);
1467         gmx_mm_update_1pot_ps(vvdwsum,kernel_data->energygrp_vdw+ggid);
1468
1469         /* Increment number of inner iterations */
1470         inneriter                  += j_index_end - j_index_start;
1471
1472         /* Outer loop uses 20 flops */
1473     }
1474
1475     /* Increment number of outer iterations */
1476     outeriter        += nri;
1477
1478     /* Update outer/inner flops */
1479
1480     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3W3_VF,outeriter*20 + inneriter*504);
1481 }
1482 /*
1483  * Gromacs nonbonded kernel:   nb_kernel_ElecEwSw_VdwLJSw_GeomW3W3_F_avx_128_fma_single
1484  * Electrostatics interaction: Ewald
1485  * VdW interaction:            LennardJones
1486  * Geometry:                   Water3-Water3
1487  * Calculate force/pot:        Force
1488  */
1489 void
1490 nb_kernel_ElecEwSw_VdwLJSw_GeomW3W3_F_avx_128_fma_single
1491                     (t_nblist                    * gmx_restrict       nlist,
1492                      rvec                        * gmx_restrict          xx,
1493                      rvec                        * gmx_restrict          ff,
1494                      t_forcerec                  * gmx_restrict          fr,
1495                      t_mdatoms                   * gmx_restrict     mdatoms,
1496                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
1497                      t_nrnb                      * gmx_restrict        nrnb)
1498 {
1499     /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or
1500      * just 0 for non-waters.
1501      * Suffixes A,B,C,D refer to j loop unrolling done with AVX_128, e.g. for the four different
1502      * jnr indices corresponding to data put in the four positions in the SIMD register.
1503      */
1504     int              i_shift_offset,i_coord_offset,outeriter,inneriter;
1505     int              j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
1506     int              jnrA,jnrB,jnrC,jnrD;
1507     int              jnrlistA,jnrlistB,jnrlistC,jnrlistD;
1508     int              j_coord_offsetA,j_coord_offsetB,j_coord_offsetC,j_coord_offsetD;
1509     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
1510     real             rcutoff_scalar;
1511     real             *shiftvec,*fshift,*x,*f;
1512     real             *fjptrA,*fjptrB,*fjptrC,*fjptrD;
1513     real             scratch[4*DIM];
1514     __m128           fscal,rcutoff,rcutoff2,jidxall;
1515     int              vdwioffset0;
1516     __m128           ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
1517     int              vdwioffset1;
1518     __m128           ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
1519     int              vdwioffset2;
1520     __m128           ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
1521     int              vdwjidx0A,vdwjidx0B,vdwjidx0C,vdwjidx0D;
1522     __m128           jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
1523     int              vdwjidx1A,vdwjidx1B,vdwjidx1C,vdwjidx1D;
1524     __m128           jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
1525     int              vdwjidx2A,vdwjidx2B,vdwjidx2C,vdwjidx2D;
1526     __m128           jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
1527     __m128           dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
1528     __m128           dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01;
1529     __m128           dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02;
1530     __m128           dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10;
1531     __m128           dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
1532     __m128           dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
1533     __m128           dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20;
1534     __m128           dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
1535     __m128           dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
1536     __m128           velec,felec,velecsum,facel,crf,krf,krf2;
1537     real             *charge;
1538     int              nvdwtype;
1539     __m128           rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
1540     int              *vdwtype;
1541     real             *vdwparam;
1542     __m128           one_sixth   = _mm_set1_ps(1.0/6.0);
1543     __m128           one_twelfth = _mm_set1_ps(1.0/12.0);
1544     __m128i          ewitab;
1545     __m128           ewtabscale,eweps,twoeweps,sh_ewald,ewrt,ewtabhalfspace,ewtabF,ewtabFn,ewtabD,ewtabV;
1546     __m128           beta,beta2,beta3,zeta2,pmecorrF,pmecorrV,rinv3;
1547     real             *ewtab;
1548     __m128           rswitch,swV3,swV4,swV5,swF2,swF3,swF4,d,d2,sw,dsw;
1549     real             rswitch_scalar,d_scalar;
1550     __m128           dummy_mask,cutoff_mask;
1551     __m128           signbit = _mm_castsi128_ps( _mm_set1_epi32(0x80000000) );
1552     __m128           one     = _mm_set1_ps(1.0);
1553     __m128           two     = _mm_set1_ps(2.0);
1554     x                = xx[0];
1555     f                = ff[0];
1556
1557     nri              = nlist->nri;
1558     iinr             = nlist->iinr;
1559     jindex           = nlist->jindex;
1560     jjnr             = nlist->jjnr;
1561     shiftidx         = nlist->shift;
1562     gid              = nlist->gid;
1563     shiftvec         = fr->shift_vec[0];
1564     fshift           = fr->fshift[0];
1565     facel            = _mm_set1_ps(fr->epsfac);
1566     charge           = mdatoms->chargeA;
1567     nvdwtype         = fr->ntype;
1568     vdwparam         = fr->nbfp;
1569     vdwtype          = mdatoms->typeA;
1570
1571     sh_ewald         = _mm_set1_ps(fr->ic->sh_ewald);
1572     beta             = _mm_set1_ps(fr->ic->ewaldcoeff_q);
1573     beta2            = _mm_mul_ps(beta,beta);
1574     beta3            = _mm_mul_ps(beta,beta2);
1575     ewtab            = fr->ic->tabq_coul_FDV0;
1576     ewtabscale       = _mm_set1_ps(fr->ic->tabq_scale);
1577     ewtabhalfspace   = _mm_set1_ps(0.5/fr->ic->tabq_scale);
1578
1579     /* Setup water-specific parameters */
1580     inr              = nlist->iinr[0];
1581     iq0              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+0]));
1582     iq1              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+1]));
1583     iq2              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+2]));
1584     vdwioffset0      = 2*nvdwtype*vdwtype[inr+0];
1585
1586     jq0              = _mm_set1_ps(charge[inr+0]);
1587     jq1              = _mm_set1_ps(charge[inr+1]);
1588     jq2              = _mm_set1_ps(charge[inr+2]);
1589     vdwjidx0A        = 2*vdwtype[inr+0];
1590     qq00             = _mm_mul_ps(iq0,jq0);
1591     c6_00            = _mm_set1_ps(vdwparam[vdwioffset0+vdwjidx0A]);
1592     c12_00           = _mm_set1_ps(vdwparam[vdwioffset0+vdwjidx0A+1]);
1593     qq01             = _mm_mul_ps(iq0,jq1);
1594     qq02             = _mm_mul_ps(iq0,jq2);
1595     qq10             = _mm_mul_ps(iq1,jq0);
1596     qq11             = _mm_mul_ps(iq1,jq1);
1597     qq12             = _mm_mul_ps(iq1,jq2);
1598     qq20             = _mm_mul_ps(iq2,jq0);
1599     qq21             = _mm_mul_ps(iq2,jq1);
1600     qq22             = _mm_mul_ps(iq2,jq2);
1601
1602     /* When we use explicit cutoffs the value must be identical for elec and VdW, so use elec as an arbitrary choice */
1603     rcutoff_scalar   = fr->rcoulomb;
1604     rcutoff          = _mm_set1_ps(rcutoff_scalar);
1605     rcutoff2         = _mm_mul_ps(rcutoff,rcutoff);
1606
1607     rswitch_scalar   = fr->rcoulomb_switch;
1608     rswitch          = _mm_set1_ps(rswitch_scalar);
1609     /* Setup switch parameters */
1610     d_scalar         = rcutoff_scalar-rswitch_scalar;
1611     d                = _mm_set1_ps(d_scalar);
1612     swV3             = _mm_set1_ps(-10.0/(d_scalar*d_scalar*d_scalar));
1613     swV4             = _mm_set1_ps( 15.0/(d_scalar*d_scalar*d_scalar*d_scalar));
1614     swV5             = _mm_set1_ps( -6.0/(d_scalar*d_scalar*d_scalar*d_scalar*d_scalar));
1615     swF2             = _mm_set1_ps(-30.0/(d_scalar*d_scalar*d_scalar));
1616     swF3             = _mm_set1_ps( 60.0/(d_scalar*d_scalar*d_scalar*d_scalar));
1617     swF4             = _mm_set1_ps(-30.0/(d_scalar*d_scalar*d_scalar*d_scalar*d_scalar));
1618
1619     /* Avoid stupid compiler warnings */
1620     jnrA = jnrB = jnrC = jnrD = 0;
1621     j_coord_offsetA = 0;
1622     j_coord_offsetB = 0;
1623     j_coord_offsetC = 0;
1624     j_coord_offsetD = 0;
1625
1626     outeriter        = 0;
1627     inneriter        = 0;
1628
1629     for(iidx=0;iidx<4*DIM;iidx++)
1630     {
1631         scratch[iidx] = 0.0;
1632     }
1633
1634     /* Start outer loop over neighborlists */
1635     for(iidx=0; iidx<nri; iidx++)
1636     {
1637         /* Load shift vector for this list */
1638         i_shift_offset   = DIM*shiftidx[iidx];
1639
1640         /* Load limits for loop over neighbors */
1641         j_index_start    = jindex[iidx];
1642         j_index_end      = jindex[iidx+1];
1643
1644         /* Get outer coordinate index */
1645         inr              = iinr[iidx];
1646         i_coord_offset   = DIM*inr;
1647
1648         /* Load i particle coords and add shift vector */
1649         gmx_mm_load_shift_and_3rvec_broadcast_ps(shiftvec+i_shift_offset,x+i_coord_offset,
1650                                                  &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2);
1651
1652         fix0             = _mm_setzero_ps();
1653         fiy0             = _mm_setzero_ps();
1654         fiz0             = _mm_setzero_ps();
1655         fix1             = _mm_setzero_ps();
1656         fiy1             = _mm_setzero_ps();
1657         fiz1             = _mm_setzero_ps();
1658         fix2             = _mm_setzero_ps();
1659         fiy2             = _mm_setzero_ps();
1660         fiz2             = _mm_setzero_ps();
1661
1662         /* Start inner kernel loop */
1663         for(jidx=j_index_start; jidx<j_index_end && jjnr[jidx+3]>=0; jidx+=4)
1664         {
1665
1666             /* Get j neighbor index, and coordinate index */
1667             jnrA             = jjnr[jidx];
1668             jnrB             = jjnr[jidx+1];
1669             jnrC             = jjnr[jidx+2];
1670             jnrD             = jjnr[jidx+3];
1671             j_coord_offsetA  = DIM*jnrA;
1672             j_coord_offsetB  = DIM*jnrB;
1673             j_coord_offsetC  = DIM*jnrC;
1674             j_coord_offsetD  = DIM*jnrD;
1675
1676             /* load j atom coordinates */
1677             gmx_mm_load_3rvec_4ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
1678                                               x+j_coord_offsetC,x+j_coord_offsetD,
1679                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
1680
1681             /* Calculate displacement vector */
1682             dx00             = _mm_sub_ps(ix0,jx0);
1683             dy00             = _mm_sub_ps(iy0,jy0);
1684             dz00             = _mm_sub_ps(iz0,jz0);
1685             dx01             = _mm_sub_ps(ix0,jx1);
1686             dy01             = _mm_sub_ps(iy0,jy1);
1687             dz01             = _mm_sub_ps(iz0,jz1);
1688             dx02             = _mm_sub_ps(ix0,jx2);
1689             dy02             = _mm_sub_ps(iy0,jy2);
1690             dz02             = _mm_sub_ps(iz0,jz2);
1691             dx10             = _mm_sub_ps(ix1,jx0);
1692             dy10             = _mm_sub_ps(iy1,jy0);
1693             dz10             = _mm_sub_ps(iz1,jz0);
1694             dx11             = _mm_sub_ps(ix1,jx1);
1695             dy11             = _mm_sub_ps(iy1,jy1);
1696             dz11             = _mm_sub_ps(iz1,jz1);
1697             dx12             = _mm_sub_ps(ix1,jx2);
1698             dy12             = _mm_sub_ps(iy1,jy2);
1699             dz12             = _mm_sub_ps(iz1,jz2);
1700             dx20             = _mm_sub_ps(ix2,jx0);
1701             dy20             = _mm_sub_ps(iy2,jy0);
1702             dz20             = _mm_sub_ps(iz2,jz0);
1703             dx21             = _mm_sub_ps(ix2,jx1);
1704             dy21             = _mm_sub_ps(iy2,jy1);
1705             dz21             = _mm_sub_ps(iz2,jz1);
1706             dx22             = _mm_sub_ps(ix2,jx2);
1707             dy22             = _mm_sub_ps(iy2,jy2);
1708             dz22             = _mm_sub_ps(iz2,jz2);
1709
1710             /* Calculate squared distance and things based on it */
1711             rsq00            = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
1712             rsq01            = gmx_mm_calc_rsq_ps(dx01,dy01,dz01);
1713             rsq02            = gmx_mm_calc_rsq_ps(dx02,dy02,dz02);
1714             rsq10            = gmx_mm_calc_rsq_ps(dx10,dy10,dz10);
1715             rsq11            = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
1716             rsq12            = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
1717             rsq20            = gmx_mm_calc_rsq_ps(dx20,dy20,dz20);
1718             rsq21            = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
1719             rsq22            = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
1720
1721             rinv00           = gmx_mm_invsqrt_ps(rsq00);
1722             rinv01           = gmx_mm_invsqrt_ps(rsq01);
1723             rinv02           = gmx_mm_invsqrt_ps(rsq02);
1724             rinv10           = gmx_mm_invsqrt_ps(rsq10);
1725             rinv11           = gmx_mm_invsqrt_ps(rsq11);
1726             rinv12           = gmx_mm_invsqrt_ps(rsq12);
1727             rinv20           = gmx_mm_invsqrt_ps(rsq20);
1728             rinv21           = gmx_mm_invsqrt_ps(rsq21);
1729             rinv22           = gmx_mm_invsqrt_ps(rsq22);
1730
1731             rinvsq00         = _mm_mul_ps(rinv00,rinv00);
1732             rinvsq01         = _mm_mul_ps(rinv01,rinv01);
1733             rinvsq02         = _mm_mul_ps(rinv02,rinv02);
1734             rinvsq10         = _mm_mul_ps(rinv10,rinv10);
1735             rinvsq11         = _mm_mul_ps(rinv11,rinv11);
1736             rinvsq12         = _mm_mul_ps(rinv12,rinv12);
1737             rinvsq20         = _mm_mul_ps(rinv20,rinv20);
1738             rinvsq21         = _mm_mul_ps(rinv21,rinv21);
1739             rinvsq22         = _mm_mul_ps(rinv22,rinv22);
1740
1741             fjx0             = _mm_setzero_ps();
1742             fjy0             = _mm_setzero_ps();
1743             fjz0             = _mm_setzero_ps();
1744             fjx1             = _mm_setzero_ps();
1745             fjy1             = _mm_setzero_ps();
1746             fjz1             = _mm_setzero_ps();
1747             fjx2             = _mm_setzero_ps();
1748             fjy2             = _mm_setzero_ps();
1749             fjz2             = _mm_setzero_ps();
1750
1751             /**************************
1752              * CALCULATE INTERACTIONS *
1753              **************************/
1754
1755             if (gmx_mm_any_lt(rsq00,rcutoff2))
1756             {
1757
1758             r00              = _mm_mul_ps(rsq00,rinv00);
1759
1760             /* EWALD ELECTROSTATICS */
1761
1762             /* Analytical PME correction */
1763             zeta2            = _mm_mul_ps(beta2,rsq00);
1764             rinv3            = _mm_mul_ps(rinvsq00,rinv00);
1765             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
1766             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
1767             felec            = _mm_mul_ps(qq00,felec);
1768             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
1769             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv00);
1770             velec            = _mm_mul_ps(qq00,velec);
1771
1772             /* LENNARD-JONES DISPERSION/REPULSION */
1773
1774             rinvsix          = _mm_mul_ps(_mm_mul_ps(rinvsq00,rinvsq00),rinvsq00);
1775             vvdw6            = _mm_mul_ps(c6_00,rinvsix);
1776             vvdw12           = _mm_mul_ps(c12_00,_mm_mul_ps(rinvsix,rinvsix));
1777             vvdw             = _mm_msub_ps(vvdw12,one_twelfth,_mm_mul_ps(vvdw6,one_sixth));
1778             fvdw             = _mm_mul_ps(_mm_sub_ps(vvdw12,vvdw6),rinvsq00);
1779
1780             d                = _mm_sub_ps(r00,rswitch);
1781             d                = _mm_max_ps(d,_mm_setzero_ps());
1782             d2               = _mm_mul_ps(d,d);
1783             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
1784
1785             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
1786
1787             /* Evaluate switch function */
1788             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1789             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv00,_mm_mul_ps(velec,dsw)) );
1790             fvdw             = _mm_msub_ps( fvdw,sw , _mm_mul_ps(rinv00,_mm_mul_ps(vvdw,dsw)) );
1791             cutoff_mask      = _mm_cmplt_ps(rsq00,rcutoff2);
1792
1793             fscal            = _mm_add_ps(felec,fvdw);
1794
1795             fscal            = _mm_and_ps(fscal,cutoff_mask);
1796
1797              /* Update vectorial force */
1798             fix0             = _mm_macc_ps(dx00,fscal,fix0);
1799             fiy0             = _mm_macc_ps(dy00,fscal,fiy0);
1800             fiz0             = _mm_macc_ps(dz00,fscal,fiz0);
1801
1802             fjx0             = _mm_macc_ps(dx00,fscal,fjx0);
1803             fjy0             = _mm_macc_ps(dy00,fscal,fjy0);
1804             fjz0             = _mm_macc_ps(dz00,fscal,fjz0);
1805
1806             }
1807
1808             /**************************
1809              * CALCULATE INTERACTIONS *
1810              **************************/
1811
1812             if (gmx_mm_any_lt(rsq01,rcutoff2))
1813             {
1814
1815             r01              = _mm_mul_ps(rsq01,rinv01);
1816
1817             /* EWALD ELECTROSTATICS */
1818
1819             /* Analytical PME correction */
1820             zeta2            = _mm_mul_ps(beta2,rsq01);
1821             rinv3            = _mm_mul_ps(rinvsq01,rinv01);
1822             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
1823             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
1824             felec            = _mm_mul_ps(qq01,felec);
1825             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
1826             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv01);
1827             velec            = _mm_mul_ps(qq01,velec);
1828
1829             d                = _mm_sub_ps(r01,rswitch);
1830             d                = _mm_max_ps(d,_mm_setzero_ps());
1831             d2               = _mm_mul_ps(d,d);
1832             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
1833
1834             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
1835
1836             /* Evaluate switch function */
1837             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1838             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv01,_mm_mul_ps(velec,dsw)) );
1839             cutoff_mask      = _mm_cmplt_ps(rsq01,rcutoff2);
1840
1841             fscal            = felec;
1842
1843             fscal            = _mm_and_ps(fscal,cutoff_mask);
1844
1845              /* Update vectorial force */
1846             fix0             = _mm_macc_ps(dx01,fscal,fix0);
1847             fiy0             = _mm_macc_ps(dy01,fscal,fiy0);
1848             fiz0             = _mm_macc_ps(dz01,fscal,fiz0);
1849
1850             fjx1             = _mm_macc_ps(dx01,fscal,fjx1);
1851             fjy1             = _mm_macc_ps(dy01,fscal,fjy1);
1852             fjz1             = _mm_macc_ps(dz01,fscal,fjz1);
1853
1854             }
1855
1856             /**************************
1857              * CALCULATE INTERACTIONS *
1858              **************************/
1859
1860             if (gmx_mm_any_lt(rsq02,rcutoff2))
1861             {
1862
1863             r02              = _mm_mul_ps(rsq02,rinv02);
1864
1865             /* EWALD ELECTROSTATICS */
1866
1867             /* Analytical PME correction */
1868             zeta2            = _mm_mul_ps(beta2,rsq02);
1869             rinv3            = _mm_mul_ps(rinvsq02,rinv02);
1870             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
1871             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
1872             felec            = _mm_mul_ps(qq02,felec);
1873             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
1874             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv02);
1875             velec            = _mm_mul_ps(qq02,velec);
1876
1877             d                = _mm_sub_ps(r02,rswitch);
1878             d                = _mm_max_ps(d,_mm_setzero_ps());
1879             d2               = _mm_mul_ps(d,d);
1880             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
1881
1882             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
1883
1884             /* Evaluate switch function */
1885             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1886             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv02,_mm_mul_ps(velec,dsw)) );
1887             cutoff_mask      = _mm_cmplt_ps(rsq02,rcutoff2);
1888
1889             fscal            = felec;
1890
1891             fscal            = _mm_and_ps(fscal,cutoff_mask);
1892
1893              /* Update vectorial force */
1894             fix0             = _mm_macc_ps(dx02,fscal,fix0);
1895             fiy0             = _mm_macc_ps(dy02,fscal,fiy0);
1896             fiz0             = _mm_macc_ps(dz02,fscal,fiz0);
1897
1898             fjx2             = _mm_macc_ps(dx02,fscal,fjx2);
1899             fjy2             = _mm_macc_ps(dy02,fscal,fjy2);
1900             fjz2             = _mm_macc_ps(dz02,fscal,fjz2);
1901
1902             }
1903
1904             /**************************
1905              * CALCULATE INTERACTIONS *
1906              **************************/
1907
1908             if (gmx_mm_any_lt(rsq10,rcutoff2))
1909             {
1910
1911             r10              = _mm_mul_ps(rsq10,rinv10);
1912
1913             /* EWALD ELECTROSTATICS */
1914
1915             /* Analytical PME correction */
1916             zeta2            = _mm_mul_ps(beta2,rsq10);
1917             rinv3            = _mm_mul_ps(rinvsq10,rinv10);
1918             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
1919             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
1920             felec            = _mm_mul_ps(qq10,felec);
1921             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
1922             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv10);
1923             velec            = _mm_mul_ps(qq10,velec);
1924
1925             d                = _mm_sub_ps(r10,rswitch);
1926             d                = _mm_max_ps(d,_mm_setzero_ps());
1927             d2               = _mm_mul_ps(d,d);
1928             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
1929
1930             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
1931
1932             /* Evaluate switch function */
1933             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1934             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv10,_mm_mul_ps(velec,dsw)) );
1935             cutoff_mask      = _mm_cmplt_ps(rsq10,rcutoff2);
1936
1937             fscal            = felec;
1938
1939             fscal            = _mm_and_ps(fscal,cutoff_mask);
1940
1941              /* Update vectorial force */
1942             fix1             = _mm_macc_ps(dx10,fscal,fix1);
1943             fiy1             = _mm_macc_ps(dy10,fscal,fiy1);
1944             fiz1             = _mm_macc_ps(dz10,fscal,fiz1);
1945
1946             fjx0             = _mm_macc_ps(dx10,fscal,fjx0);
1947             fjy0             = _mm_macc_ps(dy10,fscal,fjy0);
1948             fjz0             = _mm_macc_ps(dz10,fscal,fjz0);
1949
1950             }
1951
1952             /**************************
1953              * CALCULATE INTERACTIONS *
1954              **************************/
1955
1956             if (gmx_mm_any_lt(rsq11,rcutoff2))
1957             {
1958
1959             r11              = _mm_mul_ps(rsq11,rinv11);
1960
1961             /* EWALD ELECTROSTATICS */
1962
1963             /* Analytical PME correction */
1964             zeta2            = _mm_mul_ps(beta2,rsq11);
1965             rinv3            = _mm_mul_ps(rinvsq11,rinv11);
1966             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
1967             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
1968             felec            = _mm_mul_ps(qq11,felec);
1969             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
1970             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv11);
1971             velec            = _mm_mul_ps(qq11,velec);
1972
1973             d                = _mm_sub_ps(r11,rswitch);
1974             d                = _mm_max_ps(d,_mm_setzero_ps());
1975             d2               = _mm_mul_ps(d,d);
1976             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
1977
1978             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
1979
1980             /* Evaluate switch function */
1981             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1982             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv11,_mm_mul_ps(velec,dsw)) );
1983             cutoff_mask      = _mm_cmplt_ps(rsq11,rcutoff2);
1984
1985             fscal            = felec;
1986
1987             fscal            = _mm_and_ps(fscal,cutoff_mask);
1988
1989              /* Update vectorial force */
1990             fix1             = _mm_macc_ps(dx11,fscal,fix1);
1991             fiy1             = _mm_macc_ps(dy11,fscal,fiy1);
1992             fiz1             = _mm_macc_ps(dz11,fscal,fiz1);
1993
1994             fjx1             = _mm_macc_ps(dx11,fscal,fjx1);
1995             fjy1             = _mm_macc_ps(dy11,fscal,fjy1);
1996             fjz1             = _mm_macc_ps(dz11,fscal,fjz1);
1997
1998             }
1999
2000             /**************************
2001              * CALCULATE INTERACTIONS *
2002              **************************/
2003
2004             if (gmx_mm_any_lt(rsq12,rcutoff2))
2005             {
2006
2007             r12              = _mm_mul_ps(rsq12,rinv12);
2008
2009             /* EWALD ELECTROSTATICS */
2010
2011             /* Analytical PME correction */
2012             zeta2            = _mm_mul_ps(beta2,rsq12);
2013             rinv3            = _mm_mul_ps(rinvsq12,rinv12);
2014             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
2015             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
2016             felec            = _mm_mul_ps(qq12,felec);
2017             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
2018             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv12);
2019             velec            = _mm_mul_ps(qq12,velec);
2020
2021             d                = _mm_sub_ps(r12,rswitch);
2022             d                = _mm_max_ps(d,_mm_setzero_ps());
2023             d2               = _mm_mul_ps(d,d);
2024             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
2025
2026             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
2027
2028             /* Evaluate switch function */
2029             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
2030             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv12,_mm_mul_ps(velec,dsw)) );
2031             cutoff_mask      = _mm_cmplt_ps(rsq12,rcutoff2);
2032
2033             fscal            = felec;
2034
2035             fscal            = _mm_and_ps(fscal,cutoff_mask);
2036
2037              /* Update vectorial force */
2038             fix1             = _mm_macc_ps(dx12,fscal,fix1);
2039             fiy1             = _mm_macc_ps(dy12,fscal,fiy1);
2040             fiz1             = _mm_macc_ps(dz12,fscal,fiz1);
2041
2042             fjx2             = _mm_macc_ps(dx12,fscal,fjx2);
2043             fjy2             = _mm_macc_ps(dy12,fscal,fjy2);
2044             fjz2             = _mm_macc_ps(dz12,fscal,fjz2);
2045
2046             }
2047
2048             /**************************
2049              * CALCULATE INTERACTIONS *
2050              **************************/
2051
2052             if (gmx_mm_any_lt(rsq20,rcutoff2))
2053             {
2054
2055             r20              = _mm_mul_ps(rsq20,rinv20);
2056
2057             /* EWALD ELECTROSTATICS */
2058
2059             /* Analytical PME correction */
2060             zeta2            = _mm_mul_ps(beta2,rsq20);
2061             rinv3            = _mm_mul_ps(rinvsq20,rinv20);
2062             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
2063             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
2064             felec            = _mm_mul_ps(qq20,felec);
2065             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
2066             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv20);
2067             velec            = _mm_mul_ps(qq20,velec);
2068
2069             d                = _mm_sub_ps(r20,rswitch);
2070             d                = _mm_max_ps(d,_mm_setzero_ps());
2071             d2               = _mm_mul_ps(d,d);
2072             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
2073
2074             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
2075
2076             /* Evaluate switch function */
2077             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
2078             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv20,_mm_mul_ps(velec,dsw)) );
2079             cutoff_mask      = _mm_cmplt_ps(rsq20,rcutoff2);
2080
2081             fscal            = felec;
2082
2083             fscal            = _mm_and_ps(fscal,cutoff_mask);
2084
2085              /* Update vectorial force */
2086             fix2             = _mm_macc_ps(dx20,fscal,fix2);
2087             fiy2             = _mm_macc_ps(dy20,fscal,fiy2);
2088             fiz2             = _mm_macc_ps(dz20,fscal,fiz2);
2089
2090             fjx0             = _mm_macc_ps(dx20,fscal,fjx0);
2091             fjy0             = _mm_macc_ps(dy20,fscal,fjy0);
2092             fjz0             = _mm_macc_ps(dz20,fscal,fjz0);
2093
2094             }
2095
2096             /**************************
2097              * CALCULATE INTERACTIONS *
2098              **************************/
2099
2100             if (gmx_mm_any_lt(rsq21,rcutoff2))
2101             {
2102
2103             r21              = _mm_mul_ps(rsq21,rinv21);
2104
2105             /* EWALD ELECTROSTATICS */
2106
2107             /* Analytical PME correction */
2108             zeta2            = _mm_mul_ps(beta2,rsq21);
2109             rinv3            = _mm_mul_ps(rinvsq21,rinv21);
2110             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
2111             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
2112             felec            = _mm_mul_ps(qq21,felec);
2113             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
2114             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv21);
2115             velec            = _mm_mul_ps(qq21,velec);
2116
2117             d                = _mm_sub_ps(r21,rswitch);
2118             d                = _mm_max_ps(d,_mm_setzero_ps());
2119             d2               = _mm_mul_ps(d,d);
2120             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
2121
2122             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
2123
2124             /* Evaluate switch function */
2125             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
2126             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv21,_mm_mul_ps(velec,dsw)) );
2127             cutoff_mask      = _mm_cmplt_ps(rsq21,rcutoff2);
2128
2129             fscal            = felec;
2130
2131             fscal            = _mm_and_ps(fscal,cutoff_mask);
2132
2133              /* Update vectorial force */
2134             fix2             = _mm_macc_ps(dx21,fscal,fix2);
2135             fiy2             = _mm_macc_ps(dy21,fscal,fiy2);
2136             fiz2             = _mm_macc_ps(dz21,fscal,fiz2);
2137
2138             fjx1             = _mm_macc_ps(dx21,fscal,fjx1);
2139             fjy1             = _mm_macc_ps(dy21,fscal,fjy1);
2140             fjz1             = _mm_macc_ps(dz21,fscal,fjz1);
2141
2142             }
2143
2144             /**************************
2145              * CALCULATE INTERACTIONS *
2146              **************************/
2147
2148             if (gmx_mm_any_lt(rsq22,rcutoff2))
2149             {
2150
2151             r22              = _mm_mul_ps(rsq22,rinv22);
2152
2153             /* EWALD ELECTROSTATICS */
2154
2155             /* Analytical PME correction */
2156             zeta2            = _mm_mul_ps(beta2,rsq22);
2157             rinv3            = _mm_mul_ps(rinvsq22,rinv22);
2158             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
2159             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
2160             felec            = _mm_mul_ps(qq22,felec);
2161             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
2162             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv22);
2163             velec            = _mm_mul_ps(qq22,velec);
2164
2165             d                = _mm_sub_ps(r22,rswitch);
2166             d                = _mm_max_ps(d,_mm_setzero_ps());
2167             d2               = _mm_mul_ps(d,d);
2168             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
2169
2170             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
2171
2172             /* Evaluate switch function */
2173             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
2174             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv22,_mm_mul_ps(velec,dsw)) );
2175             cutoff_mask      = _mm_cmplt_ps(rsq22,rcutoff2);
2176
2177             fscal            = felec;
2178
2179             fscal            = _mm_and_ps(fscal,cutoff_mask);
2180
2181              /* Update vectorial force */
2182             fix2             = _mm_macc_ps(dx22,fscal,fix2);
2183             fiy2             = _mm_macc_ps(dy22,fscal,fiy2);
2184             fiz2             = _mm_macc_ps(dz22,fscal,fiz2);
2185
2186             fjx2             = _mm_macc_ps(dx22,fscal,fjx2);
2187             fjy2             = _mm_macc_ps(dy22,fscal,fjy2);
2188             fjz2             = _mm_macc_ps(dz22,fscal,fjz2);
2189
2190             }
2191
2192             fjptrA             = f+j_coord_offsetA;
2193             fjptrB             = f+j_coord_offsetB;
2194             fjptrC             = f+j_coord_offsetC;
2195             fjptrD             = f+j_coord_offsetD;
2196
2197             gmx_mm_decrement_3rvec_4ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,
2198                                                    fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
2199
2200             /* Inner loop uses 465 flops */
2201         }
2202
2203         if(jidx<j_index_end)
2204         {
2205
2206             /* Get j neighbor index, and coordinate index */
2207             jnrlistA         = jjnr[jidx];
2208             jnrlistB         = jjnr[jidx+1];
2209             jnrlistC         = jjnr[jidx+2];
2210             jnrlistD         = jjnr[jidx+3];
2211             /* Sign of each element will be negative for non-real atoms.
2212              * This mask will be 0xFFFFFFFF for dummy entries and 0x0 for real ones,
2213              * so use it as val = _mm_andnot_ps(mask,val) to clear dummy entries.
2214              */
2215             dummy_mask = gmx_mm_castsi128_ps(_mm_cmplt_epi32(_mm_loadu_si128((const __m128i *)(jjnr+jidx)),_mm_setzero_si128()));
2216             jnrA       = (jnrlistA>=0) ? jnrlistA : 0;
2217             jnrB       = (jnrlistB>=0) ? jnrlistB : 0;
2218             jnrC       = (jnrlistC>=0) ? jnrlistC : 0;
2219             jnrD       = (jnrlistD>=0) ? jnrlistD : 0;
2220             j_coord_offsetA  = DIM*jnrA;
2221             j_coord_offsetB  = DIM*jnrB;
2222             j_coord_offsetC  = DIM*jnrC;
2223             j_coord_offsetD  = DIM*jnrD;
2224
2225             /* load j atom coordinates */
2226             gmx_mm_load_3rvec_4ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
2227                                               x+j_coord_offsetC,x+j_coord_offsetD,
2228                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
2229
2230             /* Calculate displacement vector */
2231             dx00             = _mm_sub_ps(ix0,jx0);
2232             dy00             = _mm_sub_ps(iy0,jy0);
2233             dz00             = _mm_sub_ps(iz0,jz0);
2234             dx01             = _mm_sub_ps(ix0,jx1);
2235             dy01             = _mm_sub_ps(iy0,jy1);
2236             dz01             = _mm_sub_ps(iz0,jz1);
2237             dx02             = _mm_sub_ps(ix0,jx2);
2238             dy02             = _mm_sub_ps(iy0,jy2);
2239             dz02             = _mm_sub_ps(iz0,jz2);
2240             dx10             = _mm_sub_ps(ix1,jx0);
2241             dy10             = _mm_sub_ps(iy1,jy0);
2242             dz10             = _mm_sub_ps(iz1,jz0);
2243             dx11             = _mm_sub_ps(ix1,jx1);
2244             dy11             = _mm_sub_ps(iy1,jy1);
2245             dz11             = _mm_sub_ps(iz1,jz1);
2246             dx12             = _mm_sub_ps(ix1,jx2);
2247             dy12             = _mm_sub_ps(iy1,jy2);
2248             dz12             = _mm_sub_ps(iz1,jz2);
2249             dx20             = _mm_sub_ps(ix2,jx0);
2250             dy20             = _mm_sub_ps(iy2,jy0);
2251             dz20             = _mm_sub_ps(iz2,jz0);
2252             dx21             = _mm_sub_ps(ix2,jx1);
2253             dy21             = _mm_sub_ps(iy2,jy1);
2254             dz21             = _mm_sub_ps(iz2,jz1);
2255             dx22             = _mm_sub_ps(ix2,jx2);
2256             dy22             = _mm_sub_ps(iy2,jy2);
2257             dz22             = _mm_sub_ps(iz2,jz2);
2258
2259             /* Calculate squared distance and things based on it */
2260             rsq00            = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
2261             rsq01            = gmx_mm_calc_rsq_ps(dx01,dy01,dz01);
2262             rsq02            = gmx_mm_calc_rsq_ps(dx02,dy02,dz02);
2263             rsq10            = gmx_mm_calc_rsq_ps(dx10,dy10,dz10);
2264             rsq11            = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
2265             rsq12            = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
2266             rsq20            = gmx_mm_calc_rsq_ps(dx20,dy20,dz20);
2267             rsq21            = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
2268             rsq22            = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
2269
2270             rinv00           = gmx_mm_invsqrt_ps(rsq00);
2271             rinv01           = gmx_mm_invsqrt_ps(rsq01);
2272             rinv02           = gmx_mm_invsqrt_ps(rsq02);
2273             rinv10           = gmx_mm_invsqrt_ps(rsq10);
2274             rinv11           = gmx_mm_invsqrt_ps(rsq11);
2275             rinv12           = gmx_mm_invsqrt_ps(rsq12);
2276             rinv20           = gmx_mm_invsqrt_ps(rsq20);
2277             rinv21           = gmx_mm_invsqrt_ps(rsq21);
2278             rinv22           = gmx_mm_invsqrt_ps(rsq22);
2279
2280             rinvsq00         = _mm_mul_ps(rinv00,rinv00);
2281             rinvsq01         = _mm_mul_ps(rinv01,rinv01);
2282             rinvsq02         = _mm_mul_ps(rinv02,rinv02);
2283             rinvsq10         = _mm_mul_ps(rinv10,rinv10);
2284             rinvsq11         = _mm_mul_ps(rinv11,rinv11);
2285             rinvsq12         = _mm_mul_ps(rinv12,rinv12);
2286             rinvsq20         = _mm_mul_ps(rinv20,rinv20);
2287             rinvsq21         = _mm_mul_ps(rinv21,rinv21);
2288             rinvsq22         = _mm_mul_ps(rinv22,rinv22);
2289
2290             fjx0             = _mm_setzero_ps();
2291             fjy0             = _mm_setzero_ps();
2292             fjz0             = _mm_setzero_ps();
2293             fjx1             = _mm_setzero_ps();
2294             fjy1             = _mm_setzero_ps();
2295             fjz1             = _mm_setzero_ps();
2296             fjx2             = _mm_setzero_ps();
2297             fjy2             = _mm_setzero_ps();
2298             fjz2             = _mm_setzero_ps();
2299
2300             /**************************
2301              * CALCULATE INTERACTIONS *
2302              **************************/
2303
2304             if (gmx_mm_any_lt(rsq00,rcutoff2))
2305             {
2306
2307             r00              = _mm_mul_ps(rsq00,rinv00);
2308             r00              = _mm_andnot_ps(dummy_mask,r00);
2309
2310             /* EWALD ELECTROSTATICS */
2311
2312             /* Analytical PME correction */
2313             zeta2            = _mm_mul_ps(beta2,rsq00);
2314             rinv3            = _mm_mul_ps(rinvsq00,rinv00);
2315             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
2316             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
2317             felec            = _mm_mul_ps(qq00,felec);
2318             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
2319             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv00);
2320             velec            = _mm_mul_ps(qq00,velec);
2321
2322             /* LENNARD-JONES DISPERSION/REPULSION */
2323
2324             rinvsix          = _mm_mul_ps(_mm_mul_ps(rinvsq00,rinvsq00),rinvsq00);
2325             vvdw6            = _mm_mul_ps(c6_00,rinvsix);
2326             vvdw12           = _mm_mul_ps(c12_00,_mm_mul_ps(rinvsix,rinvsix));
2327             vvdw             = _mm_msub_ps(vvdw12,one_twelfth,_mm_mul_ps(vvdw6,one_sixth));
2328             fvdw             = _mm_mul_ps(_mm_sub_ps(vvdw12,vvdw6),rinvsq00);
2329
2330             d                = _mm_sub_ps(r00,rswitch);
2331             d                = _mm_max_ps(d,_mm_setzero_ps());
2332             d2               = _mm_mul_ps(d,d);
2333             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
2334
2335             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
2336
2337             /* Evaluate switch function */
2338             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
2339             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv00,_mm_mul_ps(velec,dsw)) );
2340             fvdw             = _mm_msub_ps( fvdw,sw , _mm_mul_ps(rinv00,_mm_mul_ps(vvdw,dsw)) );
2341             cutoff_mask      = _mm_cmplt_ps(rsq00,rcutoff2);
2342
2343             fscal            = _mm_add_ps(felec,fvdw);
2344
2345             fscal            = _mm_and_ps(fscal,cutoff_mask);
2346
2347             fscal            = _mm_andnot_ps(dummy_mask,fscal);
2348
2349              /* Update vectorial force */
2350             fix0             = _mm_macc_ps(dx00,fscal,fix0);
2351             fiy0             = _mm_macc_ps(dy00,fscal,fiy0);
2352             fiz0             = _mm_macc_ps(dz00,fscal,fiz0);
2353
2354             fjx0             = _mm_macc_ps(dx00,fscal,fjx0);
2355             fjy0             = _mm_macc_ps(dy00,fscal,fjy0);
2356             fjz0             = _mm_macc_ps(dz00,fscal,fjz0);
2357
2358             }
2359
2360             /**************************
2361              * CALCULATE INTERACTIONS *
2362              **************************/
2363
2364             if (gmx_mm_any_lt(rsq01,rcutoff2))
2365             {
2366
2367             r01              = _mm_mul_ps(rsq01,rinv01);
2368             r01              = _mm_andnot_ps(dummy_mask,r01);
2369
2370             /* EWALD ELECTROSTATICS */
2371
2372             /* Analytical PME correction */
2373             zeta2            = _mm_mul_ps(beta2,rsq01);
2374             rinv3            = _mm_mul_ps(rinvsq01,rinv01);
2375             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
2376             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
2377             felec            = _mm_mul_ps(qq01,felec);
2378             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
2379             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv01);
2380             velec            = _mm_mul_ps(qq01,velec);
2381
2382             d                = _mm_sub_ps(r01,rswitch);
2383             d                = _mm_max_ps(d,_mm_setzero_ps());
2384             d2               = _mm_mul_ps(d,d);
2385             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
2386
2387             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
2388
2389             /* Evaluate switch function */
2390             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
2391             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv01,_mm_mul_ps(velec,dsw)) );
2392             cutoff_mask      = _mm_cmplt_ps(rsq01,rcutoff2);
2393
2394             fscal            = felec;
2395
2396             fscal            = _mm_and_ps(fscal,cutoff_mask);
2397
2398             fscal            = _mm_andnot_ps(dummy_mask,fscal);
2399
2400              /* Update vectorial force */
2401             fix0             = _mm_macc_ps(dx01,fscal,fix0);
2402             fiy0             = _mm_macc_ps(dy01,fscal,fiy0);
2403             fiz0             = _mm_macc_ps(dz01,fscal,fiz0);
2404
2405             fjx1             = _mm_macc_ps(dx01,fscal,fjx1);
2406             fjy1             = _mm_macc_ps(dy01,fscal,fjy1);
2407             fjz1             = _mm_macc_ps(dz01,fscal,fjz1);
2408
2409             }
2410
2411             /**************************
2412              * CALCULATE INTERACTIONS *
2413              **************************/
2414
2415             if (gmx_mm_any_lt(rsq02,rcutoff2))
2416             {
2417
2418             r02              = _mm_mul_ps(rsq02,rinv02);
2419             r02              = _mm_andnot_ps(dummy_mask,r02);
2420
2421             /* EWALD ELECTROSTATICS */
2422
2423             /* Analytical PME correction */
2424             zeta2            = _mm_mul_ps(beta2,rsq02);
2425             rinv3            = _mm_mul_ps(rinvsq02,rinv02);
2426             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
2427             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
2428             felec            = _mm_mul_ps(qq02,felec);
2429             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
2430             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv02);
2431             velec            = _mm_mul_ps(qq02,velec);
2432
2433             d                = _mm_sub_ps(r02,rswitch);
2434             d                = _mm_max_ps(d,_mm_setzero_ps());
2435             d2               = _mm_mul_ps(d,d);
2436             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
2437
2438             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
2439
2440             /* Evaluate switch function */
2441             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
2442             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv02,_mm_mul_ps(velec,dsw)) );
2443             cutoff_mask      = _mm_cmplt_ps(rsq02,rcutoff2);
2444
2445             fscal            = felec;
2446
2447             fscal            = _mm_and_ps(fscal,cutoff_mask);
2448
2449             fscal            = _mm_andnot_ps(dummy_mask,fscal);
2450
2451              /* Update vectorial force */
2452             fix0             = _mm_macc_ps(dx02,fscal,fix0);
2453             fiy0             = _mm_macc_ps(dy02,fscal,fiy0);
2454             fiz0             = _mm_macc_ps(dz02,fscal,fiz0);
2455
2456             fjx2             = _mm_macc_ps(dx02,fscal,fjx2);
2457             fjy2             = _mm_macc_ps(dy02,fscal,fjy2);
2458             fjz2             = _mm_macc_ps(dz02,fscal,fjz2);
2459
2460             }
2461
2462             /**************************
2463              * CALCULATE INTERACTIONS *
2464              **************************/
2465
2466             if (gmx_mm_any_lt(rsq10,rcutoff2))
2467             {
2468
2469             r10              = _mm_mul_ps(rsq10,rinv10);
2470             r10              = _mm_andnot_ps(dummy_mask,r10);
2471
2472             /* EWALD ELECTROSTATICS */
2473
2474             /* Analytical PME correction */
2475             zeta2            = _mm_mul_ps(beta2,rsq10);
2476             rinv3            = _mm_mul_ps(rinvsq10,rinv10);
2477             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
2478             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
2479             felec            = _mm_mul_ps(qq10,felec);
2480             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
2481             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv10);
2482             velec            = _mm_mul_ps(qq10,velec);
2483
2484             d                = _mm_sub_ps(r10,rswitch);
2485             d                = _mm_max_ps(d,_mm_setzero_ps());
2486             d2               = _mm_mul_ps(d,d);
2487             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
2488
2489             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
2490
2491             /* Evaluate switch function */
2492             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
2493             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv10,_mm_mul_ps(velec,dsw)) );
2494             cutoff_mask      = _mm_cmplt_ps(rsq10,rcutoff2);
2495
2496             fscal            = felec;
2497
2498             fscal            = _mm_and_ps(fscal,cutoff_mask);
2499
2500             fscal            = _mm_andnot_ps(dummy_mask,fscal);
2501
2502              /* Update vectorial force */
2503             fix1             = _mm_macc_ps(dx10,fscal,fix1);
2504             fiy1             = _mm_macc_ps(dy10,fscal,fiy1);
2505             fiz1             = _mm_macc_ps(dz10,fscal,fiz1);
2506
2507             fjx0             = _mm_macc_ps(dx10,fscal,fjx0);
2508             fjy0             = _mm_macc_ps(dy10,fscal,fjy0);
2509             fjz0             = _mm_macc_ps(dz10,fscal,fjz0);
2510
2511             }
2512
2513             /**************************
2514              * CALCULATE INTERACTIONS *
2515              **************************/
2516
2517             if (gmx_mm_any_lt(rsq11,rcutoff2))
2518             {
2519
2520             r11              = _mm_mul_ps(rsq11,rinv11);
2521             r11              = _mm_andnot_ps(dummy_mask,r11);
2522
2523             /* EWALD ELECTROSTATICS */
2524
2525             /* Analytical PME correction */
2526             zeta2            = _mm_mul_ps(beta2,rsq11);
2527             rinv3            = _mm_mul_ps(rinvsq11,rinv11);
2528             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
2529             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
2530             felec            = _mm_mul_ps(qq11,felec);
2531             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
2532             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv11);
2533             velec            = _mm_mul_ps(qq11,velec);
2534
2535             d                = _mm_sub_ps(r11,rswitch);
2536             d                = _mm_max_ps(d,_mm_setzero_ps());
2537             d2               = _mm_mul_ps(d,d);
2538             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
2539
2540             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
2541
2542             /* Evaluate switch function */
2543             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
2544             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv11,_mm_mul_ps(velec,dsw)) );
2545             cutoff_mask      = _mm_cmplt_ps(rsq11,rcutoff2);
2546
2547             fscal            = felec;
2548
2549             fscal            = _mm_and_ps(fscal,cutoff_mask);
2550
2551             fscal            = _mm_andnot_ps(dummy_mask,fscal);
2552
2553              /* Update vectorial force */
2554             fix1             = _mm_macc_ps(dx11,fscal,fix1);
2555             fiy1             = _mm_macc_ps(dy11,fscal,fiy1);
2556             fiz1             = _mm_macc_ps(dz11,fscal,fiz1);
2557
2558             fjx1             = _mm_macc_ps(dx11,fscal,fjx1);
2559             fjy1             = _mm_macc_ps(dy11,fscal,fjy1);
2560             fjz1             = _mm_macc_ps(dz11,fscal,fjz1);
2561
2562             }
2563
2564             /**************************
2565              * CALCULATE INTERACTIONS *
2566              **************************/
2567
2568             if (gmx_mm_any_lt(rsq12,rcutoff2))
2569             {
2570
2571             r12              = _mm_mul_ps(rsq12,rinv12);
2572             r12              = _mm_andnot_ps(dummy_mask,r12);
2573
2574             /* EWALD ELECTROSTATICS */
2575
2576             /* Analytical PME correction */
2577             zeta2            = _mm_mul_ps(beta2,rsq12);
2578             rinv3            = _mm_mul_ps(rinvsq12,rinv12);
2579             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
2580             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
2581             felec            = _mm_mul_ps(qq12,felec);
2582             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
2583             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv12);
2584             velec            = _mm_mul_ps(qq12,velec);
2585
2586             d                = _mm_sub_ps(r12,rswitch);
2587             d                = _mm_max_ps(d,_mm_setzero_ps());
2588             d2               = _mm_mul_ps(d,d);
2589             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
2590
2591             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
2592
2593             /* Evaluate switch function */
2594             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
2595             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv12,_mm_mul_ps(velec,dsw)) );
2596             cutoff_mask      = _mm_cmplt_ps(rsq12,rcutoff2);
2597
2598             fscal            = felec;
2599
2600             fscal            = _mm_and_ps(fscal,cutoff_mask);
2601
2602             fscal            = _mm_andnot_ps(dummy_mask,fscal);
2603
2604              /* Update vectorial force */
2605             fix1             = _mm_macc_ps(dx12,fscal,fix1);
2606             fiy1             = _mm_macc_ps(dy12,fscal,fiy1);
2607             fiz1             = _mm_macc_ps(dz12,fscal,fiz1);
2608
2609             fjx2             = _mm_macc_ps(dx12,fscal,fjx2);
2610             fjy2             = _mm_macc_ps(dy12,fscal,fjy2);
2611             fjz2             = _mm_macc_ps(dz12,fscal,fjz2);
2612
2613             }
2614
2615             /**************************
2616              * CALCULATE INTERACTIONS *
2617              **************************/
2618
2619             if (gmx_mm_any_lt(rsq20,rcutoff2))
2620             {
2621
2622             r20              = _mm_mul_ps(rsq20,rinv20);
2623             r20              = _mm_andnot_ps(dummy_mask,r20);
2624
2625             /* EWALD ELECTROSTATICS */
2626
2627             /* Analytical PME correction */
2628             zeta2            = _mm_mul_ps(beta2,rsq20);
2629             rinv3            = _mm_mul_ps(rinvsq20,rinv20);
2630             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
2631             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
2632             felec            = _mm_mul_ps(qq20,felec);
2633             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
2634             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv20);
2635             velec            = _mm_mul_ps(qq20,velec);
2636
2637             d                = _mm_sub_ps(r20,rswitch);
2638             d                = _mm_max_ps(d,_mm_setzero_ps());
2639             d2               = _mm_mul_ps(d,d);
2640             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
2641
2642             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
2643
2644             /* Evaluate switch function */
2645             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
2646             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv20,_mm_mul_ps(velec,dsw)) );
2647             cutoff_mask      = _mm_cmplt_ps(rsq20,rcutoff2);
2648
2649             fscal            = felec;
2650
2651             fscal            = _mm_and_ps(fscal,cutoff_mask);
2652
2653             fscal            = _mm_andnot_ps(dummy_mask,fscal);
2654
2655              /* Update vectorial force */
2656             fix2             = _mm_macc_ps(dx20,fscal,fix2);
2657             fiy2             = _mm_macc_ps(dy20,fscal,fiy2);
2658             fiz2             = _mm_macc_ps(dz20,fscal,fiz2);
2659
2660             fjx0             = _mm_macc_ps(dx20,fscal,fjx0);
2661             fjy0             = _mm_macc_ps(dy20,fscal,fjy0);
2662             fjz0             = _mm_macc_ps(dz20,fscal,fjz0);
2663
2664             }
2665
2666             /**************************
2667              * CALCULATE INTERACTIONS *
2668              **************************/
2669
2670             if (gmx_mm_any_lt(rsq21,rcutoff2))
2671             {
2672
2673             r21              = _mm_mul_ps(rsq21,rinv21);
2674             r21              = _mm_andnot_ps(dummy_mask,r21);
2675
2676             /* EWALD ELECTROSTATICS */
2677
2678             /* Analytical PME correction */
2679             zeta2            = _mm_mul_ps(beta2,rsq21);
2680             rinv3            = _mm_mul_ps(rinvsq21,rinv21);
2681             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
2682             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
2683             felec            = _mm_mul_ps(qq21,felec);
2684             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
2685             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv21);
2686             velec            = _mm_mul_ps(qq21,velec);
2687
2688             d                = _mm_sub_ps(r21,rswitch);
2689             d                = _mm_max_ps(d,_mm_setzero_ps());
2690             d2               = _mm_mul_ps(d,d);
2691             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
2692
2693             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
2694
2695             /* Evaluate switch function */
2696             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
2697             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv21,_mm_mul_ps(velec,dsw)) );
2698             cutoff_mask      = _mm_cmplt_ps(rsq21,rcutoff2);
2699
2700             fscal            = felec;
2701
2702             fscal            = _mm_and_ps(fscal,cutoff_mask);
2703
2704             fscal            = _mm_andnot_ps(dummy_mask,fscal);
2705
2706              /* Update vectorial force */
2707             fix2             = _mm_macc_ps(dx21,fscal,fix2);
2708             fiy2             = _mm_macc_ps(dy21,fscal,fiy2);
2709             fiz2             = _mm_macc_ps(dz21,fscal,fiz2);
2710
2711             fjx1             = _mm_macc_ps(dx21,fscal,fjx1);
2712             fjy1             = _mm_macc_ps(dy21,fscal,fjy1);
2713             fjz1             = _mm_macc_ps(dz21,fscal,fjz1);
2714
2715             }
2716
2717             /**************************
2718              * CALCULATE INTERACTIONS *
2719              **************************/
2720
2721             if (gmx_mm_any_lt(rsq22,rcutoff2))
2722             {
2723
2724             r22              = _mm_mul_ps(rsq22,rinv22);
2725             r22              = _mm_andnot_ps(dummy_mask,r22);
2726
2727             /* EWALD ELECTROSTATICS */
2728
2729             /* Analytical PME correction */
2730             zeta2            = _mm_mul_ps(beta2,rsq22);
2731             rinv3            = _mm_mul_ps(rinvsq22,rinv22);
2732             pmecorrF         = gmx_mm_pmecorrF_ps(zeta2);
2733             felec            = _mm_macc_ps(pmecorrF,beta3,rinv3);
2734             felec            = _mm_mul_ps(qq22,felec);
2735             pmecorrV         = gmx_mm_pmecorrV_ps(zeta2);
2736             velec            = _mm_nmacc_ps(pmecorrV,beta,rinv22);
2737             velec            = _mm_mul_ps(qq22,velec);
2738
2739             d                = _mm_sub_ps(r22,rswitch);
2740             d                = _mm_max_ps(d,_mm_setzero_ps());
2741             d2               = _mm_mul_ps(d,d);
2742             sw               = _mm_add_ps(one,_mm_mul_ps(d2,_mm_mul_ps(d,_mm_macc_ps(d,_mm_macc_ps(d,swV5,swV4),swV3))));
2743
2744             dsw              = _mm_mul_ps(d2,_mm_macc_ps(d,_mm_macc_ps(d,swF4,swF3),swF2));
2745
2746             /* Evaluate switch function */
2747             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
2748             felec            = _mm_msub_ps( felec,sw , _mm_mul_ps(rinv22,_mm_mul_ps(velec,dsw)) );
2749             cutoff_mask      = _mm_cmplt_ps(rsq22,rcutoff2);
2750
2751             fscal            = felec;
2752
2753             fscal            = _mm_and_ps(fscal,cutoff_mask);
2754
2755             fscal            = _mm_andnot_ps(dummy_mask,fscal);
2756
2757              /* Update vectorial force */
2758             fix2             = _mm_macc_ps(dx22,fscal,fix2);
2759             fiy2             = _mm_macc_ps(dy22,fscal,fiy2);
2760             fiz2             = _mm_macc_ps(dz22,fscal,fiz2);
2761
2762             fjx2             = _mm_macc_ps(dx22,fscal,fjx2);
2763             fjy2             = _mm_macc_ps(dy22,fscal,fjy2);
2764             fjz2             = _mm_macc_ps(dz22,fscal,fjz2);
2765
2766             }
2767
2768             fjptrA             = (jnrlistA>=0) ? f+j_coord_offsetA : scratch;
2769             fjptrB             = (jnrlistB>=0) ? f+j_coord_offsetB : scratch;
2770             fjptrC             = (jnrlistC>=0) ? f+j_coord_offsetC : scratch;
2771             fjptrD             = (jnrlistD>=0) ? f+j_coord_offsetD : scratch;
2772
2773             gmx_mm_decrement_3rvec_4ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,
2774                                                    fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
2775
2776             /* Inner loop uses 474 flops */
2777         }
2778
2779         /* End of innermost loop */
2780
2781         gmx_mm_update_iforce_3atom_swizzle_ps(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,
2782                                               f+i_coord_offset,fshift+i_shift_offset);
2783
2784         /* Increment number of inner iterations */
2785         inneriter                  += j_index_end - j_index_start;
2786
2787         /* Outer loop uses 18 flops */
2788     }
2789
2790     /* Increment number of outer iterations */
2791     outeriter        += nri;
2792
2793     /* Update outer/inner flops */
2794
2795     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3W3_F,outeriter*18 + inneriter*474);
2796 }