Skip to content

Changelog

0.1.0 (2026-10-17)

⚠ BREAKING CHANGES

  • coriolis: Coriolis2D / Coriolis3D outputs change for spatially varying f (by O(dy^2 * grad f) in the interior); uniform-f results are unchanged up to round-off. With a mask, velocities on dry faces are ignored (Coriolis3D included). The Coriolis2D.interp attribute is removed.
  • diagnostics: vertical_velocity returns [Nz, Ny, Nx] (was [Nz+1, Ny, Nx]) with w[k] the top face of T[k]; old w[k+1] on the physical levels is now w[k]. The z-ghost slabs of u and v are no longer integrated. Passing a raw float mask is deprecated in favour of Mask3D.
  • boundary: wall_boundaries(field, "u") / ("v") now zero the east / north wall face (index -2) and write -field[-3] to the outside slot -1 instead of zeroing index -1.
  • advection: WENO and TVD outputs change slightly (at most 4e-7 relative on the golden fields, more on fields far from O(1) amplitude, which were previously computed with an amplitude-dependent scheme).
  • advection: masked Advection1D/2D/3D and SphericalAdvection2D/3D tendencies change at coastal cells: no flux crosses a dry face, and naive / upwind1/2/3 / weno7 / weno9 no longer read land values (they fall back to narrower stencils near the coast). Unmasked outputs are unchanged.
  • diffusion: Diffusion2D/3D, diffusion_2d, their fluxes and SphericalDiffusion2D/3D return different values for a spatially varying kappa: each face now uses the mean of its two cells instead of the western / southern cell. With wall="open" both wall faces average the edge and ghost kappa (before: the west / south wall face used the ghost kappa and the east / north one the edge kappa). Scalar and constant kappa are unchanged.
  • diffusion: masked BiharmonicDiffusion2D/3D and SphericalBiharmonicDiffusion2D/3D return different values at wet cells within two cells of land: the coast is now no-flux for h and lap(h) and land values no longer enter the tendency. Unmasked results are unchanged.
  • multigrid: n_coarse is removed from build_multigrid_solver and MultigridSolver (the bottom solve is exact). The defaults change to n_pre = n_post = 3 and omega = 0.8 (were 6, 6, 0.95), MultigridLevel stores a stencil instead of cx / cy / wall, and make_multigrid_preconditioner raises for n_pre != n_post.
  • multigrid: build_multigrid_solver now defaults to bc="dirichlet". Callers solving a T-point pressure / free-surface problem with zero normal flux (e.g. the helm_solve of barotropic_filter) must pass bc="neumann" to keep the previous operator.
  • solvers: pressure_from_divergence(method="cg") now solves the Neumann problem by default, and with bc="dst" puts p = 0 on the cell faces (the old cell-centre Dirichlet result is gone). pressure_from_divergence no longer accepts method="capacitance", known_values or known_mask. method="capacitance" and known values require bc="dst"; method="cg" with bc="fft" (and bc="dct" for the streamfunction) raises.
  • solvers: method="spectral" results change for every streamfunction_from_vorticity / pv_inversion / pressure_from_divergence call: the wrappers take the full [Ny, Nx] array and return zeros on the ghost ring (and on the psi wall nodes); do not slice the interior by hand. Known values (known_values= and non-zero Dirichlet1D faces) now sit on the coast ring (the dry wall nodes) instead of the inner wet ring, every wet cell is solved for, and SolveDomain.all_known / effective_mask change accordingly. bc.mask with method="spectral", and non-zero Dirichlet faces or spectral known values on pressure_from_divergence, now raise; so do non-zero Dirichlet faces on a Mask2D whose outer coast is not on the four walls.

