# eOn 3.4.0 A minor release on `v3.3.1`. See monorepo `CHANGELOG.md` section 3.4.0 for the full list. ## AKMC on a cluster with CPMD `examples/akmc-cpmd-slurm` explores a silicon vacancy with CPMD on four MPI ranks per search. Each process search is one Slurm job: the client runs as one process and its `ext_pot` wrapper starts `cpmd.x` under `mpirun`. On a test node the wrapper's force matched a central finite difference to 2e-5 eV/A, and the first search returned a process with a 0.029 eV barrier. The ExtPot guide explains how CPMD reports forces: the table under `GRADIENTS (-FORCES)` holds forces, and `GEOMETRY` carries them at full precision. Fixes on this path: - A dimer or process search on a per-image potential such as `ext_pot` evaluated both images on one instance at the same time, with `parallel = true` (the default). Two external programs then shared one exchange directory. Each image now keeps its own instance, and an error in the second thread stops the job instead of calling `std::terminate`. - The cluster communicator cancels only the jobs still queued when a state reaches its confidence, keeps finished results for harvest, and logs a failed cancel. It used to cancel every job and delete the scratch directory, results included. - The MPI communicator no longer stops idle clients when a state reaches its confidence. - The Slurm scripts take the account, partition and job shape from `EON_SBATCH_ARGS` and the client from `EON_CLIENT`, and list the current user's jobs. - The local communicator kills each client's whole process group, so wrappers and their MPI launchers do not outlive the server. - The MPI potential sends the working directory as `int`, as the `MPI_INT` it declares, and sleeps `mpi_poll_period` seconds between polls. ## pyeonclient - Linux wheels are `manylinux_2_28` and vendor the Fortran and OpenMP runtimes, so they install from PyPI and import on a minimal system. The bundled rgpot keeps the private SONAME `libeon_rgpot.so.3`, so a pip `rgpot` wheel imports beside pyeonclient in either order. - In-process jobs record termination, energy, force calls and job type on `job_result`. `LocalInProcess` takes a `Structure` or `ConFrame` and returns saddle and product as frames. In-process jobs poll a cancel token between jobs. ## Nudged elastic band - Zoom-NEB packs images onto a window around the climbing image and keeps OCI-NEB available on that band. - The climbing image applies only when an interior image is above both endpoints. ## Structures and numerics - Structure matching, rotational matching and space groups go through readcon-ops. `identical` keeps a one-to-one atom map. - Finite-difference Hessians gain a fourth-order stencil and cutoff-colored columns, which take fewer force calls on sparse systems. - Per-atom force norms and periodic wrapping use Highway where it is available. NaN forces no longer read as converged. ## Build - The direct in-process rgpot arm is linked on every non-Windows build; `-Dwith_rgpot` is deprecated and ignored. eOn builds against rgpot 3.3.0. - `Parameters` keeps its state behind a private `Impl`. - The pixi environment carries `nlohmann_json`, so a host copy cannot pull `/usr/include` into a conda build.