Nudged Elastic Band

The nudged elastic band (NEB) is a method for finding saddle points and minimum energy paths between known reactants and products. The method works by optimizing a number of intermediate images along the reaction path. Each image finds the lowest energy possible while maintaining equal spacing to neighboring images. This constrained optimization is done by adding spring forces along the band between images and by projecting out the component of the force due to the potential perpendicular to the band.

Details may be found in Jonsson et al. [NEB_JMJ98], Sheppard and Henkelman [NEB_SH11], and Ásgeirsson and Jónsson [NEB_AsgeirssonJonsson18].

In order to run a nudged elastic band calculation, set job to nudged_elastic_band in the [Main] section. Details of the optimizer can be set as per the Optimizer document.

Tip

For a step-by-step walkthrough contrasting ASE’s NEB with eOn’s advanced features (energy-weighted springs, dimer refinement), see the atomistic-cookbook tutorial on oxadiazole formation with a PET-MAD metatomic potential.

Variants

Added in version 2.0:

Note

eOn, like many other codes after Sheppard et al. [NEB_STH08] uses one optimizer instance for moving the whole band of images.

Added in version 2.8: Via the surrogate potential interface, a native C++ implementation of the Gaussian Process accelerated NEB first described in Koistinen et al. [NEB_KDagbjartsdottirAsgeirsson+17] and Koistinen et al. [NEB_KAsgeirssonVJonsson19].

Added in version 2.12:

  • Onsager-Machlup action-based NEB for minimum action paths.

  • OCINEB (Off-Path Climbing Image NEB) Goswami et al. [NEB_GGJonsson26]: hybrid CI-NEB + Min-Mode Following with hessian eigenmode alignment for automated saddle point refinement.

  • Parallel image force evaluation (requires TBB, -Dwith_parallel_neb=true).

  • IDPP (Image Dependent Pair Potential) path initialization.

  • Modular strategy pattern for tangent, projection, and spring force components.

Onsager-Machlup NEB

The Onsager-Machlup variant replaces the standard spring force with an action-based spring that adapts per-image based on the local force magnitude. Enable with onsager_machlup = true in the NEB section.

OCINEB (hybrid dimer refinement)

OCINEB Goswami et al. [NEB_GGJonsson26] activates a Min-Mode Following (dimer) search on the climbing image after it stabilizes, using hessian eigenmode alignment to refine the saddle point to higher accuracy without additional NEB iterations. Enable with ci_mmf = true.

Parallel evaluation

When compiled with TBB support (-Dwith_parallel_neb=true), image forces are evaluated in parallel. Python-based potentials automatically fall back to serial evaluation.

Configuration

The NEB section can be specified in config.ini:

[Nudged Elastic Band]
images = 7
converged_force = 0.01
climbing_image_method = true

Or programmatically via rgpycrumbs:

from rgpycrumbs.eon.helpers import write_eon_config

config = {
    "Main": {"job": "nudged_elastic_band"},
    "Nudged Elastic Band": {
        "images": 7,
        "converged_force": 0.01,
        "climbing_image_method": True,
    },
}
write_eon_config(config, Path("config.ini"))

See Dictionary-Style Configuration for the full programmatic workflow.

[Nudged Elastic Band]
pydantic model eon.schema.NudgedElasticBandConfig[source]

