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 main through a Documentation CI 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 by interrogate.

#148 — information architecture: the Diátaxis layout of this site, redirects for the old page URLs, and README.md reduced to a landing page (reviewed as #147, re-landed on main as #148).

#146 — rebuild the documentation toolchain: pydata-sphinx-theme, MyST Markdown, sphinx-copybutton, sphinx-design, a recursive autosummary API tree, and a nitpicky build 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; 7c75ed1 is the last revision that carries them in this tree. The Examples (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_coarsen call, which a boxtree older than upstream 13c9db9 gets wrong without an error; and test_volume_fmm_laplace tightens 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 it update_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, and examples/laplace2d_adaptive.py with 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/sin instead of cdouble_exp in 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_CTX pick the device everywhere it had a rule of its own. The eleven manufactured checks of test_duffy_batched_manufactured.py skipped on anything but a GPU, so they ran in no CI job; they now take the PYOPENCL_CTX device 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.py no longer always takes PoCL, and helmholtz2d.py and helmholtz3d.py no 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 Full named two files, so the five full_accuracy cases of test_windowed_rke.py ran in no CI job; it now selects the marker over the whole test directory, 79 tests. The OpenCL queue of that module now comes from the same PYOPENCL_CTX helper 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_CTX said, so on the GPU-less runner of CI Full all 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 device PYOPENCL_CTX selects, 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 Full runs 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 that VOLUMENTIAL_FULL_ACCURACY_REDUCED=1 selects (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=1 was 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 in CI Full runs the same tests as Testing (Linux). The pytest configuration now lives only in pyproject.toml, because pytest ignored it there while pytest.ini existed (Tests and markers).

#157 — three CI and backend-portability fixes (#151): set -euo pipefail in the Examples (Smoke) job, which could only fail on its last command and so reported a broken helmholtz2d.py green for weeks; a branch-free r**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 of pyfmmlib in Testing (Linux), which puts the eight batched-P2M tests of test_fmmlib_batched_stages.py under CI for the first time (CI and the review bots).

#150 — follow upstream sumpy main: 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; sumpy and loopy relocked.

#141 — restore CI on main (Python 3.12 test environments, loopy bounds check).

#140 — modernize the codebase: six reviewed packages, the volumential.wranglers split, and ruff.toml as the single lint configuration.

#135 — track upstream boxtree and pyfmmlib main, so the fmmlib extra resolves through uv.lock rather 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.