37inline constexpr double kHbar = 0.06465415129579072;
41inline constexpr double kBoltzmann = 8.617333262145177e-5;
56 Profile(std::vector<double>
s, std::vector<double>
v);
58 const std::vector<double> &
s()
const {
return s_; }
59 const std::vector<double> &
v()
const {
return v_; }
100 double referenceEnergy);
106std::vector<VectorXd>
ringFromPath(
const std::vector<VectorXd> &path,
107 const std::vector<double> &energies,
108 double betaHbar,
long beads);
153 std::function<void(
const std::vector<VectorXd> &q, std::vector<double> &v,
154 std::vector<VectorXd> &grad)>;
182 const VectorXd &start,
const VectorXd &end);
188 double betaHbar, std::vector<VectorXd> guess,
239 const MatrixXd &hessSaddle,
double beta,
240 double barrier,
long rigidModes);
251 const MatrixXd &hessSaddle,
double beta,
252 double barrier,
long rigidModes);
314 const std::vector<VectorXd> &tau);
353 const MatrixXd &hessSaddle,
double beta,
354 std::vector<VectorXd> guess,
374 const MatrixXd &hessReactant,
double vReactant,
376 double vSaddle = 0.0,
long rigidModes = 0,
377 long denseLimit = 4096);
388 const std::vector<MatrixXd> &diag,
389 const std::vector<VectorXd> &rhs);
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, eOnStorageOrder > MatrixXd
Energy along the path, interpolated as a monotone cubic (Fritsch and Carlson), flat at both ends beca...
Profile(std::vector< double > s, std::vector< double > v)
const std::vector< double > & v() const
double operator()(double x) const
const std::vector< double > & s() const
std::function< MatrixXd(long j, const VectorXd &q)> BeadHessian
The mass-weighted Hessian d2V/dq2 at interior bead j (1..P-1).
RingSpectrum ringSpectrum(const std::vector< MatrixXd > &beadHessians, double c, const std::vector< VectorXd > &tau)
The ring Hessian of bead Hessians beadHessians (d2V/dq2 at each of the N beads) and spring constant c...
double cyclicRingLogAbsDet(double c, const std::vector< MatrixXd > &diag)
log|det| of the cyclic block-tridiagonal ring Hessian.
Splitting bandSplitting(const std::vector< std::shared_ptr< Matter > > &band, double referenceEnergy)
The splitting of a converged band, with the well frequencies from the band's curvature at each end.
std::vector< VectorXd > cyclicRingSolve(double c, const std::vector< MatrixXd > &diag, const std::vector< VectorXd > &rhs)
Solves that same cyclic ring Hessian.
double wkbAction(const Profile &p, double energy, int points)
(1/hbar) integral sqrt(2 (V(s) - E)) ds over the path where V > E.
double parabolicFactor(double temperature, double crossover)
(pi T_c / T) / sin(pi T_c / T).
void instantonSplitting(Instanton &inst, const BeadHessian &hessian, const MatrixXd &hessStart, const MatrixXd &hessEnd)
Fills delta0, zeroMode and modeSeparation from the bead Hessians and the Hessians of the two minima.
constexpr double kTimeUnitSeconds
One unit of time, sqrt(amu Angstrom^2 / eV), in seconds.
void instantonRate(RateInstanton &inst, const RingBeadHessian &hessian, const MatrixXd &hessReactant, double vReactant, const MatrixXd &hessSaddle, double vSaddle, long rigidModes, long denseLimit)
Fills the rate from the bead Hessians, the reactant minimum's Hessian and energy, and optionally the ...
double pathOmega(const MatrixXd &hessStart, const MatrixXd &hessEnd, const VectorXd &start, const VectorXd &end)
omega along the straight line between the minima from the curvature of each well there,...
std::function< MatrixXd(long j, const VectorXd &q)> RingBeadHessian
The mass-weighted Hessian d2V/dq2 at ring bead j (0..N-1).
std::vector< VectorXd > ringFromPath(const std::vector< VectorXd > &path, const std::vector< double > &energies, double betaHbar, long beads)
Closed ring of beads samples of path whose imaginary-time period is betaHbar.
RateInstanton optimizeRateInstanton(const VectorXd &saddle, const MatrixXd &hessSaddle, double beta, std::vector< VectorXd > guess, const BatchPotential &potential, const RateInstantonOptions &options)
Finds the rate instanton at inverse temperature beta (1 / eV).
constexpr double kHbar
hbar in eV^0.5 amu^0.5 Angstrom, correctly rounded from the exact SI values (h = 6....
Splitting wkbSplitting(const Profile &p, double hwReactant, double hwProduct)
delta0 = (hbar omega / pi) exp(-S) with the Landau and Lifshitz prefactor.
double harmonicTstLogRate(const MatrixXd &hessReactant, const MatrixXd &hessSaddle, double beta, double barrier, long rigidModes)
ln(k) for classical harmonic transition-state theory, k in 1/time.
double wellCurvature(const Profile &p, bool leftEnd)
d2V/ds2 at one end of the path, in eV / (amu Angstrom^2), from a least squares fit of a s^2 + b s^3 t...
double massWeightedDistance(const Matter &a, const Matter &b)
sqrt(sum_i m_i |b_i - a_i|^2) under the minimum image of a's cell.
std::function< void(const std::vector< VectorXd > &q, std::vector< double > &v, std::vector< VectorXd > &grad)> BatchPotential
V (eV) and dV/dq (eV / (amu^0.5 Angstrom)) at every point of q, all in one call so a potential can sp...
double quantumHarmonicTstLogRate(const MatrixXd &hessReactant, const MatrixXd &hessSaddle, double beta, double barrier, long rigidModes)
ln(k) for quantum harmonic transition-state theory, k in 1/time: (1 / (2 pi beta hbar)) prod_r 2 sinh...
double crossoverTemperature(const MatrixXd &hessSaddle)
T_c = hbar omega_b / (2 pi kB) from the mass-weighted Hessian at the saddle, in K; throws when the He...
double wkbLogRateAlongPath(const Profile &profile, double beta, double hwReactant)
ln(k), k in 1/time, for the one-dimensional thermal rate along profile.
double hbarOmega(double curvature)
hbar omega in eV for a mass-weighted curvature.
std::vector< double > massWeightedPath(const std::vector< std::shared_ptr< Matter > > &band)
Cumulative mass-weighted arc length at each image of a band.
Instanton optimizeInstanton(const VectorXd &start, const VectorXd &end, double betaHbar, std::vector< VectorXd > guess, const BatchPotential &potential, const InstantonOptions &options)
Minimises the action from guess (P + 1 beads, ends at the minima, or empty for a tanh kink along the ...
constexpr double kBoltzmann
Boltzmann constant in eV / K, correctly rounded from the exact 1.380649e-23 J / K.
long maxIterations
L-BFGS iterations.
double forceTolerance
largest per-bead |dS/dq| / dtau, eV / (amu^0.5 Angstrom)
long beads
P: segments from one minimum to the other.
long memory
L-BFGS correction pairs.
double betaHbarOmega
beta hbar omega of the stiffer end along the path; sets the imaginary time
double asymmetry
V(end) - V(start), eV.
std::vector< double > energies
V at every bead, eV.
double zeroMode
the eigenvalue det' leaves out
double action
(S - S_well) / hbar
double s0
integral of |dq/dtau|^2 dtau
bool symmetricEnough
beta |asymmetry| < 0.1: the propagator ratio reads delta0 only when the wells lie within a small frac...
double modeSeparation
The second smallest eigenvalue of J over the zero mode's: small means the kink is not isolated in ima...
double betaHbar
imaginary time the path spans
double delta0
tunnelling splitting, eV
std::vector< VectorXd > path
P + 1 beads, ends at the minima.
long memory
L-BFGS correction pairs.
std::vector< double > rigidSqrtMasses
Rigid motions of the ring: a translation, or one rotation about the ring's centre of mass,...
std::array< bool, 3 > rigidRotations
double maxStep
largest bead move per step, amu^0.5 Angstrom
double energyShift
subtracted from every bead potential, eV
long beads
N, beads on the ring.
long lanczosRestart
Lanczos steps from the previous mode.
double forceTolerance
largest per-bead |dU_N/dq|, eV / (amu^0.5 Angstrom)
bool halfRing
Even N, when the guess already matches under j -> N - j: evaluate the potential from one turning poin...
double lanczosStep
finite-difference step, amu^0.5 Angstrom
std::string initialHessians
Where the bead Hessian blocks start: "saddle" copies the saddle's Hessian to every bead and lets the ...
long newtonLimit
Active coordinates at or below this take the Newton step.
long lanczosFirst
Lanczos steps for the first minimum mode.
bool checkOddSector
A half ring that has converged, or that is stationary at the wrong index, is probed for an unstable m...
long maxIterations
translation steps
long negativeModes
eigenvalues below the zero mode
double ringPotential
U_N, eV.
double zeroEigenvalue
the eigenvalue left out
double beta
1 / (kB T), 1 / eV
std::vector< double > energies
V at every bead, eV.
double bN
sum_j |q_{j+1} - q_j|^2, amu Angstrom^2
double logRate
ln k, k in 1 / time
std::vector< VectorXd > beads
N beads, q_N = q_0 implied.
double classicalRate
Classical harmonic transition-state theory at the same T, 1 / s, when the saddle Hessian was given; i...
double logRateTimesZr
ln(k Z_r), k in 1 / time
double negativeEigenvalue
of the ring Hessian, 1 / time^2
double effectiveBarrier
-kB T ln(2 pi hbar beta k): the barrier an Eyring rate would need, eV.
Spectrum of a closed ring's Hessian without forming it.
double zeroEigenvalue
tau .
double logDetPrime
ln |det' J|: the product over every eigenvalue but the one along tau.
long negativeModes
Eigenvalues below zero, the one along tau left out.
bool deepWells
Both barriers stand above hbar omega; below that WKB is not the right tool and the number is reported...
double hwReactant
hbar omega of the reactant well, eV
double delta0
tunnelling splitting, eV
double barrier
path maximum above the reactant, eV
double referenceEnergy
the level tunnelling happens at, eV
double action
the WKB exponent, dimensionless
double tlsEnergy() const
sqrt(delta^2 + delta0^2), eV
double hwProduct
hbar omega of the product well, eV
double delta
product minus reactant, eV