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 |
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.