Fix component for libcudart
[alexxy/gromacs.git] / src / gmxlib / nonbonded / nb_kernel_c / nb_kernel_ElecEwSw_VdwBhamSw_GeomP1P1_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_ElecEwSw_VdwBhamSw_GeomP1P1_VF_c
35  * Electrostatics interaction: Ewald
36  * VdW interaction:            Buckingham
37  * Geometry:                   Particle-Particle
38  * Calculate force/pot:        PotentialAndForce
39  */
40 void
41 nb_kernel_ElecEwSw_VdwBhamSw_GeomP1P1_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              vdwjidx0;
59     real             jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
60     real             dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00,cexp1_00,cexp2_00;
61     real             velec,felec,velecsum,facel,crf,krf,krf2;
62     real             *charge;
63     int              nvdwtype;
64     real             rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,br,vvdwexp,sh_vdw_invrcut6;
65     int              *vdwtype;
66     real             *vdwparam;
67     int              ewitab;
68     real             ewtabscale,eweps,sh_ewald,ewrt,ewtabhalfspace;
69     real             *ewtab;
70     real             rswitch,swV3,swV4,swV5,swF2,swF3,swF4,d,d2,sw,dsw;
71
72     x                = xx[0];
73     f                = ff[0];
74
75     nri              = nlist->nri;
76     iinr             = nlist->iinr;
77     jindex           = nlist->jindex;
78     jjnr             = nlist->jjnr;
79     shiftidx         = nlist->shift;
80     gid              = nlist->gid;
81     shiftvec         = fr->shift_vec[0];
82     fshift           = fr->fshift[0];
83     facel            = fr->epsfac;
84     charge           = mdatoms->chargeA;
85     nvdwtype         = fr->ntype;
86     vdwparam         = fr->nbfp;
87     vdwtype          = mdatoms->typeA;
88
89     sh_ewald         = fr->ic->sh_ewald;
90     ewtab            = fr->ic->tabq_coul_FDV0;
91     ewtabscale       = fr->ic->tabq_scale;
92     ewtabhalfspace   = 0.5/ewtabscale;
93
94     /* When we use explicit cutoffs the value must be identical for elec and VdW, so use elec as an arbitrary choice */
95     rcutoff          = fr->rcoulomb;
96     rcutoff2         = rcutoff*rcutoff;
97
98     rswitch          = fr->rcoulomb_switch;
99     /* Setup switch parameters */
100     d                = rcutoff-rswitch;
101     swV3             = -10.0/(d*d*d);
102     swV4             =  15.0/(d*d*d*d);
103     swV5             =  -6.0/(d*d*d*d*d);
104     swF2             = -30.0/(d*d*d);
105     swF3             =  60.0/(d*d*d*d);
106     swF4             = -30.0/(d*d*d*d*d);
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
133         fix0             = 0.0;
134         fiy0             = 0.0;
135         fiz0             = 0.0;
136
137         /* Load parameters for i particles */
138         iq0              = facel*charge[inr+0];
139         vdwioffset0      = 3*nvdwtype*vdwtype[inr+0];
140
141         /* Reset potential sums */
142         velecsum         = 0.0;
143         vvdwsum          = 0.0;
144
145         /* Start inner kernel loop */
146         for(jidx=j_index_start; jidx<j_index_end; jidx++)
147         {
148             /* Get j neighbor index, and coordinate index */
149             jnr              = jjnr[jidx];
150             j_coord_offset   = DIM*jnr;
151
152             /* load j atom coordinates */
153             jx0              = x[j_coord_offset+DIM*0+XX];
154             jy0              = x[j_coord_offset+DIM*0+YY];
155             jz0              = x[j_coord_offset+DIM*0+ZZ];
156
157             /* Calculate displacement vector */
158             dx00             = ix0 - jx0;
159             dy00             = iy0 - jy0;
160             dz00             = iz0 - jz0;
161
162             /* Calculate squared distance and things based on it */
163             rsq00            = dx00*dx00+dy00*dy00+dz00*dz00;
164
165             rinv00           = gmx_invsqrt(rsq00);
166
167             rinvsq00         = rinv00*rinv00;
168
169             /* Load parameters for j particles */
170             jq0              = charge[jnr+0];
171             vdwjidx0         = 3*vdwtype[jnr+0];
172
173             /**************************
174              * CALCULATE INTERACTIONS *
175              **************************/
176
177             if (rsq00<rcutoff2)
178             {
179
180             r00              = rsq00*rinv00;
181
182             qq00             = iq0*jq0;
183             c6_00            = vdwparam[vdwioffset0+vdwjidx0];
184             cexp1_00         = vdwparam[vdwioffset0+vdwjidx0+1];
185             cexp2_00         = vdwparam[vdwioffset0+vdwjidx0+2];
186
187             /* EWALD ELECTROSTATICS */
188
189             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
190             ewrt             = r00*ewtabscale;
191             ewitab           = ewrt;
192             eweps            = ewrt-ewitab;
193             ewitab           = 4*ewitab;
194             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
195             velec            = qq00*(rinv00-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
196             felec            = qq00*rinv00*(rinvsq00-felec);
197
198             /* BUCKINGHAM DISPERSION/REPULSION */
199             rinvsix          = rinvsq00*rinvsq00*rinvsq00;
200             vvdw6            = c6_00*rinvsix;
201             br               = cexp2_00*r00;
202             vvdwexp          = cexp1_00*exp(-br);
203             vvdw             = vvdwexp - vvdw6*(1.0/6.0);
204             fvdw             = (br*vvdwexp-vvdw6)*rinvsq00;
205
206             d                = r00-rswitch;
207             d                = (d>0.0) ? d : 0.0;
208             d2               = d*d;
209             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
210
211             dsw              = d2*(swF2+d*(swF3+d*swF4));
212
213             /* Evaluate switch function */
214             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
215             felec            = felec*sw - rinv00*velec*dsw;
216             fvdw             = fvdw*sw - rinv00*vvdw*dsw;
217             velec           *= sw;
218             vvdw            *= sw;
219
220             /* Update potential sums from outer loop */
221             velecsum        += velec;
222             vvdwsum         += vvdw;
223
224             fscal            = felec+fvdw;
225
226             /* Calculate temporary vectorial force */
227             tx               = fscal*dx00;
228             ty               = fscal*dy00;
229             tz               = fscal*dz00;
230
231             /* Update vectorial force */
232             fix0            += tx;
233             fiy0            += ty;
234             fiz0            += tz;
235             f[j_coord_offset+DIM*0+XX] -= tx;
236             f[j_coord_offset+DIM*0+YY] -= ty;
237             f[j_coord_offset+DIM*0+ZZ] -= tz;
238
239             }
240
241             /* Inner loop uses 101 flops */
242         }
243         /* End of innermost loop */
244
245         tx = ty = tz = 0;
246         f[i_coord_offset+DIM*0+XX] += fix0;
247         f[i_coord_offset+DIM*0+YY] += fiy0;
248         f[i_coord_offset+DIM*0+ZZ] += fiz0;
249         tx                         += fix0;
250         ty                         += fiy0;
251         tz                         += fiz0;
252         fshift[i_shift_offset+XX]  += tx;
253         fshift[i_shift_offset+YY]  += ty;
254         fshift[i_shift_offset+ZZ]  += tz;
255
256         ggid                        = gid[iidx];
257         /* Update potential energies */
258         kernel_data->energygrp_elec[ggid] += velecsum;
259         kernel_data->energygrp_vdw[ggid] += vvdwsum;
260
261         /* Increment number of inner iterations */
262         inneriter                  += j_index_end - j_index_start;
263
264         /* Outer loop uses 15 flops */
265     }
266
267     /* Increment number of outer iterations */
268     outeriter        += nri;
269
270     /* Update outer/inner flops */
271
272     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_VF,outeriter*15 + inneriter*101);
273 }
274 /*
275  * Gromacs nonbonded kernel:   nb_kernel_ElecEwSw_VdwBhamSw_GeomP1P1_F_c
276  * Electrostatics interaction: Ewald
277  * VdW interaction:            Buckingham
278  * Geometry:                   Particle-Particle
279  * Calculate force/pot:        Force
280  */
281 void
282 nb_kernel_ElecEwSw_VdwBhamSw_GeomP1P1_F_c
283                     (t_nblist * gmx_restrict                nlist,
284                      rvec * gmx_restrict                    xx,
285                      rvec * gmx_restrict                    ff,
286                      t_forcerec * gmx_restrict              fr,
287                      t_mdatoms * gmx_restrict               mdatoms,
288                      nb_kernel_data_t * gmx_restrict        kernel_data,
289                      t_nrnb * gmx_restrict                  nrnb)
290 {
291     int              i_shift_offset,i_coord_offset,j_coord_offset;
292     int              j_index_start,j_index_end;
293     int              nri,inr,ggid,iidx,jidx,jnr,outeriter,inneriter;
294     real             shX,shY,shZ,tx,ty,tz,fscal,rcutoff,rcutoff2;
295     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
296     real             *shiftvec,*fshift,*x,*f;
297     int              vdwioffset0;
298     real             ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
299     int              vdwjidx0;
300     real             jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
301     real             dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00,cexp1_00,cexp2_00;
302     real             velec,felec,velecsum,facel,crf,krf,krf2;
303     real             *charge;
304     int              nvdwtype;
305     real             rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,br,vvdwexp,sh_vdw_invrcut6;
306     int              *vdwtype;
307     real             *vdwparam;
308     int              ewitab;
309     real             ewtabscale,eweps,sh_ewald,ewrt,ewtabhalfspace;
310     real             *ewtab;
311     real             rswitch,swV3,swV4,swV5,swF2,swF3,swF4,d,d2,sw,dsw;
312
313     x                = xx[0];
314     f                = ff[0];
315
316     nri              = nlist->nri;
317     iinr             = nlist->iinr;
318     jindex           = nlist->jindex;
319     jjnr             = nlist->jjnr;
320     shiftidx         = nlist->shift;
321     gid              = nlist->gid;
322     shiftvec         = fr->shift_vec[0];
323     fshift           = fr->fshift[0];
324     facel            = fr->epsfac;
325     charge           = mdatoms->chargeA;
326     nvdwtype         = fr->ntype;
327     vdwparam         = fr->nbfp;
328     vdwtype          = mdatoms->typeA;
329
330     sh_ewald         = fr->ic->sh_ewald;
331     ewtab            = fr->ic->tabq_coul_FDV0;
332     ewtabscale       = fr->ic->tabq_scale;
333     ewtabhalfspace   = 0.5/ewtabscale;
334
335     /* When we use explicit cutoffs the value must be identical for elec and VdW, so use elec as an arbitrary choice */
336     rcutoff          = fr->rcoulomb;
337     rcutoff2         = rcutoff*rcutoff;
338
339     rswitch          = fr->rcoulomb_switch;
340     /* Setup switch parameters */
341     d                = rcutoff-rswitch;
342     swV3             = -10.0/(d*d*d);
343     swV4             =  15.0/(d*d*d*d);
344     swV5             =  -6.0/(d*d*d*d*d);
345     swF2             = -30.0/(d*d*d);
346     swF3             =  60.0/(d*d*d*d);
347     swF4             = -30.0/(d*d*d*d*d);
348
349     outeriter        = 0;
350     inneriter        = 0;
351
352     /* Start outer loop over neighborlists */
353     for(iidx=0; iidx<nri; iidx++)
354     {
355         /* Load shift vector for this list */
356         i_shift_offset   = DIM*shiftidx[iidx];
357         shX              = shiftvec[i_shift_offset+XX];
358         shY              = shiftvec[i_shift_offset+YY];
359         shZ              = shiftvec[i_shift_offset+ZZ];
360
361         /* Load limits for loop over neighbors */
362         j_index_start    = jindex[iidx];
363         j_index_end      = jindex[iidx+1];
364
365         /* Get outer coordinate index */
366         inr              = iinr[iidx];
367         i_coord_offset   = DIM*inr;
368
369         /* Load i particle coords and add shift vector */
370         ix0              = shX + x[i_coord_offset+DIM*0+XX];
371         iy0              = shY + x[i_coord_offset+DIM*0+YY];
372         iz0              = shZ + x[i_coord_offset+DIM*0+ZZ];
373
374         fix0             = 0.0;
375         fiy0             = 0.0;
376         fiz0             = 0.0;
377
378         /* Load parameters for i particles */
379         iq0              = facel*charge[inr+0];
380         vdwioffset0      = 3*nvdwtype*vdwtype[inr+0];
381
382         /* Start inner kernel loop */
383         for(jidx=j_index_start; jidx<j_index_end; jidx++)
384         {
385             /* Get j neighbor index, and coordinate index */
386             jnr              = jjnr[jidx];
387             j_coord_offset   = DIM*jnr;
388
389             /* load j atom coordinates */
390             jx0              = x[j_coord_offset+DIM*0+XX];
391             jy0              = x[j_coord_offset+DIM*0+YY];
392             jz0              = x[j_coord_offset+DIM*0+ZZ];
393
394             /* Calculate displacement vector */
395             dx00             = ix0 - jx0;
396             dy00             = iy0 - jy0;
397             dz00             = iz0 - jz0;
398
399             /* Calculate squared distance and things based on it */
400             rsq00            = dx00*dx00+dy00*dy00+dz00*dz00;
401
402             rinv00           = gmx_invsqrt(rsq00);
403
404             rinvsq00         = rinv00*rinv00;
405
406             /* Load parameters for j particles */
407             jq0              = charge[jnr+0];
408             vdwjidx0         = 3*vdwtype[jnr+0];
409
410             /**************************
411              * CALCULATE INTERACTIONS *
412              **************************/
413
414             if (rsq00<rcutoff2)
415             {
416
417             r00              = rsq00*rinv00;
418
419             qq00             = iq0*jq0;
420             c6_00            = vdwparam[vdwioffset0+vdwjidx0];
421             cexp1_00         = vdwparam[vdwioffset0+vdwjidx0+1];
422             cexp2_00         = vdwparam[vdwioffset0+vdwjidx0+2];
423
424             /* EWALD ELECTROSTATICS */
425
426             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
427             ewrt             = r00*ewtabscale;
428             ewitab           = ewrt;
429             eweps            = ewrt-ewitab;
430             ewitab           = 4*ewitab;
431             felec            = ewtab[ewitab]+eweps*ewtab[ewitab+1];
432             velec            = qq00*(rinv00-(ewtab[ewitab+2]-ewtabhalfspace*eweps*(ewtab[ewitab]+felec)));
433             felec            = qq00*rinv00*(rinvsq00-felec);
434
435             /* BUCKINGHAM DISPERSION/REPULSION */
436             rinvsix          = rinvsq00*rinvsq00*rinvsq00;
437             vvdw6            = c6_00*rinvsix;
438             br               = cexp2_00*r00;
439             vvdwexp          = cexp1_00*exp(-br);
440             vvdw             = vvdwexp - vvdw6*(1.0/6.0);
441             fvdw             = (br*vvdwexp-vvdw6)*rinvsq00;
442
443             d                = r00-rswitch;
444             d                = (d>0.0) ? d : 0.0;
445             d2               = d*d;
446             sw               = 1.0+d2*d*(swV3+d*(swV4+d*swV5));
447
448             dsw              = d2*(swF2+d*(swF3+d*swF4));
449
450             /* Evaluate switch function */
451             /* fscal'=f'/r=-(v*sw)'/r=-(v'*sw+v*dsw)/r=-v'*sw/r-v*dsw/r=fscal*sw-v*dsw/r */
452             felec            = felec*sw - rinv00*velec*dsw;
453             fvdw             = fvdw*sw - rinv00*vvdw*dsw;
454
455             fscal            = felec+fvdw;
456
457             /* Calculate temporary vectorial force */
458             tx               = fscal*dx00;
459             ty               = fscal*dy00;
460             tz               = fscal*dz00;
461
462             /* Update vectorial force */
463             fix0            += tx;
464             fiy0            += ty;
465             fiz0            += tz;
466             f[j_coord_offset+DIM*0+XX] -= tx;
467             f[j_coord_offset+DIM*0+YY] -= ty;
468             f[j_coord_offset+DIM*0+ZZ] -= tz;
469
470             }
471
472             /* Inner loop uses 97 flops */
473         }
474         /* End of innermost loop */
475
476         tx = ty = tz = 0;
477         f[i_coord_offset+DIM*0+XX] += fix0;
478         f[i_coord_offset+DIM*0+YY] += fiy0;
479         f[i_coord_offset+DIM*0+ZZ] += fiz0;
480         tx                         += fix0;
481         ty                         += fiy0;
482         tz                         += fiz0;
483         fshift[i_shift_offset+XX]  += tx;
484         fshift[i_shift_offset+YY]  += ty;
485         fshift[i_shift_offset+ZZ]  += tz;
486
487         /* Increment number of inner iterations */
488         inneriter                  += j_index_end - j_index_start;
489
490         /* Outer loop uses 13 flops */
491     }
492
493     /* Increment number of outer iterations */
494     outeriter        += nri;
495
496     /* Update outer/inner flops */
497
498     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_F,outeriter*13 + inneriter*97);
499 }