Commit Graph
99 Commits
Author SHA1 Message Date
Frank14f e9213dd2cc Add matched diffusive resolution cases for pinball response 2026-10-31 19:00:53 +08:00
Frank14f 7b81584458 Predeclare zero-damping pinball development cases 2026-10-31 15:51:39 +08:00
Frank14f d0bcefa60c Use low-Mach wall speed for shared-motion GPU gate 2026-10-31 14:05:43 +08:00
Frank14f 33dcb422c6 Support bounded shared transverse motion and steady pinball demo 2026-10-31 13:58:19 +08:00
Astra (AI agent) d0968e6e91 research: reuse quadrature and clarify snapshot and VIV coordinates 2026-10-31 12:04:56 +08:00
ClaudeandClaude Opus 5.5 7886906517 docs: moving-circle docstrings — tables-attached guard, vx/vy meaning, center keyword
Docstring and documentation wording only; no code change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 16:33:12 +00:00
ClaudeandClaude Opus 5.5 48ee0982c9 tests/docs: unique-name driver loading; moving-path lifecycle and settings notes; VIV predeclare renamed
Tests load research drivers via importlib under unique module names
instead of a bare 'import run' (shared-process collision between the
Dütsch and VIV drivers). lifecycle.md qualifies immutable geometry and the
host-only get_flags for translating circles; supported_settings.md points to
the dense-only moving-circle feature; leontini_viv_predeclare.md is renamed
viv_re150_predeclare.md (Re 150 Kolahdouz/Qin case) with references updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 16:12:05 +00:00
ClaudeandClaude Opus 5.5 307468b671 docs: moving circles — current status and user guide, BC capability, stage-1 evidence
docs/moving_bodies.md gains a current status/user-guide section; the staged
contract below it is kept unchanged as the design record.
configs/CONFIG.md states the single dense outer-boundary package.
docs/validation/moving_bodies_stage1.md summarizes the Dütsch and VIV
evidence with SHAs and binding limitations. One stale source comment fixed
(comment only).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 16:10:32 +00:00
ClaudeandClaude Opus 5.5 a9ca6a9a16 research: VIV driver — bounded --smoke --steps N (<=64) --D plumbing mode replaces --max-steps
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 15:31:42 +00:00
ClaudeandClaude Opus 5.5 bb83b3476d research: VIV driver — exact seed window, error status, no overwrite, bounded smoke flag
Seed quiet check reads states y_t, t in [n_seed - 5 T_n, n_seed); an
exception sets status 'error: ...' before the report is written; an output
directory that already holds report.json or steps.npy is refused; --max-steps
gives a plumbing smoke that is never scored. Predeclare states the code's
actual uniform-U fluid initial condition.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 15:27:48 +00:00
ClaudeandClaude Opus 5.5 f08b5e671f docs: VIV predeclare header reflects agreement and implementation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 15:17:00 +00:00
ClaudeandClaude Opus 5.5 707fa8b5fc research: predeclared Re150 VIV driver and logic (research-only)
viv.py: exact undamped harmonic update under the last completed force,
y = 0 response cycles with eligibility, 10-cycle blocks, settle/score with
deterministic restart, conditional velocity seed, scoring metrics. run.py:
Simulation-API driver (set_body + run(1)), RHS = CME + Wen from the moving
diagnostics, raw CME/obs/node terms logged, fail-closed bounds, caps and
input rejection, outputs outside the checkout. CPU tests for the logic and
the real config loader. Predeclare: stale failure sentence removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 15:16:23 +00:00
ClaudeandClaude Opus 5.5 1abfe954cd docs: VIV predeclare — y=0 crossings, eligibility, seed reset, block rule with deterministic restart, stop semantics
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 15:10:03 +00:00
ClaudeandClaude Opus 5.5 0c9e041cd1 docs: VIV predeclare — crossing predicate, seed time level, block windows, counting, stop and dual caps
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 15:09:14 +00:00
ClaudeandClaude Opus 5.5 2564329e68 docs: VIV predeclare — unified step sequence, velocity seed, cycle/peak definitions, caps, failure set
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 15:01:54 +00:00
ClaudeandClaude Opus 5.5 78637faffc docs: VIV predeclare — (30D,30D) centre, conditional .01D seed, 150-cycle budget incl. scoring
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 14:59:52 +00:00
ClaudeandClaude Opus 5.5 778d3185e5 docs: VIV predeclare — source-verified box/position, seed, response-cycle window, instability definition
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 14:57:50 +00:00
ClaudeandClaude Opus 5.5 0899799e00 docs: VIV predeclare — Kolahdouz/Qin Re150 primary case, CME+Wen RHS, explicit lag
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 14:55:01 +00:00
ClaudeandClaude Opus 5.5 5c2b497a43 docs: VIV predeclare — U* = 5.0, verified f_N convention, c_crit and target OPEN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 14:47:43 +00:00
ClaudeandClaude Opus 5.5 731629f5a3 docs: Leontini VIV predeclaration draft (not frozen)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 14:43:22 +00:00
ClaudeandClaude Opus 5.5 02421ae379 research: Dütsch analyzer — explicit opt-in horizon, complete-cycle check, HF component report
Default (no --horizon) keeps the original cap-11 scoring. --horizon N
requires complete cycles 1..N in every case, passes the horizon to
common_window and labels the JSON. The unqualified phase-locked HF force
component is reported per case. Protocol section 6b declares the D40/60D
31-cycle duration-only diagnostic.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 11:54:52 +00:00
ClaudeandClaude Opus 5.5 c1c282b79c research: Dütsch error budget — settling at one fifth of comparison bands, conservative drift
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 11:04:25 +00:00
ClaudeandClaude Opus 5.5 b31a6141b3 research: Dütsch driver — continuous settling, domain criteria, profile coverage
common_window requires every pair from each case's own K_case to K+2;
a-priori domain criteria against the 60 D reference (separate from Table 1);
bilinear sampling returns the original fluid corner weight sum; analysis
time-averages bin samples, reports coverage/missing points and fails closed
on an empty common profile set; cases run to the end of cycle 11.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 10:58:05 +00:00
ClaudeandClaude Opus 5.5 6f95c34c0b research: one-shot Dütsch Re100/KC5 prescribed-oscillation driver (no production change)
protocol.py holds the pure arithmetic (phase/cycle bookkeeping from the right
turning point, 1-degree bins, interval-averaged Morison bases and fit with
added-mass c_i, solid-aware bilinear sampling, settling and common-window
rules). run.py drives the existing Simulation API (set_body + run(1) +
read_force + moving_diagnostics; macroscopic fields and flags only inside the
three phase bins) and writes raw data outside the checkout. analyze.py builds
the cycle ledger, K_case, the common window, Morison fits, Fy sanity and the
cross-resolution waveform difference. CPU tests cover the §6a arithmetic.
Carries the protocol doc from claude/duetsch-protocol 8c1f3c4d.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 10:54:59 +00:00
ClaudeandClaude Opus 5.5 c21a365eca docs/tests: state the S3a commit point; cover a failed hold-record upload
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 08:59:45 +00:00
ClaudeandClaude Opus 5.5 d50b8ba1be lbm: translating circles move with refill (S3a)
MovingCircleCells reclassifies swept-band cells from immutable old/new FP64
predicates: covered cells add their raw momentum and mass to diagnostics and
become solid; uncovered cells are refilled in all nine slots from donors
fluid in both geometries (mean density, NEQ from the best-aligned donor,
wall velocity at the cell), counting eq_only and no_donor. MovingCircleLinks
adds the translation velocity to the wall velocity. Simulation.run(1)
uploads the motion record, runs M1 then M2, synchronizes, rejects a nonzero
no_donor count and only then commits the target and uploads the hold
record; any failure marks the Simulation failed. Targets block direct
stepper calls and multi-step runs. get_flags reads device flags back when
translating circles exist. Contract section 10b.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 08:51:20 +00:00
ClaudeandClaude Opus 5.5 0f8a428f07 lbm: fixed-centre moving-circle cut links (S2a)
MovingCircleLinks computes the cut links of each translating circle from an
FP64 {cx, cy, r} table over its swept band (same q/hit/clamp/fallback order
as build_cut_links, explicit _rn operations) and applies the unchanged
apply_bouzidi_link with spin wall velocity. obs keeps its contract; a
separate per-body diagnostics buffer records CME, the Wen term u_w*dm,
link_dm and the link count. Moving tables are built at initialize and
attached to the stepper, which then launches the kernel before the static
curved kernel; until then direct and run steps stay blocked. Displacement
is disabled: set_body offset/vx/vy on a translating circle raises before
mutation. Contract section 10a documents S2a and the S3 pending rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 07:35:02 +00:00
ClaudeandClaude Opus 5.5 8a8e8a03ff body: moving-step failure fails the Simulation; S1 acceptance tests
A failed MovingCircle.advance now calls the owner hook, so the Simulation
is marked failed (Jet lifecycle) and refuses run/step/sync until close().
Adds host tests for set_body routing on real objects, initialize band and
mode rejections before mutation, exclusion from static link packing, and
the Simulation failure lifecycle. Contract status line updated for S1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 06:43:16 +00:00
ClaudeandClaude Opus 5.5 c986343a15 docs: moving-bodies contract (from S0 26f29b09) with applied/pending fixes
Carries the reviewed S0 draft into the S1 branch and fixes: applied stores
only the offset, explicit 'pending is not None', reject a hold target with
nonzero translational velocity, single Euclidean 0.5-cell bound.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 06:31:26 +00:00
Frank14f b2034f87e0 docs: distinguish fresh and carried PTX evidence 2026-10-28 20:20:01 +08:00
ClaudeandClaude Opus 5.5 6d046f91c1 docs: sync src_coherence with the landed slices
Stage history and verification, historical label on the migration map,
host-preparation/device order, pair accessors, per-level state split into
fixed plan structure / mutable boundary data / runtime _Level, the two
block_collide families, and the deferred items with their evidence needs.
Doc-only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 12:13:06 +00:00
ClaudeandClaude Opus 5.5 3361e97d5f docs: src_coherence migration map for the combined _boundaries record
Final private names (_device_boundaries/_level_jets/_exchange_*/_level_blocks
-> _boundaries record fields / layout.block), public boundaries = host view,
and the plan-versus-device (_Level) lifecycle. Doc-only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 12:09:26 +00:00
ClaudeandClaude Opus 5.5 9d0588dcad Merge codex/src-coherence-callers (7b652b2) into claude/src-coherence (ae53fad)
Conflicts (6 files): tests took the caller-migration side, then the
358bed1 renames (_level_boundaries -> _device_boundaries); run_refined_dfg.py
kept ae53fad (same jet_interval level= repair plus blocked_coarse_tables on the
current-checkout path). Follow-up renames in 5 auto-merged tests;
blocked_fine_tables imported from refinement_tables. Frozen drivers untouched
(run_jet_circle_cv.py, check_projected_pairs.py remap_child, historical DFG path).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 04:45:48 +00:00
ClaudeandClaude Opus 5.5 ae53fade13 Contract: name the in-EDGE half-cell projection; repair DFG runner current-checkout Jet path
- No NODE<->EDGE input conversion still leaves the root-edge -> fine-local
  half-cell projection (prepare_fine_boundary, fine_hits_to_edge_frame); say so.
