Remove all unnecessary HAVE_CONFIG_H
[alexxy/gromacs.git] / src / gromacs / gmxlib / nonbonded / nb_kernel_c / nb_kernel_ElecRF_VdwBham_GeomW4W4_c.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012,2013,2014, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 /*
36  * Note: this file was generated by the GROMACS c kernel generator.
37  */
38 #include "config.h"
39
40 #include <math.h>
41
42 #include "../nb_kernel.h"
43 #include "types/simple.h"
44 #include "gromacs/math/vec.h"
45 #include "nrnb.h"
46
47 /*
48  * Gromacs nonbonded kernel:   nb_kernel_ElecRF_VdwBham_GeomW4W4_VF_c
49  * Electrostatics interaction: ReactionField
50  * VdW interaction:            Buckingham
51  * Geometry:                   Water4-Water4
52  * Calculate force/pot:        PotentialAndForce
53  */
54 void
55 nb_kernel_ElecRF_VdwBham_GeomW4W4_VF_c
56                     (t_nblist                    * gmx_restrict       nlist,
57                      rvec                        * gmx_restrict          xx,
58                      rvec                        * gmx_restrict          ff,
59                      t_forcerec                  * gmx_restrict          fr,
60                      t_mdatoms                   * gmx_restrict     mdatoms,
61                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
62                      t_nrnb                      * gmx_restrict        nrnb)
63 {
64     int              i_shift_offset,i_coord_offset,j_coord_offset;
65     int              j_index_start,j_index_end;
66     int              nri,inr,ggid,iidx,jidx,jnr,outeriter,inneriter;
67     real             shX,shY,shZ,tx,ty,tz,fscal,rcutoff,rcutoff2;
68     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
69     real             *shiftvec,*fshift,*x,*f;
70     int              vdwioffset0;
71     real             ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
72     int              vdwioffset1;
73     real             ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
74     int              vdwioffset2;
75     real             ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
76     int              vdwioffset3;
77     real             ix3,iy3,iz3,fix3,fiy3,fiz3,iq3,isai3;
78     int              vdwjidx0;
79     real             jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
80     int              vdwjidx1;
81     real             jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
82     int              vdwjidx2;
83     real             jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
84     int              vdwjidx3;
85     real             jx3,jy3,jz3,fjx3,fjy3,fjz3,jq3,isaj3;
86     real             dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00,cexp1_00,cexp2_00;
87     real             dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11,cexp1_11,cexp2_11;
88     real             dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12,cexp1_12,cexp2_12;
89     real             dx13,dy13,dz13,rsq13,rinv13,rinvsq13,r13,qq13,c6_13,c12_13,cexp1_13,cexp2_13;
90     real             dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21,cexp1_21,cexp2_21;
91     real             dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22,cexp1_22,cexp2_22;
92     real             dx23,dy23,dz23,rsq23,rinv23,rinvsq23,r23,qq23,c6_23,c12_23,cexp1_23,cexp2_23;
93     real             dx31,dy31,dz31,rsq31,rinv31,rinvsq31,r31,qq31,c6_31,c12_31,cexp1_31,cexp2_31;
94     real             dx32,dy32,dz32,rsq32,rinv32,rinvsq32,r32,qq32,c6_32,c12_32,cexp1_32,cexp2_32;
95     real             dx33,dy33,dz33,rsq33,rinv33,rinvsq33,r33,qq33,c6_33,c12_33,cexp1_33,cexp2_33;
96     real             velec,felec,velecsum,facel,crf,krf,krf2;
97     real             *charge;
98     int              nvdwtype;
99     real             rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,br,vvdwexp,sh_vdw_invrcut6;
100     int              *vdwtype;
101     real             *vdwparam;
102
103     x                = xx[0];
104     f                = ff[0];
105
106     nri              = nlist->nri;
107     iinr             = nlist->iinr;
108     jindex           = nlist->jindex;
109     jjnr             = nlist->jjnr;
110     shiftidx         = nlist->shift;
111     gid              = nlist->gid;
112     shiftvec         = fr->shift_vec[0];
113     fshift           = fr->fshift[0];
114     facel            = fr->epsfac;
115     charge           = mdatoms->chargeA;
116     krf              = fr->ic->k_rf;
117     krf2             = krf*2.0;
118     crf              = fr->ic->c_rf;
119     nvdwtype         = fr->ntype;
120     vdwparam         = fr->nbfp;
121     vdwtype          = mdatoms->typeA;
122
123     /* Setup water-specific parameters */
124     inr              = nlist->iinr[0];
125     iq1              = facel*charge[inr+1];
126     iq2              = facel*charge[inr+2];
127     iq3              = facel*charge[inr+3];
128     vdwioffset0      = 3*nvdwtype*vdwtype[inr+0];
129
130     jq1              = charge[inr+1];
131     jq2              = charge[inr+2];
132     jq3              = charge[inr+3];
133     vdwjidx0         = 3*vdwtype[inr+0];
134     c6_00            = vdwparam[vdwioffset0+vdwjidx0];
135     cexp1_00         = vdwparam[vdwioffset0+vdwjidx0+1];
136     cexp2_00         = vdwparam[vdwioffset0+vdwjidx0+2];
137     qq11             = iq1*jq1;
138     qq12             = iq1*jq2;
139     qq13             = iq1*jq3;
140     qq21             = iq2*jq1;
141     qq22             = iq2*jq2;
142     qq23             = iq2*jq3;
143     qq31             = iq3*jq1;
144     qq32             = iq3*jq2;
145     qq33             = iq3*jq3;
146
147     outeriter        = 0;
148     inneriter        = 0;
149
150     /* Start outer loop over neighborlists */
151     for(iidx=0; iidx<nri; iidx++)
152     {
153         /* Load shift vector for this list */
154         i_shift_offset   = DIM*shiftidx[iidx];
155         shX              = shiftvec[i_shift_offset+XX];
156         shY              = shiftvec[i_shift_offset+YY];
157         shZ              = shiftvec[i_shift_offset+ZZ];
158
159         /* Load limits for loop over neighbors */
160         j_index_start    = jindex[iidx];
161         j_index_end      = jindex[iidx+1];
162
163         /* Get outer coordinate index */
164         inr              = iinr[iidx];
165         i_coord_offset   = DIM*inr;
166
167         /* Load i particle coords and add shift vector */
168         ix0              = shX + x[i_coord_offset+DIM*0+XX];
169         iy0              = shY + x[i_coord_offset+DIM*0+YY];
170         iz0              = shZ + x[i_coord_offset+DIM*0+ZZ];
171         ix1              = shX + x[i_coord_offset+DIM*1+XX];
172         iy1              = shY + x[i_coord_offset+DIM*1+YY];
173         iz1              = shZ + x[i_coord_offset+DIM*1+ZZ];
174         ix2              = shX + x[i_coord_offset+DIM*2+XX];
175         iy2              = shY + x[i_coord_offset+DIM*2+YY];
176         iz2              = shZ + x[i_coord_offset+DIM*2+ZZ];
177         ix3              = shX + x[i_coord_offset+DIM*3+XX];
178         iy3              = shY + x[i_coord_offset+DIM*3+YY];
179         iz3              = shZ + x[i_coord_offset+DIM*3+ZZ];
180
181         fix0             = 0.0;
182         fiy0             = 0.0;
183         fiz0             = 0.0;
184         fix1             = 0.0;
185         fiy1             = 0.0;
186         fiz1             = 0.0;
187         fix2             = 0.0;
188         fiy2             = 0.0;
189         fiz2             = 0.0;
190         fix3             = 0.0;
191         fiy3             = 0.0;
192         fiz3             = 0.0;
193
194         /* Reset potential sums */
195         velecsum         = 0.0;
196         vvdwsum          = 0.0;
197
198         /* Start inner kernel loop */
199         for(jidx=j_index_start; jidx<j_index_end; jidx++)
200         {
201             /* Get j neighbor index, and coordinate index */
202             jnr              = jjnr[jidx];
203             j_coord_offset   = DIM*jnr;
204
205             /* load j atom coordinates */
206             jx0              = x[j_coord_offset+DIM*0+XX];
207             jy0              = x[j_coord_offset+DIM*0+YY];
208             jz0              = x[j_coord_offset+DIM*0+ZZ];
209             jx1              = x[j_coord_offset+DIM*1+XX];
210             jy1              = x[j_coord_offset+DIM*1+YY];
211             jz1              = x[j_coord_offset+DIM*1+ZZ];
212             jx2              = x[j_coord_offset+DIM*2+XX];
213             jy2              = x[j_coord_offset+DIM*2+YY];
214             jz2              = x[j_coord_offset+DIM*2+ZZ];
215             jx3              = x[j_coord_offset+DIM*3+XX];
216             jy3              = x[j_coord_offset+DIM*3+YY];
217             jz3              = x[j_coord_offset+DIM*3+ZZ];
218
219             /* Calculate displacement vector */
220             dx00             = ix0 - jx0;
221             dy00             = iy0 - jy0;
222             dz00             = iz0 - jz0;
223             dx11             = ix1 - jx1;
224             dy11             = iy1 - jy1;
225             dz11             = iz1 - jz1;
226             dx12             = ix1 - jx2;
227             dy12             = iy1 - jy2;
228             dz12             = iz1 - jz2;
229             dx13             = ix1 - jx3;
230             dy13             = iy1 - jy3;
231             dz13             = iz1 - jz3;
232             dx21             = ix2 - jx1;
233             dy21             = iy2 - jy1;
234             dz21             = iz2 - jz1;
235             dx22             = ix2 - jx2;
236             dy22             = iy2 - jy2;
237             dz22             = iz2 - jz2;
238             dx23             = ix2 - jx3;
239             dy23             = iy2 - jy3;
240             dz23             = iz2 - jz3;
241             dx31             = ix3 - jx1;
242             dy31             = iy3 - jy1;
243             dz31             = iz3 - jz1;
244             dx32             = ix3 - jx2;
245             dy32             = iy3 - jy2;
246             dz32             = iz3 - jz2;
247             dx33             = ix3 - jx3;
248             dy33             = iy3 - jy3;
249             dz33             = iz3 - jz3;
250
251             /* Calculate squared distance and things based on it */
252             rsq00            = dx00*dx00+dy00*dy00+dz00*dz00;
253             rsq11            = dx11*dx11+dy11*dy11+dz11*dz11;
254             rsq12            = dx12*dx12+dy12*dy12+dz12*dz12;
255             rsq13            = dx13*dx13+dy13*dy13+dz13*dz13;
256             rsq21            = dx21*dx21+dy21*dy21+dz21*dz21;
257             rsq22            = dx22*dx22+dy22*dy22+dz22*dz22;
258             rsq23            = dx23*dx23+dy23*dy23+dz23*dz23;
259             rsq31            = dx31*dx31+dy31*dy31+dz31*dz31;
260             rsq32            = dx32*dx32+dy32*dy32+dz32*dz32;
261             rsq33            = dx33*dx33+dy33*dy33+dz33*dz33;
262
263             rinv00           = gmx_invsqrt(rsq00);
264             rinv11           = gmx_invsqrt(rsq11);
265             rinv12           = gmx_invsqrt(rsq12);
266             rinv13           = gmx_invsqrt(rsq13);
267             rinv21           = gmx_invsqrt(rsq21);
268             rinv22           = gmx_invsqrt(rsq22);
269             rinv23           = gmx_invsqrt(rsq23);
270             rinv31           = gmx_invsqrt(rsq31);
271             rinv32           = gmx_invsqrt(rsq32);
272             rinv33           = gmx_invsqrt(rsq33);
273
274             rinvsq00         = rinv00*rinv00;
275             rinvsq11         = rinv11*rinv11;
276             rinvsq12         = rinv12*rinv12;
277             rinvsq13         = rinv13*rinv13;
278             rinvsq21         = rinv21*rinv21;
279             rinvsq22         = rinv22*rinv22;
280             rinvsq23         = rinv23*rinv23;
281             rinvsq31         = rinv31*rinv31;
282             rinvsq32         = rinv32*rinv32;
283             rinvsq33         = rinv33*rinv33;
284
285             /**************************
286              * CALCULATE INTERACTIONS *
287              **************************/
288
289             r00              = rsq00*rinv00;
290
291             /* BUCKINGHAM DISPERSION/REPULSION */
292             rinvsix          = rinvsq00*rinvsq00*rinvsq00;
293             vvdw6            = c6_00*rinvsix;
294             br               = cexp2_00*r00;
295             vvdwexp          = cexp1_00*exp(-br);
296             vvdw             = vvdwexp - vvdw6*(1.0/6.0);
297             fvdw             = (br*vvdwexp-vvdw6)*rinvsq00;
298
299             /* Update potential sums from outer loop */
300             vvdwsum         += vvdw;
301
302             fscal            = fvdw;
303
304             /* Calculate temporary vectorial force */
305             tx               = fscal*dx00;
306             ty               = fscal*dy00;
307             tz               = fscal*dz00;
308
309             /* Update vectorial force */
310             fix0            += tx;
311             fiy0            += ty;
312             fiz0            += tz;
313             f[j_coord_offset+DIM*0+XX] -= tx;
314             f[j_coord_offset+DIM*0+YY] -= ty;
315             f[j_coord_offset+DIM*0+ZZ] -= tz;
316
317             /**************************
318              * CALCULATE INTERACTIONS *
319              **************************/
320
321             /* REACTION-FIELD ELECTROSTATICS */
322             velec            = qq11*(rinv11+krf*rsq11-crf);
323             felec            = qq11*(rinv11*rinvsq11-krf2);
324
325             /* Update potential sums from outer loop */
326             velecsum        += velec;
327
328             fscal            = felec;
329
330             /* Calculate temporary vectorial force */
331             tx               = fscal*dx11;
332             ty               = fscal*dy11;
333             tz               = fscal*dz11;
334
335             /* Update vectorial force */
336             fix1            += tx;
337             fiy1            += ty;
338             fiz1            += tz;
339             f[j_coord_offset+DIM*1+XX] -= tx;
340             f[j_coord_offset+DIM*1+YY] -= ty;
341             f[j_coord_offset+DIM*1+ZZ] -= tz;
342
343             /**************************
344              * CALCULATE INTERACTIONS *
345              **************************/
346
347             /* REACTION-FIELD ELECTROSTATICS */
348             velec            = qq12*(rinv12+krf*rsq12-crf);
349             felec            = qq12*(rinv12*rinvsq12-krf2);
350
351             /* Update potential sums from outer loop */
352             velecsum        += velec;
353
354             fscal            = felec;
355
356             /* Calculate temporary vectorial force */
357             tx               = fscal*dx12;
358             ty               = fscal*dy12;
359             tz               = fscal*dz12;
360
361             /* Update vectorial force */
362             fix1            += tx;
363             fiy1            += ty;
364             fiz1            += tz;
365             f[j_coord_offset+DIM*2+XX] -= tx;
366             f[j_coord_offset+DIM*2+YY] -= ty;
367             f[j_coord_offset+DIM*2+ZZ] -= tz;
368
369             /**************************
370              * CALCULATE INTERACTIONS *
371              **************************/
372
373             /* REACTION-FIELD ELECTROSTATICS */
374             velec            = qq13*(rinv13+krf*rsq13-crf);
375             felec            = qq13*(rinv13*rinvsq13-krf2);
376
377             /* Update potential sums from outer loop */
378             velecsum        += velec;
379
380             fscal            = felec;
381
382             /* Calculate temporary vectorial force */
383             tx               = fscal*dx13;
384             ty               = fscal*dy13;
385             tz               = fscal*dz13;
386
387             /* Update vectorial force */
388             fix1            += tx;
389             fiy1            += ty;
390             fiz1            += tz;
391             f[j_coord_offset+DIM*3+XX] -= tx;
392             f[j_coord_offset+DIM*3+YY] -= ty;
393             f[j_coord_offset+DIM*3+ZZ] -= tz;
394
395             /**************************
396              * CALCULATE INTERACTIONS *
397              **************************/
398
399             /* REACTION-FIELD ELECTROSTATICS */
400             velec            = qq21*(rinv21+krf*rsq21-crf);
401             felec            = qq21*(rinv21*rinvsq21-krf2);
402
403             /* Update potential sums from outer loop */
404             velecsum        += velec;
405
406             fscal            = felec;
407
408             /* Calculate temporary vectorial force */
409             tx               = fscal*dx21;
410             ty               = fscal*dy21;
411             tz               = fscal*dz21;
412
413             /* Update vectorial force */
414             fix2            += tx;
415             fiy2            += ty;
416             fiz2            += tz;
417             f[j_coord_offset+DIM*1+XX] -= tx;
418             f[j_coord_offset+DIM*1+YY] -= ty;
419             f[j_coord_offset+DIM*1+ZZ] -= tz;
420
421             /**************************
422              * CALCULATE INTERACTIONS *
423              **************************/
424
425             /* REACTION-FIELD ELECTROSTATICS */
426             velec            = qq22*(rinv22+krf*rsq22-crf);
427             felec            = qq22*(rinv22*rinvsq22-krf2);
428
429             /* Update potential sums from outer loop */
430             velecsum        += velec;
431
432             fscal            = felec;
433
434             /* Calculate temporary vectorial force */
435             tx               = fscal*dx22;
436             ty               = fscal*dy22;
437             tz               = fscal*dz22;
438
439             /* Update vectorial force */
440             fix2            += tx;
441             fiy2            += ty;
442             fiz2            += tz;
443             f[j_coord_offset+DIM*2+XX] -= tx;
444             f[j_coord_offset+DIM*2+YY] -= ty;
445             f[j_coord_offset+DIM*2+ZZ] -= tz;
446
447             /**************************
448              * CALCULATE INTERACTIONS *
449              **************************/
450
451             /* REACTION-FIELD ELECTROSTATICS */
452             velec            = qq23*(rinv23+krf*rsq23-crf);
453             felec            = qq23*(rinv23*rinvsq23-krf2);
454
455             /* Update potential sums from outer loop */
456             velecsum        += velec;
457
458             fscal            = felec;
459
460             /* Calculate temporary vectorial force */
461             tx               = fscal*dx23;
462             ty               = fscal*dy23;
463             tz               = fscal*dz23;
464
465             /* Update vectorial force */
466             fix2            += tx;
467             fiy2            += ty;
468             fiz2            += tz;
469             f[j_coord_offset+DIM*3+XX] -= tx;
470             f[j_coord_offset+DIM*3+YY] -= ty;
471             f[j_coord_offset+DIM*3+ZZ] -= tz;
472
473             /**************************
474              * CALCULATE INTERACTIONS *
475              **************************/
476
477             /* REACTION-FIELD ELECTROSTATICS */
478             velec            = qq31*(rinv31+krf*rsq31-crf);
479             felec            = qq31*(rinv31*rinvsq31-krf2);
480
481             /* Update potential sums from outer loop */
482             velecsum        += velec;
483
484             fscal            = felec;
485
486             /* Calculate temporary vectorial force */
487             tx               = fscal*dx31;
488             ty               = fscal*dy31;
489             tz               = fscal*dz31;
490
491             /* Update vectorial force */
492             fix3            += tx;
493             fiy3            += ty;
494             fiz3            += tz;
495             f[j_coord_offset+DIM*1+XX] -= tx;
496             f[j_coord_offset+DIM*1+YY] -= ty;
497             f[j_coord_offset+DIM*1+ZZ] -= tz;
498
499             /**************************
500              * CALCULATE INTERACTIONS *
501              **************************/
502
503             /* REACTION-FIELD ELECTROSTATICS */
504             velec            = qq32*(rinv32+krf*rsq32-crf);
505             felec            = qq32*(rinv32*rinvsq32-krf2);
506
507             /* Update potential sums from outer loop */
508             velecsum        += velec;
509
510             fscal            = felec;
511
512             /* Calculate temporary vectorial force */
513             tx               = fscal*dx32;
514             ty               = fscal*dy32;
515             tz               = fscal*dz32;
516
517             /* Update vectorial force */
518             fix3            += tx;
519             fiy3            += ty;
520             fiz3            += tz;
521             f[j_coord_offset+DIM*2+XX] -= tx;
522             f[j_coord_offset+DIM*2+YY] -= ty;
523             f[j_coord_offset+DIM*2+ZZ] -= tz;
524
525             /**************************
526              * CALCULATE INTERACTIONS *
527              **************************/
528
529             /* REACTION-FIELD ELECTROSTATICS */
530             velec            = qq33*(rinv33+krf*rsq33-crf);
531             felec            = qq33*(rinv33*rinvsq33-krf2);
532
533             /* Update potential sums from outer loop */
534             velecsum        += velec;
535
536             fscal            = felec;
537
538             /* Calculate temporary vectorial force */
539             tx               = fscal*dx33;
540             ty               = fscal*dy33;
541             tz               = fscal*dz33;
542
543             /* Update vectorial force */
544             fix3            += tx;
545             fiy3            += ty;
546             fiz3            += tz;
547             f[j_coord_offset+DIM*3+XX] -= tx;
548             f[j_coord_offset+DIM*3+YY] -= ty;
549             f[j_coord_offset+DIM*3+ZZ] -= tz;
550
551             /* Inner loop uses 340 flops */
552         }
553         /* End of innermost loop */
554
555         tx = ty = tz = 0;
556         f[i_coord_offset+DIM*0+XX] += fix0;
557         f[i_coord_offset+DIM*0+YY] += fiy0;
558         f[i_coord_offset+DIM*0+ZZ] += fiz0;
559         tx                         += fix0;
560         ty                         += fiy0;
561         tz                         += fiz0;
562         f[i_coord_offset+DIM*1+XX] += fix1;
563         f[i_coord_offset+DIM*1+YY] += fiy1;
564         f[i_coord_offset+DIM*1+ZZ] += fiz1;
565         tx                         += fix1;
566         ty                         += fiy1;
567         tz                         += fiz1;
568         f[i_coord_offset+DIM*2+XX] += fix2;
569         f[i_coord_offset+DIM*2+YY] += fiy2;
570         f[i_coord_offset+DIM*2+ZZ] += fiz2;
571         tx                         += fix2;
572         ty                         += fiy2;
573         tz                         += fiz2;
574         f[i_coord_offset+DIM*3+XX] += fix3;
575         f[i_coord_offset+DIM*3+YY] += fiy3;
576         f[i_coord_offset+DIM*3+ZZ] += fiz3;
577         tx                         += fix3;
578         ty                         += fiy3;
579         tz                         += fiz3;
580         fshift[i_shift_offset+XX]  += tx;
581         fshift[i_shift_offset+YY]  += ty;
582         fshift[i_shift_offset+ZZ]  += tz;
583
584         ggid                        = gid[iidx];
585         /* Update potential energies */
586         kernel_data->energygrp_elec[ggid] += velecsum;
587         kernel_data->energygrp_vdw[ggid] += vvdwsum;
588
589         /* Increment number of inner iterations */
590         inneriter                  += j_index_end - j_index_start;
591
592         /* Outer loop uses 41 flops */
593     }
594
595     /* Increment number of outer iterations */
596     outeriter        += nri;
597
598     /* Update outer/inner flops */
599
600     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W4W4_VF,outeriter*41 + inneriter*340);
601 }
602 /*
603  * Gromacs nonbonded kernel:   nb_kernel_ElecRF_VdwBham_GeomW4W4_F_c
604  * Electrostatics interaction: ReactionField
605  * VdW interaction:            Buckingham
606  * Geometry:                   Water4-Water4
607  * Calculate force/pot:        Force
608  */
609 void
610 nb_kernel_ElecRF_VdwBham_GeomW4W4_F_c
611                     (t_nblist                    * gmx_restrict       nlist,
612                      rvec                        * gmx_restrict          xx,
613                      rvec                        * gmx_restrict          ff,
614                      t_forcerec                  * gmx_restrict          fr,
615                      t_mdatoms                   * gmx_restrict     mdatoms,
616                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
617                      t_nrnb                      * gmx_restrict        nrnb)
618 {
619     int              i_shift_offset,i_coord_offset,j_coord_offset;
620     int              j_index_start,j_index_end;
621     int              nri,inr,ggid,iidx,jidx,jnr,outeriter,inneriter;
622     real             shX,shY,shZ,tx,ty,tz,fscal,rcutoff,rcutoff2;
623     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
624     real             *shiftvec,*fshift,*x,*f;
625     int              vdwioffset0;
626     real             ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
627     int              vdwioffset1;
628     real             ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
629     int              vdwioffset2;
630     real             ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
631     int              vdwioffset3;
632     real             ix3,iy3,iz3,fix3,fiy3,fiz3,iq3,isai3;
633     int              vdwjidx0;
634     real             jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
635     int              vdwjidx1;
636     real             jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
637     int              vdwjidx2;
638     real             jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
639     int              vdwjidx3;
640     real             jx3,jy3,jz3,fjx3,fjy3,fjz3,jq3,isaj3;
641     real             dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00,cexp1_00,cexp2_00;
642     real             dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11,cexp1_11,cexp2_11;
643     real             dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12,cexp1_12,cexp2_12;
644     real             dx13,dy13,dz13,rsq13,rinv13,rinvsq13,r13,qq13,c6_13,c12_13,cexp1_13,cexp2_13;
645     real             dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21,cexp1_21,cexp2_21;
646     real             dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22,cexp1_22,cexp2_22;
647     real             dx23,dy23,dz23,rsq23,rinv23,rinvsq23,r23,qq23,c6_23,c12_23,cexp1_23,cexp2_23;
648     real             dx31,dy31,dz31,rsq31,rinv31,rinvsq31,r31,qq31,c6_31,c12_31,cexp1_31,cexp2_31;
649     real             dx32,dy32,dz32,rsq32,rinv32,rinvsq32,r32,qq32,c6_32,c12_32,cexp1_32,cexp2_32;
650     real             dx33,dy33,dz33,rsq33,rinv33,rinvsq33,r33,qq33,c6_33,c12_33,cexp1_33,cexp2_33;
651     real             velec,felec,velecsum,facel,crf,krf,krf2;
652     real             *charge;
653     int              nvdwtype;
654     real             rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,br,vvdwexp,sh_vdw_invrcut6;
655     int              *vdwtype;
656     real             *vdwparam;
657
658     x                = xx[0];
659     f                = ff[0];
660
661     nri              = nlist->nri;
662     iinr             = nlist->iinr;
663     jindex           = nlist->jindex;
664     jjnr             = nlist->jjnr;
665     shiftidx         = nlist->shift;
666     gid              = nlist->gid;
667     shiftvec         = fr->shift_vec[0];
668     fshift           = fr->fshift[0];
669     facel            = fr->epsfac;
670     charge           = mdatoms->chargeA;
671     krf              = fr->ic->k_rf;
672     krf2             = krf*2.0;
673     crf              = fr->ic->c_rf;
674     nvdwtype         = fr->ntype;
675     vdwparam         = fr->nbfp;
676     vdwtype          = mdatoms->typeA;
677
678     /* Setup water-specific parameters */
679     inr              = nlist->iinr[0];
680     iq1              = facel*charge[inr+1];
681     iq2              = facel*charge[inr+2];
682     iq3              = facel*charge[inr+3];
683     vdwioffset0      = 3*nvdwtype*vdwtype[inr+0];
684
685     jq1              = charge[inr+1];
686     jq2              = charge[inr+2];
687     jq3              = charge[inr+3];
688     vdwjidx0         = 3*vdwtype[inr+0];
689     c6_00            = vdwparam[vdwioffset0+vdwjidx0];
690     cexp1_00         = vdwparam[vdwioffset0+vdwjidx0+1];
691     cexp2_00         = vdwparam[vdwioffset0+vdwjidx0+2];
692     qq11             = iq1*jq1;
693     qq12             = iq1*jq2;
694     qq13             = iq1*jq3;
695     qq21             = iq2*jq1;
696     qq22             = iq2*jq2;
697     qq23             = iq2*jq3;
698     qq31             = iq3*jq1;
699     qq32             = iq3*jq2;
700     qq33             = iq3*jq3;
701
702     outeriter        = 0;
703     inneriter        = 0;
704
705     /* Start outer loop over neighborlists */
706     for(iidx=0; iidx<nri; iidx++)
707     {
708         /* Load shift vector for this list */
709         i_shift_offset   = DIM*shiftidx[iidx];
710         shX              = shiftvec[i_shift_offset+XX];
711         shY              = shiftvec[i_shift_offset+YY];
712         shZ              = shiftvec[i_shift_offset+ZZ];
713
714         /* Load limits for loop over neighbors */
715         j_index_start    = jindex[iidx];
716         j_index_end      = jindex[iidx+1];
717
718         /* Get outer coordinate index */
719         inr              = iinr[iidx];
720         i_coord_offset   = DIM*inr;
721
722         /* Load i particle coords and add shift vector */
723         ix0              = shX + x[i_coord_offset+DIM*0+XX];
724         iy0              = shY + x[i_coord_offset+DIM*0+YY];
725         iz0              = shZ + x[i_coord_offset+DIM*0+ZZ];
726         ix1              = shX + x[i_coord_offset+DIM*1+XX];
727         iy1              = shY + x[i_coord_offset+DIM*1+YY];
728         iz1              = shZ + x[i_coord_offset+DIM*1+ZZ];
729         ix2              = shX + x[i_coord_offset+DIM*2+XX];
730         iy2              = shY + x[i_coord_offset+DIM*2+YY];
731         iz2              = shZ + x[i_coord_offset+DIM*2+ZZ];
732         ix3              = shX + x[i_coord_offset+DIM*3+XX];
733         iy3              = shY + x[i_coord_offset+DIM*3+YY];
734         iz3              = shZ + x[i_coord_offset+DIM*3+ZZ];
735
736         fix0             = 0.0;
737         fiy0             = 0.0;
738         fiz0             = 0.0;
739         fix1             = 0.0;
740         fiy1             = 0.0;
741         fiz1             = 0.0;
742         fix2             = 0.0;
743         fiy2             = 0.0;
744         fiz2             = 0.0;
745         fix3             = 0.0;
746         fiy3             = 0.0;
747         fiz3             = 0.0;
748
749         /* Start inner kernel loop */
750         for(jidx=j_index_start; jidx<j_index_end; jidx++)
751         {
752             /* Get j neighbor index, and coordinate index */
753             jnr              = jjnr[jidx];
754             j_coord_offset   = DIM*jnr;
755
756             /* load j atom coordinates */
757             jx0              = x[j_coord_offset+DIM*0+XX];
758             jy0              = x[j_coord_offset+DIM*0+YY];
759             jz0              = x[j_coord_offset+DIM*0+ZZ];
760             jx1              = x[j_coord_offset+DIM*1+XX];
761             jy1              = x[j_coord_offset+DIM*1+YY];
762             jz1              = x[j_coord_offset+DIM*1+ZZ];
763             jx2              = x[j_coord_offset+DIM*2+XX];
764             jy2              = x[j_coord_offset+DIM*2+YY];
765             jz2              = x[j_coord_offset+DIM*2+ZZ];
766             jx3              = x[j_coord_offset+DIM*3+XX];
767             jy3              = x[j_coord_offset+DIM*3+YY];
768             jz3              = x[j_coord_offset+DIM*3+ZZ];
769
770             /* Calculate displacement vector */
771             dx00             = ix0 - jx0;
772             dy00             = iy0 - jy0;
773             dz00             = iz0 - jz0;
774             dx11             = ix1 - jx1;
775             dy11             = iy1 - jy1;
776             dz11             = iz1 - jz1;
777             dx12             = ix1 - jx2;
778             dy12             = iy1 - jy2;
779             dz12             = iz1 - jz2;
780             dx13             = ix1 - jx3;
781             dy13             = iy1 - jy3;
782             dz13             = iz1 - jz3;
783             dx21             = ix2 - jx1;
784             dy21             = iy2 - jy1;
785             dz21             = iz2 - jz1;
786             dx22             = ix2 - jx2;
787             dy22             = iy2 - jy2;
788             dz22             = iz2 - jz2;
789             dx23             = ix2 - jx3;
790             dy23             = iy2 - jy3;
791             dz23             = iz2 - jz3;
792             dx31             = ix3 - jx1;
793             dy31             = iy3 - jy1;
794             dz31             = iz3 - jz1;
795             dx32             = ix3 - jx2;
796             dy32             = iy3 - jy2;
797             dz32             = iz3 - jz2;
798             dx33             = ix3 - jx3;
799             dy33             = iy3 - jy3;
800             dz33             = iz3 - jz3;
801
802             /* Calculate squared distance and things based on it */
803             rsq00            = dx00*dx00+dy00*dy00+dz00*dz00;
804             rsq11            = dx11*dx11+dy11*dy11+dz11*dz11;
805             rsq12            = dx12*dx12+dy12*dy12+dz12*dz12;
806             rsq13            = dx13*dx13+dy13*dy13+dz13*dz13;
807             rsq21            = dx21*dx21+dy21*dy21+dz21*dz21;
808             rsq22            = dx22*dx22+dy22*dy22+dz22*dz22;
809             rsq23            = dx23*dx23+dy23*dy23+dz23*dz23;
810             rsq31            = dx31*dx31+dy31*dy31+dz31*dz31;
811             rsq32            = dx32*dx32+dy32*dy32+dz32*dz32;
812             rsq33            = dx33*dx33+dy33*dy33+dz33*dz33;
813
814             rinv00           = gmx_invsqrt(rsq00);
815             rinv11           = gmx_invsqrt(rsq11);
816             rinv12           = gmx_invsqrt(rsq12);
817             rinv13           = gmx_invsqrt(rsq13);
818             rinv21           = gmx_invsqrt(rsq21);
819             rinv22           = gmx_invsqrt(rsq22);
820             rinv23           = gmx_invsqrt(rsq23);
821             rinv31           = gmx_invsqrt(rsq31);
822             rinv32           = gmx_invsqrt(rsq32);
823             rinv33           = gmx_invsqrt(rsq33);
824
825             rinvsq00         = rinv00*rinv00;
826             rinvsq11         = rinv11*rinv11;
827             rinvsq12         = rinv12*rinv12;
828             rinvsq13         = rinv13*rinv13;
829             rinvsq21         = rinv21*rinv21;
830             rinvsq22         = rinv22*rinv22;
831             rinvsq23         = rinv23*rinv23;
832             rinvsq31         = rinv31*rinv31;
833             rinvsq32         = rinv32*rinv32;
834             rinvsq33         = rinv33*rinv33;
835
836             /**************************
837              * CALCULATE INTERACTIONS *
838              **************************/
839
840             r00              = rsq00*rinv00;
841
842             /* BUCKINGHAM DISPERSION/REPULSION */
843             rinvsix          = rinvsq00*rinvsq00*rinvsq00;
844             vvdw6            = c6_00*rinvsix;
845             br               = cexp2_00*r00;
846             vvdwexp          = cexp1_00*exp(-br);
847             fvdw             = (br*vvdwexp-vvdw6)*rinvsq00;
848
849             fscal            = fvdw;
850
851             /* Calculate temporary vectorial force */
852             tx               = fscal*dx00;
853             ty               = fscal*dy00;
854             tz               = fscal*dz00;
855
856             /* Update vectorial force */
857             fix0            += tx;
858             fiy0            += ty;
859             fiz0            += tz;
860             f[j_coord_offset+DIM*0+XX] -= tx;
861             f[j_coord_offset+DIM*0+YY] -= ty;
862             f[j_coord_offset+DIM*0+ZZ] -= tz;
863
864             /**************************
865              * CALCULATE INTERACTIONS *
866              **************************/
867
868             /* REACTION-FIELD ELECTROSTATICS */
869             felec            = qq11*(rinv11*rinvsq11-krf2);
870
871             fscal            = felec;
872
873             /* Calculate temporary vectorial force */
874             tx               = fscal*dx11;
875             ty               = fscal*dy11;
876             tz               = fscal*dz11;
877
878             /* Update vectorial force */
879             fix1            += tx;
880             fiy1            += ty;
881             fiz1            += tz;
882             f[j_coord_offset+DIM*1+XX] -= tx;
883             f[j_coord_offset+DIM*1+YY] -= ty;
884             f[j_coord_offset+DIM*1+ZZ] -= tz;
885
886             /**************************
887              * CALCULATE INTERACTIONS *
888              **************************/
889
890             /* REACTION-FIELD ELECTROSTATICS */
891             felec            = qq12*(rinv12*rinvsq12-krf2);
892
893             fscal            = felec;
894
895             /* Calculate temporary vectorial force */
896             tx               = fscal*dx12;
897             ty               = fscal*dy12;
898             tz               = fscal*dz12;
899
900             /* Update vectorial force */
901             fix1            += tx;
902             fiy1            += ty;
903             fiz1            += tz;
904             f[j_coord_offset+DIM*2+XX] -= tx;
905             f[j_coord_offset+DIM*2+YY] -= ty;
906             f[j_coord_offset+DIM*2+ZZ] -= tz;
907
908             /**************************
909              * CALCULATE INTERACTIONS *
910              **************************/
911
912             /* REACTION-FIELD ELECTROSTATICS */
913             felec            = qq13*(rinv13*rinvsq13-krf2);
914
915             fscal            = felec;
916
917             /* Calculate temporary vectorial force */
918             tx               = fscal*dx13;
919             ty               = fscal*dy13;
920             tz               = fscal*dz13;
921
922             /* Update vectorial force */
923             fix1            += tx;
924             fiy1            += ty;
925             fiz1            += tz;
926             f[j_coord_offset+DIM*3+XX] -= tx;
927             f[j_coord_offset+DIM*3+YY] -= ty;
928             f[j_coord_offset+DIM*3+ZZ] -= tz;
929
930             /**************************
931              * CALCULATE INTERACTIONS *
932              **************************/
933
934             /* REACTION-FIELD ELECTROSTATICS */
935             felec            = qq21*(rinv21*rinvsq21-krf2);
936
937             fscal            = felec;
938
939             /* Calculate temporary vectorial force */
940             tx               = fscal*dx21;
941             ty               = fscal*dy21;
942             tz               = fscal*dz21;
943
944             /* Update vectorial force */
945             fix2            += tx;
946             fiy2            += ty;
947             fiz2            += tz;
948             f[j_coord_offset+DIM*1+XX] -= tx;
949             f[j_coord_offset+DIM*1+YY] -= ty;
950             f[j_coord_offset+DIM*1+ZZ] -= tz;
951
952             /**************************
953              * CALCULATE INTERACTIONS *
954              **************************/
955
956             /* REACTION-FIELD ELECTROSTATICS */
957             felec            = qq22*(rinv22*rinvsq22-krf2);
958
959             fscal            = felec;
960
961             /* Calculate temporary vectorial force */
962             tx               = fscal*dx22;
963             ty               = fscal*dy22;
964             tz               = fscal*dz22;
965
966             /* Update vectorial force */
967             fix2            += tx;
968             fiy2            += ty;
969             fiz2            += tz;
970             f[j_coord_offset+DIM*2+XX] -= tx;
971             f[j_coord_offset+DIM*2+YY] -= ty;
972             f[j_coord_offset+DIM*2+ZZ] -= tz;
973
974             /**************************
975              * CALCULATE INTERACTIONS *
976              **************************/
977
978             /* REACTION-FIELD ELECTROSTATICS */
979             felec            = qq23*(rinv23*rinvsq23-krf2);
980
981             fscal            = felec;
982
983             /* Calculate temporary vectorial force */
984             tx               = fscal*dx23;
985             ty               = fscal*dy23;
986             tz               = fscal*dz23;
987
988             /* Update vectorial force */
989             fix2            += tx;
990             fiy2            += ty;
991             fiz2            += tz;
992             f[j_coord_offset+DIM*3+XX] -= tx;
993             f[j_coord_offset+DIM*3+YY] -= ty;
994             f[j_coord_offset+DIM*3+ZZ] -= tz;
995
996             /**************************
997              * CALCULATE INTERACTIONS *
998              **************************/
999
1000             /* REACTION-FIELD ELECTROSTATICS */
1001             felec            = qq31*(rinv31*rinvsq31-krf2);
1002
1003             fscal            = felec;
1004
1005             /* Calculate temporary vectorial force */
1006             tx               = fscal*dx31;
1007             ty               = fscal*dy31;
1008             tz               = fscal*dz31;
1009
1010             /* Update vectorial force */
1011             fix3            += tx;
1012             fiy3            += ty;
1013             fiz3            += tz;
1014             f[j_coord_offset+DIM*1+XX] -= tx;
1015             f[j_coord_offset+DIM*1+YY] -= ty;
1016             f[j_coord_offset+DIM*1+ZZ] -= tz;
1017
1018             /**************************
1019              * CALCULATE INTERACTIONS *
1020              **************************/
1021
1022             /* REACTION-FIELD ELECTROSTATICS */
1023             felec            = qq32*(rinv32*rinvsq32-krf2);
1024
1025             fscal            = felec;
1026
1027             /* Calculate temporary vectorial force */
1028             tx               = fscal*dx32;
1029             ty               = fscal*dy32;
1030             tz               = fscal*dz32;
1031
1032             /* Update vectorial force */
1033             fix3            += tx;
1034             fiy3            += ty;
1035             fiz3            += tz;
1036             f[j_coord_offset+DIM*2+XX] -= tx;
1037             f[j_coord_offset+DIM*2+YY] -= ty;
1038             f[j_coord_offset+DIM*2+ZZ] -= tz;
1039
1040             /**************************
1041              * CALCULATE INTERACTIONS *
1042              **************************/
1043
1044             /* REACTION-FIELD ELECTROSTATICS */
1045             felec            = qq33*(rinv33*rinvsq33-krf2);
1046
1047             fscal            = felec;
1048
1049             /* Calculate temporary vectorial force */
1050             tx               = fscal*dx33;
1051             ty               = fscal*dy33;
1052             tz               = fscal*dz33;
1053
1054             /* Update vectorial force */
1055             fix3            += tx;
1056             fiy3            += ty;
1057             fiz3            += tz;
1058             f[j_coord_offset+DIM*3+XX] -= tx;
1059             f[j_coord_offset+DIM*3+YY] -= ty;
1060             f[j_coord_offset+DIM*3+ZZ] -= tz;
1061
1062             /* Inner loop uses 292 flops */
1063         }
1064         /* End of innermost loop */
1065
1066         tx = ty = tz = 0;
1067         f[i_coord_offset+DIM*0+XX] += fix0;
1068         f[i_coord_offset+DIM*0+YY] += fiy0;
1069         f[i_coord_offset+DIM*0+ZZ] += fiz0;
1070         tx                         += fix0;
1071         ty                         += fiy0;
1072         tz                         += fiz0;
1073         f[i_coord_offset+DIM*1+XX] += fix1;
1074         f[i_coord_offset+DIM*1+YY] += fiy1;
1075         f[i_coord_offset+DIM*1+ZZ] += fiz1;
1076         tx                         += fix1;
1077         ty                         += fiy1;
1078         tz                         += fiz1;
1079         f[i_coord_offset+DIM*2+XX] += fix2;
1080         f[i_coord_offset+DIM*2+YY] += fiy2;
1081         f[i_coord_offset+DIM*2+ZZ] += fiz2;
1082         tx                         += fix2;
1083         ty                         += fiy2;
1084         tz                         += fiz2;
1085         f[i_coord_offset+DIM*3+XX] += fix3;
1086         f[i_coord_offset+DIM*3+YY] += fiy3;
1087         f[i_coord_offset+DIM*3+ZZ] += fiz3;
1088         tx                         += fix3;
1089         ty                         += fiy3;
1090         tz                         += fiz3;
1091         fshift[i_shift_offset+XX]  += tx;
1092         fshift[i_shift_offset+YY]  += ty;
1093         fshift[i_shift_offset+ZZ]  += tz;
1094
1095         /* Increment number of inner iterations */
1096         inneriter                  += j_index_end - j_index_start;
1097
1098         /* Outer loop uses 39 flops */
1099     }
1100
1101     /* Increment number of outer iterations */
1102     outeriter        += nri;
1103
1104     /* Update outer/inner flops */
1105
1106     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W4W4_F,outeriter*39 + inneriter*292);
1107 }