Files
CelerisLab/docs/compatibility.md
T
ClaudeandClaude Opus 5.5 ddc4a1a6c4 lifecycle: guard Simulation.stream after a failed jet update; scope docs
A set_jet_amplitude failure while creating the internal stream marked the
Simulation failed, but the public stream property still retried
cuda.Stream(). Guard it like the other device-touching methods and add a
regression test (no retry, close still retryable). Lifecycle wording now
names the guarded device-touching methods; cached readers and host staging
stay callable. compatibility.md records the caller-visible fail-closed change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 00:23:56 +00:00

2.8 KiB

Compatibility and API changes

Changes that can make a previously accepted setup or call behave differently. Each entry names the commit, the affected entry points and the observable result.

validate_cut_link_ownership (body/preprocess/flag_overlay.py) now runs for passive bodies as well as Jet/aperture bodies. Every cut link must have an active fluid receiver (FLUID set, SOLID clear), and each (receiver, direction) population may have only one writer.

Rejected with ValueError, before flags, populations or device buffers change:

  1. Overlapping or touching passive solids whose cut links write the same population ("Boundary requires unique cut-link writers").
  2. A body whose cut-link receiver is a non-fluid cell, e.g. a channel wall row or the inlet/outlet column ("Cut links must have active fluid receivers").

Both were previously accepted silently for passive bodies; the interpolated boundary then had undefined results. The rules apply to the cut links of all bodies together, so a passive body overlapping a Jet body is rejected as well. The check runs in Simulation.initialize, runtime body sync (sync_bodies), checkpoint save and checkpoint load (common/checkpoint.py). Load validates before restoring anything, so a checkpoint whose saved geometry violates either rule no longer restores; rebuild the geometry with separated bodies.

87c3a31: Simulation.read_surface_exchange accepts Jet-driven bodies

read_surface_exchange(id) previously required SurfaceActuation on the body. It now also accepts bodies that own Jet aperture links, including Jets with zero or negative amplitude (the aperture test is geometric). Bodies with neither SurfaceActuation nor aperture links still raise ValueError("Body has no surface actuation"). The value is unchanged: the latest step's wall/aperture exchange, not total nozzle force.

7afb5ad: Simulation fails closed after a Jet amplitude device-write failure

Simulation.set_jet_amplitude previously only documented that a device error leaves the per-link velocity column undefined; the instance stayed usable. Now any error after input validation (internal stream creation or the upload) marks the Simulation failed. Every later device-touching public method, including the stream property (guard added in the follow-up repair commit on claude/jet-update-consistency), raises RuntimeError("Simulation failed (...); close() and recreate it"). The host amplitude keeps its previous value. close() still works and stays retryable; cached host readers and host staging calls are not blocked. Invalid input (ValueError/IndexError) is unchanged: it raises before any change and the instance stays usable. FixedPatchStepper.set_jet_amplitude already failed the instance (status failed) and is unchanged.