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 *)
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