Preserve bounded validation evidence and historical failures
This commit is contained in:
1 parent
cdbb9c42f6
commit
263f3b0c7a
239 files changed
+74191
No files matched your search
@@ -0,0 +1,162 @@
|
||||
Fixed periodic 2:1 coupled backend — bounded implementation, 2026-10-13
|
||||
|
||||
Decision: A, directional arrival override between coarse pull and collision.
|
||||
Implemented and locally checked; no Simulation/Jet/general-AMR integration.
|
||||
Default single-grid source files, existing geometry and all prior evidence are
|
||||
unchanged. This increment adds 312 production lines and 222 test lines only.
|
||||
|
||||
A/B comparison against the active tree
|
||||
OneStep currently pulls, applies channel BC, computes moments, collides, and
|
||||
stores. LBMStepper runs Curved before OneStep, immediately swaps after launch,
|
||||
then runs force/sensor readers. LBMField macros/snapshot read current data;
|
||||
checkpoint saves BOTH current and spare buffers without a phase guard.
|
||||
All-FLUID flags do not remove OneStep's y=1/NY-2 wall correction. InitTubeFlow
|
||||
reconstructs channel flags. Reserved bits in active core/flags.cuh are only
|
||||
reservations: is_fluid does not exclude AMR and no skip-collision contract
|
||||
exists in init, body overlays or checkpoint. No old clone behavior was assumed.
|
||||
|
||||
A keeps coarse source G immutable and replaces local incoming components.
|
||||
It needs the existing compact target/children tables (sorted together at
|
||||
upload), no source backup or full coarse override array. Only boundary-ring
|
||||
targets binary-search this table; performance optimization is not claimed.
|
||||
|
||||
B could map incoming (q,K) to source (q,K-cq) because periodic pull is a
|
||||
bijection for each q. It is algebraically valid even for the eight corner-pass
|
||||
links, whose sources are UNCOVERED. But these overwritten source vectors no
|
||||
longer form consistent postcollision G. A safe B needs sparse backups (100
|
||||
floats for this patch), source-slot indices, exclusion of all macro, donor,
|
||||
snapshot, checkpoint and BC readers, same-stream scatter AFTER Curved and
|
||||
before OneStep, restoration to the captured old allocation before reuse or
|
||||
publication, and a failed-state policy if asynchronous errors prevent restore.
|
||||
Swapping pointers does not remove contamination from checkpoint's spare read.
|
||||
B also still needs true periodic and covered-cell behavior. A is clearer here.
|
||||
|
||||
Implementation and ownership
|
||||
src/CelerisLab/lbm/refinement_stepper.py: PeriodicPatchStepper(cfg, bounds,
|
||||
context=caller_owned_CudaContext), initialize(coarse_g,fine_g), step(n),
|
||||
download(), close(). Use its context-manager scope before closing context.
|
||||
src/CelerisLab/lbm/kernels/refinement.cu: separate compile entry, reusing active
|
||||
layout, pull, macro/equilibrium and unforced SRT operators. No channel
|
||||
kernels, physical flags, Curved, body, force or sensor dispatch.
|
||||
|
||||
Each level owns two FP32 Q-major (9,ny,nx) arrays and its own module with fixed
|
||||
dimensions and omega. Both d_params force vectors and n_objects are zero.
|
||||
Coarse/fine viscosity gives tau .8/1.1 here; configs are copied, modules are
|
||||
separate, so async parameter mutation is unnecessary. One caller-owned CUDA
|
||||
context, one backend-owned stream; private compiler directories are removed
|
||||
after module loading. Allocations and modules are released on close; partial
|
||||
construction preserves the original exception while attempting cleanup.
|
||||
|
||||
Explicit initial G arrays define the periodic state. initialize does NOT
|
||||
collide, invent channel flags, or run a channel initializer. The test constructs
|
||||
G0=C(F0) once. Each interval is:
|
||||
explode original coarse G into ALL fine halo once;
|
||||
fine pull + ACTIVE collision; inner halo only pulls, outer becomes NaN;
|
||||
fine pull + ACTIVE collision again; same halo policy;
|
||||
coarse periodic pull + ALL specified arrival overrides + ACTIVE collision;
|
||||
synchronize, publish coarse buffer swap and completed step count.
|
||||
The backend alone updates ghosts. At the second fine output, active cells hold
|
||||
G while inner ghosts retain F2 for coalescence. Some inner-ghost directions
|
||||
are legitimately invalid; all actual coalescence reads must be valid. Public
|
||||
downloads mask every halo cell back to NaN and return synchronized leaf G.
|
||||
No time-interpolated ghosts or nonequilibrium transfer scaling were added.
|
||||
|
||||
Covered coarse cells are skipped and permanently NaN in BOTH buffers.
|
||||
Every uncovered arrival whose donor was covered is overridden before moments;
|
||||
the closed map also replaces eight grazing-corner links with uncovered donors.
|
||||
Explosion parents lie outside the patch. No BC/donor reader accesses covered
|
||||
values; this backend exposes no old LBMField macro/cache/checkpoint interface.
|
||||
Public arrays mark non-leaves NaN. There is no claim of complete multilevel
|
||||
restart, snapshot, object coupling or a ready Simulation adapter.
|
||||
|
||||
Methods serialize via a lock. A failed interval can have overwritten fine G:
|
||||
no transactional rollback is claimed. The instance becomes failed, rejects
|
||||
download/step/initialize, and must be closed/recreated. Publishing happens only
|
||||
after stream synchronization. Cleanup tries all allocations even after an
|
||||
earlier free fails and does not replace a preexisting operation exception.
|
||||
|
||||
Reference basis
|
||||
Pinned CPUREF-0.3, tests/validation/multigrid/cpu_reference.py:
|
||||
SHA256 bba2a06a9f6517b32079ffff15e4060d8c3b7ed35f16ca134e1877226c9e4e1e.
|
||||
Its stored phase is arrival_f. Test-only C(F_ref) is compared to production G;
|
||||
that observation conversion is not an additional production collision.
|
||||
ref/lbmpy/src/lbmpy/relaxationrates.py:61 confirms acoustic tau scaling.
|
||||
ref/palabos/src/multiGrid/multiGridGenerator2D.hh:190 uses two fine substeps
|
||||
and distinct interface processing. Its interpolation/rescaling is a different
|
||||
method and was not imported into the pinned volumetric algorithm.
|
||||
Applied local .github/skills/lbm-ref-architecture-guard/SKILL.md: reference
|
||||
search, actual data-path map and scope were completed before editing.
|
||||
Independent local agent /root/coupling_review found no numerical-path blocker.
|
||||
Its cleanup and partial-failure test suggestions were implemented. This does
|
||||
not replace Claude/Grok/TRON review; Claude's earlier local_stress code review
|
||||
remains incomplete.
|
||||
|
||||
Validation plan fixed before running
|
||||
No force/objects, double periodic 16x16 coarse, [4,12)^2 patch, 24x24 fine
|
||||
including halo4, SRT tau .8/1.1. FP32 GPU (existing fast_math/FMA) versus FP64
|
||||
pinned reference. Rest and seed1 nonequilibrium (u=.03,-.02, relative random
|
||||
perturbation amplitude 1e-3) each <=8 coarse steps. Populations/corner packets
|
||||
max absolute tolerance 3e-6, leaf mass/momentum absolute drift AND reference
|
||||
discrepancy 2e-4. No tolerance was changed after results.
|
||||
Actual device-write instrumentation checks collision count per leaf, zero
|
||||
halo/covered collision, explosion per ghost and per-slot coalescence ownership.
|
||||
The audit entry defines one diagnostic macro in a PRIVATE build and includes
|
||||
the real refinement.cu; ordinary compile entry is separately smoke-tested.
|
||||
No old 7x32 matrix, Jet replay, physical stability sweep or large datasets.
|
||||
|
||||
Observed results
|
||||
CPU geometry: 9/9 pass under 256MiB address-space/2MiB file/core0 limits.
|
||||
CPU cleanup fault-injection: 1/1 pass under the same limits.
|
||||
GPU audit, rest 8 steps:
|
||||
max population error 2.11927626e-7
|
||||
max leaf drift 4.43765894e-5; max leaf reference error 4.62839387e-5
|
||||
max corner packet error 7.65754117e-9
|
||||
GPU audit, nonequilibrium seed1 8 steps:
|
||||
max population error 1.67235548e-7
|
||||
max leaf drift 2.23806128e-5; max leaf reference error 2.20813948e-5
|
||||
max corner packet error 1.09677929e-8
|
||||
At every step: coarse leaf count=step, fine leaf count=2*step, halo/covered
|
||||
count=0, explosion writes/ghost=step, coalescence writes/slot=step; PASS.
|
||||
Hop2 finite mask, all coalescence reads and all eight corner packets PASS.
|
||||
Normal entry: rest 1 step PASS. Eight-step equivalence evidence comes from
|
||||
the audit build of the same kernel, not an eight-step normal-entry run.
|
||||
Failure after explosion+two fine hops actually completed: 0 coarse steps
|
||||
published, download/step rejected, close passed. Separate targeted test;
|
||||
eight-step cases were not rerun to add this failure test.
|
||||
|
||||
Budgets and provenance
|
||||
Before each GPU run: physical GPU 0/1 idle (0%, 5MiB, no compute processes).
|
||||
Used only physical GPU0, UUID GPU-e8853ae7-a302-6a17-bcfa-aa767e9ed20c.
|
||||
Exact Python /home/frank14f/anaconda3/envs/pycuda_3_10/bin/python; runtime asserts
|
||||
CelerisLab package and kernel root are from /home/frank14f/CelerisLab/src.
|
||||
PYTHONPATH explicit, no user site/bytecode, BLAS one thread, CUDA cache disabled.
|
||||
Production arrays 66,464 bytes, audit-only arrays 36,608 bytes: total 103,072
|
||||
(<128KiB). This excludes CUDA context/module overhead, not measured as arrays.
|
||||
GPU child watched at 50ms intervals, killed if sampled RSS exceeds 512MiB or
|
||||
120s. CUDA virtual address space was NOT restricted to 256MiB; driver mapping
|
||||
needs more. Largest sampled RSS 194,355,200 bytes (~185.35MiB); child getrusage
|
||||
184.902MiB. Full first run 3.77s; partial-failure check 2.29s. GPU logs total
|
||||
880 bytes (<2MiB); no data dumps, plots, dependency installs or system changes.
|
||||
CPU logs summarized from tool executions in cpu_validation.json. Exact GPU
|
||||
commands, environment, exit status, wall time and RSS are in gpu*.json; actual
|
||||
stdout/stderr in gpu*.txt. Compiler scratch cleaned on every build.
|
||||
|
||||
Audit and next boundary
|
||||
baseline.json contains the pre-edit tree and 311 preserved old-file hashes
|
||||
(including the prior evidence hash scope). incremental.patch contains only the
|
||||
THREE new code/test files; existing dirty changes are not folded into it.
|
||||
manifest.json records unchanged-baseline verification and artifact hashes.
|
||||
No commit/staging/push, DynamisLab or old file cleanup/modification occurred.
|
||||
|
||||
This validates bounded implementation equivalence, NOT interface accuracy,
|
||||
stress transfer, long-time stability or 32-step production performance. The
|
||||
prior ~2.9% excess shear decay remains a research concern. Next joint decisions
|
||||
are whether/how to expose this narrow periodic backend through Simulation and
|
||||
when to implement an explicit two-level restart schema; neither is silently
|
||||
included here. No generic hierarchy or minimal flat-wall Jet work was started.
|
||||
|
||||
Authorization, verbatim as relayed by the coordinating thread
|
||||
<transcript_evidence>
|
||||
user(Sentinel_ed1ee5edd5e88191a1aaa4d710ce523f): 推进吧,~/CelerisLab就是开发环境,可以改动,只要符合架构风格。遇到问题可以用undermind看文献,也可以让grok搜索互联网信息,还可以参考开源项目。
|
||||
user(Sentinel_d0d3a42b2c088191aa8aebc105fb1b27): 允许,你用GPU验证都行
|
||||
</transcript_evidence>
|
||||
Reference in new issue
Block a user