- run_refined_dfg.py (jet_scenario != none, current checkout only): pass
  level=1 to FixedPatchStepper.set_jet_amplitude on reversal; use
  blocked_coarse_tables there. jet_scenario=none keeps the pinned source's
  blocked_base_tables; manifests and results unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 02:45:30 +00:00
ClaudeandClaude Opus 5.5 358bed1962 Naming/contract delta: _root_cfg, _device_boundaries, blocked_coarse_tables; NODE vs EDGE frame
- Coarse/fine name the two members of any pair (Hierarchy docstring); only the
  misleading blocked_base_tables -> blocked_coarse_tables. prepare_fine_boundary
  and blocked_fine_tables keep their pair-relative names.
- Depth-1 static circles use the integer-NODE frame (unchanged behavior); the
  root EDGE frame applies to refined levels only. Contract text corrected.
- _kernel_configs documents why it stays distinct from Hierarchy.configs.
- Drop the stale re-export comment; two tests import table builders from
  refinement_tables. Mechanical caller renames for this delta only.
No numerical code or config derivation changed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 02:34:07 +00:00
Frank14f 55067652e4 Migrate current callers to level-indexed refinement API 2026-10-28 09:53:20 +08:00
ClaudeandClaude Opus 5.5 b4eacf7526 FixedPatchStepper: level-indexed API, drop 15 fine/child compatibility views
- Hierarchy documents level/pair/shape/frame conventions; edge_frame(l)
  replaces the stepper's inline origin/spacing loop.
