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.