Show JSON schema
{
   "title": "NudgedElasticBandConfig",
   "type": "object",
   "properties": {
      "images": {
         "default": 5,
         "description": "Number of NEB images between the fixed endpoints.",
         "title": "Images",
         "type": "integer"
      },
      "spring": {
         "default": 5.0,
         "description": "The spring constant, in eV/Ang^2 between the images.",
         "title": "Spring",
         "type": "number"
      },
      "climbing_image_method": {
         "default": true,
         "description": "Indicates if the climbing image method is used.",
         "title": "Climbing Image Method",
         "type": "boolean"
      },
      "old_tangent": {
         "default": false,
         "description": "Indicates if the old tangent method is used.",
         "title": "Old Tangent",
         "type": "boolean"
      },
      "neb_max_iterations": {
         "default": 1000,
         "description": "Maximum number of iterations allowed for the NEB.",
         "title": "Neb Max Iterations",
         "type": "integer"
      },
      "neb_climbing_image_converged_only": {
         "default": true,
         "description": "Indicates if only the climbing image converged is used.",
         "title": "Neb Climbing Image Converged Only",
         "type": "boolean"
      },
      "neb_doubly_nudged": {
         "default": false,
         "description": "Indicates if the doubly nudged method is used.",
         "title": "Neb Doubly Nudged",
         "type": "boolean"
      },
      "neb_doubly_nudged_switching": {
         "default": false,
         "description": "Indicates if the doubly nudged switching method is used.",
         "title": "Neb Doubly Nudged Switching",
         "type": "boolean"
      },
      "neb_elastic_band": {
         "default": false,
         "description": "Indicates if the elastic band method is used.",
         "title": "Neb Elastic Band",
         "type": "boolean"
      },
      "converged_force": {
         "default": 0.01,
         "description": "Converged force threshold for the NEB.",
         "title": "Converged Force",
         "type": "number"
      },
      "onsager_machlup": {
         "default": false,
         "description": "Indicates if the Onsager-Machlup (OM) Action is used.",
         "title": "Onsager Machlup",
         "type": "boolean"
      },
      "om_optimize_k": {
         "default": true,
         "description": "Indicates if the Onsager-Machlup (OM) Action spacing is recalculated at each step.",
         "title": "Om Optimize K",
         "type": "boolean"
      },
      "om_k_scale": {
         "default": 1.0,
         "description": "Indicates stiffness of OM adaption of springs.",
         "title": "Om K Scale",
         "type": "number"
      },
      "om_k_min": {
         "default": 0.1,
         "description": "Minimum stiffness.",
         "title": "Om K Min",
         "type": "number"
      },
      "om_k_max": {
         "default": 100,
         "description": "Minimum stiffness.",
         "title": "Om K Max",
         "type": "number"
      },
      "energy_weighted": {
         "default": false,
         "description": "Indicates if the energy-weighted method is used.",
         "title": "Energy Weighted",
         "type": "boolean"
      },
      "ew_trigger": {
         "default": 10.0,
         "description": "Threshold for the energy-weighted method.",
         "title": "Ew Trigger",
         "type": "number"
      },
      "ew_ksp_min": {
         "default": 0.972,
         "description": "Minimum value for KSP in the energy-weighted method.",
         "title": "Ew Ksp Min",
         "type": "number"
      },
      "ew_ksp_max": {
         "default": 9.72,
         "description": "Maximum value for KSP in the energy-weighted method.",
         "title": "Ew Ksp Max",
         "type": "number"
      },
      "initial_path_in": {
         "default": "",
         "description": "File from which the initial path is read.",
         "title": "Initial Path In",
         "type": "string"
      },
      "initializer": {
         "default": "linear",
         "description": "Initialization strategy.",
         "enum": [
            "linear",
            "idpp",
            "idpp_collective",
            "sidpp",
            "file"
         ],
         "title": "Initializer",
         "type": "string"
      },
      "init_max_iterations": {
         "default": 5000,
         "description": "Steps to run the IDPP for.",
         "title": "Init Max Iterations",
         "type": "integer"
      },
      "init_max_move": {
         "default": 0.1,
         "description": "Max move for NEB initialization.",
         "title": "Init Max Move",
         "type": "number"
      },
      "init_force_threshold": {
         "default": 0.001,
         "description": "Force threshold for NEB IDPP initialization.",
         "title": "Init Force Threshold",
         "type": "number"
      },
      "sidpp_growth_alpha": {
         "default": 0.33,
         "description": "The step size for adding new images in S-IDPP.",
         "title": "Sidpp Growth Alpha",
         "type": "number"
      },
      "minimize_endpoints": {
         "default": true,
         "description": "Minimize the reactant and product before the NEB.",
         "title": "Minimize Endpoints",
         "type": "boolean"
      },
      "minimize_endpoints_for_ipath": {
         "default": false,
         "description": "Minimize the reactant and product before the NEB, even if an initial path is provided.",
         "title": "Minimize Endpoints For Ipath",
         "type": "boolean"
      },
      "ci_after": {
         "default": Infinity,
         "description": "Convergence before the CI is turned on.",
         "title": "Ci After",
         "type": "number"
      },
      "ci_mmf": {
         "default": false,
         "description": "Use an MMF method for the CI.",
         "title": "Ci Mmf",
         "type": "boolean"
      },
      "ci_mmf_after": {
         "default": 0.5,
         "description": "Convergence before the CI is turned on.",
         "title": "Ci Mmf After",
         "type": "number"
      },
      "ci_mmf_nsteps": {
         "default": 10,
         "description": "Number of steps for which the MMF is run at the CI image.",
         "title": "Ci Mmf Nsteps",
         "type": "integer"
      },
      "ci_mmf_ci_stability_count": {
         "default": 5,
         "description": "Number of stable iterations before settling on a CI image index.",
         "title": "Ci Mmf Ci Stability Count",
         "type": "integer"
      },
      "ci_mmf_angle": {
         "default": 0.8,
         "description": "Alignment threshold w.r.t NEB mode.",
         "title": "Ci Mmf Angle",
         "type": "number"
      },
      "setup_mmf_peaks": {
         "default": true,
         "description": "Generate modes and peak configurations.",
         "title": "Setup Mmf Peaks",
         "type": "boolean"
      },
      "mmf_peak_tolerance": {
         "default": 0.05,
         "description": "Generate modes and peak configurations.",
         "title": "Mmf Peak Tolerance",
         "type": "number"
      }
   }
}

