One stencil#

:cite:`goswamiEnhancedClimbingImage2026,goswamiTruncatedChain2026,eon2901,goswamiEfficientExploration2025`

The dimer translation and the climbing image are one Householder reflection of the true force. Goswami, Gunde, and Jónsson, Front. Chem. (2026), https://doi.org/10.3389/fchem.2026.1807063, Eqs. 3, 8, and 9, and Sec. 2.3.1 and Sec. 4. The dimer is that reflection on a three-image chain with free ends. Goswami (2026), arXiv:2603.10992, https://doi.org/10.48550/arXiv.2603.10992, Eqs. 2.14-2.16.

A preset chooses the sides, the tangent, the coupling, the climb, and the mesh. Stencil::point runs a minimiser, the dimer, Lanczos, ART, and eigen following. Dimer and Lanczos construct MinModeSession, so the recorded position and energy hashes stay the same. Stencil::band names the band presets and returns the feat/band-methods-zoom seam. Zoom, the recomputed energy-weighted spring, and the band keys are that branch.

Preset

Tangent

Climb

Mode

minimiser

none

none

none

dimer

axis

reflect if the curvature is negative, otherwise ascend

rotation

Lanczos

Ritz

as the dimer

Lanczos

ART

seed, then Ritz

ascend until the curvature drops, then reflect

Lanczos

eigen following

lowest eigenvector

as the dimer

dense central-difference exact_eigh

rgmin started as Rohit Goswami’s xtsci-optimize (2023-2024), which composed minimisers from small strategy objects. The stencil core extends that to saddle and band methods. eOn v2.9.0.1 is https://doi.org/10.5281/zenodo.18529495. Goswami (2025), arXiv:2510.21368, https://doi.org/10.48550/arXiv.2510.21368.

Chain::evaluate owns one block per image. The block size is fixed at one image and does not depend on the thread count. Each block is written back by index after the surface call. Remesh, insert, and window do not call the surface. Image ids survive an insert.

The C surface is rgsaddle_stencil_* with an opaque config, typed key setters, and a thread-local rgsaddle_last_error. include/rgsaddle/stencil.hpp is the RAII wrapper. Python rgsaddle.Stencil.point and rgsaddle.ase.Point call that wrapper. Point.run uses an ASE Optimizer subclass. The extension is nanobind with Py_MOD_GIL_NOT_USED on a free-threaded build.

Method papers, after the citations above: Henkelman and Jónsson (1999), https://doi.org/10.1063/1.480097; Henkelman, Uberuaga, and Jónsson (2000), https://doi.org/10.1063/1.1329672; Henkelman and Jónsson (2000), https://doi.org/10.1063/1.1323224; Jónsson, Mills, and Jacobsen (1998); Ásgeirsson et al. (2021), https://doi.org/10.1021/acs.jctc.1c00462; Kolsbjerg, Groves, and Hammer (2016), https://doi.org/10.1063/1.4961868; Malek and Mousseau (2000), https://doi.org/10.1103/PhysRevE.62.7723; Smidstrup et al. (2014), https://doi.org/10.1063/1.4878664; Schmerwitz, Ásgeirsson, and Jónsson (2024), https://doi.org/10.1021/acs.jctc.3c01111; Curtis, Powell, and Reid (1974), https://doi.org/10.1093/imamat/13.1.117.

A benchmark that changes iterates cites Goswami, AIP Adv. (2025), https://doi.org/10.1063/5.0283639, first. This branch does not change the recorded iterates.