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 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
00164
00165
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