d81ba8230b71118b5b1bbdceb4b43dfefdc99158
[alexxy/gromacs.git] / src / gmxlib / nonbonded / nb_kernel_c / nb_kernel_ElecEwSw_VdwBhamSw_GeomW3W3_c.c
1 /*
2  * Note: this file was generated by the Gromacs c kernel generator.
3  *
4  *                This source code is part of
5  *
6  *                 G   R   O   M   A   C   S
7  *
8  * Copyright (c) 2001-2012, The GROMACS Development Team
9  *
10  * Gromacs is a library for molecular simulation and trajectory analysis,
11  * written by Erik Lindahl, David van der Spoel, Berk Hess, and others - for
12  * a full list of developers and information, check out http://www.gromacs.org
13  *
14  * This program is free software; you can redistribute it and/or modify it under
15  * the terms of the GNU Lesser General Public License as published by the Free
16  * Software Foundation; either version 2 of the License, or (at your option) any
17  * later version.
18  *
19  * To help fund GROMACS development, we humbly ask that you cite
20  * the papers people have written on it - you can find them on the website.
21  */
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <math.h>
27
28 #include "../nb_kernel.h"
29 #include "types/simple.h"
30 #include "vec.h"
31 #include "nrnb.h"
32
33 /*
34  * Gromacs nonbonded kernel:   nb_kernel_ElecEwSw_VdwBhamSw_GeomW3W3_VF_c
35  * Electrostatics interaction: Ewald
36  * VdW interaction:            Buckingham
37  * Geometry:                   Water3-Water3
38  * Calculate force/pot:        PotentialAndForce
39  */
40 void
41 nb_kernel_ElecEwSw_VdwBhamSw_GeomW3W3_VF_c
42                     (t_nblist * gmx_restrict                nlist,
43                      rvec * gmx_restrict                    xx,
44                      rvec * gmx_restrict                    ff,
45                      t_forcerec * gmx_restrict              fr,
46                      t_mdatoms * gmx_restrict               mdatoms,
47                      nb_kernel_data_t * gmx_restrict        kernel_data,
48                      t_nrnb * gmx_restrict                  nrnb)
49 {
50     int              i_shift_offset,i_coord_offset,j_coord_offset;
51     int              j_index_start,j_index_end;
52     int              nri,inr,ggid,iidx,jidx,jnr,outeriter,inneriter;
53     real             shX,shY,shZ,tx,ty,tz,fscal,rcutoff,rcutoff2;
54     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
55     real             *shiftvec,*fshift,*x,*f;
56     int              vdwioffset0;
57     real             ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
58     int              vdwioffset1;
59     real             ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
60     int              vdwioffset2;
61     real             ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
62     int              vdwjidx0;
63     real             jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
64     int              vdwjidx1;
65     real             jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
66     int              vdwjidx2;
67     real             jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
68     real             dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00,cexp1_00,cexp2_00;
69     real             dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01,cexp1_01,cexp2_01;
70     real             dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02,cexp1_02,cexp2_02;
71     real             dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10,cexp1_10,cexp2_10;
72     real             dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11,cexp1_11,cexp2_11;
73     real             dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12,cexp1_12,cexp2_12;
74     real             dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20,cexp1_20,cexp2_20;
75     real             dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21,cexp1_21,cexp2_21;
76     real             dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22,cexp1_22,cexp2_22;
77     real             velec,felec,velecsum,facel,crf,krf,krf2;
78     real             *charge;
79     int              nvdwtype;
80     real             rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,br,vvdwexp,sh_vdw_invrcut6;
81     int              *vdwtype;
82     real             *vdwparam;
83     int              ewitab;
84     real             ewtabscale,eweps,sh_ewald,ewrt,ewtabhalfspace;
85     real             *ewtab;
86     real             rswitch,swV3,swV4,swV5,swF2,swF3,swF4,d,d2,sw,dsw;
87
88     x                = xx[0];
89     f                = ff[0];
90
91     nri              = nlist->nri;
92     iinr             = nlist->iinr;
93     jindex           = nlist->jindex;
94     jjnr             = nlist->jjnr;
95     shiftidx         = nlist->shift;
96     gid              = nlist->gid;
97     shiftvec         = fr->shift_vec[0];
98     fshift           = fr->fshift[0];
99     facel            = fr->epsfac;
100     charge           = mdatoms->chargeA;
101     nvdwtype         = fr->ntype;
102     vdwparam         = fr->nbfp;
103     vdwtype          = mdatoms->typeA;
104
105     sh_ewald         = fr->ic->sh_ewald;
106     ewtab            = fr->ic->tabq_coul_FDV0;
107     ewtabscale       = fr->ic->tabq_scale;
108     ewtabhalfspace   = 0.5/ewtabscale;
109
110     /* Setup water-specific parameters */
111     inr              = nlist->iinr[0];
112     iq0              = facel*charge[inr+0];
113     iq1              = facel*charge[inr+1];
114     iq2              = facel*charge[inr+2];
115     vdwioffset0      = 3*nvdwtype*vdwtype[inr+0];
116
117     jq0              = charge[inr+0];
118     jq1              = charge[inr+1];
119     jq2              = charge[inr+2];
120     vdwjidx0         = 3*vdwtype[inr+0];
121     qq00             = iq0*jq0;
122     c6_00            = vdwparam[vdwioffset0+vdwjidx0];
123     cexp1_00         = vdwparam[vdwioffset0+vdwjidx0+1];
124     cexp2_00         = vdwparam[vdwioffset0+vdwjidx0+2];
125     qq01             = iq0*jq1;
126     qq02             = iq0*jq2;
127     qq10             = iq1*jq0;
128     qq11             = iq1*jq1;
129     qq12             = iq1*jq2;
130     qq20             = iq2*jq0;
131     qq21             = iq2*jq1;
132     qq22             = iq2*jq2;
133
134     /* When we use explicit cutoffs the value must be identical for elec and VdW, so use elec as an arbitrary choice */
135     rcutoff          = fr->rcoulomb;
136     rcutoff2         = rcutoff*rcutoff;
137
138     rswitch          = fr->rcoulomb_switch;
139     /* Setup switch parameters */
140     d                = rcutoff-rswitch;
141     swV3             = -10.0/(d*d*d);
142     swV4             =  15.0/(d*d*d*d);
143     swV5             =  -6.0/(d*d*d*d*d);
144     swF2             = -30.0/(d*d*d);
145     swF3             =  60.0/(d*d*d*d);
146     swF4             = -30.0/(d*d*d*d*d);
147
148     outeriter        = 0;
149     inneriter        = 0;
150
151     /* Start outer loop over neighborlists */
152     for(iidx=0; iidx<nri; iidx++)
153     {
154         /* Load shift vector for this list */
155         i_shift_offset   = DIM*shiftidx[iidx];
156         shX              = shiftvec[i_shift_offset+XX];
157         shY              = shiftvec[i_shift_offset+YY];
158         shZ              = shiftvec[i_shift_offset+ZZ];
159
160         /* Load limits for loop over neighbors */
161         j_index_start    = jindex[iidx];
162         j_index_end      = jindex[iidx+1];
163
164         /* Get outer coordinate index */
165         inr              = iinr[iidx];
166         i_coord_offset   = DIM*inr;
167
168         /* Load i particle coords and add shift vector */
169         ix0              = shX + x[i_coord_offset+DIM*0+XX];
170         iy0              = shY + x[i_coord_offset+DIM*0+YY];
171         iz0              = shZ + x[i_coord_offset+DIM*0+ZZ];
172         ix1              = shX + x[i_coord_offset+DIM*1+XX];
173         iy1              = shY + x[i_coord_offset+DIM*1+YY];
174         iz1              = shZ + x[i_coord_offset+DIM*1+ZZ];
175         ix2              = shX + x[i_coord_offset+DIM*2+XX];
176         iy2              = shY + x[i_coord_offset+DIM*2+YY];
177         iz2              = shZ + x[i_coord_offset+DIM*2+ZZ];
178
179         fix0             = 0.0;
180         fiy0             = 0.0;
181         fiz0             = 0.0;
182         fix1             = 0.0;
183         fiy1             = 0.0;
184         fiz1             = 0.0;
185         fix2             = 0.0;
186         fiy2             = 0.0;
187         fiz2             = 0.0;
188
189         /* Reset potential sums */
190         velecsum         = 0.0;
191         vvdwsum          = 0.0;
192
193         /* Start inner kernel loop */
194         for(jidx=j_index_start; jidx<j_index_end; jidx++)
195         {
196             /* Get j neighbor index, and coordinate index */
197             jnr              = jjnr[jidx];
198             j_coord_offset   = DIM*jnr;
199
200             /* load j atom coordinates */
201             jx0              = x[j_coord_offset+DIM*0+XX];
202             jy0              = x[j_coord_offset+DIM*0+YY];
203             jz0              = x[j_coord_offset+DIM*0+ZZ];
204             jx1              = x[j_coord_offset+DIM*1+XX];
205             jy1              = x[j_coord_offset+DIM*1+YY];
206             jz1              = x[j_coord_offset+DIM*1+ZZ];
207             jx2              = x[j_coord_offset+DIM*2+XX];
208             jy2              = x[j_coord_offset+DIM*2+YY];
209             jz2              = x[j_coord_offset+DIM*2+ZZ];
210
211             /* Calculate displacement vector */
212             dx00             = ix0 - jx0;
213             dy00             = iy0 - jy0;
214             dz00             = iz0 - jz0;
215             dx01             = ix0 - jx1;
216             dy01             = iy0 - jy1;
217             dz01             = iz0 - jz1;
218             dx02             = ix0 - jx2;
219             dy02             = iy0 - jy2;
220             dz02             = iz0 - jz2;
221             dx10             = ix1 - jx0;
222             dy10             = iy1 - jy0;
223             dz10             = iz1 - jz0;
224             dx11             = ix1 - jx1;
225             dy11             = iy1 - jy1;
226             dz11             = iz1 - jz1;
227             dx12             = ix1 - jx2;
228             dy12             = iy1 - jy2;
229             dz12             = iz1 - jz2;
230             dx20             = ix2 - jx0;
231             dy20             = iy2 - jy0;
232             dz20             = iz2 - jz0;
233             dx21             = ix2 - jx1;
234             dy21             = iy2 - jy1;
235             dz21             = iz2 - jz1;
236             dx22             = ix2 - jx2;
237             dy22             = iy2 - jy2;
238             dz22             = iz2 - jz2;
239
240             /* Calculate squared distance and things based on it */
241             rsq00            = dx00*dx00+dy00*dy00+dz00*dz00;
242             rsq01            = dx01*dx01+dy01*dy01+dz01*dz01;
243             rsq02            = dx02*dx02+dy02*dy02+dz02*dz02;
244             rsq10            = dx10*dx10+dy10*dy10+dz10*dz10;
245             rsq11            = dx11*dx11+dy11*dy11+dz11*dz11;
246             rsq12            = dx12*dx12+dy12*dy12+dz12*dz12;
247             rsq20            = dx20*dx20+dy20*dy20+dz20*dz20;
248             rsq21            = dx21*dx21+dy21*dy21+dz21*dz21;
249             rsq22            = dx22*dx22+dy22*dy22+dz22*dz22;
250
251             rinv00           = gmx_invsqrt(rsq00);
252             rinv01           = gmx_invsqrt(rsq01);
253             rinv02           = gmx_invsqrt(rsq02);
254             rinv10           = gmx_invsqrt(rsq10);
255             rinv11           = gmx_invsqrt(rsq11);
256             rinv12           = gmx_invsqrt(rsq12);
257             rinv20           = gmx_invsqrt(rsq20);
258             rinv21           = gmx_invsqrt(rsq21);
259             rinv22           = gmx_invsqrt(rsq22);
260
261             rinvsq00         = rinv00*rinv00;
262             rinvsq01         = rinv01*rinv01;
263             rinvsq02         = rinv02*rinv02;
264             rinvsq10         = rinv10*rinv10;
265             rinvsq11         = rinv11*rinv11;
266             rinvsq12         = rinv12*rinv12;
267             rinvsq20         = rinv20*rinv20;
268             rinvsq21         = rinv21*rinv21;
269             rinvsq22         = rinv22*rinv22;
270
271             /**************************
272              * CALCULATE INTERACTIONS *
273              **************************/
274
275             if (rsq00<rcutoff2)
276             {
277
278             r00              = rsq00*rinv00;
279
280             /* EWALD ELECTROSTATICS */
281
282             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
283             ewrt             = r00*ewtabscale;
284             ewitab           = ewrt;
285             eweps            = ewrt-ewitab;
286             ewitab           = 4*ewitab;
287             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
288             velec            = qq00*(rinv00-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
289             felec            = qq00*rinv00*(rinvsq00-felec);
290
291             /* BUCKINGHAM DISPERSION/REPULSION */
292             rinvsix          = rinvsq00*rinvsq00*rinvsq00;
293             vvdw6            = c6_00*rinvsix;
294             br               = cexp2_00*r00;
295             vvdwexp          = cexp1_00*exp(-br);
296             vvdw             = vvdwexp - vvdw6*(1.0/6.0);
297             fvdw             = (br*vvdwexp-vvdw6)*rinvsq00;
298
299             d                = r00-rswitch;
300             d                = (d>0.0) ? d : 0.0;
301             d2               = d*d;
302             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
303
304             dsw              = d2*(swF2+d*(swF3+d*swF4));
305
306             /* Evaluate switch function */
307             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
308             felec            = felec*sw - rinv00*velec*dsw;
309             fvdw             = fvdw*sw - rinv00*vvdw*dsw;
310             velec           *= sw;
311             vvdw            *= sw;
312
313             /* Update potential sums from outer loop */
314             velecsum        += velec;
315             vvdwsum         += vvdw;
316
317             fscal            = felec+fvdw;
318
319             /* Calculate temporary vectorial force */
320             tx               = fscal*dx00;
321             ty               = fscal*dy00;
322             tz               = fscal*dz00;
323
324             /* Update vectorial force */
325             fix0            += tx;
326             fiy0            += ty;
327             fiz0            += tz;
328             f[j_coord_offset+DIM*0+XX] -= tx;
329             f[j_coord_offset+DIM*0+YY] -= ty;
330             f[j_coord_offset+DIM*0+ZZ] -= tz;
331
332             }
333
334             /**************************
335              * CALCULATE INTERACTIONS *
336              **************************/
337
338             if (rsq01<rcutoff2)
339             {
340
341             r01              = rsq01*rinv01;
342
343             /* EWALD ELECTROSTATICS */
344
345             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
346             ewrt             = r01*ewtabscale;
347             ewitab           = ewrt;
348             eweps            = ewrt-ewitab;
349             ewitab           = 4*ewitab;
350             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
351             velec            = qq01*(rinv01-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
352             felec            = qq01*rinv01*(rinvsq01-felec);
353
354             d                = r01-rswitch;
355             d                = (d>0.0) ? d : 0.0;
356             d2               = d*d;
357             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
358
359             dsw              = d2*(swF2+d*(swF3+d*swF4));
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            = felec*sw - rinv01*velec*dsw;
364             velec           *= sw;
365
366             /* Update potential sums from outer loop */
367             velecsum        += velec;
368
369             fscal            = felec;
370
371             /* Calculate temporary vectorial force */
372             tx               = fscal*dx01;
373             ty               = fscal*dy01;
374             tz               = fscal*dz01;
375
376             /* Update vectorial force */
377             fix0            += tx;
378             fiy0            += ty;
379             fiz0            += tz;
380             f[j_coord_offset+DIM*1+XX] -= tx;
381             f[j_coord_offset+DIM*1+YY] -= ty;
382             f[j_coord_offset+DIM*1+ZZ] -= tz;
383
384             }
385
386             /**************************
387              * CALCULATE INTERACTIONS *
388              **************************/
389
390             if (rsq02<rcutoff2)
391             {
392
393             r02              = rsq02*rinv02;
394
395             /* EWALD ELECTROSTATICS */
396
397             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
398             ewrt             = r02*ewtabscale;
399             ewitab           = ewrt;
400             eweps            = ewrt-ewitab;
401             ewitab           = 4*ewitab;
402             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
403             velec            = qq02*(rinv02-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
404             felec            = qq02*rinv02*(rinvsq02-felec);
405
406             d                = r02-rswitch;
407             d                = (d>0.0) ? d : 0.0;
408             d2               = d*d;
409             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
410
411             dsw              = d2*(swF2+d*(swF3+d*swF4));
412
413             /* Evaluate switch function */
414             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
415             felec            = felec*sw - rinv02*velec*dsw;
416             velec           *= sw;
417
418             /* Update potential sums from outer loop */
419             velecsum        += velec;
420
421             fscal            = felec;
422
423             /* Calculate temporary vectorial force */
424             tx               = fscal*dx02;
425             ty               = fscal*dy02;
426             tz               = fscal*dz02;
427
428             /* Update vectorial force */
429             fix0            += tx;
430             fiy0            += ty;
431             fiz0            += tz;
432             f[j_coord_offset+DIM*2+XX] -= tx;
433             f[j_coord_offset+DIM*2+YY] -= ty;
434             f[j_coord_offset+DIM*2+ZZ] -= tz;
435
436             }
437
438             /**************************
439              * CALCULATE INTERACTIONS *
440              **************************/
441
442             if (rsq10<rcutoff2)
443             {
444
445             r10              = rsq10*rinv10;
446
447             /* EWALD ELECTROSTATICS */
448
449             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
450             ewrt             = r10*ewtabscale;
451             ewitab           = ewrt;
452             eweps            = ewrt-ewitab;
453             ewitab           = 4*ewitab;
454             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
455             velec            = qq10*(rinv10-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
456             felec            = qq10*rinv10*(rinvsq10-felec);
457
458             d                = r10-rswitch;
459             d                = (d>0.0) ? d : 0.0;
460             d2               = d*d;
461             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
462
463             dsw              = d2*(swF2+d*(swF3+d*swF4));
464
465             /* Evaluate switch function */
466             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
467             felec            = felec*sw - rinv10*velec*dsw;
468             velec           *= sw;
469
470             /* Update potential sums from outer loop */
471             velecsum        += velec;
472
473             fscal            = felec;
474
475             /* Calculate temporary vectorial force */
476             tx               = fscal*dx10;
477             ty               = fscal*dy10;
478             tz               = fscal*dz10;
479
480             /* Update vectorial force */
481             fix1            += tx;
482             fiy1            += ty;
483             fiz1            += tz;
484             f[j_coord_offset+DIM*0+XX] -= tx;
485             f[j_coord_offset+DIM*0+YY] -= ty;
486             f[j_coord_offset+DIM*0+ZZ] -= tz;
487
488             }
489
490             /**************************
491              * CALCULATE INTERACTIONS *
492              **************************/
493
494             if (rsq11<rcutoff2)
495             {
496
497             r11              = rsq11*rinv11;
498
499             /* EWALD ELECTROSTATICS */
500
501             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
502             ewrt             = r11*ewtabscale;
503             ewitab           = ewrt;
504             eweps            = ewrt-ewitab;
505             ewitab           = 4*ewitab;
506             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
507             velec            = qq11*(rinv11-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
508             felec            = qq11*rinv11*(rinvsq11-felec);
509
510             d                = r11-rswitch;
511             d                = (d>0.0) ? d : 0.0;
512             d2               = d*d;
513             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
514
515             dsw              = d2*(swF2+d*(swF3+d*swF4));
516
517             /* Evaluate switch function */
518             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
519             felec            = felec*sw - rinv11*velec*dsw;
520             velec           *= sw;
521
522             /* Update potential sums from outer loop */
523             velecsum        += velec;
524
525             fscal            = felec;
526
527             /* Calculate temporary vectorial force */
528             tx               = fscal*dx11;
529             ty               = fscal*dy11;
530             tz               = fscal*dz11;
531
532             /* Update vectorial force */
533             fix1            += tx;
534             fiy1            += ty;
535             fiz1            += tz;
536             f[j_coord_offset+DIM*1+XX] -= tx;
537             f[j_coord_offset+DIM*1+YY] -= ty;
538             f[j_coord_offset+DIM*1+ZZ] -= tz;
539
540             }
541
542             /**************************
543              * CALCULATE INTERACTIONS *
544              **************************/
545
546             if (rsq12<rcutoff2)
547             {
548
549             r12              = rsq12*rinv12;
550
551             /* EWALD ELECTROSTATICS */
552
553             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
554             ewrt             = r12*ewtabscale;
555             ewitab           = ewrt;
556             eweps            = ewrt-ewitab;
557             ewitab           = 4*ewitab;
558             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
559             velec            = qq12*(rinv12-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
560             felec            = qq12*rinv12*(rinvsq12-felec);
561
562             d                = r12-rswitch;
563             d                = (d>0.0) ? d : 0.0;
564             d2               = d*d;
565             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
566
567             dsw              = d2*(swF2+d*(swF3+d*swF4));
568
569             /* Evaluate switch function */
570             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
571             felec            = felec*sw - rinv12*velec*dsw;
572             velec           *= sw;
573
574             /* Update potential sums from outer loop */
575             velecsum        += velec;
576
577             fscal            = felec;
578
579             /* Calculate temporary vectorial force */
580             tx               = fscal*dx12;
581             ty               = fscal*dy12;
582             tz               = fscal*dz12;
583
584             /* Update vectorial force */
585             fix1            += tx;
586             fiy1            += ty;
587             fiz1            += tz;
588             f[j_coord_offset+DIM*2+XX] -= tx;
589             f[j_coord_offset+DIM*2+YY] -= ty;
590             f[j_coord_offset+DIM*2+ZZ] -= tz;
591
592             }
593
594             /**************************
595              * CALCULATE INTERACTIONS *
596              **************************/
597
598             if (rsq20<rcutoff2)
599             {
600
601             r20              = rsq20*rinv20;
602
603             /* EWALD ELECTROSTATICS */
604
605             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
606             ewrt             = r20*ewtabscale;
607             ewitab           = ewrt;
608             eweps            = ewrt-ewitab;
609             ewitab           = 4*ewitab;
610             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
611             velec            = qq20*(rinv20-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
612             felec            = qq20*rinv20*(rinvsq20-felec);
613
614             d                = r20-rswitch;
615             d                = (d>0.0) ? d : 0.0;
616             d2               = d*d;
617             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
618
619             dsw              = d2*(swF2+d*(swF3+d*swF4));
620
621             /* Evaluate switch function */
622             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
623             felec            = felec*sw - rinv20*velec*dsw;
624             velec           *= sw;
625
626             /* Update potential sums from outer loop */
627             velecsum        += velec;
628
629             fscal            = felec;
630
631             /* Calculate temporary vectorial force */
632             tx               = fscal*dx20;
633             ty               = fscal*dy20;
634             tz               = fscal*dz20;
635
636             /* Update vectorial force */
637             fix2            += tx;
638             fiy2            += ty;
639             fiz2            += tz;
640             f[j_coord_offset+DIM*0+XX] -= tx;
641             f[j_coord_offset+DIM*0+YY] -= ty;
642             f[j_coord_offset+DIM*0+ZZ] -= tz;
643
644             }
645
646             /**************************
647              * CALCULATE INTERACTIONS *
648              **************************/
649
650             if (rsq21<rcutoff2)
651             {
652
653             r21              = rsq21*rinv21;
654
655             /* EWALD ELECTROSTATICS */
656
657             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
658             ewrt             = r21*ewtabscale;
659             ewitab           = ewrt;
660             eweps            = ewrt-ewitab;
661             ewitab           = 4*ewitab;
662             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
663             velec            = qq21*(rinv21-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
664             felec            = qq21*rinv21*(rinvsq21-felec);
665
666             d                = r21-rswitch;
667             d                = (d>0.0) ? d : 0.0;
668             d2               = d*d;
669             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
670
671             dsw              = d2*(swF2+d*(swF3+d*swF4));
672
673             /* Evaluate switch function */
674             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
675             felec            = felec*sw - rinv21*velec*dsw;
676             velec           *= sw;
677
678             /* Update potential sums from outer loop */
679             velecsum        += velec;
680
681             fscal            = felec;
682
683             /* Calculate temporary vectorial force */
684             tx               = fscal*dx21;
685             ty               = fscal*dy21;
686             tz               = fscal*dz21;
687
688             /* Update vectorial force */
689             fix2            += tx;
690             fiy2            += ty;
691             fiz2            += tz;
692             f[j_coord_offset+DIM*1+XX] -= tx;
693             f[j_coord_offset+DIM*1+YY] -= ty;
694             f[j_coord_offset+DIM*1+ZZ] -= tz;
695
696             }
697
698             /**************************
699              * CALCULATE INTERACTIONS *
700              **************************/
701
702             if (rsq22<rcutoff2)
703             {
704
705             r22              = rsq22*rinv22;
706
707             /* EWALD ELECTROSTATICS */
708
709             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
710             ewrt             = r22*ewtabscale;
711             ewitab           = ewrt;
712             eweps            = ewrt-ewitab;
713             ewitab           = 4*ewitab;
714             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
715             velec            = qq22*(rinv22-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
716             felec            = qq22*rinv22*(rinvsq22-felec);
717
718             d                = r22-rswitch;
719             d                = (d>0.0) ? d : 0.0;
720             d2               = d*d;
721             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
722
723             dsw              = d2*(swF2+d*(swF3+d*swF4));
724
725             /* Evaluate switch function */
726             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
727             felec            = felec*sw - rinv22*velec*dsw;
728             velec           *= sw;
729
730             /* Update potential sums from outer loop */
731             velecsum        += velec;
732
733             fscal            = felec;
734
735             /* Calculate temporary vectorial force */
736             tx               = fscal*dx22;
737             ty               = fscal*dy22;
738             tz               = fscal*dz22;
739
740             /* Update vectorial force */
741             fix2            += tx;
742             fiy2            += ty;
743             fiz2            += tz;
744             f[j_coord_offset+DIM*2+XX] -= tx;
745             f[j_coord_offset+DIM*2+YY] -= ty;
746             f[j_coord_offset+DIM*2+ZZ] -= tz;
747
748             }
749
750             /* Inner loop uses 564 flops */
751         }
752         /* End of innermost loop */
753
754         tx = ty = tz = 0;
755         f[i_coord_offset+DIM*0+XX] += fix0;
756         f[i_coord_offset+DIM*0+YY] += fiy0;
757         f[i_coord_offset+DIM*0+ZZ] += fiz0;
758         tx                         += fix0;
759         ty                         += fiy0;
760         tz                         += fiz0;
761         f[i_coord_offset+DIM*1+XX] += fix1;
762         f[i_coord_offset+DIM*1+YY] += fiy1;
763         f[i_coord_offset+DIM*1+ZZ] += fiz1;
764         tx                         += fix1;
765         ty                         += fiy1;
766         tz                         += fiz1;
767         f[i_coord_offset+DIM*2+XX] += fix2;
768         f[i_coord_offset+DIM*2+YY] += fiy2;
769         f[i_coord_offset+DIM*2+ZZ] += fiz2;
770         tx                         += fix2;
771         ty                         += fiy2;
772         tz                         += fiz2;
773         fshift[i_shift_offset+XX]  += tx;
774         fshift[i_shift_offset+YY]  += ty;
775         fshift[i_shift_offset+ZZ]  += tz;
776
777         ggid                        = gid[iidx];
778         /* Update potential energies */
779         kernel_data->energygrp_elec[ggid] += velecsum;
780         kernel_data->energygrp_vdw[ggid] += vvdwsum;
781
782         /* Increment number of inner iterations */
783         inneriter                  += j_index_end - j_index_start;
784
785         /* Outer loop uses 32 flops */
786     }
787
788     /* Increment number of outer iterations */
789     outeriter        += nri;
790
791     /* Update outer/inner flops */
792
793     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3W3_VF,outeriter*32 + inneriter*564);
794 }
795 /*
796  * Gromacs nonbonded kernel:   nb_kernel_ElecEwSw_VdwBhamSw_GeomW3W3_F_c
797  * Electrostatics interaction: Ewald
798  * VdW interaction:            Buckingham
799  * Geometry:                   Water3-Water3
800  * Calculate force/pot:        Force
801  */
802 void
803 nb_kernel_ElecEwSw_VdwBhamSw_GeomW3W3_F_c
804                     (t_nblist * gmx_restrict                nlist,
805                      rvec * gmx_restrict                    xx,
806                      rvec * gmx_restrict                    ff,
807                      t_forcerec * gmx_restrict              fr,
808                      t_mdatoms * gmx_restrict               mdatoms,
809                      nb_kernel_data_t * gmx_restrict        kernel_data,
810                      t_nrnb * gmx_restrict                  nrnb)
811 {
812     int              i_shift_offset,i_coord_offset,j_coord_offset;
813     int              j_index_start,j_index_end;
814     int              nri,inr,ggid,iidx,jidx,jnr,outeriter,inneriter;
815     real             shX,shY,shZ,tx,ty,tz,fscal,rcutoff,rcutoff2;
816     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
817     real             *shiftvec,*fshift,*x,*f;
818     int              vdwioffset0;
819     real             ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
820     int              vdwioffset1;
821     real             ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
822     int              vdwioffset2;
823     real             ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
824     int              vdwjidx0;
825     real             jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
826     int              vdwjidx1;
827     real             jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
828     int              vdwjidx2;
829     real             jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
830     real             dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00,cexp1_00,cexp2_00;
831     real             dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01,cexp1_01,cexp2_01;
832     real             dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02,cexp1_02,cexp2_02;
833     real             dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10,cexp1_10,cexp2_10;
834     real             dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11,cexp1_11,cexp2_11;
835     real             dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12,cexp1_12,cexp2_12;
836     real             dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20,cexp1_20,cexp2_20;
837     real             dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21,cexp1_21,cexp2_21;
838     real             dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22,cexp1_22,cexp2_22;
839     real             velec,felec,velecsum,facel,crf,krf,krf2;
840     real             *charge;
841     int              nvdwtype;
842     real             rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,br,vvdwexp,sh_vdw_invrcut6;
843     int              *vdwtype;
844     real             *vdwparam;
845     int              ewitab;
846     real             ewtabscale,eweps,sh_ewald,ewrt,ewtabhalfspace;
847     real             *ewtab;
848     real             rswitch,swV3,swV4,swV5,swF2,swF3,swF4,d,d2,sw,dsw;
849
850     x                = xx[0];
851     f                = ff[0];
852
853     nri              = nlist->nri;
854     iinr             = nlist->iinr;
855     jindex           = nlist->jindex;
856     jjnr             = nlist->jjnr;
857     shiftidx         = nlist->shift;
858     gid              = nlist->gid;
859     shiftvec         = fr->shift_vec[0];
860     fshift           = fr->fshift[0];
861     facel            = fr->epsfac;
862     charge           = mdatoms->chargeA;
863     nvdwtype         = fr->ntype;
864     vdwparam         = fr->nbfp;
865     vdwtype          = mdatoms->typeA;
866
867     sh_ewald         = fr->ic->sh_ewald;
868     ewtab            = fr->ic->tabq_coul_FDV0;
869     ewtabscale       = fr->ic->tabq_scale;
870     ewtabhalfspace   = 0.5/ewtabscale;
871
872     /* Setup water-specific parameters */
873     inr              = nlist->iinr[0];
874     iq0              = facel*charge[inr+0];
875     iq1              = facel*charge[inr+1];
876     iq2              = facel*charge[inr+2];
877     vdwioffset0      = 3*nvdwtype*vdwtype[inr+0];
878
879     jq0              = charge[inr+0];
880     jq1              = charge[inr+1];
881     jq2              = charge[inr+2];
882     vdwjidx0         = 3*vdwtype[inr+0];
883     qq00             = iq0*jq0;
884     c6_00            = vdwparam[vdwioffset0+vdwjidx0];
885     cexp1_00         = vdwparam[vdwioffset0+vdwjidx0+1];
886     cexp2_00         = vdwparam[vdwioffset0+vdwjidx0+2];
887     qq01             = iq0*jq1;
888     qq02             = iq0*jq2;
889     qq10             = iq1*jq0;
890     qq11             = iq1*jq1;
891     qq12             = iq1*jq2;
892     qq20             = iq2*jq0;
893     qq21             = iq2*jq1;
894     qq22             = iq2*jq2;
895
896     /* When we use explicit cutoffs the value must be identical for elec and VdW, so use elec as an arbitrary choice */
897     rcutoff          = fr->rcoulomb;
898     rcutoff2         = rcutoff*rcutoff;
899
900     rswitch          = fr->rcoulomb_switch;
901     /* Setup switch parameters */
902     d                = rcutoff-rswitch;
903     swV3             = -10.0/(d*d*d);
904     swV4             =  15.0/(d*d*d*d);
905     swV5             =  -6.0/(d*d*d*d*d);
906     swF2             = -30.0/(d*d*d);
907     swF3             =  60.0/(d*d*d*d);
908     swF4             = -30.0/(d*d*d*d*d);
909
910     outeriter        = 0;
911     inneriter        = 0;
912
913     /* Start outer loop over neighborlists */
914     for(iidx=0; iidx<nri; iidx++)
915     {
916         /* Load shift vector for this list */
917         i_shift_offset   = DIM*shiftidx[iidx];
918         shX              = shiftvec[i_shift_offset+XX];
919         shY              = shiftvec[i_shift_offset+YY];
920         shZ              = shiftvec[i_shift_offset+ZZ];
921
922         /* Load limits for loop over neighbors */
923         j_index_start    = jindex[iidx];
924         j_index_end      = jindex[iidx+1];
925
926         /* Get outer coordinate index */
927         inr              = iinr[iidx];
928         i_coord_offset   = DIM*inr;
929
930         /* Load i particle coords and add shift vector */
931         ix0              = shX + x[i_coord_offset+DIM*0+XX];
932         iy0              = shY + x[i_coord_offset+DIM*0+YY];
933         iz0              = shZ + x[i_coord_offset+DIM*0+ZZ];
934         ix1              = shX + x[i_coord_offset+DIM*1+XX];
935         iy1              = shY + x[i_coord_offset+DIM*1+YY];
936         iz1              = shZ + x[i_coord_offset+DIM*1+ZZ];
937         ix2              = shX + x[i_coord_offset+DIM*2+XX];
938         iy2              = shY + x[i_coord_offset+DIM*2+YY];
939         iz2              = shZ + x[i_coord_offset+DIM*2+ZZ];
940
941         fix0             = 0.0;
942         fiy0             = 0.0;
943         fiz0             = 0.0;
944         fix1             = 0.0;
945         fiy1             = 0.0;
946         fiz1             = 0.0;
947         fix2             = 0.0;
948         fiy2             = 0.0;
949         fiz2             = 0.0;
950
951         /* Start inner kernel loop */
952         for(jidx=j_index_start; jidx<j_index_end; jidx++)
953         {
954             /* Get j neighbor index, and coordinate index */
955             jnr              = jjnr[jidx];
956             j_coord_offset   = DIM*jnr;
957
958             /* load j atom coordinates */
959             jx0              = x[j_coord_offset+DIM*0+XX];
960             jy0              = x[j_coord_offset+DIM*0+YY];
961             jz0              = x[j_coord_offset+DIM*0+ZZ];
962             jx1              = x[j_coord_offset+DIM*1+XX];
963             jy1              = x[j_coord_offset+DIM*1+YY];
964             jz1              = x[j_coord_offset+DIM*1+ZZ];
965             jx2              = x[j_coord_offset+DIM*2+XX];
966             jy2              = x[j_coord_offset+DIM*2+YY];
967             jz2              = x[j_coord_offset+DIM*2+ZZ];
968
969             /* Calculate displacement vector */
970             dx00             = ix0 - jx0;
971             dy00             = iy0 - jy0;
972             dz00             = iz0 - jz0;
973             dx01             = ix0 - jx1;
974             dy01             = iy0 - jy1;
975             dz01             = iz0 - jz1;
976             dx02             = ix0 - jx2;
977             dy02             = iy0 - jy2;
978             dz02             = iz0 - jz2;
979             dx10             = ix1 - jx0;
980             dy10             = iy1 - jy0;
981             dz10             = iz1 - jz0;
982             dx11             = ix1 - jx1;
983             dy11             = iy1 - jy1;
984             dz11             = iz1 - jz1;
985             dx12             = ix1 - jx2;
986             dy12             = iy1 - jy2;
987             dz12             = iz1 - jz2;
988             dx20             = ix2 - jx0;
989             dy20             = iy2 - jy0;
990             dz20             = iz2 - jz0;
991             dx21             = ix2 - jx1;
992             dy21             = iy2 - jy1;
993             dz21             = iz2 - jz1;
994             dx22             = ix2 - jx2;
995             dy22             = iy2 - jy2;
996             dz22             = iz2 - jz2;
997
998             /* Calculate squared distance and things based on it */
999             rsq00            = dx00*dx00+dy00*dy00+dz00*dz00;
1000             rsq01            = dx01*dx01+dy01*dy01+dz01*dz01;
1001             rsq02            = dx02*dx02+dy02*dy02+dz02*dz02;
1002             rsq10            = dx10*dx10+dy10*dy10+dz10*dz10;
1003             rsq11            = dx11*dx11+dy11*dy11+dz11*dz11;
1004             rsq12            = dx12*dx12+dy12*dy12+dz12*dz12;
1005             rsq20            = dx20*dx20+dy20*dy20+dz20*dz20;
1006             rsq21            = dx21*dx21+dy21*dy21+dz21*dz21;
1007             rsq22            = dx22*dx22+dy22*dy22+dz22*dz22;
1008
1009             rinv00           = gmx_invsqrt(rsq00);
1010             rinv01           = gmx_invsqrt(rsq01);
1011             rinv02           = gmx_invsqrt(rsq02);
1012             rinv10           = gmx_invsqrt(rsq10);
1013             rinv11           = gmx_invsqrt(rsq11);
1014             rinv12           = gmx_invsqrt(rsq12);
1015             rinv20           = gmx_invsqrt(rsq20);
1016             rinv21           = gmx_invsqrt(rsq21);
1017             rinv22           = gmx_invsqrt(rsq22);
1018
1019             rinvsq00         = rinv00*rinv00;
1020             rinvsq01         = rinv01*rinv01;
1021             rinvsq02         = rinv02*rinv02;
1022             rinvsq10         = rinv10*rinv10;
1023             rinvsq11         = rinv11*rinv11;
1024             rinvsq12         = rinv12*rinv12;
1025             rinvsq20         = rinv20*rinv20;
1026             rinvsq21         = rinv21*rinv21;
1027             rinvsq22         = rinv22*rinv22;
1028
1029             /**************************
1030              * CALCULATE INTERACTIONS *
1031              **************************/
1032
1033             if (rsq00<rcutoff2)
1034             {
1035
1036             r00              = rsq00*rinv00;
1037
1038             /* EWALD ELECTROSTATICS */
1039
1040             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1041             ewrt             = r00*ewtabscale;
1042             ewitab           = ewrt;
1043             eweps            = ewrt-ewitab;
1044             ewitab           = 4*ewitab;
1045             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
1046             velec            = qq00*(rinv00-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
1047             felec            = qq00*rinv00*(rinvsq00-felec);
1048
1049             /* BUCKINGHAM DISPERSION/REPULSION */
1050             rinvsix          = rinvsq00*rinvsq00*rinvsq00;
1051             vvdw6            = c6_00*rinvsix;
1052             br               = cexp2_00*r00;
1053             vvdwexp          = cexp1_00*exp(-br);
1054             vvdw             = vvdwexp - vvdw6*(1.0/6.0);
1055             fvdw             = (br*vvdwexp-vvdw6)*rinvsq00;
1056
1057             d                = r00-rswitch;
1058             d                = (d>0.0) ? d : 0.0;
1059             d2               = d*d;
1060             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
1061
1062             dsw              = d2*(swF2+d*(swF3+d*swF4));
1063
1064             /* Evaluate switch function */
1065             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1066             felec            = felec*sw - rinv00*velec*dsw;
1067             fvdw             = fvdw*sw - rinv00*vvdw*dsw;
1068
1069             fscal            = felec+fvdw;
1070
1071             /* Calculate temporary vectorial force */
1072             tx               = fscal*dx00;
1073             ty               = fscal*dy00;
1074             tz               = fscal*dz00;
1075
1076             /* Update vectorial force */
1077             fix0            += tx;
1078             fiy0            += ty;
1079             fiz0            += tz;
1080             f[j_coord_offset+DIM*0+XX] -= tx;
1081             f[j_coord_offset+DIM*0+YY] -= ty;
1082             f[j_coord_offset+DIM*0+ZZ] -= tz;
1083
1084             }
1085
1086             /**************************
1087              * CALCULATE INTERACTIONS *
1088              **************************/
1089
1090             if (rsq01<rcutoff2)
1091             {
1092
1093             r01              = rsq01*rinv01;
1094
1095             /* EWALD ELECTROSTATICS */
1096
1097             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1098             ewrt             = r01*ewtabscale;
1099             ewitab           = ewrt;
1100             eweps            = ewrt-ewitab;
1101             ewitab           = 4*ewitab;
1102             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
1103             velec            = qq01*(rinv01-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
1104             felec            = qq01*rinv01*(rinvsq01-felec);
1105
1106             d                = r01-rswitch;
1107             d                = (d>0.0) ? d : 0.0;
1108             d2               = d*d;
1109             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
1110
1111             dsw              = d2*(swF2+d*(swF3+d*swF4));
1112
1113             /* Evaluate switch function */
1114             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1115             felec            = felec*sw - rinv01*velec*dsw;
1116
1117             fscal            = felec;
1118
1119             /* Calculate temporary vectorial force */
1120             tx               = fscal*dx01;
1121             ty               = fscal*dy01;
1122             tz               = fscal*dz01;
1123
1124             /* Update vectorial force */
1125             fix0            += tx;
1126             fiy0            += ty;
1127             fiz0            += tz;
1128             f[j_coord_offset+DIM*1+XX] -= tx;
1129             f[j_coord_offset+DIM*1+YY] -= ty;
1130             f[j_coord_offset+DIM*1+ZZ] -= tz;
1131
1132             }
1133
1134             /**************************
1135              * CALCULATE INTERACTIONS *
1136              **************************/
1137
1138             if (rsq02<rcutoff2)
1139             {
1140
1141             r02              = rsq02*rinv02;
1142
1143             /* EWALD ELECTROSTATICS */
1144
1145             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1146             ewrt             = r02*ewtabscale;
1147             ewitab           = ewrt;
1148             eweps            = ewrt-ewitab;
1149             ewitab           = 4*ewitab;
1150             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
1151             velec            = qq02*(rinv02-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
1152             felec            = qq02*rinv02*(rinvsq02-felec);
1153
1154             d                = r02-rswitch;
1155             d                = (d>0.0) ? d : 0.0;
1156             d2               = d*d;
1157             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
1158
1159             dsw              = d2*(swF2+d*(swF3+d*swF4));
1160
1161             /* Evaluate switch function */
1162             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1163             felec            = felec*sw - rinv02*velec*dsw;
1164
1165             fscal            = felec;
1166
1167             /* Calculate temporary vectorial force */
1168             tx               = fscal*dx02;
1169             ty               = fscal*dy02;
1170             tz               = fscal*dz02;
1171
1172             /* Update vectorial force */
1173             fix0            += tx;
1174             fiy0            += ty;
1175             fiz0            += tz;
1176             f[j_coord_offset+DIM*2+XX] -= tx;
1177             f[j_coord_offset+DIM*2+YY] -= ty;
1178             f[j_coord_offset+DIM*2+ZZ] -= tz;
1179
1180             }
1181
1182             /**************************
1183              * CALCULATE INTERACTIONS *
1184              **************************/
1185
1186             if (rsq10<rcutoff2)
1187             {
1188
1189             r10              = rsq10*rinv10;
1190
1191             /* EWALD ELECTROSTATICS */
1192
1193             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1194             ewrt             = r10*ewtabscale;
1195             ewitab           = ewrt;
1196             eweps            = ewrt-ewitab;
1197             ewitab           = 4*ewitab;
1198             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
1199             velec            = qq10*(rinv10-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
1200             felec            = qq10*rinv10*(rinvsq10-felec);
1201
1202             d                = r10-rswitch;
1203             d                = (d>0.0) ? d : 0.0;
1204             d2               = d*d;
1205             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
1206
1207             dsw              = d2*(swF2+d*(swF3+d*swF4));
1208
1209             /* Evaluate switch function */
1210             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1211             felec            = felec*sw - rinv10*velec*dsw;
1212
1213             fscal            = felec;
1214
1215             /* Calculate temporary vectorial force */
1216             tx               = fscal*dx10;
1217             ty               = fscal*dy10;
1218             tz               = fscal*dz10;
1219
1220             /* Update vectorial force */
1221             fix1            += tx;
1222             fiy1            += ty;
1223             fiz1            += tz;
1224             f[j_coord_offset+DIM*0+XX] -= tx;
1225             f[j_coord_offset+DIM*0+YY] -= ty;
1226             f[j_coord_offset+DIM*0+ZZ] -= tz;
1227
1228             }
1229
1230             /**************************
1231              * CALCULATE INTERACTIONS *
1232              **************************/
1233
1234             if (rsq11<rcutoff2)
1235             {
1236
1237             r11              = rsq11*rinv11;
1238
1239             /* EWALD ELECTROSTATICS */
1240
1241             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1242             ewrt             = r11*ewtabscale;
1243             ewitab           = ewrt;
1244             eweps            = ewrt-ewitab;
1245             ewitab           = 4*ewitab;
1246             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
1247             velec            = qq11*(rinv11-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
1248             felec            = qq11*rinv11*(rinvsq11-felec);
1249
1250             d                = r11-rswitch;
1251             d                = (d>0.0) ? d : 0.0;
1252             d2               = d*d;
1253             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
1254
1255             dsw              = d2*(swF2+d*(swF3+d*swF4));
1256
1257             /* Evaluate switch function */
1258             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1259             felec            = felec*sw - rinv11*velec*dsw;
1260
1261             fscal            = felec;
1262
1263             /* Calculate temporary vectorial force */
1264             tx               = fscal*dx11;
1265             ty               = fscal*dy11;
1266             tz               = fscal*dz11;
1267
1268             /* Update vectorial force */
1269             fix1            += tx;
1270             fiy1            += ty;
1271             fiz1            += tz;
1272             f[j_coord_offset+DIM*1+XX] -= tx;
1273             f[j_coord_offset+DIM*1+YY] -= ty;
1274             f[j_coord_offset+DIM*1+ZZ] -= tz;
1275
1276             }
1277
1278             /**************************
1279              * CALCULATE INTERACTIONS *
1280              **************************/
1281
1282             if (rsq12<rcutoff2)
1283             {
1284
1285             r12              = rsq12*rinv12;
1286
1287             /* EWALD ELECTROSTATICS */
1288
1289             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1290             ewrt             = r12*ewtabscale;
1291             ewitab           = ewrt;
1292             eweps            = ewrt-ewitab;
1293             ewitab           = 4*ewitab;
1294             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
1295             velec            = qq12*(rinv12-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
1296             felec            = qq12*rinv12*(rinvsq12-felec);
1297
1298             d                = r12-rswitch;
1299             d                = (d>0.0) ? d : 0.0;
1300             d2               = d*d;
1301             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
1302
1303             dsw              = d2*(swF2+d*(swF3+d*swF4));
1304
1305             /* Evaluate switch function */
1306             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1307             felec            = felec*sw - rinv12*velec*dsw;
1308
1309             fscal            = felec;
1310
1311             /* Calculate temporary vectorial force */
1312             tx               = fscal*dx12;
1313             ty               = fscal*dy12;
1314             tz               = fscal*dz12;
1315
1316             /* Update vectorial force */
1317             fix1            += tx;
1318             fiy1            += ty;
1319             fiz1            += tz;
1320             f[j_coord_offset+DIM*2+XX] -= tx;
1321             f[j_coord_offset+DIM*2+YY] -= ty;
1322             f[j_coord_offset+DIM*2+ZZ] -= tz;
1323
1324             }
1325
1326             /**************************
1327              * CALCULATE INTERACTIONS *
1328              **************************/
1329
1330             if (rsq20<rcutoff2)
1331             {
1332
1333             r20              = rsq20*rinv20;
1334
1335             /* EWALD ELECTROSTATICS */
1336
1337             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1338             ewrt             = r20*ewtabscale;
1339             ewitab           = ewrt;
1340             eweps            = ewrt-ewitab;
1341             ewitab           = 4*ewitab;
1342             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
1343             velec            = qq20*(rinv20-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
1344             felec            = qq20*rinv20*(rinvsq20-felec);
1345
1346             d                = r20-rswitch;
1347             d                = (d>0.0) ? d : 0.0;
1348             d2               = d*d;
1349             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
1350
1351             dsw              = d2*(swF2+d*(swF3+d*swF4));
1352
1353             /* Evaluate switch function */
1354             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1355             felec            = felec*sw - rinv20*velec*dsw;
1356
1357             fscal            = felec;
1358
1359             /* Calculate temporary vectorial force */
1360             tx               = fscal*dx20;
1361             ty               = fscal*dy20;
1362             tz               = fscal*dz20;
1363
1364             /* Update vectorial force */
1365             fix2            += tx;
1366             fiy2            += ty;
1367             fiz2            += tz;
1368             f[j_coord_offset+DIM*0+XX] -= tx;
1369             f[j_coord_offset+DIM*0+YY] -= ty;
1370             f[j_coord_offset+DIM*0+ZZ] -= tz;
1371
1372             }
1373
1374             /**************************
1375              * CALCULATE INTERACTIONS *
1376              **************************/
1377
1378             if (rsq21<rcutoff2)
1379             {
1380
1381             r21              = rsq21*rinv21;
1382
1383             /* EWALD ELECTROSTATICS */
1384
1385             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1386             ewrt             = r21*ewtabscale;
1387             ewitab           = ewrt;
1388             eweps            = ewrt-ewitab;
1389             ewitab           = 4*ewitab;
1390             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
1391             velec            = qq21*(rinv21-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
1392             felec            = qq21*rinv21*(rinvsq21-felec);
1393
1394             d                = r21-rswitch;
1395             d                = (d>0.0) ? d : 0.0;
1396             d2               = d*d;
1397             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
1398
1399             dsw              = d2*(swF2+d*(swF3+d*swF4));
1400
1401             /* Evaluate switch function */
1402             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1403             felec            = felec*sw - rinv21*velec*dsw;
1404
1405             fscal            = felec;
1406
1407             /* Calculate temporary vectorial force */
1408             tx               = fscal*dx21;
1409             ty               = fscal*dy21;
1410             tz               = fscal*dz21;
1411
1412             /* Update vectorial force */
1413             fix2            += tx;
1414             fiy2            += ty;
1415             fiz2            += tz;
1416             f[j_coord_offset+DIM*1+XX] -= tx;
1417             f[j_coord_offset+DIM*1+YY] -= ty;
1418             f[j_coord_offset+DIM*1+ZZ] -= tz;
1419
1420             }
1421
1422             /**************************
1423              * CALCULATE INTERACTIONS *
1424              **************************/
1425
1426             if (rsq22<rcutoff2)
1427             {
1428
1429             r22              = rsq22*rinv22;
1430
1431             /* EWALD ELECTROSTATICS */
1432
1433             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1434             ewrt             = r22*ewtabscale;
1435             ewitab           = ewrt;
1436             eweps            = ewrt-ewitab;
1437             ewitab           = 4*ewitab;
1438             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
1439             velec            = qq22*(rinv22-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
1440             felec            = qq22*rinv22*(rinvsq22-felec);
1441
1442             d                = r22-rswitch;
1443             d                = (d>0.0) ? d : 0.0;
1444             d2               = d*d;
1445             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
1446
1447             dsw              = d2*(swF2+d*(swF3+d*swF4));
1448
1449             /* Evaluate switch function */
1450             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
1451             felec            = felec*sw - rinv22*velec*dsw;
1452
1453             fscal            = felec;
1454
1455             /* Calculate temporary vectorial force */
1456             tx               = fscal*dx22;
1457             ty               = fscal*dy22;
1458             tz               = fscal*dz22;
1459
1460             /* Update vectorial force */
1461             fix2            += tx;
1462             fiy2            += ty;
1463             fiz2            += tz;
1464             f[j_coord_offset+DIM*2+XX] -= tx;
1465             f[j_coord_offset+DIM*2+YY] -= ty;
1466             f[j_coord_offset+DIM*2+ZZ] -= tz;
1467
1468             }
1469
1470             /* Inner loop uses 544 flops */
1471         }
1472         /* End of innermost loop */
1473
1474         tx = ty = tz = 0;
1475         f[i_coord_offset+DIM*0+XX] += fix0;
1476         f[i_coord_offset+DIM*0+YY] += fiy0;
1477         f[i_coord_offset+DIM*0+ZZ] += fiz0;
1478         tx                         += fix0;
1479         ty                         += fiy0;
1480         tz                         += fiz0;
1481         f[i_coord_offset+DIM*1+XX] += fix1;
1482         f[i_coord_offset+DIM*1+YY] += fiy1;
1483         f[i_coord_offset+DIM*1+ZZ] += fiz1;
1484         tx                         += fix1;
1485         ty                         += fiy1;
1486         tz                         += fiz1;
1487         f[i_coord_offset+DIM*2+XX] += fix2;
1488         f[i_coord_offset+DIM*2+YY] += fiy2;
1489         f[i_coord_offset+DIM*2+ZZ] += fiz2;
1490         tx                         += fix2;
1491         ty                         += fiy2;
1492         tz                         += fiz2;
1493         fshift[i_shift_offset+XX]  += tx;
1494         fshift[i_shift_offset+YY]  += ty;
1495         fshift[i_shift_offset+ZZ]  += tz;
1496
1497         /* Increment number of inner iterations */
1498         inneriter                  += j_index_end - j_index_start;
1499
1500         /* Outer loop uses 30 flops */
1501     }
1502
1503     /* Increment number of outer iterations */
1504     outeriter        += nri;
1505
1506     /* Update outer/inner flops */
1507
1508     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3W3_F,outeriter*30 + inneriter*544);
1509 }