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++) {
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++) {
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;
199 if ( ! file ) {
NAMD_die(strerror(errno)); }
200 for ( i=0; i<numAtoms; ++i ) {
201 int id = coord[i].
id + 1;
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)); }
221 if ( iret == -1 ) {
NAMD_die(strerror(errno)); }
222 if ( iret ) {
NAMD_die(
"Error running command for external forces."); }
226 if ( iret ) {
NAMD_die(strerror(errno)); }
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;
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"
char extCoordFilename[NAMD_FILENAME_BUFFER_SIZE]
char extForcesCommand[NAMD_FILENAME_BUFFER_SIZE]
void recvCoord(ExtCoordMsg *)
static PatchMap * Object()
void recvForce(ExtForceMsg *)
SimParameters * simParameters
ComputeHomePatchList patchList
char extForceFilename[NAMD_FILENAME_BUFFER_SIZE]
SubmitReduction * willSubmit(int setID, int size=-1)
static ReductionMgr * Object(void)
ResizeArrayIter< T > end(void) const
void setCompute(ComputeExt *c)
void saveResults(ExtForceMsg *)
void NAMD_die(const char *err_msg)
k< npairi;++k){TABENERGY(const int numtypes=simParams->tableNumTypes;const float table_spacing=simParams->tableSpacing;const int npertype=(int)(namdnearbyint(simParams->tableMaxDist/simParams->tableSpacing)+1);) int table_i=(r2iilist[2 *k] >> 14)+r2_delta_expc;const int j=pairlisti[k];#define p_j BigReal diffa=r2list[k]-r2_table[table_i];#define table_four_i TABENERGY(register const int tabtype=-1-(lj_pars->A< 0?lj_pars->A:0);) BigReal kqq=kq_i *p_j-> charge
ResizeArrayIter< T > begin(void) const