Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

CollectionMaster.C

Go to the documentation of this file.
00001 
00007 #include "largefiles.h"
00008 
00009 #include "InfoStream.h"
00010 #include "CollectionMaster.h"
00011 #include "Node.h"
00012 #include "Output.h"
00013 #include "ProcessorPrivate.h"
00014 #include "SimParameters.h"
00015 #include "packmsg.h"
00016 #include "CollectionMaster.decl.h"
00017 
00018 // #define DEBUGM
00019 #include "Debug.h"
00020 
00021 //CollectionMasterHandler should always be on processor 0
00022 CollectionMasterHandler::CollectionMasterHandler(MasterHandlerInitMsg *msg): realMaster(msg->master)
00023 {
00024   delete msg;
00025   if (CkpvAccess(CollectionMasterHandler_instance) == 0) {
00026     CkpvAccess(CollectionMasterHandler_instance) = this;
00027   } else {
00028     DebugM(1, "CollectionMasterHandler::CollectionMasterHandler() - another instance of CollectionMasterHandler exists!\n");
00029   }
00030   enqueuePhase = 0;
00031 }
00032 
00033 
00034 CollectionMasterHandler::~CollectionMasterHandler(void)
00035 {
00036 }
00037 
00038 void CollectionMasterHandler::enqueuePositions(EnqueueDataMsg *msg){
00039     if(enqueuePhase==0){
00040         CProxy_CollectionMaster cm(realMaster);
00041         EnqueueDataMsg *newmsg = new EnqueueDataMsg;
00042         newmsg->timestep = msg->timestep;
00043         newmsg->l = msg->l;
00044         cm.enqueuePositionsFromHandler(newmsg);
00045         delete msg;
00046     }else if(enqueuePhase==1){
00047         enqueuePhase = 0;
00048         CkStartQD(CkIndex_CollectionMasterHandler::enqueuePositions((CkQdMsg*)0), &thishandle);
00049     }else{
00050         NAMD_die("Enqueue phase at enqueuePositions in the CollectionMasterHandler has wrong value!\n");
00051     }
00052 }
00053 
00054 void CollectionMasterHandler::enqueueVelocities(int seq){
00055     if(enqueuePhase==0){
00056         CProxy_CollectionMaster cm(realMaster);
00057         cm.enqueueVelocitiesFromHandler(seq);
00058     }else if(enqueuePhase==1){
00059         enqueuePhase = 0;
00060         CkStartQD(CkIndex_CollectionMasterHandler::enqueueVelocities((CkQdMsg*)0), &thishandle);
00061     }else{
00062         NAMD_die("Enqueue phase at enqueueVelocities in the CollectionMasterHandler has wrong value!\n");
00063     }
00064 }
00065 
00066 void CollectionMasterHandler::enqueuePositions(CkQdMsg *qmsg){
00067     delete qmsg;
00068     Object()->enqueuePositions((EnqueueDataMsg *)NULL);
00069 }
00070 
00071 void CollectionMasterHandler::enqueueVelocities(CkQdMsg *qmsg){
00072     delete qmsg;
00073     Object()->enqueueVelocities(0);
00074 }
00075 
00076 CollectionMaster::CollectionMaster()
00077 {
00078   if (CkpvAccess(CollectionMaster_instance) == 0) {
00079     CkpvAccess(CollectionMaster_instance) = this;
00080   } else {
00081     DebugM(1, "CollectionMaster::CollectionMaster() - another instance of CollectionMaster exists!\n");
00082   }
00083   dataStreamFile = 0;
00084 }
00085 
00086 
00087 CollectionMaster::~CollectionMaster(void)
00088 {
00089 }
00090 
00091 
00092 void CollectionMaster::receivePositions(CollectVectorMsg *msg)
00093 {
00094   positions.submitData(msg->seq,msg->aid,msg->data,msg->fdata);
00095   delete msg;
00096 
00097   CollectVectorInstance *c;
00098   while ( ( c = positions.removeReady() ) ) { disposePositions(c); }
00099 }
00100 
00101 void CollectionMaster::enqueuePositions(int seq, Lattice &lattice)
00102 {
00103   positions.enqueue(seq,lattice);
00104 
00105   CollectVectorInstance *c;
00106   while ( ( c = positions.removeReady() ) ) { disposePositions(c); }
00107 }
00108 
00109 void CollectionMaster::enqueuePositionsFromHandler(EnqueueDataMsg *msg){
00110     enqueuePositions(msg->timestep, msg->l);
00111     delete msg;
00112 }
00113 
00114 void CollectionMaster::disposePositions(CollectVectorInstance *c)
00115 {
00116     DebugM(3,"Collected positions at " << c->seq << std::endl);
00117     int seq = c->seq;
00118     int size = c->data.size();
00119     if ( ! size ) size = c->fdata.size();
00120     Vector *data = c->data.begin();
00121     FloatVector *fdata = c->fdata.begin();
00122     Node::Object()->output->coordinate(seq,size,data,fdata,c->lattice);
00123     c->free();
00124 }
00125 
00126 
00127 void CollectionMaster::receiveVelocities(CollectVectorMsg *msg)
00128 {
00129   velocities.submitData(msg->seq,msg->aid,msg->data,msg->fdata);
00130   delete msg;
00131 
00132   CollectVectorInstance *c;
00133   while ( ( c = velocities.removeReady() ) ) { disposeVelocities(c); }
00134 }
00135 
00136 void CollectionMaster::enqueueVelocities(int seq)
00137 {
00138   Lattice dummy;
00139   velocities.enqueue(seq,dummy);
00140 
00141   CollectVectorInstance *c;
00142   while ( ( c = velocities.removeReady() ) ) { disposeVelocities(c); }
00143 }
00144 
00145 void CollectionMaster::enqueueVelocitiesFromHandler(int seq){
00146     enqueueVelocities(seq);
00147 }
00148 
00149 void CollectionMaster::disposeVelocities(CollectVectorInstance *c)
00150 {
00151     DebugM(3,"Collected velocities at " << c->seq << std::endl);
00152     int seq = c->seq;
00153     int size = c->data.size();
00154     Vector *data = c->data.begin();
00155     Node::Object()->output->velocity(seq,size,data);
00156     c->free();
00157 }
00158 
00159 
00160 void CollectionMaster::receiveDataStream(DataStreamMsg *msg) {
00161     if ( ! dataStreamFile ) {
00162       char *fname = Node::Object()->simParameters->auxFilename;
00163       // iout has large file linking issues on AIX
00164       // iout << iINFO << "OPENING AUXILIARY DATA STREAM FILE "
00165       //                                << fname << "\n" << endi;
00166       CkPrintf("Info: OPENING AUXILIARY DATA STREAM FILE %s\n", fname);
00167       NAMD_backup_file(fname);
00168       dataStreamFile = fopen(fname,"w");
00169       if ( ! dataStreamFile )
00170                 NAMD_die("Can't open auxiliary data stream file!");
00171     }
00172     fprintf(dataStreamFile,"%s",msg->data.begin());
00173     fflush(dataStreamFile);
00174     delete msg;
00175 }
00176 
00177 
00178 PACK_MSG(CollectVectorMsg,
00179   PACK(seq);
00180   PACK_RESIZE(aid);
00181   PACK_RESIZE(data);
00182   PACK_RESIZE(fdata);
00183 )
00184 
00185 PACK_MSG(DataStreamMsg,
00186   PACK_RESIZE(data);
00187 )
00188 
00189 PACK_MSG(EnqueueDataMsg,
00190   PACK(timestep);
00191   PACK(l);
00192 )
00193 
00194 #include "CollectionMaster.def.h"
00195 

Generated on Mon Nov 23 04:59:18 2009 for NAMD by  doxygen 1.3.9.1