14 #include "CollectionMaster.decl.h" 18 #define MIN_DEBUG_LEVEL 3 24 if (CkpvAccess(CollectionMaster_instance) == 0) {
25 CkpvAccess(CollectionMaster_instance) =
this;
27 DebugM(1,
"CollectionMaster::CollectionMaster() - another instance of CollectionMaster exists!\n");
31 #ifdef MEM_OPT_VERSION 35 parOut =
new ParOutput();
38 posTimings = 10; velTimings = forceTimings = 5;
39 #ifdef NODEGROUP_FORCE_REGISTER 40 cmlock = CmiCreateLock();
47 #ifdef NODEGROUP_FORCE_REGISTER 48 CmiDestroyLock(cmlock);
54 DebugM(3,
"["<<CkMyPe()<<
"]"<<
" receivePositions\n");
55 #ifndef MEM_OPT_VERSION 68 DebugM(3,
"["<<CkMyPe()<<
"]"<<
" receivePositionsDcdSelection index "<<msg->
index<<
"\n");
69 #ifndef MEM_OPT_VERSION 82 DebugM(3,
"["<<CkMyPe()<<
"]"<<
" enqueuePositions\n");
85 #ifndef MEM_OPT_VERSION 95 DebugM(3,
"["<<CkMyPe()<<
"]"<<
" enqueuePositionsDcdSelection\n");
96 #ifndef MEM_OPT_VERSION 97 positionsDcdSelection.
enqueue(seq,lattice);
109 DebugM(3,
"["<<CkMyPe()<<
"]"<<
" disposePositions\n");
110 #ifndef MEM_OPT_VERSION 116 double exectime = CmiWallTimer();
118 #ifdef NODEGROUP_FORCE_REGISTER 120 CProxy_PatchData cpdata(CkpvAccess(BOCclass_group).patchData);
121 Output *pout = cpdata.ckLocalBranch()->ptrOutput;
130 exectime = CmiWallTimer()-exectime;
132 CkPrintf(
"The last position output (seq=%d) takes %.3f seconds, %.3f MB of memory in use\n", seq, exectime, mem);
141 #ifndef MEM_OPT_VERSION 154 #ifndef MEM_OPT_VERSION 164 #ifndef MEM_OPT_VERSION 165 DebugM(3,
"Collected velocities at " << c->
seq << std::endl);
169 double exectime = CmiWallTimer();
171 #ifdef NODEGROUP_FORCE_REGISTER 173 CProxy_PatchData cpdata(CkpvAccess(BOCclass_group).patchData);
174 Output *pout = cpdata.ckLocalBranch()->ptrOutput;
183 exectime = CmiWallTimer()-exectime;
185 CkPrintf(
"The last velocity output (seq=%d) takes %.3f seconds, %.3f MB of memory in use\n", seq, exectime, mem);
194 #ifndef MEM_OPT_VERSION 207 #ifndef MEM_OPT_VERSION 217 #ifndef MEM_OPT_VERSION 218 DebugM(3,
"Collected forces at " << c->
seq << std::endl);
222 double exectime = CmiWallTimer();
224 #ifdef NODEGROUP_FORCE_REGISTER 226 CProxy_PatchData cpdata(CkpvAccess(BOCclass_group).patchData);
227 Output *pout = cpdata.ckLocalBranch()->ptrOutput;
228 pout->
force(seq,size,data);
236 exectime = CmiWallTimer()-exectime;
237 if ( forceTimings ) {
238 CkPrintf(
"The last force output (seq=%d) takes %.3f seconds, %.3f MB of memory in use\n", seq, exectime, mem);
246 if ( ! dataStreamFile ) {
251 CkPrintf(
"Info: OPENING AUXILIARY DATA STREAM FILE %s\n", fname);
253 dataStreamFile = fopen(fname,
"w");
254 if ( ! dataStreamFile )
255 NAMD_die(
"Can't open auxiliary data stream file!");
257 fprintf(dataStreamFile,
"%s",msg->
data.
begin());
258 fflush(dataStreamFile);
272 #ifdef MEM_OPT_VERSION 273 positions.submitData(seq);
279 #ifdef MEM_OPT_VERSION 286 #ifdef MEM_OPT_VERSION 294 #ifdef MEM_OPT_VERSION 296 if(totalT > posIOTime) posIOTime = totalT;
298 #ifndef OUTPUT_SINGLE_FILE 299 #error OUTPUT_SINGLE_FILE not defined! 302 #if OUTPUT_SINGLE_FILE 303 if(++posDoneCnt <
Node::Object()->simParameters->numoutputwrts)
return;
305 if(++posDoneCnt <
Node::Object()->simParameters->numoutputprocs)
return;
315 positions.removeFirstReady();
317 posOutTime = CmiWallTimer()-posOutTime;
319 CkPrintf(
"The last position output (seq=%d) takes %.3f seconds(file I/O: %.3f secs), %.3f MB of memory in use\n", seq, posOutTime, posIOTime, mem);
330 #ifdef MEM_OPT_VERSION 332 if(totalT > velIOTime) velIOTime = totalT;
334 #if OUTPUT_SINGLE_FILE 335 if(++velDoneCnt <
Node::Object()->simParameters->numoutputwrts)
return;
337 if(++velDoneCnt <
Node::Object()->simParameters->numoutputprocs)
return;
347 velocities.removeFirstReady();
349 velOutTime = CmiWallTimer()-velOutTime;
351 CkPrintf(
"The last velocity output (seq=%d) takes %.3f seconds(file I/O: %.3f secs), %.3f MB of memory in use\n", seq, velOutTime, velIOTime, mem);
362 #ifdef MEM_OPT_VERSION 364 if(totalT > forceIOTime) forceIOTime = totalT;
366 #if OUTPUT_SINGLE_FILE 367 if(++forceDoneCnt <
Node::Object()->simParameters->numoutputwrts)
return;
369 if(++forceDoneCnt <
Node::Object()->simParameters->numoutputprocs)
return;
379 forces.removeFirstReady();
381 forceOutTime = CmiWallTimer()-forceOutTime;
382 if ( forceTimings ) {
383 CkPrintf(
"The last force output (seq=%d) takes %.3f seconds(file I/O: %.3f secs), %.3f MB of memory in use\n", seq, forceOutTime, forceIOTime, mem);
395 #ifdef MEM_OPT_VERSION 396 if(++wrapCoorDoneCnt ==
Node::Object()->simParameters->numoutputprocs){
400 posIOTime = CmiWallTimer()-posOutTime;
405 CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
408 #if OUTPUT_SINGLE_FILE 410 int grpsize = ioMgr->numOutputProcs / ioMgr->numOutputWrts;
411 int remains = ioMgr->numOutputProcs % ioMgr->numOutputWrts;
414 for(i=0; i<remains; i++){
415 io[ioMgr->outputProcArray[outrank]].disposePositions(c->
seq, posIOTime);
416 outrank += (grpsize+1);
418 for(; i<ioMgr->numOutputWrts; i++){
419 io[ioMgr->outputProcArray[outrank]].disposePositions(c->
seq, posIOTime);
424 for(
int i=0; i<ioMgr->numOutputProcs; i++) {
425 io[ioMgr->outputProcArray[i]].disposePositions(c->
seq, posIOTime);
433 #ifdef MEM_OPT_VERSION 434 void CollectionMaster::checkPosReady(){
435 CollectVectorInstance *c;
436 if((c = positions.getReady())){
443 posOutTime = CmiWallTimer();
445 CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
448 for(
int i=0; i<ioMgr->numOutputProcs; i++){
449 io[ioMgr->outputProcArray[i]].
wrapCoor(c->seq, c->lattice);
457 posIOTime = CmiWallTimer() - posOutTime;
459 #if OUTPUT_SINGLE_FILE 460 int grpsize = ioMgr->numOutputProcs / ioMgr->numOutputWrts;
461 int remains = ioMgr->numOutputProcs % ioMgr->numOutputWrts;
464 for(i=0; i<remains; i++){
465 io[ioMgr->outputProcArray[outrank]].disposePositions(c->seq, posIOTime);
466 outrank += (grpsize+1);
468 for(; i<ioMgr->numOutputWrts; i++){
469 io[ioMgr->outputProcArray[outrank]].disposePositions(c->seq, posIOTime);
474 for(
int i=0; i<ioMgr->numOutputProcs; i++) {
475 io[ioMgr->outputProcArray[i]].disposePositions(c->seq, posIOTime);
483 void CollectionMaster::checkVelReady(){
484 CollectVectorInstance *c;
485 if((c = velocities.getReady())){
493 velOutTime = CmiWallTimer();
496 velIOTime = CmiWallTimer() - velOutTime;
499 CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
502 #if OUTPUT_SINGLE_FILE 503 int grpsize = ioMgr->numOutputProcs / ioMgr->numOutputWrts;
504 int remains = ioMgr->numOutputProcs % ioMgr->numOutputWrts;
507 for(i=0; i<remains; i++){
508 io[ioMgr->outputProcArray[outrank]].disposeVelocities(c->seq, velIOTime);
509 outrank += (grpsize+1);
511 for(; i<ioMgr->numOutputWrts; i++){
512 io[ioMgr->outputProcArray[outrank]].disposeVelocities(c->seq, velIOTime);
517 for(
int i=0; i<ioMgr->numOutputProcs; i++) {
518 io[ioMgr->outputProcArray[i]].disposeVelocities(c->seq, velIOTime);
525 void CollectionMaster::checkForceReady(){
526 CollectVectorInstance *c;
527 if((c = forces.getReady())){
535 forceOutTime = CmiWallTimer();
538 forceIOTime = CmiWallTimer() - forceOutTime;
541 CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
544 #if OUTPUT_SINGLE_FILE 545 int grpsize = ioMgr->numOutputProcs / ioMgr->numOutputWrts;
546 int remains = ioMgr->numOutputProcs % ioMgr->numOutputWrts;
549 for(i=0; i<remains; i++){
550 io[ioMgr->outputProcArray[outrank]].disposeForces(c->seq, forceIOTime);
551 outrank += (grpsize+1);
553 for(; i<ioMgr->numOutputWrts; i++){
554 io[ioMgr->outputProcArray[outrank]].disposeForces(c->seq, forceIOTime);
559 for(
int i=0; i<ioMgr->numOutputProcs; i++) {
560 io[ioMgr->outputProcArray[i]].disposeForces(c->seq, forceIOTime);
568 void CollectionMidMaster::disposePositions(
int seq)
570 DebugM(3,
"["<<CkMyPe()<<
"]"<<
" disposePositions\n");
571 CollectMidVectorInstance *c = positions.getReady(seq);
573 parOut->coordinateSlave(seq,c->fromAtomID,c->toAtomID,
574 c->data.begin(),c->fdata.begin());
578 void CollectionMidMaster::disposeVelocities(
int seq)
580 CollectMidVectorInstance *c = velocities.getReady(seq);
582 parOut->velocitySlave(seq,c->fromAtomID,c->toAtomID,c->data.begin());
586 void CollectionMidMaster::disposeForces(
int seq)
588 CollectMidVectorInstance *c = forces.getReady(seq);
590 parOut->forceSlave(seq,c->fromAtomID,c->toAtomID,c->data.begin());
595 #include "CollectionMaster.def.h"
CollectVectorInstance * removeReady(void)
void disposeForces(CollectVectorInstance *c)
void receiveVelocities(CollectVectorMsg *msg)
SimParameters * simParameters
void receivePositions(CollectVectorMsg *msg)
void receivePositionsDcdSelection(CollectVectorMsg *msg)
void enqueueVelocities(int seq)
void receiveOutputPosReady(int seq)
void submitData(CollectVectorMsg *msg, int max_index)
void enqueue(int seq, Lattice &lattice)
void coordinate(int, int, Vector *, FloatVector *, Lattice &)
char auxFilename[NAMD_FILENAME_BUFFER_SIZE]
void startNextRoundOutputPos(double totalT)
void enqueuePositions(int seq, Lattice &lattice)
void wrapCoor(int seq, Lattice lat)
void enqueuePositionsDcdSelection(int seq, Lattice &lattice)
void receiveDataStream(DataStreamMsg *msg)
void receiveOutputVelReady(int seq)
PACK_MSG(DataStreamMsg, PACK_RESIZE(data);)
void disposePositions(CollectVectorInstance *c)
void velocity(int, int, Vector *)
void submitData(CollectVectorMsg *msg, int max_index)
ResizeArray< FloatVector > fdata
void startNextRoundOutputVel(double totalT)
void NAMD_die(const char *err_msg)
void receiveForces(CollectVectorMsg *msg)
void disposeVelocities(CollectVectorInstance *c)
void NAMD_backup_file(const char *filename, const char *extension)
ResizeArray< Vector > data
CollectVectorInstanceDcdSelection * removeReady(void)
#define PACK_RESIZE(DATA)
void startNextRoundOutputForce(double totalT)
void enqueueForces(int seq)
void force(int, int, Vector *)
void receiveOutputForceReady(int seq)