- Public per-level read-only state: layouts, boundaries, jets, leaf.
- set_jet_amplitude/read_raw_exchange/read_exchange_window: level= required.
- remap_child(child_objects=) -> remap_finest(objects=).
- _kernel_configs, _upload_boundary, _observed_boundary/_summarize split
  construction and observation duplication; behavior unchanged.
- fine_level_origin -> fine_level_offset (a (y, x) index, not an origin).
- docs: migration map in docs/development/src_coherence.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 01:39:48 +00:00
Frank14f 914906efd4 Merge periodic stepper alias cleanup into final stage candidate 2026-10-28 08:30:35 +08:00
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
Frank14f a9aa12e65d refactor: remove redundant periodic patch stepper alias 2026-10-28 08:03:29 +08:00
ClaudeandClaude Opus 5.5 7afb5addde lifecycle: Simulation jet update failure fails the instance like FixedPatchStepper
Simulation.set_jet_amplitude validated before upload and committed host
state after it, but after an uncertain device write nothing stopped reuse.
Record the failure in Simulation._failed and refuse every public device
call except close() (FixedPatchStepper already uses status 'failed').
Invalid input stays side-effect free and retryable. Adds host fault tests
for both owners and states the rule in docs/lifecycle.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 00:02:56 +00:00
ClaudeandClaude Opus 5.5 e18f7abe2b refinement: remove the dense refinement route; level_blocks is required (D2)
Deleted: kernels/refinement.cu and step/patch_step.cu (PatchExplode,
PatchFineStep, PatchCoarseStep, the CELERIS_REFINEMENT_AUDIT counters);
in FixedPatchStepper the dense branches of _build_level/_build_pair/_hop,
_apply_fine_boundary, the fine-level CurvedLinkSoA wiring (_fine_curved,
_fine_flags, _curved, _link_tables, its set_jet_amplitude/initialize/close
paths) and the now-vacuous 'requires all-blocked' guards (shifted,
projected, channel, raw exchange, several L1 rectangles, depth >= 3).

