33 std::vector<std::string> returnFiles;
40 auto reactant = std::make_unique<Matter>(
pot,
params);
41 auto saddle = std::make_unique<Matter>(
pot,
params);
42 auto product = std::make_unique<Matter>(
pot,
params);
48 throw std::runtime_error(
"failed to load prefactor geometries");
50 double pref1 = 0.0, pref2 = 0.0;
52 params, reactant.get(), saddle.get(), product.get(), pref1, pref2);
55 if (
params.prefactor_options().all_free_atoms) {
56 std::string matterFilename;
57 if (
params.prefactor_options().configuration ==
59 matterFilename = reactantFilename;
60 }
else if (
params.prefactor_options().configuration ==
62 matterFilename = saddleFilename;
63 }
else if (
params.prefactor_options().configuration ==
65 matterFilename = productFilename;
72 throw std::runtime_error(
"failed to load prefactor configuration");
81 "Failed to reload reactant/saddle/product for prefactor");
82 throw std::runtime_error(
"failed to load prefactor geometries");
88 bool failed = (prefStatus == -1) || (atoms.rows() == 0);
91 if (
params.prefactor_options().configuration ==
94 freqs = hessian.
getFreqs(reactant.get(), atoms);
95 }
else if (
params.prefactor_options().configuration ==
98 freqs = hessian.
getFreqs(saddle.get(), atoms);
99 }
else if (
params.prefactor_options().configuration ==
102 freqs = hessian.
getFreqs(product.get(), atoms);
107 failed = freqs.size() != 3 * atoms.rows();
110 std::string results_file(
"results.dat");
111 std::string freq_file(
"freq.dat");
112 returnFiles.push_back(results_file);
113 returnFiles.push_back(freq_file);
115 std::ofstream outFreq(freq_file, std::ios::binary);
119 params.potential_options().potential,
121 env.job_type =
"prefactor";
122 env.tags.emplace_back(
"good", failed ?
"false" :
"true");
123 env.extras.emplace_back(
"force_calls",
static_cast<double>(env.force_calls));
125 env.extras.emplace_back(
"prefactor_reactant_to_product", pref1);
126 env.extras.emplace_back(
"prefactor_product_to_reactant", pref2);
128 env.writeResultsDat(results_file);
130 if (outFreq && !failed) {
131 for (
int i = 0; i < freqs.size(); i++) {
133 outFreq << std::format(
"{:f}\n",
134 std::sqrt(freqs[i]) /
137 outFreq << std::format(
"{:f}\n",
138 -std::sqrt(-freqs[i]) /
144 if (std::filesystem::exists(
"freqs.dat")) {
145 returnFiles.push_back(
"freqs.dat");
147 if (std::filesystem::exists(
"hessian.dat")) {
148 returnFiles.push_back(
"hessian.dat");