Merge origin/release-4-6 into master
[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             Y                = vftab[vfitab];
959             F                = vftab[vfitab+1];
960             Geps             = vfeps*vftab[vfitab+2];
961             Heps2            = vfeps*vfeps*vftab[vfitab+3];
962             Fp               = F+Geps+Heps2;
963             FF               = Fp+Geps+2.0*Heps2;
964             fvdw6            = c6_00*FF;
965
966             /* CUBIC SPLINE TABLE REPULSION */
967             Y                = vftab[vfitab+4];
968             F                = vftab[vfitab+5];
969             Geps             = vfeps*vftab[vfitab+6];
970             Heps2            = vfeps*vfeps*vftab[vfitab+7];
971             Fp               = F+Geps+Heps2;
972             FF               = Fp+Geps+2.0*Heps2;
973             fvdw12           = c12_00*FF;
974             fvdw             = -(fvdw6+fvdw12)*vftabscale*rinv00;
975
976             fscal            = fvdw;
977
978             /* Calculate temporary vectorial force */
979             tx               = fscal*dx00;
980             ty               = fscal*dy00;
981             tz               = fscal*dz00;
982
983             /* Update vectorial force */
984             fix0            += tx;
985             fiy0            += ty;
986             fiz0            += tz;
987             f[j_coord_offset+DIM*0+XX] -= tx;
988             f[j_coord_offset+DIM*0+YY] -= ty;
989             f[j_coord_offset+DIM*0+ZZ] -= tz;
990
991             /**************************
992              * CALCULATE INTERACTIONS *
993              **************************/
994
995             r11              = rsq11*rinv11;
996
997             /* EWALD ELECTROSTATICS */
998
999             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1000             ewrt             = r11*ewtabscale;
1001             ewitab           = ewrt;
1002             eweps            = ewrt-ewitab;
1003             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1004             felec            = qq11*rinv11*(rinvsq11-felec);
1005
1006             fscal            = felec;
1007
1008             /* Calculate temporary vectorial force */
1009             tx               = fscal*dx11;
1010             ty               = fscal*dy11;
1011             tz               = fscal*dz11;
1012
1013             /* Update vectorial force */
1014             fix1            += tx;
1015             fiy1            += ty;
1016             fiz1            += tz;
1017             f[j_coord_offset+DIM*1+XX] -= tx;
1018             f[j_coord_offset+DIM*1+YY] -= ty;
1019             f[j_coord_offset+DIM*1+ZZ] -= tz;
1020
1021             /**************************
1022              * CALCULATE INTERACTIONS *
1023              **************************/
1024
1025             r12              = rsq12*rinv12;
1026
1027             /* EWALD ELECTROSTATICS */
1028
1029             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1030             ewrt             = r12*ewtabscale;
1031             ewitab           = ewrt;
1032             eweps            = ewrt-ewitab;
1033             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1034             felec            = qq12*rinv12*(rinvsq12-felec);
1035
1036             fscal            = felec;
1037
1038             /* Calculate temporary vectorial force */
1039             tx               = fscal*dx12;
1040             ty               = fscal*dy12;
1041             tz               = fscal*dz12;
1042
1043             /* Update vectorial force */
1044             fix1            += tx;
1045             fiy1            += ty;
1046             fiz1            += tz;
1047             f[j_coord_offset+DIM*2+XX] -= tx;
1048             f[j_coord_offset+DIM*2+YY] -= ty;
1049             f[j_coord_offset+DIM*2+ZZ] -= tz;
1050
1051             /**************************
1052              * CALCULATE INTERACTIONS *
1053              **************************/
1054
1055             r13              = rsq13*rinv13;
1056
1057             /* EWALD ELECTROSTATICS */
1058
1059             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1060             ewrt             = r13*ewtabscale;
1061             ewitab           = ewrt;
1062             eweps            = ewrt-ewitab;
1063             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1064             felec            = qq13*rinv13*(rinvsq13-felec);
1065
1066             fscal            = felec;
1067
1068             /* Calculate temporary vectorial force */
1069             tx               = fscal*dx13;
1070             ty               = fscal*dy13;
1071             tz               = fscal*dz13;
1072
1073             /* Update vectorial force */
1074             fix1            += tx;
1075             fiy1            += ty;
1076             fiz1            += tz;
1077             f[j_coord_offset+DIM*3+XX] -= tx;
1078             f[j_coord_offset+DIM*3+YY] -= ty;
1079             f[j_coord_offset+DIM*3+ZZ] -= tz;
1080
1081             /**************************
1082              * CALCULATE INTERACTIONS *
1083              **************************/
1084
1085             r21              = rsq21*rinv21;
1086
1087             /* EWALD ELECTROSTATICS */
1088
1089             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1090             ewrt             = r21*ewtabscale;
1091             ewitab           = ewrt;
1092             eweps            = ewrt-ewitab;
1093             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1094             felec            = qq21*rinv21*(rinvsq21-felec);
1095
1096             fscal            = felec;
1097
1098             /* Calculate temporary vectorial force */
1099             tx               = fscal*dx21;
1100             ty               = fscal*dy21;
1101             tz               = fscal*dz21;
1102
1103             /* Update vectorial force */
1104             fix2            += tx;
1105             fiy2            += ty;
1106             fiz2            += tz;
1107             f[j_coord_offset+DIM*1+XX] -= tx;
1108             f[j_coord_offset+DIM*1+YY] -= ty;
1109             f[j_coord_offset+DIM*1+ZZ] -= tz;
1110
1111             /**************************
1112              * CALCULATE INTERACTIONS *
1113              **************************/
1114
1115             r22              = rsq22*rinv22;
1116
1117             /* EWALD ELECTROSTATICS */
1118
1119             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1120             ewrt             = r22*ewtabscale;
1121             ewitab           = ewrt;
1122             eweps            = ewrt-ewitab;
1123             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1124             felec            = qq22*rinv22*(rinvsq22-felec);
1125
1126             fscal            = felec;
1127
1128             /* Calculate temporary vectorial force */
1129             tx               = fscal*dx22;
1130             ty               = fscal*dy22;
1131             tz               = fscal*dz22;
1132
1133             /* Update vectorial force */
1134             fix2            += tx;
1135             fiy2            += ty;
1136             fiz2            += tz;
1137             f[j_coord_offset+DIM*2+XX] -= tx;
1138             f[j_coord_offset+DIM*2+YY] -= ty;
1139             f[j_coord_offset+DIM*2+ZZ] -= tz;
1140
1141             /**************************
1142              * CALCULATE INTERACTIONS *
1143              **************************/
1144
1145             r23              = rsq23*rinv23;
1146
1147             /* EWALD ELECTROSTATICS */
1148
1149             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1150             ewrt             = r23*ewtabscale;
1151             ewitab           = ewrt;
1152             eweps            = ewrt-ewitab;
1153             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1154             felec            = qq23*rinv23*(rinvsq23-felec);
1155
1156             fscal            = felec;
1157
1158             /* Calculate temporary vectorial force */
1159             tx               = fscal*dx23;
1160             ty               = fscal*dy23;
1161             tz               = fscal*dz23;
1162
1163             /* Update vectorial force */
1164             fix2            += tx;
1165             fiy2            += ty;
1166             fiz2            += tz;
1167             f[j_coord_offset+DIM*3+XX] -= tx;
1168             f[j_coord_offset+DIM*3+YY] -= ty;
1169             f[j_coord_offset+DIM*3+ZZ] -= tz;
1170
1171             /**************************
1172              * CALCULATE INTERACTIONS *
1173              **************************/
1174
1175             r31              = rsq31*rinv31;
1176
1177             /* EWALD ELECTROSTATICS */
1178
1179             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1180             ewrt             = r31*ewtabscale;
1181             ewitab           = ewrt;
1182             eweps            = ewrt-ewitab;
1183             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1184             felec            = qq31*rinv31*(rinvsq31-felec);
1185
1186             fscal            = felec;
1187
1188             /* Calculate temporary vectorial force */
1189             tx               = fscal*dx31;
1190             ty               = fscal*dy31;
1191             tz               = fscal*dz31;
1192
1193             /* Update vectorial force */
1194             fix3            += tx;
1195             fiy3            += ty;
1196             fiz3            += tz;
1197             f[j_coord_offset+DIM*1+XX] -= tx;
1198             f[j_coord_offset+DIM*1+YY] -= ty;
1199             f[j_coord_offset+DIM*1+ZZ] -= tz;
1200
1201             /**************************
1202              * CALCULATE INTERACTIONS *
1203              **************************/
1204
1205             r32              = rsq32*rinv32;
1206
1207             /* EWALD ELECTROSTATICS */
1208
1209             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1210             ewrt             = r32*ewtabscale;
1211             ewitab           = ewrt;
1212             eweps            = ewrt-ewitab;
1213             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1214             felec            = qq32*rinv32*(rinvsq32-felec);
1215
1216             fscal            = felec;
1217
1218             /* Calculate temporary vectorial force */
1219             tx               = fscal*dx32;
1220             ty               = fscal*dy32;
1221             tz               = fscal*dz32;
1222
1223             /* Update vectorial force */
1224             fix3            += tx;
1225             fiy3            += ty;
1226             fiz3            += tz;
1227             f[j_coord_offset+DIM*2+XX] -= tx;
1228             f[j_coord_offset+DIM*2+YY] -= ty;
1229             f[j_coord_offset+DIM*2+ZZ] -= tz;
1230
1231             /**************************
1232              * CALCULATE INTERACTIONS *
1233              **************************/
1234
1235             r33              = rsq33*rinv33;
1236
1237             /* EWALD ELECTROSTATICS */
1238
1239             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1240             ewrt             = r33*ewtabscale;
1241             ewitab           = ewrt;
1242             eweps            = ewrt-ewitab;
1243             felec            = (1.0-eweps)*ewtab[ewitab]+eweps*ewtab[ewitab+1];
1244             felec            = qq33*rinv33*(rinvsq33-felec);
1245
1246             fscal            = felec;
1247
1248             /* Calculate temporary vectorial force */
1249             tx               = fscal*dx33;
1250             ty               = fscal*dy33;
1251             tz               = fscal*dz33;
1252
1253             /* Update vectorial force */
1254             fix3            += tx;
1255             fiy3            += ty;
1256             fiz3            += tz;
1257             f[j_coord_offset+DIM*3+XX] -= tx;
1258             f[j_coord_offset+DIM*3+YY] -= ty;
1259             f[j_coord_offset+DIM*3+ZZ] -= tz;
1260
1261             /* Inner loop uses 344 flops */
1262         }
1263         /* End of innermost loop */
1264
1265         tx = ty = tz = 0;
1266         f[i_coord_offset+DIM*0+XX] += fix0;
1267         f[i_coord_offset+DIM*0+YY] += fiy0;
1268         f[i_coord_offset+DIM*0+ZZ] += fiz0;
1269         tx                         += fix0;
1270         ty                         += fiy0;
1271         tz                         += fiz0;
1272         f[i_coord_offset+DIM*1+XX] += fix1;
1273         f[i_coord_offset+DIM*1+YY] += fiy1;
1274         f[i_coord_offset+DIM*1+ZZ] += fiz1;
1275         tx                         += fix1;
1276         ty                         += fiy1;
1277         tz                         += fiz1;
1278         f[i_coord_offset+DIM*2+XX] += fix2;
1279         f[i_coord_offset+DIM*2+YY] += fiy2;
1280         f[i_coord_offset+DIM*2+ZZ] += fiz2;
1281         tx                         += fix2;
1282         ty                         += fiy2;
1283         tz                         += fiz2;
1284         f[i_coord_offset+DIM*3+XX] += fix3;
1285         f[i_coord_offset+DIM*3+YY] += fiy3;
1286         f[i_coord_offset+DIM*3+ZZ] += fiz3;
1287         tx                         += fix3;
1288         ty                         += fiy3;
1289         tz                         += fiz3;
1290         fshift[i_shift_offset+XX]  += tx;
1291         fshift[i_shift_offset+YY]  += ty;
1292         fshift[i_shift_offset+ZZ]  += tz;
1293
1294         /* Increment number of inner iterations */
1295         inneriter                  += j_index_end - j_index_start;
1296
1297         /* Outer loop uses 39 flops */
1298     }
1299
1300     /* Increment number of outer iterations */
1301     outeriter        += nri;
1302
1303     /* Update outer/inner flops */
1304
1305     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W4W4_F,outeriter*39 + inneriter*344);
1306 }