Merge remote-tracking branch 'origin/release-4-6' into HEAD
[alexxy/gromacs.git] / src / gromacs / gmxlib / nonbonded / nb_kernel_adress_c / nb_kernel234_c_adress.c
1 /*
2  * Copyright (c) Erik Lindahl, David van der Spoel 2003
3  * 
4  * This file is generated automatically at compile time
5  * by the program mknb in the Gromacs distribution.
6  *
7  * Options used when generation this file:
8  * Language:         c
9  * Precision:        single
10  * Threads:          yes
11  * Software invsqrt: no
12  * PowerPC invsqrt:  no
13  * Prefetch forces:  no
14  * Adress kernel:  yes
15  * Comments:         no
16  */
17 #ifdef HAVE_CONFIG_H
18 #include<config.h>
19 #endif
20 #ifdef GMX_THREAD_SHM_FDECOMP
21 #include<thread_mpi.h>
22 #endif
23 #define ALMOST_ZERO 1e-30
24 #define ALMOST_ONE 1-(1e-30)
25 #include<math.h>
26
27 #include "nb_kernel234_adress.h"
28
29
30
31 /*
32  * Gromacs nonbonded kernel nb_kernel234_adress_cg
33  * Coulomb interaction:     Reaction field
34  * VdW interaction:         Tabulated
35  * water optimization:      pairs of TIP4P interactions
36  * Calculate forces:        yes
37  */
38 void nb_kernel234_adress_cg(
39                     int *           p_nri,
40                     int *           iinr,
41                     int *           jindex,
42                     int *           jjnr,
43                     int *           shift,
44                     real *         shiftvec,
45                     real *         fshift,
46                     int *           gid,
47                     real *         pos,
48                     real *         faction,
49                     real *         charge,
50                     real *         p_facel,
51                     real *         p_krf,
52                     real *         p_crf,
53                     real *         Vc,
54                     int *           type,
55                     int *           p_ntype,
56                     real *         vdwparam,
57                     real *         Vvdw,
58                     real *         p_tabscale,
59                     real *         VFtab,
60                     real *         invsqrta,
61                     real *         dvda,
62                     real *         p_gbtabscale,
63                     real *         GBtab,
64                     int *           p_nthreads,
65                     int *           count,
66                     void *          mtx,
67                     int *           outeriter,
68                     int *           inneriter,
69                     real           force_cap,
70                     real *         wf)
71 {
72     int           nri,ntype,nthreads;
73     real         facel,krf,crf,tabscale,gbtabscale;
74     int           n,ii,is3,ii3,k,nj0,nj1,jnr,j3,ggid;
75     int           nn0,nn1,nouter,ninner;
76     real         shX,shY,shZ;
77     real         fscal,tx,ty,tz;
78     real         rinvsq;
79     real         qq,vcoul,vctot;
80     int           tj;
81     real         Vvdw6,Vvdwtot;
82     real         Vvdw12;
83     real         r,rt,eps,eps2;
84     int           n0,nnn;
85     real         Y,F,Geps,Heps2,Fp,VV;
86     real         FF;
87     real         fijD,fijR;
88     real         krsq;
89     real         ix1,iy1,iz1,fix1,fiy1,fiz1;
90     real         ix2,iy2,iz2,fix2,fiy2,fiz2;
91     real         ix3,iy3,iz3,fix3,fiy3,fiz3;
92     real         ix4,iy4,iz4,fix4,fiy4,fiz4;
93     real         jx1,jy1,jz1;
94     real         jx2,jy2,jz2,fjx2,fjy2,fjz2;
95     real         jx3,jy3,jz3,fjx3,fjy3,fjz3;
96     real         jx4,jy4,jz4,fjx4,fjy4,fjz4;
97     real         dx11,dy11,dz11,rsq11,rinv11;
98     real         dx22,dy22,dz22,rsq22,rinv22;
99     real         dx23,dy23,dz23,rsq23,rinv23;
100     real         dx24,dy24,dz24,rsq24,rinv24;
101     real         dx32,dy32,dz32,rsq32,rinv32;
102     real         dx33,dy33,dz33,rsq33,rinv33;
103     real         dx34,dy34,dz34,rsq34,rinv34;
104     real         dx42,dy42,dz42,rsq42,rinv42;
105     real         dx43,dy43,dz43,rsq43,rinv43;
106     real         dx44,dy44,dz44,rsq44,rinv44;
107     real         qH,qM,qqMM,qqMH,qqHH;
108     real         c6,c12;
109     real         weight_cg1, weight_cg2, weight_product;
110     real         hybscal;
111
112     nri              = *p_nri;         
113     ntype            = *p_ntype;       
114     nthreads         = *p_nthreads;    
115     facel            = *p_facel;       
116     krf              = *p_krf;         
117     crf              = *p_crf;         
118     tabscale         = *p_tabscale;    
119     ii               = iinr[0];        
120     qH               = charge[ii+1];   
121     qM               = charge[ii+3];   
122     qqMM             = facel*qM*qM;    
123     qqMH             = facel*qM*qH;    
124     qqHH             = facel*qH*qH;    
125     tj               = 2*(ntype+1)*type[ii];
126     c6               = vdwparam[tj];   
127     c12              = vdwparam[tj+1]; 
128
129     nouter           = 0;              
130     ninner           = 0;              
131     
132     do
133     {
134         #ifdef GMX_THREAD_SHM_FDECOMP
135         tMPI_Thread_mutex_lock((tMPI_Thread_mutex_t *)mtx);
136         nn0              = *count;         
137         nn1              = nn0+(nri-nn0)/(2*nthreads)+10;
138         *count           = nn1;            
139         tMPI_Thread_mutex_unlock((tMPI_Thread_mutex_t *)mtx);
140         if(nn1>nri) nn1=nri;
141         #else
142         nn0 = 0;
143         nn1 = nri;
144         #endif
145         
146         for(n=nn0; (n<nn1); n++)
147         {
148             is3              = 3*shift[n];     
149             shX              = shiftvec[is3];  
150             shY              = shiftvec[is3+1];
151             shZ              = shiftvec[is3+2];
152             nj0              = jindex[n];      
153             nj1              = jindex[n+1];    
154             ii               = iinr[n];        
155             ii3              = 3*ii;           
156             ix1              = shX + pos[ii3+0];
157             iy1              = shY + pos[ii3+1];
158             iz1              = shZ + pos[ii3+2];
159             ix2              = shX + pos[ii3+3];
160             iy2              = shY + pos[ii3+4];
161             iz2              = shZ + pos[ii3+5];
162             ix3              = shX + pos[ii3+6];
163             iy3              = shY + pos[ii3+7];
164             iz3              = shZ + pos[ii3+8];
165             ix4              = shX + pos[ii3+9];
166             iy4              = shY + pos[ii3+10];
167             iz4              = shZ + pos[ii3+11];
168             weight_cg1       = wf[ii];         
169             vctot            = 0;              
170             Vvdwtot          = 0;              
171             fix1             = 0;              
172             fiy1             = 0;              
173             fiz1             = 0;              
174             fix2             = 0;              
175             fiy2             = 0;              
176             fiz2             = 0;              
177             fix3             = 0;              
178             fiy3             = 0;              
179             fiz3             = 0;              
180             fix4             = 0;              
181             fiy4             = 0;              
182             fiz4             = 0;              
183             
184             for(k=nj0; (k<nj1); k++)
185             {
186                 jnr              = jjnr[k];        
187                 weight_cg2       = wf[jnr];        
188                 weight_product   = weight_cg1*weight_cg2;
189                 if (weight_product < ALMOST_ZERO) {
190                        hybscal = 1.0;
191                 }
192                 else if (weight_product >= ALMOST_ONE)
193                 {
194                   /* force is zero, skip this molecule */
195                        continue;
196                 }
197                 else
198                 {
199                    hybscal = 1.0 - weight_product;
200                 }
201                 j3               = 3*jnr;          
202                 jx1              = pos[j3+0];      
203                 jy1              = pos[j3+1];      
204                 jz1              = pos[j3+2];      
205                 jx2              = pos[j3+3];      
206                 jy2              = pos[j3+4];      
207                 jz2              = pos[j3+5];      
208                 jx3              = pos[j3+6];      
209                 jy3              = pos[j3+7];      
210                 jz3              = pos[j3+8];      
211                 jx4              = pos[j3+9];      
212                 jy4              = pos[j3+10];     
213                 jz4              = pos[j3+11];     
214                 dx11             = ix1 - jx1;      
215                 dy11             = iy1 - jy1;      
216                 dz11             = iz1 - jz1;      
217                 rsq11            = dx11*dx11+dy11*dy11+dz11*dz11;
218                 dx22             = ix2 - jx2;      
219                 dy22             = iy2 - jy2;      
220                 dz22             = iz2 - jz2;      
221                 rsq22            = dx22*dx22+dy22*dy22+dz22*dz22;
222                 dx23             = ix2 - jx3;      
223                 dy23             = iy2 - jy3;      
224                 dz23             = iz2 - jz3;      
225                 rsq23            = dx23*dx23+dy23*dy23+dz23*dz23;
226                 dx24             = ix2 - jx4;      
227                 dy24             = iy2 - jy4;      
228                 dz24             = iz2 - jz4;      
229                 rsq24            = dx24*dx24+dy24*dy24+dz24*dz24;
230                 dx32             = ix3 - jx2;      
231                 dy32             = iy3 - jy2;      
232                 dz32             = iz3 - jz2;      
233                 rsq32            = dx32*dx32+dy32*dy32+dz32*dz32;
234                 dx33             = ix3 - jx3;      
235                 dy33             = iy3 - jy3;      
236                 dz33             = iz3 - jz3;      
237                 rsq33            = dx33*dx33+dy33*dy33+dz33*dz33;
238                 dx34             = ix3 - jx4;      
239                 dy34             = iy3 - jy4;      
240                 dz34             = iz3 - jz4;      
241                 rsq34            = dx34*dx34+dy34*dy34+dz34*dz34;
242                 dx42             = ix4 - jx2;      
243                 dy42             = iy4 - jy2;      
244                 dz42             = iz4 - jz2;      
245                 rsq42            = dx42*dx42+dy42*dy42+dz42*dz42;
246                 dx43             = ix4 - jx3;      
247                 dy43             = iy4 - jy3;      
248                 dz43             = iz4 - jz3;      
249                 rsq43            = dx43*dx43+dy43*dy43+dz43*dz43;
250                 dx44             = ix4 - jx4;      
251                 dy44             = iy4 - jy4;      
252                 dz44             = iz4 - jz4;      
253                 rsq44            = dx44*dx44+dy44*dy44+dz44*dz44;
254                 rinv11           = 1.0/sqrt(rsq11);
255                 rinv22           = 1.0/sqrt(rsq22);
256                 rinv23           = 1.0/sqrt(rsq23);
257                 rinv24           = 1.0/sqrt(rsq24);
258                 rinv32           = 1.0/sqrt(rsq32);
259                 rinv33           = 1.0/sqrt(rsq33);
260                 rinv34           = 1.0/sqrt(rsq34);
261                 rinv42           = 1.0/sqrt(rsq42);
262                 rinv43           = 1.0/sqrt(rsq43);
263                 rinv44           = 1.0/sqrt(rsq44);
264                 r                = rsq11*rinv11;   
265                 rt               = r*tabscale;     
266                 n0               = rt;             
267                 eps              = rt-n0;          
268                 eps2             = eps*eps;        
269                 nnn              = 8*n0;           
270                 Y                = VFtab[nnn];     
271                 F                = VFtab[nnn+1];   
272                 Geps             = eps*VFtab[nnn+2];
273                 Heps2            = eps2*VFtab[nnn+3];
274                 Fp               = F+Geps+Heps2;   
275                 VV               = Y+eps*Fp;       
276                 FF               = Fp+Geps+2.0*Heps2;
277                 Vvdw6            = c6*VV;          
278                 fijD             = c6*FF;          
279                 nnn              = nnn+4;          
280                 Y                = VFtab[nnn];     
281                 F                = VFtab[nnn+1];   
282                 Geps             = eps*VFtab[nnn+2];
283                 Heps2            = eps2*VFtab[nnn+3];
284                 Fp               = F+Geps+Heps2;   
285                 VV               = Y+eps*Fp;       
286                 FF               = Fp+Geps+2.0*Heps2;
287                 Vvdw12           = c12*VV;         
288                 fijR             = c12*FF;         
289                 Vvdwtot          = Vvdwtot+ Vvdw6 + Vvdw12;
290                 fscal            = -((fijD+fijR)*tabscale)*rinv11;
291                 fscal *= hybscal;
292                 tx               = fscal*dx11;     
293                 ty               = fscal*dy11;     
294                 tz               = fscal*dz11;     
295                 fix1             = fix1 + tx;      
296                 fiy1             = fiy1 + ty;      
297                 fiz1             = fiz1 + tz;      
298                 faction[j3+0]    = faction[j3+0] - tx;
299                 faction[j3+1]    = faction[j3+1] - ty;
300                 faction[j3+2]    = faction[j3+2] - tz;
301                 qq               = qqHH;           
302                 rinvsq           = rinv22*rinv22;  
303                 krsq             = krf*rsq22;      
304                 vcoul            = qq*(rinv22+krsq-crf);
305                 vctot            = vctot+vcoul;    
306                 fscal            = (qq*(rinv22-2.0*krsq))*rinvsq;
307                 fscal *= hybscal;
308                 tx               = fscal*dx22;     
309                 ty               = fscal*dy22;     
310                 tz               = fscal*dz22;     
311                 fix2             = fix2 + tx;      
312                 fiy2             = fiy2 + ty;      
313                 fiz2             = fiz2 + tz;      
314                 fjx2             = faction[j3+3] - tx;
315                 fjy2             = faction[j3+4] - ty;
316                 fjz2             = faction[j3+5] - tz;
317                 qq               = qqHH;           
318                 rinvsq           = rinv23*rinv23;  
319                 krsq             = krf*rsq23;      
320                 vcoul            = qq*(rinv23+krsq-crf);
321                 vctot            = vctot+vcoul;    
322                 fscal            = (qq*(rinv23-2.0*krsq))*rinvsq;
323                 fscal *= hybscal;
324                 tx               = fscal*dx23;     
325                 ty               = fscal*dy23;     
326                 tz               = fscal*dz23;     
327                 fix2             = fix2 + tx;      
328                 fiy2             = fiy2 + ty;      
329                 fiz2             = fiz2 + tz;      
330                 fjx3             = faction[j3+6] - tx;
331                 fjy3             = faction[j3+7] - ty;
332                 fjz3             = faction[j3+8] - tz;
333                 qq               = qqMH;           
334                 rinvsq           = rinv24*rinv24;  
335                 krsq             = krf*rsq24;      
336                 vcoul            = qq*(rinv24+krsq-crf);
337                 vctot            = vctot+vcoul;    
338                 fscal            = (qq*(rinv24-2.0*krsq))*rinvsq;
339                 fscal *= hybscal;
340                 tx               = fscal*dx24;     
341                 ty               = fscal*dy24;     
342                 tz               = fscal*dz24;     
343                 fix2             = fix2 + tx;      
344                 fiy2             = fiy2 + ty;      
345                 fiz2             = fiz2 + tz;      
346                 fjx4             = faction[j3+9] - tx;
347                 fjy4             = faction[j3+10] - ty;
348                 fjz4             = faction[j3+11] - tz;
349                 qq               = qqHH;           
350                 rinvsq           = rinv32*rinv32;  
351                 krsq             = krf*rsq32;      
352                 vcoul            = qq*(rinv32+krsq-crf);
353                 vctot            = vctot+vcoul;    
354                 fscal            = (qq*(rinv32-2.0*krsq))*rinvsq;
355                 fscal *= hybscal;
356                 tx               = fscal*dx32;     
357                 ty               = fscal*dy32;     
358                 tz               = fscal*dz32;     
359                 fix3             = fix3 + tx;      
360                 fiy3             = fiy3 + ty;      
361                 fiz3             = fiz3 + tz;      
362                 fjx2             = fjx2 - tx;      
363                 fjy2             = fjy2 - ty;      
364                 fjz2             = fjz2 - tz;      
365                 qq               = qqHH;           
366                 rinvsq           = rinv33*rinv33;  
367                 krsq             = krf*rsq33;      
368                 vcoul            = qq*(rinv33+krsq-crf);
369                 vctot            = vctot+vcoul;    
370                 fscal            = (qq*(rinv33-2.0*krsq))*rinvsq;
371                 fscal *= hybscal;
372                 tx               = fscal*dx33;     
373                 ty               = fscal*dy33;     
374                 tz               = fscal*dz33;     
375                 fix3             = fix3 + tx;      
376                 fiy3             = fiy3 + ty;      
377                 fiz3             = fiz3 + tz;      
378                 fjx3             = fjx3 - tx;      
379                 fjy3             = fjy3 - ty;      
380                 fjz3             = fjz3 - tz;      
381                 qq               = qqMH;           
382                 rinvsq           = rinv34*rinv34;  
383                 krsq             = krf*rsq34;      
384                 vcoul            = qq*(rinv34+krsq-crf);
385                 vctot            = vctot+vcoul;    
386                 fscal            = (qq*(rinv34-2.0*krsq))*rinvsq;
387                 fscal *= hybscal;
388                 tx               = fscal*dx34;     
389                 ty               = fscal*dy34;     
390                 tz               = fscal*dz34;     
391                 fix3             = fix3 + tx;      
392                 fiy3             = fiy3 + ty;      
393                 fiz3             = fiz3 + tz;      
394                 fjx4             = fjx4 - tx;      
395                 fjy4             = fjy4 - ty;      
396                 fjz4             = fjz4 - tz;      
397                 qq               = qqMH;           
398                 rinvsq           = rinv42*rinv42;  
399                 krsq             = krf*rsq42;      
400                 vcoul            = qq*(rinv42+krsq-crf);
401                 vctot            = vctot+vcoul;    
402                 fscal            = (qq*(rinv42-2.0*krsq))*rinvsq;
403                 fscal *= hybscal;
404                 tx               = fscal*dx42;     
405                 ty               = fscal*dy42;     
406                 tz               = fscal*dz42;     
407                 fix4             = fix4 + tx;      
408                 fiy4             = fiy4 + ty;      
409                 fiz4             = fiz4 + tz;      
410                 faction[j3+3]    = fjx2 - tx;      
411                 faction[j3+4]    = fjy2 - ty;      
412                 faction[j3+5]    = fjz2 - tz;      
413                 qq               = qqMH;           
414                 rinvsq           = rinv43*rinv43;  
415                 krsq             = krf*rsq43;      
416                 vcoul            = qq*(rinv43+krsq-crf);
417                 vctot            = vctot+vcoul;    
418                 fscal            = (qq*(rinv43-2.0*krsq))*rinvsq;
419                 fscal *= hybscal;
420                 tx               = fscal*dx43;     
421                 ty               = fscal*dy43;     
422                 tz               = fscal*dz43;     
423                 fix4             = fix4 + tx;      
424                 fiy4             = fiy4 + ty;      
425                 fiz4             = fiz4 + tz;      
426                 faction[j3+6]    = fjx3 - tx;      
427                 faction[j3+7]    = fjy3 - ty;      
428                 faction[j3+8]    = fjz3 - tz;      
429                 qq               = qqMM;           
430                 rinvsq           = rinv44*rinv44;  
431                 krsq             = krf*rsq44;      
432                 vcoul            = qq*(rinv44+krsq-crf);
433                 vctot            = vctot+vcoul;    
434                 fscal            = (qq*(rinv44-2.0*krsq))*rinvsq;
435                 fscal *= hybscal;
436                 tx               = fscal*dx44;     
437                 ty               = fscal*dy44;     
438                 tz               = fscal*dz44;     
439                 fix4             = fix4 + tx;      
440                 fiy4             = fiy4 + ty;      
441                 fiz4             = fiz4 + tz;      
442                 faction[j3+9]    = fjx4 - tx;      
443                 faction[j3+10]   = fjy4 - ty;      
444                 faction[j3+11]   = fjz4 - tz;      
445             }
446             
447             faction[ii3+0]   = faction[ii3+0] + fix1;
448             faction[ii3+1]   = faction[ii3+1] + fiy1;
449             faction[ii3+2]   = faction[ii3+2] + fiz1;
450             faction[ii3+3]   = faction[ii3+3] + fix2;
451             faction[ii3+4]   = faction[ii3+4] + fiy2;
452             faction[ii3+5]   = faction[ii3+5] + fiz2;
453             faction[ii3+6]   = faction[ii3+6] + fix3;
454             faction[ii3+7]   = faction[ii3+7] + fiy3;
455             faction[ii3+8]   = faction[ii3+8] + fiz3;
456             faction[ii3+9]   = faction[ii3+9] + fix4;
457             faction[ii3+10]  = faction[ii3+10] + fiy4;
458             faction[ii3+11]  = faction[ii3+11] + fiz4;
459             fshift[is3]      = fshift[is3]+fix1+fix2+fix3+fix4;
460             fshift[is3+1]    = fshift[is3+1]+fiy1+fiy2+fiy3+fiy4;
461             fshift[is3+2]    = fshift[is3+2]+fiz1+fiz2+fiz3+fiz4;
462             ggid             = gid[n];         
463             Vc[ggid]         = Vc[ggid] + vctot;
464             Vvdw[ggid]       = Vvdw[ggid] + Vvdwtot;
465             ninner           = ninner + nj1 - nj0;
466         }
467         
468         nouter           = nouter + nn1 - nn0;
469     }
470     while (nn1<nri);
471     
472     *outeriter       = nouter;         
473     *inneriter       = ninner;         
474 }
475
476
477
478
479
480 /*
481  * Gromacs nonbonded kernel nb_kernel234_adress_ex
482  * Coulomb interaction:     Reaction field
483  * VdW interaction:         Tabulated
484  * water optimization:      pairs of TIP4P interactions
485  * Calculate forces:        yes
486  */
487 void nb_kernel234_adress_ex(
488                     int *           p_nri,
489                     int *           iinr,
490                     int *           jindex,
491                     int *           jjnr,
492                     int *           shift,
493                     real *         shiftvec,
494                     real *         fshift,
495                     int *           gid,
496                     real *         pos,
497                     real *         faction,
498                     real *         charge,
499                     real *         p_facel,
500                     real *         p_krf,
501                     real *         p_crf,
502                     real *         Vc,
503                     int *           type,
504                     int *           p_ntype,
505                     real *         vdwparam,
506                     real *         Vvdw,
507                     real *         p_tabscale,
508                     real *         VFtab,
509                     real *         invsqrta,
510                     real *         dvda,
511                     real *         p_gbtabscale,
512                     real *         GBtab,
513                     int *           p_nthreads,
514                     int *           count,
515                     void *          mtx,
516                     int *           outeriter,
517                     int *           inneriter,
518                     real           force_cap,
519                     real *         wf)
520 {
521     int           nri,ntype,nthreads;
522     real         facel,krf,crf,tabscale,gbtabscale;
523     int           n,ii,is3,ii3,k,nj0,nj1,jnr,j3,ggid;
524     int           nn0,nn1,nouter,ninner;
525     real         shX,shY,shZ;
526     real         fscal,tx,ty,tz;
527     real         rinvsq;
528     real         qq,vcoul,vctot;
529     int           tj;
530     real         Vvdw6,Vvdwtot;
531     real         Vvdw12;
532     real         r,rt,eps,eps2;
533     int           n0,nnn;
534     real         Y,F,Geps,Heps2,Fp,VV;
535     real         FF;
536     real         fijD,fijR;
537     real         krsq;
538     real         ix1,iy1,iz1,fix1,fiy1,fiz1;
539     real         ix2,iy2,iz2,fix2,fiy2,fiz2;
540     real         ix3,iy3,iz3,fix3,fiy3,fiz3;
541     real         ix4,iy4,iz4,fix4,fiy4,fiz4;
542     real         jx1,jy1,jz1;
543     real         jx2,jy2,jz2,fjx2,fjy2,fjz2;
544     real         jx3,jy3,jz3,fjx3,fjy3,fjz3;
545     real         jx4,jy4,jz4,fjx4,fjy4,fjz4;
546     real         dx11,dy11,dz11,rsq11,rinv11;
547     real         dx22,dy22,dz22,rsq22,rinv22;
548     real         dx23,dy23,dz23,rsq23,rinv23;
549     real         dx24,dy24,dz24,rsq24,rinv24;
550     real         dx32,dy32,dz32,rsq32,rinv32;
551     real         dx33,dy33,dz33,rsq33,rinv33;
552     real         dx34,dy34,dz34,rsq34,rinv34;
553     real         dx42,dy42,dz42,rsq42,rinv42;
554     real         dx43,dy43,dz43,rsq43,rinv43;
555     real         dx44,dy44,dz44,rsq44,rinv44;
556     real         qH,qM,qqMM,qqMH,qqHH;
557     real         c6,c12;
558     real         weight_cg1, weight_cg2, weight_product;
559     real         hybscal;
560
561     nri              = *p_nri;         
562     ntype            = *p_ntype;       
563     nthreads         = *p_nthreads;    
564     facel            = *p_facel;       
565     krf              = *p_krf;         
566     crf              = *p_crf;         
567     tabscale         = *p_tabscale;    
568     ii               = iinr[0];        
569     qH               = charge[ii+1];   
570     qM               = charge[ii+3];   
571     qqMM             = facel*qM*qM;    
572     qqMH             = facel*qM*qH;    
573     qqHH             = facel*qH*qH;    
574     tj               = 2*(ntype+1)*type[ii];
575     c6               = vdwparam[tj];   
576     c12              = vdwparam[tj+1]; 
577
578     nouter           = 0;              
579     ninner           = 0;              
580     
581     do
582     {
583         #ifdef GMX_THREAD_SHM_FDECOMP
584         tMPI_Thread_mutex_lock((tMPI_Thread_mutex_t *)mtx);
585         nn0              = *count;         
586         nn1              = nn0+(nri-nn0)/(2*nthreads)+10;
587         *count           = nn1;            
588         tMPI_Thread_mutex_unlock((tMPI_Thread_mutex_t *)mtx);
589         if(nn1>nri) nn1=nri;
590         #else
591         nn0 = 0;
592         nn1 = nri;
593         #endif
594         
595         for(n=nn0; (n<nn1); n++)
596         {
597             is3              = 3*shift[n];     
598             shX              = shiftvec[is3];  
599             shY              = shiftvec[is3+1];
600             shZ              = shiftvec[is3+2];
601             nj0              = jindex[n];      
602             nj1              = jindex[n+1];    
603             ii               = iinr[n];        
604             ii3              = 3*ii;           
605             ix1              = shX + pos[ii3+0];
606             iy1              = shY + pos[ii3+1];
607             iz1              = shZ + pos[ii3+2];
608             ix2              = shX + pos[ii3+3];
609             iy2              = shY + pos[ii3+4];
610             iz2              = shZ + pos[ii3+5];
611             ix3              = shX + pos[ii3+6];
612             iy3              = shY + pos[ii3+7];
613             iz3              = shZ + pos[ii3+8];
614             ix4              = shX + pos[ii3+9];
615             iy4              = shY + pos[ii3+10];
616             iz4              = shZ + pos[ii3+11];
617             weight_cg1       = wf[ii];         
618             vctot            = 0;              
619             Vvdwtot          = 0;              
620             fix1             = 0;              
621             fiy1             = 0;              
622             fiz1             = 0;              
623             fix2             = 0;              
624             fiy2             = 0;              
625             fiz2             = 0;              
626             fix3             = 0;              
627             fiy3             = 0;              
628             fiz3             = 0;              
629             fix4             = 0;              
630             fiy4             = 0;              
631             fiz4             = 0;              
632             
633             for(k=nj0; (k<nj1); k++)
634             {
635                 jnr              = jjnr[k];        
636                 weight_cg2       = wf[jnr];        
637                 weight_product   = weight_cg1*weight_cg2;
638                 if (weight_product < ALMOST_ZERO) {
639                 /* force is zero, skip this molecule */
640                  continue;
641                 }
642                 else if (weight_product >= ALMOST_ONE)
643                 {
644                        hybscal = 1.0;
645                 }
646                 else
647                 {
648                    hybscal = weight_product;
649                 }
650                 j3               = 3*jnr;          
651                 jx1              = pos[j3+0];      
652                 jy1              = pos[j3+1];      
653                 jz1              = pos[j3+2];      
654                 jx2              = pos[j3+3];      
655                 jy2              = pos[j3+4];      
656                 jz2              = pos[j3+5];      
657                 jx3              = pos[j3+6];      
658                 jy3              = pos[j3+7];      
659                 jz3              = pos[j3+8];      
660                 jx4              = pos[j3+9];      
661                 jy4              = pos[j3+10];     
662                 jz4              = pos[j3+11];     
663                 dx11             = ix1 - jx1;      
664                 dy11             = iy1 - jy1;      
665                 dz11             = iz1 - jz1;      
666                 rsq11            = dx11*dx11+dy11*dy11+dz11*dz11;
667                 dx22             = ix2 - jx2;      
668                 dy22             = iy2 - jy2;      
669                 dz22             = iz2 - jz2;      
670                 rsq22            = dx22*dx22+dy22*dy22+dz22*dz22;
671                 dx23             = ix2 - jx3;      
672                 dy23             = iy2 - jy3;      
673                 dz23             = iz2 - jz3;      
674                 rsq23            = dx23*dx23+dy23*dy23+dz23*dz23;
675                 dx24             = ix2 - jx4;      
676                 dy24             = iy2 - jy4;      
677                 dz24             = iz2 - jz4;      
678                 rsq24            = dx24*dx24+dy24*dy24+dz24*dz24;
679                 dx32             = ix3 - jx2;      
680                 dy32             = iy3 - jy2;      
681                 dz32             = iz3 - jz2;      
682                 rsq32            = dx32*dx32+dy32*dy32+dz32*dz32;
683                 dx33             = ix3 - jx3;      
684                 dy33             = iy3 - jy3;      
685                 dz33             = iz3 - jz3;      
686                 rsq33            = dx33*dx33+dy33*dy33+dz33*dz33;
687                 dx34             = ix3 - jx4;      
688                 dy34             = iy3 - jy4;      
689                 dz34             = iz3 - jz4;      
690                 rsq34            = dx34*dx34+dy34*dy34+dz34*dz34;
691                 dx42             = ix4 - jx2;      
692                 dy42             = iy4 - jy2;      
693                 dz42             = iz4 - jz2;      
694                 rsq42            = dx42*dx42+dy42*dy42+dz42*dz42;
695                 dx43             = ix4 - jx3;      
696                 dy43             = iy4 - jy3;      
697                 dz43             = iz4 - jz3;      
698                 rsq43            = dx43*dx43+dy43*dy43+dz43*dz43;
699                 dx44             = ix4 - jx4;      
700                 dy44             = iy4 - jy4;      
701                 dz44             = iz4 - jz4;      
702                 rsq44            = dx44*dx44+dy44*dy44+dz44*dz44;
703                 rinv11           = 1.0/sqrt(rsq11);
704                 rinv22           = 1.0/sqrt(rsq22);
705                 rinv23           = 1.0/sqrt(rsq23);
706                 rinv24           = 1.0/sqrt(rsq24);
707                 rinv32           = 1.0/sqrt(rsq32);
708                 rinv33           = 1.0/sqrt(rsq33);
709                 rinv34           = 1.0/sqrt(rsq34);
710                 rinv42           = 1.0/sqrt(rsq42);
711                 rinv43           = 1.0/sqrt(rsq43);
712                 rinv44           = 1.0/sqrt(rsq44);
713                 r                = rsq11*rinv11;   
714                 rt               = r*tabscale;     
715                 n0               = rt;             
716                 eps              = rt-n0;          
717                 eps2             = eps*eps;        
718                 nnn              = 8*n0;           
719                 Y                = VFtab[nnn];     
720                 F                = VFtab[nnn+1];   
721                 Geps             = eps*VFtab[nnn+2];
722                 Heps2            = eps2*VFtab[nnn+3];
723                 Fp               = F+Geps+Heps2;   
724                 VV               = Y+eps*Fp;       
725                 FF               = Fp+Geps+2.0*Heps2;
726                 Vvdw6            = c6*VV;          
727                 fijD             = c6*FF;          
728                 nnn              = nnn+4;          
729                 Y                = VFtab[nnn];     
730                 F                = VFtab[nnn+1];   
731                 Geps             = eps*VFtab[nnn+2];
732                 Heps2            = eps2*VFtab[nnn+3];
733                 Fp               = F+Geps+Heps2;   
734                 VV               = Y+eps*Fp;       
735                 FF               = Fp+Geps+2.0*Heps2;
736                 Vvdw12           = c12*VV;         
737                 fijR             = c12*FF;         
738                 Vvdwtot          = Vvdwtot+ Vvdw6 + Vvdw12;
739                 fscal            = -((fijD+fijR)*tabscale)*rinv11;
740                 fscal *= hybscal;
741                 if(force_cap>0 && (fabs(fscal)> force_cap)){
742                 fscal=force_cap*fscal/fabs(fscal);
743                 }
744                 tx               = fscal*dx11;     
745                 ty               = fscal*dy11;     
746                 tz               = fscal*dz11;     
747                 fix1             = fix1 + tx;      
748                 fiy1             = fiy1 + ty;      
749                 fiz1             = fiz1 + tz;      
750                 faction[j3+0]    = faction[j3+0] - tx;
751                 faction[j3+1]    = faction[j3+1] - ty;
752                 faction[j3+2]    = faction[j3+2] - tz;
753                 qq               = qqHH;           
754                 rinvsq           = rinv22*rinv22;  
755                 krsq             = krf*rsq22;      
756                 vcoul            = qq*(rinv22+krsq-crf);
757                 vctot            = vctot+vcoul;    
758                 fscal            = (qq*(rinv22-2.0*krsq))*rinvsq;
759                 fscal *= hybscal;
760                 if(force_cap>0 && (fabs(fscal)> force_cap)){
761                 fscal=force_cap*fscal/fabs(fscal);
762                 }
763                 tx               = fscal*dx22;     
764                 ty               = fscal*dy22;     
765                 tz               = fscal*dz22;     
766                 fix2             = fix2 + tx;      
767                 fiy2             = fiy2 + ty;      
768                 fiz2             = fiz2 + tz;      
769                 fjx2             = faction[j3+3] - tx;
770                 fjy2             = faction[j3+4] - ty;
771                 fjz2             = faction[j3+5] - tz;
772                 qq               = qqHH;           
773                 rinvsq           = rinv23*rinv23;  
774                 krsq             = krf*rsq23;      
775                 vcoul            = qq*(rinv23+krsq-crf);
776                 vctot            = vctot+vcoul;    
777                 fscal            = (qq*(rinv23-2.0*krsq))*rinvsq;
778                 fscal *= hybscal;
779                 if(force_cap>0 && (fabs(fscal)> force_cap)){
780                 fscal=force_cap*fscal/fabs(fscal);
781                 }
782                 tx               = fscal*dx23;     
783                 ty               = fscal*dy23;     
784                 tz               = fscal*dz23;     
785                 fix2             = fix2 + tx;      
786                 fiy2             = fiy2 + ty;      
787                 fiz2             = fiz2 + tz;      
788                 fjx3             = faction[j3+6] - tx;
789                 fjy3             = faction[j3+7] - ty;
790                 fjz3             = faction[j3+8] - tz;
791                 qq               = qqMH;           
792                 rinvsq           = rinv24*rinv24;  
793                 krsq             = krf*rsq24;      
794                 vcoul            = qq*(rinv24+krsq-crf);
795                 vctot            = vctot+vcoul;    
796                 fscal            = (qq*(rinv24-2.0*krsq))*rinvsq;
797                 fscal *= hybscal;
798                 if(force_cap>0 && (fabs(fscal)> force_cap)){
799                 fscal=force_cap*fscal/fabs(fscal);
800                 }
801                 tx               = fscal*dx24;     
802                 ty               = fscal*dy24;     
803                 tz               = fscal*dz24;     
804                 fix2             = fix2 + tx;      
805                 fiy2             = fiy2 + ty;      
806                 fiz2             = fiz2 + tz;      
807                 fjx4             = faction[j3+9] - tx;
808                 fjy4             = faction[j3+10] - ty;
809                 fjz4             = faction[j3+11] - tz;
810                 qq               = qqHH;           
811                 rinvsq           = rinv32*rinv32;  
812                 krsq             = krf*rsq32;      
813                 vcoul            = qq*(rinv32+krsq-crf);
814                 vctot            = vctot+vcoul;    
815                 fscal            = (qq*(rinv32-2.0*krsq))*rinvsq;
816                 fscal *= hybscal;
817                 if(force_cap>0 && (fabs(fscal)> force_cap)){
818                 fscal=force_cap*fscal/fabs(fscal);
819                 }
820                 tx               = fscal*dx32;     
821                 ty               = fscal*dy32;     
822                 tz               = fscal*dz32;     
823                 fix3             = fix3 + tx;      
824                 fiy3             = fiy3 + ty;      
825                 fiz3             = fiz3 + tz;      
826                 fjx2             = fjx2 - tx;      
827                 fjy2             = fjy2 - ty;      
828                 fjz2             = fjz2 - tz;      
829                 qq               = qqHH;           
830                 rinvsq           = rinv33*rinv33;  
831                 krsq             = krf*rsq33;      
832                 vcoul            = qq*(rinv33+krsq-crf);
833                 vctot            = vctot+vcoul;    
834                 fscal            = (qq*(rinv33-2.0*krsq))*rinvsq;
835                 fscal *= hybscal;
836                 if(force_cap>0 && (fabs(fscal)> force_cap)){
837                 fscal=force_cap*fscal/fabs(fscal);
838                 }
839                 tx               = fscal*dx33;     
840                 ty               = fscal*dy33;     
841                 tz               = fscal*dz33;     
842                 fix3             = fix3 + tx;      
843                 fiy3             = fiy3 + ty;      
844                 fiz3             = fiz3 + tz;      
845                 fjx3             = fjx3 - tx;      
846                 fjy3             = fjy3 - ty;      
847                 fjz3             = fjz3 - tz;      
848                 qq               = qqMH;           
849                 rinvsq           = rinv34*rinv34;  
850                 krsq             = krf*rsq34;      
851                 vcoul            = qq*(rinv34+krsq-crf);
852                 vctot            = vctot+vcoul;    
853                 fscal            = (qq*(rinv34-2.0*krsq))*rinvsq;
854                 fscal *= hybscal;
855                 if(force_cap>0 && (fabs(fscal)> force_cap)){
856                 fscal=force_cap*fscal/fabs(fscal);
857                 }
858                 tx               = fscal*dx34;     
859                 ty               = fscal*dy34;     
860                 tz               = fscal*dz34;     
861                 fix3             = fix3 + tx;      
862                 fiy3             = fiy3 + ty;      
863                 fiz3             = fiz3 + tz;      
864                 fjx4             = fjx4 - tx;      
865                 fjy4             = fjy4 - ty;      
866                 fjz4             = fjz4 - tz;      
867                 qq               = qqMH;           
868                 rinvsq           = rinv42*rinv42;  
869                 krsq             = krf*rsq42;      
870                 vcoul            = qq*(rinv42+krsq-crf);
871                 vctot            = vctot+vcoul;    
872                 fscal            = (qq*(rinv42-2.0*krsq))*rinvsq;
873                 fscal *= hybscal;
874                 if(force_cap>0 && (fabs(fscal)> force_cap)){
875                 fscal=force_cap*fscal/fabs(fscal);
876                 }
877                 tx               = fscal*dx42;     
878                 ty               = fscal*dy42;     
879                 tz               = fscal*dz42;     
880                 fix4             = fix4 + tx;      
881                 fiy4             = fiy4 + ty;      
882                 fiz4             = fiz4 + tz;      
883                 faction[j3+3]    = fjx2 - tx;      
884                 faction[j3+4]    = fjy2 - ty;      
885                 faction[j3+5]    = fjz2 - tz;      
886                 qq               = qqMH;           
887                 rinvsq           = rinv43*rinv43;  
888                 krsq             = krf*rsq43;      
889                 vcoul            = qq*(rinv43+krsq-crf);
890                 vctot            = vctot+vcoul;    
891                 fscal            = (qq*(rinv43-2.0*krsq))*rinvsq;
892                 fscal *= hybscal;
893                 if(force_cap>0 && (fabs(fscal)> force_cap)){
894                 fscal=force_cap*fscal/fabs(fscal);
895                 }
896                 tx               = fscal*dx43;     
897                 ty               = fscal*dy43;     
898                 tz               = fscal*dz43;     
899                 fix4             = fix4 + tx;      
900                 fiy4             = fiy4 + ty;      
901                 fiz4             = fiz4 + tz;      
902                 faction[j3+6]    = fjx3 - tx;      
903                 faction[j3+7]    = fjy3 - ty;      
904                 faction[j3+8]    = fjz3 - tz;      
905                 qq               = qqMM;           
906                 rinvsq           = rinv44*rinv44;  
907                 krsq             = krf*rsq44;      
908                 vcoul            = qq*(rinv44+krsq-crf);
909                 vctot            = vctot+vcoul;    
910                 fscal            = (qq*(rinv44-2.0*krsq))*rinvsq;
911                 fscal *= hybscal;
912                 if(force_cap>0 && (fabs(fscal)> force_cap)){
913                 fscal=force_cap*fscal/fabs(fscal);
914                 }
915                 tx               = fscal*dx44;     
916                 ty               = fscal*dy44;     
917                 tz               = fscal*dz44;     
918                 fix4             = fix4 + tx;      
919                 fiy4             = fiy4 + ty;      
920                 fiz4             = fiz4 + tz;      
921                 faction[j3+9]    = fjx4 - tx;      
922                 faction[j3+10]   = fjy4 - ty;      
923                 faction[j3+11]   = fjz4 - tz;      
924             }
925             
926             faction[ii3+0]   = faction[ii3+0] + fix1;
927             faction[ii3+1]   = faction[ii3+1] + fiy1;
928             faction[ii3+2]   = faction[ii3+2] + fiz1;
929             faction[ii3+3]   = faction[ii3+3] + fix2;
930             faction[ii3+4]   = faction[ii3+4] + fiy2;
931             faction[ii3+5]   = faction[ii3+5] + fiz2;
932             faction[ii3+6]   = faction[ii3+6] + fix3;
933             faction[ii3+7]   = faction[ii3+7] + fiy3;
934             faction[ii3+8]   = faction[ii3+8] + fiz3;
935             faction[ii3+9]   = faction[ii3+9] + fix4;
936             faction[ii3+10]  = faction[ii3+10] + fiy4;
937             faction[ii3+11]  = faction[ii3+11] + fiz4;
938             fshift[is3]      = fshift[is3]+fix1+fix2+fix3+fix4;
939             fshift[is3+1]    = fshift[is3+1]+fiy1+fiy2+fiy3+fiy4;
940             fshift[is3+2]    = fshift[is3+2]+fiz1+fiz2+fiz3+fiz4;
941             ggid             = gid[n];         
942             Vc[ggid]         = Vc[ggid] + vctot;
943             Vvdw[ggid]       = Vvdw[ggid] + Vvdwtot;
944             ninner           = ninner + nj1 - nj0;
945         }
946         
947         nouter           = nouter + nn1 - nn0;
948     }
949     while (nn1<nri);
950     
951     *outeriter       = nouter;         
952     *inneriter       = ninner;         
953 }
954
955