13 #include "ComputeExtMgr.decl.h"    18 #include "ComputeMgr.decl.h"    20 #define MIN_DEBUG_LEVEL 3    30 #define SQRT_PI 1.7724538509055160273     65   CProxy_ComputeExtMgr extProxy;
    78   extProxy(thisgroup), extCompute(0), numSources(0), numArrived(0),
    79   coordMsgs(0), coord(0), force(0), oldmsg(0), numAtoms(0) {
    80   CkpvAccess(BOCclass_group).computeExtMgr = thisgroup;
    84   for ( 
int i=0; i<numSources; ++i ) { 
delete coordMsgs[i]; }
    94   CProxy_ComputeExtMgr::ckLocalBranch(
    95         CkpvAccess(BOCclass_group).computeExtMgr)->setCompute(
this);
   111   if ( ! 
patchList[0].p->flags.doFullElectrostatics )
   113     for (ap = ap.
begin(); ap != ap.
end(); ap++) {
   114       CompAtom *x = (*ap).positionBox->open();
   115       Results *r = (*ap).forceBox->open();
   116       (*ap).positionBox->close(&x);
   117       (*ap).forceBox->close(&r);
   125   int numLocalAtoms = 0;
   126   for (ap = ap.
begin(); ap != ap.
end(); ap++) {
   127     numLocalAtoms += (*ap).p->getNumAtoms();
   137   for (ap = ap.
begin(); ap != ap.
end(); ap++) {
   138     CompAtom *x = (*ap).positionBox->open();
   142       (*ap).positionBox->close(&x);
   143       x = (*ap).avgPositionBox->open();
   146     int numAtoms = (*ap).p->getNumAtoms();
   148     for(
int i=0; i<numAtoms; ++i)
   152       data_ptr->
id = xExt[i].
id;
   157     if ( 
patchList[0].p->flags.doMolly ) { (*ap).avgPositionBox->close(&x); }
   158     else { (*ap).positionBox->close(&x); }
   160     (*ap).positionBox->close(&x);
   163   CProxy_ComputeExtMgr extProxy(CkpvAccess(BOCclass_group).computeExtMgr);
   164   extProxy[0].recvCoord(msg);
   169   if ( ! numSources ) {
   172     for ( 
int i=0; i<numSources; ++i ) { coordMsgs[i] = 0; }
   180   for ( i=0; i < msg->
numAtoms; ++i ) {
   184   coordMsgs[numArrived] = msg;
   187   if ( numArrived < numSources ) 
return;
   198   file = fopen(
simParams->extCoordFilename,
"w");
   199   if ( ! file ) { 
NAMD_die(strerror(errno)); }
   200   for ( i=0; i<numAtoms; ++i ) {
   201     int id = coord[i].
id + 1;
   202     double charge = coord[i].
charge;
   206     iret = fprintf(file,
"%d %f %f %f %f\n",
id,charge,x,y,z);
   207     if ( iret < 0 ) { 
NAMD_die(strerror(errno)); }
   213   iret = fprintf(file,
"%f %f %f\n%f %f %f\n%f %f %f\n",
   214                  a.
x, a.
y, a.
z, b.
x, b.
y, b.
z, c.
x, c.
y, c.
z);
   215   if ( iret < 0 ) { 
NAMD_die(strerror(errno)); }
   220   iret = system(
simParams->extForcesCommand);
   221   if ( iret == -1 ) { 
NAMD_die(strerror(errno)); }
   222   if ( iret ) { 
NAMD_die(
"Error running command for external forces."); }
   225   iret = 
remove(
simParams->extCoordFilename);
   226   if ( iret ) { 
NAMD_die(strerror(errno)); }
   230   file = fopen(
simParams->extForceFilename,
"r");
   231   if ( ! file ) { 
NAMD_die(strerror(errno)); }
   232   for ( i=0; i<numAtoms; ++i ) {
   235     iret = fscanf(file,
"%d %d %lf %lf %lf\n", &
id, &replace, &x, &y, &z);
   236     if ( iret != 5 ) { 
NAMD_die(
"Error reading external forces file."); }
   237     if ( 
id != i + 1 ) { 
NAMD_die(
"Atom ID error in external forces file."); }
   246   iret = fscanf(file,
"%lf\n", &energy);
   249     for ( 
int k=0; k<3; ++k ) 
for ( 
int l=0; l<3; ++l ) virial[k][l] = 0;
   251     iret = fscanf(file,
"%lf %lf %lf\n%lf %lf %lf\n%lf %lf %lf\n",
   252       &virial[0][0], &virial[0][1], &virial[0][2],
   253       &virial[1][0], &virial[1][1], &virial[1][2],
   254       &virial[2][0], &virial[2][1], &virial[2][2]);
   256       for ( 
int k=0; k<3; ++k ) 
for ( 
int l=0; l<3; ++l ) virial[k][l] = 0;
   259       for ( 
int k=0; k<3; ++k ) 
for ( 
int l=0; l<3; ++l ) virial[k][l] *= -1.0;
   265   iret = 
remove(
simParams->extForceFilename);
   266   if ( iret ) { 
NAMD_die(strerror(errno)); }
   270   for ( 
int j=0; j < numSources; ++j ) {
   274     for ( 
int i=0; i < cmsg->
numAtoms; ++i ) {
   279       for ( 
int k=0; k<3; ++k ) 
for ( 
int l=0; l<3; ++l )
   280         fmsg->
virial[k][l] = virial[k][l];
   283       for ( 
int k=0; k<3; ++k ) 
for ( 
int l=0; l<3; ++l )
   305   for (ap = ap.
begin(); ap != ap.
end(); ap++) {
   306     Results *r = (*ap).forceBox->open();
   308     int numAtoms = (*ap).p->getNumAtoms();
   311     ExtForce *replacementForces = results_ptr;
   312     for(
int i=0; i<numAtoms; ++i) {
   313       if ( results_ptr->
replace ) replace = 1;
   314       else f[i] += results_ptr->
force;
   317     if ( replace ) (*ap).p->replaceForces(replacementForces);
   319       (*ap).forceBox->close(&r);
   323     reduction->
item(REDUCTION_VIRIAL_NORMAL_XX) += msg->
virial[0][0];
   324     reduction->
item(REDUCTION_VIRIAL_NORMAL_XY) += msg->
virial[0][1];
   325     reduction->
item(REDUCTION_VIRIAL_NORMAL_XZ) += msg->
virial[0][2];
   326     reduction->
item(REDUCTION_VIRIAL_NORMAL_YX) += msg->
virial[1][0];
   327     reduction->
item(REDUCTION_VIRIAL_NORMAL_YY) += msg->
virial[1][1];
   328     reduction->
item(REDUCTION_VIRIAL_NORMAL_YZ) += msg->
virial[1][2];
   329     reduction->
item(REDUCTION_VIRIAL_NORMAL_ZX) += msg->
virial[2][0];
   330     reduction->
item(REDUCTION_VIRIAL_NORMAL_ZY) += msg->
virial[2][1];
   331     reduction->
item(REDUCTION_VIRIAL_NORMAL_ZZ) += msg->
virial[2][2];
   335 #include "ComputeExtMgr.def.h" 
NAMD_HOST_DEVICE Vector c() const
 
NAMD_HOST_DEVICE int c_p() const
 
void recvCoord(ExtCoordMsg *)
 
static PatchMap * Object()
 
void recvForce(ExtForceMsg *)
 
virtual void submit(void)=0
 
SimParameters * simParameters
 
ComputeHomePatchList patchList
 
SubmitReduction * willSubmit(int setID, int size=-1)
 
ResizeArrayIter< T > begin(void) const
 
static ReductionMgr * Object(void)
 
NAMD_HOST_DEVICE int b_p() const
 
void setCompute(ComputeExt *c)
 
NAMD_HOST_DEVICE int a_p() const
 
void saveResults(ExtForceMsg *)
 
void NAMD_die(const char *err_msg)
 
NAMD_HOST_DEVICE Vector b() const
 
NAMD_HOST_DEVICE Vector a() const
 
ResizeArrayIter< T > end(void) const