Loading...
Searching...
No Matches
Tunneling.cpp File Reference
#include "eon/Tunneling.h"
#include <Eigen/Eigenvalues>
#include <Eigen/LU>
#include <algorithm>
#include <cmath>
#include <cstdint>
#include <deque>
#include <limits>
#include <numbers>
#include <numeric>
#include <stdexcept>
#include <utility>

Go to the source code of this file.

Namespaces

namespace  eonc
 RAII resource manager for the ARTn C library with global synchronization.
namespace  eonc::tunneling

Functions

double eonc::tunneling::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 > eonc::tunneling::massWeightedPath (const std::vector< std::shared_ptr< Matter > > &band)
 Cumulative mass-weighted arc length at each image of a band.
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.
double eonc::tunneling::hbarOmega (double curvature)
 hbar omega in eV for a mass-weighted curvature.
double eonc::tunneling::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 eonc::tunneling::wkbSplitting (const Profile &p, double hwReactant, double hwProduct)
 delta0 = (hbar omega / pi) exp(-S) with the Landau and Lifshitz prefactor.
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.
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.
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.
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.
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).
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.
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.
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.
double eonc::tunneling::cyclicRingLogAbsDet (double c, const std::vector< MatrixXd > &diag)
 log|det| of the cyclic block-tridiagonal ring Hessian.
std::vector< VectorXd > eonc::tunneling::cyclicRingSolve (double c, const std::vector< MatrixXd > &diag, const std::vector< VectorXd > &rhs)
 Solves that same cyclic ring Hessian.
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).
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).
double eonc::tunneling::parabolicFactor (double temperature, double crossover)
 (pi T_c / T) / sin(pi T_c / T).
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.
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.