Step a NEB band#

BandSession::step assembles the tangent, spring and projection forces and advances one host iteration. The fast inertial relaxation engine (FIRE) and limited-memory Broyden-Fletcher-Goldfarb-Shanno (L-BFGS) methods preserve the endpoints. L-BFGS computes its direction from the assembled force; summed image energy is not a descent criterion for that force. It also arms eOn’s resets: a two-loop step that reaches the per-atom cap or faces away from the force drops the stored pairs and steps along the force, and an empty memory scales that step by 0.01.

Call reset when the surface changes. The session retains evaluated endpoints and the accepted band while the surface remains valid. A Cell supplies minimum-image differences for periodic configurations.

The projected force of every image with two or more atoms loses its mean Cartesian part, as in eOn when every atom is free. A host with fixed atoms sets BandConfig::remove_translation to false, or RGSADDLE_BAND_KEEP_TRANSLATION in the C band config flags, to keep the mean. An image with one atom keeps its force.

The climbing image is the highest interior image, as in Henkelman, Uberuaga and Jónsson (2000) and ASE’s NEB, and it climbs also when an endpoint lies higher. Two minima bound a peak of the path, so an interior maximum below an endpoint puts the saddle between that image and the endpoint, and the climb moves the image up to it. An endpoint that is not a minimum can draw the climbing image into itself; a host with such an endpoint should check the result, or use climbing: None. CiConfig decides when it arms. The default, CiConfig::after(0.5), arms once the band’s largest force component falls under 0.5 in the host’s force units (eOn’s ci_after in eV/A; climbing-image NEB is run on a roughly converged band, Henkelman, Uberuaga and Jonsson, J. Chem. Phys. 113, 9901 (2000), https://doi.org/10.1063/1.1329672). CiConfig::after_rel(f) arms under f times the first evaluation’s force (eOn ci_after_rel), and CiConfig::always() climbs from the first evaluation. From C, RGSADDLE_BAND_CI_AFTER (ABI minor 17) turns climbing on with ci_trigger_force and ci_trigger_factor as given; without it climbing needs a positive ci_trigger_factor.

An armed climbing image is refined by its lowest mode, the OCI-NEB of Goswami, Gunde and Jónsson, Front. Chem. 14, 1807063 (2026), https://doi.org/10.3389/fchem.2026.1807063. BandConfig::min_mode holds the MinModeRefine controls and is on by default; None keeps the plain CI-NEB. Once the same image has been highest for stable_steps (1) band step and its largest per-atom force is under trigger_factor times the largest per-atom force of the first evaluation (infinite by default, so at any force), the first refinement step estimates the lowest mode at that image by Lanczos seeded with the band tangent, keeping up to krylov_dim (20) Hessian actions. A positive curvature, or a mode with |v . tau| under alignment_tol (0.85), hands the image back unmoved and keeps the band optimizer’s history. Otherwise that image climbs alone while the other images stay. The climb is an order-1 P-RFO step (Baker, J. Comput. Chem. 7, 385 (1986)) on a dense TS-BFGS model (Bofill, Int. J. Quantum Chem. 94, 324 (2003)). The model is the pair-stretch Hessian of Lindh, Bernhardsson, Karlström and Malmqvist, Chem. Phys. Lett. 241, 423 (1995), over pairs closer than twice the nearest-neighbour distance r_nn, with the pair weight exp(-3 (r/r_nn - 1)) and the diagonal stabilisation of Packwood et al., J. Chem. Phys. 144, 164109 (2016), scaled by the smallest ratio of measured to model curvature over the positive Lanczos directions so it is nowhere stiffer than the surface along them, and then made to match every Lanczos action exactly. With remove_translation the model and the step live off the rigid translations, and off the rotations too when there is no cell. Each step maximizes along the model eigenvector with the largest overlap with the mode followed a step before, not along the lowest. The trust radius bounds the largest per-atom move by max_move; a ratio of actual to predicted energy change outside [1/4, 4] halves it, and a ratio inside (3/4, 4/3) from a step at the radius doubles it. Lanczos runs again, its block imposed and its mode followed, once the followed model curvature is above curvature_retained (0.3) of the curvature last measured or the followed mode turned under min_overlap (0.8), at most every refresh_interval (4) climb steps. The climb hands the image back when the curvature turns positive, measured by Lanczos again before it ends the climb, or after max_steps (1000), at the aligned point of lowest force it visited. With climb_alignment (off) it also ends once the followed mode’s overlap with the tangent falls under alignment_tol. The trigger re-arms by eqs. 13 to 15 of that paper (initial_threshold, success_threshold and backoff_threshold, shared with OcinebSession), and a refinement that did not lower the force waits also for retry_factor (0.5) times the force it started from, at least twice force_tol. The re-armed threshold belongs to the image that climbed; when the band’s climbing image changes index the threshold returns to initial_threshold. The band then reports Converged once the climbing image’s force is under force_tol; the other images keep their last band positions. Each refinement step reports the curvature in BandReport::curvature and counts its one-image evaluations in surface_rows. Every one-image evaluation goes through BandSurface::eval_image with the climbing image’s band index; a surface that keys per-image state on that index overrides it. AutoNEB’s windows keep the plain climb.

set_rtr(Some(RtrConfig::default())) selects the projected trust-region band method. Its model uses the complete displacement after equal-arc redistribution and the radius cap. The projected method is a heuristic for the nonconservative band force; the report does not certify an energy minimum. The min-mode refinement runs on this band as on the default stepper, and its climb steps take the place of RTR steps while it runs.

set_force_gate chooses the force norm. set_highs(true) enables rgmin’s feasible-step control when the library has the highs feature. The default FIRE and L-BFGS dispatch is unchanged by compiling that feature.

OcinebSession is the same band and the same refinement with the published hand-off controls. Goswami, Gunde, and Jónsson, Front. Chem. 14 (2026), https://doi.org/10.3389/fchem.2026.1807063. OcinebConfig::refine maps them onto MinModeRefine: trigger_factor (published value 0.31) and trigger_force to the trigger, angle_tol (at least 1/sqrt(2), published value 0.85) to the alignment, stability_count (the index must stay unchanged for more than this many steps, published value 5) to the stability latch, max_mmf_steps to the climb budget, and restore_unhelpful as it is. It turns climb_alignment on and the retry_factor off, so the climb ends when its mode leaves the tangent cone and re-arms by the published thresholds alone. OcinebConfig::minmode supplies the mode estimate (kind, finite difference, rotation and Krylov controls); the climb is the band’s P-RFO step, so its method, force_tol and max_move are not read. step does one band step, one alignment, or one climb step, and the report names that phase. The alignment step estimates the lowest mode at the climbing image without moving it, and the climb starts only when that curvature is negative and the overlap with the tangent meets angle_tol. The threshold starts at initial_threshold, at least twice the force tolerance; a climb that lowers the force re-arms at success_threshold, F_new (1/2 + 2/5 F_new/F_CI), and keeps the mode, and any other outcome at backoff_threshold, F0 * trigger_factor * (1/2 + 1/2 α) with α = 0 after a positive curvature. The band converges when the climbing image meets the force tolerance. The point surface answers the climbing image’s evaluations. The solid-state block is refused. This session’s band climbs with CiConfig::after_rel(0.5), which is the relative arming rule and not BandConfig::default.

BandConfig::quickmin selects the quick-min step. The velocity is projected onto the force when that projection is non-negative and replaced by zero otherwise, then the Euler update is v <- v + dt F and dx = dt v, with dt the session step (1 by default). The per-atom cap shortens dx and rescales the velocity by the fraction kept. The projection is one vector over the interior coordinates. FIRE version 2 stays the default. BandConfig::quickmin_options picks the variant: QuickMinOptions::rgmin() (default) grows and shrinks dt with FIRE’s factors and projects the whole band at once, ::eon() keeps eOn’s fixed dt, and ::per_atom() projects each atom on its own force. rgsaddle_band_set_quickmin_variant sets the same from C. BandConfig::time_step is the initial time step, 1 by default; the eOn variant keeps it, and converges on the Al and Pt bands at 0.1 or 0.25 but not at 0.5 or 1. rgsaddle_band_set_time_step sets it from C.

AutoNeb grows that band. The steps and the window are in howto/autoneb. The spring starts uniform and is rescaled inside the search. A weighted or Onsager-Machlup spring supplied by the host is refused until zoom-NEB recomputes it on insertion.

BandConfig::solid adds the generalized solid-state block. The tangent and the spring act on one long vector: the minimum-image atomic displacement through the average of the two cells, then the averaged right strain of the Jacobian-scaled cell difference. The cell part of the force is minus the cell volume times the Cauchy stress plus a hydrostatic pressure times the identity, divided by the Jacobian, with the upper triangle cleared. The Jacobian is the cube root of the mean endpoint volume per atom times the square root of the atom count, times weight, and it stays fixed for the run. Build it with SolidState::new(cells) and the with_pressure and with_weight setters. A surface that supplies the block implements BandSurface::eval_cells and returns the Cauchy stress, (1/V) dE/deps for the right strain h <- h (I + eps) at fixed fractional coordinates. From C, rgsaddle_band_create_solid builds the band, rgsaddle_band_step_solid steps it on an rgsaddle_solid_surface_fn whose request carries the cells in and the stresses out with the energies and gradients, and rgsaddle_band_cells and rgsaddle_band_solid_jacobian read it back. rgsaddle_band_step refuses a solid-state band. An equal-cell path with zero stress and zero pressure matches the atomic band. The doubly nudged term stays on the climbing image.