48#include "integrators/Integrator.hpp"
53#include "brains/Snapshot.hpp"
54#include "flucq/FluctuatingChargeDamped.hpp"
55#include "flucq/FluctuatingChargeLangevin.hpp"
56#include "flucq/FluctuatingChargeNVE.hpp"
57#include "flucq/FluctuatingChargeNVT.hpp"
58#include "integrators/DLM.hpp"
59#include "rnemd/MethodFactory.hpp"
60#include "rnemd/RNEMD.hpp"
61#include "rnemd/SPFForceManager.hpp"
62#include "utils/CI_String.hpp"
63#include "utils/CaseConversion.hpp"
64#include "utils/simError.h"
68 Integrator::Integrator(
SimInfo* info) :
69 info_(info), forceMan_(NULL), rotAlgo_(NULL), flucQ_(NULL), rattle_(NULL),
70 velocitizer_(nullptr), needPotential(false), needVirial(false),
71 needReset(false), needVelocityScaling(false), useRNEMD(false),
72 dumpWriter(NULL), statWriter(NULL), thermo(info_),
73 snap(info_->getSnapshotManager()->getCurrentSnapshot()) {
74 simParams = info->getSimParams();
76 if (simParams->haveDt()) {
77 dt = simParams->getDt();
80 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
81 "Integrator Error: dt is not set\n");
86 if (simParams->haveRunTime()) {
87 runTime = simParams->getRunTime();
89 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
90 "Integrator Error: runTime is not set\n");
96 if (simParams->haveSampleTime()) {
97 sampleTime = simParams->getSampleTime();
98 statusTime = sampleTime;
100 sampleTime = simParams->getRunTime();
101 statusTime = sampleTime;
104 if (simParams->haveStatusTime()) {
105 statusTime = simParams->getStatusTime();
108 if (simParams->haveThermalTime()) {
109 thermalTime = simParams->getThermalTime();
111 thermalTime = simParams->getRunTime();
114 if (!simParams->getUseInitalTime()) { snap->setTime(0.0); }
116 if (simParams->haveResetTime()) {
118 resetTime = simParams->getResetTime();
122 needVelocityScaling =
false;
123 if (simParams->haveTempSet()) {
124 needVelocityScaling = simParams->getTempSet();
127 if (needVelocityScaling) {
128 if (simParams->haveTargetTemp()) {
129 targetScalingTemp = simParams->getTargetTemp();
131 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
132 "Integrator Error: Target Temperature must be set to turn on "
134 painCave.isFatal = 1;
141 velocitizer_ = std::make_unique<Velocitizer>(info);
143 if (simParams->getRNEMDParameters()->haveUseRNEMD()) {
144 useRNEMD = simParams->getRNEMDParameters()->getUseRNEMD();
148 if (Utils::traits_cast<Utils::ci_char_traits>(
149 simParams->getRNEMDParameters()->getMethod()) ==
"SPF") {
150 forceMan_ =
new RNEMD::SPFForceManager(info);
153 RNEMD::MethodFactory rnemdMethod {
154 simParams->getRNEMDParameters()->getMethod()};
155 rnemd_ = rnemdMethod.create(info, forceMan_);
157 if (simParams->getRNEMDParameters()->haveExchangeTime()) {
159 simParams->getRNEMDParameters()->getExchangeTime();
162 RealType newET = ceil(RNEMD_exchangeTime / dt) * dt;
163 if (std::fabs(newET - RNEMD_exchangeTime) > 1e-6) {
164 RNEMD_exchangeTime = newET;
170 if (forceMan_ == NULL) forceMan_ =
new ForceManager(info);
172 rotAlgo_ =
new DLM();
173 rattle_ =
new Rattle(info);
175 if (simParams->getFluctuatingChargeParameters()->havePropagator()) {
176 std::string prop = toUpperCopy(
177 simParams->getFluctuatingChargeParameters()->getPropagator());
178 if (prop.compare(
"NVT") == 0) {
179 flucQ_ =
new FluctuatingChargeNVT(info);
180 }
else if (prop.compare(
"NVE") == 0) {
181 flucQ_ =
new FluctuatingChargeNVE(info);
182 }
else if (prop.compare(
"LANGEVIN") == 0) {
183 flucQ_ =
new FluctuatingChargeLangevin(info);
184 }
else if (prop.compare(
"DAMPED") == 0) {
185 flucQ_ =
new FluctuatingChargeDamped(info);
187 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
188 "Integrator Error: Unknown Fluctuating Charge propagator (%s) "
190 simParams->getFluctuatingChargeParameters()
193 painCave.isFatal = 1;
197 flucQ_->setForceManager(forceMan_);
210 void Integrator::updateSizes() {
212 flucQ_->updateSizes();
215 void Integrator::setVelocitizer(std::unique_ptr<Velocitizer> velocitizer) {
216 velocitizer_ = std::move(velocitizer);
219 void Integrator::setFluctuatingChargePropagator(
220 FluctuatingChargePropagator* prop) {
221 if (prop != flucQ_ && flucQ_ != NULL) {
delete flucQ_; }
223 if (forceMan_ != NULL) { flucQ_->setForceManager(forceMan_); }
226 void Integrator::setRotationAlgorithm(RotationAlgorithm* algo) {
227 if (algo != rotAlgo_ && rotAlgo_ != NULL) {
delete rotAlgo_; }
232 void Integrator::setRNEMD(std::unique_ptr<RNEMD::RNEMD> rnemd) {
233 rnemd_ = std::move(rnemd);
236 void Integrator::integrate() {
239 while (snap->getTime() <= runTime) {
248 void Integrator::saveConservedQuantity() {
249 snap->setConservedQuantity(calcConservedQuantity());
252 void Integrator::initialize() {
253 forceMan_->initialize();
257 if (simParams->getConserveLinearMomentum()) velocitizer_->removeComDrift();
260 flucQ_->initialize();
265 if (info_->getNGlobalConstraints() > 0) {
266 rattle_->constraintA();
268 rattle_->constraintB();
270 info_->getSnapshotManager()->advance();
273 if (needVelocityScaling) { velocitizer_->randomize(targetScalingTemp); }
275 dumpWriter = createDumpWriter();
276 statWriter = createStatWriter();
277 dumpWriter->writeDumpAndEor();
279 progressBar = std::make_unique<ProgressBar>();
282 saveConservedQuantity();
283 stats->collectStats();
285 if (useRNEMD) rnemd_->getStarted();
287 statWriter->writeStat();
289 currSample = sampleTime + snap->getTime();
290 currStatus = statusTime + snap->getTime();
291 currThermal = thermalTime + snap->getTime();
292 if (needReset) { currReset = resetTime + snap->getTime(); }
293 if (useRNEMD) { currRNEMD = RNEMD_exchangeTime + snap->getTime(); }
294 needPotential =
false;
298 void Integrator::preStep() {
299 RealType difference = snap->getTime() + dt - currStatus;
301 if (difference > 0 || std::fabs(difference) <= dtEps) {
302 needPotential =
true;
307 void Integrator::calcForce() {
308 forceMan_->calcForces();
309 flucQ_->applyConstraints();
312 void Integrator::postStep() {
315 if (needVelocityScaling) {
316 difference = snap->getTime() - currThermal;
318 if (difference > 0 || std::fabs(difference) <= dtEps) {
319 velocitizer_->randomize(targetScalingTemp);
320 currThermal += thermalTime;
325 difference = snap->getTime() - currRNEMD;
327 if (difference > 0 || std::fabs(difference) <= dtEps) {
329 currRNEMD += RNEMD_exchangeTime;
332 rnemd_->collectData();
333 rnemd_->writeOutputFile();
336 saveConservedQuantity();
338 difference = snap->getTime() - currSample;
340 if (difference > 0 || std::fabs(difference) <= dtEps) {
341 dumpWriter->writeDumpAndEor();
342 currSample += sampleTime;
345 difference = snap->getTime() - currStatus;
347 if (difference > 0 || std::fabs(difference) <= dtEps) {
348 stats->collectStats();
350 statWriter->writeStat();
352 progressBar->setStatus(snap->getTime(), runTime);
353 progressBar->update();
355 needPotential =
false;
357 currStatus += statusTime;
360 difference = snap->getTime() - currReset;
362 if (needReset && (difference > 0 || std::fabs(difference) <= dtEps)) {
364 currReset += resetTime;
367 info_->getSnapshotManager()->advance();
370 snap->increaseTime(dt);
373 void Integrator::finalize() {
374 dumpWriter->writeEor();
375 if (useRNEMD) { rnemd_->writeOutputFile(); }
376 progressBar->setStatus(runTime, runTime);
377 progressBar->update();
379 statWriter->writeStatReport();
382 DumpWriter* Integrator::createDumpWriter() {
return new DumpWriter(info_); }
384 StatWriter* Integrator::createStatWriter() {
385 stats =
new Stats(info_);
386 statWriter =
new StatWriter(info_->getStatFileName(), stats);
387 statWriter->setReportFileName(info_->getReportFileName());
virtual ~Integrator()
Default Destructor.
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.