24 {
25 VectorXd min1Freqs, saddleFreqs, min2Freqs;
26
27
28 VectorXi atoms;
29
33 } else {
34 atoms =
movedAtoms(parameters, min1, saddle, min2);
35 }
36
37 assert(atoms.rows() > 0);
38
39
40 Hessian hessian(parameters, min1);
41 min1Freqs = hessian.getFreqs(min1, atoms);
42 if (min1Freqs.size() == 0) {
44 return -1;
45 }
46
48 min1Freqs = hessian.removeZeroFreqs(min1Freqs);
49 }
50
51
52 saddleFreqs = hessian.getFreqs(saddle, atoms);
53 if (saddleFreqs.size() == 0) {
55 return -1;
56 }
57
59 saddleFreqs = hessian.removeZeroFreqs(saddleFreqs);
60 }
61
62
63 min2Freqs = hessian.getFreqs(min2, atoms);
64 if (min2Freqs.size() == 0) {
67 }
68 return -1;
69 }
70
72 min2Freqs = hessian.removeZeroFreqs(min2Freqs);
73 }
74
75
76
77 if ((min1Freqs.size() != saddleFreqs.size()) ||
78 (min2Freqs.size() != saddleFreqs.size())) {
80 EONC_LOG_ERROR(
"[Prefactor] Bad prefactor: Hessian sizes do not match");
81 }
82 return -1;
83 }
84
88
89
90
91
92
93 int numNegFreq = 0;
94 for (int i = 0; i < min1Freqs.size(); i++) {
95 if (min1Freqs(i) < 0) {
96 EONC_LOG_DEBUG(
"[Prefactor] min1 had negative mode of {}", min1Freqs(i));
97 numNegFreq++;
98 }
99 }
100 if (numNegFreq != 0) {
101 EONC_LOG_DEBUG(
"[Prefactor] Error: {} negative modes at min1", numNegFreq);
102 return -1;
103 }
104
105 numNegFreq = 0;
106 for (int i = 0; i < saddleFreqs.size(); i++) {
107 if (saddleFreqs(i) < 0) {
108 numNegFreq++;
109 }
110 }
111 if (numNegFreq != 1) {
113 return -1;
114 }
115
116 numNegFreq = 0;
117 for (int i = 0; i < min2Freqs.size(); i++) {
118 if (min2Freqs(i) < 0) {
119 numNegFreq++;
120 }
121 }
122 if (numNegFreq != 0) {
124 return -1;
125 }
126
127
128 pref1 = 1.0;
129 pref2 = 1.0;
130
132
133
134 for (int i = 0; i < saddleFreqs.size(); i++) {
135 pref1 *= min1Freqs[i];
136 pref2 *= min2Freqs[i];
137 if (saddleFreqs[i] > 0) {
138 pref1 /= saddleFreqs[i];
139 pref2 /= saddleFreqs[i];
140 }
141 }
147 double h_bar = 6.582119e-16;
148 double h = 4.135667e-15;
149 double temp = (h_bar / (2.0 * kB_T));
150
151 for (int i = 0; i < min1Freqs.size(); i++) {
152 pref1 = pref1 * (std::sinh(temp * (std::sqrt(min1Freqs[i]) / 10.18e-15)));
153 pref2 = pref2 * (std::sinh(temp * (std::sqrt(min2Freqs[i]) / 10.18e-15)));
154
155 if (saddleFreqs[i] > 0) {
156 pref1 =
157 pref1 / (std::sinh(temp * (std::sqrt(saddleFreqs[i]) / 10.18e-15)));
158 pref2 =
159 pref2 / (std::sinh(temp * (std::sqrt(saddleFreqs[i]) / 10.18e-15)));
160 }
161 }
162 pref1 = 2. * kB_T / (h)*pref1;
163 pref2 = 2. * kB_T / (h)*pref2;
164 }
165 EONC_LOG_DEBUG(
"[Prefactor] reactant to product prefactor: {:.3e}", pref1);
166 EONC_LOG_DEBUG(
"[Prefactor] product to reactant prefactor: {:.3e}", pref2);
167 return 0;
168}
#define EONC_LOG_DEBUG(...)
#define EONC_LOG_ERROR(...)
struct eonc::Parameters::structure_comparison_options_t structure_comparison_options
struct eonc::Parameters::prefactor_options_t prefactor_options
struct eonc::Parameters::main_options_t main_options
void logFreqs(const VectorXd &freqs, const char *name)
VectorXi movedAtomsPct(const Parameters ¶meters, Matter *min1, Matter *saddle, Matter *min2)
VectorXi movedAtoms(const Parameters ¶meters, Matter *min1, Matter *saddle, Matter *min2)
const char FILTER_FRACTION[]
std::string filter_scheme