Release notes#

[v2.10.1] - 2026-02-18#

This is a bug-fix release. There are no API or configuration changes.

Bug Fixes#

Eigen storage-order regression#

The v2.10.0 commit 6e8461c3 replaced the EIGEN_DEFAULT_TO_ROW_MAJOR preprocessor macro with a constexpr constant and explicit row-major aliases for AtomMatrix and RotationMatrix. However, ~135 bare Eigen::MatrixXd uses across the codebase were not updated, causing them to revert to Eigen’s default column-major layout.

Row-major layout is required so that .data() yields [x0, y0, z0, x1, y1, z1, ...], which is what the Fortran potentials and VectorXd::Map round-trips expect. The column-major matrices stored [x0, x1, ..., y0, y1, ..., z0, z1, ...] instead, silently corrupting force projections and causing the NEB to diverge from the first step.

The fix removes using namespace Eigen; from client/Eigen.h (which would shadow the explicit row-major aliases with Eigen’s column-major defaults) and replaces it with selective using declarations for vector types that are unaffected by storage order (VectorXd, VectorXi, Vector3d). All bare Eigen::MatrixXd, Eigen::Matrix3d, and Eigen::Matrix4d uses are replaced with eOn’s row-major aliases.

See Type system for the full type-system documentation.

Python 3.10 compatibility#

client/get_version.py used datetime.UTC, an alias added in Python 3.11. Replaced with datetime.timezone.utc for compatibility with the conda-forge Python 3.10 builds.

Developer#

CI-NEB XTB regression test#

A new Catch2 test (CINEBXTBTest.cpp) runs a 10-image climbing-image NEB with GFN2-xTB on a 9-atom C2H4ON2 molecule. The test converges in ~64 NEB steps (under 2 seconds wall time) and will fail immediately if a storage-order regression reappears.