--- trunk/OOPSE/libmdtools/OtherVisitor.cpp 2004/04/19 20:54:58 1120 +++ trunk/OOPSE/libmdtools/OtherVisitor.cpp 2004/04/22 03:29:30 1129 @@ -15,8 +15,21 @@ void IgnoreVisitor::visit(RigidBody* rb){ } void IgnoreVisitor::visit(RigidBody* rb){ - if(isIgnoreType(rb->getType())) + vector myAtoms; + vector::iterator atomIter; + AtomInfo* atomInfo; + + if(isIgnoreType(rb->getType())){ + internalVisit(rb); + + myAtoms = rb->getAtoms(); + + for(atomIter = myAtoms.begin(); atomIter != myAtoms.end(); ++atomIter) + internalVisit(*atomIter); + + } + } bool IgnoreVisitor::isIgnoreType(const string& name){ @@ -47,12 +60,15 @@ const string IgnoreVisitor::toString(){ sprintf(buffer ,"Visitor name: %s", visitorName.c_str()); result += buffer; + sprintf(buffer ,"Visitor Description: ignore stuntdoubles\n"); + result += buffer; + //print the ignore type list sprintf(buffer , "Ignore type list contains below types:\n"); result += buffer; for(i = itList.begin(); i != itList.end(); ++i){ - sprintf(buffer ,"%s,\t", i->c_str()); + sprintf(buffer ,"%s\t", i->c_str()); result += buffer; } @@ -62,7 +78,7 @@ const string IgnoreVisitor::toString(){ sprintf(buffer ,"------------------------------------------------------------------\n"); result += buffer; - return buffer; + return result; } //----------------------------------------------------------------------------// @@ -82,32 +98,52 @@ void WrappingVisitor::internalVisit(StuntDouble* sd){ GenericData* data; AtomData* atomData; AtomInfo* atomInfo; - double pos[3]; vector::iterator i; data = sd->getProperty("ATOMDATA"); - if(data != NULL) + if(data != NULL){ atomData = dynamic_cast(data); if(atomData == NULL) return; + } else return; - for(atomInfo = atomData->beginAtomInfo(i); atomInfo != NULL; atomData->nextAtomInfo(i)) + for(atomInfo = atomData->beginAtomInfo(i); atomInfo; atomInfo = atomData->nextAtomInfo(i)) info->wrapVector(atomInfo->pos); + } +const string WrappingVisitor::toString(){ + char buffer[65535]; + string result; + + sprintf(buffer ,"------------------------------------------------------------------\n"); + result += buffer; + + sprintf(buffer ,"Visitor name: %s\n", visitorName.c_str()); + result += buffer; + + sprintf(buffer ,"Visitor Description: wrapping atoms back to periodic box\n"); + result += buffer; + + sprintf(buffer,"------------------------------------------------------------------\n"); + result += buffer; + + return result; +} + //----------------------------------------------------------------------------// -ReplicateVisitor::ReplicateVisitor(SimInfo* info, IntVec3 replicateOpt) : BaseVisitor(){ +ReplicateVisitor::ReplicateVisitor(SimInfo* info, IntVec3 opt) : BaseVisitor(){ this->info = info; visitorName = "ReplicateVisitor"; - this->replicateOpt = replicateOpt; + this->replicateOpt = opt; //generate the replicate directions - for(int i = 0; i < replicateOpt[0]; i ++) - for(int j = 0; i < replicateOpt[1]; j ++) - for(int k = 0; i < replicateOpt[2]; k ++) + for(int i = 0; i <= replicateOpt[0]; i ++) + for(int j = 0; j <= replicateOpt[1]; j ++) + for(int k = 0; k <= replicateOpt[2]; k ++) //skip original frame if(i == 0 && j ==0 && k ==0) continue; @@ -136,10 +172,11 @@ void ReplicateVisitor::internalVisit(StuntDouble* sd){ //if there is not atom data, just skip it data = sd->getProperty("ATOMDATA"); - if(data != NULL) + if(data != NULL){ atomData = dynamic_cast(data); if(atomData == NULL) return; + } else return; @@ -178,9 +215,12 @@ const string ReplicateVisitor::toString(){ sprintf(buffer ,"------------------------------------------------------------------\n"); result += buffer; - sprintf(buffer ,"Visitor name: %s", visitorName.c_str()); + sprintf(buffer ,"Visitor name: %s\n", visitorName.c_str()); result += buffer; + sprintf(buffer ,"Visitor Description: replicate the atoms in different direction\n"); + result += buffer; + //print the replicate direction sprintf(buffer , "repeatX = %d:\n", replicateOpt[0]); result += buffer; @@ -255,11 +295,12 @@ void XYZVisitor::internalVisit(StuntDouble* sd){ atomInfo->AtomType.c_str(), atomInfo->pos[0], atomInfo->pos[1], - atomInfo->pos[2]); + atomInfo->pos[2]); + + frame.push_back(buffer); + } - frame.push_back(buffer); - } bool XYZVisitor::isIgnore(StuntDouble* sd){ @@ -294,6 +335,25 @@ void XYZVisitor::writeFrame(ostream& outStream){ outStream << *i << endl; } +const string XYZVisitor::toString(){ + char buffer[65535]; + string result; + + sprintf(buffer ,"------------------------------------------------------------------\n"); + result += buffer; + + sprintf(buffer ,"Visitor name: %s\n", visitorName.c_str()); + result += buffer; + + sprintf(buffer ,"Visitor Description: assemble the atom data and output xyz file\n"); + result += buffer; + + sprintf(buffer,"------------------------------------------------------------------\n"); + result += buffer; + + return result; +} + //----------------------------------------------------------------------------// void PrepareVisitor::internalVisit(Atom * atom){ @@ -340,4 +400,93 @@ void PrepareVisitor::internalVisit(RigidBody * rb){ for(atomIter = myAtoms.begin(); atomIter != myAtoms.end(); ++atomIter) internalVisit (*atomIter); -} \ No newline at end of file +} + +const string PrepareVisitor::toString(){ + char buffer[65535]; + string result; + + sprintf(buffer ,"------------------------------------------------------------------\n"); + result += buffer; + + sprintf(buffer ,"Visitor name: %s", visitorName.c_str()); + result += buffer; + + sprintf(buffer ,"Visitor Description: prepare for operation of other vistors\n"); + result += buffer; + + sprintf(buffer ,"------------------------------------------------------------------\n"); + result += buffer; + + return result; +} + +//----------------------------------------------------------------------------// + +WaterTypeVisitor:: WaterTypeVisitor(){ + visitorName = "WaterTypeVisitor"; + waterTypeList.insert("TIP3P_RB_0"); + waterTypeList.insert("TIP4P_RB_0"); + waterTypeList.insert("TIP5P_RB_0"); + waterTypeList.insert("SPCE_RB_0"); +} + + +void WaterTypeVisitor:: visit(RigidBody* rb){ + string rbName; + vector myAtoms; + vector::iterator atomIter; + GenericData* data; + AtomData* atomData; + AtomInfo* atomInfo; + vector::iterator i; + + rbName = rb->getType(); + + if(waterTypeList.find(rbName) != waterTypeList.end()){ + + myAtoms = rb->getAtoms(); + for(atomIter = myAtoms.begin(); atomIter != myAtoms.end(); ++atomIter){ + + data = (*atomIter)->getProperty("ATOMDATA"); + if(data != NULL){ + atomData = dynamic_cast(data); + if(atomData == NULL) + continue; + } + else + continue; + + for(atomInfo = atomData->beginAtomInfo(i); atomInfo; atomInfo = atomData->nextAtomInfo(i)){ + replaceType(atomInfo->AtomType); + }//end for(atomInfo) + + }//end for(atomIter) + + }//end if (waterTypeList.find(rbName) != waterTypeList.end()) + +} + +void WaterTypeVisitor:: replaceType(string& atomType){ + atomType = atomType.substr(0, atomType.find('_')); +} + +const string WaterTypeVisitor:: toString(){ + char buffer[65535]; + string result; + + sprintf(buffer ,"------------------------------------------------------------------\n"); + result += buffer; + + sprintf(buffer ,"Visitor name: %s\n", visitorName.c_str()); + result += buffer; + + sprintf(buffer ,"Visitor Description: Replace the atom type in water model\n"); + result += buffer; + + sprintf(buffer ,"------------------------------------------------------------------\n"); + result += buffer; + + return result; +} +