44 bool transitionFlag =
false, recordFlag =
true, stopFlag =
false,
45 firstTransitFlag =
false;
46 long nFreeCoord =
reactant->numberOfFreeAtoms() * 3;
48 long step = 0, refineStep, newStateStep = 0;
49 long nCheck = 0, nRecord = 0, nState = 0;
50 long StateCheckInterval, RecordInterval;
51 double kinE, kinT, avgT, varT;
52 double kB =
params.constants().kB;
53 double correctedTime = 0.0;
54 double stopTime = 0.0, sumSimulatedTime = 0.0;
55 double Temp = 0.0, sumT = 0.0, sumT2 = 0.0;
56 double correctionFactor = 1.0;
57 double transitionTime_current = 0.0, transitionTime_previous = 0.0;
58 double delta, minmu, factor, highT, lowT;
63 lowT =
params.tad_options().low_temperature;
64 highT =
params.main_options().temperature;
65 delta =
params.tad_options().confidence;
66 minmu =
params.tad_options().min_prefactor;
67 factor = std::log(1.0 / delta) / minmu;
69 StateCheckInterval = clock.state_check;
70 RecordInterval = clock.record;
71 Temp =
params.main_options().temperature;
74 mdBufferLength = clock.buffer;
75 std::vector<std::shared_ptr<Matter>> mdBuffer(mdBufferLength);
76 for (
long i = 0; i < mdBufferLength; i++) {
77 mdBuffer[i] = std::make_shared<Matter>(
pot,
params);
82 TAD.setThermalVelocity();
91 "Starting MD run\nTemperature: {:.2f} Kelvin"
92 "Total Simulation Time: {:.2f} fs\nTime Step: {:.2f} fs\nTotal Steps: "
95 params.dynamics_options().steps *
params.dynamics_options().time_step *
96 params.constants().timeUnit,
97 params.dynamics_options().time_step *
params.constants().timeUnit,
98 params.dynamics_options().steps);
99 QUILL_LOG_DEBUG(
log,
"MD buffer length: {}", mdBufferLength);
101 long tenthSteps =
params.dynamics_options().steps / 10;
102 if (tenthSteps == 0) {
103 tenthSteps =
params.dynamics_options().steps;
107 kinE =
current->getKineticEnergy();
108 kinT = (2.0 * kinE / nFreeCoord / kB);
110 sumT2 += kinT * kinT;
111 QUILL_LOG_TRACE_L1(
log,
"steps = {:10d} temp = {:10.5f} ", step, kinT);
119 QUILL_LOG_TRACE_L1(
log,
"step = {:4d}, time= {:10.4f}", step,
time);
121 if (
params.parallel_replica_options().refine_transition && recordFlag &&
123 if (nCheck % RecordInterval == 0) {
137 if (transitionFlag) {
139 QUILL_LOG_DEBUG(
log,
"New State {}: ", nState);
144 firstTransitFlag = 1;
148 if (transitionFlag) {
149 QUILL_LOG_TRACE_L1(
log,
"Refining transition time.");
150 const bool can_refine =
151 params.parallel_replica_options().refine_transition && nRecord >= 2;
161 newStateStep - StateCheckInterval + refineStep * RecordInterval;
162 transitionTime_current =
timeBuffer[
static_cast<size_t>(refineStep)];
163 *
crossing = *mdBuffer[
static_cast<size_t>(refineStep)];
164 const long prev = refineStep > 0 ? refineStep - 1 : 0;
165 *
current = *mdBuffer[
static_cast<size_t>(prev)];
168 transitionTime_current =
time;
170 transitionTime = transitionTime_current - transitionTime_previous;
171 transitionTime_previous = transitionTime_current;
173 QUILL_LOG_DEBUG(
log,
"barrier= {:.3f}",
barrier);
174 correctionFactor = std::exp(
barrier / kB * (1.0 / lowT - 1.0 / highT));
177 velocity =
current->getVelocities();
178 velocity = velocity * (-1);
179 current->setVelocities(velocity);
189 "tranisitonTime= {:.3e} s, Barrier= {:.3f} eV, correctedTime= {:.3e} "
191 "SimulatedTime= {:.3e} s, minCorTime= {:.3e} s, stopTime= {:.3e} s",
193 correctedTime * 1e-15 *
params.constants().timeUnit,
194 sumSimulatedTime * 1e-15 *
params.constants().timeUnit,
196 stopTime * 1.0e-15 *
params.constants().timeUnit);
198 transitionFlag =
false;
201 if (firstTransitFlag && sumSimulatedTime >= stopTime) {
206 if ((step % tenthSteps == 0) || (step ==
params.dynamics_options().steps)) {
209 log,
"progress: {:.0f}%, max displacement: {:.3f}, step {}/{}",
210 static_cast<double>(100.0 * step) /
params.dynamics_options().steps,
211 maxAtomDistance, step,
params.dynamics_options().steps);
214 if (step ==
params.dynamics_options().steps) {
216 if (firstTransitFlag) {
217 QUILL_LOG_DEBUG(
log,
"Detected one transition");
219 QUILL_LOG_DEBUG(
log,
"Failed to detect any transition");
225 varT = sumT2 / step - avgT * avgT;
228 "Temperature : Average = {} ; Stddev = {} ; Factor = {}; "
229 "Average_Boost = {}",
230 avgT, std::sqrt(varT), varT / avgT / avgT * nFreeCoord / 2,
232 params.dynamics_options().time_step);
233 if (std::isfinite(avgT) == 0) {
234 QUILL_LOG_DEBUG(
log,
"Infinite average temperature, something went wrong!");