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()
 
virtual void submit(void)=0
 
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)