class gpr::neb::NEBPath

Overview

NEB path: chain of images between two endpoints. More…

#include <NEBPath.h>
 
class NEBPath {
public:
    // construction
 
    NEBPath(const Eigen::VectorXd& initial, const Eigen::VectorXd& final_state, int n_images, double spring_constant = 0.1);
 
    // methods
 
    void initializeIDPP(int n_atoms, bool collective = false);
    void computeNEBForces();
    void enableClimbingImage();
    int highestEnergyImageIndex() const;
    const Eigen::VectorXd& nebForce(int i) const;
    Image& image(int i);
    const Image& image(int i) const;
    int numImages() const;
    int numIntermediate() const;
    EigenMatrix intermediatePositions() const;
    void setFromObservation(const Observation& obs, int start_image = 1);
};

Detailed Documentation

NEB path: chain of images between two endpoints.

Construction

NEBPath(const Eigen::VectorXd& initial, const Eigen::VectorXd& final_state, int n_images, double spring_constant = 0.1)

Initialize path with linear interpolation between endpoints.

Parameters:

initial

Initial state positions (flat)

final_state

Final state positions (flat)

n_images

Number of intermediate images (excluding endpoints)

spring_constant

NEB spring constant k

Methods

void initializeIDPP(int n_atoms, bool collective = false)

Initialize from IDPP (image dependent pair potential) interpolation.

Better initial path than linear interpolation for molecular systems. Minimizes deviation of pairwise distances from linearly interpolated endpoint distances. Ported from eOn IDPPObjectiveFunction.

Parameters:

n_atoms

Number of atoms (positions.size() / 3)

collective

If true, use collective IDPP with spring forces (S-IDPP). If false, optimize each image independently.

void computeNEBForces()

Compute NEB forces for all intermediate images.

For each image i (not endpoint): F_NEB = F_perp + F_spring_parallel

Where: F_perp = F - (F . tau) * tau (perpendicular to path) F_spring = k * (|r\_{i+1} - r_i| - |r_i - r\_{i-1}|) * tau tau = normalized tangent along path

For climbing image: F_CI = F - 2*(F . tau)*tau (inverted parallel component)

void enableClimbingImage()

Enable climbing image on the highest-energy intermediate image.

int highestEnergyImageIndex() const

Get the highest energy image (saddle point estimate).

const Eigen::VectorXd& nebForce(int i) const

Get the NEB force for image i.

Image& image(int i)

Access image i.

EigenMatrix intermediatePositions() const

Get all intermediate image positions as a matrix.

Returns:

Matrix of shape (n_intermediate, n_coords)

void setFromObservation(const Observation& obs, int start_image = 1)

Set energies and gradients for images from an Observation.