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");
84 #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 121 CProxy_PatchData cpdata(CkpvAccess(BOCclass_group).patchData);
122 Output *pout = cpdata.ckLocalBranch()->ptrOutput;
131 exectime = CmiWallTimer()-exectime;
133 CkPrintf(
"The last position output (seq=%d) takes %.3f seconds, %.3f MB of memory in use\n", seq, exectime, mem);
142 #ifndef MEM_OPT_VERSION 155 #ifndef MEM_OPT_VERSION 165 #ifndef MEM_OPT_VERSION 166 DebugM(3,
"Collected velocities at " << c->
seq << std::endl);
172 double exectime = CmiWallTimer();
174 #ifdef NODEGROUP_FORCE_REGISTER 176 CProxy_PatchData cpdata(CkpvAccess(BOCclass_group).patchData);
177 Output *pout = cpdata.ckLocalBranch()->ptrOutput;
178 pout->
velocity(seq,size,data,fdata);
186 exectime = CmiWallTimer()-exectime;
188 CkPrintf(
"The last velocity output (seq=%d) takes %.3f seconds, %.3f MB of memory in use\n", seq, exectime, mem);
197 #ifndef MEM_OPT_VERSION 210 #ifndef MEM_OPT_VERSION 220 #ifndef MEM_OPT_VERSION 221 DebugM(3,
"Collected forces at " << c->
seq << std::endl);
227 double exectime = CmiWallTimer();
229 #ifdef NODEGROUP_FORCE_REGISTER 231 CProxy_PatchData cpdata(CkpvAccess(BOCclass_group).patchData);
232 Output *pout = cpdata.ckLocalBranch()->ptrOutput;
233 pout->
force(seq,size,data,fdata);
241 exectime = CmiWallTimer()-exectime;
242 if ( forceTimings ) {
243 CkPrintf(
"The last force output (seq=%d) takes %.3f seconds, %.3f MB of memory in use\n", seq, exectime, mem);
251 if ( ! dataStreamFile ) {
256 CkPrintf(
"Info: OPENING AUXILIARY DATA STREAM FILE %s\n", fname);
258 dataStreamFile = fopen(fname,
"w");
259 if ( ! dataStreamFile )
260 NAMD_die(
"Can't open auxiliary data stream file!");
262 fprintf(dataStreamFile,
"%s",msg->
data.
begin());
263 fflush(dataStreamFile);
277 #ifdef MEM_OPT_VERSION 278 DebugM(3,
"["<<CkMyPe()<<
"]"<<
" receiveOutputPosReady\n");
279 positions.submitData(seq);
285 #ifdef MEM_OPT_VERSION 292 #ifdef MEM_OPT_VERSION 300 #ifdef MEM_OPT_VERSION 301 DebugM(3,
"["<<CkMyPe()<<
"]"<<
" startNextRoundOutputPos\n");
302 if(totalT > posIOTime) posIOTime = totalT;
304 #ifndef OUTPUT_SINGLE_FILE 305 #error OUTPUT_SINGLE_FILE not defined! 308 #if OUTPUT_SINGLE_FILE 309 if(++posDoneCnt <
Node::Object()->simParameters->numoutputwrts)
return;
311 if(++posDoneCnt <
Node::Object()->simParameters->numoutputprocs)
return;
321 positions.removeFirstReady();
323 posOutTime = CmiWallTimer()-posOutTime;
325 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);
336 #ifdef MEM_OPT_VERSION 338 if(totalT > velIOTime) velIOTime = totalT;
340 #if OUTPUT_SINGLE_FILE 341 if(++velDoneCnt <
Node::Object()->simParameters->numoutputwrts)
return;
343 if(++velDoneCnt <
Node::Object()->simParameters->numoutputprocs)
return;
353 velocities.removeFirstReady();
355 velOutTime = CmiWallTimer()-velOutTime;
357 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);
368 #ifdef MEM_OPT_VERSION 369 DebugM(3,
"["<<CkMyPe()<<
"]"<<
" startNextRoundOutputForce\n");
370 if(totalT > forceIOTime) forceIOTime = totalT;
372 #if OUTPUT_SINGLE_FILE 373 if(++forceDoneCnt <
Node::Object()->simParameters->numoutputwrts)
return;
375 if(++forceDoneCnt <
Node::Object()->simParameters->numoutputprocs)
return;
385 forces.removeFirstReady();
387 forceOutTime = CmiWallTimer()-forceOutTime;
388 if ( forceTimings ) {
389 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);
401 #ifdef MEM_OPT_VERSION 402 DebugM(3,
"["<<CkMyPe()<<
"]"<<
" wrapCoorFinished\n");
403 if(++wrapCoorDoneCnt ==
Node::Object()->simParameters->numoutputprocs){
407 posIOTime = CmiWallTimer()-posOutTime;
412 CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
415 #if OUTPUT_SINGLE_FILE 417 int grpsize = ioMgr->numOutputProcs / ioMgr->numOutputWrts;
418 int remains = ioMgr->numOutputProcs % ioMgr->numOutputWrts;
421 for(i=0; i<remains; i++){
422 io[ioMgr->outputProcArray[outrank]].disposePositions(c->
seq, posIOTime);
423 outrank += (grpsize+1);
425 for(; i<ioMgr->numOutputWrts; i++){
426 io[ioMgr->outputProcArray[outrank]].disposePositions(c->
seq, posIOTime);
431 for(
int i=0; i<ioMgr->numOutputProcs; i++) {
432 io[ioMgr->outputProcArray[i]].disposePositions(c->
seq, posIOTime);
440 #ifdef MEM_OPT_VERSION 441 void CollectionMaster::checkPosReady(){
442 CollectVectorInstance *c;
443 DebugM(3,
"["<<CkMyPe()<<
"]"<<
" checkPosReady\n");
444 if((c = positions.getReady())){
451 posOutTime = CmiWallTimer();
453 CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
456 for(
int i=0; i<ioMgr->numOutputProcs; i++){
457 io[ioMgr->outputProcArray[i]].
wrapCoor(c->seq, c->lattice);
465 posIOTime = CmiWallTimer() - posOutTime;
467 #if OUTPUT_SINGLE_FILE 468 int grpsize = ioMgr->numOutputProcs / ioMgr->numOutputWrts;
469 int remains = ioMgr->numOutputProcs % ioMgr->numOutputWrts;
472 for(i=0; i<remains; i++){
473 io[ioMgr->outputProcArray[outrank]].disposePositions(c->seq, posIOTime);
474 outrank += (grpsize+1);
476 for(; i<ioMgr->numOutputWrts; i++){
477 io[ioMgr->outputProcArray[outrank]].disposePositions(c->seq, posIOTime);
482 for(
int i=0; i<ioMgr->numOutputProcs; i++) {
483 io[ioMgr->outputProcArray[i]].disposePositions(c->seq, posIOTime);
491 void CollectionMaster::checkVelReady(){
492 CollectVectorInstance *c;
493 if((c = velocities.getReady())){
501 velOutTime = CmiWallTimer();
504 velIOTime = CmiWallTimer() - velOutTime;
507 CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
510 #if OUTPUT_SINGLE_FILE 511 int grpsize = ioMgr->numOutputProcs / ioMgr->numOutputWrts;
512 int remains = ioMgr->numOutputProcs % ioMgr->numOutputWrts;
515 for(i=0; i<remains; i++){
516 io[ioMgr->outputProcArray[outrank]].disposeVelocities(c->seq, velIOTime);
517 outrank += (grpsize+1);
519 for(; i<ioMgr->numOutputWrts; i++){
520 io[ioMgr->outputProcArray[outrank]].disposeVelocities(c->seq, velIOTime);
525 for(
int i=0; i<ioMgr->numOutputProcs; i++) {
526 io[ioMgr->outputProcArray[i]].disposeVelocities(c->seq, velIOTime);
533 void CollectionMaster::checkForceReady(){
534 CollectVectorInstance *c;
535 if((c = forces.getReady())){
543 forceOutTime = CmiWallTimer();
546 forceIOTime = CmiWallTimer() - forceOutTime;
549 CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
552 #if OUTPUT_SINGLE_FILE 553 int grpsize = ioMgr->numOutputProcs / ioMgr->numOutputWrts;
554 int remains = ioMgr->numOutputProcs % ioMgr->numOutputWrts;
557 for(i=0; i<remains; i++){
558 io[ioMgr->outputProcArray[outrank]].disposeForces(c->seq, forceIOTime);
559 outrank += (grpsize+1);
561 for(; i<ioMgr->numOutputWrts; i++){
562 io[ioMgr->outputProcArray[outrank]].disposeForces(c->seq, forceIOTime);
567 for(
int i=0; i<ioMgr->numOutputProcs; i++) {
568 io[ioMgr->outputProcArray[i]].disposeForces(c->seq, forceIOTime);
576 void CollectionMidMaster::disposePositions(
int seq)
578 DebugM(3,
"["<<CkMyPe()<<
"]"<<
" disposePositions\n");
579 CollectMidVectorInstance *c = positions.getReady(seq);
581 parOut->coordinateSlave(seq,c->fromAtomID,c->toAtomID,
582 c->data.begin(),c->fdata.begin());
586 void CollectionMidMaster::disposeVelocities(
int seq)
588 CollectMidVectorInstance *c = velocities.getReady(seq);
590 parOut->velocitySlave(seq,c->fromAtomID,c->toAtomID,c->data.begin());
594 void CollectionMidMaster::disposeForces(
int seq)
596 CollectMidVectorInstance *c = forces.getReady(seq);
598 parOut->forceSlave(seq,c->fromAtomID,c->toAtomID,c->data.begin());
603 #include "CollectionMaster.def.h"
CollectVectorInstance * removeReady(void)
void force(int timestep, int n, Vector *frc, FloatVector *ffrc)
Produce appropriate force for the current timestep.
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)
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 velocity(int timestep, int n, Vector *vel, FloatVector *fvel)
Produce appropriate velocity for the current timestep.
void coordinate(int timestep, int n, Vector *coor, FloatVector *fcoor, Lattice &lattice)
Produce appropriate coordinate output for the current timestep.
void disposePositions(CollectVectorInstance *c)
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 receiveOutputForceReady(int seq)