2 * Copyright (c) Erik Lindahl, David van der Spoel 2003
4 * This file is generated automatically at compile time
5 * by the program mknb in the Gromacs distribution.
7 * Options used when generation this file:
11 * Software invsqrt: no
20 #ifdef GMX_THREAD_SHM_FDECOMP
21 #include<thread_mpi.h>
23 #define ALMOST_ZERO 1e-30
24 #define ALMOST_ONE 1-(1e-30)
27 #include "nb_kernel223_adress.h"
32 * Gromacs nonbonded kernel nb_kernel223_adress_cg
33 * Coulomb interaction: Reaction field
34 * VdW interaction: Buckingham
35 * water optimization: TIP4P - other atoms
36 * Calculate forces: yes
38 void nb_kernel223_adress_cg(
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;
87 real ix1,iy1,iz1,fix1,fiy1,fiz1;
88 real ix2,iy2,iz2,fix2,fiy2,fiz2;
89 real ix3,iy3,iz3,fix3,fiy3,fiz3;
90 real ix4,iy4,iz4,fix4,fiy4,fiz4;
91 real jx1,jy1,jz1,fjx1,fjy1,fjz1;
92 real dx11,dy11,dz11,rsq11,rinv11;
93 real dx21,dy21,dz21,rsq21,rinv21;
94 real dx31,dy31,dz31,rsq31,rinv31;
95 real dx41,dy41,dz41,rsq41,rinv41;
98 real weight_cg1, weight_cg2, weight_product;
103 nthreads = *p_nthreads;
107 tabscale = *p_tabscale;
109 qH = facel*charge[ii+1];
110 qM = facel*charge[ii+3];
111 nti = 3*ntype*type[ii];
118 #ifdef GMX_THREAD_SHM_FDECOMP
119 tMPI_Thread_mutex_lock((tMPI_Thread_mutex_t *)mtx);
121 nn1 = nn0+(nri-nn0)/(2*nthreads)+10;
123 tMPI_Thread_mutex_unlock((tMPI_Thread_mutex_t *)mtx);
130 for(n=nn0; (n<nn1); n++)
134 shY = shiftvec[is3+1];
135 shZ = shiftvec[is3+2];
140 ix1 = shX + pos[ii3+0];
141 iy1 = shY + pos[ii3+1];
142 iz1 = shZ + pos[ii3+2];
143 ix2 = shX + pos[ii3+3];
144 iy2 = shY + pos[ii3+4];
145 iz2 = shZ + pos[ii3+5];
146 ix3 = shX + pos[ii3+6];
147 iy3 = shY + pos[ii3+7];
148 iz3 = shZ + pos[ii3+8];
149 ix4 = shX + pos[ii3+9];
150 iy4 = shY + pos[ii3+10];
151 iz4 = shZ + pos[ii3+11];
168 for(k=nj0; (k<nj1); k++)
171 weight_cg2 = wf[jnr];
172 weight_product = weight_cg1*weight_cg2;
173 if (weight_product < ALMOST_ZERO) {
176 else if (weight_product >= ALMOST_ONE)
178 /* force is zero, skip this molecule */
183 hybscal = 1.0 - weight_product;
192 rsq11 = dx11*dx11+dy11*dy11+dz11*dz11;
196 rsq21 = dx21*dx21+dy21*dy21+dz21*dz21;
200 rsq31 = dx31*dx31+dy31*dy31+dz31*dz31;
204 rsq41 = dx41*dx41+dy41*dy41+dz41*dz41;
205 rinv11 = 1.0/sqrt(rsq11);
206 rinv21 = 1.0/sqrt(rsq21);
207 rinv31 = 1.0/sqrt(rsq31);
208 rinv41 = 1.0/sqrt(rsq41);
209 tj = nti+3*type[jnr];
211 cexp1 = vdwparam[tj+1];
212 cexp2 = vdwparam[tj+2];
213 rinvsq = rinv11*rinv11;
214 rinvsix = rinvsq*rinvsq*rinvsq;
216 br = cexp2*rsq11*rinv11;
217 Vvdwexp = cexp1*exp(-br);
218 Vvdwtot = Vvdwtot+Vvdwexp-Vvdw6;
219 fscal = (br*Vvdwexp-6.0*Vvdw6)*rinvsq;
227 fjx1 = faction[j3+0] - tx;
228 fjy1 = faction[j3+1] - ty;
229 fjz1 = faction[j3+2] - tz;
232 rinvsq = rinv21*rinv21;
234 vcoul = qq*(rinv21+krsq-crf);
236 fscal = (qq*(rinv21-2.0*krsq))*rinvsq;
247 rinvsq = rinv31*rinv31;
249 vcoul = qq*(rinv31+krsq-crf);
251 fscal = (qq*(rinv31-2.0*krsq))*rinvsq;
263 rinvsq = rinv41*rinv41;
265 vcoul = qq*(rinv41+krsq-crf);
267 fscal = (qq*(rinv41-2.0*krsq))*rinvsq;
275 faction[j3+0] = fjx1 - tx;
276 faction[j3+1] = fjy1 - ty;
277 faction[j3+2] = fjz1 - tz;
280 faction[ii3+0] = faction[ii3+0] + fix1;
281 faction[ii3+1] = faction[ii3+1] + fiy1;
282 faction[ii3+2] = faction[ii3+2] + fiz1;
283 faction[ii3+3] = faction[ii3+3] + fix2;
284 faction[ii3+4] = faction[ii3+4] + fiy2;
285 faction[ii3+5] = faction[ii3+5] + fiz2;
286 faction[ii3+6] = faction[ii3+6] + fix3;
287 faction[ii3+7] = faction[ii3+7] + fiy3;
288 faction[ii3+8] = faction[ii3+8] + fiz3;
289 faction[ii3+9] = faction[ii3+9] + fix4;
290 faction[ii3+10] = faction[ii3+10] + fiy4;
291 faction[ii3+11] = faction[ii3+11] + fiz4;
292 fshift[is3] = fshift[is3]+fix1+fix2+fix3+fix4;
293 fshift[is3+1] = fshift[is3+1]+fiy1+fiy2+fiy3+fiy4;
294 fshift[is3+2] = fshift[is3+2]+fiz1+fiz2+fiz3+fiz4;
296 Vc[ggid] = Vc[ggid] + vctot;
297 Vvdw[ggid] = Vvdw[ggid] + Vvdwtot;
298 ninner = ninner + nj1 - nj0;
301 nouter = nouter + nn1 - nn0;
314 * Gromacs nonbonded kernel nb_kernel223_adress_ex
315 * Coulomb interaction: Reaction field
316 * VdW interaction: Buckingham
317 * water optimization: TIP4P - other atoms
318 * Calculate forces: yes
320 void nb_kernel223_adress_ex(
354 int nri,ntype,nthreads;
355 real facel,krf,crf,tabscale,gbtabscale;
356 int n,ii,is3,ii3,k,nj0,nj1,jnr,j3,ggid;
357 int nn0,nn1,nouter,ninner;
369 real ix1,iy1,iz1,fix1,fiy1,fiz1;
370 real ix2,iy2,iz2,fix2,fiy2,fiz2;
371 real ix3,iy3,iz3,fix3,fiy3,fiz3;
372 real ix4,iy4,iz4,fix4,fiy4,fiz4;
373 real jx1,jy1,jz1,fjx1,fjy1,fjz1;
374 real dx11,dy11,dz11,rsq11,rinv11;
375 real dx21,dy21,dz21,rsq21,rinv21;
376 real dx31,dy31,dz31,rsq31,rinv31;
377 real dx41,dy41,dz41,rsq41,rinv41;
380 real weight_cg1, weight_cg2, weight_product;
385 nthreads = *p_nthreads;
389 tabscale = *p_tabscale;
391 qH = facel*charge[ii+1];
392 qM = facel*charge[ii+3];
393 nti = 3*ntype*type[ii];
400 #ifdef GMX_THREAD_SHM_FDECOMP
401 tMPI_Thread_mutex_lock((tMPI_Thread_mutex_t *)mtx);
403 nn1 = nn0+(nri-nn0)/(2*nthreads)+10;
405 tMPI_Thread_mutex_unlock((tMPI_Thread_mutex_t *)mtx);
412 for(n=nn0; (n<nn1); n++)
416 shY = shiftvec[is3+1];
417 shZ = shiftvec[is3+2];
422 ix1 = shX + pos[ii3+0];
423 iy1 = shY + pos[ii3+1];
424 iz1 = shZ + pos[ii3+2];
425 ix2 = shX + pos[ii3+3];
426 iy2 = shY + pos[ii3+4];
427 iz2 = shZ + pos[ii3+5];
428 ix3 = shX + pos[ii3+6];
429 iy3 = shY + pos[ii3+7];
430 iz3 = shZ + pos[ii3+8];
431 ix4 = shX + pos[ii3+9];
432 iy4 = shY + pos[ii3+10];
433 iz4 = shZ + pos[ii3+11];
450 for(k=nj0; (k<nj1); k++)
453 weight_cg2 = wf[jnr];
454 weight_product = weight_cg1*weight_cg2;
455 if (weight_product < ALMOST_ZERO) {
456 /* force is zero, skip this molecule */
459 else if (weight_product >= ALMOST_ONE)
465 hybscal = weight_product;
474 rsq11 = dx11*dx11+dy11*dy11+dz11*dz11;
478 rsq21 = dx21*dx21+dy21*dy21+dz21*dz21;
482 rsq31 = dx31*dx31+dy31*dy31+dz31*dz31;
486 rsq41 = dx41*dx41+dy41*dy41+dz41*dz41;
487 rinv11 = 1.0/sqrt(rsq11);
488 rinv21 = 1.0/sqrt(rsq21);
489 rinv31 = 1.0/sqrt(rsq31);
490 rinv41 = 1.0/sqrt(rsq41);
491 tj = nti+3*type[jnr];
493 cexp1 = vdwparam[tj+1];
494 cexp2 = vdwparam[tj+2];
495 rinvsq = rinv11*rinv11;
496 rinvsix = rinvsq*rinvsq*rinvsq;
498 br = cexp2*rsq11*rinv11;
499 Vvdwexp = cexp1*exp(-br);
500 Vvdwtot = Vvdwtot+Vvdwexp-Vvdw6;
501 fscal = (br*Vvdwexp-6.0*Vvdw6)*rinvsq;
503 if(force_cap>0 && (fabs(fscal)> force_cap)){
504 fscal=force_cap*fscal/fabs(fscal);
512 fjx1 = faction[j3+0] - tx;
513 fjy1 = faction[j3+1] - ty;
514 fjz1 = faction[j3+2] - tz;
517 rinvsq = rinv21*rinv21;
519 vcoul = qq*(rinv21+krsq-crf);
521 fscal = (qq*(rinv21-2.0*krsq))*rinvsq;
523 if(force_cap>0 && (fabs(fscal)> force_cap)){
524 fscal=force_cap*fscal/fabs(fscal);
535 rinvsq = rinv31*rinv31;
537 vcoul = qq*(rinv31+krsq-crf);
539 fscal = (qq*(rinv31-2.0*krsq))*rinvsq;
541 if(force_cap>0 && (fabs(fscal)> force_cap)){
542 fscal=force_cap*fscal/fabs(fscal);
554 rinvsq = rinv41*rinv41;
556 vcoul = qq*(rinv41+krsq-crf);
558 fscal = (qq*(rinv41-2.0*krsq))*rinvsq;
560 if(force_cap>0 && (fabs(fscal)> force_cap)){
561 fscal=force_cap*fscal/fabs(fscal);
569 faction[j3+0] = fjx1 - tx;
570 faction[j3+1] = fjy1 - ty;
571 faction[j3+2] = fjz1 - tz;
574 faction[ii3+0] = faction[ii3+0] + fix1;
575 faction[ii3+1] = faction[ii3+1] + fiy1;
576 faction[ii3+2] = faction[ii3+2] + fiz1;
577 faction[ii3+3] = faction[ii3+3] + fix2;
578 faction[ii3+4] = faction[ii3+4] + fiy2;
579 faction[ii3+5] = faction[ii3+5] + fiz2;
580 faction[ii3+6] = faction[ii3+6] + fix3;
581 faction[ii3+7] = faction[ii3+7] + fiy3;
582 faction[ii3+8] = faction[ii3+8] + fiz3;
583 faction[ii3+9] = faction[ii3+9] + fix4;
584 faction[ii3+10] = faction[ii3+10] + fiy4;
585 faction[ii3+11] = faction[ii3+11] + fiz4;
586 fshift[is3] = fshift[is3]+fix1+fix2+fix3+fix4;
587 fshift[is3+1] = fshift[is3+1]+fiy1+fiy2+fiy3+fiy4;
588 fshift[is3+2] = fshift[is3+2]+fiz1+fiz2+fiz3+fiz4;
590 Vc[ggid] = Vc[ggid] + vctot;
591 Vvdw[ggid] = Vvdw[ggid] + Vvdwtot;
592 ninner = ninner + nj1 - nj0;
595 nouter = nouter + nn1 - nn0;