Repository navigation
v3.2.0
eOn 3.2.0
An audit release. Of the 331 commits since v3.1.0, 170 are fixes to the
client and server IO paths, the potential backends, and the Python bindings.
Three changes need a decision from anyone upgrading; the rest are repairs.
See monorepo CHANGELOG.md section 3.2.0 for the full fragment list.
Compatibility: eOn writes CON spec 3
The C++ wrap and the Python readcon pin both move to 0.14.5, and the
0.14 writer emits con_spec_version = 3. A reader linked against readcon
0.13.x rejects those files with UnsupportedSpecVersion.
What this means in practice:
- A
.conwritten by eOn 3.2.0 is not readable by an eOn 3.1.x client, nor by
a downstream tool pinned toreadcon>=0.13,<0.14. - Pin downstream consumers to
readcon>=0.14.5in the same change that moves
them to eOn 3.2.0.chemparseplotand anything reading trajectory output
through it are the ones to check. - Reading older spec-2 files is unaffected; the change is on the write side.
Constraints are stored per Cartesian axis
Matter holds the CON column-4 bitmask as an N x 3 matrix rather than one
flag per atom, and getFree() derives the optimizer mask per axis instead of
broadcasting. A slab or reaction coordinate fixed along one axis keeps the two
degrees of freedom it declared free.
This depends on readcon 0.14.5: the 0.13 decoder read column-4 value 1 as
fully fixed, so an x-only constraint could not survive a write and read
(readcon-core #24, fixed in #25). eOn 3.2.0 round-trips every mask value.
getFixed(atom) keeps its whole-atom meaning and now answers 1 only when all
three axes are fixed. Code branching on it for a partially constrained atom
sees a different answer than it did in 3.1.x.
Movie writers no longer grow quadratically
Appending a frame to a .con serializes that frame and concatenates it
instead of reading and rewriting the whole file. An N-frame trajectory costs N
frame writes rather than N(N+1)/2. dynamics.con, movie.con and the basin
hopping trial movies are the visible beneficiaries. Output bytes are
unchanged. Gzip and zstd targets keep the rewrite path, because a compressed
member cannot be extended in place.
External-program potentials check their IO
AMS, AMS_IO, ExtPot and VASP now check every file open, read and shell
command. A missing, truncated or stale result file used to leave the force and
energy arrays holding whatever they held before, and those values went into
the optimizer unremarked.
Two behavioural corrections in the same area:
ExtPotandVASPno longer declare themselves safe to call from several
threads on one instance. Both exchange structures through files at fixed
names, so parallel NEB images were overwriting each other's input and
reading each other's forces.ExtPotasks for an instance per image and
stays parallel;VASPdrives one process through one set of files, so its
image evaluation is now sequential.- The
VASPconstructor no longer deletes the working directory's contents.
It removedWAVECAR,CHGCARandTMPCARamong others, which is precisely
what anISTART/ICHARGrestart reads, and it never removed theSTOPCAR
that aborts the next run.
Batched force evaluation
RgpotAdapter reports PotCaps::batched through supportsBatchEvaluation()
and forwards a batch to rgpot's forceBatchImpl, so a kernel that evaluates
many systems in one pass gets the chance to. Kernels that do not override it
take a per-system loop, so every existing potential answers a batch call
correctly. Requires rgpot carrying ForceBatch.
Tests run on Unix CI
tests/ runs after the client install on Linux and macOS. It had not run in
CI before, which is why several of the fixes in this release are for defects
that existed for some time: test_one_pt died at collection on a shell
builtin, and min_mode_method = gprdimer in a build without -Dwith_gprd
silently fell through to ImprovedDimer and reported a nonnegative-mode abort
rather than refusing.
Upgrade checklist
- Move
readconto>=0.14.5wherever a downstream tool reads eOn output. - Re-check any code branching on
Matter::getFixed(atom)for partially
constrained atoms. - If you drive
ExtPotfrom parallel NEB, note that each image now runs in
extpot_<pid>_<n>; a wrapper reaching for the client's working directory
should readEON_EXTPOT_RUN_DIR.