level_blocks is required: one tile (by, bx) of positive integers per level,
else ValueError before any device work naming the whole-level tile
((ny, nx) at the root, the fine window shape for one rectangle) as always
valid. No automatic tile choice. Removed route: None in level_blocks
(dense or mixed dense/blocked storage); parity of D/D, D/B and B/B is
recorded at 1573942 and 2469af7.

Kept: the uniform-grid solver (uniform.cu, Simulation, CurvedLinkSoA,
CurvedBoundaryKernel), FixedPatch2D, pinned historical runners.
Docs: compiler entries, BlockExplode comment, lifecycle, supported_settings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:09:13 +00:00
ClaudeandClaude Opus 5.5 8c776309c9 docs: cite the S2 commit for the PeriodicBlockStepper removal
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 01:07:07 +00:00
ClaudeandClaude Opus 5.5 8e1feffcad lbm: delete PeriodicBlockStepper; a single blocked level is FixedPatchStepper(refinements=[]) (S2)
The second owner of one blocked level goes. Its capability is the
zero-refinement FixedPatchStepper added in f764d68/985db14 (periodic SRT
level, stationary passive circles, shifted storage, NaN spare, single wait),
which matched it array for array on GPU at 1318fc2 (3 splits x +-circle x
shifted/unshifted) and passes the host lifecycle and fault contracts.

API change for callers:
  PeriodicBlockStepper(cfg, BlockLayout2D.build(ny, nx, by, bx), context=c, objects=o)
  -> FixedPatchStepper(cfg, context=c, refinements=[], level_blocks=[(by, bx)],
                       level_objects=[tuple(o)])
  download() returns a 1-tuple; static-circle tables are
  _level_boundaries[0].tables (was .boundary); no free-memory preflight.

