Changelog#
Volumential has no Git tags yet and is pre-release
(Development Status :: 3 - Alpha), so there is nothing to organize this list
by except merged pull requests. Each entry links to the pull request, which
carries the review discussion and the full diff. See Release and versioning
for what will have to change when tagging starts.
Unreleased#
September 2026#
- Documentation
#152 — build, link-check and preview the site on every pull request against
mainthrough aDocumentationCI job, add the GitHub Pages deployment workflow, and retire the GitLab documentation job (CI and the review bots).#149 — content hygiene: a gallery page for the example scripts, the notebooks rendered without execution, a sitemap and OpenGraph metadata, docstrings on six modules, API-page coverage reported by
sphinx.ext.coverage, and docstring coverage ratcheted byinterrogate.#148 — information architecture: the Diátaxis layout of this site, redirects for the old page URLs, and
README.mdreduced to a landing page (reviewed as #147, re-landed onmainas #148).#146 — rebuild the documentation toolchain:
pydata-sphinx-theme, MyST Markdown,sphinx-copybutton,sphinx-design, a recursiveautosummaryAPI tree, and anitpickybuild with warnings as errors and a link check.#144 — acknowledge AI-assisted development and automated review (AI-assisted development).
- Evidence and benchmarks
#163 — move the benchmark drivers, the two split-order convergence sweeps and their driver-only tests out to the manuscript repository, which pins the Volumential revision it measured;
7c75ed1is the last revision that carries them in this tree. TheExamples (Smoke)CI job no longer runs their smoke modes, and Benchmarks and reproducibility is now contributor guidance on what a measurement must record rather than a per-driver reference.#143 — Paper 1 evidence library, drivers, table-builder fixes and modernization.
#134 — per-phase operation and time shares of end-to-end solves.
#133 — Helmholtz and windowed-assembled rows for the 3D composition benchmark.
#132 — 3D split-parameter sweep with a resolved FMM-order rule.
- Tables and numerics
#185 — the far-field direct-sum test from #179 now checks List 1 against the geometry; before, a far box filed in List 1 instead of List 3 or 4 dropped out of both the FMM and the direct sum, and the test passed.
#179 — pin what #175 relies on. One test compares the far field with a direct sum on a tree whose non-leaf boxes have leaf colleagues; another splits leaves of two levels in one
BoxTree.refine_and_coarsencall, which aboxtreeolder than upstream 13c9db9 gets wrong without an error; andtest_volume_fmm_laplacetightens from 5e-2 to 1e-3. The user guide now states what the 2:1 balancer allows in List 4 and what it costs in accuracy (On a graded tree, #178).#175 — keep box-tree refinement local.
BoxTree.refine_and_coarsen, and with itupdate_mesh, used to refine every leaf of a level whenever it refined one, so a refined mesh was always uniform; now it refines the marked leaves and keeps adjacent leaves within one level of each other, so refined meshes are adaptive and node counts and errors change for existing callers. A regression test checks the volume FMM against the exact solution on a graded tree, andexamples/laplace2d_adaptive.pywith its gallery card shows an adaptive volume calculation next to the uniform one (Visual gallery). The gallery manifest now also records the commit of each recorded package installed from Git (Gallery assets).#139 — emit
cos/sininstead ofcdouble_expin the fused Duffy program, about a tenfold speedup on complex kernels (Near-field table build routing).#137 — make the batched-to-scalar Duffy fallback loud and recorded, with a strict mode that also refuses cached tables of unverifiable provenance.
#131 — windowed RKE table assembly: certified assembly of fixed-parameter tables from a parameter-independent windowed channel family (Windowed singular channels and certified assembly).
- Infrastructure
#195 — give the two 3D split-versus-nonsplit full-accuracy tests a margin. What they measured was the error of the rule that integrates the smooth split remainder at the base quadrature order: 9.7e-7 for the Helmholtz potential, against a 1e-6 tolerance. They now integrate the remainder at order 6, where the largest difference is 2.0e-10, and assert 1e-8. The one-off Yukawa failure of #190 is still open.
#193 — let
PYOPENCL_CTXpick the device everywhere it had a rule of its own. The eleven manufactured checks oftest_duffy_batched_manufactured.pyskipped on anything but a GPU, so they ran in no CI job; they now take thePYOPENCL_CTXdevice like the other tests that build their own context, and at seconds on a CPU they run in the default suite.test_fmmlib_batched_stages.pyno longer always takes PoCL, andhelmholtz2d.pyandhelmholtz3d.pyno longer ignore the variable. All three Helmholtz examples stop when it selects several devices (Device selection).#192 — run all of the full-accuracy tier.
CI Fullnamed two files, so the fivefull_accuracycases oftest_windowed_rke.pyran in no CI job; it now selects the marker over the wholetestdirectory, 79 tests. The OpenCL queue of that module now comes from the samePYOPENCL_CTXhelper as the rest of the tier. The tests of that helper now fail, rather than skip, when it finds no device where it should: a helper that lost its fp64 CPU fallback used to leave them green.#189 — run the full-accuracy tier. Its 32 tests built their context on the first fp64 GPU whatever
PYOPENCL_CTXsaid, so on the GPU-less runner ofCI Fullall of them skipped and the job stayed green. The tests that build their own context, and the shared near-field table builds, now run on the devicePYOPENCL_CTXselects, CPU or GPU; without it the fp64 ones take an fp64 GPU and fall back to an fp64 CPU. The 42 fp64 volume FMM regressions that the same helper gated join the tier, because the pull-request suite cannot afford them on a CPU.CI Fullruns all 74 on the PoCL CPU, fails if any of them skips, and runs the two 3D split-versus-nonsplit tests at the reduced size thatVOLUMENTIAL_FULL_ACCURACY_REDUCED=1selects (Tests and markers). What the first runs turned up is in #190.#181 — lift the macOS skips. Six test modules skipped themselves on macOS unless
VOLUMENTIAL_RUN_UNSTABLE_DARWIN_TESTS=1was set. The aborts they avoided were the PoCL 3.1 kernel-link failure that #177 fixed, so the skips and the variable are gone, and the macOS job inCI Fullruns the same tests asTesting (Linux). The pytest configuration now lives only inpyproject.toml, because pytest ignored it there whilepytest.iniexisted (Tests and markers).#157 — three CI and backend-portability fixes (#151):
set -euo pipefailin theExamples (Smoke)job, which could only fail on its last command and so reported a brokenhelmholtz2d.pygreen for weeks; a branch-freer**power * log(r + 1e-300)in the Helmholtz split kernels, so that no relational reaches sumpy’s CSE and the split works on the symengine backend as well as on sympy; and a source build ofpyfmmlibinTesting (Linux), which puts the eight batched-P2M tests oftest_fmmlib_batched_stages.pyunder CI for the first time (CI and the review bots).#150 — follow upstream
sumpymain: its sympy-to-pymbolic mapper became sympy-only and its FFT-app helper keyword-only, so the batched Duffy builders now fold symbol-free scaling constants to literals and inherit sumpy’s cached FFT-plan hook;sumpyandloopyrelocked.#141 — restore CI on
main(Python 3.12 test environments,loopybounds check).#140 — modernize the codebase: six reviewed packages, the
volumential.wranglerssplit, andruff.tomlas the single lint configuration.#135 — track upstream
boxtreeandpyfmmlibmain, so thefmmlibextra resolves throughuv.lockrather than to a release that lacks OpenMP and the batched wrappers (Installation).
Earlier#
Before September 2026 the project’s history lives in the pull requests and
commits themselves; git log is the reference. The pieces of it that still
shape the current design are described in Design notes and in the
user guide rather than reconstructed here.