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
00019 #include "Debug.h"
00020
00021
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
00172
00173
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