NPT::NPT(SimInfo* info) : VelocityVerletIntegrator(info), etaTolerance(1e-6), chiTolerance(1e-6), maxIterNum_(4) { Globals* simParams = info_->getSimParams(); if (!simParams->getUseIntialExtendedSystemState()) { Snapshot* currSnapshot = info_->getSnapshotManager()->getCurrentSnapshot(); currSnapshot->setThermostat(make_pair(0.0, 0.0)); currSnapshot->setBarostat(Mat3x3d(0.0)); } if (!simParams->haveTargetTemp()) { sprintf(painCave.errMsg, "You can't use the NVT integrator without a targetTemp!\n"); painCave.isFatal = 1; painCave.severity = OPENMD_ERROR; simError(); } else { targetTemp = simParams->getTargetTemp(); } // We must set tauThermostat if (!simParams->haveTauThermostat()) { sprintf(painCave.errMsg, "If you use the constant temperature\n" "\tintegrator, you must set tauThermostat.\n"); painCave.severity = OPENMD_ERROR; painCave.isFatal = 1; simError(); } else { tauThermostat = simParams->getTauThermostat(); } if (!simParams->haveTargetPressure()) { sprintf(painCave.errMsg, "NPT error: You can't use the NPT integrator\n" " without a targetPressure!\n"); painCave.isFatal = 1; simError(); } else { targetPressure = simParams->getTargetPressure(); } if (!simParams->haveTauBarostat()) { sprintf(painCave.errMsg, "If you use the NPT integrator, you must set tauBarostat.\n"); painCave.severity = OPENMD_ERROR; painCave.isFatal = 1; simError(); } else { tauBarostat = simParams->getTauBarostat(); } tt2 = tauThermostat * tauThermostat; tb2 = tauBarostat * tauBarostat; updateSizes(); }
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; }