Config:
  • use_attribute_docstrings: bool = True

Fields:
field ci_after: float = inf

Convergence before the CI is turned on.

field ci_mmf: bool = False

Use an MMF method for the CI.

field ci_mmf_after: float = 0.5

Convergence before the CI is turned on.

field ci_mmf_angle: float = 0.8

Alignment threshold w.r.t NEB mode.

field ci_mmf_ci_stability_count: int = 5

Number of stable iterations before settling on a CI image index.

field ci_mmf_nsteps: int = 10

Number of steps for which the MMF is run at the CI image.

field climbing_image_method: bool = True

As discussed in Henkelman et al. [NEB_HUJonsson00].

Indicates if the climbing image method is used.

field converged_force: float = 0.01

This defaults to being the same as eon.schema.OptimizerConfig.converged_force

Converged force threshold for the NEB.

field energy_weighted: bool = False

Method as demonstrated in Ásgeirsson et al. [NEB_AsgeirssonBB+21].

Indicates if the energy-weighted method is used.

field ew_ksp_max: float = 9.72

Maximum value for KSP in the energy-weighted method.

field ew_ksp_min: float = 0.972

Minimum value for KSP in the energy-weighted method.

field ew_trigger: float = 10.0

Threshold for the energy-weighted method.

field images: int = 5

Number of NEB images between the fixed endpoints.

field init_force_threshold: float = 0.001

Force threshold for NEB IDPP initialization.

field init_max_iterations: int = 5000

Steps to run the IDPP for.

field init_max_move: float = 0.1

Max move for NEB initialization.

field initial_path_in: str = ''

This file must contain a list of .con files, one per image on the path.

File from which the initial path is read.

field initializer: Literal['linear', 'idpp', 'idpp_collective', 'sidpp', 'file'] = 'linear'

Options: - linear: Euclidean distance based image interpolation for initial NEB paths. - idpp: Image depedent pair potential initialzation Smidstrup et al. [NEB_SPSJonsson14]. - idpp_collective: IDPP as a potential initialized with the NEB. - sidpp: Sequential Image depedent pair potential initialzation Schmerwitz et al. [NEB_SAsgeirssonJonsson24]. - file: Start from an arbitrary path, needs initial_path_in set as well.

Initialization strategy.

field minimize_endpoints: bool = True

Minimize the reactant and product before the NEB.

field minimize_endpoints_for_ipath: bool = False

Minimize the reactant and product before the NEB, even if an initial path is provided.

field mmf_peak_tolerance: float = 0.05

Generate modes and peak configurations.

field neb_climbing_image_converged_only: bool = True

Indicates if only the climbing image converged is used.

field neb_doubly_nudged: bool = False

Indicates if the doubly nudged method is used.

field neb_doubly_nudged_switching: bool = False

Method as demonstrated in Trygubenko and Wales [NEB_TW04].

Indicates if the doubly nudged switching method is used.

field neb_elastic_band: bool = False

