34 bool transitionFlag =
false, recordFlag =
true, stopFlag =
false,
35 firstTransitFlag =
false;
36 long nFreeCoord =
reactant->numberOfFreeAtoms() * 3;
38 long step = 0, refineStep, newStateStep = 0;
39 long nCheck = 0, nRecord = 0, nBoost = 0, nState = 0;
40 long StateCheckInterval, RecordInterval;
41 double kinE, kinT, avgT, varT;
42 double kB =
params.constants().kB;
43 double correctedTime = 0.0, sumCorrectedTime = 0.0, firstTransitionTime = 0.0;
44 double Temp = 0.0, sumT = 0.0, sumT2 = 0.0;
45 double sumboost = 0.0, boost = 1.0, boostPotential = 0.0;
46 double transitionTime_current = 0.0, transitionTime_pre = 0.0;
51 StateCheckInterval = clock.state_check;
52 RecordInterval = clock.record;
53 Temp =
params.main_options().temperature;
56 mdBufferLength = clock.buffer;
57 std::vector<std::shared_ptr<Matter>> mdBuffer(mdBufferLength);
58 for (
long i = 0; i < mdBufferLength; i++) {
59 mdBuffer[i] = std::make_shared<Matter>(
pot,
params);
67 if (
params.hyperdynamics_options().bias_potential ==
70 current->setBiasPotential(&bondBoost);
82 "Starting MD run\nTemperature: {:.2f} Kelvin\n"
83 "Total Simulation Time: {:.2f} fs\nTime Step: {:.2f} fs\nTotal Steps: {}",
85 params.dynamics_options().steps *
params.dynamics_options().time_step *
86 params.constants().timeUnit,
87 params.dynamics_options().time_step *
params.constants().timeUnit,
88 params.dynamics_options().steps);
89 QUILL_LOG_DEBUG(
log,
"MD buffer length: {}", mdBufferLength);
91 long tenthSteps =
params.dynamics_options().steps / 10;
92 if (tenthSteps == 0) {
93 tenthSteps =
params.dynamics_options().steps;
99 if ((
params.hyperdynamics_options().bias_potential ==
103 boostPotential = bondBoost.
boost();
104 QUILL_LOG_TRACE_L1(
log,
"step= {} , boost = {:.5f}", step,
106 if (Temp > 0.0 && kB > 0.0) {
107 boost = std::exp(boostPotential / kB / Temp);
116 time +=
params.dynamics_options().time_step * boost;
118 kinE =
current->getKineticEnergy();
119 kinT = (2.0 * kinE / nFreeCoord / kB);
121 sumT2 += kinT * kinT;
122 QUILL_LOG_TRACE_L1(
log,
"steps = {:10} temp = {:10.5f}", step, kinT);
129 QUILL_LOG_TRACE_L1(
log,
"step = {:4}, time = {:10.4f}", step,
time);
131 if (
params.parallel_replica_options().refine_transition && recordFlag &&
133 if (nCheck % RecordInterval == 0) {
148 if (transitionFlag) {
150 QUILL_LOG_DEBUG(
log,
"New State {}: ", nState);
155 firstTransitFlag = 1;
159 if (transitionFlag) {
160 QUILL_LOG_TRACE_L1(
log,
"Refining transition time.");
161 const bool can_refine =
162 params.parallel_replica_options().refine_transition && nRecord >= 2;
167 newStateStep - StateCheckInterval + refineStep * RecordInterval;
168 transitionTime_current =
timeBuffer[
static_cast<size_t>(refineStep)];
170 const long prev = refineStep > 0 ? refineStep - 1 : 0;
171 *
current = *mdBuffer[
static_cast<size_t>(prev)];
174 transitionTime_current =
time;
178 transitionTime_pre = transitionTime_current;
180 (Temp > 0.0 && kB > 0.0)
183 sumCorrectedTime += correctedTime;
187 velocity =
current->getVelocities();
188 velocity = velocity * (-1);
189 current->setVelocities(velocity);
194 *
saddle = *mdBuffer[
static_cast<size_t>(refineStep)];
201 "tranisitonTime= {:.3e} s, biasPot= {:.3f} eV, "
202 "correctedTime= {:.3e} s, "
203 "sumCorrectedTime= {:.3e} s, minCorTime= {:.3e} s",
206 correctedTime * 1e-15 *
params.constants().timeUnit,
207 sumCorrectedTime * 1e-15 *
params.constants().timeUnit,
210 transitionFlag =
false;
213 if (firstTransitFlag && sumCorrectedTime > firstTransitionTime) {
218 if ((step % tenthSteps == 0) || (step ==
params.dynamics_options().steps)) {
221 log,
"progress: {:.0f}%, max displacement: {:.3f}, step {} / {}",
222 static_cast<double>(100.0 * step /
params.dynamics_options().steps),
223 maxAtomDistance, step,
params.dynamics_options().steps);
228 if (step >=
params.dynamics_options().steps) {
234 varT = sumT2 / step - avgT * avgT;
238 "Temperature : Average = {:.6f} ; Stddev = {:.6f} ; "
239 "Factor = {:.6f}; Boost = {:.6f}",
240 avgT, std::sqrt(varT), varT / avgT / avgT * nFreeCoord / 2,
245 "Temperature : Average = {:.6f} ; Stddev = {:.6f} ; Factor = {:.6f}",
246 avgT, std::sqrt(varT), varT / avgT / avgT * nFreeCoord / 2);
248 if (std::isfinite(avgT) == 0) {
249 QUILL_LOG_DEBUG(
log,
"Infinite average temperature, something went wrong!");
254 current->setBiasPotential(
nullptr);