40fc35d61ca79a8093590b01a027dc5bcc08b7d3
[alexxy/gromacs.git] / src / gmxlib / nonbonded / nb_kernel_c / nb_kernel_ElecGB_VdwNone_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_ElecGB_VdwNone_GeomP1P1_VF_c
35  * Electrostatics interaction: GeneralizedBorn
36  * VdW interaction:            None
37  * Geometry:                   Particle-Particle
38  * Calculate force/pot:        PotentialAndForce
39  */
40 void
41 nb_kernel_ElecGB_VdwNone_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              gbitab;
64     real             vgb,fgb,vgbsum,dvdasum,gbscale,gbtabscale,isaprod,gbqqfactor,gbinvepsdiff,dvdaj,gbeps,dvdatmp;
65     real             *invsqrta,*dvda,*gbtab;
66     int              vfitab;
67     real             rt,vfeps,vftabscale,Y,F,Geps,Heps2,Fp,VV,FF;
68     real             *vftab;
69
70     x                = xx[0];
71     f                = ff[0];
72
73     nri              = nlist->nri;
74     iinr             = nlist->iinr;
75     jindex           = nlist->jindex;
76     jjnr             = nlist->jjnr;
77     shiftidx         = nlist->shift;
78     gid              = nlist->gid;
79     shiftvec         = fr->shift_vec[0];
80     fshift           = fr->fshift[0];
81     facel            = fr->epsfac;
82     charge           = mdatoms->chargeA;
83
84     invsqrta         = fr->invsqrta;
85     dvda             = fr->dvda;
86     gbtabscale       = fr->gbtab.scale;
87     gbtab            = fr->gbtab.data;
88     gbinvepsdiff     = (1.0/fr->epsilon_r) - (1.0/fr->gb_epsilon_solvent);
89
90     outeriter        = 0;
91     inneriter        = 0;
92
93     /* Start outer loop over neighborlists */
94     for(iidx=0; iidx<nri; iidx++)
95     {
96         /* Load shift vector for this list */
97         i_shift_offset   = DIM*shiftidx[iidx];
98         shX              = shiftvec[i_shift_offset+XX];
99         shY              = shiftvec[i_shift_offset+YY];
100         shZ              = shiftvec[i_shift_offset+ZZ];
101
102         /* Load limits for loop over neighbors */
103         j_index_start    = jindex[iidx];
104         j_index_end      = jindex[iidx+1];
105
106         /* Get outer coordinate index */
107         inr              = iinr[iidx];
108         i_coord_offset   = DIM*inr;
109
110         /* Load i particle coords and add shift vector */
111         ix0              = shX + x[i_coord_offset+DIM*0+XX];
112         iy0              = shY + x[i_coord_offset+DIM*0+YY];
113         iz0              = shZ + x[i_coord_offset+DIM*0+ZZ];
114
115         fix0             = 0.0;
116         fiy0             = 0.0;
117         fiz0             = 0.0;
118
119         /* Load parameters for i particles */
120         iq0              = facel*charge[inr+0];
121         isai0            = invsqrta[inr+0];
122
123         /* Reset potential sums */
124         velecsum         = 0.0;
125         vgbsum           = 0.0;
126         dvdasum          = 0.0;
127
128         /* Start inner kernel loop */
129         for(jidx=j_index_start; jidx<j_index_end; jidx++)
130         {
131             /* Get j neighbor index, and coordinate index */
132             jnr              = jjnr[jidx];
133             j_coord_offset   = DIM*jnr;
134
135             /* load j atom coordinates */
136             jx0              = x[j_coord_offset+DIM*0+XX];
137             jy0              = x[j_coord_offset+DIM*0+YY];
138             jz0              = x[j_coord_offset+DIM*0+ZZ];
139
140             /* Calculate displacement vector */
141             dx00             = ix0 - jx0;
142             dy00             = iy0 - jy0;
143             dz00             = iz0 - jz0;
144
145             /* Calculate squared distance and things based on it */
146             rsq00            = dx00*dx00+dy00*dy00+dz00*dz00;
147
148             rinv00           = gmx_invsqrt(rsq00);
149
150             /* Load parameters for j particles */
151             jq0              = charge[jnr+0];
152             isaj0           = invsqrta[jnr+0];
153
154             /**************************
155              * CALCULATE INTERACTIONS *
156              **************************/
157
158             r00              = rsq00*rinv00;
159
160             qq00             = iq0*jq0;
161
162             /* GENERALIZED BORN AND COULOMB ELECTROSTATICS */
163             isaprod          = isai0*isaj0;
164             gbqqfactor       = isaprod*(-qq00)*gbinvepsdiff;
165             gbscale          = isaprod*gbtabscale;
166             dvdaj            = dvda[jnr+0];
167
168             /* Calculate generalized born table index - this is a separate table from the normal one,
169              * but we use the same procedure by multiplying r with scale and truncating to integer.
170              */
171             rt               = r00*gbscale;
172             gbitab           = rt;
173             gbeps            = rt-gbitab;
174             gbitab           = 4*gbitab;
175
176             Y                = gbtab[gbitab];
177             F                = gbtab[gbitab+1];
178             Geps             = gbeps*gbtab[gbitab+2];
179             Heps2            = gbeps*gbeps*gbtab[gbitab+3];
180             Fp               = F+Geps+Heps2;
181             VV               = Y+gbeps*Fp;
182             vgb              = gbqqfactor*VV;
183
184             FF               = Fp+Geps+2.0*Heps2;
185             fgb              = gbqqfactor*FF*gbscale;
186             dvdatmp          = -0.5*(vgb+fgb*r00);
187             dvdasum          = dvdasum + dvdatmp;
188             dvda[jnr]        = dvdaj+dvdatmp*isaj0*isaj0;
189             velec            = qq00*rinv00;
190             felec            = (velec*rinv00-fgb)*rinv00;
191
192             /* Update potential sums from outer loop */
193             velecsum        += velec;
194             vgbsum          += vgb;
195
196             fscal            = felec;
197
198             /* Calculate temporary vectorial force */
199             tx               = fscal*dx00;
200             ty               = fscal*dy00;
201             tz               = fscal*dz00;
202
203             /* Update vectorial force */
204             fix0            += tx;
205             fiy0            += ty;
206             fiz0            += tz;
207             f[j_coord_offset+DIM*0+XX] -= tx;
208             f[j_coord_offset+DIM*0+YY] -= ty;
209             f[j_coord_offset+DIM*0+ZZ] -= tz;
210
211             /* Inner loop uses 58 flops */
212         }
213         /* End of innermost loop */
214
215         tx = ty = tz = 0;
216         f[i_coord_offset+DIM*0+XX] += fix0;
217         f[i_coord_offset+DIM*0+YY] += fiy0;
218         f[i_coord_offset+DIM*0+ZZ] += fiz0;
219         tx                         += fix0;
220         ty                         += fiy0;
221         tz                         += fiz0;
222         fshift[i_shift_offset+XX]  += tx;
223         fshift[i_shift_offset+YY]  += ty;
224         fshift[i_shift_offset+ZZ]  += tz;
225
226         ggid                        = gid[iidx];
227         /* Update potential energies */
228         kernel_data->energygrp_elec[ggid] += velecsum;
229         kernel_data->energygrp_polarization[ggid] += vgbsum;
230         dvda[inr]                   = dvda[inr] + dvdasum*isai0*isai0;
231
232         /* Increment number of inner iterations */
233         inneriter                  += j_index_end - j_index_start;
234
235         /* Outer loop uses 15 flops */
236     }
237
238     /* Increment number of outer iterations */
239     outeriter        += nri;
240
241     /* Update outer/inner flops */
242
243     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VF,outeriter*15 + inneriter*58);
244 }
245 /*
246  * Gromacs nonbonded kernel:   nb_kernel_ElecGB_VdwNone_GeomP1P1_F_c
247  * Electrostatics interaction: GeneralizedBorn
248  * VdW interaction:            None
249  * Geometry:                   Particle-Particle
250  * Calculate force/pot:        Force
251  */
252 void
253 nb_kernel_ElecGB_VdwNone_GeomP1P1_F_c
254                     (t_nblist * gmx_restrict                nlist,
255                      rvec * gmx_restrict                    xx,
256                      rvec * gmx_restrict                    ff,
257                      t_forcerec * gmx_restrict              fr,
258                      t_mdatoms * gmx_restrict               mdatoms,
259                      nb_kernel_data_t * gmx_restrict        kernel_data,
260                      t_nrnb * gmx_restrict                  nrnb)
261 {
262     int              i_shift_offset,i_coord_offset,j_coord_offset;
263     int              j_index_start,j_index_end;
264     int              nri,inr,ggid,iidx,jidx,jnr,outeriter,inneriter;
265     real             shX,shY,shZ,tx,ty,tz,fscal,rcutoff,rcutoff2;
266     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
267     real             *shiftvec,*fshift,*x,*f;
268     int              vdwioffset0;
269     real             ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
270     int              vdwjidx0;
271     real             jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
272     real             dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00,cexp1_00,cexp2_00;
273     real             velec,felec,velecsum,facel,crf,krf,krf2;
274     real             *charge;
275     int              gbitab;
276     real             vgb,fgb,vgbsum,dvdasum,gbscale,gbtabscale,isaprod,gbqqfactor,gbinvepsdiff,dvdaj,gbeps,dvdatmp;
277     real             *invsqrta,*dvda,*gbtab;
278     int              vfitab;
279     real             rt,vfeps,vftabscale,Y,F,Geps,Heps2,Fp,VV,FF;
280     real             *vftab;
281
282     x                = xx[0];
283     f                = ff[0];
284
285     nri              = nlist->nri;
286     iinr             = nlist->iinr;
287     jindex           = nlist->jindex;
288     jjnr             = nlist->jjnr;
289     shiftidx         = nlist->shift;
290     gid              = nlist->gid;
291     shiftvec         = fr->shift_vec[0];
292     fshift           = fr->fshift[0];
293     facel            = fr->epsfac;
294     charge           = mdatoms->chargeA;
295
296     invsqrta         = fr->invsqrta;
297     dvda             = fr->dvda;
298     gbtabscale       = fr->gbtab.scale;
299     gbtab            = fr->gbtab.data;
300     gbinvepsdiff     = (1.0/fr->epsilon_r) - (1.0/fr->gb_epsilon_solvent);
301
302     outeriter        = 0;
303     inneriter        = 0;
304
305     /* Start outer loop over neighborlists */
306     for(iidx=0; iidx<nri; iidx++)
307     {
308         /* Load shift vector for this list */
309         i_shift_offset   = DIM*shiftidx[iidx];
310         shX              = shiftvec[i_shift_offset+XX];
311         shY              = shiftvec[i_shift_offset+YY];
312         shZ              = shiftvec[i_shift_offset+ZZ];
313
314         /* Load limits for loop over neighbors */
315         j_index_start    = jindex[iidx];
316         j_index_end      = jindex[iidx+1];
317
318         /* Get outer coordinate index */
319         inr              = iinr[iidx];
320         i_coord_offset   = DIM*inr;
321
322         /* Load i particle coords and add shift vector */
323         ix0              = shX + x[i_coord_offset+DIM*0+XX];
324         iy0              = shY + x[i_coord_offset+DIM*0+YY];
325         iz0              = shZ + x[i_coord_offset+DIM*0+ZZ];
326
327         fix0             = 0.0;
328         fiy0             = 0.0;
329         fiz0             = 0.0;
330
331         /* Load parameters for i particles */
332         iq0              = facel*charge[inr+0];
333         isai0            = invsqrta[inr+0];
334
335         dvdasum          = 0.0;
336
337         /* Start inner kernel loop */
338         for(jidx=j_index_start; jidx<j_index_end; jidx++)
339         {
340             /* Get j neighbor index, and coordinate index */
341             jnr              = jjnr[jidx];
342             j_coord_offset   = DIM*jnr;
343
344             /* load j atom coordinates */
345             jx0              = x[j_coord_offset+DIM*0+XX];
346             jy0              = x[j_coord_offset+DIM*0+YY];
347             jz0              = x[j_coord_offset+DIM*0+ZZ];
348
349             /* Calculate displacement vector */
350             dx00             = ix0 - jx0;
351             dy00             = iy0 - jy0;
352             dz00             = iz0 - jz0;
353
354             /* Calculate squared distance and things based on it */
355             rsq00            = dx00*dx00+dy00*dy00+dz00*dz00;
356
357             rinv00           = gmx_invsqrt(rsq00);
358
359             /* Load parameters for j particles */
360             jq0              = charge[jnr+0];
361             isaj0           = invsqrta[jnr+0];
362
363             /**************************
364              * CALCULATE INTERACTIONS *
365              **************************/
366
367             r00              = rsq00*rinv00;
368
369             qq00             = iq0*jq0;
370
371             /* GENERALIZED BORN AND COULOMB ELECTROSTATICS */
372             isaprod          = isai0*isaj0;
373             gbqqfactor       = isaprod*(-qq00)*gbinvepsdiff;
374             gbscale          = isaprod*gbtabscale;
375             dvdaj            = dvda[jnr+0];
376
377             /* Calculate generalized born table index - this is a separate table from the normal one,
378              * but we use the same procedure by multiplying r with scale and truncating to integer.
379              */
380             rt               = r00*gbscale;
381             gbitab           = rt;
382             gbeps            = rt-gbitab;
383             gbitab           = 4*gbitab;
384
385             Y                = gbtab[gbitab];
386             F                = gbtab[gbitab+1];
387             Geps             = gbeps*gbtab[gbitab+2];
388             Heps2            = gbeps*gbeps*gbtab[gbitab+3];
389             Fp               = F+Geps+Heps2;
390             VV               = Y+gbeps*Fp;
391             vgb              = gbqqfactor*VV;
392
393             FF               = Fp+Geps+2.0*Heps2;
394             fgb              = gbqqfactor*FF*gbscale;
395             dvdatmp          = -0.5*(vgb+fgb*r00);
396             dvdasum          = dvdasum + dvdatmp;
397             dvda[jnr]        = dvdaj+dvdatmp*isaj0*isaj0;
398             velec            = qq00*rinv00;
399             felec            = (velec*rinv00-fgb)*rinv00;
400
401             fscal            = felec;
402
403             /* Calculate temporary vectorial force */
404             tx               = fscal*dx00;
405             ty               = fscal*dy00;
406             tz               = fscal*dz00;
407
408             /* Update vectorial force */
409             fix0            += tx;
410             fiy0            += ty;
411             fiz0            += tz;
412             f[j_coord_offset+DIM*0+XX] -= tx;
413             f[j_coord_offset+DIM*0+YY] -= ty;
414             f[j_coord_offset+DIM*0+ZZ] -= tz;
415
416             /* Inner loop uses 56 flops */
417         }
418         /* End of innermost loop */
419
420         tx = ty = tz = 0;
421         f[i_coord_offset+DIM*0+XX] += fix0;
422         f[i_coord_offset+DIM*0+YY] += fiy0;
423         f[i_coord_offset+DIM*0+ZZ] += fiz0;
424         tx                         += fix0;
425         ty                         += fiy0;
426         tz                         += fiz0;
427         fshift[i_shift_offset+XX]  += tx;
428         fshift[i_shift_offset+YY]  += ty;
429         fshift[i_shift_offset+ZZ]  += tz;
430
431         dvda[inr]                   = dvda[inr] + dvdasum*isai0*isai0;
432
433         /* Increment number of inner iterations */
434         inneriter                  += j_index_end - j_index_start;
435
436         /* Outer loop uses 13 flops */
437     }
438
439     /* Increment number of outer iterations */
440     outeriter        += nri;
441
442     /* Update outer/inner flops */
443
444     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_F,outeriter*13 + inneriter*56);
445 }