Classes | |
| struct | Instanton |
| struct | InstantonOptions |
| class | Profile |
| Energy along the path, interpolated as a monotone cubic (Fritsch and Carlson), flat at both ends because the ends of a band are minima. More... | |
| struct | RateInstanton |
| struct | RateInstantonOptions |
| struct | RingSpectrum |
| Spectrum of a closed ring's Hessian without forming it. More... | |
| struct | Splitting |
Typedefs | |
| using | BatchPotential |
| V (eV) and dV/dq (eV / (amu^0.5 Angstrom)) at every point of q, all in one call so a potential can spread the beads over its calculators. | |
| using | BeadHessian = std::function<MatrixXd(long j, const VectorXd &q)> |
| The mass-weighted Hessian d2V/dq2 at interior bead j (1..P-1). | |
| using | RingBeadHessian = std::function<MatrixXd(long j, const VectorXd &q)> |
| The mass-weighted Hessian d2V/dq2 at ring bead j (0..N-1). | |
Functions | |
| 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::vector< double > | massWeightedPath (const std::vector< std::shared_ptr< Matter > > &band) |
| Cumulative mass-weighted arc length at each image of a band. | |
| 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 to the points within half the barrier above that end. | |
| double | hbarOmega (double curvature) |
| hbar omega in eV for a mass-weighted curvature. | |
| double | wkbAction (const Profile &p, double energy, int points=4001) |
| (1/hbar) integral sqrt(2 (V(s) - E)) ds over the path where V > E. | |
| Splitting | wkbSplitting (const Profile &p, double hwReactant, double hwProduct) |
| delta0 = (hbar omega / pi) exp(-S) with the Landau and Lifshitz prefactor. | |
| 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. | |
| double | wkbLogRateAlongPath (const Profile &profile, double beta, double hwReactant) |
| ln(k), k in 1/time, for the one-dimensional thermal rate along profile. | |
| 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. | |
| 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, the larger of the two; in 1 / time. | |
| 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 straight line). | |
| 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. | |
| 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 Hessian has no negative eigenvalue. | |
| 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, with the normalised direction tau (N beads) projected out through the determinant lemma det(J + tau tau^T) = det' J when J tau = 0. | |
| double | cyclicRingLogAbsDet (double c, const std::vector< MatrixXd > &diag) |
| log|det| of the cyclic block-tridiagonal ring Hessian. | |
| std::vector< VectorXd > | cyclicRingSolve (double c, const std::vector< MatrixXd > &diag, const std::vector< VectorXd > &rhs) |
| Solves that same cyclic ring Hessian. | |
| 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). | |
| void | instantonRate (RateInstanton &inst, const RingBeadHessian &hessian, const MatrixXd &hessReactant, double vReactant, const MatrixXd &hessSaddle=MatrixXd(), double vSaddle=0.0, long rigidModes=0, long denseLimit=4096) |
| Fills the rate from the bead Hessians, the reactant minimum's Hessian and energy, and optionally the saddle's Hessian and energy for the classical comparison (pass an empty matrix to skip it). | |
| double | parabolicFactor (double temperature, double crossover) |
| (pi T_c / T) / sin(pi T_c / T). | |
| 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 | 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(beta hbar omega_r / 2) / prod'_s 2 sinh(beta hbar omega_s / 2) exp(-beta barrier), the zero-point and quantised partition functions of every bound mode; the saddle's unstable mode leaves the product. | |
Variables | |
| constexpr double | kHbar = 0.06465415129579072 |
| hbar in eV^0.5 amu^0.5 Angstrom, correctly rounded from the exact SI values (h = 6.62607015e-34 J s, e = 1.602176634e-19 C) and the CODATA 2022 dalton, 1.66053906892e-27 kg. | |
| constexpr double | kBoltzmann = 8.617333262145177e-5 |
| Boltzmann constant in eV / K, correctly rounded from the exact 1.380649e-23 J / K. | |
| constexpr double | kTimeUnitSeconds = 1.0180505717871193e-14 |
| One unit of time, sqrt(amu Angstrom^2 / eV), in seconds. | |
V (eV) and dV/dq (eV / (amu^0.5 Angstrom)) at every point of q, all in one call so a potential can spread the beads over its calculators.
Definition at line 152 of file Tunneling.h.
| using eonc::tunneling::BeadHessian = std::function<MatrixXd(long j, const VectorXd &q)> |
The mass-weighted Hessian d2V/dq2 at interior bead j (1..P-1).
Definition at line 157 of file Tunneling.h.
| using eonc::tunneling::RingBeadHessian = std::function<MatrixXd(long j, const VectorXd &q)> |
The mass-weighted Hessian d2V/dq2 at ring bead j (0..N-1).
Definition at line 359 of file Tunneling.h.
| Splitting eonc::tunneling::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.
Definition at line 458 of file Tunneling.cpp.
| double eonc::tunneling::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 Hessian has no negative eigenvalue.
Definition at line 860 of file Tunneling.cpp.
| double eonc::tunneling::cyclicRingLogAbsDet | ( | double | c, |
| const std::vector< MatrixXd > & | diag ) |
log|det| of the cyclic block-tridiagonal ring Hessian.
Each diag[j] already contains the bead Hessian plus 2 c I, and the neighbour coupling is -c I, including the corner that closes the ring. A singular ring returns -infinity. Throws when the open chain is singular.
Definition at line 1580 of file Tunneling.cpp.
| std::vector< VectorXd > eonc::tunneling::cyclicRingSolve | ( | double | c, |
| const std::vector< MatrixXd > & | diag, | ||
| const std::vector< VectorXd > & | rhs ) |
Solves that same cyclic ring Hessian.
Throws when the ring is singular or the right-hand side does not match the blocks.
Definition at line 1585 of file Tunneling.cpp.
| double eonc::tunneling::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.
rigidModes eigenvalues nearest zero are omitted at each Hessian. The saddle's most negative eigenvalue is the barrier mode and leaves the product.
Definition at line 3151 of file Tunneling.cpp.
| double eonc::tunneling::hbarOmega | ( | double | curvature | ) |
hbar omega in eV for a mass-weighted curvature.
Definition at line 144 of file Tunneling.cpp.
| void eonc::tunneling::instantonRate | ( | RateInstanton & | inst, |
| const RingBeadHessian & | hessian, | ||
| const MatrixXd & | hessReactant, | ||
| double | vReactant, | ||
| const MatrixXd & | hessSaddle = MatrixXd(), | ||
| double | vSaddle = 0.0, | ||
| long | rigidModes = 0, | ||
| long | denseLimit = 4096 ) |
Fills the rate from the bead Hessians, the reactant minimum's Hessian and energy, and optionally the saddle's Hessian and energy for the classical comparison (pass an empty matrix to skip it).
rigidModes is the count of rigid-body zero modes to omit: the translations, plus a rotation only when the reactant Hessian leaves it null (a free cluster has them, a crystal does not, and an atom held fixed has none). They leave the centroid factors, so the rotational and translational partition functions of reactant and instanton cancel. Up to denseLimit ring degrees of freedom the product is the dense eigenproduct, checked against the cyclic block determinant. Beyond that, and for a limit of 0, the block determinant is used and the eigenvalues nearest zero come from inverse iteration on that factorisation. A negative limit forces the dense product.
Definition at line 2963 of file Tunneling.cpp.
| void eonc::tunneling::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.
Definition at line 781 of file Tunneling.cpp.
sqrt(sum_i m_i |b_i - a_i|^2) under the minimum image of a's cell.
Definition at line 34 of file Tunneling.cpp.
| std::vector< double > eonc::tunneling::massWeightedPath | ( | const std::vector< std::shared_ptr< Matter > > & | band | ) |
Cumulative mass-weighted arc length at each image of a band.
Definition at line 52 of file Tunneling.cpp.
| Instanton eonc::tunneling::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 straight line).
Evaluates the interior beads once per iteration and line-search step.
Definition at line 633 of file Tunneling.cpp.
| RateInstanton eonc::tunneling::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).
guess holds N beads, or is empty for a ring stretched along the saddle's unstable mode to where V has dropped by (1 - T / T_c) of the lower of the two barriers. At or below newtonLimit active coordinates the step is an index-1 Newton step on a Bofill Hessian, and below 0.75 T_c an empty guess cools from 0.85 T_c. Beyond that limit the step is minimum-mode following. An even ring whose beads match under j -> N - j is evaluated from one turning point to the other and mirrored. saddle and hessSaddle are mass-weighted.
Definition at line 2674 of file Tunneling.cpp.
| double eonc::tunneling::parabolicFactor | ( | double | temperature, |
| double | crossover ) |
(pi T_c / T) / sin(pi T_c / T).
Defined only above T_c. The factor diverges as T approaches T_c from above and tends to 1 at high T.
Definition at line 3131 of file Tunneling.cpp.
| double eonc::tunneling::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, the larger of the two; in 1 / time.
Definition at line 622 of file Tunneling.cpp.
| double eonc::tunneling::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(beta hbar omega_r / 2) / prod'_s 2 sinh(beta hbar omega_s / 2) exp(-beta barrier), the zero-point and quantised partition functions of every bound mode; the saddle's unstable mode leaves the product.
Times the parabolic factor it is the N -> infinity ring-polymer rate above T_c, so it joins the instanton rate at the crossover; its high-temperature limit is harmonicTstLogRate.
Definition at line 3189 of file Tunneling.cpp.
| std::vector< VectorXd > eonc::tunneling::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.
Bead 0 is the reactant-side turning point and bead N/2 the other; bead N - j repeats bead j. Throws when the path has no barrier, or when the period at the barrier top already exceeds betaHbar.
Definition at line 270 of file Tunneling.cpp.
| RingSpectrum eonc::tunneling::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, with the normalised direction tau (N beads) projected out through the determinant lemma det(J + tau tau^T) = det' J when J tau = 0.
Block LU of the open chain plus a low-rank correction for the closure and tau, O(N f^3).
Definition at line 1562 of file Tunneling.cpp.
| double eonc::tunneling::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 to the points within half the barrier above that end.
The cubic term takes the anharmonic part a parabola alone would fold into the curvature.
Definition at line 104 of file Tunneling.cpp.
| double eonc::tunneling::wkbAction | ( | const Profile & | p, |
| double | energy, | ||
| int | points ) |
(1/hbar) integral sqrt(2 (V(s) - E)) ds over the path where V > E.
Definition at line 151 of file Tunneling.cpp.
| double eonc::tunneling::wkbLogRateAlongPath | ( | const Profile & | profile, |
| double | beta, | ||
| double | hwReactant ) |
ln(k), k in 1/time, for the one-dimensional thermal rate along profile.
hwReactant is hbar omega of the reactant well, in eV. Below the barrier the transmission is the WKB factor; above it, the parabolic continuation.
Definition at line 386 of file Tunneling.cpp.
delta0 = (hbar omega / pi) exp(-S) with the Landau and Lifshitz prefactor.
The level is the higher of the two harmonic ground states, V_i + hbar omega_i / 2, and omega is the geometric mean of the wells; for a symmetric double well both reduce to the textbook formula.
Definition at line 166 of file Tunneling.cpp.
|
inlineconstexpr |
Boltzmann constant in eV / K, correctly rounded from the exact 1.380649e-23 J / K.
Definition at line 41 of file Tunneling.h.
|
inlineconstexpr |
hbar in eV^0.5 amu^0.5 Angstrom, correctly rounded from the exact SI values (h = 6.62607015e-34 J s, e = 1.602176634e-19 C) and the CODATA 2022 dalton, 1.66053906892e-27 kg.
Definition at line 37 of file Tunneling.h.
|
inlineconstexpr |
One unit of time, sqrt(amu Angstrom^2 / eV), in seconds.
Definition at line 224 of file Tunneling.h.