Hessian

The Hessian matrix (second derivative of the potential energy with respect to atomic coordinates) is used for:

  • Vibrational frequency analysis: Eigenvalues of the mass-weighted Hessian give squared vibrational frequencies. Positive eigenvalues correspond to stable modes; negative eigenvalues indicate saddle point character.

  • hTST prefactors: The harmonic transition state theory rate constant requires the product of frequencies at the minimum and saddle point (see prefactor).

  • Saddle verification: A first-order saddle point has exactly one negative Hessian eigenvalue.

How It Works

eOn computes the Hessian numerically with a selectable finite-difference scheme on the mobile (displaced) atoms: non-fixed atoms in pos.con, optionally restricted by [Hessian] phva_atoms (comma-separated indices, or All). That list is the hybrid/PHVA-class active set — atoms that are moved in FD, not the frozen environment (Li & Jensen, Theor. Chem. Acc. 107, 211, 2002).

Step size is Main.finite_difference (historically also called finite-difference displacement; default (0.01,\text{Å})).

FD schemes ([Hessian] fd_scheme)

one_sided (default) — forward difference, (\sim M) force evaluations for (M = 3 N_\text{mobile}) active DOF (plus one base gradient):

$$H_{ij} \approx -\frac{F_j(x + h e_i) - F_j(x)}{h}$$

central — central difference, (\sim 2M) force evaluations:

$$H_{ij} \approx -\frac{F_j(x + h e_i) - F_j(x - h e_i)}{2h}$$

One-sided is preferred for classical EAM AKMC cost; central reduces (O(h)) bias when validating prefactors. The assembled matrix is symmetrized ((H+H^T)/2) before diagonalization. Mass-weighting uses (\tilde H_{ij} = H_{ij}/\sqrt{m_i m_j}).

Column resume

Long partial Hessians can checkpoint FD columns to checkpoint_path (e.g. hessian.ckpt) with resume = true. Interrupted jobs continue from the next column; a successful run removes the checkpoint.

Usage

[Main]
job = hessian
finite_difference = 0.01

[Hessian]
phva_atoms = All
fd_scheme = one_sided
# fd_scheme = central
# resume = true
# checkpoint_path = hessian.ckpt
zero_freq_value = 1e-6

The output results.dat records force-call counts; hessian.dat holds the mass-weighted matrix when quiet = false. Eigenvalues (squared frequencies) are obtained by diagonalizing the symmetrized matrix (ColMajor eigen solve in the client).

Free/fixed versus active (PHVA)

free/fixed on pos.con / Matter is the optimizer mask: which atoms may move during geometry steps. Under an active-volume setup that set can be large (the entire movable shell).

phva_atoms is the PHVA active set (Li & Jensen, Theor. Chem. Acc. 107, 211, 2002): atoms that are displaced when building a partial Hessian or a matrix-free Hessian-vector product. It is always intersected with free flags so frozen atoms are never moved. Default All means active = free (historical behavior).

The same polarity applies to matrix-free min-mode. Free/fixed is left unchanged; an explicit list sets the Krylov / Ritz dimension to (3 N_\mathrm{active}) rather than (3 N_\mathrm{free}):

[Lanczos]
phva_atoms = 12, 15, 18, 21
tolerance = 0.01
max_iterations = 20

[Davidson]
phva_atoms = 12, 15, 18, 21

In pyeonclient:

import pyeonclient as pyec

mobile = pyec.resolve_mobile_atoms(matter, "12,15,18,21")
lanczos.compute(matter, direction, atoms=mobile)
# or: params.lanczos_phva_atoms = "12,15,18,21"
#     lanczos.compute(matter, direction)