13 #include "ComputeLjPmeSerialMgr.decl.h"    18 #include "ComputeMgr.decl.h"    20 #define MIN_DEBUG_LEVEL 3    76   CProxy_ComputeLjPmeSerialMgr ljPmeProxy;
    91   double *ljForceNonbond; 
    93   double *ljParameter14; 
    94   double oldNonbondedScaling; 
    95   double oldSoluteScaling; 
   101   ljPmeProxy(thisgroup), ljPmeCompute(0), numSources(0), numArrived(0),
   102   coordMsgs(0), coord(0), forceNonbond(0), forceSlow(0), oldmsg(0),
   103   numAtoms(0), ljPmeCoord(0), ljForceSlow(0), ljForceNonbond(0),
   104   ljParameter(0), ljParameter14(0), atomType(0)
   107   CkpvAccess(BOCclass_group).computeLjPmeSerialMgr = thisgroup;
   113   for (
int i=0;  i < numSources;  i++)  
delete coordMsgs[i];
   116   delete [] forceNonbond;
   120   if (ljPmeCoord) 
delete[] ljPmeCoord;
   121   if (ljForceSlow) 
delete[] ljForceSlow;
   122   if (ljForceNonbond) 
delete[] ljForceNonbond;
   123   if (ljParameter) 
delete[] ljParameter;
   124   if (ljParameter14) 
delete[] ljParameter14;
   125   if (atomType) 
delete[] atomType;
   133   CProxy_ComputeLjPmeSerialMgr::ckLocalBranch(
   134         CkpvAccess(BOCclass_group).computeLjPmeSerialMgr)->setCompute(
this);
   143   int useGeom = 
