diff --git a/docs/compatibility.md b/docs/compatibility.md new file mode 100644 index 0000000..4c1f844 --- /dev/null +++ b/docs/compatibility.md @@ -0,0 +1,32 @@ +# 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. + +## 87c3a31: cut-link ownership is validated for every body + +`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 check runs in +`Simulation.initialize`, runtime body sync (`sync_bodies`) and checkpoint load +(`common/checkpoint.py`). 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. Bodies without any aperture still raise +`ValueError("Body has no surface actuation")`. The value is unchanged: the latest +step's wall/aperture exchange, not total nozzle force.