Indicates if the elastic band method is used.

field neb_max_iterations: int = 1000

Maximum number of iterations allowed for the NEB.

field old_tangent: bool = False

From Mills and Jónsson [NEB_MJonsson94], before Henkelman and Jónsson [NEB_HJonsson00].

Indicates if the old tangent method is used.

field om_k_max: float = 100

Minimum stiffness.

field om_k_min: float = 0.1

Minimum stiffness.

field om_k_scale: float = 1.0

Stiffness: - > 1 (stiff) provides a smoother path but may “cut corners” near the saddle - < 1 (softer) hugs valleys but paths may become jagged/noisy

Indicates stiffness of OM adaption of springs.

field om_optimize_k: bool = True

Indicates if the Onsager-Machlup (OM) Action spacing is recalculated at each step.

field onsager_machlup: bool = False

Method as demonstrated in Mandelli and Parrinello [NEB_MP21].

Indicates if the Onsager-Machlup (OM) Action is used.

field setup_mmf_peaks: bool = True

Generate modes and peak configurations.

field sidpp_growth_alpha: float = 0.33

The step size for adding new images in S-IDPP.

field spring: float = 5.0

The spring constant, in eV/Ang^2 between the images.

Outputs

NEB writes the usual results.dat, neb.dat, and the final band neb.con.

With write_movies = true in [Debug], eOn also writes per-iteration neb_path_*.con movie files and neb_maximage.con. These .con outputs now embed structured frame metadata via readcon-core, including fields such as energy, frame_index, neb_bead, optional neb_band, reaction_coordinate, relative_energy, and parallel_force.

The existing neb.dat and neb_*.dat outputs are still written and remain the primary compatibility path for current plotting tools.

Refinement

Added in version 2.0.

Far from the minimum energy path, second order optimizers like those using the LBFGS may not be optimal. In these situations, to traverse uninteresting sections of the potential energy surface rapidly, it is best to use an accelerating optimizer like QuickMin to begin with and transition to LBFGS later. To facilitate this, the [Refine] section has been introduced.

pydantic model eon.schema.RefineConfig[source]

Show JSON schema
{
   "title": "RefineConfig",
   "type": "object",
   "properties": {
      "refine_opt_method": {
         "default": "none",
         "description": "The optimization method to use for refinement.",
         "enum": [
            "none",
            "cg",
            "lbfgs",
            "fire",
            "box",
            "qm"
         ],
         "title": "Refine Opt Method",
         "type": "string"
      },
      "refine_threshold": {
         "default": 0.5,
         "description": "Threshold for refinement optimization.",
         "title": "Refine Threshold",
         "type": "number"
      }
   }
}

Config:
  • use_attribute_docstrings: bool = True

Fields:
field refine_opt_method: Literal['none', 'cg', 'lbfgs', 'fire', 'box', 'qm'] = 'none'
Options:
  • none: No refinement optimization

  • cg: Conjugate gradient

  • lbfgs: Limited Memory Broyden-Fletcher-Goldfarb-Shanno QuasiNewton optimizer

  • fire: Fast inertial relaxation engine

  • box: Optimizes the atom positions and box using quickmin

  • qm: Quickmin

The optimization method to use for refinement.

field refine_threshold: float = 0.5

Threshold for refinement optimization.

References

[NEB_GGJonsson26] (1,2)

Rohit Goswami, Miha Gunde, and Hannes Jónsson. Enhanced climbing image nudged elastic band method with hessian eigenmode alignment. January 2026. arXiv:2601.12630, doi:10.48550/arXiv.2601.12630.

[NEB_HJonsson00] (1,2)

Graeme Henkelman and Hannes Jónsson. Improved tangent estimate in the nudged elastic band method for finding minimum energy paths and saddle points. The Journal of Chemical Physics, 113(22):9978–9985, December 2000. doi:10.1063/1.1323224.

[NEB_HUJonsson00] (1,2)

Graeme Henkelman, Blas P. Uberuaga, and Hannes Jónsson. A climbing image nudged elastic band method for finding saddle points and minimum energy paths. The Journal of Chemical Physics, 113(22):9901–9904, November 2000. doi:10.1063/1.1329672.

[NEB_JMJ98]

