35 {
36
37 saddle->relax(
false,
true,
false,
"displacementmin");
40
41
42
43 double eproduct, ereactant, de;
44 eproduct =
product->getPotentialEnergy();
45 ereactant =
reactant->getPotentialEnergy();
46 de = eproduct - ereactant;
47 double kB =
params.constants().kB;
48 double Temperature =
params.main_options().temperature;
51 if (de > 0.0 && r > p) {
54 }
55
58 neb.path[0]->matter2con("neb_initial_band.con", false))) {
59 QUILL_LOG_WARNING(
log,
"Failed to write neb_initial_band.con");
60 }
61
62 for (int j = 1; j <= neb.numImages; j++) {
64 neb.path[j]->matter2con("neb_initial_band.con", true))) {
65 QUILL_LOG_WARNING(
log,
"Failed to append neb_initial_band frame");
66 }
67 }
68 neb.compute();
69
70
71 if (neb.numImages < 1) {
72 QUILL_LOG_WARNING(
log,
"No interior NEB image for basin hopping");
75 }
77 if (HighestImage < 1) {
78 QUILL_LOG_WARNING(
log,
"No interior NEB image for basin hopping");
81 }
82
83
84 AtomMatrix r_1 = neb.path[HighestImage - 1]->getPositions();
85 AtomMatrix r_3 = neb.path[HighestImage + 1]->getPositions();
88 MinModeSaddleSearch dim(neb.path[HighestImage], direction.normalized(),
90
91
93 *
saddle = *neb.path[HighestImage];
97}
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
std::shared_ptr< Matter > product
static double metropolisProbability(double de, double kB, double temperature)
Quenched Metropolis weight for energy change de.
static AtomMatrix initialDimerDirection(const Matter &image, const AtomMatrix &prev, const AtomMatrix &next)
static int highestEnergyInteriorImage(const std::vector< std::shared_ptr< Matter > > &path, long numImages)
Highest-energy interior bead.
std::shared_ptr< Potential > pot
const Parameters & params
constexpr bool io_ok(IoStatus s) noexcept
double random(long newSeed=0)