Merge origin/release-4-6 into master
[alexxy/gromacs.git] / src / gromacs / gmxlib / nonbonded / nb_kernel_c / nb_kernel_ElecRFCut_VdwBhamSh_GeomW3P1_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_VdwBhamSh_GeomW3P1_VF_c
35  * Electrostatics interaction: ReactionField
36  * VdW interaction:            Buckingham
37  * Geometry:                   Water3-Particle
38  * Calculate force/pot:        PotentialAndForce
39  */
40 void
41 nb_kernel_ElecRFCut_VdwBhamSh_GeomW3P1_VF_c
42                     (t_nblist * gmx_restrict                nlist,
43                      rvec * gmx_restrict                    xx,
44                      rvec * gmx_restrict                    ff,
45                      t_forcerec * gmx_restrict              fr,
46                      t_mdatoms * gmx_restrict               mdatoms,
47                      nb_kernel_data_t * gmx_restrict        kernel_data,
48                      t_nrnb * gmx_restrict                  nrnb)
49 {
50     int              i_shift_offset,i_coord_offset,j_coord_offset;
51     int              j_index_start,j_index_end;
52     int              nri,inr,ggid,iidx,jidx,jnr,outeriter,inneriter;
53     real             shX,shY,shZ,tx,ty,tz,fscal,rcutoff,rcutoff2;
54     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
55     real             *shiftvec,*fshift,*x,*f;
56     int              vdwioffset0;
57     real             ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
58     int              vdwioffset1;
59     real             ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
60     int              vdwioffset2;
61     real             ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
62     int              vdwjidx0;
63     real             jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
64     real             dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00,cexp1_00,cexp2_00;
65     real             dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10,cexp1_10,cexp2_10;
66     real             dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20,cexp1_20,cexp2_20;
67     real             velec,felec,velecsum,facel,crf,krf,krf2;
68     real             *charge;
69     int              nvdwtype;
70     real             rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,br,vvdwexp,sh_vdw_invrcut6;
71     int              *vdwtype;
72     real             *vdwparam;
73
74     x                = xx[0];
75     f                = ff[0];
76
77     nri              = nlist->nri;
78     iinr             = nlist->iinr;
79     jindex           = nlist->jindex;
80     jjnr             = nlist->jjnr;
81     shiftidx         = nlist->shift;
82     gid              = nlist->gid;
83     shiftvec         = fr->shift_vec[0];
84     fshift           = fr->fshift[0];
85     facel            = fr->epsfac;
86     charge           = mdatoms->chargeA;
87     krf              = fr->ic->k_rf;
88     krf2             = krf*2.0;
89     crf              = fr->ic->c_rf;
90     nvdwtype         = fr->ntype;
91     vdwparam         = fr->nbfp;
92     vdwtype          = mdatoms->typeA;
93
94     /* Setup water-specific parameters */
95     inr              = nlist->iinr[0];
96     iq0              = facel*charge[inr+0];
97     iq1              = facel*charge[inr+1];
98     iq2              = facel*charge[inr+2];
99     vdwioffset0      = 3*nvdwtype*vdwtype[inr+0];
100
101     /* When we use explicit cutoffs the value must be identical for elec and VdW, so use elec as an arbitrary choice */
102     rcutoff          = fr->rcoulomb;
103     rcutoff2         = rcutoff*rcutoff;
104
105     sh_vdw_invrcut6  = fr->ic->sh_invrc6;
106     rvdw             = fr->rvdw;
107
108     outeriter        = 0;
109     inneriter        = 0;
110
111     /* Start outer loop over neighborlists */
112     for(iidx=0; iidx<nri; iidx++)
113     {
114         /* Load shift vector for this list */
115         i_shift_offset   = DIM*shiftidx[iidx];
116         shX              = shiftvec[i_shift_offset+XX];
117         shY              = shiftvec[i_shift_offset+YY];
118         shZ              = shiftvec[i_shift_offset+ZZ];
119
120         /* Load limits for loop over neighbors */
121         j_index_start    = jindex[iidx];
122         j_index_end      = jindex[iidx+1];
123
124         /* Get outer coordinate index */
125         inr              = iinr[iidx];
126         i_coord_offset   = DIM*inr;
127
128         /* Load i particle coords and add shift vector */
129         ix0              = shX + x[i_coord_offset+DIM*0+XX];
130         iy0              = shY + x[i_coord_offset+DIM*0+YY];
131         iz0              = shZ + x[i_coord_offset+DIM*0+ZZ];
132         ix1              = shX + x[i_coord_offset+DIM*1+XX];
133         iy1              = shY + x[i_coord_offset+DIM*1+YY];
134         iz1              = shZ + x[i_coord_offset+DIM*1+ZZ];
135         ix2              = shX + x[i_coord_offset+DIM*2+XX];
136         iy2              = shY + x[i_coord_offset+DIM*2+YY];
137         iz2              = shZ + x[i_coord_offset+DIM*2+ZZ];
138
139         fix0             = 0.0;
140         fiy0             = 0.0;
141         fiz0             = 0.0;
142         fix1             = 0.0;
143         fiy1             = 0.0;
144         fiz1             = 0.0;
145         fix2             = 0.0;
146         fiy2             = 0.0;
147         fiz2             = 0.0;
148
149         /* Reset potential sums */
150         velecsum         = 0.0;
151         vvdwsum          = 0.0;
152
153         /* Start inner kernel loop */
154         for(jidx=j_index_start; jidx<j_index_end; jidx++)
155         {
156             /* Get j neighbor index, and coordinate index */
157             jnr              = jjnr[jidx];
158             j_coord_offset   = DIM*jnr;
159
160             /* load j atom coordinates */
161             jx0              = x[j_coord_offset+DIM*0+XX];
162             jy0              = x[j_coord_offset+DIM*0+YY];
163             jz0              = x[j_coord_offset+DIM*0+ZZ];
164
165             /* Calculate displacement vector */
166             dx00             = ix0 - jx0;
167             dy00             = iy0 - jy0;
168             dz00             = iz0 - jz0;
169             dx10             = ix1 - jx0;
170             dy10             = iy1 - jy0;
171             dz10             = iz1 - jz0;
172             dx20             = ix2 - jx0;
173             dy20             = iy2 - jy0;
174             dz20             = iz2 - jz0;
175
176             /* Calculate squared distance and things based on it */
177             rsq00            = dx00*dx00+dy00*dy00+dz00*dz00;
178             rsq10            = dx10*dx10+dy10*dy10+dz10*dz10;
179             rsq20            = dx20*dx20+dy20*dy20+dz20*dz20;
180
181             rinv00           = gmx_invsqrt(rsq00);
182             rinv10           = gmx_invsqrt(rsq10);
183             rinv20           = gmx_invsqrt(rsq20);
184
185             rinvsq00         = rinv00*rinv00;
186             rinvsq10         = rinv10*rinv10;
187             rinvsq20         = rinv20*rinv20;
188
189             /* Load parameters for j particles */
190             jq0              = charge[jnr+0];
191             vdwjidx0         = 3*vdwtype[jnr+0];
192
193             /**************************
194              * CALCULATE INTERACTIONS *
195              **************************/
196
197             if (rsq00<rcutoff2)
198             {
199
200             r00              = rsq00*rinv00;
201
202             qq00             = iq0*jq0;
203             c6_00            = vdwparam[vdwioffset0+vdwjidx0];
204             cexp1_00         = vdwparam[vdwioffset0+vdwjidx0+1];
205             cexp2_00         = vdwparam[vdwioffset0+vdwjidx0+2];
206
207             /* REACTION-FIELD ELECTROSTATICS */
208             velec            = qq00*(rinv00+krf*rsq00-crf);
209             felec            = qq00*(rinv00*rinvsq00-krf2);
210
211             /* BUCKINGHAM DISPERSION/REPULSION */
212             rinvsix          = rinvsq00*rinvsq00*rinvsq00;
213             vvdw6            = c6_00*rinvsix;
214             br               = cexp2_00*r00;
215             vvdwexp          = cexp1_00*exp(-br);
216             vvdw             = (vvdwexp-cexp1_00*exp(-cexp2_00*rvdw)) - (vvdw6 - c6_00*sh_vdw_invrcut6)*(1.0/6.0);
217             fvdw             = (br*vvdwexp-vvdw6)*rinvsq00;
218
219             /* Update potential sums from outer loop */
220             velecsum        += velec;
221             vvdwsum         += vvdw;
222
223             fscal            = felec+fvdw;
224
225             /* Calculate temporary vectorial force */
226             tx               = fscal*dx00;
227             ty               = fscal*dy00;
228             tz               = fscal*dz00;
229
230             /* Update vectorial force */
231             fix0            += tx;
232             fiy0            += ty;
233             fiz0            += tz;
234             f[j_coord_offset+DIM*0+XX] -= tx;
235             f[j_coord_offset+DIM*0+YY] -= ty;
236             f[j_coord_offset+DIM*0+ZZ] -= tz;
237
238             }
239
240             /**************************
241              * CALCULATE INTERACTIONS *
242              **************************/
243
244             if (rsq10<rcutoff2)
245             {
246
247             qq10             = iq1*jq0;
248
249             /* REACTION-FIELD ELECTROSTATICS */
250             velec            = qq10*(rinv10+krf*rsq10-crf);
251             felec            = qq10*(rinv10*rinvsq10-krf2);
252
253             /* Update potential sums from outer loop */
254             velecsum        += velec;
255
256             fscal            = felec;
257
258             /* Calculate temporary vectorial force */
259             tx               = fscal*dx10;
260             ty               = fscal*dy10;
261             tz               = fscal*dz10;
262
263             /* Update vectorial force */
264             fix1            += tx;
265             fiy1            += ty;
266             fiz1            += tz;
267             f[j_coord_offset+DIM*0+XX] -= tx;
268             f[j_coord_offset+DIM*0+YY] -= ty;
269             f[j_coord_offset+DIM*0+ZZ] -= tz;
270
271             }
272
273             /**************************
274              * CALCULATE INTERACTIONS *
275              **************************/
276
277             if (rsq20<rcutoff2)
278             {
279
280             qq20             = iq2*jq0;
281
282             /* REACTION-FIELD ELECTROSTATICS */
283             velec            = qq20*(rinv20+krf*rsq20-crf);
284             felec            = qq20*(rinv20*rinvsq20-krf2);
285
286             /* Update potential sums from outer loop */
287             velecsum        += velec;
288
289             fscal            = felec;
290
291             /* Calculate temporary vectorial force */
292             tx               = fscal*dx20;
293             ty               = fscal*dy20;
294             tz               = fscal*dz20;
295
296             /* Update vectorial force */
297             fix2            += tx;
298             fiy2            += ty;
299             fiz2            += tz;
300             f[j_coord_offset+DIM*0+XX] -= tx;
301             f[j_coord_offset+DIM*0+YY] -= ty;
302             f[j_coord_offset+DIM*0+ZZ] -= tz;
303
304             }
305
306             /* Inner loop uses 166 flops */
307         }
308         /* End of innermost loop */
309
310         tx = ty = tz = 0;
311         f[i_coord_offset+DIM*0+XX] += fix0;
312         f[i_coord_offset+DIM*0+YY] += fiy0;
313         f[i_coord_offset+DIM*0+ZZ] += fiz0;
314         tx                         += fix0;
315         ty                         += fiy0;
316         tz                         += fiz0;
317         f[i_coord_offset+DIM*1+XX] += fix1;
318         f[i_coord_offset+DIM*1+YY] += fiy1;
319         f[i_coord_offset+DIM*1+ZZ] += fiz1;
320         tx                         += fix1;
321         ty                         += fiy1;
322         tz                         += fiz1;
323         f[i_coord_offset+DIM*2+XX] += fix2;
324         f[i_coord_offset+DIM*2+YY] += fiy2;
325         f[i_coord_offset+DIM*2+ZZ] += fiz2;
326         tx                         += fix2;
327         ty                         += fiy2;
328         tz                         += fiz2;
329         fshift[i_shift_offset+XX]  += tx;
330         fshift[i_shift_offset+YY]  += ty;
331         fshift[i_shift_offset+ZZ]  += tz;
332
333         ggid                        = gid[iidx];
334         /* Update potential energies */
335         kernel_data->energygrp_elec[ggid] += velecsum;
336         kernel_data->energygrp_vdw[ggid] += vvdwsum;
337
338         /* Increment number of inner iterations */
339         inneriter                  += j_index_end - j_index_start;
340
341         /* Outer loop uses 32 flops */
342     }
343
344     /* Increment number of outer iterations */
345     outeriter        += nri;
346
347     /* Update outer/inner flops */
348
349     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3_VF,outeriter*32 + inneriter*166);
350 }
351 /*
352  * Gromacs nonbonded kernel:   nb_kernel_ElecRFCut_VdwBhamSh_GeomW3P1_F_c
353  * Electrostatics interaction: ReactionField
354  * VdW interaction:            Buckingham
355  * Geometry:                   Water3-Particle
356  * Calculate force/pot:        Force
357  */
358 void
359 nb_kernel_ElecRFCut_VdwBhamSh_GeomW3P1_F_c
360                     (t_nblist * gmx_restrict                nlist,
361                      rvec * gmx_restrict                    xx,
362                      rvec * gmx_restrict                    ff,
363                      t_forcerec * gmx_restrict              fr,
364                      t_mdatoms * gmx_restrict               mdatoms,
365                      nb_kernel_data_t * gmx_restrict        kernel_data,
366                      t_nrnb * gmx_restrict                  nrnb)
367 {
368     int              i_shift_offset,i_coord_offset,j_coord_offset;
369     int              j_index_start,j_index_end;
370     int              nri,inr,ggid,iidx,jidx,jnr,outeriter,inneriter;
371     real             shX,shY,shZ,tx,ty,tz,fscal,rcutoff,rcutoff2;
372     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
373     real             *shiftvec,*fshift,*x,*f;
374     int              vdwioffset0;
375     real             ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
376     int              vdwioffset1;
377     real             ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
378     int              vdwioffset2;
379     real             ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
380     int              vdwjidx0;
381     real             jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
382     real             dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00,cexp1_00,cexp2_00;
383     real             dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10,cexp1_10,cexp2_10;
384     real             dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20,cexp1_20,cexp2_20;
385     real             velec,felec,velecsum,facel,crf,krf,krf2;
386     real             *charge;
387     int              nvdwtype;
388     real             rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,br,vvdwexp,sh_vdw_invrcut6;
389     int              *vdwtype;
390     real             *vdwparam;
391
392     x                = xx[0];
393     f                = ff[0];
394
395     nri              = nlist->nri;
396     iinr             = nlist->iinr;
397     jindex           = nlist->jindex;
398     jjnr             = nlist->jjnr;
399     shiftidx         = nlist->shift;
400     gid              = nlist->gid;
401     shiftvec         = fr->shift_vec[0];
402     fshift           = fr->fshift[0];
403     facel            = fr->epsfac;
404     charge           = mdatoms->chargeA;
405     krf              = fr->ic->k_rf;
406     krf2             = krf*2.0;
407     crf              = fr->ic->c_rf;
408     nvdwtype         = fr->ntype;
409     vdwparam         = fr->nbfp;
410     vdwtype          = mdatoms->typeA;
411
412     /* Setup water-specific parameters */
413     inr              = nlist->iinr[0];
414     iq0              = facel*charge[inr+0];
415     iq1              = facel*charge[inr+1];
416     iq2              = facel*charge[inr+2];
417     vdwioffset0      = 3*nvdwtype*vdwtype[inr+0];
418
419     /* When we use explicit cutoffs the value must be identical for elec and VdW, so use elec as an arbitrary choice */
420     rcutoff          = fr->rcoulomb;
421     rcutoff2         = rcutoff*rcutoff;
422
423     sh_vdw_invrcut6  = fr->ic->sh_invrc6;
424     rvdw             = fr->rvdw;
425
426     outeriter        = 0;
427     inneriter        = 0;
428
429     /* Start outer loop over neighborlists */
430     for(iidx=0; iidx<nri; iidx++)
431     {
432         /* Load shift vector for this list */
433         i_shift_offset   = DIM*shiftidx[iidx];
434         shX              = shiftvec[i_shift_offset+XX];
435         shY              = shiftvec[i_shift_offset+YY];
436         shZ              = shiftvec[i_shift_offset+ZZ];
437
438         /* Load limits for loop over neighbors */
439         j_index_start    = jindex[iidx];
440         j_index_end      = jindex[iidx+1];
441
442         /* Get outer coordinate index */
443         inr              = iinr[iidx];
444         i_coord_offset   = DIM*inr;
445
446         /* Load i particle coords and add shift vector */
447         ix0              = shX + x[i_coord_offset+DIM*0+XX];
448         iy0              = shY + x[i_coord_offset+DIM*0+YY];
449         iz0              = shZ + x[i_coord_offset+DIM*0+ZZ];
450         ix1              = shX + x[i_coord_offset+DIM*1+XX];
451         iy1              = shY + x[i_coord_offset+DIM*1+YY];
452         iz1              = shZ + x[i_coord_offset+DIM*1+ZZ];
453         ix2              = shX + x[i_coord_offset+DIM*2+XX];
454         iy2              = shY + x[i_coord_offset+DIM*2+YY];
455         iz2              = shZ + x[i_coord_offset+DIM*2+ZZ];
456
457         fix0             = 0.0;
458         fiy0             = 0.0;
459         fiz0             = 0.0;
460         fix1             = 0.0;
461         fiy1             = 0.0;
462         fiz1             = 0.0;
463         fix2             = 0.0;
464         fiy2             = 0.0;
465         fiz2             = 0.0;
466
467         /* Start inner kernel loop */
468         for(jidx=j_index_start; jidx<j_index_end; jidx++)
469         {
470             /* Get j neighbor index, and coordinate index */
471             jnr              = jjnr[jidx];
472             j_coord_offset   = DIM*jnr;
473
474             /* load j atom coordinates */
475             jx0              = x[j_coord_offset+DIM*0+XX];
476             jy0              = x[j_coord_offset+DIM*0+YY];
477             jz0              = x[j_coord_offset+DIM*0+ZZ];
478
479             /* Calculate displacement vector */
480             dx00             = ix0 - jx0;
481             dy00             = iy0 - jy0;
482             dz00             = iz0 - jz0;
483             dx10             = ix1 - jx0;
484             dy10             = iy1 - jy0;
485             dz10             = iz1 - jz0;
486             dx20             = ix2 - jx0;
487             dy20             = iy2 - jy0;
488             dz20             = iz2 - jz0;
489
490             /* Calculate squared distance and things based on it */
491             rsq00            = dx00*dx00+dy00*dy00+dz00*dz00;
492             rsq10            = dx10*dx10+dy10*dy10+dz10*dz10;
493             rsq20            = dx20*dx20+dy20*dy20+dz20*dz20;
494
495             rinv00           = gmx_invsqrt(rsq00);
496             rinv10           = gmx_invsqrt(rsq10);
497             rinv20           = gmx_invsqrt(rsq20);
498
499             rinvsq00         = rinv00*rinv00;
500             rinvsq10         = rinv10*rinv10;
501             rinvsq20         = rinv20*rinv20;
502
503             /* Load parameters for j particles */
504             jq0              = charge[jnr+0];
505             vdwjidx0         = 3*vdwtype[jnr+0];
506
507             /**************************
508              * CALCULATE INTERACTIONS *
509              **************************/
510
511             if (rsq00<rcutoff2)
512             {
513
514             r00              = rsq00*rinv00;
515
516             qq00             = iq0*jq0;
517             c6_00            = vdwparam[vdwioffset0+vdwjidx0];
518             cexp1_00         = vdwparam[vdwioffset0+vdwjidx0+1];
519             cexp2_00         = vdwparam[vdwioffset0+vdwjidx0+2];
520
521             /* REACTION-FIELD ELECTROSTATICS */
522             felec            = qq00*(rinv00*rinvsq00-krf2);
523
524             /* BUCKINGHAM DISPERSION/REPULSION */
525             rinvsix          = rinvsq00*rinvsq00*rinvsq00;
526             vvdw6            = c6_00*rinvsix;
527             br               = cexp2_00*r00;
528             vvdwexp          = cexp1_00*exp(-br);
529             fvdw             = (br*vvdwexp-vvdw6)*rinvsq00;
530
531             fscal            = felec+fvdw;
532
533             /* Calculate temporary vectorial force */
534             tx               = fscal*dx00;
535             ty               = fscal*dy00;
536             tz               = fscal*dz00;
537
538             /* Update vectorial force */
539             fix0            += tx;
540             fiy0            += ty;
541             fiz0            += tz;
542             f[j_coord_offset+DIM*0+XX] -= tx;
543             f[j_coord_offset+DIM*0+YY] -= ty;
544             f[j_coord_offset+DIM*0+ZZ] -= tz;
545
546             }
547
548             /**************************
549              * CALCULATE INTERACTIONS *
550              **************************/
551
552             if (rsq10<rcutoff2)
553             {
554
555             qq10             = iq1*jq0;
556
557             /* REACTION-FIELD ELECTROSTATICS */
558             felec            = qq10*(rinv10*rinvsq10-krf2);
559
560             fscal            = felec;
561
562             /* Calculate temporary vectorial force */
563             tx               = fscal*dx10;
564             ty               = fscal*dy10;
565             tz               = fscal*dz10;
566
567             /* Update vectorial force */
568             fix1            += tx;
569             fiy1            += ty;
570             fiz1            += tz;
571             f[j_coord_offset+DIM*0+XX] -= tx;
572             f[j_coord_offset+DIM*0+YY] -= ty;
573             f[j_coord_offset+DIM*0+ZZ] -= tz;
574
575             }
576
577             /**************************
578              * CALCULATE INTERACTIONS *
579              **************************/
580
581             if (rsq20<rcutoff2)
582             {
583
584             qq20             = iq2*jq0;
585
586             /* REACTION-FIELD ELECTROSTATICS */
587             felec            = qq20*(rinv20*rinvsq20-krf2);
588
589             fscal            = felec;
590
591             /* Calculate temporary vectorial force */
592             tx               = fscal*dx20;
593             ty               = fscal*dy20;
594             tz               = fscal*dz20;
595
596             /* Update vectorial force */
597             fix2            += tx;
598             fiy2            += ty;
599             fiz2            += tz;
600             f[j_coord_offset+DIM*0+XX] -= tx;
601             f[j_coord_offset+DIM*0+YY] -= ty;
602             f[j_coord_offset+DIM*0+ZZ] -= tz;
603
604             }
605
606             /* Inner loop uses 117 flops */
607         }
608         /* End of innermost loop */
609
610         tx = ty = tz = 0;
611         f[i_coord_offset+DIM*0+XX] += fix0;
612         f[i_coord_offset+DIM*0+YY] += fiy0;
613         f[i_coord_offset+DIM*0+ZZ] += fiz0;
614         tx                         += fix0;
615         ty                         += fiy0;
616         tz                         += fiz0;
617         f[i_coord_offset+DIM*1+XX] += fix1;
618         f[i_coord_offset+DIM*1+YY] += fiy1;
619         f[i_coord_offset+DIM*1+ZZ] += fiz1;
620         tx                         += fix1;
621         ty                         += fiy1;
622         tz                         += fiz1;
623         f[i_coord_offset+DIM*2+XX] += fix2;
624         f[i_coord_offset+DIM*2+YY] += fiy2;
625         f[i_coord_offset+DIM*2+ZZ] += fiz2;
626         tx                         += fix2;
627         ty                         += fiy2;
628         tz                         += fiz2;
629         fshift[i_shift_offset+XX]  += tx;
630         fshift[i_shift_offset+YY]  += ty;
631         fshift[i_shift_offset+ZZ]  += tz;
632
633         /* Increment number of inner iterations */
634         inneriter                  += j_index_end - j_index_start;
635
636         /* Outer loop uses 30 flops */
637     }
638
639     /* Increment number of outer iterations */
640     outeriter        += nri;
641
642     /* Update outer/inner flops */
643
644     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3_F,outeriter*30 + inneriter*117);
645 }