Features

  • forcing: add WindCurl2D, the wind-stress curl forcing of vorticity / qg pv, and use it in the qg notebook (#377) (986b69e), closes #314
  • operators: leading batch axes on the 2-D Cartesian operators (#392) (796c144), closes #386
  • pipekit: diagnostic, reduction and time-step operators (#395) (c3bd924)
  • pipekit: finitevolx.pipekit scaffolding — FVXOperator, GridSpec, check_operator (#393) (b97a875)
  • pipekit: stencil, interpolation, boundary and mask operators (#394) (90803f0), closes #388
  • timestepping: add AB3Solver with an rk3 start for diffeqsolve and document the ab3 start-up and leapfrog-raf orders (#376) (eb92bf3)
  • vorticity: rename the energy/enstrophy pv-flux blend to pv_flux_blend and deprecate the arakawa-lamb names (#380) (be2ad27), closes #283

Bug Fixes

  • advection: make the weno and tvd epsilons relative so reconstruction is amplitude-covariant (#372) (02c8144), closes #243 #294
  • advection: zero the dry-face fluxes and make every method land-safe under a mask (#368) (bc19747), closes #296
  • boundary: make the bc atoms stagger-aware so a closed wall stops u and v on the wall faces (#378) (440cc96), closes #286
  • coriolis: use the energy-conserving corner-product form so the coriolis term conserves energy on a beta-plane (#381) (fcc1c7f), closes #289
  • diagnostics: vertical_velocity integrates the physical levels only and returns [Nz, Ny, Nx] like Mask3D.w (#379) (eed41df), closes #290 #210
  • diffusion: apply the masked no-flux operator twice in masked biharmonic diffusion (#366) (eaa0b05)
  • diffusion: average a variable kappa to the faces in harmonic diffusion (#367) (008b282)
  • multigrid: add a dirichlet wall (the default) matching masked_laplacian (#361) (8df8903), closes #304 #277
  • multigrid: full-depth coarsening, exact bottom solve and a symmetric v-cycle (#362) (f2de21b), closes #305 #344 #277
  • solvers: honour bc in the masked pressure solve and accept a traced scalar lambda (#360) (86dc542), closes #308 #309
  • solvers: keep the rhs dtype when a Mask2D is used (#355) (ca2aafd), closes #302
  • solvers: make masked_laplacian zero-padded instead of periodic at the array edge (#359) (a713f2b), closes #310
  • solvers: put the psi wall on the c-grid wall nodes for every method (#356) (a26417e), closes #300 #303
  • solvers: report cg non-convergence instead of raising and make the preconditioned solve differentiable (#358) (be058d1), closes #307
  • solvers: solve the capacitance problem on the cg domain and default to a dst base (#357) (a058edf), closes #306 #301
  • spherical: add wall="open" to SphericalAdvection2D/3D so the flux divergence telescopes (#369) (13a4758), closes #297 #247
  • timestepping: make every diffrax wrapper run inside diffeqsolve and give the adaptive ones real error estimates (#375) (78e3376), closes #313

0.0.48 (2026-10-14)

Features

  • solvers: expose the Helmholtz operator as a structured gaussx operator (#341) (4a61df8)
  • solvers: expose the multigrid V-cycle as a gaussx preconditioner (#340) (62921dc)

Bug Fixes

  • advection: align negative-flow face in functional reconstruct (#348) (7558278), closes #293
  • boundary: use the outward normal on every face for neumann and robin (#345) (449abf5), closes #285
  • diagnostics: apply f0 to the multilayer qg stretching term (#346) (567a598), closes #282
  • operators: correct small doc, comment and test mismatches (#349) (2e2eaa1), closes #291
  • solvers: make solve_cg's default atol reachable in float32 (#339) (08044e9)
  • spherical: read grid.cos_lat_V for V-face cosine and guard masked spherical pv (#350) (ccf5540), closes #287 #288
  • timestepping: make imex_ssp2_step second order in the implicit part (#347) (0af059c), closes #311
  • vorticity: swap the energy/enstrophy PV-flux forms and fill the ghost-corner row (#351) (446ac6e), closes #284. Behaviour change: pv_flux_energy_conserving / pv_flux_enstrophy_conserving and the MomentumAdvection* 'energy' / 'enstrophy' schemes now compute what their names say, so their outputs trade places relative to 0.0.47.

Performance Improvements

  • operators: lower stencils to one fused pass and unroll WENO-7/9 indicators (#337) (7debd0a)

0.0.47 (2026-09-24)

Features

  • diagnostics: add Energetics2D and Strain2D mask-aware classes (#206, 1/4) (#267) (f60986f)
  • diagnostics: add Vorticity2D enstrophy methods + QGPotentialVorticity2D (#206, 2/4) (#268) (e5d2529)
  • forcing: add 2D wind-stress, drag and Rayleigh damping operators (#258) (eeae02e)
  • forcing: add 3D wind-stress, drag and Rayleigh damping operators (#259) (9a8a886)
  • forcing: add AbstractForcing base class and composition wrappers (#257) (851225b), closes #173
  • forcing: add Layer 0 functional forcing primitives (#256) (19f388f)
  • operators: add ArakawaJacobian2D + SphericalDifference2D.geostrophic_velocity (#206, 3/4) (#269) (f757637)
  • solvers: accept a BoundaryConditionSet as bc= in elliptic wrappers (#263) (0350a90)
  • solvers: accept known_values/known_mask in elliptic wrappers (#262) (2fe5f71)

0.0.46 (2026-09-24)

Bug Fixes

  • vertical: diagonalize the non-symmetric coupling matrix correctly (#252) (276a288)

0.0.45 (2026-09-12)

Features

  • grid: physical cell-width helpers on spherical grids (6fae0d6)
  • grid: physical cell-width helpers on spherical grids (409404b)
  • reductions: mask-aware sample statistics over a leading axis (adeabf0)
  • reductions: mask-aware sample statistics over a leading axis (9525c29)

Bug Fixes

  • grid: keep rejecting genuinely negative zonal widths (06b3986)
  • grid: recognise positive pole roundoff as a degenerate width (d8f8bb1)
  • reductions: accumulate masked statistics in at least float32 (1f1c78c)
  • reductions: honour any eps, and keep dry cells at identity for ddof < 0 (7cb775a)
  • reductions: honour the requested floor, and stop sizing the count (ddd5153)

0.0.44 (2026-07-17)

Features

  • operators: opt-in "open" lateral-wall mode for advection & diffusion (#235) (89e43bb)

0.0.43 (2026-06-07)

Features

  • operators: add massh gap-analysis note and the operators it proposes (#230) (a72f722)

0.0.42 (2026-06-02)

Features

  • add linear equation of state module (#226) (3e80896)
  • boundary_ring, SolveDomain, KnownValueLifting for inhomogeneous BCs (#224) (31c7cb2)

0.0.41 (2026-04-20)

Features

  • spherical diffusion and advection operators (#165) (#216) (33fb9e7)
  • spherical follow-ups — biharmonic, momentum advection, reductions (#221) (f36ba97)

0.0.40 (2026-04-11)

Features

  • operator-attribute mask API (Mask1D/2D/3D class fields, #209) (#211) (9f67b18)
  • operators: operator-attribute mask API (#209) (9f67b18)

Breaking changes — grid and mask submodule restructure (#207, #208)

The internal _src/grid/ and _src/mask/ packages were reorganised to support a layered abstraction over coordinate systems and grid dimensions. Public-API renames are listed below; users who imported through the top-level finitevolx namespace need to update class names but no import-path changes.

Grid module (refactor: restructure into base / cartesian / spherical / cylindrical layout)

  • ArakawaCGrid1D / 2D / 3D (the old concrete classes) → renamed to CartesianGrid1D / 2D / 3D.
  • SphericalArakawaCGrid2D / 3D → renamed to SphericalGrid2D / 3D. These are now siblings of CartesianGrid* under a common CurvilinearGrid* base, not subclasses.
  • The names ArakawaCGrid1D / 2D / 3D are reused as a new abstract topology layer (just Nx, Ny, Nz).
  • New abstract layer CurvilinearGrid1D / 2D / 3D adds the uniform metric (Lx, Ly, Lz, dx, dy, dz).
  • New CylindricalGrid stub (TODO).
  • Path moves: _src/grid/cgrid_mask.py → _src/mask/cgrid_mask.py, _src/grid/constants.py → _src/utils/constants.py.

Mask module (refactor: split into base / cartesian / spherical / cylindrical)

  • ArakawaCGridMask → renamed to Mask2D.
  • New Mask1D and Mask3D concrete classes. Mask3D includes a full vertical face mask (w) — see below.
  • StencilCapability → split into StencilCapability1D / 2D / 3D.
  • _src/mask/cgrid_mask.py → split into _src/mask/{base,cartesian}.py with TODO stubs at _src/mask/{spherical,cylindrical}.py.
  • New _src/mask/utils.py with public n-D-aware mask construction primitives: pool_bool, h_from_pooled, dilate_mask, count_contiguous, make_sponge.

Mask2D field renames (frees up w for the 3-D vertical face mask):

Old name New name
w xy_corner (lenient)
psi xy_corner_strict (strict)
not_w, not_psi not_xy_corner, not_xy_corner_strict
w_valid xy_corner_valid
w_vertical_bound xy_corner_y_wall
w_horizontal_bound xy_corner_x_wall
w_cornerout_bound xy_corner_convex
psi_irrbound_xids xy_corner_strict_irrbound_cols
psi_irrbound_yids xy_corner_strict_irrbound_rows

The last pair also fixes a long-standing naming bug: the old _xids field stored column indices and _yids stored row indices.

Removed:

  • Mask2D.distbound1 / distbound2 / distbound3plus properties — these were exact aliases for ind_coast / ind_near_coast / ind_ocean.
  • visualize_masks() function — plotting code does not belong in the library. Equivalent inline code is available in docs/notebooks/demo_masks.py.

0.0.39 (2026-03-24)

Features

  • expose functional boundary helpers for wall, padding, and corners (19312bf)
  • expose functional boundary helpers for wall, padding, and corners (#152) (0d7277a)
  • expose raw face fluxes as public functional API (6298323)
  • expose raw face fluxes as public functional API (#143) (291be3b)
  • expose reconstruction pipeline as public functional API (47748d4)
  • expose reconstruction pipeline as public functional API (#151) (945f15d)

Bug Fixes

0.0.38 (2026-03-24)

Features

  • upgrade spectraldiffx dependency to >=0.0.10 (af8c9a8)
  • upgrade spectraldiffx to >=0.0.10 (336e7a2)

Bug Fixes

  • address PR review comments (3871618)
  • address PR review comments on advection tests (8d873f3)
  • nyström preconditioner false convergence with low rank (#187) (91080d2)
  • Nyström preconditioner full-rank correction for low-rank usage (#187) (a0517ea)
  • use non-trivial mask in Nystrom masked-domain test (61b749f)
  • weno7/9 right-biased reconstruction for negative flow (c906949)
  • WENO7/9 right-biased reconstruction for negative flow (ad07fa6), closes #191

0.0.37 (2026-03-20)

Features

  • docs: add three advection tutorial notebooks (1e12210)

Bug Fixes

  • address PR #184 review comments (afe7428)
  • address PR #184 review comments (round 2) (8eaa904)
  • advection: correct right-biased WENO reconstruction for negative flow (db5b079)
  • docs: add notebook symlinks so mkdocs-jupyter can find them (5d9fecf)
  • docs: correct image paths — use ../../images/ for mkdocs-jupyter (ef0f18b)
  • docs: embed all figures as markdown images for non-executed rendering (98c776b)
  • docs: enable MathJax rendering in mkdocs-jupyter notebooks (42cf22d)
  • docs: move notebooks to docs/ and embed figures for mkdocs rendering (81be84d)
  • docs: remove restrictive MathJax class filter breaking notebook math (1549298)
  • docs: use constrained_layout for masked advection plots (b91a05b)

0.0.36 (2026-03-19)

Bug Fixes

  • address PR review feedback (a7484b0)
  • resolve docs build failure and reorganize API reference (0a01584)
  • resolve docs build failure from spectraldiffx re-exports (30969d4)

0.0.35 (2026-03-18)

Features

  • add spherical compound operators (divergence, vorticity, laplacian) (d96505f)
  • add SphericalArakawaCGrid2D and SphericalArakawaCGrid3D (d66186c)
  • add SphericalDifference2D/3D and extract _safe_div_cos utility (0cb35a6)
  • export spherical operators and fix CI issues (820f3e0)
  • introduce spherical Arakawa C-grid operators (d277ead)

Bug Fixes

  • zero z-ghost slices in 3D spherical operators (bff01e9)

0.0.34 (2026-03-17)

Bug Fixes

  • export interior() and fix 1D jaxtyping shape strings (06bdede)

0.0.33 (2026-03-17)

Bug Fixes

  • correct _interp_T_to_X stencil to match Interpolation2D.T_to_X (4852194)
  • remove unrelated files accidentally committed (116a640)
  • zero z-ghost slices in Vorticity3D.relative_vorticity (f5a3d44)

0.0.32 (2026-03-17)

Features

  • add QG/SWM convenience utilities (d7cf5bc)
  • add QG/SWM convenience utilities (closes #153) (4c749ca)
  • add shallow-water PV from prognostic variables (db73d3e)

Bug Fixes

  • address PR review comments on docstrings (4e619b5)

0.0.31 (2026-03-13)

Bug Fixes

  • resolve ty 0.0.23 invalid-argument-type errors in upwind_flux callers (f94d008)

0.0.30 (2026-03-13)

Features

  • solvers: add geometric multigrid Helmholtz solver (f33c687), closes #71

Bug Fixes

  • docs: configure MathJax equation rendering with $ delimiters (51313c9)
  • solvers: add QR orthogonalization to Nyström preconditioner (981312d)
  • solvers: address PR review comments on multigrid (c37166e)

0.0.29 (2026-03-13)

Features

  • solvers: add convenience wrappers and refactor elliptic module (8b9d233), closes #87
  • solvers: add elliptic solver wrappers and modularize solver package (78b0d4d)
  • solvers: add preconditioners module with spectral and Nyström methods (b1e60fb)

Bug Fixes

  • solvers: address PR review comments on elliptic module (014bf95)
  • solvers: make _spectral_solve vmap-safe by using Helmholtz dispatch unconditionally (a19f5ca)
  • tests: make Nyström CG test robust to convergence edge cases (62f3f34)

0.0.28 (2026-03-12)

Features

  • elliptic: make spectral Helmholtz solvers vmap-compatible (9b6d51d), closes #86
  • elliptic: make spectral solvers vmap-compatible (248ac5d)
  • solvers: add tridiagonal (TDMA) solver (6d9e485)
  • solvers: add tridiagonal (TDMA) solver wrapping lineax (1802ea6), closes #85

Bug Fixes

  • elliptic: guard only (0,0) null mode, not full spectrum (3c9f24e)
  • tridiagonal: document lineax throw=True error handling for singular systems (60a0814)

0.0.27 (2026-03-12)

Features

  • add time integration module (Epic #111) (443d571)
  • timestepping: add diffrax Butcher tableau solvers and solve_ocean_pde (95657c6)
  • timestepping: add pure functional time integrators (c9c7c03)
  • timestepping: export all time integration symbols from finitevolx (1ae8f0c)

Bug Fixes

  • address PR review comments for time integration module (735a3b8)
  • timestepping: resolve ty type checker errors in diffrax solvers (d9c0c2d)

0.0.26 (2026-03-12)

Features

  • scripts: add eta output and spinup phase to QG model (ada93ea)

Bug Fixes

  • correct double-gyre script physics and BCs (0432d2a)
  • scripts: address PR review comments (2495633)
  • scripts: correct wind sign and switch SWM to closed-basin BCs (d526fc2)

0.0.25 (2026-03-12)

Features

  • add diagnostic and geographic operators (fe71938)
  • diagnostics: add strain, enstrophy, QG PV, and conservation operators (040079d)
  • export diagnostic and geographic operators from package (2b4f7af)
  • operators: add spherical geographic operators (83f6274)

Bug Fixes

  • geographic: add pole guard and address PR review comments (77fdb10)

0.0.24 (2026-03-11)

Bug Fixes

  • masks: correct psi_irrbound index offset and x/y swap (add4d36)
  • masks: correct vorticity boundary adjacency at w-points (648099f)
  • notebooks: use correct from_interior API (Lx/Ly not dx/dy) (a158663)
  • tests: replace ambiguous multiplication sign with ASCII x (84332db)

0.0.23 (2026-03-11)

Features

  • bc: add Robin and Extrapolation boundary conditions (9c1fec3)
  • bc: add Robin and Extrapolation boundary conditions (36ea563)

0.0.22 (2026-03-11)

Features

  • add mask parameter to Advection2D and Advection3D (4545060)

Bug Fixes

  • add input validation and NaN-safe blending to upwind_flux (87357c4)

0.0.21 (2026-03-11)

Features

  • add multilayer() vmap helper to lift 2D operators over layer/mode batch axis (0848cfd)
  • add multilayer() vmap helper, tests, and docs page (e1f8c8b)

Bug Fixes

  • address review comments on multilayer helper (20bd2ba)

0.0.20 (2026-03-11)

Features

  • add biharmonic (∇⁴) diffusion operator for C-grid staggered models (80c22ad)
  • add Coriolis force operator for staggered C-grid models (9ce3f8d)
  • add Coriolis force operator for staggered C-grid models (b0d70b6)
  • add harmonic and biharmonic (∇⁴) diffusion operators for C-grid staggered models (6a31f5d)
  • add horizontal diffusion operator (flux-form) for C-grid staggered models (319ce69)
  • add horizontal diffusion operator (flux-form) for C-grid staggered models (44c0638)
  • merge main (PR #97) — reconcile with Diffusion2D/3D/diffusion_2d (1a3408d)

Bug Fixes

  • address PR review comments on diffusion module (d8d9390)
  • address PR review comments on diffusion operator (8442ead)

0.0.19 (2026-03-11)

Features

  • add Arakawa (1966) Jacobian operator for energy- and enstrophy-conserving advection (beb6e9a)
  • add Arakawa (1966) Jacobian operator for energy- and enstrophy-conserving advection (c7610f6)
  • add energy-conserving momentum advection operator for C-grid models (8ea2a21)
  • add energy-conserving momentum advection operator for C-grid models (db36273)
  • add multi-layer vertical coupling matrix and layer↔mode transforms (8cdafe9)
  • add vertical coupling matrix (A) and layer↔mode transforms (aa45bcc)

Bug Fixes

  • address PR review - JAX-jittable vertical modes, fix annotations and docstring (8fbf23a)
  • address PR review comments - fix jaxtyping shape annotation and test import path (3ed8077)
  • resolve I001 import-sort error in tests and run ruff check on full repo (9316961)
  • resolve ruff lint errors in test_momentum.py (6faa3a2)
  • restrict momentum advection write region and enable x64 in tests (3686fae)

0.0.18 (2026-03-11)

Features

  • add grad_perp operator to Difference2D for geostrophic velocity (09ecb96)
  • add grad_perp operator to Difference2D for geostrophic velocity (fad6966)
  • add Slip1D — free/no/partial-slip boundary condition for tangential velocity (591a551)
  • add SlipBC1D boundary condition for tangential velocity at solid walls (8e7a9fa)
  • add standalone Divergence2D / divergence_2d operator (56e4f0f)
  • add standalone Divergence2D / divergence_2d operator (522c98b)

Bug Fixes

  • address PR review - noflux 4-wall BC, dtype promotion, transform coverage (940035b)
  • use direct stencil in grad_perp to avoid ghost-cell contamination (1d80ccc)

0.0.17 (2026-03-10)

Features

  • add WENO7 and WENO9 advection schemes (6fd9ebc)

0.0.16 (2026-03-10)

Features

  • replace static PNG comparison plots with animated GIFs (ebf4b18)
  • replace static PNG comparison plots with animated GIFs (9d813d1)

Bug Fixes

  • address reviewer feedback on GIF animation changes (94ebc36)

0.0.15 (2026-03-10)

Features

  • add TVD flux limiters, masked TVD schemes, and advection method support (863b3ac)
  • flux limiters and masked advection schemes (7fc7654)

Bug Fixes

  • correct inaccurate comment on TVD stencil size in tvd_x_masked (39db0c2)
  • keep jaxtyping shape strings compatible with ruff and ty (263f491)

0.0.14 (2026-03-10)

Bug Fixes

  • correct physical formulation in all three double-gyre example scripts (3bafe48)
  • correct QG 1.5-layer PV formulation, drag, beta term, and forcing amplitude (758c377)
  • correct wind sign, nonlinear SWM Bernoulli double-counting, and Coriolis staggering (4adb0eb)

0.0.13 (2026-03-08)

Bug Fixes

  • convert QG example from periodic beta-plane to closed-basin double-gyre (b132e8e)
  • convert QG example from periodic beta-plane to closed-basin double-gyre (10a253d)

0.0.12 (2026-03-07)

Bug Fixes

  • address operator dtype and fixture review feedback (e2d6afc)
  • Advection3D ghost flux bug; add U/V/X ghost cell tests; update instructions and figures (a4ca415)
  • correct Arakawa C-grid operators, ghost-cell tests for all staggered types, and agent instructions (d0c3c8c)
  • correct operators, add non-constant tests, document C-grid discretization (5a1e831)
  • rewrite kinetic_energy and bernoulli_potential for Arakawa C-grid same-size convention (06d8c9a)

0.0.11 (2026-03-07)

Features

  • modernize double gyre example scripts (1189ede)

Bug Fixes

  • address example script review feedback (c09953d)
  • tune double gyre example diagnostics (65c0fe6)
  • use corner-based qg geostrophic mapping (e6f995d)

0.0.10 (2026-03-07)

Features

  • add per-side boundary condition API for 2D ghost-ring fields (928e0b5)

Bug Fixes

  • correct Neumann face signs and exports (b08cdfa)

0.0.9 (2026-03-07)

Features

  • add capacitance matrix solver and preconditioned CG (3b96918)
  • add spectral transforms and core elliptic solvers (DST/DCT/FFT) (3674204)
  • integrate JAX spectral transforms, elliptic solvers, capacitance matrix method, and lineax-based PCG into finitevolX (e8f0191)

Bug Fixes

  • handle lambda_=0 in solve_helmholtz_dct and solve_helmholtz_fft (72ec96b)
  • resolve ruff lint errors in test files (RUF059, RUF003) (cc9400a)

0.0.8 (2026-03-03)

Features

  • adopt pypackage_template standards and best practices (71afd3e)

Bug Fixes

  • correct API reference documentation to use actual exported functions (4dc1804)

0.0.7 (2026-03-01)

Features

  • add mask-aware reconstruction methods to Reconstruction2D and Reconstruction3D (35442d0)
  • add mask-aware WENO5/WENOZ5 reconstruction to Reconstruction2D and Reconstruction3D (ef39e9f)

0.0.6 (2026-03-01)

Bug Fixes

  • move operator tests to tests/ directory per AGENTS.md (5b74582)
  • use lazy import for finitediffx in operators.py (fe0b5f8)

0.0.5 (2026-03-01)

Bug Fixes

  • cgrid_mask: define Nirr type alias to resolve ty check error on Python 3.13 (caa558b)

0.0.4 (2026-03-01)

Features

  • add unified Mask2D; remove legacy MaskGrid/FaceMask/NodeMask/CenterMask (d11b995)

Bug Fixes

  • add missing quotes around Nirr in jaxtyping annotations (fdd4ef6)

0.0.3 (2026-03-01)

Bug Fixes

  • apply ruff format to reconstruction.py (560a766)

0.0.2 (2026-03-01)

Features

  • composable arakawa c-grid operators, modernize packaging, and fix linting (3b3e94d)

Bug Fixes

  • adjust advection write region to avoid ghost-ring fluxes, add upwind2/3 value tests (da4958a)
  • correct advection flux indexing and simplify upwind2 negative flow test (6bdc730)
  • correct upwind2/upwind3 boundary fallback in reconstruction methods (6da7971)
  • fix ty invalid-argument-type errors properly (79dd5fa)
  • rename param u->v in Difference3D.diff_y_V_to_T; fix grid docstring coordinates (ca05743)
  • replace JAX array assertions with np.testing and handle division by zero in PV (83dcdd2)
  • resolve remaining ruff linting errors (unused vars, format strings) (6a71085)
  • resolve ruff and ty linting issues, remove coverage constraints (e520f4f)
  • suppress ty invalid-argument-type errors in pyproject.toml (cde1a59)
  • suppress ty invalid-argument-type errors in pyproject.toml (84bfddb)
  • widen step_size type in difference() and convert test arrays to jnp (ab38caa)

Changelog