void NVE::moveA(){ SimInfo::MoleculeIterator i; Molecule::IntegrableObjectIterator j; Molecule* mol; StuntDouble* sd; Vector3d vel; Vector3d pos; Vector3d frc; Vector3d Tb; Vector3d ji; RealType mass; for (mol = info_->beginMolecule(i); mol != NULL; mol = info_->nextMolecule(i)) { for (sd = mol->beginIntegrableObject(j); sd != NULL; sd = mol->nextIntegrableObject(j)) { vel = sd->getVel(); pos = sd->getPos(); frc = sd->getFrc(); mass = sd->getMass(); // velocity half step vel += (dt2 /mass * PhysicalConstants::energyConvert) * frc; // position whole step pos += dt * vel; sd->setVel(vel); sd->setPos(pos); if (sd->isDirectional()){ // get and convert the torque to body frame Tb = sd->lab2Body(sd->getTrq()); // get the angular momentum, and propagate a half step ji = sd->getJ(); ji += (dt2 * PhysicalConstants::energyConvert) * Tb; rotAlgo_->rotate(sd, ji, dt); sd->setJ(ji); } } } flucQ_->moveA(); rattle_->constraintA(); }
void NPT::moveA() { SimInfo::MoleculeIterator i; Molecule::IntegrableObjectIterator j; Molecule* mol; StuntDouble* sd; Vector3d Tb, ji; RealType mass; Vector3d vel; Vector3d pos; Vector3d frc; Vector3d sc; int index; thermostat = snap->getThermostat(); loadEta(); instaTemp =thermo.getTemperature(); press = thermo.getPressureTensor(); instaPress = PhysicalConstants::pressureConvert* (press(0, 0) + press(1, 1) + press(2, 2)) / 3.0; instaVol =thermo.getVolume(); Vector3d COM = thermo.getCom(); //evolve velocity half step calcVelScale(); for (mol = info_->beginMolecule(i); mol != NULL; mol = info_->nextMolecule(i)) { for (sd = mol->beginIntegrableObject(j); sd != NULL; sd = mol->nextIntegrableObject(j)) { vel = sd->getVel(); frc = sd->getFrc(); mass = sd->getMass(); getVelScaleA(sc, vel); // velocity half step (use chi from previous step here): vel += dt2*PhysicalConstants::energyConvert/mass* frc - dt2*sc; sd->setVel(vel); if (sd->isDirectional()) { // get and convert the torque to body frame Tb = sd->lab2Body(sd->getTrq()); // get the angular momentum, and propagate a half step ji = sd->getJ(); ji += dt2*PhysicalConstants::energyConvert * Tb - dt2*thermostat.first* ji; rotAlgo_->rotate(sd, ji, dt); sd->setJ(ji); } } } // evolve chi and eta half step thermostat.first += dt2 * (instaTemp / targetTemp - 1.0) / tt2; evolveEtaA(); //calculate the integral of chidt thermostat.second += dt2 * thermostat.first; flucQ_->moveA(); index = 0; for (mol = info_->beginMolecule(i); mol != NULL; mol = info_->nextMolecule(i)) { for (sd = mol->beginIntegrableObject(j); sd != NULL; sd = mol->nextIntegrableObject(j)) { oldPos[index++] = sd->getPos(); } } //the first estimation of r(t+dt) is equal to r(t) for(int k = 0; k < maxIterNum_; k++) { index = 0; for (mol = info_->beginMolecule(i); mol != NULL; mol = info_->nextMolecule(i)) { for (sd = mol->beginIntegrableObject(j); sd != NULL; sd = mol->nextIntegrableObject(j)) { vel = sd->getVel(); pos = sd->getPos(); this->getPosScale(pos, COM, index, sc); pos = oldPos[index] + dt * (vel + sc); sd->setPos(pos); ++index; } } rattle_->constraintA(); } // Scale the box after all the positions have been moved: this->scaleSimBox(); snap->setThermostat(thermostat); saveEta(); }
void NPT::moveB(void) { SimInfo::MoleculeIterator i; Molecule::IntegrableObjectIterator j; Molecule* mol; StuntDouble* sd; int index; Vector3d Tb; Vector3d ji; Vector3d sc; Vector3d vel; Vector3d frc; RealType mass; thermostat = snap->getThermostat(); RealType oldChi = thermostat.first; RealType prevChi; loadEta(); //save velocity and angular momentum index = 0; for (mol = info_->beginMolecule(i); mol != NULL; mol = info_->nextMolecule(i)) { for (sd = mol->beginIntegrableObject(j); sd != NULL; sd = mol->nextIntegrableObject(j)) { oldVel[index] = sd->getVel(); if (sd->isDirectional()) oldJi[index] = sd->getJ(); ++index; } } // do the iteration: instaVol =thermo.getVolume(); for(int k = 0; k < maxIterNum_; k++) { instaTemp =thermo.getTemperature(); instaPress =thermo.getPressure(); // evolve chi another half step using the temperature at t + dt/2 prevChi = thermostat.first; thermostat.first = oldChi + dt2 * (instaTemp / targetTemp - 1.0) / tt2; //evolve eta this->evolveEtaB(); this->calcVelScale(); index = 0; for (mol = info_->beginMolecule(i); mol != NULL; mol = info_->nextMolecule(i)) { for (sd = mol->beginIntegrableObject(j); sd != NULL; sd = mol->nextIntegrableObject(j)) { frc = sd->getFrc(); mass = sd->getMass(); getVelScaleB(sc, index); // velocity half step vel = oldVel[index] + dt2*PhysicalConstants::energyConvert/mass* frc - dt2*sc; sd->setVel(vel); if (sd->isDirectional()) { // get and convert the torque to body frame Tb = sd->lab2Body(sd->getTrq()); ji = oldJi[index] + dt2*PhysicalConstants::energyConvert*Tb - dt2*thermostat.first*oldJi[index]; sd->setJ(ji); } ++index; } } rattle_->constraintB(); if ((fabs(prevChi - thermostat.first) <= chiTolerance) && this->etaConverged()) break; } //calculate integral of chidt thermostat.second += dt2 * thermostat.first; snap->setThermostat(thermostat); flucQ_->moveB(); saveEta(); }
void ThermoIntegrationForceManager::calcForces(){ Snapshot* curSnapshot; SimInfo::MoleculeIterator mi; Molecule* mol; Molecule::IntegrableObjectIterator ii; StuntDouble* sd; Vector3d frc; Vector3d trq; Mat3x3d tempTau; // perform the standard calcForces first ForceManager::calcForces(); curSnapshot = info_->getSnapshotManager()->getCurrentSnapshot(); // now scale forces and torques of all the sds for (mol = info_->beginMolecule(mi); mol != NULL; mol = info_->nextMolecule(mi)) { for (sd = mol->beginIntegrableObject(ii); sd != NULL; sd = mol->nextIntegrableObject(ii)) { frc = sd->getFrc(); frc *= factor_; sd->setFrc(frc); if (sd->isDirectional()){ trq = sd->getTrq(); trq *= factor_; sd->setTrq(trq); } } } // set rawPotential to be the unmodulated potential lrPot_ = curSnapshot->getLongRangePotential(); curSnapshot->setRawPotential(lrPot_); // modulate the potential and update the snapshot lrPot_ *= factor_; curSnapshot->setLongRangePotential(lrPot_); // scale the pressure tensor tempTau = curSnapshot->getStressTensor(); tempTau *= factor_; curSnapshot->setStressTensor(tempTau); // now, on to the applied restraining potentials (if needed): RealType restPot_local = 0.0; RealType vHarm_local = 0.0; if (simParam->getUseRestraints()) { // do restraints from RestraintForceManager: restPot_local = doRestraints(1.0 - factor_); vHarm_local = getUnscaledPotential(); } #ifdef IS_MPI RealType restPot; MPI::COMM_WORLD.Allreduce(&restPot_local, &restPot, 1, MPI::REALTYPE, MPI::SUM); MPI::COMM_WORLD.Allreduce(&vHarm_local, &vHarm_, 1, MPI::REALTYPE, MPI::SUM); lrPot_ += restPot; #else lrPot_ += restPot_local; vHarm_ = vHarm_local; #endif // give the final values to stats curSnapshot->setLongRangePotential(lrPot_); curSnapshot->setRestraintPotential(vHarm_); }