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