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