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         #if CHARM_VERSION>050402
00049         CkStartQD(CkIndex_CollectionMasterHandler::enqueuePositions((CkQdMsg*)0), &thishandle);
00050         #else
00051         CkStartQD(CProxy_CollectionMasterHandler::ckIdx_enqueuePositions((CkQdMsg*)0), &thishandle);
00052         #endif
00053     }else{
00054         NAMD_die("Enqueue phase at enqueuePositions in the CollectionMasterHandler has wrong value!\n");
00055     }
00056 }
00057 
00058 void CollectionMasterHandler::enqueueVelocities(int seq){
00059     if(enqueuePhase==0){
00060         CProxy_CollectionMaster cm(realMaster);
00061         cm.enqueueVelocitiesFromHandler(seq);
00062     }else if(enqueuePhase==1){
00063         enqueuePhase = 0;
00064         #if CHARM_VERSION>050402
00065         CkStartQD(CkIndex_CollectionMasterHandler::enqueueVelocities((CkQdMsg*)0), &thishandle);
00066         #else
00067         CkStartQD(CProxy_CollectionMasterHandler::ckIdx_enqueueVelocities((CkQdMsg*)0), &thishandle);
00068         #endif
00069     }else{
00070         NAMD_die("Enqueue phase at enqueueVelocities in the CollectionMasterHandler has wrong value!\n");
00071     }
00072 }
00073 
00074 void CollectionMasterHandler::enqueuePositions(CkQdMsg *qmsg){
00075     delete qmsg;
00076     Object()->enqueuePositions((EnqueueDataMsg *)NULL);
00077 }
00078 
00079 void CollectionMasterHandler::enqueueVelocities(CkQdMsg *qmsg){
00080     delete qmsg;
00081     Object()->enqueueVelocities(0);
00082 }
00083 
00084 CollectionMaster::CollectionMaster()
00085 {
00086   if (CkpvAccess(CollectionMaster_instance) == 0) {
00087     CkpvAccess(CollectionMaster_instance) = this;
00088   } else {
00089     DebugM(1, "CollectionMaster::CollectionMaster() - another instance of CollectionMaster exists!\n");
00090   }
00091   dataStreamFile = 0;
00092 }
00093 
00094 
00095 CollectionMaster::~CollectionMaster(void)
00096 {
00097 }
00098 
00099 
00100 void CollectionMaster::receivePositions(CollectVectorMsg *msg)
00101 {
00102   positions.submitData(msg->seq,msg->aid,msg->data,msg->fdata);
00103   delete msg;
00104 
00105   CollectVectorInstance *c;
00106   while ( ( c = positions.removeReady() ) ) { disposePositions(c); }
00107 }
00108 
00109 void CollectionMaster::enqueuePositions(int seq, Lattice &lattice)
00110 {
00111   positions.enqueue(seq,lattice);
00112 
00113   CollectVectorInstance *c;
00114   while ( ( c = positions.removeReady() ) ) { disposePositions(c); }
00115 }
00116 
00117 void CollectionMaster::enqueuePositionsFromHandler(EnqueueDataMsg *msg){
00118     enqueuePositions(msg->timestep, msg->l);
00119     delete msg;
00120 }
00121 
00122 void CollectionMaster::disposePositions(CollectVectorInstance *c)
00123 {
00124     DebugM(3,"Collected positions at " << c->seq << std::endl);
00125     int seq = c->seq;
00126     int size = c->data.size();
00127     if ( ! size ) size = c->fdata.size();
00128     Vector *data = c->data.begin();
00129     FloatVector *fdata = c->fdata.begin();
00130     Node::Object()->output->coordinate(seq,size,data,fdata,c->lattice);
00131     c->free();
00132 }
00133 
00134 
00135 void CollectionMaster::receiveVelocities(CollectVectorMsg *msg)
00136 {
00137   velocities.submitData(msg->seq,msg->aid,msg->data,msg->fdata);
00138   delete msg;
00139 
00140   CollectVectorInstance *c;
00141   while ( ( c = velocities.removeReady() ) ) { disposeVelocities(c); }
00142 }
00143 
00144 void CollectionMaster::enqueueVelocities(int seq)
00145 {
00146   Lattice dummy;
00147   velocities.enqueue(seq,dummy);
00148 
00149   CollectVectorInstance *c;
00150   while ( ( c = velocities.removeReady() ) ) { disposeVelocities(c); }
00151 }
00152 
00153 void CollectionMaster::enqueueVelocitiesFromHandler(int seq){
00154     enqueueVelocities(seq);
00155 }
00156 
00157 void CollectionMaster::disposeVelocities(CollectVectorInstance *c)
00158 {
00159     DebugM(3,"Collected velocities at " << c->seq << std::endl);
00160     int seq = c->seq;
00161     int size = c->data.size();
00162     Vector *data = c->data.begin();
00163     Node::Object()->output->velocity(seq,size,data);
00164     c->free();
00165 }
00166 
00167 
00168 void CollectionMaster::receiveDataStream(DataStreamMsg *msg) {
00169     if ( ! dataStreamFile ) {
00170       char *fname = Node::Object()->simParameters->auxFilename;
00171       // iout has large file linking issues on AIX
00172       // iout << iINFO << "OPENING AUXILIARY DATA STREAM FILE "
00173       //                                << fname << "\n" << endi;
00174       CkPrintf("Info: OPENING AUXILIARY DATA STREAM FILE %s\n", fname);
00175       NAMD_backup_file(fname);
00176       dataStreamFile = fopen(fname,"w");
00177       if ( ! dataStreamFile )
00178                 NAMD_die("Can't open auxiliary data stream file!");
00179     }
00180     fprintf(dataStreamFile,"%s",msg->data.begin());
00181     fflush(dataStreamFile);
00182     delete msg;
00183 }
00184 
00185 
00186 PACK_MSG(CollectVectorMsg,
00187   PACK(seq);
00188   PACK_RESIZE(aid);
00189   PACK_RESIZE(data);
00190   PACK_RESIZE(fdata);
00191 )
00192 
00193 PACK_MSG(DataStreamMsg,
00194   PACK_RESIZE(data);
00195 )
00196 
00197 PACK_MSG(EnqueueDataMsg,
00198   PACK(timestep);
00199   PACK(l);
00200 )
00201 
00202 #include "CollectionMaster.def.h"
00203 

Generated on Fri Jul 25 04:07:15 2008 for NAMD by  doxygen 1.3.9.1