22 #define BENCH_PERIOD 1000 25 #define GBIS_DEDR_FORCE 1 26 #define GBIS_DEDA_FORCE 1 27 #define GBIS_COUL_FORCE 1 37 #include "ComputeGBISserMgr.decl.h" 42 #include "ComputeMgr.decl.h" 45 #define MIN_DEBUG_LEVEL 3 59 #define COUL_CONST 332.0636 // ke [kcal*Ang/e^2] 63 #define TA 0.333333333333333 // 1/3 65 #define TC 0.428571428571428 // 3/7 66 #define TD 0.444444444444444 // 4/9 67 #define TE 0.454545454545454 // 5/11 68 #define DA 1.333333333333333 // 4* 1/3 69 #define DB 2.4 // 6* 2/5 70 #define DC 3.428571428571428 // 8* 3/7 71 #define DD 4.444444444444444 // 10*4/9 72 #define DE 5.454545454545454 // 12*5/11 168 CProxy_ComputeGBISserMgr gbisProxy;
187 double totalnamdtime;
188 double totalgbistime;
194 double dEdaprefixtime;
196 void calcGBISReg(
int stat);
199 int loop1Iter, loop2Iter, loop3Iter;
208 gbisProxy(thisgroup), gbisCompute(0), numSources(0), numArrived(0),
215 dEdalooptime(0), slowForce(0),
216 coordMsgs(0), coord(0), force(0), oldmsg(0), numAtoms(0), timestep(0) {
217 CkpvAccess(BOCclass_group).computeGBISserMgr = thisgroup;
224 for (
int i=0; i<numSources; ++i ) {
delete coordMsgs[i]; }
235 CProxy_ComputeGBISserMgr::ckLocalBranch(
236 CkpvAccess(BOCclass_group).computeGBISserMgr)->setCompute(
this);
280 d=s*4*rt/(rc*(rt+ct));
296 void ComputeGBISserMgr::calcGBISReg(
int stat) {
307 BigReal epsilon_s_i = 1/epsilon_s;
308 BigReal epsilon_p_i = 1/epsilon_p;
316 BigReal a_cut_ps = a_cut + fsMax;
317 BigReal cutoff2 = cutoff*cutoff;
318 BigReal a_cut_ps2 = a_cut_ps*a_cut_ps;
356 BigReal aiaj, aiaj4, expr2aiaj4, fij, finv, expkappa, Dij;
358 BigReal tmp_dEda, dEdai, dEdaj, gbEij;
359 BigReal ddrfij, ddrfinv, ddrDij, ddrGbEij;
361 BigReal forceCoul, forcedEdr, forceAlpha;
362 BigReal hij, hji, ddrHij, ddrHji;
365 vect *coulForce =
new vect[numAtoms];
366 vect *gbForceR =
new vect[numAtoms];
367 vect *gbForceA =
new vect[numAtoms];
374 for (
int i = 0; i < numAtoms; i++) {
378 slowForce[i].
force.
x =0.0;
379 slowForce[i].
force.
y =0.0;
380 slowForce[i].
force.
z =0.0;
397 inittime = (double)((
double)t2-(double)t1)/CLOCKS_PER_SEC;
413 for (
int i = 0; i < numAtoms; i++) {
415 for (
int j = i+1; j < numAtoms; j++) {
420 r2 = dx*dx+dy*dy+dz*dz;
421 if (r2 > a_cut_ps2)
continue;
429 CalcHPairSer(r,r2,r_i,a_cut, coord[i].rho0, coord[j].rhos,
430 coord[j].rho0, coord[i].rhos,dij,dji,hij,hji);
433 CkPrintf(
"PSI(%04i)[%04i,%04i] = %i%i % .4e % .4e\n",timestep,coord[i].
id,coord[j].
id,dij,dji,hij,hji);
443 psitime += (double)((
double)t2-(double)t1)/CLOCKS_PER_SEC;
444 loop1time += (double)((
double)t2-(double)t1)/CLOCKS_PER_SEC;
455 for (
int i = 0; i < numAtoms; i++) {
458 rhoi0 = coord[i].
rho0;
463 bornRad=1/(1/rhoi0-1/rhoi*tanh(psi[i]*(delta+psi[i]*(-beta+gamma*psi[i]))));
464 bornRad = (1.0/bornRad < 1.0/alphaMax) ? alphaMax : bornRad;
467 CkPrintf(
"BORNRAD(%04i)[%04i] = % .4e\n",timestep,coord[i].
id,bornRad);
471 alphatime += (double)((
double)t2-(double)t1)/CLOCKS_PER_SEC;
481 for (
int i = 0; i < numAtoms; i++) {
483 for (
int j = i+1; j < numAtoms; j++) {
488 r2 = dx*dx+dy*dy+dz*dz;
489 if (r2 > cutoff2)
continue;
508 ddrScale = 4.0*r*(r2-cutoff2)/cutoff2/cutoff2;
521 Phase2_PairSer(r,r2,r_i,qiqj,a[i],a[j],epsilon_p_i,epsilon_s_i,kappa,exclij,
522 scale14,stat,coulEij,ddrCoulEij,gbEij,ddrGbEij,dEdai,dEdaj);
523 int id1 = coord[i].
id;
524 int id2 = coord[j].
id;
532 gbInterEnergy += gbEij *scale;
533 forcedEdr = -(ddrGbEij)*scale-(gbEij)*ddrScale;
540 CkPrintf(
"DEDR(%04i)[%04i,%04i] = % .4e\n",timestep,i,j,forcedEdr);
541 CkPrintf(
"DASM(%04i)[%04i,%04i] = % .4e % .4e\n",timestep,i,j,dEdai*scale,dEdaj*scale);
542 CkPrintf(
"P2RM(%04i)[%04i,%04i] = % .4e % .4e % .4e % .4e % .4e\n",timestep,i,j, r, a[i],a[j],epsilon_p_i,epsilon_s_i,kappa);
554 dEda[i] += dEdai*scale;
555 dEda[j] += dEdaj*scale;
561 dEdasumtime += (double)((
double)t2-(double)t1)/CLOCKS_PER_SEC;
562 loop2time += (double)((
double)t2-(double)t1)/CLOCKS_PER_SEC;
572 for (
int i = 0; i < numAtoms; i++) {
575 expkappa = exp(-kappa*fij);
576 Dij = epsilon_p_i - expkappa*epsilon_s_i;
579 gbSelfEnergy += 0.5*gbEij;
586 *(kappa*epsilon_s_i*expkappa-Dij/fij)/a[i];
592 rhoi0 = coord[i].
rho0;
595 nbetapsi = -beta*psii;
596 gammapsi2 = gamma*psii*psii;
597 tanhi = tanh(psii*(delta+nbetapsi+gammapsi2));
598 daidr = a[i]*a[i]*rhoi0/rhoi*(1-tanhi*tanhi)
599 * (delta+nbetapsi+nbetapsi+gammapsi2+gammapsi2+gammapsi2);
600 ddrHijPrefix[i] = daidr*dEda[i];
602 CkPrintf(
"DHDR(%04i)[%04i] = % .4e\n",timestep,coord[i].
id, ddrHijPrefix[i]);
607 dEdaprefixtime += (double)((
double)t2-(double)t1)/CLOCKS_PER_SEC;
620 for (
int i = 0; i < numAtoms; i++) {
624 for (
int j = i+1; j < numAtoms; j++) {
629 r2 = dx*dx+dy*dy+dz*dz;
631 if (r2 > a_cut_ps2)
continue;
637 coord[i].rho0,coord[j].rhos,
638 coord[j].rho0,coord[i].rhos,
642 forceAlpha = -r_i*(ddrHijPrefix[i]*dhij+ddrHijPrefix[j]*dhji);
644 CkPrintf(
"DEDA(%04i)[%04i,%04i] = %i%i % .4e % .4e % .4e\n",timestep,i,j,dij,dji,dhij,dhji, forceAlpha/r_i);
646 fx = dx * forceAlpha;
647 fy = dy * forceAlpha;
648 fz = dz * forceAlpha;
660 dEdalooptime += (double)((
double)t2-(double)t1)/CLOCKS_PER_SEC;
661 loop3time += (double)((
double)t2-(double)t1)/CLOCKS_PER_SEC;
665 for (
int i = 0; i < numAtoms; i++) {
669 slowForce[i].
force.
x =0.0;
670 slowForce[i].
force.
y =0.0;
671 slowForce[i].
force.
z =0.0;
674 force[i].
force.
x += coulForce[i].x;
675 force[i].
force.
y += coulForce[i].y;
676 force[i].
force.
z += coulForce[i].z;
680 force[i].
force.
x += gbForceR[i].x;
681 force[i].
force.
y += gbForceR[i].y;
682 force[i].
force.
z += gbForceR[i].z;
687 slowForce[i].
force.
x += gbForceA[i].x;
688 slowForce[i].
force.
y += gbForceA[i].y;
689 slowForce[i].
force.
z += gbForceA[i].z;
698 #ifdef PRINT_SERFORCES 704 fx += coulForce[i].x;
705 fy += coulForce[i].y;
706 fz += coulForce[i].z;
728 inittime += (double)((
double)t2-(double)t1)/CLOCKS_PER_SEC;
738 delete[] ddrHijPrefix;
744 if ( ! numSources ) {
747 for (
int i=0; i<numSources; ++i ) { coordMsgs[i] = 0; }
759 for ( i=0; i < msg->
numAtoms; ++i ) {
763 coordMsgs[numArrived] = msg;
766 if ( numArrived < numSources )
return;
777 double namdtime = (double)((
double)t_start-(double)t_stop)/CLOCKS_PER_SEC;
778 totalnamdtime += namdtime;
783 double gbistime = (double)((
double)t_stop-(double)t_start)/CLOCKS_PER_SEC;
786 totalgbistime += gbistime;
790 printf(
"GBIS: t_GB=%f sec for %i steps\n",totalgbistime,
BENCH_PERIOD);
791 printf(
"GBIS: t_MD=%f sec for %i steps\n",totalnamdtime,
BENCH_PERIOD);
792 printf(
"GBIS: init=%f sec for %i steps\n", inittime,
BENCH_PERIOD);
793 printf(
"GBIS: psi=%f sec for %i steps\n", psitime,
BENCH_PERIOD);
794 printf(
"GBIS: alpha=%f sec for %i steps\n", alphatime,
BENCH_PERIOD);
795 printf(
"GBIS: dEdasum=%f sec for %i steps\n", dEdasumtime,
BENCH_PERIOD);
796 printf(
"GBIS: dEdaprefix=%f sec for %i steps\n",dEdaprefixtime,
BENCH_PERIOD);
797 printf(
"GBIS: dEdaloop=%f sec for %i steps\n", dEdalooptime,
BENCH_PERIOD);
798 printf(
"GBIS: loop1=%i iters\n", loop1Iter);
799 printf(
"GBIS: loop2=%i iters\n", loop2Iter);
800 printf(
"GBIS: loop3=%i iters\n", loop3Iter);
815 for (
int j=0; j < numSources; ++j ) {
820 for (
int i=0; i < cmsg->
numAtoms; ++i ) {
877 for (ap = ap.
begin(); ap != ap.
end(); ap++) {
879 Results *r = (*ap).forceBox->open();
882 int numAtoms = (*ap).p->getNumAtoms();
884 for(
int i=0; i<numAtoms; ++i) {
885 f[i] += results_ptr->
force;
886 sf[i] += results_ptr_slow->
force;
892 (*ap).forceBox->close(&r);
912 if ( !
patchList[0].p->flags.doNonbonded )
914 for (ap = ap.
begin(); ap != ap.
end(); ap++) {
915 CompAtom *x = (*ap).positionBox->open();
917 Results *r = (*ap).forceBox->open();
918 (*ap).positionBox->close(&x);
920 (*ap).forceBox->close(&r);
929 int numLocalAtoms = 0;
930 for (ap = ap.
begin(); ap != ap.
end(); ap++) {
931 numLocalAtoms += (*ap).p->getNumAtoms();
944 for (ap = ap.
begin(); ap != ap.
end(); ap++) {
946 CompAtom *x = (*ap).positionBox->open();
948 int numAtoms = (*ap).p->getNumAtoms();
949 for(
int i=0; i<numAtoms; ++i)
953 data_ptr->
mass = atoms[i].mass;
954 data_ptr->
id = xExt[i].
id;
964 if (
patchList[0].p->flags.doMolly ) { (*ap).avgPositionBox->close(&x); }
965 else { (*ap).positionBox->close(&x); }
967 (*ap).positionBox->close(&x);
970 CProxy_ComputeGBISserMgr gbisProxy(CkpvAccess(BOCclass_group).computeGBISserMgr);
971 gbisProxy[0].recvCoord(msg);
974 #include "ComputeGBISserMgr.def.h" 1006 h = 0.125*ri*(1 + 2*r*rmrsi + rci2*(r2 - 4*rc*r - rs2) + 2*logr);
1018 dh = ri*ri*(-0.25*logr - (rc*rc - rmrs2)*(rs2 + r2)*0.125*rci2*rmrsi*rmrsi);
1025 h = rs*ri*ri*k*(
TA+k*(
TB+k*(
TC+k*(
TD+k*
TE))));
1031 dh = -rs*ri*ri*ri*k*(
DA+k*(
DB+k*(
DC+k*(
DD+k*
DE))));
1036 BigReal r2mrs2i = 1.0/(r2-rs*rs);
1037 h = 0.5 * ( rs*r2mrs2i + 0.5 * log((r-rs)/(r+rs))*ri );
1042 BigReal r2mrs2i = 1.0/(r2-rs2);
1043 dh = -0.25*ri*(2*(r2+rs2)*rs*r2mrs2i*r2mrs2i + ri*log((r-rs)/(r+rs)));
1056 h = 0.25*( r0i*(2-0.5*(r0i*ri*(r2 + r02 - rs2))) - rspri + rilogr );
1068 dh = 0.25*( (-0.5+(r2*r02mrs2 - 2*r*rs*rs2+rs2*r02mrs2)
1069 * 0.5*ri2*rspri*rspri)*r0i*r0i - ri*rilogr );
1076 BigReal rsr2mrs2i = rs*r2mrs2i;
1079 BigReal logr = 0.5*ri*log(-rmrs/rprs);
1080 h = 0.5*( rsr2mrs2i + 2/r0 + logr );
1086 BigReal rsr2mrs2i = rs*r2mrs2i;
1089 BigReal logr = 0.5*ri*log(-rmrs/rprs);
1090 dh = -0.5*ri*((rs2+r2)*rsr2mrs2i*r2mrs2i+logr );
1104 if( r <= rc - rs && r > 4*rs ) {
1105 h2Ser(r,r2,ri,rc,r0,rs,h); d = 2;
1106 }
else if (r <= rc + rs && r > rc - rs) {
1107 h1Ser(r,r2,ri,rc,r0,rs,h); d = 1;
1108 }
else if (r > rc + rs) {
1109 h0Ser(r,r2,ri,rc,r0,rs,h); d = 0;
1110 }
else if( r <= 4*rs && r > r0 + rs ) {
1111 h3Ser(r,r2,ri,rc,r0,rs,h); d = 3;
1112 }
else if ( r <= r0 + rs && r > (r0>rs?r0-rs:rs-r0) ) {
1113 h4Ser(r,r2,ri,rc,r0,rs,h); d = 4;
1114 }
else if (r0 < rs ) {
1115 h5Ser(r,r2,ri,rc,r0,rs,h); d = 5;
1117 h6Ser(r,r2,ri,rc,r0,rs,h); d = 6;
1122 if( r <= rc - rs && r > 4*rs ) {
1123 dh2Ser(r,r2,ri,rc,r0,rs,dh); d = 2;
1124 }
else if (r <= rc + rs && r > rc - rs) {
1125 dh1Ser(r,r2,ri,rc,r0,rs,dh); d = 1;
1126 }
else if (r > rc + rs) {
1127 dh0Ser(r,r2,ri,rc,r0,rs,dh); d = 0;
1128 }
else if( r <= 4*rs && r > r0 + rs ) {
1129 dh3Ser(r,r2,ri,rc,r0,rs,dh); d = 3;
1130 }
else if ( r <= r0 + rs && r > (r0>rs?r0-rs:rs-r0) ) {
1131 dh4Ser(r,r2,ri,rc,r0,rs,dh); d = 4;
1132 }
else if (r0 < rs ) {
1133 dh5Ser(r,r2,ri,rc,r0,rs,dh); d = 5;
1135 dh6Ser(r,r2,ri,rc,r0,rs,dh); d = 6;
1152 CalcHSer(r,r2,ri,rc,ri0,rjs,hij,dij);
1153 CalcHSer(r,r2,ri,rc,rj0,ris,hji,dji);
1194 coulE = -qiqj*epsilon_p_i*r_i;
1199 ddrCoulE = -r_i*coulE;
1229 BigReal aiaj4,ddrDij,ddrf_i,ddrfij;
1234 expr2aiaj4 = exp(-r2/aiaj4);
1235 fij = sqrt(r2+aiaj*expr2aiaj4);
1238 expkappa = exp(-kappa*fij);
1241 Dij = epsilon_p_i - expkappa*epsilon_s_i;
1245 ddrfij = r*f_i*(1 - 0.25*expr2aiaj4);
1246 ddrf_i = -ddrfij*f_i*f_i;
1247 ddrDij = kappa*expkappa*ddrfij*epsilon_s_i;
1248 ddrGbE = qiqj*(ddrDij*f_i+Dij*ddrf_i);
1272 BigReal tmp_dEda = 0.5*qiqj*f_i*f_i
1273 *(kappa*epsilon_s_i*expkappa-Dij*f_i)
1274 *(aiaj+0.25*r2)*expr2aiaj4;
1275 dEdai = tmp_dEda/ai;
1276 dEdaj = tmp_dEda/aj;
1314 BigReal aiaj,expr2aiaj4,fij,f_i,expkappa,Dij;
1316 aiaj,expr2aiaj4,fij,f_i,expkappa,Dij,gbEij,ddrGbEij);
1321 fij,f_i,Dij,epsilon_s_i,dEdai,dEdaj);
void h2Ser(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &h)
virtual ~ComputeGBISser()
void saveResults(GBISForceMsg *)
static PatchMap * Object()
SimParameters * simParameters
ComputeHomePatchList patchList
void Phase2_PairSer(BigReal r, BigReal r2, BigReal r_i, BigReal qiqj, BigReal ai, BigReal aj, BigReal epsilon_p_i, BigReal epsilon_s_i, BigReal kappa, int exclij, BigReal scale14, int stat, BigReal &coulEij, BigReal &ddrCoulEij, BigReal &gbEij, BigReal &ddrGbEij, BigReal &dEdai, BigReal &dEdaj)
void dh3Ser(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &dh)
ComputeGBISser(ComputeID c)
SubmitReduction * willSubmit(int setID, int size=-1)
void h3Ser(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &h)
ResizeArrayIter< T > begin(void) const
static ReductionMgr * Object(void)
void recvForce(GBISForceMsg *)
void Calc_dEdr_PairSer(BigReal r, BigReal r2, BigReal qiqj, BigReal ai, BigReal aj, BigReal kappa, BigReal epsilon_p_i, BigReal epsilon_s_i, BigReal &aiaj, BigReal &expr2aiaj4, BigReal &fij, BigReal &f_i, BigReal &expkappa, BigReal &Dij, BigReal &gbE, BigReal &ddrGbE)
Molecule stores the structural information for the system.
void dh6Ser(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &dh)
void dh2Ser(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &dh)
void dh4Ser(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &dh)
void h5Ser(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &h)
void h0Ser(BigReal r, BigReal r2, BigReal ri, Real rc, BigReal r0, BigReal rs, BigReal &h)
void recvCoord(GBISCoordMsg *)
void dh0Ser(BigReal r, BigReal r2, BigReal ri, Real rc, BigReal r0, BigReal rs, BigReal &dh)
void dh1Ser(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &dh)
void Calc_Coul_PairSer(BigReal r_i, BigReal qiqj, BigReal epsilon_p_i, int exclij, BigReal scale14, BigReal &coulE, BigReal &ddrCoulE)
void Calc_dEda_PairSer(BigReal r2, BigReal ai, BigReal aj, BigReal qiqj, BigReal kappa, BigReal aiaj, BigReal expkappa, BigReal expr2aiaj4, BigReal fij, BigReal f_i, BigReal Dij, BigReal epsilon_s_i, BigReal &dEdai, BigReal &dEdaj)
void dh5Ser(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &dh)
void CalcHSer(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &h, int &d)
void CalcDHSer(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &dh, int &d)
void CalcHPairSer(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal ri0, BigReal rjs, BigReal rj0, BigReal ris, int &dij, int &dji, BigReal &dhij, BigReal &dhji)
static float MassToRadius(Mass mi)
static float MassToScreen(Mass mi)
void h4Ser(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &h)
void h1Ser(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &h)
void h6Ser(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal r0, BigReal rs, BigReal &h)
void setCompute(ComputeGBISser *c)
ResizeArrayIter< T > end(void) const
void CalcDHPairSer(BigReal r, BigReal r2, BigReal ri, BigReal rc, BigReal ri0, BigReal rjs, BigReal rj0, BigReal ris, int &dij, int &dji, BigReal &dhij, BigReal &dhji)
void CalcScaleSer(BigReal r, BigReal t, BigReal c, BigReal &s, BigReal &d)