- lbm/block_stepper.py deleted; MAX_GRID_DIM lives in refinement_stepper.
- tests/validation/multigrid/test_block_stepper.py: same frozen GPU gates
  (split identity, FP64 oracle, circle across seams) and pre-CUDA rejection
  cases on the single level; the old-vs-new bitwise test is retired with the
  old class (its result is the 1318fc2 record).
- tests/unit/test_block_step_sync.py folded into test_single_level.py
  (step(n) vs n x step(1) roles and one wait, step(0), mid-batch launch
  failure), which also gains bad-state rejection before upload, download
  failure and activation-failure retry on close.
- test_shifted_storage and test_raw_exchange_gpu use the single level; the
  raw-exchange reference feeds the AMR Jet column and raw ledger through the
  root level boundary instead of patching a private kernel field.
- Pinned historical runners (taylor_green/run_case.py, run_jet_circle_cv.py)
  are unchanged: they only run on trees that still ship PeriodicBlockStepper.
  No alias.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 01:02:08 +00:00
ClaudeandClaude Opus 5.5 d318911221 cuda: compiler_v2 module becomes compiler
The package already exposed it as CelerisLab.cuda.compiler; the module now
has that name and every tip caller, doc and current-tree test imports it
directly (no alias).

Historical-revision tooling is not edited: the Taylor-Green harness
(run_case.py, hash-pinned check_projected_pairs.py, assess receipts) only
runs against a135252, whose package has cuda/compiler_v2.py, and the J
campaign runners and dated docs describe past trees. Its two current-tree
tests now import that package from git (historical_package) instead of the
tip, and the kernel-root test first checks the accepted case.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 19:15:50 +00:00
ClaudeandClaude Opus 5.5 2b3c2a7529 kernels: name compilation entries by storage route (uniform.cu, blocked.cu)
kernel_v2.cu -> uniform.cu (whole-domain NX/NY, Simulation) and
blocks.cu -> blocked.cu (one block window, every blocked level), with
InitTubeFlow_v2 -> InitTubeFlow. All live callers, include comments,
CONFIG.md, lifecycle doc and current-tree tests move together; no alias.
refinement.cu keeps its name until the dense-route decision.
Historical-revision tooling that names the old files (LES source pins,
timing/J campaign runners, TG run_case, supported_settings citations at
888c8038, development notes) is unchanged on purpose.
No arithmetic change; the PTX symbol InitTubeFlow_v2 is renamed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 14:07:34 +00:00
ClaudeandClaude Opus 5.5 96c5decf69 docs: draft evidence index for release cleanup (R0)
Per-file class (keep conclusion / tested research code / patch snapshot /
generated pin / raw run output) with size and blob id for research/,
tests/validation/multigrid/*_evidence, output/ and BASELINE_JET_AMR.txt
at 0f8fdbc3. Draft for review; nothing removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 13:53:30 +00:00
ClaudeandClaude Opus 5.5 e4049a6183 docs(lifecycle): separate compile-time macros from runtime module globals
d_params and the block wall/channel constants are per-module runtime
globals, immutable per stepper instance but not visible to the compiler.
Note that dense and blocked slot roots carry the wall slot as macros vs
d_block_wall respectively.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 13:46:19 +00:00
ClaudeandClaude Opus 5.5 733e4d1fe7 docs: device state lifecycle by invalidation class
Describes current module/global, table, control and per-step state
ownership for Simulation, PeriodicBlockStepper and FixedPatchStepper,
and the window vs level-wide frame of single vs multi-rectangle levels.
No code change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 13:43:22 +00:00
ClaudeandClaude Opus 5.5 e4538219b2 docs: supported settings cite guards by file and symbol at 888c8038
The file:line citations pointed at c95a7ba and went stale after P1, the
compile-time root modes and the kernel entry/step split. Each guard is now
named by file plus function (or the kernel #error guard) at source
revision 888c8038. No claim, scope, observation or evidence revision
changed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 02:24:37 +00:00