ad06f44dcb38cfc4738ef26c4b21ec13ca57b673
[alexxy/gromacs.git] / src / gromacs / gmxlib / nonbonded / nb_kernel_c / nb_kernel_ElecEw_VdwCSTab_GeomW4W4_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_ElecEw_VdwCSTab_GeomW4W4_VF_c
35  * Electrostatics interaction: Ewald
36  * VdW interaction:            CubicSplineTable
37  * Geometry:                   Water4-Water4
38  * Calculate force/pot:        PotentialAndForce
39  */
40 void
41 nb_kernel_ElecEw_VdwCSTab_GeomW4W4_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              vdwioffset3;
63     real             ix3,iy3,iz3,fix3,fiy3,fiz3,iq3,isai3;
64     int              vdwjidx0;
65     real             jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
66     int              vdwjidx1;
67     real             jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
68     int              vdwjidx2;
69     real             jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
70     int              vdwjidx3;
71     real             jx3,jy3,jz3,fjx3,fjy3,fjz3,jq3,isaj3;
72     real             dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00,cexp1_00,cexp2_00;
73     real             dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11,cexp1_11,cexp2_11;
74     real             dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12,cexp1_12,cexp2_12;
75     real             dx13,dy13,dz13,rsq13,rinv13,rinvsq13,r13,qq13,c6_13,c12_13,cexp1_13,cexp2_13;
76     real             dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21,cexp1_21,cexp2_21;
77     real             dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22,cexp1_22,cexp2_22;
78     real             dx23,dy23,dz23,rsq23,rinv23,rinvsq23,r23,qq23,c6_23,c12_23,cexp1_23,cexp2_23;
79     real             dx31,dy31,dz31,rsq31,rinv31,rinvsq31,r31,qq31,c6_31,c12_31,cexp1_31,cexp2_31;
80     real             dx32,dy32,dz32,rsq32,rinv32,rinvsq32,r32,qq32,c6_32,c12_32,cexp1_32,cexp2_32;
81     real             dx33,dy33,dz33,rsq33,rinv33,rinvsq33,r33,qq33,c6_33,c12_33,cexp1_33,cexp2_33;
82     real             velec,felec,velecsum,facel,crf,krf,krf2;
83     real             *charge;
84     int              nvdwtype;
85     real             rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,br,vvdwexp,sh_vdw_invrcut6;
86     int              *vdwtype;
87     real             *vdwparam;
88     int              vfitab;
89     real             rt,vfeps,vftabscale,Y,F,Geps,Heps2,Fp,VV,FF;
90     real             *vftab;
91     int              ewitab;
92     real             ewtabscale,eweps,sh_ewald,ewrt,ewtabhalfspace;
93     real             *ewtab;
94
95     x                = xx[0];
96     f                = ff[0];
97
98     nri              = nlist->nri;
99     iinr             = nlist->iinr;
100     jindex           = nlist->jindex;
101     jjnr             = nlist->jjnr;
102     shiftidx         = nlist->shift;
103     gid              = nlist->gid;
104     shiftvec         = fr->shift_vec[0];
105     fshift           = fr->fshift[0];
106     facel            = fr->epsfac;
107     charge           = mdatoms->chargeA;
108     nvdwtype         = fr->ntype;
109     vdwparam         = fr->nbfp;
110     vdwtype          = mdatoms->typeA;
111
112     vftab            = kernel_data->table_vdw->data;
113     vftabscale       = kernel_data->table_vdw->scale;
114
115     sh_ewald         = fr->ic->sh_ewald;
116     ewtab            = fr->ic->tabq_coul_FDV0;
117     ewtabscale       = fr->ic->tabq_scale;
118     ewtabhalfspace   = 0.5/ewtabscale;
119
120     /* Setup water-specific parameters */
121     inr              = nlist->iinr[0];
122     iq1              = facel*charge[inr+1];
123     iq2              = facel*charge[inr+2];
124     iq3              = facel*charge[inr+3];
125     vdwioffset0      = 2*nvdwtype*vdwtype[inr+0];
126
127     jq1              = charge[inr+1];
128     jq2              = charge[inr+2];
129     jq3              = charge[inr+3];
130     vdwjidx0         = 2*vdwtype[inr+0];
131     c6_00            = vdwparam[vdwioffset0+vdwjidx0];
132     c12_00           = vdwparam[vdwioffset0+vdwjidx0+1];
133     qq11             = iq1*jq1;
134     qq12             = iq1*jq2;
135     qq13             = iq1*jq3;
136     qq21             = iq2*jq1;
137     qq22             = iq2*jq2;
138     qq23             = iq2*jq3;
139     qq31             = iq3*jq1;
140     qq32             = iq3*jq2;
141     qq33             = iq3*jq3;
142
143     outeriter        = 0;
144     inneriter        = 0;
145
146     /* Start outer loop over neighborlists */
147     for(iidx=0; iidx<nri; iidx++)
148     {
149         /* Load shift vector for this list */
150         i_shift_offset   = DIM*shiftidx[iidx];
151         shX              = shiftvec[i_shift_offset+XX];
152         shY              = shiftvec[i_shift_offset+YY];
153         shZ              = shiftvec[i_shift_offset+ZZ];
154
155         /* Load limits for loop over neighbors */
156         j_index_start    = jindex[iidx];
157         j_index_end      = jindex[iidx+1];
158
159         /* Get outer coordinate index */
160         inr              = iinr[iidx];
161         i_coord_offset   = DIM*inr;
162
163         /* Load i particle coords and add shift vector */
164         ix0              = shX + x[i_coord_offset+DIM*0+XX];
165         iy0              = shY + x[i_coord_offset+DIM*0+YY];
166         iz0              = shZ + x[i_coord_offset+DIM*0+ZZ];
167         ix1              = shX + x[i_coord_offset+DIM*1+XX];
168         iy1              = shY + x[i_coord_offset+DIM*1+YY];
169         iz1              = shZ + x[i_coord_offset+DIM*1+ZZ];
170         ix2              = shX + x[i_coord_offset+DIM*2+XX];
171         iy2              = shY + x[i_coord_offset+DIM*2+YY];
172         iz2              = shZ + x[i_coord_offset+DIM*2+ZZ];
173         ix3              = shX + x[i_coord_offset+DIM*3+XX];
174         iy3              = shY + x[i_coord_offset+DIM*3+YY];
175         iz3              = shZ + x[i_coord_offset+DIM*3+ZZ];
176
177         fix0             = 0.0;
178         fiy0             = 0.0;
179         fiz0             = 0.0;
180         fix1             = 0.0;
181         fiy1             = 0.0;
182         fiz1             = 0.0;
183         fix2             = 0.0;
184         fiy2             = 0.0;
185         fiz2             = 0.0;
186         fix3             = 0.0;
187         fiy3             = 0.0;
188         fiz3             = 0.0;
189
190         /* Reset potential sums */
191         velecsum         = 0.0;
192         vvdwsum          = 0.0;
193
194         /* Start inner kernel loop */
195         for(jidx=j_index_start; jidx<j_index_end; jidx++)
196         {
197             /* Get j neighbor index, and coordinate index */
198             jnr              = jjnr[jidx];
199             j_coord_offset   = DIM*jnr;
200
201             /* load j atom coordinates */
202             jx0              = x[j_coord_offset+DIM*0+XX];
203             jy0              = x[j_coord_offset+DIM*0+YY];
204             jz0              = x[j_coord_offset+DIM*0+ZZ];
205             jx1              = x[j_coord_offset+DIM*1+XX];
206             jy1              = x[j_coord_offset+DIM*1+YY];
207             jz1              = x[j_coord_offset+DIM*1+ZZ];
208             jx2              = x[j_coord_offset+DIM*2+XX];
209             jy2              = x[j_coord_offset+DIM*2+YY];
210             jz2              = x[j_coord_offset+DIM*2+ZZ];
211             jx3              = x[j_coord_offset+DIM*3+XX];
212             jy3              = x[j_coord_offset+DIM*3+YY];
213             jz3              = x[j_coord_offset+DIM*3+ZZ];
214
215             /* Calculate displacement vector */
216             dx00             = ix0 - jx0;
217             dy00             = iy0 - jy0;
218             dz00             = iz0 - jz0;
219             dx11             = ix1 - jx1;
220             dy11             = iy1 - jy1;
221             dz11             = iz1 - jz1;
222             dx12             = ix1 - jx2;
223             dy12             = iy1 - jy2;
224             dz12             = iz1 - jz2;
225             dx13             = ix1 - jx3;
226             dy13             = iy1 - jy3;
227             dz13             = iz1 - jz3;
228             dx21             = ix2 - jx1;
229             dy21             = iy2 - jy1;
230             dz21             = iz2 - jz1;
231             dx22             = ix2 - jx2;
232             dy22             = iy2 - jy2;
233             dz22             = iz2 - jz2;
234             dx23             = ix2 - jx3;
235             dy23             = iy2 - jy3;
236             dz23             = iz2 - jz3;
237             dx31             = ix3 - jx1;
238             dy31             = iy3 - jy1;
239             dz31             = iz3 - jz1;
240             dx32             = ix3 - jx2;
241             dy32             = iy3 - jy2;
242             dz32             = iz3 - jz2;
243             dx33             = ix3 - jx3;
244             dy33             = iy3 - jy3;
245             dz33             = iz3 - jz3;
246
247             /* Calculate squared distance and things based on it */
248             rsq00            = dx00*dx00+dy00*dy00+dz00*dz00;
249             rsq11            = dx11*dx11+dy11*dy11+dz11*dz11;
250             rsq12            = dx12*dx12+dy12*dy12+dz12*dz12;
251             rsq13            = dx13*dx13+dy13*dy13+dz13*dz13;
252             rsq21            = dx21*dx21+dy21*dy21+dz21*dz21;
253             rsq22            = dx22*dx22+dy22*dy22+dz22*dz22;
254             rsq23            = dx23*dx23+dy23*dy23+dz23*dz23;
255             rsq31            = dx31*dx31+dy31*dy31+dz31*dz31;
256             rsq32            = dx32*dx32+dy32*dy32+dz32*dz32;
257             rsq33            = dx33*dx33+dy33*dy33+dz33*dz33;
258
259             rinv00           = gmx_invsqrt(rsq00);
260             rinv11           = gmx_invsqrt(rsq11);
261             rinv12           = gmx_invsqrt(rsq12);
262             rinv13           = gmx_invsqrt(rsq13);
263             rinv21           = gmx_invsqrt(rsq21);
264             rinv22           = gmx_invsqrt(rsq22);
265             rinv23           = gmx_invsqrt(rsq23);
266             rinv31           = gmx_invsqrt(rsq31);
267             rinv32           = gmx_invsqrt(rsq32);
268             rinv33           = gmx_invsqrt(rsq33);
269
270             rinvsq11         = rinv11*rinv11;
271             rinvsq12         = rinv12*rinv12;
272             rinvsq13         = rinv13*rinv13;
273             rinvsq21         = rinv21*rinv21;
274             rinvsq22         = rinv22*rinv22;
275             rinvsq23         = rinv23*rinv23;
276             rinvsq31         = rinv31*rinv31;
277             rinvsq32         = rinv32*rinv32;
278             rinvsq33         = rinv33*rinv33;
279
280             /**************************
281              * CALCULATE INTERACTIONS *
282              **************************/
283
284             r00              = rsq00*rinv00;
285
286             /* Calculate table index by multiplying r with table scale and truncate to integer */
287             rt               = r00*vftabscale;
288             vfitab           = rt;
289             vfeps            = rt-vfitab;
290             vfitab           = 2*4*vfitab;
291
292             /* CUBIC SPLINE TABLE DISPERSION */
293             vfitab          += 0;
294             Y                = vftab[vfitab];
295             F                = vftab[vfitab+1];
296             Geps             = vfeps*vftab[vfitab+2];
297             Heps2            = vfeps*vfeps*vftab[vfitab+3];
298             Fp               = F+Geps+Heps2;
299             VV               = Y+vfeps*Fp;
300             vvdw6            = c6_00*VV;
301             FF               = Fp+Geps+2.0*Heps2;
302             fvdw6            = c6_00*FF;
303
304             /* CUBIC SPLINE TABLE REPULSION */
305             Y                = vftab[vfitab+4];
306             F                = vftab[vfitab+5];
307             Geps             = vfeps*vftab[vfitab+6];
308             Heps2            = vfeps*vfeps*vftab[vfitab+7];
309             Fp               = F+Geps+Heps2;
310             VV               = Y+vfeps*Fp;
311             vvdw12           = c12_00*VV;
312             FF               = Fp+Geps+2.0*Heps2;
313             fvdw12           = c12_00*FF;
314             vvdw             = vvdw12+vvdw6;
315             fvdw             = -(fvdw6+fvdw12)*vftabscale*rinv00;
316
317             /* Update potential sums from outer loop */
318             vvdwsum         += vvdw;
319
320             fscal            = fvdw;
321
322             /* Calculate temporary vectorial force */
323             tx               = fscal*dx00;
324             ty               = fscal*dy00;
325             tz               = fscal*dz00;
326
327             /* Update vectorial force */
328             fix0            += tx;
329             fiy0            += ty;
330             fiz0            += tz;
331             f[j_coord_offset+DIM*0+XX] -= tx;
332             f[j_coord_offset+DIM*0+YY] -= ty;
333             f[j_coord_offset+DIM*0+ZZ] -= tz;
334
335             /**************************
336              * CALCULATE INTERACTIONS *
337              **************************/
338
339             r11              = rsq11*rinv11;
340
341             /* EWALD ELECTROSTATICS */
342
343             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
344             ewrt             = r11*ewtabscale;
345             ewitab           = ewrt;
346             eweps            = ewrt-ewitab;
347             ewitab           = 4*ewitab;
348             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
349             velec            = qq11*(rinv11-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
350             felec            = qq11*rinv11*(rinvsq11-felec);
351
352             /* Update potential sums from outer loop */
353             velecsum        += velec;
354
355             fscal            = felec;
356
357             /* Calculate temporary vectorial force */
358             tx               = fscal*dx11;
359             ty               = fscal*dy11;
360             tz               = fscal*dz11;
361
362             /* Update vectorial force */
363             fix1            += tx;
364             fiy1            += ty;
365             fiz1            += tz;
366             f[j_coord_offset+DIM*1+XX] -= tx;
367             f[j_coord_offset+DIM*1+YY] -= ty;
368             f[j_coord_offset+DIM*1+ZZ] -= tz;
369
370             /**************************
371              * CALCULATE INTERACTIONS *
372              **************************/
373
374             r12              = rsq12*rinv12;
375
376             /* EWALD ELECTROSTATICS */
377
378             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
379             ewrt             = r12*ewtabscale;
380             ewitab           = ewrt;
381             eweps            = ewrt-ewitab;
382             ewitab           = 4*ewitab;
383             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
384             velec            = qq12*(rinv12-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
385             felec            = qq12*rinv12*(rinvsq12-felec);
386
387             /* Update potential sums from outer loop */
388             velecsum        += velec;
389
390             fscal            = felec;
391
392             /* Calculate temporary vectorial force */
393             tx               = fscal*dx12;
394             ty               = fscal*dy12;
395             tz               = fscal*dz12;
396
397             /* Update vectorial force */
398             fix1            += tx;
399             fiy1            += ty;
400             fiz1            += tz;
401             f[j_coord_offset+DIM*2+XX] -= tx;
402             f[j_coord_offset+DIM*2+YY] -= ty;
403             f[j_coord_offset+DIM*2+ZZ] -= tz;
404
405             /**************************
406              * CALCULATE INTERACTIONS *
407              **************************/
408
409             r13              = rsq13*rinv13;
410
411             /* EWALD ELECTROSTATICS */
412
413             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
414             ewrt             = r13*ewtabscale;
415             ewitab           = ewrt;
416             eweps            = ewrt-ewitab;
417             ewitab           = 4*ewitab;
418             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
419             velec            = qq13*(rinv13-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
420             felec            = qq13*rinv13*(rinvsq13-felec);
421
422             /* Update potential sums from outer loop */
423             velecsum        += velec;
424
425             fscal            = felec;
426
427             /* Calculate temporary vectorial force */
428             tx               = fscal*dx13;
429             ty               = fscal*dy13;
430             tz               = fscal*dz13;
431
432             /* Update vectorial force */
433             fix1            += tx;
434             fiy1            += ty;
435             fiz1            += tz;
436             f[j_coord_offset+DIM*3+XX] -= tx;
437             f[j_coord_offset+DIM*3+YY] -= ty;
438             f[j_coord_offset+DIM*3+ZZ] -= tz;
439
440             /**************************
441              * CALCULATE INTERACTIONS *
442              **************************/
443
444             r21              = rsq21*rinv21;
445
446             /* EWALD ELECTROSTATICS */
447
448             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
449             ewrt             = r21*ewtabscale;
450             ewitab           = ewrt;
451             eweps            = ewrt-ewitab;
452             ewitab           = 4*ewitab;
453             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
454             velec            = qq21*(rinv21-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
455             felec            = qq21*rinv21*(rinvsq21-felec);
456
457             /* Update potential sums from outer loop */
458             velecsum        += velec;
459
460             fscal            = felec;
461
462             /* Calculate temporary vectorial force */
463             tx               = fscal*dx21;
464             ty               = fscal*dy21;
465             tz               = fscal*dz21;
466
467             /* Update vectorial force */
468             fix2            += tx;
469             fiy2            += ty;
470             fiz2            += tz;
471             f[j_coord_offset+DIM*1+XX] -= tx;
472             f[j_coord_offset+DIM*1+YY] -= ty;
473             f[j_coord_offset+DIM*1+ZZ] -= tz;
474
475             /**************************
476              * CALCULATE INTERACTIONS *
477              **************************/
478
479             r22              = rsq22*rinv22;
480
481             /* EWALD ELECTROSTATICS */
482
483             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
484             ewrt             = r22*ewtabscale;
485             ewitab           = ewrt;
486             eweps            = ewrt-ewitab;
487             ewitab           = 4*ewitab;
488             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
489             velec            = qq22*(rinv22-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
490             felec            = qq22*rinv22*(rinvsq22-felec);
491
492             /* Update potential sums from outer loop */
493             velecsum        += velec;
494
495             fscal            = felec;
496
497             /* Calculate temporary vectorial force */
498             tx               = fscal*dx22;
499             ty               = fscal*dy22;
500             tz               = fscal*dz22;
501
502             /* Update vectorial force */
503             fix2            += tx;
504             fiy2            += ty;
505             fiz2            += tz;
506             f[j_coord_offset+DIM*2+XX] -= tx;
507             f[j_coord_offset+DIM*2+YY] -= ty;
508             f[j_coord_offset+DIM*2+ZZ] -= tz;
509
510             /**************************
511              * CALCULATE INTERACTIONS *
512              **************************/
513
514             r23              = rsq23*rinv23;
515
516             /* EWALD ELECTROSTATICS */
517
518             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
519             ewrt             = r23*ewtabscale;
520             ewitab           = ewrt;
521             eweps            = ewrt-ewitab;
522             ewitab           = 4*ewitab;
523             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
524             velec            = qq23*(rinv23-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
525             felec            = qq23*rinv23*(rinvsq23-felec);
526
527             /* Update potential sums from outer loop */
528             velecsum        += velec;
529
530             fscal            = felec;
531
532             /* Calculate temporary vectorial force */
533             tx               = fscal*dx23;
534             ty               = fscal*dy23;
535             tz               = fscal*dz23;
536
537             /* Update vectorial force */
538             fix2            += tx;
539             fiy2            += ty;
540             fiz2            += tz;
541             f[j_coord_offset+DIM*3+XX] -= tx;
542             f[j_coord_offset+DIM*3+YY] -= ty;
543             f[j_coord_offset+DIM*3+ZZ] -= tz;
544
545             /**************************
546              * CALCULATE INTERACTIONS *
547              **************************/
548
549             r31              = rsq31*rinv31;
550
551             /* EWALD ELECTROSTATICS */
552
553             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
554             ewrt             = r31*ewtabscale;
555             ewitab           = ewrt;
556             eweps            = ewrt-ewitab;
557             ewitab           = 4*ewitab;
558             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
559             velec            = qq31*(rinv31-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
560             felec            = qq31*rinv31*(rinvsq31-felec);
561
562             /* Update potential sums from outer loop */
563             velecsum        += velec;
564
565             fscal            = felec;
566
567             /* Calculate temporary vectorial force */
568             tx               = fscal*dx31;
569             ty               = fscal*dy31;
570             tz               = fscal*dz31;
571
572             /* Update vectorial force */
573             fix3            += tx;
574             fiy3            += ty;
575             fiz3            += tz;
576             f[j_coord_offset+DIM*1+XX] -= tx;
577             f[j_coord_offset+DIM*1+YY] -= ty;
578             f[j_coord_offset+DIM*1+ZZ] -= tz;
579
580             /**************************
581              * CALCULATE INTERACTIONS *
582              **************************/
583
584             r32              = rsq32*rinv32;
585
586             /* EWALD ELECTROSTATICS */
587
588             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
589             ewrt             = r32*ewtabscale;
590             ewitab           = ewrt;
591             eweps            = ewrt-ewitab;
592             ewitab           = 4*ewitab;
593             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
594             velec            = qq32*(rinv32-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
595             felec            = qq32*rinv32*(rinvsq32-felec);
596
597             /* Update potential sums from outer loop */
598             velecsum        += velec;
599
600             fscal            = felec;
601
602             /* Calculate temporary vectorial force */
603             tx               = fscal*dx32;
604             ty               = fscal*dy32;
605             tz               = fscal*dz32;
606
607             /* Update vectorial force */
608             fix3            += tx;
609             fiy3            += ty;
610             fiz3            += tz;
611             f[j_coord_offset+DIM*2+XX] -= tx;
612             f[j_coord_offset+DIM*2+YY] -= ty;
613             f[j_coord_offset+DIM*2+ZZ] -= tz;
614
615             /**************************
616              * CALCULATE INTERACTIONS *
617              **************************/
618
619             r33              = rsq33*rinv33;
620
621             /* EWALD ELECTROSTATICS */
622
623             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
624             ewrt             = r33*ewtabscale;
625             ewitab           = ewrt;
626             eweps            = ewrt-ewitab;
627             ewitab           = 4*ewitab;
628             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
629             velec            = qq33*(rinv33-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
630             felec            = qq33*rinv33*(rinvsq33-felec);
631
632             /* Update potential sums from outer loop */
633             velecsum        += velec;
634
635             fscal            = felec;
636
637             /* Calculate temporary vectorial force */
638             tx               = fscal*dx33;
639             ty               = fscal*dy33;
640             tz               = fscal*dz33;
641
642             /* Update vectorial force */
643             fix3            += tx;
644             fiy3            += ty;
645             fiz3            += tz;
646             f[j_coord_offset+DIM*3+XX] -= tx;
647             f[j_coord_offset+DIM*3+YY] -= ty;
648             f[j_coord_offset+DIM*3+ZZ] -= tz;
649
650             /* Inner loop uses 415 flops */
651         }
652         /* End of innermost loop */
653
654         tx = ty = tz = 0;
655         f[i_coord_offset+DIM*0+XX] += fix0;
656         f[i_coord_offset+DIM*0+YY] += fiy0;
657         f[i_coord_offset+DIM*0+ZZ] += fiz0;
658         tx                         += fix0;
659         ty                         += fiy0;
660         tz                         += fiz0;
661         f[i_coord_offset+DIM*1+XX] += fix1;
662         f[i_coord_offset+DIM*1+YY] += fiy1;
663         f[i_coord_offset+DIM*1+ZZ] += fiz1;
664         tx                         += fix1;
665         ty                         += fiy1;
666         tz                         += fiz1;
667         f[i_coord_offset+DIM*2+XX] += fix2;
668         f[i_coord_offset+DIM*2+YY] += fiy2;
669         f[i_coord_offset+DIM*2+ZZ] += fiz2;
670         tx                         += fix2;
671         ty                         += fiy2;
672         tz                         += fiz2;
673         f[i_coord_offset+DIM*3+XX] += fix3;
674         f[i_coord_offset+DIM*3+YY] += fiy3;
675         f[i_coord_offset+DIM*3+ZZ] += fiz3;
676         tx                         += fix3;
677         ty                         += fiy3;
678         tz                         += fiz3;
679         fshift[i_shift_offset+XX]  += tx;
680         fshift[i_shift_offset+YY]  += ty;
681         fshift[i_shift_offset+ZZ]  += tz;
682
683         ggid                        = gid[iidx];
684         /* Update potential energies */
685         kernel_data->energygrp_elec[ggid] += velecsum;
686         kernel_data->energygrp_vdw[ggid] += vvdwsum;
687
688         /* Increment number of inner iterations */
689         inneriter                  += j_index_end - j_index_start;
690
691         /* Outer loop uses 41 flops */
692     }
693
694     /* Increment number of outer iterations */
695     outeriter        += nri;
696
697     /* Update outer/inner flops */
698
699     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W4W4_VF,outeriter*41 + inneriter*415);
700 }
701 /*
702  * Gromacs nonbonded kernel:   nb_kernel_ElecEw_VdwCSTab_GeomW4W4_F_c
703  * Electrostatics interaction: Ewald
704  * VdW interaction:            CubicSplineTable
705  * Geometry:                   Water4-Water4
706  * Calculate force/pot:        Force
707  */
708 void
709 nb_kernel_ElecEw_VdwCSTab_GeomW4W4_F_c
710                     (t_nblist * gmx_restrict                nlist,
711                      rvec * gmx_restrict                    xx,
712                      rvec * gmx_restrict                    ff,
713                      t_forcerec * gmx_restrict              fr,
714                      t_mdatoms * gmx_restrict               mdatoms,
715                      nb_kernel_data_t * gmx_restrict        kernel_data,
716                      t_nrnb * gmx_restrict                  nrnb)
717 {
718     int              i_shift_offset,i_coord_offset,j_coord_offset;
719     int              j_index_start,j_index_end;
720     int              nri,inr,ggid,iidx,jidx,jnr,outeriter,inneriter;
721     real             shX,shY,shZ,tx,ty,tz,fscal,rcutoff,rcutoff2;
722     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
723     real             *shiftvec,*fshift,*x,*f;
724     int              vdwioffset0;
725     real             ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
726     int              vdwioffset1;
727     real             ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
728     int              vdwioffset2;
729     real             ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
730     int              vdwioffset3;
731     real             ix3,iy3,iz3,fix3,fiy3,fiz3,iq3,isai3;
732     int              vdwjidx0;
733     real             jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
734     int              vdwjidx1;
735     real             jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
736     int              vdwjidx2;
737     real             jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
738     int              vdwjidx3;
739     real             jx3,jy3,jz3,fjx3,fjy3,fjz3,jq3,isaj3;
740     real             dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00,cexp1_00,cexp2_00;
741     real             dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11,cexp1_11,cexp2_11;
742     real             dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12,cexp1_12,cexp2_12;
743     real             dx13,dy13,dz13,rsq13,rinv13,rinvsq13,r13,qq13,c6_13,c12_13,cexp1_13,cexp2_13;
744     real             dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21,cexp1_21,cexp2_21;
745     real             dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22,cexp1_22,cexp2_22;
746     real             dx23,dy23,dz23,rsq23,rinv23,rinvsq23,r23,qq23,c6_23,c12_23,cexp1_23,cexp2_23;
747     real             dx31,dy31,dz31,rsq31,rinv31,rinvsq31,r31,qq31,c6_31,c12_31,cexp1_31,cexp2_31;
748     real             dx32,dy32,dz32,rsq32,rinv32,rinvsq32,r32,qq32,c6_32,c12_32,cexp1_32,cexp2_32;
749     real             dx33,dy33,dz33,rsq33,rinv33,rinvsq33,r33,qq33,c6_33,c12_33,cexp1_33,cexp2_33;
750     real             velec,felec,velecsum,facel,crf,krf,krf2;
751     real             *charge;
752     int              nvdwtype;
753     real             rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,br,vvdwexp,sh_vdw_invrcut6;
754     int              *vdwtype;
755     real             *vdwparam;
756     int              vfitab;
757     real             rt,vfeps,vftabscale,Y,F,Geps,Heps2,Fp,VV,FF;
758     real             *vftab;
759     int              ewitab;
760     real             ewtabscale,eweps,sh_ewald,ewrt,ewtabhalfspace;
761     real             *ewtab;
762
763     x                = xx[0];
764     f                = ff[0];
765
766     nri              = nlist->nri;
767     iinr             = nlist->iinr;
768     jindex           = nlist->jindex;
769     jjnr             = nlist->jjnr;
770     shiftidx         = nlist->shift;
771     gid              = nlist->gid;
772     shiftvec         = fr->shift_vec[0];
773     fshift           = fr->fshift[0];
774     facel            = fr->epsfac;
775     charge           = mdatoms->chargeA;
776     nvdwtype         = fr->ntype;
777     vdwparam         = fr->nbfp;
778     vdwtype          = mdatoms->typeA;
779
780     vftab            = kernel_data->table_vdw->data;
781     vftabscale       = kernel_data->table_vdw->scale;
782
783     sh_ewald         = fr->ic->sh_ewald;
784     ewtab            = fr->ic->tabq_coul_F;
785     ewtabscale       = fr->ic->tabq_scale;
786     ewtabhalfspace   = 0.5/ewtabscale;
787
788     /* Setup water-specific parameters */
789     inr              = nlist->iinr[0];
790     iq1              = facel*charge[inr+1];
791     iq2              = facel*charge[inr+2];
792     iq3              = facel*charge[inr+3];
793     vdwioffset0      = 2*nvdwtype*vdwtype[inr+0];
794
795     jq1              = charge[inr+1];
796     jq2              = charge[inr+2];
797     jq3              = charge[inr+3];
798     vdwjidx0         = 2*vdwtype[inr+0];
799     c6_00            = vdwparam[vdwioffset0+vdwjidx0];
800     c12_00           = vdwparam[vdwioffset0+vdwjidx0+1];
801     qq11             = iq1*jq1;
802     qq12             = iq1*jq2;
803     qq13             = iq1*jq3;
804     qq21             = iq2*jq1;
805     qq22             = iq2*jq2;
806     qq23             = iq2*jq3;
807     qq31             = iq3*jq1;
808     qq32             = iq3*jq2;
809     qq33             = iq3*jq3;
810
811     outeriter        = 0;
812     inneriter        = 0;
813
814     /* Start outer loop over neighborlists */
815     for(iidx=0; iidx<nri; iidx++)
816     {
817         /* Load shift vector for this list */
818         i_shift_offset   = DIM*shiftidx[iidx];
819         shX              = shiftvec[i_shift_offset+XX];
820         shY              = shiftvec[i_shift_offset+YY];
821         shZ              = shiftvec[i_shift_offset+ZZ];
822
823         /* Load limits for loop over neighbors */
824         j_index_start    = jindex[iidx];
825         j_index_end      = jindex[iidx+1];
826
827         /* Get outer coordinate index */
828         inr              = iinr[iidx];
829         i_coord_offset   = DIM*inr;
830
831         /* Load i particle coords and add shift vector */
832         ix0              = shX + x[i_coord_offset+DIM*0+XX];
833         iy0              = shY + x[i_coord_offset+DIM*0+YY];
834         iz0              = shZ + x[i_coord_offset+DIM*0+ZZ];
835         ix1              = shX + x[i_coord_offset+DIM*1+XX];
836         iy1              = shY + x[i_coord_offset+DIM*1+YY];
837         iz1              = shZ + x[i_coord_offset+DIM*1+ZZ];
838         ix2              = shX + x[i_coord_offset+DIM*2+XX];
839         iy2              = shY + x[i_coord_offset+DIM*2+YY];
840         iz2              = shZ + x[i_coord_offset+DIM*2+ZZ];
841         ix3              = shX + x[i_coord_offset+DIM*3+XX];
842         iy3              = shY + x[i_coord_offset+DIM*3+YY];
843         iz3              = shZ + x[i_coord_offset+DIM*3+ZZ];
844
845         fix0             = 0.0;
846         fiy0             = 0.0;
847         fiz0             = 0.0;
848         fix1             = 0.0;
849         fiy1             = 0.0;
850         fiz1             = 0.0;
851         fix2             = 0.0;
852         fiy2             = 0.0;
853         fiz2             = 0.0;
854         fix3             = 0.0;
855         fiy3             = 0.0;
856         fiz3             = 0.0;
857
858         /* Start inner kernel loop */
859         for(jidx=j_index_start; jidx<j_index_end; jidx++)
860         {
861             /* Get j neighbor index, and coordinate index */
862             jnr              = jjnr[jidx];
863             j_coord_offset   = DIM*jnr;
864
865             /* load j atom coordinates */
866             jx0              = x[j_coord_offset+DIM*0+XX];
867             jy0              = x[j_coord_offset+DIM*0+YY];
868             jz0              = x[j_coord_offset+DIM*0+ZZ];
869             jx1              = x[j_coord_offset+DIM*1+XX];
870             jy1              = x[j_coord_offset+DIM*1+YY];
871             jz1              = x[j_coord_offset+DIM*1+ZZ];
872             jx2              = x[j_coord_offset+DIM*2+XX];
873             jy2              = x[j_coord_offset+DIM*2+YY];
874             jz2              = x[j_coord_offset+DIM*2+ZZ];
875             jx3              = x[j_coord_offset+DIM*3+XX];
876             jy3              = x[j_coord_offset+DIM*3+YY];
877             jz3              = x[j_coord_offset+DIM*3+ZZ];
878
879             /* Calculate displacement vector */
880             dx00             = ix0 - jx0;
881             dy00             = iy0 - jy0;
882             dz00             = iz0 - jz0;
883             dx11             = ix1 - jx1;
884             dy11             = iy1 - jy1;
885             dz11             = iz1 - jz1;
886             dx12             = ix1 - jx2;
887             dy12             = iy1 - jy2;
888             dz12             = iz1 - jz2;
889             dx13             = ix1 - jx3;
890             dy13             = iy1 - jy3;
891             dz13             = iz1 - jz3;
892             dx21             = ix2 - jx1;
893             dy21             = iy2 - jy1;
894             dz21             = iz2 - jz1;
895             dx22             = ix2 - jx2;
896             dy22             = iy2 - jy2;
897             dz22             = iz2 - jz2;
898             dx23             = ix2 - jx3;
899             dy23             = iy2 - jy3;
900             dz23             = iz2 - jz3;
901             dx31             = ix3 - jx1;
902             dy31             = iy3 - jy1;
903             dz31             = iz3 - jz1;
904             dx32             = ix3 - jx2;
905             dy32             = iy3 - jy2;
906             dz32             = iz3 - jz2;
907             dx33             = ix3 - jx3;
908             dy33             = iy3 - jy3;
909             dz33             = iz3 - jz3;
910
911             /* Calculate squared distance and things based on it */
912             rsq00            = dx00*dx00+dy00*dy00+dz00*dz00;
913             rsq11            = dx11*dx11+dy11*dy11+dz11*dz11;
914             rsq12            = dx12*dx12+dy12*dy12+dz12*dz12;
915             rsq13            = dx13*dx13+dy13*dy13+dz13*dz13;
916             rsq21            = dx21*dx21+dy21*dy21+dz21*dz21;
917             rsq22            = dx22*dx22+dy22*dy22+dz22*dz22;
918             rsq23            = dx23*dx23+dy23*dy23+dz23*dz23;
919             rsq31            = dx31*dx31+dy31*dy31+dz31*dz31;
920             rsq32            = dx32*dx32+dy32*dy32+dz32*dz32;
921             rsq33            = dx33*dx33+dy33*dy33+dz33*dz33;
922
923             rinv00           = gmx_invsqrt(rsq00);
924             rinv11           = gmx_invsqrt(rsq11);
925             rinv12           = gmx_invsqrt(rsq12);
926             rinv13           = gmx_invsqrt(rsq13);
927             rinv21           = gmx_invsqrt(rsq21);
928             rinv22           = gmx_invsqrt(rsq22);
929             rinv23           = gmx_invsqrt(rsq23);
930             rinv31           = gmx_invsqrt(rsq31);
931             rinv32           = gmx_invsqrt(rsq32);
932             rinv33           = gmx_invsqrt(rsq33);
933
934             rinvsq11         = rinv11*rinv11;
935             rinvsq12         = rinv12*rinv12;
936             rinvsq13         = rinv13*rinv13;
937             rinvsq21         = rinv21*rinv21;
938             rinvsq22         = rinv22*rinv22;
939             rinvsq23         = rinv23*rinv23;
940             rinvsq31         = rinv31*rinv31;
941             rinvsq32         = rinv32*rinv32;
942             rinvsq33         = rinv33*rinv33;
943
944             /**************************
945              * CALCULATE INTERACTIONS *
946              **************************/
947
948             r00              = rsq00*rinv00;
949
950             /* Calculate table index by multiplying r with table scale and truncate to integer */
951             rt               = r00*vftabscale;
952             vfitab           = rt;
953             vfeps            = rt-vfitab;
954             vfitab           = 2*4*vfitab;
955
956             /* CUBIC SPLINE TABLE DISPERSION */
957             vfitab          += 0;
958             F                = vftab[vfitab+1];
959             Geps             = vfeps*vftab[vfitab+2];
960             Heps2            = vfeps*vfeps*vftab[vfitab+3];
961             Fp               = F+Geps+Heps2;
962             FF               = Fp+Geps+2.0*Heps2;
963             fvdw6            = c6_00*FF;
964
965             /* CUBIC SPLINE TABLE REPULSION */
966             F                = vftab[vfitab+5];
967             Geps             = vfeps*vftab[vfitab+6];
968             Heps2            = vfeps*vfeps*vftab[vfitab+7];
969             Fp               = F+Geps+Heps2;
970             FF               = Fp+Geps+2.0*Heps2;
971             fvdw12           = c12_00*FF;
972             fvdw             = -(fvdw6+fvdw12)*vftabscale*rinv00;
973
974             fscal            = fvdw;
975
976             /* Calculate temporary vectorial force */
977             tx               = fscal*dx00;
978             ty               = fscal*dy00;
979             tz               = fscal*dz00;
980
981             /* Update vectorial force */
982             fix0            += tx;
983             fiy0            += ty;
984             fiz0            += tz;
985             f[j_coord_offset+DIM*0+XX] -= tx;
986             f[j_coord_offset+DIM*0+YY] -= ty;
987             f[j_coord_offset+DIM*0+ZZ] -= tz;
988
989             /**************************
990              * CALCULATE INTERACTIONS *
991              **************************/
992
993             r11              = rsq11*rinv11;
994
995             /* EWALD ELECTROSTATICS */
996
997             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
998             ewrt             = r11*ewtabscale;
999             ewitab           = ewrt;
1000             eweps            = ewrt-ewitab;
1001             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1002             felec            = qq11*rinv11*(rinvsq11-felec);
1003
1004             fscal            = felec;
1005
1006             /* Calculate temporary vectorial force */
1007             tx               = fscal*dx11;
1008             ty               = fscal*dy11;
1009             tz               = fscal*dz11;
1010
1011             /* Update vectorial force */
1012             fix1            += tx;
1013             fiy1            += ty;
1014             fiz1            += tz;
1015             f[j_coord_offset+DIM*1+XX] -= tx;
1016             f[j_coord_offset+DIM*1+YY] -= ty;
1017             f[j_coord_offset+DIM*1+ZZ] -= tz;
1018
1019             /**************************
1020              * CALCULATE INTERACTIONS *
1021              **************************/
1022
1023             r12              = rsq12*rinv12;
1024
1025             /* EWALD ELECTROSTATICS */
1026
1027             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1028             ewrt             = r12*ewtabscale;
1029             ewitab           = ewrt;
1030             eweps            = ewrt-ewitab;
1031             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1032             felec            = qq12*rinv12*(rinvsq12-felec);
1033
1034             fscal            = felec;
1035
1036             /* Calculate temporary vectorial force */
1037             tx               = fscal*dx12;
1038             ty               = fscal*dy12;
1039             tz               = fscal*dz12;
1040
1041             /* Update vectorial force */
1042             fix1            += tx;
1043             fiy1            += ty;
1044             fiz1            += tz;
1045             f[j_coord_offset+DIM*2+XX] -= tx;
1046             f[j_coord_offset+DIM*2+YY] -= ty;
1047             f[j_coord_offset+DIM*2+ZZ] -= tz;
1048
1049             /**************************
1050              * CALCULATE INTERACTIONS *
1051              **************************/
1052
1053             r13              = rsq13*rinv13;
1054
1055             /* EWALD ELECTROSTATICS */
1056
1057             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1058             ewrt             = r13*ewtabscale;
1059             ewitab           = ewrt;
1060             eweps            = ewrt-ewitab;
1061             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1062             felec            = qq13*rinv13*(rinvsq13-felec);
1063
1064             fscal            = felec;
1065
1066             /* Calculate temporary vectorial force */
1067             tx               = fscal*dx13;
1068             ty               = fscal*dy13;
1069             tz               = fscal*dz13;
1070
1071             /* Update vectorial force */
1072             fix1            += tx;
1073             fiy1            += ty;
1074             fiz1            += tz;
1075             f[j_coord_offset+DIM*3+XX] -= tx;
1076             f[j_coord_offset+DIM*3+YY] -= ty;
1077             f[j_coord_offset+DIM*3+ZZ] -= tz;
1078
1079             /**************************
1080              * CALCULATE INTERACTIONS *
1081              **************************/
1082
1083             r21              = rsq21*rinv21;
1084
1085             /* EWALD ELECTROSTATICS */
1086
1087             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1088             ewrt             = r21*ewtabscale;
1089             ewitab           = ewrt;
1090             eweps            = ewrt-ewitab;
1091             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1092             felec            = qq21*rinv21*(rinvsq21-felec);
1093
1094             fscal            = felec;
1095
1096             /* Calculate temporary vectorial force */
1097             tx               = fscal*dx21;
1098             ty               = fscal*dy21;
1099             tz               = fscal*dz21;
1100
1101             /* Update vectorial force */
1102             fix2            += tx;
1103             fiy2            += ty;
1104             fiz2            += tz;
1105             f[j_coord_offset+DIM*1+XX] -= tx;
1106             f[j_coord_offset+DIM*1+YY] -= ty;
1107             f[j_coord_offset+DIM*1+ZZ] -= tz;
1108
1109             /**************************
1110              * CALCULATE INTERACTIONS *
1111              **************************/
1112
1113             r22              = rsq22*rinv22;
1114
1115             /* EWALD ELECTROSTATICS */
1116
1117             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1118             ewrt             = r22*ewtabscale;
1119             ewitab           = ewrt;
1120             eweps            = ewrt-ewitab;
1121             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1122             felec            = qq22*rinv22*(rinvsq22-felec);
1123
1124             fscal            = felec;
1125
1126             /* Calculate temporary vectorial force */
1127             tx               = fscal*dx22;
1128             ty               = fscal*dy22;
1129             tz               = fscal*dz22;
1130
1131             /* Update vectorial force */
1132             fix2            += tx;
1133             fiy2            += ty;
1134             fiz2            += tz;
1135             f[j_coord_offset+DIM*2+XX] -= tx;
1136             f[j_coord_offset+DIM*2+YY] -= ty;
1137             f[j_coord_offset+DIM*2+ZZ] -= tz;
1138
1139             /**************************
1140              * CALCULATE INTERACTIONS *
1141              **************************/
1142
1143             r23              = rsq23*rinv23;
1144
1145             /* EWALD ELECTROSTATICS */
1146
1147             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1148             ewrt             = r23*ewtabscale;
1149             ewitab           = ewrt;
1150             eweps            = ewrt-ewitab;
1151             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1152             felec            = qq23*rinv23*(rinvsq23-felec);
1153
1154             fscal            = felec;
1155
1156             /* Calculate temporary vectorial force */
1157             tx               = fscal*dx23;
1158             ty               = fscal*dy23;
1159             tz               = fscal*dz23;
1160
1161             /* Update vectorial force */
1162             fix2            += tx;
1163             fiy2            += ty;
1164             fiz2            += tz;
1165             f[j_coord_offset+DIM*3+XX] -= tx;
1166             f[j_coord_offset+DIM*3+YY] -= ty;
1167             f[j_coord_offset+DIM*3+ZZ] -= tz;
1168
1169             /**************************
1170              * CALCULATE INTERACTIONS *
1171              **************************/
1172
1173             r31              = rsq31*rinv31;
1174
1175             /* EWALD ELECTROSTATICS */
1176
1177             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1178             ewrt             = r31*ewtabscale;
1179             ewitab           = ewrt;
1180             eweps            = ewrt-ewitab;
1181             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1182             felec            = qq31*rinv31*(rinvsq31-felec);
1183
1184             fscal            = felec;
1185
1186             /* Calculate temporary vectorial force */
1187             tx               = fscal*dx31;
1188             ty               = fscal*dy31;
1189             tz               = fscal*dz31;
1190
1191             /* Update vectorial force */
1192             fix3            += tx;
1193             fiy3            += ty;
1194             fiz3            += tz;
1195             f[j_coord_offset+DIM*1+XX] -= tx;
1196             f[j_coord_offset+DIM*1+YY] -= ty;
1197             f[j_coord_offset+DIM*1+ZZ] -= tz;
1198
1199             /**************************
1200              * CALCULATE INTERACTIONS *
1201              **************************/
1202
1203             r32              = rsq32*rinv32;
1204
1205             /* EWALD ELECTROSTATICS */
1206
1207             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1208             ewrt             = r32*ewtabscale;
1209             ewitab           = ewrt;
1210             eweps            = ewrt-ewitab;
1211             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1212             felec            = qq32*rinv32*(rinvsq32-felec);
1213
1214             fscal            = felec;
1215
1216             /* Calculate temporary vectorial force */
1217             tx               = fscal*dx32;
1218             ty               = fscal*dy32;
1219             tz               = fscal*dz32;
1220
1221             /* Update vectorial force */
1222             fix3            += tx;
1223             fiy3            += ty;
1224             fiz3            += tz;
1225             f[j_coord_offset+DIM*2+XX] -= tx;
1226             f[j_coord_offset+DIM*2+YY] -= ty;
1227             f[j_coord_offset+DIM*2+ZZ] -= tz;
1228
1229             /**************************
1230              * CALCULATE INTERACTIONS *
1231              **************************/
1232
1233             r33              = rsq33*rinv33;
1234
1235             /* EWALD ELECTROSTATICS */
1236
1237             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1238             ewrt             = r33*ewtabscale;
1239             ewitab           = ewrt;
1240             eweps            = ewrt-ewitab;
1241             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1242             felec            = qq33*rinv33*(rinvsq33-felec);
1243
1244             fscal            = felec;
1245
1246             /* Calculate temporary vectorial force */
1247             tx               = fscal*dx33;
1248             ty               = fscal*dy33;
1249             tz               = fscal*dz33;
1250
1251             /* Update vectorial force */
1252             fix3            += tx;
1253             fiy3            += ty;
1254             fiz3            += tz;
1255             f[j_coord_offset+DIM*3+XX] -= tx;
1256             f[j_coord_offset+DIM*3+YY] -= ty;
1257             f[j_coord_offset+DIM*3+ZZ] -= tz;
1258
1259             /* Inner loop uses 344 flops */
1260         }
1261         /* End of innermost loop */
1262
1263         tx = ty = tz = 0;
1264         f[i_coord_offset+DIM*0+XX] += fix0;
1265         f[i_coord_offset+DIM*0+YY] += fiy0;
1266         f[i_coord_offset+DIM*0+ZZ] += fiz0;
1267         tx                         += fix0;
1268         ty                         += fiy0;
1269         tz                         += fiz0;
1270         f[i_coord_offset+DIM*1+XX] += fix1;
1271         f[i_coord_offset+DIM*1+YY] += fiy1;
1272         f[i_coord_offset+DIM*1+ZZ] += fiz1;
1273         tx                         += fix1;
1274         ty                         += fiy1;
1275         tz                         += fiz1;
1276         f[i_coord_offset+DIM*2+XX] += fix2;
1277         f[i_coord_offset+DIM*2+YY] += fiy2;
1278         f[i_coord_offset+DIM*2+ZZ] += fiz2;
1279         tx                         += fix2;
1280         ty                         += fiy2;
1281         tz                         += fiz2;
1282         f[i_coord_offset+DIM*3+XX] += fix3;
1283         f[i_coord_offset+DIM*3+YY] += fiy3;
1284         f[i_coord_offset+DIM*3+ZZ] += fiz3;
1285         tx                         += fix3;
1286         ty                         += fiy3;
1287         tz                         += fiz3;
1288         fshift[i_shift_offset+XX]  += tx;
1289         fshift[i_shift_offset+YY]  += ty;
1290         fshift[i_shift_offset+ZZ]  += tz;
1291
1292         /* Increment number of inner iterations */
1293         inneriter                  += j_index_end - j_index_start;
1294
1295         /* Outer loop uses 39 flops */
1296     }
1297
1298     /* Increment number of outer iterations */
1299     outeriter        += nri;
1300
1301     /* Update outer/inner flops */
1302
1303     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W4W4_F,outeriter*39 + inneriter*344);
1304 }