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[]){ registerHydrodynamicsModels(); gengetopt_args_info args_info; std::string dumpFileName; std::string mdFileName; std::string prefix; //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){ prefix = args_info.output_arg; } else { prefix = getPrefix(dumpFileName); } std::string outputFilename = prefix + ".diff"; //parse md file and set up the system SimCreator creator; SimInfo* info = creator.createSim(dumpFileName, true); SimInfo::MoleculeIterator mi; Molecule* mol; Molecule::IntegrableObjectIterator ii; StuntDouble* sd; Mat3x3d identMat; identMat(0,0) = 1.0; identMat(1,1) = 1.0; identMat(2,2) = 1.0; Globals* simParams = info->getSimParams(); RealType temperature(0.0); RealType viscosity(0.0); if (simParams->haveViscosity()) { viscosity = simParams->getViscosity(); } else { sprintf(painCave.errMsg, "viscosity must be set\n"); painCave.isFatal = 1; simError(); } if (simParams->haveTargetTemp()) { temperature = simParams->getTargetTemp(); } else { sprintf(painCave.errMsg, "target temperature must be set\n"); painCave.isFatal = 1; simError(); } std::map<std::string, SDShape> uniqueStuntDoubles; for (mol = info->beginMolecule(mi); mol != NULL; mol = info->nextMolecule(mi)) { for (sd = mol->beginIntegrableObject(ii); sd != NULL; sd = mol->nextIntegrableObject(ii)) { if (uniqueStuntDoubles.find(sd->getType()) == uniqueStuntDoubles.end()) { sd->setPos(V3Zero); sd->setA(identMat); if (sd->isRigidBody()) { RigidBody* rb = static_cast<RigidBody*>(sd); rb->updateAtoms(); } SDShape tmp; tmp.shape = ShapeBuilder::createShape(sd); tmp.sd = sd; uniqueStuntDoubles.insert(std::map<std::string, SDShape>::value_type(sd->getType(), tmp)); } } } std::map<std::string, SDShape>::iterator si; for (si = uniqueStuntDoubles.begin(); si != uniqueStuntDoubles.end(); ++si) { HydrodynamicsModel* model; Shape* shape = si->second.shape; StuntDouble* sd = si->second.sd;; if (args_info.model_given) { model = HydrodynamicsModelFactory::getInstance()->createHydrodynamicsModel(args_info.model_arg, sd, info); } else if (shape->hasAnalyticalSolution()) { model = new AnalyticalModel(sd, info); } else { model = new BeadModel(sd, info); } model->init(); std::ofstream ofs; std::stringstream outputBeads; outputBeads << prefix << "_" << model->getStuntDoubleName() << ".xyz"; ofs.open(outputBeads.str().c_str()); model->writeBeads(ofs); ofs.close(); //if beads option is turned on, skip the calculation if (!args_info.beads_flag) { model->calcHydroProps(shape, viscosity, temperature); std::ofstream outputDiff; outputDiff.open(outputFilename.c_str()); model->writeHydroProps(outputDiff); outputDiff.close(); } delete model; } //MemoryUtils::deletePointers(shapes); delete info; }