--- branches/development/src/flucq/FluctuatingChargeNVT.cpp 2012/06/05 17:58:55 1739 +++ trunk/src/flucq/FluctuatingChargeNVT.cpp 2015/03/07 21:41:51 2071 @@ -35,7 +35,7 @@ * * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005). * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006). - * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008). + * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008). * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010). * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011). */ @@ -45,14 +45,17 @@ #include "utils/simError.h" #include "utils/PhysicalConstants.hpp" + namespace OpenMD { - FluctuatingChargeNVT::FluctuatingChargeNVT(SimInfo* info, ForceManager* fm) : - FluctuatingChargePropagator(info, fm), chiTolerance_ (1e-6), - maxIterNum_(4), thermo(info), - currentSnapshot_(info->getSnapshotManager()->getCurrentSnapshot()) { - - if (hasFlucQ_) { + FluctuatingChargeNVT::FluctuatingChargeNVT(SimInfo* info) : + FluctuatingChargePropagator(info), maxIterNum_(4), chiTolerance_ (1e-6), + snap(info->getSnapshotManager()->getCurrentSnapshot()), thermo(info) { + } + + void FluctuatingChargeNVT::initialize() { + FluctuatingChargePropagator::initialize(); + if (hasFlucQ_) { if (info_->getSimParams()->haveDt()) { dt_ = info_->getSimParams()->getDt(); dt2_ = dt_ * 0.5; @@ -64,8 +67,7 @@ namespace OpenMD { } if (!info_->getSimParams()->getUseIntialExtendedSystemState()) { - currentSnapshot_->setChiElectronic(0.0); - currentSnapshot_->setIntegralOfChiElectronicDt(0.0); + snap->setElectronicThermostat(make_pair(0.0, 0.0)); } if (!fqParams_->haveTargetTemp()) { @@ -90,15 +92,11 @@ namespace OpenMD { } else { tauThermostat_ = fqParams_->getTauThermostat(); } - updateSizes(); + updateSizes(); } } - void FluctuatingChargeNVT::initialize() { - FluctuatingChargePropagator::initialize(); - } - void FluctuatingChargeNVT::moveA() { if (!hasFlucQ_) return; @@ -109,11 +107,11 @@ namespace OpenMD { Atom* atom; RealType cvel, cpos, cfrc, cmass; - RealType chi = currentSnapshot_->getChiElectronic(); - RealType integralOfChidt = currentSnapshot_->getIntegralOfChiElectronicDt(); + pair thermostat = snap->getElectronicThermostat(); + RealType chi = thermostat.first; + RealType integralOfChidt = thermostat.second; RealType instTemp = thermo.getElectronicTemperature(); - for (mol = info_->beginMolecule(i); mol != NULL; mol = info_->nextMolecule(i)) { for (atom = mol->beginFluctuatingCharge(j); atom != NULL; @@ -122,20 +120,13 @@ namespace OpenMD { cvel = atom->getFlucQVel(); cpos = atom->getFlucQPos(); cfrc = atom->getFlucQFrc(); - cmass = atom->getChargeMass(); - - cerr << atom->getType() << "\n"; - cerr << "Before\n"; - cerr << "cvel: " << cvel << "\tcpos: " << cpos << "\tcfrc: " << cfrc << "\tcmass: " << cmass << "\n"; - + cmass = atom->getChargeMass(); + // velocity half step cvel += dt2_ * cfrc / cmass - dt2_*chi*cvel; // position whole step cpos += dt_ * cvel; - cerr << "After\n"; - cerr << "cvel: " << cvel << "\tcpos: " << cpos << "\n\n"; - atom->setFlucQVel(cvel); atom->setFlucQPos(cpos); } @@ -145,14 +136,10 @@ namespace OpenMD { (tauThermostat_ * tauThermostat_); integralOfChidt += chi * dt2_; - cerr << "Move A instTemp: " << instTemp << "\n"; - currentSnapshot_->setChiElectronic(chi); - currentSnapshot_->setIntegralOfChiElectronicDt(integralOfChidt); - + snap->setElectronicThermostat(make_pair(chi, integralOfChidt)); } void FluctuatingChargeNVT::updateSizes() { - if (!hasFlucQ_) return; oldVel_.resize(info_->getNFluctuatingCharges()); } @@ -163,10 +150,11 @@ namespace OpenMD { Molecule* mol; Atom* atom; RealType instTemp; - RealType chi = currentSnapshot_->getChiElectronic(); + pair thermostat = snap->getElectronicThermostat(); + RealType chi = thermostat.first; RealType oldChi = chi; RealType prevChi; - RealType integralOfChidt = currentSnapshot_->getIntegralOfChiElectronicDt(); + RealType integralOfChidt = thermostat.second; int index; RealType cfrc, cvel, cmass; @@ -186,7 +174,6 @@ namespace OpenMD { for(int k = 0; k < maxIterNum_; k++) { index = 0; instTemp = thermo.getElectronicTemperature(); - cerr << "MoveB instTemp: " << instTemp << "\n"; // evolve chi another half step using the temperature at t + dt/2 prevChi = chi; chi = oldChi + dt2_ * (instTemp / targetTemp_ - 1.0) / @@ -198,12 +185,10 @@ namespace OpenMD { atom = mol->nextFluctuatingCharge(j)) { cfrc = atom->getFlucQFrc(); - cvel =atom->getFlucQVel(); cmass = atom->getChargeMass(); // velocity half step cvel = oldVel_[index] + dt2_ * cfrc / cmass - dt2_*chi*oldVel_[index]; - atom->setFlucQVel(cvel); ++index; } @@ -212,20 +197,19 @@ namespace OpenMD { break; } integralOfChidt += dt2_ * chi; - currentSnapshot_->setChiElectronic(chi); - currentSnapshot_->setIntegralOfChiElectronicDt(integralOfChidt); + snap->setElectronicThermostat(make_pair(chi, integralOfChidt)); } void FluctuatingChargeNVT::resetPropagator() { if (!hasFlucQ_) return; - currentSnapshot_->setChiElectronic(0.0); - currentSnapshot_->setIntegralOfChiElectronicDt(0.0); + snap->setElectronicThermostat(make_pair(0.0, 0.0)); } RealType FluctuatingChargeNVT::calcConservedQuantity() { if (!hasFlucQ_) return 0.0; - RealType chi = currentSnapshot_->getChiElectronic(); - RealType integralOfChidt = currentSnapshot_->getIntegralOfChiElectronicDt(); + pair thermostat = snap->getElectronicThermostat(); + RealType chi = thermostat.first; + RealType integralOfChidt = thermostat.second; RealType fkBT = info_->getNFluctuatingCharges() * PhysicalConstants::kB *targetTemp_;