--- myst: html_meta: "description": "Detailed release notes for eOn v2.10.0, covering displacement documentation, ASV benchmarks, and Eigen copy elimination." "keywords": "eOn release notes, displacement scripts, ASV benchmarks, performance" --- # Release notes ## [v2.10.0] - 2026-02-15 This release improves documentation, developer infrastructure, and runtime performance. There are no breaking API changes. ### Documentation #### Displacement Strategies Guide The {doc}`../../user_guide/saddle_search` page now includes a conceptual explanation of how epicenter selection works during saddle searches, covering the weight-based probabilistic strategies (`displace_random_weight`, `displace_listed_atom_weight`, etc.), the `displace_radius` / `displace_magnitude` mechanism, and the `displace_all_listed` flag. #### Displacement Scripts Tutorial A new {doc}`../../tutorials/displacement_scripts` tutorial walks through two worked examples of targeted displacement: - **Vacancy diffusion in Cu** using OVITO's Polyhedral Template Matching (PTM) to identify non-bulk atoms near a vacancy (`ptmdisp.py`). - **Adsorbate on a catalyst surface** using ASE to select atoms by element or z-coordinate and expand the selection by a distance cutoff (`adsorbate_region.py`). The tutorial also covers the script interface contract (positional `.con` path argument, comma-separated indices on stdout, per-state caching), the static `displace_atom_list` alternative, and client-side `listed_atoms` displacement. #### Schema Descriptions The `[Saddle Search]` configuration fields `displace_atom_kmc_state_script`, `displace_all_listed`, `displace_atom_list`, and `client_displace_type` now have detailed descriptions that appear in the auto-generated documentation tables. ### GPR-Dimer - Exposed `gprd_linalg_backend` build option for selecting the linear algebra backend used by gpr_optim: `eigen` (default), `cusolver` (NVIDIA GPU), `kokkos` (portable CPU/GPU), or `stdpar` (C++17 parallel STL with TBB). - Updated pinned gpr_optim to latest commit with new backends, subproject build fix, and performance improvements. ### Performance - Eliminated unnecessary Eigen matrix copies in `Matter`, `Potential`, and `HelperFunctions` hot paths by using const references and move semantics. - Replaced per-typedef `Eigen::RowMajor` with a single `eOnStorageOrder` constant in `client/Eigen.h`, making the storage order explicit and configurable in one place. Also removed the dead `EIGEN2_SUPPORT` comment. ### Developer - Added ASV benchmark CI workflow with `asv-spyglass` for automated PR performance comparison. - Expanded ASV benchmark suite with point evaluation, LJ minimization, and NEB workloads. - Added macOS arm64 to the metatomic CI matrix using Homebrew gfortran. - Reduced build times by linking to xTB by default. - Build cleanup for Windows compatibility. - Refactored `MetatomicPotential` variant resolution to use upstream `metatomic_torch::pick_output`. ### Bug Fixes - Fixed Windows `STATUS_STACK_OVERFLOW` (`0xC00000FD`) crash in the EAM Al potential. The Fortran subroutine `gagafeDblexp` allocates ~3.6 MB of local arrays (`phi`/`phivirst` dimensioned at `MAXPRS=200000`), exceeding the 1 MB Windows default stack. The linker now requests a 16 MB stack on Windows. - Fixed silent client failure on Windows when stdout is redirected by the Python server, by switching spdlog from `stdout_color_sink_mt` (which uses `WriteConsole`) to the plain `stdout_sink_mt`. - Use Goswami & Jonsson 2025 for removing rotations through projections.