Changelog¶
3.0.0 - 2026-07-26¶
Added¶
Continuous ASV dashboard: results history on the
asv-resultsorphan branch, asv-tachyon UI undergh-pages/bench/, optional Netlify deploy for bench.eondocs.org. Windows CI: robust MSVC activation (VS 18 runners) and strip GNU link.exe from PATH for meson test. (#378)PHVA mobile/active sets for dense Hessian and matrix-free min-mode via
phva_atoms(defaultAll= all free atoms). Free/fixed stays the optimizer mask; Krylov dimension is3 * N_active. SharedresolveMobileAtomsdrivesHessianJob, Lanczos, and Davidson. pyeonclient:Lanczos/Davidson.compute(..., atoms=),resolve_mobile_atoms,free_atom_indices, andParameters.hessian_phva_atoms/lanczos_phva_atoms/davidson_phva_atoms. INI keys:[Hessian|Lanczos|Davidson] phva_atoms. (#379)Cap’n Proto
schema/eon_job_result.capnpdefines typedJobRequest/JobResult/ flatGeometryenvelopes for the in-process control plane (kill-file-IPC).eon_schema.jobsprovidesresults.datadapters for legacy paths. (#381)Vendored vesin updates to 0.6.0 with three local extensions carried as upstream candidates: a CPU implementation of the declared-but-missing
VesinBruteForcealgorithm (nearest-image MIC pair search), lazy thread-pool worker spawn (serial consumers stop payinghardware_concurrency()thread creations per process), and a fused pair visitation API (vesin_neighbors_visitplus the header-onlyvesin_visit.hpp).Every Fortran-backed potential draws its neighbours from vesin rather than from pot-local scaffolding: the EDIP and Lenosky cell/ghost machinery is gone, Tersoff trades its O(N^3) sweeps for per-atom lists, and SW’s silent
MAXNEIoverflow and FeHe’s 800-neighbour gather ceiling are hard errors instead of quiet truncation. Those kernels moved to rgpot in the same release (see below), so the vesin Fortran interface is vendored there rather than here; eOn’s vendored copy is the C++ translation unit only. (#389)Documentation systems tutorials (Morse Pt NEB, LJ minimization, Pt saddle) with built-in potentials and current
rgpycrumbs/plt-neb/plt-minconventions (1:1 reaction-valley landscapes, full structure strips, one min landscape per endpoint).Optimized hyperplanar TST (OH-TST) job (Johannesson and Jonsson, J. Chem. Phys. 115, 9644 (2001)): a
job = oh_tstmode that progresses a hyperplanar dividing surface by reversible work with thermostatted, plane-constrained sampling, and reports the free-energy barrier and crossing rate. Supports Andersen or GLE colored-noise (Ceriotti-Bussi-Parrinello) thermostats and symmetry-restricted sampling of equivalent product minima. Configured under[OH_TST].
Developer¶
Golden masters for CPython server atoms helpers vs pre-#368 scalar code; eon.fileio load/save/round-trip via live readcon fixtures; document chemfiles as optional and unused on server .con path. (#370)
Windows metatomic CI follows the metatomic/metatensor torch workflow: windows-2022, setup-python, pip CPU torch (PIP_EXTRA_INDEX_URL), and MSVC, with pixi for C++ deps and flang. In-tree Fortran pots and CuH2 stay enabled via feedstock-style flang_rt LIBPATH and MSVC AR=lib. Catch2 runs on the basic multi-OS matrix including windows-2022; ConFileIO tests close temp streams before remove (Windows file locks); inih example tests strip CR for MSVC text-mode stdout. (#377)
The Windows CI step that used to load
eon_sw.dlland assert it exports a baresw_now auditslibrgpotinstead: the kernels ship inside it with hidden linkage, so the check is that no legacy Fortran name reaches the export table, which is the PE counterpart of the LinuxFortranSymbolAudit. It accepts a--default-library=staticbuild, where the kernels land in an archive that has no export table at all. (#390)
Changed¶
Client public headers live under
include/eon/(numpy/fmt layout). Sources stay inclient/. Use#include "eon/Potential.h"(andeon/fpe_handler.h,eon/potentials/...) with-I$prefix/include. Relative../includes are gone; headers install viainstall_subdir. (#379)Classical C++ pair pots (LJ, Morse, LJCluster, QSC) use the shared
eonc::VesinNeighborswrapper for neighbor lists instead of pot-local Verlet / O(N^2) loops. Vesin is always linked intoeoncbaseso Metatomic and classical pots share one NL backend. Client wall time continues to be tracked by the existing ASV suite (TimePointMorsePt,TimeMinimizationLJCluster, Morse saddle/NEB); seebenchmarks/README.md. (#386)The Fortran-backed potentials (Stillinger-Weber, EDIP, Lenosky, Tersoff, EAM aluminium, FeHe, CuH2, and TIP4P-H) are Fortran 2018 kernels inside
librgpotand evaluate throughRgpotAdapterlike the classical pots. Each kernel was rewritten rather than wrapped: modules withimplicit none, kinds fromiso_fortran_envchecked against the C types at compile time, derived-type parameters in place of COMMON blocks,intenton every argument,purekernels, structured control flow, and status returns instead ofstop. Neighbours come from vesin, and the pair sums are restated as gathers so the atom loops run underdo concurrent.eOn no longer builds, installs, or dlopens Fortran: the
eon_*.soplugin modules, their Windows.defexport files, and the flang runtime handling are gone.FortranPotLoaderbecomesPluginLoader, which still finds engine plugins (the rgpot metatomic and xtb backends) acrossEON_POTENTIALS_PATHand[Potential] potentials_path.Configuration is unchanged: the same
potentialnames select the same physics, pinned by the existing reference energies inSiPotTest,EAMAlTest,FeHeTest, andcuh2Test. (#390)[Hessian] phva_atomsreplacesatom_listfor the PHVA mobile set (default stillAll). The C++ client still accepts the legacyatom_listkey whenphva_atomsis absent. Lanczos and Davidson gain the samephva_atomskey in INI, schema, andconfig.yaml.
Fixed¶
eOn no longer requires a Fortran compiler. It compiles no Fortran since the kernels moved into
librgpot, butclient/meson.buildstill asked for the language withrequired: truewheneverwith_fortranorwith_cuh2was set – both default on – so every consumer had to supply an unused toolchain. That bit hardest on builds against an installed rgpot, which need none at all. The language is detected rather than required now; a wrap build still finds it for rgpot’s kernels, and the Windows flang runtime discovery is gated on actually having one.with_fortranandwith_cuh2keep their meaning as potential selectors: they gate theRgpotAdapterarms, not any compilation.Local communicator writes client stderr to
stderr.dat(no undrainedPIPEdeadlock). The FPE continue handler masks the fault class in the restored MXCSR so a single divide-by-zero cannot re-storm. The LAMMPS pot worker demotes floating-point traps after fork andforceLocaluseseat_fpe(same external-pot contract as ASE/Metatomic); SafeMath guards remain on CG/dimer/min-mode bare divisions. (#379)Server-side process search and superbasin amsel gating receive a
ConfigClass(no bareconfig/ missingself.config). Superbasin recycling passes config intoRecycling. Restoredatoms.identicalfor indistinguishable-atom matching.LocalInProcessunpacksMatter.relaxas(Matter, converged). LAMMPSforceLocalrestores FE traps aftereat_fpe. Tip4p implements the fullPotential::forcesignature (variance parameter). (#380)ClientEON and pyeonclient
append_results_timingwrite theresults.dattiming footer as<value> <key>(same contract as job writers andparse_results), sotime_seconds/user_time/system_timeparse as floats under those keys. (#382)AMS_IO writes the XC functional name into the run script: the
fprintf("xc %s\\n")call was missing itsxcargument (undefined behavior). (#384)ASE potential import and force failures throw
std::runtime_errorinstead ofexit(1), so pyeonclient / in-process callers can recover instead of killing the whole process. (#385)LAMMPS worker path survives a bad geometry: non-finite or failed evaluations reject the structure without ending the client, with bounded respawns, SIGPIPE ignored on the pipe, serialised concurrent exchanges, and process search reporting of how far a rejected endpoint landed from the reactant. (#387)
Classical pair pots (LJ, Morse, LJCluster, QSC) use
eonc::PairListCache: a process-global pool of Verlet-skin cached pair lists. The candidate list builds atcutoff + skinonce; force evaluations on geometries whose atoms have moved less thanskin/2since the build re-use the cached pairs and derive exact vectors from current positions, with the true-cutoff filter keeping results identical to a fresh build. On a cache miss in the MIC regime the pair kernel inlines into the build’s single brute-force scan, so one-shot evaluations (point jobs) pay one pair sweep like the pre-list code did. Proximity-matched pool slots keep NEB’s per-image force path both race-free and cache-warm, whether images are evaluated serially or in parallel — the pool survives NEB’s per-iteration worker threads. Fixes the ASV regressions from the #386 vesin port (point / min / saddle / NEB wall times); minimization, saddle-search, and NEB fixtures run faster than the pre-#386 baseline. (#389)A build that resolves rgpot through the subproject wrap now takes vesin from rgpot instead of compiling eOn’s vendored copy beside it. Both trees carry the same upstream release, but rgpot’s carries local patches its Fortran interface binds to, so linking both left those objects calling a symbol eOn’s copy did not define. The vendored translation unit still serves builds against an installed rgpot.
pyeonclient wheels need no shared object beside
librgpot: the Cap’n Proto schema moved inside it, so importingpyeonclient._coreno longer depends on finding a separatelibptlrpc.soat run time. (#390)Process registration no longer freezes the process-id counter when the
processtablecontains duplicate ids. New process ids are content-addressed with xxHash (allocate_process_id/ xxh64 over the saddle payload and barrier), notlen(procs)ormax(id)+1, so procdata files are not overwritten. Duplicate appends raise.
2.17.10 - 2026-07-20¶
Fixed¶
Optimizer file logs (
_lbfgs.logetc.) use a durable temp directory so fixture workdir cleanup no longer races Quill file sinks.Packaging: Catch2
--allow-running-no-testsfor the optional rgpot embed suite so all-SKIP without nwchemc/cpmdc is a clean success.
2.17.9 - 2026-07-20¶
Fixed¶
EDIP OpenMP: zero shared energy/force accumulators under
!$omp singlebefore partial reduction (fixes wrong PointJob energies with multi-thread OMP).Basin-hopping force-call reference updated for default LBFGS auto_scale path (1692); energy and acceptance assertions unchanged.
2.17.8 - 2026-07-20¶
Fixed¶
Evaluate EDIP serially under OpenMP (Fortran energy reduction race under OMP_NUM_THREADS>1 gave wrong PointJob energies with plausible forces).
Basin-hopping integration test pins LBFGS auto_scale off so force-call budget matches the SVN reference path.
2.17.7 - 2026-07-20¶
Fixed¶
Un-nest SW CG minimization TEST_CASE in SiPotTest (was inside LBFGS case after packaging SKIP refactor, breaking with_tests packaging builds).
2.17.6 - 2026-07-20¶
Fixed¶
Keep JobIntegrationFixture::runJob a class method after SKIP macro refactor (stray brace broke TEST_CASE_METHOD inheritance under packaging builds).
2.17.5 - 2026-07-20¶
Fixed¶
Catch2 SKIP only via macros in job integration tests (helpers cannot call SKIP).
2.17.4 - 2026-07-20¶
Fixed¶
Fix Catch2 SKIP usage in unit-test helpers (macros / fixture require path) so packaging builds compile with
-Dwith_tests=true.
2.17.3 - 2026-07-20¶
Fixed¶
Pin metatomic builds to vesin>=0.6 and rgpot>=2.5.2 so RGPOT
libmetatomic_engineand fat Metatomic share a matching VesinOptions ABI (skin/n_threads). Bump the rgpot wrap to the 2.5.2 fix commit.Unit tests SKIP when packaging fixtures or optional engines are missing (
EON_TEST_SYSTEMS_DIR/EON_POTENTIALS_PATH/ nwchemc·cpmdc), someson testsucceeds for installable client builds without local test data.
2.17.2 - 2026-07-17¶
Added¶
pyeonclient 0.3.3: in-memory
path_frames/to_conframesfor NEB (same stamps as writePathCon),Matter.relax(retain_frames=…)movie frames, andMinModeSaddleSearch.run_retain_framesclimb frames. (#pyeonclient-path-frames)Dimer supports
rotation_backend = classical|lanczos|davidson|lor(Leng et al. JCP 2013 LOR for softest-mode with force translation; Lanczos/Davidson FD min-mode; classical constrained rotation). Climb remains on the dimer path.Optional Superbasin gate via amsel.discover_decide_status ([amsel] / amsel_discover_decide) before MCAMC; rejected_no_metastable_basin falls back to AKMC.
Fixed¶
HessianJob FD eigen solve: ColMajor copy for SelfAdjointEigenSolver (avoids RowMajor segfaults on partial VTST blocks), finite-force/index guards, optional
[Hessian] atom_listintersected with free atoms, and a stable mobile VectorXi copy so moving-atom Hessians match PHVA-class active sets. (#357)Release CI installs quill/capnp so
eon-akmcsdist and pyeonclient wheels configure cleanly on GitHub runners. (#418)Republish pyeonclient as 0.3.4 with the full wheel matrix (abi3 + freethreading) after incomplete 0.3.3 tag CI.
2.17.1 - 2026-07-17¶
Fixed¶
Restore
with_pyeonclientandinstall_eon_servermeson options dropped frommeson_options.txtin the v2.17.0 merge (configure failed withOption with_pyeonclient does not exist).RGPotEngine accepts rgpot >= 2.5
operator()return typestd::tuple<double, AtomMatrix, double>(energy, forces, variance).
2.17.0 - 2026-07-17¶
Added¶
Distribution packaging: prefer installed
rgpotvia pkg-config (wrap pinv2.5.0) and installednlohmann_json(module with wrap fallback, same pattern as readcon). RGPOTbackend=metatomic/backend=xtbdlopenlibmetatomic_engine.so/libxtb_engine.soso packaging keeps-Dwith_xtb=false(native XTBPot deprecation warning) and avoids fat metatomic links into eOn.SafeMath accepts Eigen 5
EIGEN_CORE_MODULE_Has well as Eigen < 5EIGEN_CORE_H.Add
eon_schema.configINI helpers (write_ini,hydrate_ini,unknown_ini_keys,write_models_ini) so tooling can author validatedconfig.inifrom L0/L1 without importing eon-akmc. (#eon-schema-ini)Parameter field graph for Main, Potential, Optimizer, Structure Comparison, and Process Search is authored in
schema/eon_params.capnp(Cap’n Proto L0 SSoT) with INI/JSON adapters; parity tests gateconfig.yaml/eon.schemaagainst the catalog. (#params-ssot)Public step composition for Matter-first NEB/min:
write_neb_results,pot_registry_total_force_callsat package root;NEB.find_extrema; GIL release onforces_free/max_force. NebSpec covers EW/CI/OCI-MMF. (#pyeonclient-step-compose)Add packages/eon-schema (PyPI eon-schema): vendored Cap’n Proto SSoT copy, optional pydantic API models; full-tree/conda-forge eon path unchanged. (#eon-schema-0.1)
Add pyeonclient nanobind module (Matter/Parameters/Potential); stable ABI abi3 on CPython 3.12+, free-threaded when Py_GIL_DISABLED; no pybind11. (#372)
pyeonclient Matter end-to-end: LocalInProcess communicator (comm_type local_lib/inprocess); NbGuard without pybind11; ASE embed polarity documented. (#373)
Expand pyeonclient: full enums, Job/make_job/run_job_in_directory, Potential.get_ef, ASE to_ase/from_ase and Structure helpers. (#374)
Standalone PyPI package pyeonclient (pyproject-pyeonclient.toml): abi3 + cp313t + cp314t wheels via pyeonclient-wheels.yml. (#375)
RGPOT backend
metatomicloadslibmetatomic_engine.so(thin host path). Nativepotential = Metatomicis unchanged for conda-forge packaging. (#377)Document fat vs RGPOT-dlopen vs ASE metatomic backends; benchmark figure is generated from committed JSON at
sphinx-buildtime (not checked in).Add
pixienvironmentmta-benchandmta-backend-benchtask to reproducibly build fat/ASE pyeonclient, refresh the metatomic backend compare JSON, and regenerate the docs figure.
Developer¶
Changed¶
Move full job-config pydantic models into
eon-schema(eon_schema.config).eon.schemaandpyeonclient.modelsre-export the shared package so both eon-akmc and pyeonclient share one schema surface. (#eon-schema-l1)Structure is readcon-backed (ConFrame bridge); geometry PBC/NL via vesin; process-atom selection uses vesin shells. Retires aselite-era atoms container as storage source of truth. (#371)
Fixed¶
Release the GIL around Matter energy/force accessors and NEB construction,
update_forces, and per-image energy reads so metatomic/torch autograd can run from C++ without deadlocking. Optionaltorch/cuda.handtorch/mps.hincludes (__has_include) so CPU-only pip torch builds compile without CUDA/MPS headers. (#gil-torch-autograd)get_process_atoms returns plain Python ints so recycling metadata repr/eval round-trips (no np.int64). (#369)
Standalone pyeonclient wheels omit eon server package and eonclient binary (install_eon_server=false). (#376)
2.16.0 - 2026-07-03¶
Added¶
Matter exposes
PbcConvention(Legacy vs MinimumImage) for position wrapping, selectable without merging the historicalv3c_pbcsbranch (issue #176). (#176)ASE NWChem calculator takes
mpi_launcher(mpirundefault orsrun) for Slurm-friendly execution (issue #193). (#193)Metatomic accepts explicit
energy_output/energy_uncertainty_outputkeys when models use non-default output names (issue #215). (#215)Metatomic can apply a random SO(3) rotation per evaluation with
random_rotation(issue #287), rotating forces back to the lab frame. (#287)Metatomic can average energy and forces over
n_symmetry_rotationsrandom rotations for approximate O(3) symmetrization (issue #292). (#292)Metatomic supports non-conservative forces via
non_conservativeandvariant_force/force_output(issue #296), matching metatomic-ase. (#296)In-process RgpotPot for NWChem/CPMD via rgpot (optional build); user guide and examples for BLYP/DFT XC blocks.
Metatomic exposes
deterministicanddeterministic_strictknobs for reproducible PyTorch evaluation (JIT profiling off, deterministic algorithms).Minimum-mode finding supports
min_mode_method = davidson: Ritz subspace with FD Hessian-vector products and residual correction (alternative to dimer rotation minimization and Lanczos).The
rgpotpotential is selectable from the Python configuration layer:eon/config.yamlgains an[RgpotPot]section andeon.schemaa matchingRgpotPotmodel, mirroring the C++ INI keys (backend, basis, theory, scf_type, functional, cutoff_ry, charge, multiplicity, engine paths, title, memory_mb, scratch_dir, input_block).
Changed¶
Matter::getForcesFree/getForcesFreeVare const, andsetPositionsFreeapplies PBC wrapping likesetPositionsso free-atom optimizers stay consistent for TIP4P/SPCE and other PBC pots (issue #171). (#171)Metatomic potential requests per-atom outputs via
sample_kind == "atom"instead of the removedget_per_atom/set_per_atomAPI. (#362)Build against metatomic-torch >=0.1.15 and metatensor-torch >=0.10, including the renamed pip layout (
metatensor_torch/) andsample_kindon ModelOutput.Morse pair force hot path inlines the potential, uses inv-r scaling, and accumulates energy in a register (cachegrind: ~60% Ir in Morse::force on NEB Morse workloads).
ConFileIOtargets readcon-core 0.13 with a nanobind-readyIoStatusenum (replacingboolreturns), bulk/zero-copy builder maps (positions_data/set_*_from_flat/set_atom_velocity), andwriteNebPathusingConFrameBuilder::clone()so NEB bands write in one pass without re-reading the movie file per image. Matter exposes atom-index and CON header accessors for bindings.
Fixed¶
Min-mode saddle search no longer reports success (
STATUS_GOOD) when the climb objective is still unconverged (issue #20). (#20)Saddle and process search synthesize a missing
displacement.confrompos.conplussaddle_search.displace_magnitudetimes a unitdirection.datmode (issue #79). (#79)Molecular QM potentials (NWChem socket, ASE-ORCA, ASE-NWChem) auto-disable PBC on
Matterattach and hard-fail if PBC is re-enabled, preventing wraps from tearing non-centered molecules (issue #188). (#188)MCAMC
energy_levelsuperbasin scheme tracks a true run-wide minimum energy for increment scaling and no longer passes a generator intomin()(issue #212). (#212)NEB with
initializer = fileandinitial_path_inloads endpoints from the first and last path frames and no longer requires (or crashes on) separatereactant.con/product.con(issue #278). (#278).con outputs are readable by classic con parsers again: “Forces of Component” sections are opt-in via
[Main] write_con_forces(default off) instead of always written. ASE’s eon reader rejects frames carrying force sections, which broke every ASE-based consumer of eOn-written con files (including the atomistic-cookbook eon-pet-neb example). Enable the knob to keep force+energy co-loading for warm restarts; reading force-bearing frames works regardless.RgpotPot engine-path environment overrides are backend-scoped:
NWCHEMC_LIBRARY/RGPOT_NWCHEMC_ENGINEapply only to the NWChem backend andCPMDC_LIBRARY/RGPOT_CPMDC_ENGINEonly to the CPMD backend, so setting both no longer sends the NWChem engine library into a CPMD configure.The
examples/rgpot_cpmd_blypexample and the rgpot-vs-SocketNWChem comparison scripts now use the shipped in-process[RgpotPot]configuration (backend / functional / cutoff_ry / engine_library) instead of the abandoned potserv host/port keys, which eonclient never read.
2.15.0 - 2026-06-24¶
Added¶
Developer¶
Documented and automated the full maintainer release path (cog/towncrier lockstep assert, GitHub tarball release, PyPI, conda-forge/eon-feedstock checklist, incomplete-release recovery). (#343)
Fixed¶
Windows/conda-forge builds enable in-tree Fortran including CuH2 (m2w64 gfortran + MSVC C++, 16 MiB stack, xtb MinGW import lib) per feedstock#15. (#15)
NEB isolates per-image LAMMPS instances on private MPI communicators so parallel image evaluation does not corrupt neighbor state. (#340)
Process search restores fixed-atom rows after loading
displacement.con, avoiding drift of constrained atoms. (#341)
2.14.0 - 2026-04-24¶
Added¶
Structured per-iteration metadata is now embedded directly in minimization, saddle-search, and NEB movie
.confiles viareadcon-core. The legacy minimization and saddle-search sidecar tables remain available temporarily behindwrite_deprecated_outs = true. (#trajectory-output)Added the
filinoption under[ARTn]to expose pARTn’s input-file name. Empty (the default) leaves pARTn with its post-artn_createsentinel so no file is read; setting it to a path wires that file into pARTn setup and aborts early with a clear error if it is missing. (#334)
Fixed¶
Fixed a regression in threaded force-evaluation paths by keeping legacy Fortran-backed potentials out of shared-instance parallel execution. (#332)
2.13.0 - 2026-04-18¶
Removed¶
Removed 9 dead legacy pointer+size math functions from HelperFunctions (
dot,length,add,subtract,multiplyScalar,divideScalar,copyRightIntoLeft,normalize,makeProjection), all superseded by Eigen. (#dead-code)Removed dead code: INIFile.cpp/h (superseded by inih), legacy CMakeLists.txt (36 files), Makefile/buildRules.mk, old unittest framework (unittests/). Total: ~2600 lines of dead code removed. (#dead-code-removal)
Removed dead
TADJob::saddleSearch()function and associateddimerSearchmember (dead since 2013). (#dead-tad)
Added¶
Release builds now use
-O3 -flto=auto. Optionalnative_archandfast_mathmeson options for-march=nativeand-ffast-math. (#compiler-flags)Added ARTn (Activation-Relaxation Technique nouveau) saddle search method via the pARTn Fortran library, as a complementary explorer for pushing away from minima. Supports two modes:
method = artn(standalone, pARTn drives push + internal eigenmode search + relaxation) andmin_mode_method = artn(drop-in, eOn’s displacement seeds the mode). Configurable via[ARTn]section withpush_step_size,force_threshold,max_iterations,ninit,nperp_limitation,lanczos_min_size,nsmooth, andnnewchanceparameters. Requires-Dwith_artn=trueat build time. For automated saddle point refinement in production workflows, prefer OCINEB (ci_mmf = true). (#feat-artn-integration)Added IRA (Iterative Rotations and Assignments) structure comparison via the libira Fortran library. Provides
IRACompare::match()(CShDA + SVD alignment),matchPBC()(periodic boundary conditions), andfindSymmetry()(SOFI point group detection). Requires-Dwith_ira=trueat build time. (#feat-ira-integration)Added Highway SIMD as optional subproject (cmake wrap). When available,
-DWITH_HIGHWAYis set so future potential kernels can opt in. Hand-written SIMD kernels for Morse/LJ/EAM are staged for a follow-up release (see the separatehighway-simd-potentialsdeveloper note); today the main benefit of enabling Highway is compile-time availability of the subproject for those downstream kernels. (#highway-simd)Highway SIMD subproject builds and is detected at configure time. SIMD kernels for Morse/LJ/EAM force loops are planned but not yet implemented (core algorithm files already benefit from Eigen’s auto-vectorization). (#highway-simd-potentials)
IDPP (Image Dependent Pair Potential) path initialization for NEB. (#neb-idpp)
NEB decomposed into modular strategy-pattern components: tangent, projection, spring force, OCINEB controller, spline extrema, initial paths, and objective function. (#neb-modularize)
OCINEB (Off-Path Climbing Image NEB): recommended hybrid CI-NEB + Min-Mode Following with Hessian eigenmode alignment for automated saddle point refinement (
ci_mmf = true). See Goswami, Gunde, Jónsson, Enhanced Climbing Image Nudged Elastic Band Method with Hessian Eigenmode Alignment, 2026, arXiv:2601.12630. (#neb-ocineb)Onsager-Machlup action-based NEB for minimum action paths (
onsager_machlup = true). (#neb-om)Parallel image force evaluation for NEB (requires TBB,
-Dwith_parallel_neb=true). (#neb-parallel)Parallel improved dimer gradient evaluation via
std::thread. The two dimer replicas evaluate forces concurrently when the potential is thread-safe.std::threadrather thanstd::jthreadfor Apple Clang libc++ compatibility. (#parallel-dimer-stdthread)Parallel NEB force evaluation via
std::thread. Each image evaluates its potential concurrently when the potential is thread-safe. Achieves 2.5x speedup over SVN baseline on 5-image NEB with Morse potential. No external dependencies (replaces TBB-basedstd::execution::par). Apple Clang’s libc++ does not yet shipstd::jthread, so the implementation usesstd::threadwith explicit exception-safe joins. (#parallel-neb-stdthread)ReplicaExchangeJob now runs replica MD steps in parallel via
std::threadwhenparallel=trueand the potential supports it. Each replica gets its own potential instance whenneedsPerImageInstance()is true (e.g. ML potentials). (#parallel-replica-exchange)JSON serialization for Parameters via
nlohmann/json <https://github.com/nlohmann/json>_. Newload_json()andto_json()methods enable programmatic configuration for library usage and RPC transport. (#params-json)Added readcon-core v0.7.1 as a Meson subproject for .con/.convel file I/O. The Rust FFI library replaces the hand-written C FILE*-based parser with an mmap-based reader and a type-safe ConFrameBuilder/ConFrameWriter for output. Requires Rust >= 1.88 and cbindgen >= 0.29 at build time.
Developer¶
Planned: approval tests (snapshot-based regression) and fuzz testing for parser robustness (INI, .con format, command line arguments). (#approval-fuzz-testing)
Competitive NEB benchmarking framework (private repo HaoZeke/eon_benchmarks). Compare eOn against ASE, ORCA, OPTIM, ARTn, NWChem, Sella on Baker test set and Pt surfaces. Snakemake workflow with reproducible environments. (#competitive-benchmarks)
Added developer design docs for Parameters decomposition and NEB modularization. Updated testing inventory, user guides (minimization, dynamics, NEB, saddle search), and added algorithm selection guide with rgpycrumbs examples and atomistic-cookbook links. (#docs-design)
Replace remaining new[]/delete[] in EMT/Asap (NeighborList.cpp, EMT.cpp) with std::vector. 5 allocations in Asap library internals. (#emt-asap-raii)
Added Fortran column-major layout conversion helpers in
Eigen.h:AtomMatrixFtype alias, zero-copyto/from_fortran_layout(), andmap_from_flat_colmajor/rowmajor()for interfacing with Fortran libraries. (#feat-eigen-fortran-helpers)Modernize Fortran source files (SW, Tersoff, EDIP, Lenosky, Aluminum, CuH2). Convert to free-form F90, add intent declarations, replace common blocks with modules. Requires SVN regression verification. (#fortran-modernization)
Highway SIMD kernels for Morse, LJ, and EAM pair-potential force loops. Subproject builds and -DWITH_HIGHWAY is set; needs actual vectorized inner loop implementations using HWY_DYNAMIC_DISPATCH. (#highway-potential-kernels)
SafeHyperJob integration test with SVN reference data. Needs Morse Pt system with element-specific BondBoost parameters (SIGFPE on generic LJ). (#safe-hyper-test)
Add SVN-verified integration tests for remaining unused reference data: neb_morse_pt, global_optimization_lj, minimization_eam_fire, minimization_sw_cg, min_lj_sd, replica_exchange_lj, bh50. (#svn-reference-coverage)
Migrated test suite from GoogleTest to Catch2. Added 5 new tests (DimerTest, SaddleSearchTest, OptimizerTest, ConFileIOTest, HessianTest) and revived 4 (MatterTest, PotTest, ImpDimerTest, StringHelpersTest). Total: 16 tests. (#tests-new)
Removed abandoned v3c TOML migration artifacts from 11 documentation files. (#docs-v3c-cleanup)
Changed¶
Eigenmode methods (Dimer, ImprovedDimer, Lanczos, GPRDimer) now use
std::variantinstead of an abstract base class, eliminating virtual dispatch overhead. (#eigenmode-variant)LAMMPS potential now uses runtime dynamic loading (
dlopen/LoadLibrary) instead of compile-time linking. A single eOn binary can use LAMMPS potentials ifliblammpsis installed, without requiring LAMMPS at build time. Install viaconda install -c conda-forge lammps. (#lammps-runtime)Extracted
RandomNumbers,GeometryAnalysis, andConFileIOmodules from Matter and HelperFunctions. Matter.cpp reduced from 1253 to ~500 lines, HelperFunctions.cpp from 838 to ~300 lines. (#module-extract)Removed all
using namespace std;from the entire client codebase (60+ files). All standard library symbols now explicitly qualified withstd::, preventing ADL-related bugs and improving code clarity. (#namespace-cleanup)INI parsing extracted from
Parameters.cppintoParametersINI.cppwith avalidate_and_link()function for cross-group dependency resolution. (#params-ini-extract)Replaced vendored 724-line
CIniFileINI parser withinih <https://github.com/benhoyt/inih>_ (r62) via meson wrap. (#params-inih)Narrowed parameter passing: Matter, Potential base, Optimizer hierarchy (
OptimizerConfig), and Dynamics (DynamicsConfig) no longer require the fullParametersobject. NEB no longer mutates its Parameters copy. (#params-narrow)All 33 Parameters option-group structs now use C++20 NSDMI (Non-Static Data Member Initialization) for defaults. The constructor shrunk from 481 to 3 lines. (#params-nsdmi)
Fixed pass-by-value of
VectorXdinObjectiveFunction,LBFGS, and optimizer interfaces. Dynamic Eigen types now passed byconstreference per Eigen documentation, eliminating unnecessary 40-160KB copies per optimizer step. (#perf-eigen-passbyref)Matter::getForces()now returnsconst AtomMatrix&to a cached masked-force result instead of copying and zeroing fixed atoms on every call. (#perf-masked-forces)NEB tangent and projection strategies cached as class members (built once in constructor). Spring strategy still rebuilt per iteration as it depends on per-step energy data. SIMD-optimized
Eigen::Map<VectorXd>.dot()replaces(a.array() * b.array()).sum()in all NEB force projections. (#perf-neb-strategy-cache)Vectorized PBC wrapping: replaced scalar
fmodloop withfloor-based Eigen array operation. Single x86vroundsdinstruction instead of expensivefmodlibrary call per element. (#perf-pbc-vectorize)Eliminated
std::pow()with integer exponents from all hot-path force loops: LJ (pow(x,6) -> xxx), EAM (pow(r,5/6), simplified Morse pair from 3 exp to 1), IDPP (pow(r,4/5)), NEB spline (Horner’s method), Water_Pt (11 pow calls replaced with explicit multiplies). (#perf-pow-elimination)Extracted
ReplicaDynamicsJobbase class from TADJob and SafeHyperJob, deduplicating ~190 lines of shared code (checkState, refine, dephase, saveData). (#replica-base)All job classes now use
std::shared_ptr<Matter>and RAII (ForceCallTimer,std::ofstream). No more rawnew/deletefor Matter objects or uncheckedfopencalls. (#smart-ptrs)Converted commented-out SPDLOG_LOGGER_DEBUG calls to active
QUILL_LOG_TRACE_L1(compiled out in release builds). (#spdlog-quill)Replaced C-style headers (
math.h,string.h,time.h, etc.) with C++ equivalents (cmath,cstring,ctime) in 10 client files. Addedusing enum JobTypein Job.cpp. (#cpp20-headers)Python
eon/fileio.pynow uses thereadconpackage (PyPI) for loading and saving .con files, replacing ~60 lines of hand-written parsing. Theloadcon,loadcons, andsaveconfunctions delegate toreadcon.read_con()/readcon.write_con().Replaced all FILE*-based con/convel I/O in the C++ client with readcon-core. Reading uses
readcon::read_first_frame()(mmap). Writing usesConFrameBuilder+ConFrameWriterwith 17-digit precision for positions. All FILE* overloads removed; callers now pass filenames directly.
Fixed¶
Fixed bare
abs()calls ondoublevalues in BondBoost, LBFGS, and Hessian that resolved to the C integerabs(int)overload on non-MSVC compilers, silently truncating floating-point values. (#bugfix-bare-abs)cellInversenow recomputed inMatter::setCell()(was stale after cell changes). (#bugfix-cellinverse)Fixed
confine_positiveEigen indexing (flat3*i+0replaced with proper(i,k)row-column access) and replaced rawnew[]/delete[]withstd::vector. (#bugfix-confine-positive)Fixed
convergenceForce()loop variable mutation that could skip images. (#bugfix-convergenceforce)Fixed LBFGS aborting on degenerate curvature updates. The
abs()->std::abs()fix exposed that thes0.y0 < LBFGS_EPScheck was previously disabled by integer truncation. Now resets L-BFGS memory (standard restart strategy) instead of aborting the optimization. (#bugfix-lbfgs-curvature)Fixed uninitialized
cuttOffUmember in LJ potential (caused garbage energy withMALLOC_PERTURB_). (#bugfix-lj-cutoffu)Fixed
maxAtomMotionVout-of-bounds read when vector size < 3 elements (e.g. 2D optimizer objectives). Valgrind caughtsegment<3>reading past buffer, causing silent data corruption withMALLOC_PERTURB_enabled. (#bugfix-maxatommotionv)maxEnergyImagenow default-initialized to 0 (was uninitialized). (#bugfix-maxenergyimage)Added null
FILE*guard in NEB write_movies to prevent crash when movie writing is disabled. (#bugfix-neb-write-movies)Added bounds check for
numExtremato prevent out-of-range access in NEB spline extrema. (#bugfix-numextrema)Fixed Prefactor Hessian size validation that checked min1 vs saddle on both sides of the OR condition, never validating min2 frequency array size. (#bugfix-prefactor-hessian)
Fixed DynamicsSaddleSearch MD snapshot recording using shared_ptr aliasing instead of deep copy, causing all snapshots to point to the same live object and making transition time refinement unreliable. (#bugfix-snapshot-aliasing)
2.12.0 - 2026-03-08¶
Removed¶
Remove
_potcalls.logtext logger andQUILL_LOG_TRACE_L3fromPotential::get_ef(). Remove static countersPotential::fcalls,fcallsTotal,wu_fcallsTotal,totalUserTime. Output is now_potcalls.jsonwith structured per-instance records.
Added¶
Add
PotRegistrysingleton for thread-safe, enum-indexed force call tracking. Replaces per-instanceFileScopedtext loggers and dead static counters (Potential::fcallset al.). Tracks per-instance lifecycle (created_at, destroyed_at, force_calls, unique ID) with JSON output (_potcalls.json). Restore force call delta tracking in SafeHyperJob, TADJob, ParallelReplicaJob, ReplicaExchangeJob, NudgedElasticBandJob, BasinHoppingJob, HessianJob, and PrefactorJob.Add
SafeMath.hutility header with guarded arithmetic functions (safe_div,safe_recip,safe_acos,safe_sqrt,safe_atan_ratio) and an Eigen-awaresafe_normalizedtemplate. These prevent floating-point exceptions (SIGFPE) from division-by-zero and domain errors in numerical code without changing results for valid inputs.Drop spdlog and fmt for quill and cpp20
Changed¶
Replace cxxopts with argum for command line parsing. This change updates the CLI argument handling library and requires C++20 support. (#320)
Replace per-site
scoped_interpreterguards with lazy singletoneonc::ensure_interpreter()inPyGuard.h. Python interpreter is only started when a Python-based potential is actually used. (#324)Migrated from spdlog/fmt to quill logging library with std::format for modern C++20 logging infrastructure. Quill provides lock-free asynchronous logging with lower latency and better performance characteristics. All LOG_* macros now use quill backend with configurable formatters and sinks. (#327)
Migrate to modern C++20 logging API (EonLogger.h).
Replaced verbose quill logger initialization throughout codebase with new
eonc::log::ScopedRAII helper andeonc::log::get_file()utility. Eliminates 14-line boilerplate for file loggers and manual initialization for default loggers. Net reduction of 74 lines while improving code clarity and safety.Optimize quill backend for improved logging performance.
Configure
BackendOptionswith reduced sleep duration (100us to 10us), larger initial transit buffer (256 to 2048), zero timestamp ordering grace period (single-threaded, SPSC guarantees ordering), faster flush interval (200ms to 100ms), and disabled printable char checking (numeric data only).Switched all logging call sites from bare
LOG_*toQUILL_LOG_*prefixed macros and enabledQUILL_DISABLE_NON_PREFIXED_MACROSto prevent macro collisions when eOn is compiled alongside other libraries.Updated metatomic ecosystem dependencies: torch 2.10, metatomic-torch 0.1.9+, metatensor-torch 0.8.4+, vesin/vesin-torch 0.5.2+, metatrain 2026.2.1+. Ensures compatibility with latest machine learning potential infrastructure.
Updated vesin to v0.5.2: adapted to new API with per-dimension periodicity (
bool[3]instead of singlebool) and VesinDevice struct syntax. Ensures compatibility with latest metatomic/metatensor ecosystem.Wrap all client classes, enums, and helper namespaces under
namespace eonc. Renamehelper_functionsnamespace tohelpers.BaseStructures.henums (PotType,JobType,AtomState) are now scoped undereonc. Backward-compatibleusingaliases are provided for all classes and enums at global scope. Removeusing namespace stdfrom all client headers to prevent symbol leakage into downstream translation units.
Fixed¶
Fix ASE_POT compilation errors (wrong constructor, PotType, FPE calls, undeclared variable) and rename
-DASE_POTto-DWITH_ASE_POTto avoid macro-enum collision. (#321)Fix
[IDimerRot]column misalignment: widen force placeholder from 10 to 18 dashes, change angle precision from{:6.2f}to{:6.3f}, and add missing “Align” column specifier to the[Dimer]header. (#322)Suppress FPE trapping during libtorch operations in
MetatomicPotentialconstructor andforce(), preventing SIGFPE from benign NaN/Inf produced by SiLU (sleef) and autograd internals. Follows the existingFPEHandlerpattern from ASE_ORCA, ASE_NWCHEM, and AtomicGPDimer. (#323)Change
uncertainty_thresholddefault from0.1to-1(disabled) in both C++ and Python. Most models lack uncertainty outputs, so the previous default triggered a noisy exception+catch in the metatomic constructor for no benefit. (#325)Fixed quill migration test failures: added logger initialization to all test fixtures (XTBTest, ASEPotTest, ServeSpecParseTest, EpiCentersTest, MetatomicTest) to prevent segfaults from uninitialized quill backend. Restored correct ConfigParser defaults in config.yaml (49 path interpolations accidentally replaced during migration). Added
-DNOMINMAXfor Windows builds to fix MSVC compilation errors in quill headers. (#327)Added
safe_normalize_inplaceto SafeMath.h and guarded remaining unprotected.normalize()/.normalized()calls in Dimer, ImprovedDimer, ConjugateGradients, and LBFGS that could trigger FPE on zero vectors.Guard unprotected floating-point divisions and domain-error-prone math across 12 source files using
eonc::safemathutilities. Eliminates spurious SIGFPE signals during saddle search (Dimer, ImprovedDimer, Lanczos), optimization (LBFGS, CG, SteepestDescent), and infrastructure (Matter, Hessian, HelperFunctions, NEB, ReplicaExchange). Fallback values preserve existing branch/skip/reset behavior so valid inputs produce identical results.Make the POSIX FPE signal handler async-signal-safe by replacing
std::cerr(undefined behavior in signal context) withwrite(STDERR_FILENO, ...). Windows SEH handler switched fromstd::cerrtofprintf(stderr, ...)for consistency.Use
-isysteminstead of-Ifor pip-installed metatomic and vesin include paths to suppress third-party compiler warnings when building with-Wall -Wextra.
2.12.0 - 2026-03-04¶
Changed¶
Replace cxxopts with argum for command line parsing. This change updates the CLI argument handling library and requires C++20 support. (#320)
Replace per-site
scoped_interpreterguards with lazy singletoneonc::ensure_interpreter()inPyGuard.h. Python interpreter is only started when a Python-based potential is actually used. (#324)
Fixed¶
Fix ASE_POT compilation errors (wrong constructor, PotType, FPE calls, undeclared variable) and rename
-DASE_POTto-DWITH_ASE_POTto avoid macro-enum collision. (#321)Fix
[IDimerRot]column misalignment: widen force placeholder from 10 to 18 dashes, change angle precision from{:6.2f}to{:6.3f}, and add missing “Align” column specifier to the[Dimer]header. (#322)Suppress FPE trapping during libtorch operations in
MetatomicPotentialconstructor andforce(), preventing SIGFPE from benign NaN/Inf produced by SiLU (sleef) and autograd internals. Follows the existingFPEHandlerpattern from ASE_ORCA, ASE_NWCHEM, and AtomicGPDimer. (#323)Change
uncertainty_thresholddefault from0.1to-1(disabled) in both C++ and Python. Most models lack uncertainty outputs, so the previous default triggered a noisy exception+catch in the metatomic constructor for no benefit. (#325)
2.11.1 - 2026-03-01¶
Added¶
External potential (
ext_pot) documentation with protocol spec, DeePMD and ASE wrapper examples, and conda-forge availability badges on all potential pages. (#318)
Developer¶
Add
ExtPotTestunit test verifying the file-based ext_pot protocol with a harmonic spring calculator. (#318)
Fixed¶
Rename
PotType::EXTtoEXT_POTsomagic_enummatches theext_potconfig string. Previouslypotential = ext_potwas silently mapped toUNKNOWN. (#318)
2.11.0 - 2026-02-24¶
Added¶
Add
eonclient --servemode that wraps any eOn potential as an rgpot-compatible RPC server over Cap’n Proto. Supports four serving modes: single-potential (--serve-port), multi-model (--serve "lj:12345,eam_al:12346"), replicated (--replicas Non sequential ports), and gateway (single port with round-robin pool via--gateway). All options are also available through a[Serve]INI config section. Requires-Dwith_serve=trueat build time. (#316)Add dictionary-style configuration examples using
rgpycrumbsto the user guide, demonstrating programmatic config generation alongside INI files. (#317)
Developer¶
Switch benchmark PR comment workflow from hand-rolled scripts to the
asv-perchGitHub Action, and parallelize benchmark execution with a matrix strategy for main and PR HEAD. (#315)Add rgpot subproject wrap,
with_servemeson option,servepixi environment, CI workflow for serve mode builds, and Catch2 unit tests for serve spec parsing. (#316)
Fixed¶
Skip
torch_global_depson Windows where the conda-forge libtorch package does not ship it. (#314)Fixed serve mode segfault caused by
AtomMatrixtype collision between eOn’s Eigen-based type and rgpot’s custom type. Replaced thergpot::PotentialBasevirtual interface with a flat-arrayForceCallback, eliminating the name collision entirely. The serve code now only links the capnp schema dependency (ptlrpc_dep) from rgpot, not the full library. (#316)
2.10.2 - 2026-02-22¶
Fixed¶
Fixed a significant performance regression in NEB calculations caused by incorrect Eigen matrix storage order mapping. Added a regression test and updated CI to automatically mark PRs as draft if benchmark regressions exceed 10x. (#310)
Absorbed conda-forge Windows patches upstream: replace C99 VLA in XTBPot with
std::vector, guard empty-string indexing in INIFile, decouple xtb from Fortran requirement, add Windows library search paths for libtorch/metatensor/vesin, guard POSIX headers, and replace shell commands in IMD withstd::filesystem. (#312)
2.10.1 - 2026-02-18¶
Developer¶
Added a CI-NEB XTB regression test (
CINEBXTBTest.cpp) that runs a 10-image climbing-image NEB with GFN2-xTB on a 9-atom molecule. The test completes in under 2 seconds and guards against storage-order regressions that corrupt force projections.
Fixed¶
Replaced the
EIGEN_DEFAULT_TO_ROW_MAJORpreprocessor macro with explicit row-major type aliases inclient/Eigen.h. The macro made eOn’s Eigen types binary-incompatible with other Eigen-based libraries; removing it without updating bareMatrixXdtypes caused NEB force projections to silently corrupt and the optimizer to diverge from the first step.Use
datetime.timezone.utcinstead ofdatetime.UTCinget_version.pyfor Python 3.10 compatibility (thedatetime.UTCalias was added in 3.11).
v2.10.0 - 2026-02-15¶
Added¶
Added ASV benchmark CI workflow with asv-spyglass for PR performance comparison
Added adsorbate_region.py example script for identifying adsorbate atoms and nearby surface atoms by element or z-coordinate
Added displacement scripts tutorial with worked examples for vacancy diffusion (PTM) and adsorbate-on-surface scenarios
Added displacement strategies prose section to saddle search docs explaining epicenters, weight-based selection, and dynamic atom lists
Expose gprd_linalg_backend option for selecting GPR-dimer linear algebra backend (eigen, cusolver, kokkos, stdpar)
Developer¶
Added macOS arm64 to metatomic CI matrix using Homebrew gfortran (conda-forge gfortran_osx-arm64 wrapper is broken)
Cleanup to build on windows
Expanded ASV benchmark suite with point evaluation, LJ minimization, and NEB workloads
Use internal pick output helper
bld(meson): reduce build times by linking to xtb by default
Changed¶
Eliminated unnecessary Eigen matrix copies in Matter, Potential, and HelperFunctions hot paths
Replace per-typedef
Eigen::RowMajorwith a singleeOnStorageOrderconstant inclient/Eigen.hEnriched schema descriptions for displace_atom_kmc_state_script, displace_all_listed, displace_atom_list, and client_displace_type
Refactored MetatomicPotential variant resolution to use upstream metatomic_torch::pick_output
Updated pinned gpr_optim commit with new linear algebra backends and performance improvements
Fixed¶
Fix Windows
STATUS_STACK_OVERFLOWcrash caused by large Fortran local arrays in the EAM Al potential (gagafeDblexp.f) exceeding the 1 MB default stack; request 16 MB via linker flagsFix Windows silent client failure by using non-color spdlog sink when stdout is redirected
Use Goswami & Jonsson 2025 for removing rotations through projections
v2.9.0 - 2026-01-27¶
Added¶
Add support for ‘charge’ and ‘uhf’ (multiplicity) parameters in the xTB potential
Introduce custom Catch2 Eigen matchers and add comprehensive regression tests for GFN2-xTB forces
Setup Collective-IDPP path generation for NEB runs
Setup IDPP path generation for NEB runs
Setup sequential Collective-IDPP path generation for NEB runs
feat(mtapot): handle variants for energy and energy uncertainty within Metatomic models
feat(neb): add a zbl+sidpp penalty for initial path generation
feat(neb): implement the OCI-NEB/RONEB/enhanced CI via MMF
feat(neb): implement the onsager machlup action logic
feat(neb): write out peaks and modes for subsequent dimer runs
Changed¶
Optimize xTB potential performance by persisting internal state and using coordinate updates between force calls
Update installation guide to recommend Pixi and clarify dependency management
Fixed¶
bug(ewneb): do not turn on if cineb threshold is not met!
fix(mtapot): stop double counting mta calls
v2.8.2 - 2025-12-01¶
Added¶
Metatomic is now uncertainty aware
Metatomic variance reports per-atom uncertainty mean
Changed¶
Reworked metatomic to use torch 2.9
Developer¶
Update to use
metatensor_torch::ModuleUse
metatomic::pick_devicecorrectly
v2.8.1 - 2025-11-03¶
Added¶
Enable minimization for given initial paths
Changed¶
Reworked metatomic to use torch 2.8
Fixed¶
Generate neb.dat correctly without clobbering neb_000.dat
2.8.0 - 2025-09-04¶
Added¶
Potentials & Interfaces
Expanded potential interfaces to a variety of new quantum chemistry and ML potentials via an embedded Python interpreter:
NWChem: A high-performance, socket-based interface. (#244)
ORCA: Interface to the ORCA quantum chemistry program via ASE.
AMS: Interface for the Amsterdam Modeling Suite.
XTB: Interface for semi-empirical GFN-xTB methods.
ASE: A general-purpose interface to any calculator supported by the Atomic Simulation Environment.
Added the Ziegler-Biersack-Littmark (ZBL) universal screening potential, useful for collision cascade simulations. (#241)
Integrated support for
metatomicmachine-learned potentials via thevesinlibrary, enabling high-performance simulations with models from the metatensor ecosystem. (#201)
Nudged Elastic Band (NEB)
NEB calculations can now pre-optimize the initial and final states, improving path quality and convergence. This feature is fully compatible with restarts. (#221)
NEB calculations can now be initialized from a user-provided sequence of structures, offering greater control over the initial reaction pathway.
Introduced energy-weighted springs to improve the stability and quality of paths with high energy barriers.
Enabled the use of dual optimizers (e.g., a starting with QuickMin and switching to LBFGS after a convergence threshold).
Implement the novel RO-NEB-CI (Rohit’s Optimal NEB with MMF CI steps) method (#239)
Developer¶
Consistent formatting and counting
Support for M1 MacOS machines
Build & Tooling¶
Build System
Overhauled the build system, migrating from legacy Makefiles/CMake to Meson for a faster, more reliable, and truly cross-platform build experience. This change also lays the groundwork for a future pure Python
eon-serverpackage. (#124)
Dependency Management
Adopted
pixiandconda-lockfor robust, reproducible dependency management across all platforms.
Cross-Platform Support & CI
Established a full Continuous Integration (CI) pipeline, testing on Linux, Windows, and macOS (Intel & Apple Silicon).
The Command Line Interface (CLI) is now fully compatible with Windows environments.
Code Quality & Refactoring¶
C++ Modernization
Modernized the C++ backend to the C++17 standard, improving code clarity and performance.
Enhanced memory safety by replacing raw pointers with smart pointers (
std::unique_ptr,std::shared_ptr).Adopted the
<filesystem>library for platform-independent file I/O.
Logging
Replaced the internal logging system with
spdlogfor high-performance, asynchronous, and more informative configurable output.
Code Style
Enforced a consistent code style and formatting across the entire C++ and Python codebase.
Documentation¶
Configuration & Schema
Implemented a comprehensive Pydantic schema for all configuration files, providing automatic input validation and clear error messages. This forms the foundation for automated API documentation.
User Guides
Added detailed user documentation for the Nudged Elastic Band (NEB) module, covering theory, keywords, and practical examples.