Hannes Jonsson, Greg Mills, and Karsten W. Jacobsen. Nudged elastic band method for finding minimum energy paths of transitions. In Classical and Quantum Dynamics in Condensed Phase Simulations, pages 385–404. World Scientific, June 1998. doi:10.1142/9789812839664_0016.

[NEB_KDagbjartsdottirAsgeirsson+17]

Olli-Pekka Koistinen, Freyja B. Dagbjartsdóttir, Vilhjálmur Ásgeirsson, Aki Vehtari, and Hannes Jónsson. Nudged elastic band calculations accelerated with Gaussian process regression. The Journal of Chemical Physics, 147(15):152720, September 2017. doi:10.1063/1.4986787.

[NEB_KAsgeirssonVJonsson19]

Olli-Pekka Koistinen, Vilhjálmur Ásgeirsson, Aki Vehtari, and Hannes Jónsson. Nudged Elastic Band Calculations Accelerated with Gaussian Process Regression Based on Inverse Interatomic Distances. Journal of Chemical Theory and Computation, 15(12):6738–6751, December 2019. doi:10.1021/acs.jctc.9b00692.

[NEB_MP21]

D. Mandelli and M. Parrinello. A modified nudged elastic band algorithm with adaptive spring lengths. Journal of Chemical Physics, 155(7):74103, August 2021. doi:10.1063/5.0059593.

[NEB_MJonsson94] (1,2)

Greg Mills and Hannes Jónsson. Quantum and thermal effects in H 2 dissociative adsorption: Evaluation of free energy barriers in multidimensional quantum systems. Physical Review Letters, 72(7):1124–1127, February 1994. doi:10.1103/PhysRevLett.72.1124.

[NEB_SMJonsson94]

Gregory K. Schenter, Gregory Mills, and Hannes Jónsson. Reversible work based quantum transition state theory. The Journal of Chemical Physics, 101(10):8964–8971, November 1994. doi:10.1063/1.468447.

[NEB_SAsgeirssonJonsson24]

Yorick L. A. Schmerwitz, Vilhjálmur Ásgeirsson, and Hannes Jónsson. Improved Initialization of Optimal Path Calculations Using Sequential Traversal over the Image-Dependent Pair Potential Surface. Journal of Chemical Theory and Computation, 20(1):155–163, January 2024. doi:10.1021/acs.jctc.3c01111.

[NEB_SH11]

Daniel Sheppard and Graeme Henkelman. Paths to which the nudged elastic band converges. Journal of Computational Chemistry, 32(8):1769–1771, 2011. doi:10.1002/jcc.21748.

[NEB_STH08]

Daniel Sheppard, Rye Terrell, and Graeme Henkelman. Optimization methods for finding minimum energy paths. The Journal of Chemical Physics, 128(13):134106, April 2008. doi:10.1063/1.2841941.

[NEB_SPSJonsson14]

Søren Smidstrup, Andreas Pedersen, Kurt Stokbro, and Hannes Jónsson. Improved initial guess for minimum energy path calculations. The Journal of Chemical Physics, 140(21):214106, June 2014. doi:10.1063/1.4878664.

[NEB_TW04] (1,2)

Semen A. Trygubenko and David J. Wales. A doubly nudged elastic band method for finding transition states. The Journal of Chemical Physics, 120(5):2082–2094, February 2004. doi:10.1063/1.1636455.

[NEB_AsgeirssonBB+21] (1,2)

Vilhjálmur Ásgeirsson, Benedikt Orri Birgisson, Ragnar Bjornsson, Ute Becker, Frank Neese, Christoph Riplinger, and Hannes Jónsson. Nudged Elastic Band Method for Molecular Reactions Using Energy-Weighted Springs Combined with Eigenvector Following. Journal of Chemical Theory and Computation, 17(8):4929–4945, August 2021. doi:10.1021/acs.jctc.1c00462.

[NEB_AsgeirssonJonsson18]

Vilhjálmur Ásgeirsson and Hannes Jónsson. Exploring Potential Energy Surfaces with Saddle Point Searches. In Wanda Andreoni and Sidney Yip, editors, Handbook of Materials Modeling, pages 1–26. Springer International Publishing, Cham, 2018. doi:10.1007/978-3-319-42913-7_28-1.