SelectionSet DistanceFinder::find(const SelectionSet& bs, RealType distance, int frame ) { StuntDouble * center; Vector3d centerPos; Snapshot* currSnapshot = info_->getSnapshotManager()->getSnapshot(frame); SelectionSet bsResult(nObjects_); assert(bsResult.size() == bs.size()); #ifdef IS_MPI int mol; int proc; RealType data[3]; int worldRank = MPI::COMM_WORLD.Get_rank(); #endif for (unsigned int j = 0; j < stuntdoubles_.size(); ++j) { if (stuntdoubles_[j]->isRigidBody()) { RigidBody* rb = static_cast<RigidBody*>(stuntdoubles_[j]); rb->updateAtoms(frame); } } SelectionSet bsTemp(nObjects_); bsTemp = bs; bsTemp.parallelReduce(); for (int i = bsTemp.bitsets_[STUNTDOUBLE].firstOnBit(); i != -1; i = bsTemp.bitsets_[STUNTDOUBLE].nextOnBit(i)) { // Now, if we own stuntdouble i, we can use the position, but in // parallel, we'll need to let everyone else know what that // position is! #ifdef IS_MPI mol = info_->getGlobalMolMembership(i); proc = info_->getMolToProc(mol); if (proc == worldRank) { center = stuntdoubles_[i]; centerPos = center->getPos(frame); data[0] = centerPos.x(); data[1] = centerPos.y(); data[2] = centerPos.z(); MPI::COMM_WORLD.Bcast(data, 3, MPI::REALTYPE, proc); } else { MPI::COMM_WORLD.Bcast(data, 3, MPI::REALTYPE, proc); centerPos = Vector3d(data); } #else center = stuntdoubles_[i]; centerPos = center->getPos(frame); #endif for (unsigned int j = 0; j < stuntdoubles_.size(); ++j) { Vector3d r =centerPos - stuntdoubles_[j]->getPos(frame); currSnapshot->wrapVector(r); if (r.length() <= distance) { bsResult.bitsets_[STUNTDOUBLE].setBitOn(j); } } for (unsigned int j = 0; j < bonds_.size(); ++j) { Vector3d loc = bonds_[j]->getAtomA()->getPos(frame); loc += bonds_[j]->getAtomB()->getPos(frame); loc = loc / 2.0; Vector3d r = centerPos - loc; currSnapshot->wrapVector(r); if (r.length() <= distance) { bsResult.bitsets_[BOND].setBitOn(j); } } for (unsigned int j = 0; j < bends_.size(); ++j) { Vector3d loc = bends_[j]->getAtomA()->getPos(frame); loc += bends_[j]->getAtomB()->getPos(frame); loc += bends_[j]->getAtomC()->getPos(frame); loc = loc / 3.0; Vector3d r = centerPos - loc; currSnapshot->wrapVector(r); if (r.length() <= distance) { bsResult.bitsets_[BEND].setBitOn(j); } } for (unsigned int j = 0; j < torsions_.size(); ++j) { Vector3d loc = torsions_[j]->getAtomA()->getPos(frame); loc += torsions_[j]->getAtomB()->getPos(frame); loc += torsions_[j]->getAtomC()->getPos(frame); loc += torsions_[j]->getAtomD()->getPos(frame); loc = loc / 4.0; Vector3d r = centerPos - loc; currSnapshot->wrapVector(r); if (r.length() <= distance) { bsResult.bitsets_[TORSION].setBitOn(j); } } for (unsigned int j = 0; j < inversions_.size(); ++j) { Vector3d loc = inversions_[j]->getAtomA()->getPos(frame); loc += inversions_[j]->getAtomB()->getPos(frame); loc += inversions_[j]->getAtomC()->getPos(frame); loc += inversions_[j]->getAtomD()->getPos(frame); loc = loc / 4.0; Vector3d r = centerPos - loc; currSnapshot->wrapVector(r); if (r.length() <= distance) { bsResult.bitsets_[INVERSION].setBitOn(j); } } } return bsResult; }
int main(int argc, char* argv[]){ gengetopt_args_info args_info; string dumpFileName; string outFileName; //parse the command line option if (cmdline_parser (argc, argv, &args_info) != 0) { exit(1) ; } //get the dumpfile name and meta-data file name if (args_info.input_given){ dumpFileName = args_info.input_arg; } else { strcpy( painCave.errMsg, "No input file name was specified.\n" ); painCave.isFatal = 1; simError(); } if (args_info.output_given){ outFileName = args_info.output_arg; } else { strcpy( painCave.errMsg, "No output file name was specified.\n" ); painCave.isFatal = 1; simError(); } Vector3i repeat = Vector3i(args_info.repeatX_arg, args_info.repeatY_arg, args_info.repeatZ_arg); Mat3x3d repeatD = Mat3x3d(0.0); repeatD(0,0) = repeat.x(); repeatD(1,1) = repeat.y(); repeatD(2,2) = repeat.z(); Vector3d translate = Vector3d(args_info.translateX_arg, args_info.translateY_arg, args_info.translateZ_arg); //parse md file and set up the system SimCreator oldCreator; SimInfo* oldInfo = oldCreator.createSim(dumpFileName, false); Globals* simParams = oldInfo->getSimParams(); std::vector<Component*> components = simParams->getComponents(); std::vector<int> nMol; for (vector<Component*>::iterator i = components.begin(); i !=components.end(); ++i) { int nMolOld = (*i)->getNMol(); int nMolNew = nMolOld * repeat.x() * repeat.y() * repeat.z(); nMol.push_back(nMolNew); } createMdFile(dumpFileName, outFileName, nMol); SimCreator newCreator; SimInfo* newInfo = newCreator.createSim(outFileName, false); DumpReader* dumpReader = new DumpReader(oldInfo, dumpFileName); int nframes = dumpReader->getNFrames(); DumpWriter* writer = new DumpWriter(newInfo, outFileName); if (writer == NULL) { sprintf(painCave.errMsg, "error in creating DumpWriter"); painCave.isFatal = 1; simError(); } SimInfo::MoleculeIterator miter; Molecule::IntegrableObjectIterator iiter; Molecule::RigidBodyIterator rbIter; Molecule* mol; StuntDouble* sd; StuntDouble* sdNew; RigidBody* rb; Mat3x3d oldHmat; Mat3x3d newHmat; Snapshot* oldSnap; Snapshot* newSnap; Vector3d oldPos; Vector3d newPos; for (int i = 0; i < nframes; i++){ cerr << "frame = " << i << "\n"; dumpReader->readFrame(i); oldSnap = oldInfo->getSnapshotManager()->getCurrentSnapshot(); newSnap = newInfo->getSnapshotManager()->getCurrentSnapshot(); newSnap->setID( oldSnap->getID() ); newSnap->setTime( oldSnap->getTime() ); oldHmat = oldSnap->getHmat(); newHmat = repeatD*oldHmat; newSnap->setHmat(newHmat); newSnap->setThermostat( oldSnap->getThermostat() ); newSnap->setBarostat( oldSnap->getBarostat() ); int newIndex = 0; for (mol = oldInfo->beginMolecule(miter); mol != NULL; mol = oldInfo->nextMolecule(miter)) { for (int ii = 0; ii < repeat.x(); ii++) { for (int jj = 0; jj < repeat.y(); jj++) { for (int kk = 0; kk < repeat.z(); kk++) { Vector3d trans = Vector3d(ii, jj, kk); for (sd = mol->beginIntegrableObject(iiter); sd != NULL; sd = mol->nextIntegrableObject(iiter)) { oldPos = sd->getPos() + translate; oldSnap->wrapVector(oldPos); newPos = oldPos + trans * oldHmat; sdNew = newInfo->getIOIndexToIntegrableObject(newIndex); sdNew->setPos( newPos ); sdNew->setVel( sd->getVel() ); if (sd->isDirectional()) { sdNew->setA( sd->getA() ); sdNew->setJ( sd->getJ() ); } newIndex++; } } } } } //update atoms of rigidbody for (mol = newInfo->beginMolecule(miter); mol != NULL; mol = newInfo->nextMolecule(miter)) { //change the positions of atoms which belong to the rigidbodies for (rb = mol->beginRigidBody(rbIter); rb != NULL; rb = mol->nextRigidBody(rbIter)) { rb->updateAtoms(); rb->updateAtomVel(); } } writer->writeDump(); } // deleting the writer will put the closing at the end of the dump file. delete writer; delete oldInfo; }