simParams->vdwGeometricSigma;
   159         "LJPME::compute_vdw_params: energy table index is negative");
   166     if ( tabulatedEnergies && ( A < 0 || A14 < 0 ) ) {
   167       NAMD_die(
"LJ A is negative with tabulatedEnergies enabled");
   173     Real sigma_i, sigma_i14, epsilon_i, epsilon_i14;
   174     Real sigma_j, sigma_j14, epsilon_j, epsilon_j14;
   176     if (!soluteScalingOn) {
   182       int i_type = (i >= table_dim_org)? ss_vdw_type[i-table_dim_org]:i;
   183       int j_type = (j >= table_dim_org)? ss_vdw_type[j-table_dim_org]:j;
   185                                           &epsilon_i14,i_type);
   187                                           &epsilon_j14,j_type);
   191         useGeom ? sqrt(sigma_i*sigma_j) : 0.5*(sigma_i+sigma_j);
   193         useGeom ? sqrt(sigma_i14*sigma_j14) : 0.5 * (sigma_i14+sigma_j14);
   194     BigReal epsilon_ij = sqrt(epsilon_i*epsilon_j);
   195     BigReal epsilon_ij14 = sqrt(epsilon_i14*epsilon_j14);
   198     sigma_ij *= sigma_ij*sigma_ij;
   199     sigma_ij *= sigma_ij;
   200     sigma_ij14 *= sigma_ij14*sigma_ij14;
   201     sigma_ij14 *= sigma_ij14;
   204     B = 4.0 * sigma_ij * epsilon_ij;
   206     B14 = 4.0 * sigma_ij14 * epsilon_ij14;
   207     A14 = B14 * sigma_ij14;
   209     if (soluteScalingOn) {
   210       if (i >= table_dim_org && i < (table_dim_org+ss_dim) && j < table_dim_org) {
   211         A *= sqrt(soluteScalingFactor);
   212         B *= sqrt(soluteScalingFactor);
   213         A14 *= sqrt(soluteScalingFactor);
   214         B14 *= sqrt(soluteScalingFactor);
   216       if (i < table_dim_org && j >= table_dim_org && j < (table_dim_org+ss_dim)) {
   217         A *= sqrt(soluteScalingFactor);
   218         B *= sqrt(soluteScalingFactor);
   219         A14 *= sqrt(soluteScalingFactor);
   220         B14 *= sqrt(soluteScalingFactor);
   222       if (i >=table_dim_org && i < (table_dim_org+ss_dim) && j >= table_dim_org && j < (table_dim_org+ss_dim)) {
   223         A *= soluteScalingFactor;
   224         B *= soluteScalingFactor;
   225         A14 *= soluteScalingFactor;
   226         B14 *= soluteScalingFactor;
   230     if ( tabulatedEnergies && ( A < 0 || A14 < 0 ) ) {
   231       NAMD_die(
"LJPME: LJ A is negative with tabulatedEnergies enabled");
   242   sigma = sqrt(cbrt(A)) / sqrt(cbrt(B));
   243   epsilon = B*B / (4*A);
   245   sigma14 = sqrt(cbrt(A14)) / sqrt(cbrt(B14));
   246   epsilon14 = B14*B14 / (4*A14);
   253   for (
int i = 0; i < table_dim; i++) {
   254     for (
int j = i; j < table_dim; j++) {
   255       int index_ij = 2*(i*table_dim+j);
   256       int index_ji = 2*(j*table_dim+i);
   259       ljParameter[index_ij] = scaling * A; 
   260       ljParameter[index_ij+1] = scaling * B; 
   261       ljParameter14[index_ij] = scaling * A14; 
   262       ljParameter14[index_ij+1] = scaling * B14; 
   264       ljParameter[index_ji] = ljParameter[index_ij];
   265       ljParameter[index_ji+1] = ljParameter[index_ij+1];
   266       ljParameter14[index_ji] = ljParameter14[index_ij];
   267       ljParameter14[index_ji+1] = ljParameter14[index_ij+1];
   275   for (
int i = 0;  i < numAtoms;  i++) {
   276     Real sigma, sigma_14, epsilon, epsilon_14;
   277     atomType[i] = coord[i].
vdwType;
   279         epsilon_14, coord[i].vdwType);
   284     ljPmeCoord[4*i+3] = 2.0*sigma*sigma*sigma*sqrt(scaling * epsilon);
   308   int numLocalAtoms = 0;
   309   for (ap = ap.
begin(); ap != ap.
end(); ap++) {
   310     numLocalAtoms += (*ap).p->getNumAtoms();
   320   for (ap = ap.
begin();  ap != ap.
end();  ap++) {
   321     CompAtom *x = (*ap).positionBox->open();
   324       (*ap).positionBox->close(&x);
   325       x = (*ap).avgPositionBox->open();
   327     int numAtoms = (*ap).p->getNumAtoms();
   329     for(
int i=0;  i < numAtoms;  i++)
   333       data_ptr->
id = xExt[i].
id;
   337     if ( 
patchList[0].p->flags.doMolly ) { (*ap).avgPositionBox->close(&x); }
   338     else { (*ap).positionBox->close(&x); }
   341   CProxy_ComputeLjPmeSerialMgr ljPmeProxy(
   342       CkpvAccess(BOCclass_group).computeLjPmeSerialMgr);
   343   ljPmeProxy[0].recvCoord(msg);
   350   if ( ! numSources ) {
   353     for ( 
int i=0; i<numSources; ++i ) { coordMsgs[i] = 0; }
   363   for (
int i=0; i < msg->
numAtoms; ++i) {
   366   coordMsgs[numArrived] = msg;
   369   if ( numArrived < numSources ) 
return;
   380     ljParameter = 
new double[2*table_dim*table_dim];
   381     ljParameter14 = 
new double[2*table_dim*table_dim];
   382     ljPmeCoord = 
new double[4*numAtoms];
   383     ljForceSlow = 
new double[3*numAtoms];
   384     ljForceNonbond = 
new double[3*numAtoms];
   385     atomType = 
new int[numAtoms];
   387     if (ljPmeCoord==0 || ljForceSlow==0 || ljForceNonbond==0 || ljParameter==0 
   388         || ljParameter==0 || atomType == 0) {
   389       NAMD_die(
"can't allocate LJ-PME atom buffers");
   394     LjPme.
initialize(ljPmeCoord, ljParameter, ljParameter14, atomType,
   395                     ljForceNonbond, ljForceSlow, table_dim, numAtoms);
   398     oldNonbondedScaling = 
simParams->nonbondedScaling;
   399     oldSoluteScaling = 
simParams->soluteScalingFactorVdw;
   403   if((
simParams->nonbondedScaling != oldNonbondedScaling) ||
   404     (
simParams->soluteScalingOn && (
simParams->soluteScalingFactorVdw != oldSoluteScaling))) {
   406     oldNonbondedScaling = 
simParams->nonbondedScaling;
   407     oldSoluteScaling = 
simParams->soluteScalingFactorVdw;
   411   for (
int i = 0;  i < numAtoms;  i++) {
   416     ljForceSlow[3*i  ] = 0.0;
   417     ljForceSlow[3*i+1] = 0.0;
   418     ljForceSlow[3*i+2] = 0.0;
   419     ljForceNonbond[3*i  ] = 0.0;
   420     ljForceNonbond[3*i+1] = 0.0;
   421     ljForceNonbond[3*i+2] = 0.0;
   425   double energySlow, energyNonbond;
   426   double virialSlow[3][3], virialNonbond[3][3];
   438     printf(
"LJ-PME: E_nb: %6.12f, E_rec: %6.12f, E_sum: %6.12f! \n", 
   439     energyNonbond, energySlow, energyNonbond+energySlow);
   440     printf(
"LJ-PME: virial_nb: [%3.6f, %3.6f, %3.6f, %3.6f, %3.6f, %3.6f] \n",
   441         virialNonbond[0][0], virialNonbond[0][1], virialNonbond[0][2],
   442         virialNonbond[1][1], virialNonbond[1][2], virialNonbond[2][2]);
   443     printf(
"LJ-PME: virial_slow: [%3.6f, %3.6f, %3.6f, %3.6f, %3.6f, %3.6f] \n",
   444         virialSlow[0][0], virialSlow[0][1], virialSlow[0][2],
   445         virialSlow[1][1], virialSlow[1][2], virialSlow[2][2]);
   448   for (
int i = 0;  i < numAtoms;  i++) {
   449     forceSlow[i].
x = ljForceSlow[3*i  ];
   450     forceSlow[i].
y = ljForceSlow[3*i+1];
   451     forceSlow[i].
z = ljForceSlow[3*i+2];
   453     forceNonbond[i].
x = ljForceNonbond[3*i  ];
   454     forceNonbond[i].
y = ljForceNonbond[3*i+1];
   455     forceNonbond[i].
z = ljForceNonbond[3*i+2];
   458       forceNonbond[i].
x = 0.0;
   459       forceNonbond[i].
y = 0.0;
   460       forceNonbond[i].
z = 0.0;
   461       double fx = forceNonbond[i].
x + forceSlow[i].
x;
   462       double fy = forceNonbond[i].
y + forceSlow[i].
y;
   463       double fz = forceNonbond[i].
z + forceSlow[i].
z;
   464       printf(
"LJ-PME send: atom %5d<-> nb: (%3.6f,%3.6f,%3.6f), slow:(%3.6f,%3.6f,%3.6f), sum:(%3.6f,%3.6f,%3.6f)! \n", i,
   465       forceNonbond[i].x, forceNonbond[i].y, forceNonbond[i].z,
   466       forceSlow[i].x, forceSlow[i].y, forceSlow[i].z,
   472   for (
int j=0;  j < numSources;  j++) {
   477     for (
int i=0;  i < cmsg->
numAtoms;  i++) {
   485       for (
int k=0;  k < 3;  k++) {
   486         for (
int l=0;  l < 3;  l++) {
   495       for (
int k=0;  k < 3;  k++) {
   496         for (
int l=0;  l < 3;  l++) {
   522   for (ap = ap.
begin(); ap != ap.
end(); ap++) {
   523     Results *r = (*ap).forceBox->open();
   526     int numAtoms = (*ap).p->getNumAtoms();
   528     for(
int i=0; i<numAtoms; ++i) {
   529       fSlow[i].
x += results_Slow_ptr->
x;
   530       fSlow[i].
y += results_Slow_ptr->
y;
   531       fSlow[i].
z += results_Slow_ptr->
z;
   532       fNonbond[i].
x += results_Nonbond_ptr->
x;
   533       fNonbond[i].
y += results_Nonbond_ptr->
y;
   534       fNonbond[i].
z += results_Nonbond_ptr->
z;
   536       ++results_Nonbond_ptr;
   539     (*ap).forceBox->close(&r);
   580 #include "ComputeLjPmeSerialMgr.def.h" 
void recvForce(LjPmeSerialForceMsg *)
 
void computeLJpotential(const double &alphaLJ, const double &cutoff, const Lattice &lattice, double virialNonbonded[][3], double virialSlow[][3], double &energyNonbond, double &energySlow, bool doEnergy, bool doSlow)
 
void setCompute(ComputeLjPmeSerial *c)
 
static PatchMap * Object()
 
virtual void submit(void)=0
 
SimParameters * simParameters
 
ComputeHomePatchList patchList
 
SubmitReduction * willSubmit(int setID, int size=-1)
 
LjPmeSerialForce * forceSlow
 
ResizeArrayIter< T > begin(void) const
 
static ReductionMgr * Object(void)
 
void saveResults(LjPmeSerialForceMsg *)
 
void NAMD_bug(const char *err_msg)
 
LjPmeSerialForce * forceNonbond
 
void get_vdw_parameters(Real &sigma, Real &epsilon, Real &sigma14, Real &epsilon14, Index index)
 
void getLJparameters(const int &i, const int &j, Real &A, Real &B, Real &A14, Real &B14)
 
void recvCoord(LjPmeSerialCoordMsg *)
 
int get_vdw_pair_params(Index ind1, Index ind2, Real *, Real *, Real *, Real *)
 
void NAMD_die(const char *err_msg)
 
ComputeLjPmeSerial(ComputeID c)
 
int get_num_vdw_params(void)
 
int get_table_pair_params(Index, Index, int *)
 
void initialize(const double *pmeCoord, const double *parameter, const double *parameter14, const int *type, double *forceNonbond, double *forceSlow, const int &ljTableDim, const int &nAtoms)
 
void get_vdw_params(Real *sigma, Real *epsilon, Real *sigma14, Real *epsilon14, Index index)
 
ResizeArrayIter< T > end(void) const
 
virtual ~ComputeLjPmeSerial()
 
BigReal virialNonbond[3][3]