Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
519473a61c | ||
|
|
1bbe4b46a3 | ||
|
|
43c527b37c |
@@ -0,0 +1,62 @@
|
||||
# Projected explosion: isolated spatial-interpolation experiment
|
||||
|
||||
Historical baseline: `9805383f9c50d867e8555471baf5dbda8333a652`. This candidate does not replace or relabel its results. The TG runner records the actual candidate revision, dirty state, source hash and harness hashes, plus the historical baseline revision and selected explosion scheme.
|
||||
|
||||
Default remains `constant`. Explicit `explosion="projected_linear"` supports only a periodic, body-free, two-level, fully blocked single rectangle (window or singleton union representation). Dense, multilevel, multi-rectangle and body/Jet cases are rejected. Constructor guards have been statically reviewed; GPU construction is not yet exercised.
|
||||
|
||||
For each population, form a centered gradient only where both axis neighbors are original explosion donors, owned and uncovered. Otherwise set that axis derivative to zero. Project the gradient perpendicular to the population lattice direction (rest population retains its gradient), then evaluate at child offsets ±1/4 coarse cell. Read owner cores, never stale block halos. Repeating the donor for a missing axis avoids invalid reads. All neighbor reads remain within the original coarse transfer footprint.
|
||||
|
||||
Timing, two ghost-only streaming hops, four-child coalescence, relaxation, shifted-storage convention, bulk collision and legacy constant kernel are unchanged. There is no NEQ rescaling, limiter, time interpolation or new framework. Projection commutes with subtracting the constant lattice weights.
|
||||
|
||||
Method attribution: Schornbaum and Rüde, [arXiv:1508.07982](https://arxiv.org/pdf/1508.07982), Algorithm 2; Chen et al., Physica A 362 (2006) 158–167, [DOI 10.1016/j.physa.2005.09.036](https://doi.org/10.1016/j.physa.2005.09.036). Independently implemented mathematical stencil, with no GPL implementation copied. The Chen full text was not directly audited in this experiment.
|
||||
|
||||
## CPU checks
|
||||
|
||||
Run `PYTHONPATH=src python -m unittest discover -s tests/unit -p test_projected_explosion.py -v`.
|
||||
|
||||
- Constant populations, affine available-axis gradients, characteristic constancy, quartet means and shift invariance.
|
||||
- Original donor footprint only; poison covered cells and check finite reconstruction.
|
||||
- Both window and singleton-union layouts, centered/off-axis/minimal near-edge rectangles.
|
||||
- Eight complete intervals, identity and SRT collision: actual fine pulls and coarse restriction tables, all eight grazing corner paths included; composite mass and both momentum components conserved within 2e-12 FP64 absolute tolerance.
|
||||
- Actual CUDA kernel body compiled with a CPU C++ shim: blocked address mapping, FP32 shifted/unshifted inputs, poisoned halo/covered storage, independent NumPy parity. This checks arithmetic and indexing, not CUDA compilation or execution.
|
||||
- Unprojected reconstruction is distinguished by failure of characteristic constancy. It need not fail global mass conservation in this geometry.
|
||||
|
||||
## Next diagnostic, only on authorized Horsea GPU
|
||||
|
||||
Use the same candidate checkout for paired Re100 N64 depth2 runs, differing only in `--explosion constant` versus `--explosion projected_linear`:
|
||||
|
||||
`python tests/validation/taylor_green/run_case.py --repo "$PWD" --re 100 --n 64 --depth 2 --explosion projected_linear --output <new-result-path>`
|
||||
|
||||
Select the physical CUDA device explicitly. Never overwrite historical reports. Compare frozen TG error gates and full trajectories, including mass, energy, pressure and velocity. Amplitude/nonmodal shape decomposition can inform mechanism but cannot substitute for the gates. First establish CUDA compilation and CPU/device parity, then paired end-to-end budgets. The CPU diagnostic below establishes improvement only in its FP64 reference trajectories; it does not establish production suitability or a candidate GPU pass.
|
||||
|
||||
## Local verification limits
|
||||
|
||||
Focused candidate/refinement/block-layout/build-contract checks pass (62 unittest tests). Full unittest discovery is not green: the attempted 200-test run reports 18 missing-dependency/import errors and three historical source-pin refusals (jet-circle and LES guards), plus one skipped test. Those pin refusals correctly reject the changed `blocks.cu`; their immutable fixtures were not weakened or rewritten. Python syntax checks and `git diff --check` pass. No candidate CUDA build, device execution, GPU performance or GPU TG improvement has been established.
|
||||
|
||||
|
||||
## Donor-support audit
|
||||
|
||||
The current support is exactly the original two-coarse-cell-wide explosion ring. Centered normal derivatives therefore vanish along straight faces: the inner donor lacks an uncovered inward neighbor, and the outer donor lacks a third-ring outward neighbor. This is an explicit limitation, not evidence of a missing donor layer. Independent inspection of the authors' [LinearExplosion implementation](https://github.com/lssfau/walberla/blob/master/src/lbm/refinement/LinearExplosion.h) found the same two-cell directional slabs and both-neighbors-valid condition; their union equals all 368 distinct donors in the N64 TG geometry. No upstream code was copied. This does not claim identical block-local tangential fallback at every fine/fine block seam.
|
||||
|
||||
A separate read-only dependency trace compared the ring to all uncovered periodic parent neighbors for four rectangles. Wider support changed some unused outer ghost populations but none consumed by final fine ACTIVE outputs or coarse restriction through the two hops, including full collision dependencies. Widening the support is not part of this candidate.
|
||||
|
||||
## Reproducible CPU Taylor–Green A/B
|
||||
|
||||
Run from this checkout, with NumPy and Python installed:
|
||||
|
||||
`python tests/validation/taylor_green/run_cpu_explosion.py --repo "$PWD" --n 32 --output-dir /tmp/explosion-ab`
|
||||
|
||||
Repeat with `--n 64` for the second retained case. These are the only supported grids. The script reuses unchanged CPUREF `advance_coarse_once`, existing TG initialization/metrics, actual singleton-rectangle transfer tables, and the tested projected reconstruction. The rectangular adapter verifies its coalescence children against the production table and includes all eight grazing-corner links. Only the explosion operation differs within each pair.
|
||||
|
||||
The reference stores physical FP64 arrival populations; production stores shifted FP32 postcollision populations. Collision preserves the macroscopic moments compared here, and initialization is equilibrium. This supports a macro-trajectory comparison, not population-by-population/device equivalence. Outputs record actual checkout/harness provenance and hashes of both imported diagnostic helpers. The compact retained `tests/validation/taylor_green/cpu_explosion_summary.json` records original N32/N64 results and historical GPU report hashes, without importing those reports into this branch.
|
||||
|
||||
At Re100, depth 2, t*=0.48:
|
||||
|
||||
| Root N | Velocity L2, constant → projected | Pressure L2 | Orthogonal velocity residual |
|
||||
|---|---|---|---|
|
||||
| 32 | 3.24942% → 1.52264% | 8.98696% → 4.85601% | 2.28814% → 0.98615% |
|
||||
| 64 | 1.13113% → 0.49304% | 3.55050% → 1.65801% | 0.93699% → 0.40289% |
|
||||
|
||||
Across sampled times, constant CPU versus historical constant GPU differs by at most 6.93e-8 in velocity L2 and 3.58e-6 in pressure L2 for N32; 1.74e-8 and 8.64e-7 for N64. Relative mass drift remains below 1.42e-13 and absolute momentum change below 2.11e-13 in these CPU pairs. Independent N32 rerunning reproduced trajectory/error metrics exactly; recomputed quadrature-factor metadata agrees to roundoff.
|
||||
|
||||
Amplitude is the volume-weighted projection onto the exact velocity field; the orthogonal residual isolates the remaining shape error. The energy decomposition includes the discrete composite-grid exact-energy quadrature factor recorded per row, not simply amplitude squared plus residual squared. These are bounded diagnostic improvements, not proof of complete method fidelity, uniform-grid accuracy equivalence or a validated CUDA implementation. Frozen production validation gates are unchanged.
|
||||
@@ -1,52 +0,0 @@
|
||||
# First-failure uniform SRT diagnostic (prepared, not executed)
|
||||
|
||||
Purpose: locate the first physical failure in the unchanged uniform D80 SRT control that was healthy at executed step 160 and nonfinite at the next observation, executed step 320. The original failure's summary `steps=160` is the last accepted observation, not the last executed step. This diagnostic does not select different numerical parameters, run an AMR case or perform a new benchmark campaign.
|
||||
|
||||
## Exact source and configuration
|
||||
|
||||
The default source is the containing repository (override with `--source`); the exact pinned production/runtime source is commit `9805383f9c50d867e8555471baf5dbda8333a652`. The manifest pins production files and the helper/runner dependencies directly against the original failure's `source_before.json`. All pinned contents match. Import guards require CelerisLab and the runner from the selected pinned checkout.
|
||||
|
||||
The script calls the original `run_refined_dfg.config(helper,80)` factory and unchanged `Simulation(...).initialize()`. Thus it retains D80, U=.01, ν=.008, τ=.524, ω≈1.9084, shifted FP32, SRT, double buffer, parabolic local Zou–He inlet, all-nine pressure-NEQ damping .5, backflow clamp disabled, identical cylinder geometry and initialization. No clipping, equilibrium rewrite or solver patch is added.
|
||||
|
||||
The inlet overload in this source may differ by FP32 rounding from older d79 code even where the algebra matches; that is not changed here and is not established as the cause of failure. MRT's outlet branch also differs. Neither prior MRT success nor this diagnostic establishes an SRT/outlet/body attribution.
|
||||
|
||||
## Observation and stop contract
|
||||
|
||||
- At most 320 actual solver steps, starting from the original fresh initialization. Stop at the first physical health failure (or wall deadline).
|
||||
- Read the production macroscopic path, its decoded populations, and force after every completed step. Preserve the actual executed count separately from the last observed count.
|
||||
- Independently report nonfinite physical populations, nonfinite physical macros and nonfinite reaction. Apply the original density [.5,1.5] and Mach≤.2 checks to physical FLUID nodes. A new population-only check may stop earlier than the original macro-only health check; the report explicitly distinguishes it.
|
||||
- Per-step `Simulation.run(1)` resets/reads the observation buffer for a one-step force window. This changes observation cadence and force accumulation windows, not configuration or fluid updates. A cumulative-force-only overflow from the original 100/60-step batching would not be reproduced identically; that limitation is explicit. Original macro warnings already show nonfinite populations/macros, so this instrument prioritizes locating the physical failure.
|
||||
- Ghost/inactive/body-solid populations are reported in separate categories; their NaNs do not independently trigger physical failure. Category masks are disjoint and complete. Boundary subtypes are decoded as the nibble, not mistaken for independent bit flags.
|
||||
- Physical region labels are body-near (within radius+3 cells), outlet/inlet-near (three fluid columns), wall-near (three fluid rows), and remaining bulk. These locate symptoms, not causal mechanisms.
|
||||
- Initial, preceding and firstbad/final compact reports retain category counts, finite global extrema and positions, the first 16 offending nodes in row-major order, their bad q indices/all populations, and up to four 5×5 population/flag neighborhoods. “First” identifies earliest sampled step; within that step the list is row-major, not an asserted temporal order among GPU threads.
|
||||
|
||||
## Bounded evidence
|
||||
|
||||
Only the immediately preceding and firstbad/final active-buffer states are retained. `states.npz` contains their exact raw shifted FP32 values, production-decoded FP32 populations and step numbers, plus flags. This is ~81 MiB at the exact D80 shape, with a 128 MiB artifact limit enforced. There are no saved field trajectories. Initial conditions are reproducible from the source/config; only their diagnostic summary is retained.
|
||||
|
||||
These are diagnostic snapshots, not full restart checkpoints (spare buffers and observation/control state are not a restart bundle). `diagnostics.json` stores nonfinite numbers as explicit `NaN`, `+Inf`, `-Inf` strings and is strict finite JSON; NPZ preserves actual IEEE values. A force-only failure can have no offending fluid node. A clean cap means no sampled failure through 320, not benchmark acceptance.
|
||||
|
||||
## CPU validation
|
||||
|
||||
```sh
|
||||
python tests/validation/uniform_srt_diagnostic/test_diagnostic.py
|
||||
python tests/validation/uniform_srt_diagnostic/diagnose_uniform_srt.py --output /tmp/new-srt-preflight
|
||||
```
|
||||
|
||||
Seven CPU-only tests pass: source/config, complete category partition, inactive nonfinite exclusion, independent population/macro/force reasons, health thresholds, bounded two-state artifact writing, and deadline/source guards. `py_compile` and the real-source default preflight pass. No CUDA import is required by preflight/tests and no GPU was executed here.
|
||||
|
||||
## Root-only admitted execution
|
||||
|
||||
After independent review and root GPU admission:
|
||||
|
||||
```sh
|
||||
CUDA_VISIBLE_DEVICES=<admitted-device> timeout --signal=TERM --kill-after=30s <hard-budget>s python tests/validation/uniform_srt_diagnostic/diagnose_uniform_srt.py --source <exact-9805383-checkout> --execute --gpu-admitted --wall-seconds <soft-budget> --output <new-output-directory>
|
||||
```
|
||||
|
||||
The external watchdog is required for a blocked CUDA call; cooperative wall checks cannot interrupt one. Budget should allow per-step downloads and ~81 MiB evidence writing; this diagnostic is not a performance measurement. The step ceiling cannot be increased by a CLI flag. `READY` is emitted after the first completed step and all observation paths. First physical failure is expected diagnostic evidence and returns exit 2; step cap returns 0. `preflight.json` records the pre-execution configuration, not a completion receipt.
|
||||
|
||||
Original failure files, production source, original pilot runner and gates are untouched. This test-only handoff is based on exact commit 9805383; added diagnostic files are not part of the historical failure source manifest.
|
||||
|
||||
## Historical reporting undercount (not changed here)
|
||||
|
||||
The failed pilot executed to step 320 before its second observation failed. Its summary `steps=160` reflects `begin`, which advances only after an accepted observation. This is a reporting undercount, not evidence that the second batch did not execute. The original failure package and runner/gates are preserved unchanged. This diagnostic records both `executed_steps` and `observation_step`, and labels previous-state steps explicitly. Fixing the historical runner's reporting is a separate change.
|
||||
@@ -60,6 +60,39 @@ extern "C" __global__ void BlockExplode(
|
||||
to[index_f(t % TOTAL_CELLS, q)] = from[q * coarse_cells + d % coarse_cells];
|
||||
}
|
||||
|
||||
// Experimental Schornbaum--Ruede (arXiv:1508.07982, Algorithm 2)
|
||||
// and Chen et al. (doi:10.1016/j.physa.2005.09.036) population interpolation.
|
||||
// Independent implementation of the mathematical stencil; no upstream source copied.
|
||||
// Stencil cells are owner cores; a disabled axis repeats its center twice.
|
||||
extern "C" __global__ void BlockExplodeProjected(
|
||||
const fpxx* coarse, fpxx* fine, const uint64_t* target, const uint64_t* donor,
|
||||
unsigned int count, unsigned long coarse_cells,
|
||||
const uint64_t* neighbors, const float* offsets)
|
||||
{
|
||||
unsigned int row = blockIdx.x * blockDim.x + threadIdx.x;
|
||||
if (row >= count) return;
|
||||
const uint64_t t = target[row], d = donor[row];
|
||||
fpxx* to = fine + (t / TOTAL_CELLS) * NQ * TOTAL_CELLS;
|
||||
for (unsigned int q = 0; q < NQ; ++q) {
|
||||
float v[4];
|
||||
for (unsigned int a = 0; a < 4; ++a) {
|
||||
const uint64_t n = neighbors[4ul * row + a];
|
||||
v[a] = coarse[(n / coarse_cells) * NQ * coarse_cells
|
||||
+ q * coarse_cells + n % coarse_cells];
|
||||
}
|
||||
float gx = .5f * (v[1] - v[0]), gy = .5f * (v[3] - v[2]);
|
||||
const float ex = d_cx[q], ey = d_cy[q];
|
||||
if (q != 0) {
|
||||
const float along = (ex * gx + ey * gy) / (ex * ex + ey * ey);
|
||||
gx -= ex * along;
|
||||
gy -= ey * along;
|
||||
}
|
||||
to[index_f(t % TOTAL_CELLS, q)] =
|
||||
coarse[(d / coarse_cells) * NQ * coarse_cells + q * coarse_cells + d % coarse_cells]
|
||||
+ offsets[2ul * row] * gx + offsets[2ul * row + 1] * gy;
|
||||
}
|
||||
}
|
||||
|
||||
// Targets are receiver-local SOURCE slots for the immediately following pull.
|
||||
// Keep child summation order identical to PatchCoarseStep; no collision here.
|
||||
extern "C" __global__ void BlockCoalesce(
|
||||
|
||||
@@ -22,7 +22,7 @@ from .block_stepper import MAX_GRID_DIM
|
||||
from .hierarchy import build_hierarchy, is_rectangle
|
||||
from .refinement import ACTIVE, HALO, FixedPatch2D, FixedPatchSet2D, prepare_fine_boundary
|
||||
from .refinement_tables import (blocked_base_tables, blocked_fine_tables, # noqa: F401 (re-export)
|
||||
blocked_kind, _prepare_blocked_boundary,
|
||||
blocked_kind, projected_explosion_tables, _prepare_blocked_boundary,
|
||||
BLOCKED_BOUNDARY_DEVICE_COLUMNS)
|
||||
from .descriptors import SOLID
|
||||
from .raw_exchange import summarize_exchange
|
||||
@@ -41,6 +41,7 @@ class _Pair:
|
||||
n_ghosts: int
|
||||
n_rows: int
|
||||
parent_cells: int # parent block window cells (explode donor stride)
|
||||
interpolation: tuple = () # optional neighbor/offset device tables
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -216,7 +217,7 @@ class FixedPatchStepper:
|
||||
fine_block=None, base_block=None, jets=(), child=None, child_block=None,
|
||||
child_objects=(), child_jets=(), child_rectangles_in_parent=None,
|
||||
refinements=None, level_blocks=None, level_objects=None, level_jets=None,
|
||||
observe_raw_exchange=False):
|
||||
observe_raw_exchange=False, explosion="constant"):
|
||||
if HALO != 4:
|
||||
raise RuntimeError("refinement.cu requires a four-cell fine halo")
|
||||
if coarse_boundary not in ("periodic", "slot_reservoir", "channel"):
|
||||
@@ -245,6 +246,15 @@ class FixedPatchStepper:
|
||||
level_blocks = [None if b is None else tuple(b) for b in level_blocks]
|
||||
_check_levels(refinements, level_blocks, level_objects, level_jets)
|
||||
depth = len(refinements) + 1
|
||||
if explosion not in ("constant", "projected_linear"):
|
||||
raise ValueError("explosion must be constant or projected_linear")
|
||||
if explosion == "projected_linear" and (
|
||||
depth != 2 or coarse_boundary != "periodic"
|
||||
or any(b is None for b in level_blocks)
|
||||
or any(level_objects) or any(level_jets)
|
||||
or not (is_rectangle(refinements[0]) or len(refinements[0]) == 1)):
|
||||
raise ValueError("projected explosion requires periodic two-level blocked single rectangle without bodies/Jets")
|
||||
self._explosion = explosion
|
||||
self._ddf_shifting = bool(cfg.ddf_shifting)
|
||||
if self._ddf_shifting and any(b is None for b in level_blocks):
|
||||
raise ValueError("shifted populations require all-blocked levels; dense/mixed is unsupported")
|
||||
@@ -467,6 +477,10 @@ class FixedPatchStepper:
|
||||
self._upload(children), len(ghosts), len(targets),
|
||||
int(np.prod(pair.coarse_shape if parent.layout is None
|
||||
else parent.layout.local_shape)))
|
||||
if self._explosion == "projected_linear":
|
||||
neighbors, offsets = projected_explosion_tables(pair, parent.layout)
|
||||
result.explode = child.module.get_function("BlockExplodeProjected")
|
||||
result.interpolation = (self._upload(neighbors), self._upload(offsets))
|
||||
if child.layout is not None:
|
||||
child.kind = self._upload(blocked_kind(child.layout, self.hierarchy.kinds[index + 1]))
|
||||
if index == 0 and base is not None:
|
||||
@@ -731,7 +745,7 @@ class FixedPatchStepper:
|
||||
"""Explode from the given parent buffer, then two hops of level ``index``."""
|
||||
pair, level = self._pairs[index - 1], self._levels[index]
|
||||
pair.explode(parent_buffer, level.current, pair.ghosts, pair.donors, np.uint32(pair.n_ghosts),
|
||||
np.uint64(pair.parent_cells),
|
||||
np.uint64(pair.parent_cells), *pair.interpolation,
|
||||
grid=((pair.n_ghosts + self._block[0] - 1) // self._block[0], 1), **kw)
|
||||
self._hop(index, level.current, level.spare, **kw)
|
||||
self._hop(index, level.spare, level.current, **kw)
|
||||
|
||||
@@ -66,6 +66,40 @@ def blocked_base_tables(patch, layout, order, wall_aware=False, *, composed_kind
|
||||
blocked_kind(layout, dense_kind))
|
||||
|
||||
|
||||
def projected_explosion_tables(patch, layout):
|
||||
"""Experimental periodic single-rectangle stencil, owner-core cell IDs.
|
||||
|
||||
Schornbaum & Rüde (2016), arXiv:1508.07982, Algorithm 2 explosion
|
||||
interpolation, following Chen et al., Physica A 362 (2006), 158-167,
|
||||
doi:10.1016/j.physa.2005.09.036: centered gradients, perpendicular projection,
|
||||
and child offsets +/-1/4. Independently implemented from the mathematics.
|
||||
Only original explosion donors may supply gradients: this preserves the
|
||||
existing coarse transfer footprint. Missing axis pairs use center twice.
|
||||
Caller must restrict use to two periodic, body-free blocked levels.
|
||||
"""
|
||||
if hasattr(patch, "patches") and len(patch.patches) != 1:
|
||||
raise ValueError("projected explosion requires one rectangle")
|
||||
ny, nx = patch.coarse_shape
|
||||
donor = patch.ghost_coarse.astype(np.intp)
|
||||
legal = np.zeros(ny * nx, bool)
|
||||
legal[donor] = True
|
||||
legal &= layout.owned.ravel() & ~patch.covered.ravel()
|
||||
if not legal[donor].all():
|
||||
raise ValueError("projected explosion donors must be owned uncovered cells")
|
||||
y, x = np.divmod(donor, nx)
|
||||
neighbors = np.repeat(donor[:, None], 4, axis=1)
|
||||
for axis, (dx, dy) in enumerate(((1, 0), (0, 1))):
|
||||
minus = ((y - dy) % ny) * nx + (x - dx) % nx
|
||||
plus = ((y + dy) % ny) * nx + (x + dx) % nx
|
||||
valid = legal[minus] & legal[plus]
|
||||
neighbors[valid, 2 * axis] = minus[valid]
|
||||
neighbors[valid, 2 * axis + 1] = plus[valid]
|
||||
fy, fx = np.divmod(patch.ghost_fine, patch.fine_shape[1])
|
||||
offsets = np.column_stack((fx % 2, fy % 2)).astype(np.float32) * .5 - .25
|
||||
return (np.ascontiguousarray(layout.owner.ravel()[neighbors], dtype=np.uint64),
|
||||
np.ascontiguousarray(offsets))
|
||||
|
||||
|
||||
# Required device columns plus optional actuation; observation arms are uploaded
|
||||
# separately only when enabled. body_id/aperture remain host reduction metadata.
|
||||
BLOCKED_BOUNDARY_DEVICE_COLUMNS = ("block", "cell", "dir", "q", "fallback", "surface_velocity")
|
||||
|
||||
@@ -0,0 +1,204 @@
|
||||
"""CPU stencil and actual closed-interface packet budgets; no CUDA claims."""
|
||||
import numpy as np
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
import shutil
|
||||
import subprocess
|
||||
import tempfile
|
||||
|
||||
from CelerisLab.config import LBMConfig
|
||||
from CelerisLab.lbm.blocks import BlockLayout2D
|
||||
from CelerisLab.lbm.descriptors import D2Q9_EX, D2Q9_EY
|
||||
from CelerisLab.lbm.refinement import FixedPatch2D, FixedPatchSet2D, ACTIVE, OUTER_GHOST
|
||||
from CelerisLab.lbm.refinement_tables import projected_explosion_tables
|
||||
|
||||
E = np.array([D2Q9_EX, D2Q9_EY]).T
|
||||
W = np.array([4/9] + [1/9]*4 + [1/36]*4)
|
||||
|
||||
|
||||
def setup(union=False, bounds=(4, 4, 12, 12)):
|
||||
cfg = LBMConfig(nx=16, ny=16, viscosity=.1)
|
||||
p = (FixedPatchSet2D.from_config(cfg, [bounds]) if union else
|
||||
FixedPatch2D.from_config(cfg, bounds))
|
||||
layout = BlockLayout2D.build(16, 16, 4, 4, periodic=(True, True))
|
||||
neighbors, offsets = projected_explosion_tables(p, layout)
|
||||
inverse = np.full(layout.nblocks * np.prod(layout.local_shape), -1, dtype=int)
|
||||
inverse[layout.owner.ravel()] = np.arange(256)
|
||||
return p, inverse[neighbors], offsets
|
||||
|
||||
|
||||
def reconstruct(c, p, neighbors, offsets, project=True):
|
||||
# Independent NumPy evaluation of the documented stencil; neighbors have
|
||||
# been decoded from actual blocked owner IDs, not recomputed geometry.
|
||||
values = c.reshape(9, -1)[:, neighbors]
|
||||
g = .5 * (values[:, :, 1::2] - values[:, :, ::2])
|
||||
if project:
|
||||
g[1:] -= (np.einsum('qra,qa->qr', g[1:], E[1:]) /
|
||||
np.sum(E[1:]**2, axis=1)[:, None])[:, :, None] * E[1:, None, :]
|
||||
out = c.reshape(9, -1)[:, p.ghost_coarse] + np.einsum('qra,ra->qr', g, offsets)
|
||||
return out, g
|
||||
|
||||
|
||||
def check_legal_footprint_mean_and_characteristic(union, bounds):
|
||||
p, neighbors, offsets = setup(union, bounds)
|
||||
assert set(neighbors.ravel()) <= set(p.ghost_coarse)
|
||||
assert not p.covered.ravel()[neighbors].any()
|
||||
assert (neighbors >= 0).all()
|
||||
c = np.random.default_rng(72).normal(size=(9,16,16))
|
||||
c[:, p.covered] = np.nan # poison every forbidden donor
|
||||
out, g = reconstruct(c, p, neighbors, offsets)
|
||||
assert np.isfinite(out).all()
|
||||
np.testing.assert_allclose(np.einsum('qra,qa->qr', g, E), 0, atol=5e-16)
|
||||
for d in np.unique(p.ghost_coarse):
|
||||
rows = p.ghost_coarse == d
|
||||
assert rows.sum() == 4
|
||||
np.testing.assert_allclose(out[:, rows].mean(axis=1), c.reshape(9,-1)[:,d], atol=5e-16)
|
||||
for q in range(1,9):
|
||||
delta = offsets[rows, None, :] - offsets[None, rows, :]
|
||||
# Parallel displacements have zero 2D cross product.
|
||||
parallel = np.isclose(delta[...,0]*E[q,1]-delta[...,1]*E[q,0], 0)
|
||||
diff = out[q, rows][:,None]-out[q, rows][None,:]
|
||||
np.testing.assert_allclose(diff[parallel], 0, atol=5e-16)
|
||||
const = np.broadcast_to(W[:,None,None], (9,16,16)).copy()
|
||||
constant, _ = reconstruct(const,p,neighbors,offsets)
|
||||
np.testing.assert_array_equal(constant, np.broadcast_to(W[:,None], constant.shape))
|
||||
|
||||
|
||||
def collide(f, tau):
|
||||
rho = f.sum(axis=0)
|
||||
u = np.einsum('qa,q...->a...', E, f) / rho
|
||||
cu = np.einsum('qa,a...->q...', E, u)
|
||||
eq = W[:,None] * rho * (1 + 3*cu + 4.5*cu**2 - 1.5*np.sum(u*u,axis=0))
|
||||
return f + (eq-f)/tau
|
||||
|
||||
|
||||
def totals(c, f, p):
|
||||
q = c[:,~p.covered].sum(axis=1)+.25*f[:,p.fine_kind==ACTIVE].sum(axis=1)
|
||||
return np.r_[q.sum(), E.T@q]
|
||||
|
||||
|
||||
def check_full_two_hop_closed_corner_budget(union, collision, bounds):
|
||||
p, neighbors, offsets = setup(union,bounds)
|
||||
rng=np.random.default_rng(17)
|
||||
c=W[:,None,None]*(1+rng.normal(0,.002,(9,16,16)))
|
||||
f=W[:,None,None]*(1+rng.normal(0,.002,(9,*p.fine_shape)))
|
||||
start=totals(c,f,p)
|
||||
# Count exactly the eight coarse diagonal links whose source is also
|
||||
# uncovered, but whose midpoint lies on the closed rectangular interface.
|
||||
q, k=np.divmod(p.coalesce_coarse.astype(np.int64),256)
|
||||
y,x=np.divmod(k,16)
|
||||
grazing=~p.covered[y-E[q,1],x-E[q,0]]
|
||||
assert grazing.sum()==8
|
||||
c[:,p.covered]=np.nan
|
||||
for _ in range(8):
|
||||
f.reshape(9,-1)[:,p.ghost_fine]=reconstruct(c,p,neighbors,offsets)[0]
|
||||
for _ in range(2):
|
||||
f=np.array([np.roll(f[q],(ey,ex),(0,1)) for q,(ex,ey) in enumerate(E)])
|
||||
f[:,p.fine_kind==OUTER_GHOST]=np.nan
|
||||
if collision:
|
||||
f[:,p.fine_kind==ACTIVE]=collide(f[:,p.fine_kind==ACTIVE],p.tau_fine)
|
||||
out=np.array([np.roll(c[q],(ey,ex),(0,1)) for q,(ex,ey) in enumerate(E)])
|
||||
packets=f.reshape(-1)[p.coalesce_fine].mean(axis=1)
|
||||
assert np.isfinite(packets[grazing]).all()
|
||||
out.reshape(-1)[p.coalesce_coarse]=packets
|
||||
if collision:out[:,~p.covered]=collide(out[:,~p.covered],p.tau_coarse)
|
||||
out[:,p.covered]=np.nan
|
||||
c=out
|
||||
np.testing.assert_allclose(totals(c,f,p),start,rtol=0,atol=2e-12)
|
||||
|
||||
|
||||
def check_projection_is_distinguished_by_characteristic_not_global_mass():
|
||||
p,n,o=setup()
|
||||
c=np.random.default_rng(8).normal(size=(9,16,16))
|
||||
_,g=reconstruct(c,p,n,o,project=False)
|
||||
assert np.max(abs(np.einsum('qra,qa->qr',g,E))) > .1
|
||||
|
||||
|
||||
def check_multiple_rectangles_rejected():
|
||||
cfg=LBMConfig(nx=24,ny=16,viscosity=.1)
|
||||
p=FixedPatchSet2D.from_config(cfg, [(4,4,8,12),(12,4,16,12)])
|
||||
layout=BlockLayout2D.build(16,24,4,4,periodic=(True,True))
|
||||
with unittest.TestCase().assertRaisesRegex(ValueError, 'one rectangle'):
|
||||
projected_explosion_tables(p,layout)
|
||||
|
||||
|
||||
class ProjectedExplosionTests(unittest.TestCase):
|
||||
def test_stencil(self):
|
||||
for union in (False, True):
|
||||
for bounds in ((4,4,12,12),(2,3,9,10),(2,2,3,3)):
|
||||
with self.subTest(union=union,bounds=bounds):
|
||||
check_legal_footprint_mean_and_characteristic(union,bounds)
|
||||
|
||||
def test_closed_interface(self):
|
||||
for union in (False,True):
|
||||
for collision in (False,True):
|
||||
for bounds in ((4,4,12,12),(2,3,14,12),(2,2,3,3)):
|
||||
with self.subTest(union=union,collision=collision,bounds=bounds):
|
||||
check_full_two_hop_closed_corner_budget(union,collision,bounds)
|
||||
|
||||
def test_projection(self):
|
||||
check_projection_is_distinguished_by_characteristic_not_global_mass()
|
||||
|
||||
def test_affine_and_shift_invariance(self):
|
||||
p,n,o=setup()
|
||||
y,x=np.indices((16,16))
|
||||
c=np.array([.7+q*.01+x*.03+y*.05 for q in range(9)])
|
||||
out,g=reconstruct(c,p,n,o)
|
||||
available=n[:,::2]!=n[:,1::2]
|
||||
gradient=np.array([.03,.05])*available
|
||||
expected=np.broadcast_to(gradient,(9,*gradient.shape)).copy()
|
||||
expected[1:]-=(np.einsum('qra,qa->qr',expected[1:],E[1:])/
|
||||
np.sum(E[1:]**2,axis=1)[:,None])[:,:,None]*E[1:,None,:]
|
||||
np.testing.assert_allclose(g,expected,atol=2e-16)
|
||||
shifted,_=reconstruct(c-W[:,None,None],p,n,o)
|
||||
np.testing.assert_allclose(out-W[:,None],shifted,atol=5e-16)
|
||||
|
||||
def test_reject(self):
|
||||
check_multiple_rectangles_rejected()
|
||||
|
||||
|
||||
class ProjectedKernelTests(unittest.TestCase):
|
||||
@unittest.skipUnless(shutil.which("g++"), "g++ is required for actual-kernel CPU arithmetic")
|
||||
def test_actual_kernel_fp32_shifted_and_unshifted(self):
|
||||
p, neighbors, offsets = setup(True)
|
||||
parent = BlockLayout2D.build(16,16,4,4,periodic=(True,True))
|
||||
child = p.fine_layout((8,4)) # deliberately unequal parent/child strides
|
||||
ids, offsets = projected_explosion_tables(p,parent)
|
||||
cells = int(np.prod(parent.local_shape))
|
||||
targets = child.owner.ravel()[p.ghost_fine]
|
||||
donors = parent.owner.ravel()[p.ghost_coarse]
|
||||
source = (Path(__file__).resolve().parents[2] /
|
||||
"src/CelerisLab/lbm/kernels/blocks.cu").read_text()
|
||||
kernel = source.split('extern "C" __global__ void BlockExplodeProjected(',1)[1]
|
||||
kernel = 'void BlockExplodeProjected(' + kernel.split('// Targets are receiver-local SOURCE slots',1)[0]
|
||||
def array(name, values, kind):
|
||||
v = np.asarray(values).ravel()
|
||||
text = ','.join(str(int(x)) if kind=='uint64_t' else float(x).hex()+'f' for x in v)
|
||||
return f"{kind} {name}[] = {{{text}}};\n"
|
||||
for shifted in (False,True):
|
||||
c=np.random.default_rng(11).normal(0,.001,(9,16,16))
|
||||
if not shifted:c+=W[:,None,None]
|
||||
c=c.astype(np.float32)
|
||||
packed=np.full(parent.nblocks*9*cells,np.nan,np.float32)
|
||||
for q in range(9):packed[parent.slot(parent.owner.ravel(),q)]=c[q].ravel()
|
||||
# All halo/covered inputs are poisoned; kernel must use legal cores.
|
||||
for q in range(9):packed[parent.slot(parent.owner.ravel()[p.covered.ravel()],q)]=np.nan
|
||||
# Hex initializer needs a portable expression for poisoned NaNs.
|
||||
data=array('coarse',packed,'float').replace('nanf','NAN')
|
||||
code = '#include <cstdint>\n#include <cmath>\n#include <cstdio>\nusing fpxx=float;\n'
|
||||
code += f'constexpr unsigned NQ=9, TOTAL_CELLS={int(np.prod(child.local_shape))};\n'
|
||||
code += 'struct Id {unsigned x;}; Id blockIdx{0},blockDim{1},threadIdx{0};\n'
|
||||
code += 'unsigned index_f(unsigned k,unsigned q){return q*TOTAL_CELLS+k;}\n'
|
||||
code += 'int d_cx[]={0,1,-1,0,0,1,-1,1,-1},d_cy[]={0,0,0,1,-1,1,-1,-1,1};\n'+kernel
|
||||
code += data+array('target',targets,'uint64_t')+array('donor',donors,'uint64_t')
|
||||
code += array('neighbor',ids,'uint64_t')+array('offset',offsets,'float')
|
||||
code += f'float fine[{child.nblocks*9*int(np.prod(child.local_shape))}]={{}};\n'
|
||||
code += f'int main(){{for(unsigned r=0;r<{len(targets)};++r){{threadIdx.x=r;BlockExplodeProjected(coarse,fine,target,donor,{len(targets)},{cells},neighbor,offset);}}'
|
||||
code += f'for(unsigned q=0;q<9;++q)for(unsigned r=0;r<{len(targets)};++r){{auto t=target[r];printf("%.9g\\n",fine[(t/TOTAL_CELLS)*9*TOTAL_CELLS+q*TOTAL_CELLS+t%TOTAL_CELLS]);}}}}'
|
||||
with tempfile.TemporaryDirectory() as folder:
|
||||
src=Path(folder)/'kernel.cpp'; binary=Path(folder)/'kernel'
|
||||
src.write_text(code)
|
||||
subprocess.run(['g++','-std=c++17','-O2',str(src),'-o',str(binary)],check=True,capture_output=True)
|
||||
result=np.fromstring(subprocess.check_output([str(binary)],text=True),sep=' ').reshape(9,-1)
|
||||
expected,_=reconstruct(c.astype(float),p,neighbors,offsets)
|
||||
np.testing.assert_allclose(result,expected,atol=6e-8,rtol=2e-7)
|
||||
@@ -0,0 +1,145 @@
|
||||
"""Explicit tiny CUDA explosion parity and constructor/one-interval smoke check.
|
||||
|
||||
No installs or device selection defaults. Run only on the authorized GPU host.
|
||||
This is operator/runtime evidence, not Taylor-Green accuracy qualification.
|
||||
"""
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
import numpy as np
|
||||
|
||||
|
||||
def check_case(ctx, shifted, projected):
|
||||
import pycuda.driver as cuda
|
||||
from CelerisLab.config import LBMConfig
|
||||
from CelerisLab.lbm.refinement_stepper import FixedPatchStepper
|
||||
from CelerisLab.lbm.refinement_tables import projected_explosion_tables
|
||||
from CelerisLab.lbm.refinement import ACTIVE
|
||||
from test_projected_explosion import reconstruct, W
|
||||
|
||||
cfg = LBMConfig(nx=16, ny=16, viscosity=.1, velocity=0,
|
||||
ddf_shifting=shifted)
|
||||
cfg.validate()
|
||||
options = {"explosion": "projected_linear"} if projected else {}
|
||||
# Omitting explosion in the constant case tests the production default.
|
||||
with FixedPatchStepper(cfg, context=ctx, refinements=[[(4, 4, 12, 12)]],
|
||||
level_blocks=[(4, 4), (8, 4)], **options) as run:
|
||||
parent, child = run._levels
|
||||
pair = run._pairs[0]
|
||||
patch = run.hierarchy.pairs[0]
|
||||
coarse_cells = int(np.prod(parent.layout.local_shape))
|
||||
fine_cells = int(np.prod(child.layout.local_shape))
|
||||
assert coarse_cells != fine_cells
|
||||
assert pair.parent_cells == coarse_cells
|
||||
assert len(pair.interpolation) == (2 if projected else 0)
|
||||
donor = patch.ghost_coarse.astype(np.intp)
|
||||
# Random variation must exercise the gradient, not just a constant field.
|
||||
c = np.random.default_rng(11).normal(0, .001, (9, 16, 16))
|
||||
if not shifted:
|
||||
c += W[:, None, None]
|
||||
c = c.astype(np.float32)
|
||||
legal = np.zeros(256, bool)
|
||||
legal[donor] = True
|
||||
c.reshape(9, -1)[:, ~legal] = np.nan
|
||||
coarse = np.full(np.prod(parent.layout.blocked_shape), np.nan, np.float32)
|
||||
for q in range(9):
|
||||
coarse[parent.layout.slot(parent.layout.owner.ravel()[legal], q)] = c.reshape(9, -1)[q, legal]
|
||||
fine = np.full(np.prod(child.layout.blocked_shape), np.nan, np.float32)
|
||||
cuda.memcpy_htod(parent.current, coarse)
|
||||
cuda.memcpy_htod(child.current, fine)
|
||||
calls = []
|
||||
real_hop = run._hop
|
||||
try:
|
||||
# Execute the production explosion launch exactly; isolate it from
|
||||
# subsequent streaming/collision without replacing the kernel/tables.
|
||||
run._hop = lambda *args, **kwargs: calls.append(args)
|
||||
run._advance(1, parent.current, block=run._block, stream=run._stream)
|
||||
run._stream.synchronize()
|
||||
finally:
|
||||
run._hop = real_hop
|
||||
assert calls == [(1, child.current, child.spare), (1, child.spare, child.current)]
|
||||
cuda.memcpy_dtoh(fine, child.current)
|
||||
targets = child.layout.owner.ravel()[patch.ghost_fine]
|
||||
slots = np.array([child.layout.slot(targets, q) for q in range(9)])
|
||||
actual = fine[slots]
|
||||
neighbors, offsets = projected_explosion_tables(patch, parent.layout)
|
||||
inverse = np.full(parent.layout.nblocks * coarse_cells, -1, dtype=int)
|
||||
inverse[parent.layout.owner.ravel()] = np.arange(256)
|
||||
constant = c.reshape(9, -1)[:, donor].astype(float)
|
||||
expected = reconstruct(c.astype(float), patch, inverse[neighbors], offsets)[0] if projected else constant
|
||||
assert np.isfinite(actual).all()
|
||||
if projected:
|
||||
assert np.max(np.abs(expected - constant)) > 1e-5
|
||||
np.testing.assert_allclose(actual, expected, atol=6e-8, rtol=2e-7)
|
||||
untouched = np.ones(fine.size, bool)
|
||||
untouched[slots.ravel()] = False
|
||||
assert np.isnan(fine[untouched]).all(), "explosion wrote outside target slots"
|
||||
error = float(np.max(np.abs(actual - expected)))
|
||||
|
||||
# Restore ordinary execution and exercise real constructor wiring,
|
||||
# stream-only ghost hops, restriction, halo copies and collision once.
|
||||
initial = [np.broadcast_to(W[:, None, None], (9, *k.shape)).copy()
|
||||
for k in run.hierarchy.kinds]
|
||||
run.initialize(*initial)
|
||||
run.step(1)
|
||||
for values, kind in zip(run.download(), run.hierarchy.kinds):
|
||||
active = values[:, kind == ACTIVE]
|
||||
assert np.isfinite(active).all()
|
||||
np.testing.assert_allclose(active, np.broadcast_to(W[:, None], active.shape),
|
||||
atol=3e-7, rtol=1e-6)
|
||||
assert run.step_count == 1
|
||||
return dict(shifted=shifted, explosion="projected_linear" if projected else "constant_default",
|
||||
parent_stride=coarse_cells, child_stride=fine_cells,
|
||||
compared_slots=int(actual.size), max_abs_error=error,
|
||||
poisoned_nondonors=True, untouched_slots_preserved=True, equilibrium_step=True)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--repo", type=Path, required=True)
|
||||
parser.add_argument("--output", type=Path, required=True)
|
||||
parser.add_argument("--run-gpu", action="store_true", help="Explicitly opt into GPU execution")
|
||||
args = parser.parse_args()
|
||||
selected = os.environ.get("CUDA_VISIBLE_DEVICES", "")
|
||||
if not args.run_gpu or not selected or "," in selected or selected == "-1":
|
||||
parser.error("--run-gpu and exactly one explicit physical CUDA_VISIBLE_DEVICES are required")
|
||||
if args.output.exists():
|
||||
parser.error("output already exists; choose a new receipt path")
|
||||
root = args.repo.resolve()
|
||||
sys.path[:0] = [str(root / "src"), str(root / "tests/unit"),
|
||||
str(root / "tests/validation/taylor_green")]
|
||||
import CelerisLab
|
||||
if Path(CelerisLab.__file__).resolve() != root / "src/CelerisLab/__init__.py":
|
||||
raise RuntimeError("Wrong imported source checkout")
|
||||
from run_case import provenance
|
||||
report = dict(source=provenance(root),
|
||||
numpy_oracle_sha256=hashlib.sha256((root / "tests/unit/test_projected_explosion.py").read_bytes()).hexdigest(),
|
||||
cuda_visible_devices=selected,
|
||||
logical_device=0, completed=False, cases=[])
|
||||
args.output.parent.mkdir(parents=True, exist_ok=True)
|
||||
def save():
|
||||
args.output.write_text(json.dumps(report, indent=2, allow_nan=False) + "\n")
|
||||
save()
|
||||
try:
|
||||
from CelerisLab.cuda.context import CudaContext
|
||||
with CudaContext(0) as ctx:
|
||||
report["device"] = ctx.device.name()
|
||||
for shifted in (False, True):
|
||||
for projected in (False, True):
|
||||
report["cases"].append(check_case(ctx, shifted, projected))
|
||||
save()
|
||||
report["completed"] = True
|
||||
save()
|
||||
except Exception as exc:
|
||||
report["error"] = f"{type(exc).__name__}: {exc}"
|
||||
save()
|
||||
raise
|
||||
print(json.dumps(report, indent=2))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,101 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"implementation_revision": "43c527b",
|
||||
"historical_baseline_revision": "9805383f9c50d867e8555471baf5dbda8333a652",
|
||||
"scope": "Re100 depth2; FP64 CPU arrival_f macro diagnostics, not candidate CUDA execution or performance",
|
||||
"tstar": 0.48,
|
||||
"cases": [
|
||||
{
|
||||
"n": 32,
|
||||
"historical_gpu_report": "CelerisLab_9805383_tg_matched_re100_n32_d2.json",
|
||||
"historical_gpu_sha256": "6e84837781f2c4eb001721d6f828ea0d927b255fd4c46efdef443a9ae59af730",
|
||||
"constant_max_abs_cpu_gpu_metric_difference": {
|
||||
"velocity_l2": 6.928351422436085e-08,
|
||||
"pressure_l2": 3.5717157327030957e-06,
|
||||
"energy_relative": 2.1743219684455806e-07
|
||||
},
|
||||
"runs": [
|
||||
{
|
||||
"explosion": "constant",
|
||||
"final": {
|
||||
"velocity_l2": 0.03249421441793122,
|
||||
"pressure_l2": 0.08986961517973119,
|
||||
"energy_relative": 0.044970292392050686,
|
||||
"amplitude_bias": -0.02307193176461997,
|
||||
"orthogonal_residual_l2": 0.022881432107435998,
|
||||
"mass_signed_relative": -7.616129948928574e-14,
|
||||
"momentum_change": [
|
||||
-3.26405569239796e-14,
|
||||
-2.7000103541841014e-14
|
||||
]
|
||||
},
|
||||
"max_abs_mass_relative": 7.616129948928574e-14,
|
||||
"max_abs_momentum_change": 3.608224830031759e-14
|
||||
},
|
||||
{
|
||||
"explosion": "projected_linear",
|
||||
"final": {
|
||||
"velocity_l2": 0.015226371368103809,
|
||||
"pressure_l2": 0.048560123195715434,
|
||||
"energy_relative": 0.02285059695090361,
|
||||
"amplitude_bias": -0.011601431258836059,
|
||||
"orthogonal_residual_l2": 0.009861499773660909,
|
||||
"mass_signed_relative": -7.616129948928574e-14,
|
||||
"momentum_change": [
|
||||
-4.030109579389318e-14,
|
||||
-2.3444787777826548e-15
|
||||
]
|
||||
},
|
||||
"max_abs_mass_relative": 7.616129948928574e-14,
|
||||
"max_abs_momentum_change": 4.030109579389318e-14
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"n": 64,
|
||||
"historical_gpu_report": "CelerisLab_9805383_tg_re100_n64_d2.json",
|
||||
"historical_gpu_sha256": "251f743d6adc33dff1d829db91fcc5f982c9ac299c177eb2c94e313249b25b9f",
|
||||
"constant_max_abs_cpu_gpu_metric_difference": {
|
||||
"velocity_l2": 1.7330029265794078e-08,
|
||||
"pressure_l2": 8.634212284933107e-07,
|
||||
"energy_relative": 8.74280938097105e-08
|
||||
},
|
||||
"runs": [
|
||||
{
|
||||
"explosion": "constant",
|
||||
"final": {
|
||||
"velocity_l2": 0.01131134574353476,
|
||||
"pressure_l2": 0.03550495463085949,
|
||||
"energy_relative": 0.012514764591008386,
|
||||
"amplitude_bias": -0.006336459299048802,
|
||||
"orthogonal_residual_l2": 0.009369942693596348,
|
||||
"mass_signed_relative": -1.412203687323199e-13,
|
||||
"momentum_change": [
|
||||
-2.1049828546892968e-13,
|
||||
-1.632548263241773e-14
|
||||
]
|
||||
},
|
||||
"max_abs_mass_relative": 1.412203687323199e-13,
|
||||
"max_abs_momentum_change": 2.1049828546892968e-13
|
||||
},
|
||||
{
|
||||
"explosion": "projected_linear",
|
||||
"final": {
|
||||
"velocity_l2": 0.004930396085095945,
|
||||
"pressure_l2": 0.016580125701009935,
|
||||
"energy_relative": 0.0056291365148441195,
|
||||
"amplitude_bias": -0.0028419317091766816,
|
||||
"orthogonal_residual_l2": 0.004028924138812507,
|
||||
"mass_signed_relative": -1.4099832412739488e-13,
|
||||
"momentum_change": [
|
||||
-1.709743457922741e-13,
|
||||
7.568945470382005e-14
|
||||
]
|
||||
},
|
||||
"max_abs_mass_relative": 1.4099832412739488e-13,
|
||||
"max_abs_momentum_change": 1.709743457922741e-13
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
"""One bounded GPU case. No production edits, plots, checkpoints or field dumps."""
|
||||
"""One bounded GPU case, with explicit opt-in experimental explosion."""
|
||||
|
||||
import argparse
|
||||
import hashlib
|
||||
@@ -75,7 +75,10 @@ def main():
|
||||
p.add_argument("--n", type=int, choices=[32, 64, 128, 256], required=True)
|
||||
p.add_argument("--depth", type=int, choices=[1, 2, 3], required=True)
|
||||
p.add_argument("--output", type=Path, required=True)
|
||||
p.add_argument("--explosion", choices=["constant", "projected_linear"], default="constant")
|
||||
args = p.parse_args()
|
||||
if args.explosion != "constant" and args.depth != 2:
|
||||
p.error("projected_linear requires depth 2")
|
||||
if not os.environ.get("CUDA_VISIBLE_DEVICES"):
|
||||
p.error("Explicit physical CUDA_VISIBLE_DEVICES selection required")
|
||||
repo = args.repo.resolve()
|
||||
@@ -99,6 +102,8 @@ def main():
|
||||
report = dict(
|
||||
schema=1,
|
||||
source=provenance(repo),
|
||||
historical_baseline_revision="9805383f9c50d867e8555471baf5dbda8333a652",
|
||||
explosion=args.explosion,
|
||||
n=args.n,
|
||||
re_L=args.re,
|
||||
depth=args.depth,
|
||||
@@ -132,6 +137,7 @@ def main():
|
||||
coarse_boundary="periodic",
|
||||
refinements=refinements,
|
||||
level_blocks=[(8, 8)] * args.depth,
|
||||
explosion=args.explosion,
|
||||
)
|
||||
with run:
|
||||
run.initialize(
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
"""Diagnostic-only rectangular adapter to CPUREF-0.3. No production changes."""
|
||||
import sys,json,time,argparse,hashlib
|
||||
from pathlib import Path
|
||||
import numpy as np
|
||||
parser=argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--repo',type=Path,required=True,help='Candidate checkout at 43c527b')
|
||||
parser.add_argument('--n',type=int,choices=(32,64),default=32)
|
||||
parser.add_argument('--output-dir',type=Path,required=True)
|
||||
args=parser.parse_args()
|
||||
ROOT=args.repo.resolve()
|
||||
sys.path[:0]=[str(ROOT/'src'),str(ROOT/'tests/validation/multigrid'),str(ROOT/'tests/validation/taylor_green'),str(ROOT/'tests/unit')]
|
||||
import cpu_reference as cpu
|
||||
import oracle
|
||||
from run_case import provenance
|
||||
from test_projected_explosion import reconstruct
|
||||
from CelerisLab.config import LBMConfig
|
||||
from CelerisLab.lbm.refinement import FixedPatchSet2D
|
||||
from CelerisLab.lbm.refinement_tables import projected_explosion_tables
|
||||
from CelerisLab.lbm.blocks import BlockLayout2D
|
||||
class RectSpec(cpu.Spec):
|
||||
@property
|
||||
def n_fine(self): return 2*self.n_coarse
|
||||
|
||||
def setup(n):
|
||||
nu=oracle.U*n/100
|
||||
cfg=LBMConfig(nx=n,ny=n,viscosity=nu)
|
||||
bounds=oracle.rectangles(n,2)[0]
|
||||
p=FixedPatchSet2D.from_config(cfg,bounds)
|
||||
spec=RectSpec(n_coarse=n,patch_lo=n//8,patch_hi=7*n//8,halo=n//4,tau_coarse=p.tau_coarse,tau_fine=p.tau_fine,collision='srt')
|
||||
q,k=np.divmod(p.coalesce_coarse.astype(int),n*n); y,x=np.divmod(k,n)
|
||||
rows=np.column_stack((q,y,x)); links=[]
|
||||
for qi,yi,xi in rows:
|
||||
sx,sy=xi-cpu.CX[qi],yi-cpu.CY[qi]
|
||||
if not p.covered[sy,sx]: links.append(cpu.CornerLink(f'{xi}_{yi}_q{qi}',int(qi),(int(sx),int(sy)),(int(xi),int(yi))))
|
||||
assert len(links)==8
|
||||
maps=cpu.Maps(~p.covered,p.covered,p.fine_kind==0,p.fine_kind==1,p.fine_kind==2,p.fine_kind,np.arange(2*n)//2,(np.arange(2*n)+.5)/2,rows,tuple(links))
|
||||
# Verify the CPU coalescence child locations equal actual production tables.
|
||||
children=np.array([[qi*(2*n)**2+(2*yi+dy)*2*n+2*xi+dx for dy in (0,1) for dx in (0,1)] for qi,yi,xi in rows])
|
||||
np.testing.assert_array_equal(children,p.coalesce_fine)
|
||||
layout=BlockLayout2D.build(n,n,8,8,periodic=(True,True))
|
||||
neighbors,offsets=projected_explosion_tables(p,layout)
|
||||
inverse=np.full(layout.nblocks*np.prod(layout.local_shape),-1,dtype=int)
|
||||
inverse[layout.owner.ravel()]=np.arange(n*n)
|
||||
neighbors=inverse[neighbors]
|
||||
def explode(gc,cv,gf,fv,m,writes):
|
||||
# Only actual transfer footprint, including inner and outer ghost slabs.
|
||||
gy,gx=np.divmod(p.ghost_fine.astype(int),2*n)
|
||||
if mode[0]=='constant': values=gc.reshape(9,-1)[:,p.ghost_coarse]
|
||||
else: values=reconstruct(gc,p,neighbors,offsets)[0]
|
||||
assert np.isfinite(values).all()
|
||||
gf[:,gy,gx]=values; fv[:,gy,gx]=True; writes[gy,gx]+=1
|
||||
mode=['constant']; cpu._explode=explode
|
||||
return spec,maps,p,mode,nu
|
||||
|
||||
def run(n,which):
|
||||
spec,m,p,mode,nu=setup(n); mode[0]=which
|
||||
masks=[m.coarse_active,m.fine_active]
|
||||
arrays=[oracle.initial(mask.shape,l,n,nu) for l,mask in enumerate(masks)]
|
||||
for a,mask in zip(arrays,masks):a[:,~mask]=np.nan
|
||||
s=cpu.State(*arrays); rows=[]; initmass=None; momentum0=None; start=time.monotonic()
|
||||
for tstar in oracle.TIMES:
|
||||
step=round(tstar*n/oracle.U)
|
||||
while s.tick<2*step: s,_=cpu.advance_coarse_once(spec,m,s)
|
||||
arrays=[s.coarse_f,s.fine_f]
|
||||
row=oracle.metrics(arrays,masks,step,n,nu,initmass)
|
||||
if initmass is None:initmass=row['mass']
|
||||
dot=den=res=0.; parts=[]; momentum=np.zeros(2)
|
||||
for l,(a,mask) in enumerate(zip(arrays,masks)):
|
||||
v=a[:,mask];rho=v.sum(0);u=cpu.CX@v/rho;w=cpu.CY@v/rho
|
||||
x,y=oracle.centers(mask.shape,l);ex,ey,_=oracle.exact(x[mask],y[mask],step,n,nu);vol=.25**l
|
||||
dot+=vol*np.sum(u*ex+w*ey);den+=vol*np.sum(ex*ex+ey*ey)
|
||||
parts.append((u,w,ex,ey,vol));momentum+=vol*np.array([np.sum(cpu.CX@v),np.sum(cpu.CY@v)])
|
||||
amp=dot/den
|
||||
res=sum(vol*np.sum((u-amp*ex)**2+(w-amp*ey)**2) for u,w,ex,ey,vol in parts)
|
||||
if momentum0 is None:momentum0=momentum.copy()
|
||||
row.update(step=step,exact_energy_quadrature_factor=den/(2*n*n*row['exact_energy']),amplitude_ratio=amp,amplitude_bias=amp-1,orthogonal_residual_l2=float(np.sqrt(res/den)),energy_signed_relative=row['energy']/row['exact_energy']-1,mass_signed_relative=row['mass']/initmass-1,momentum=momentum.tolist(),momentum_change=(momentum-momentum0).tolist())
|
||||
rows.append(row)
|
||||
return dict(n=n,explosion=which,seconds=time.monotonic()-start,rows=rows)
|
||||
if __name__=='__main__':
|
||||
a=args
|
||||
a.output_dir.mkdir(parents=True,exist_ok=True)
|
||||
result=dict(implementation_revision='43c527b',source=provenance(ROOT),diagnostic_input_sha256={name:hashlib.sha256((ROOT/name).read_bytes()).hexdigest() for name in ('tests/validation/multigrid/cpu_reference.py','tests/unit/test_projected_explosion.py')},precision='FP64 physical populations',phase='arrival_f; macro moments invariant under collision, initialization equilibrium',runs=[])
|
||||
out=a.output_dir/f'n{a.n}_ab.json'
|
||||
for mode in ('constant','projected_linear'):
|
||||
r=run(a.n,mode);result['runs'].append(r);out.write_text(json.dumps(result,indent=2)+'\n');print(json.dumps(r),flush=True)
|
||||
@@ -1,12 +0,0 @@
|
||||
unittest.case.FunctionTestCase (test_bounded_state_evidence) ... ok
|
||||
unittest.case.FunctionTestCase (test_disjoint_complete_categories) ... ok
|
||||
unittest.case.FunctionTestCase (test_exact_config_and_source) ... ok
|
||||
unittest.case.FunctionTestCase (test_inactive_nonfinite_does_not_fail) ... ok
|
||||
unittest.case.FunctionTestCase (test_original_safety_limits) ... ok
|
||||
unittest.case.FunctionTestCase (test_population_macro_force_separate) ... ok
|
||||
unittest.case.FunctionTestCase (test_source_guard_and_deadline) ... ok
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 7 tests in 0.039s
|
||||
|
||||
OK
|
||||
@@ -1,219 +0,0 @@
|
||||
"""Read-only observations of the exact failed SRT control, at most 320 steps.
|
||||
|
||||
Default is CPU preflight. Execution requires root admission and an external watchdog.
|
||||
No solver, initialization, geometry or numerical parameter modifications.
|
||||
"""
|
||||
import argparse
|
||||
import hashlib
|
||||
import importlib
|
||||
import json
|
||||
import math
|
||||
import os
|
||||
from pathlib import Path
|
||||
import sys
|
||||
import time
|
||||
from tempfile import TemporaryDirectory
|
||||
|
||||
import numpy as np
|
||||
|
||||
HERE=Path(__file__).resolve().parent
|
||||
DEFAULT_SOURCE=HERE.parents[2]
|
||||
LIMIT_BYTES=128*1024**2
|
||||
|
||||
|
||||
def dump(path,value):
|
||||
path.write_text(json.dumps(value,indent=2,allow_nan=False))
|
||||
|
||||
|
||||
def number(value):
|
||||
value=float(value)
|
||||
return value if math.isfinite(value) else ('NaN' if math.isnan(value) else ('+Inf' if value>0 else '-Inf'))
|
||||
|
||||
|
||||
def source_config(source):
|
||||
manifest=json.loads((HERE/'source_manifest.json').read_text())
|
||||
for name,digest in manifest['sha256'].items():
|
||||
if hashlib.sha256((source/name).read_bytes()).hexdigest()!=digest:
|
||||
raise ValueError('Pinned source mismatch: '+name)
|
||||
sys.path.insert(0,str(source/'src')); sys.path.insert(0,str(source/'tests/validation'))
|
||||
import CelerisLab
|
||||
if Path(CelerisLab.__file__).resolve()!=source/'src/CelerisLab/__init__.py':
|
||||
raise ValueError('Wrong CelerisLab import')
|
||||
runner=importlib.import_module('run_refined_dfg')
|
||||
if Path(runner.__file__).resolve()!=source/'tests/validation/run_refined_dfg.py':
|
||||
raise ValueError('Wrong runner import')
|
||||
h,_=runner.helpers(source)
|
||||
cfg,body,p=runner.config(h,80) # Exact original config factory, not a reimplementation.
|
||||
return cfg,body,p,manifest
|
||||
|
||||
|
||||
def categories(flags,p):
|
||||
"""Disjoint physical categories; subtype nibble is not a bitfield."""
|
||||
from CelerisLab.lbm.descriptors import FLUID,SOLID,OBSTACLE
|
||||
y,x=np.indices(flags.shape); fluid=(flags&FLUID)!=0
|
||||
masks={}; left=fluid.copy()
|
||||
for name,test in (
|
||||
('body_near',(x-p['center'][0])**2+(y-p['center'][1])**2 <= (p['radius']+3)**2),
|
||||
('outlet_near',x>=flags.shape[1]-4),('inlet_near',x<=3),
|
||||
('wall_near',(y<=3)|(y>=flags.shape[0]-4))):
|
||||
masks[name]=left&test; left &= ~test
|
||||
masks['bulk']=left
|
||||
subtype=flags&0xf0
|
||||
masks['inlet_ghost']=(~fluid)&(subtype==0x20)
|
||||
masks['outlet_ghost']=(~fluid)&(subtype==0x30)
|
||||
masks['wall_ghost']=(~fluid)&(subtype==0x10)
|
||||
assigned=np.logical_or.reduce(list(masks.values()))
|
||||
masks['body_solid']=(~assigned)&(((flags&OBSTACLE)!=0)|((flags&SOLID)!=0))
|
||||
assigned|=masks['body_solid']; masks['other_inactive']=~assigned
|
||||
return fluid,masks
|
||||
|
||||
|
||||
def finite_extrema(a,mask):
|
||||
good=mask&np.isfinite(a)
|
||||
if not good.any(): return dict(min=None,max=None)
|
||||
idx=np.flatnonzero(good); values=a.ravel()[idx]
|
||||
lo=int(idx[np.argmin(values)]); hi=int(idx[np.argmax(values)])
|
||||
return dict(min=float(a.ravel()[lo]),max=float(a.ravel()[hi]),
|
||||
min_yx=list(map(int,np.unravel_index(lo,a.shape))),
|
||||
max_yx=list(map(int,np.unravel_index(hi,a.shape))))
|
||||
|
||||
|
||||
def diagnose(g,macro,force,flags,p,step):
|
||||
fluid,masks=categories(flags,p)
|
||||
badpop=~np.isfinite(g); badnode=badpop.any(axis=0)
|
||||
badmacro=np.logical_or.reduce([~np.isfinite(macro[k]) for k in ('rho','ux','uy')])
|
||||
with np.errstate(over='ignore',invalid='ignore'):
|
||||
mach=np.sqrt(3*(np.asarray(macro['ux'],np.float64)**2+np.asarray(macro['uy'],np.float64)**2))
|
||||
rho=macro['rho']
|
||||
# Exactly the original physical macro/reaction conditions, now sampled each step.
|
||||
nonfinite_macro=bool(np.any(badmacro&fluid))
|
||||
force_bad=force is not None and not np.isfinite(force).all()
|
||||
density_bad=bool(np.any(fluid&((rho<.5)|(rho>1.5))))
|
||||
mach_bad=bool(np.any(fluid&(mach>.2)))
|
||||
population_bad=bool(np.any(badnode&fluid))
|
||||
original_failure=nonfinite_macro or force_bad or density_bad or mach_bad
|
||||
offending=fluid&(badnode|badmacro|(rho<.5)|(rho>1.5)|(mach>.2))
|
||||
examples=[]
|
||||
for y,x in np.argwhere(offending)[:16]:
|
||||
examples.append(dict(y=int(y),x=int(x),physical_xy_m=[float(x*p['dx']),float((y-.5)*p['dx'])],
|
||||
category=next(name for name,mask in masks.items() if mask[y,x]),flag=int(flags[y,x]),
|
||||
nonfinite_q=np.flatnonzero(badpop[:,y,x]).tolist(),
|
||||
populations=[number(v) for v in g[:,y,x]],
|
||||
rho=number(rho[y,x]),ux=number(macro['ux'][y,x]),uy=number(macro['uy'][y,x])))
|
||||
neighborhoods=[]
|
||||
for node in examples[:4]:
|
||||
y,x=node['y'],node['x']; y0,y1=max(0,y-2),min(flags.shape[0],y+3); x0,x1=max(0,x-2),min(flags.shape[1],x+3)
|
||||
neighborhoods.append(dict(bounds_xy=[x0,y0,x1,y1],flags=flags[y0:y1,x0:x1].tolist(),
|
||||
physical_populations=[[[number(v) for v in row] for row in plane] for plane in g[:,y0:y1,x0:x1]]))
|
||||
return dict(step=step,tstar=step*p['mean_speed']/p['diameter'],
|
||||
physical_failure=bool(original_failure or population_bad),
|
||||
original_health_failure=bool(original_failure),
|
||||
physical_population_nonfinite=population_bad,physical_macro_nonfinite=nonfinite_macro,
|
||||
force_nonfinite=bool(force_bad),density_limit=density_bad,mach_limit=mach_bad,
|
||||
force=None if force is None else [number(v) for v in force],
|
||||
categories={name:dict(nodes=int(mask.sum()),nonfinite_population_nodes=int((mask&badnode).sum()),
|
||||
nonfinite_populations=int(badpop[:,mask].sum()),nonfinite_macro_nodes=int((mask&badmacro).sum()))
|
||||
for name,mask in masks.items()},
|
||||
rho=finite_extrema(rho,fluid),mach=finite_extrema(mach,fluid),
|
||||
first_physical_examples=examples,local_neighborhoods=neighborhoods)
|
||||
|
||||
|
||||
def snapshot(sim,p):
|
||||
# Public physical decode and original production macro path. No host reconstruction
|
||||
# substitutes for the original health check. get_ddf shares its completed-step cache.
|
||||
with np.errstate(all='ignore'):
|
||||
macro={k:np.asarray(v).copy() for k,v in sim.get_macroscopic().items()}
|
||||
g=sim.get_ddf().reshape(9,p['ny'],p['nx'])
|
||||
import pycuda.driver as cuda
|
||||
raw=np.empty_like(g,dtype=np.float32)
|
||||
with sim.ctx.activate():
|
||||
cuda.memcpy_dtoh(raw,sim.field.ddf_gpu)
|
||||
return dict(raw=raw,g=g,macro=macro,step=int(sim.stepper.step_count))
|
||||
|
||||
|
||||
def save_states(dest,previous,current,flags,diagnostic):
|
||||
"""Two states only; raw shifted bits and decoded observations, no trajectory."""
|
||||
arrays={'flags':flags}
|
||||
for name,state in (('previous',previous),('current',current)):
|
||||
if state is None: continue
|
||||
arrays[name+'_raw_shifted']=state['raw']
|
||||
arrays[name+'_physical']=state['g']
|
||||
arrays[name+'_step']=np.array(state['step'],np.int64)
|
||||
# At D80, raw+physical for two states ~84 MiB; reserve >4 MiB for JSON/NPZ overhead.
|
||||
if sum(v.nbytes for v in arrays.values())>LIMIT_BYTES-4*1024**2:
|
||||
raise ValueError('Evidence arrays exceed bounded artifact budget')
|
||||
np.savez(dest/'states.npz',**arrays)
|
||||
dump(dest/'diagnostics.json',diagnostic)
|
||||
size=sum(p.stat().st_size for p in dest.iterdir() if p.is_file())
|
||||
if size>LIMIT_BYTES: raise RuntimeError('Evidence directory exceeds 128 MiB')
|
||||
return size
|
||||
|
||||
|
||||
def deadline_check(deadline):
|
||||
if time.monotonic()>=deadline: raise TimeoutError('Diagnostic wall ceiling reached')
|
||||
|
||||
|
||||
def execute(a,cfg,body,p):
|
||||
from CelerisLab.simulation import Simulation
|
||||
started=time.monotonic(); deadline=started+a.wall_seconds
|
||||
previous=None; prior_report=None; initial_report=None
|
||||
with TemporaryDirectory() as temp:
|
||||
temp=Path(temp); dump(temp/'lbm.json',cfg); dump(temp/'body.json',body)
|
||||
with Simulation(str(temp/'lbm.json'),str(temp/'body.json'),device_id=0) as sim:
|
||||
sim.initialize() # Exact original production initialization, unchanged.
|
||||
flags=sim.get_flags().reshape(p['ny'],p['nx'])
|
||||
current=snapshot(sim,p)
|
||||
initial_report=diagnose(current['g'],current['macro'],None,flags,p,0)
|
||||
report=initial_report; status='initial_physical_failure' if report['physical_failure'] else 'step_cap_reached'
|
||||
try:
|
||||
deadline_check(deadline)
|
||||
if not report['physical_failure']:
|
||||
for _ in range(320):
|
||||
deadline_check(deadline)
|
||||
previous=current; prior_report=report
|
||||
sim.run(1) # Same solver; observation buffers reset/read once per step.
|
||||
force=sim.read_force(0).astype(np.float64)
|
||||
current=snapshot(sim,p)
|
||||
report=diagnose(current['g'],current['macro'],force,flags,p,current['step'])
|
||||
if current['step']==1:
|
||||
print('READY '+json.dumps(dict(step=1,all_observation_paths_exercised=True,
|
||||
physical_healthy=not report['physical_failure']),allow_nan=False),flush=True)
|
||||
if report['physical_failure']:
|
||||
status='first_physical_failure'; break
|
||||
deadline_check(deadline)
|
||||
except TimeoutError:
|
||||
status='wall_time_limit'
|
||||
details=dict(status=status,executed_steps=int(sim.stepper.step_count),
|
||||
observation_step=current['step'],previous_observation_step=None if previous is None else previous['step'],
|
||||
initial=initial_report,preceding=prior_report,current=report,
|
||||
wall_seconds=time.monotonic()-started,
|
||||
storage='raw_shifted FP32 is exact active-buffer data; physical is production FP32 decoded G. Both are diagnostic snapshots, not complete restart checkpoints.',
|
||||
health_scope='Physical FLUID nodes and force only; ghost/body categories cannot independently trigger physical failure.',
|
||||
interpretation='Near-region labels locate symptoms, not the root cause. Per-step inspection changes observation cadence only. No physical acceptance.')
|
||||
size=save_states(a.output,previous,current,flags,details)
|
||||
print(json.dumps(dict(status=status,executed_steps=int(sim.stepper.step_count),evidence_bytes=size),allow_nan=False),flush=True)
|
||||
return 0 if status=='step_cap_reached' else 2
|
||||
|
||||
|
||||
def main():
|
||||
parser=argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--source',type=Path,default=DEFAULT_SOURCE)
|
||||
parser.add_argument('--output',type=Path,required=True)
|
||||
parser.add_argument('--execute',action='store_true')
|
||||
parser.add_argument('--gpu-admitted',action='store_true')
|
||||
parser.add_argument('--wall-seconds',type=float)
|
||||
a=parser.parse_args(); a.source=a.source.resolve()
|
||||
cfg,body,p,manifest=source_config(a.source)
|
||||
if a.output.exists() and any(a.output.iterdir()): raise ValueError('Use a new/empty output directory')
|
||||
if a.execute and (not a.gpu_admitted or not os.environ.get('CUDA_VISIBLE_DEVICES') or
|
||||
a.wall_seconds is None or not math.isfinite(a.wall_seconds) or a.wall_seconds<=0):
|
||||
raise ValueError('Explicit root admission, device selection and finite wall ceiling required')
|
||||
a.output.mkdir(parents=True,exist_ok=True)
|
||||
dump(a.output/'preflight.json',dict(source=manifest,config=cfg,body=body,parameters=p,
|
||||
diagnostic_sha256=hashlib.sha256(Path(__file__).read_bytes()).hexdigest(),max_steps=320,
|
||||
max_evidence_bytes=LIMIT_BYTES,executed=False))
|
||||
if not a.execute: return 0
|
||||
return execute(a,cfg,body,p)
|
||||
|
||||
|
||||
if __name__=='__main__': raise SystemExit(main())
|
||||
@@ -1,112 +0,0 @@
|
||||
{
|
||||
"commit": "9805383f9c50d867e8555471baf5dbda8333a652",
|
||||
"failure_source_receipt_sha256": "a77f71550c52d4b8b6e946a3cb98fc5de5db3da1bcbbb3457c6d60167677ce4e",
|
||||
"sha256": {
|
||||
"src/CelerisLab/__init__.py": "21cc469bd6e970a1f9ff5970c8eea4602065e41fc881854759ee565ee55c10c6",
|
||||
"src/CelerisLab/body/__init__.py": "e4e0e8f0769a94428d5b02fac790443997556cfc5515a5f1ed1595d2c694d69d",
|
||||
"src/CelerisLab/body/action_smoother.py": "b1a23ee6bbd4850b172cb8738c5c3546ee465a54189e6af9d8044f023d4687dc",
|
||||
"src/CelerisLab/body/coupling/__init__.py": "c931f7eb318d48408c3e2febcc6917c88c8dcc1697cbf4329b1f340d94c35763",
|
||||
"src/CelerisLab/body/coupling/soa_packer.py": "8ec26fd55ef74801bbd5ab6bd3d0a7dabc750cbd498aaac2ca4c61a0108ad3c9",
|
||||
"src/CelerisLab/body/ddf_patch.py": "60fcfb7441e73bf290bcff41ca3a83da3e7ddad765d7247464e8f02e3043b4e2",
|
||||
"src/CelerisLab/body/geometry/__init__.py": "ada88980ab672959aca9aa3a4c4aade3219524b2ab68110cd2a2f41e3e0ca90a",
|
||||
"src/CelerisLab/body/geometry/base.py": "cceca14361ca2f34d34a3e43730e1a79b8ca81be00f0dd62e884db32b479419f",
|
||||
"src/CelerisLab/body/geometry/circle.py": "7605ca7c21103f1d801ac73ab8dd18dffbdac425b2dee7b8858b283628a9e436",
|
||||
"src/CelerisLab/body/jets.py": "4104c24af4651f4bb4f8d8fd36fb6d88f41c6e4469822f36e22e74c9ede31dac",
|
||||
"src/CelerisLab/body/manager.py": "01b653d25bd9b4333379c8bfd12383596b686d2029f2e91b1c91b618540ec6b3",
|
||||
"src/CelerisLab/body/objects.py": "8e63cee8faa9cc6243bcff428be628dfad73a02a9a3b8ece7d78c0a63406a08d",
|
||||
"src/CelerisLab/body/preprocess/__init__.py": "dfd9d58bc07f626ab23a70053e31b88a6d9165d2e4c76a4e9f48abe674d3d2ec",
|
||||
"src/CelerisLab/body/preprocess/flag_overlay.py": "831fc9e9736b758847759a085ff133eb49ec91318ace4fda76f85960138ee300",
|
||||
"src/CelerisLab/body/registry.py": "fbb7327780adbdc6da15ebdb799980daf32df22ee974af0893d7409f177bbb68",
|
||||
"src/CelerisLab/body/sync_plan.py": "3a15bfe9ebeb91482dbfc68850761ef39c872cc12d2efc795babd0c01e392323",
|
||||
"src/CelerisLab/common/__init__.py": "d4dbde78bc97fccc9eabac9abae8f0f15c112c10ff8e9b45bd9401d4723df1ef",
|
||||
"src/CelerisLab/common/_types.py": "aad2ff1a9033d4fd68783ad7123afb47201ddc58785cb6dc0246947037072a5f",
|
||||
"src/CelerisLab/common/checkpoint.py": "b2f960aecd5ac27a3a7130b809ffad4709c44d522edef0359ab952654625410b",
|
||||
"src/CelerisLab/common/pathline.py": "a1b6efcc0a076d0f1dc8d49a595779426d7d5626b00072a59bac710ff02ad046",
|
||||
"src/CelerisLab/common/preprocess.py": "7fc78a08857cf8e98519500b094a1d896af189b6b15658ff9b388ed51bed4515",
|
||||
"src/CelerisLab/common/render.py": "0e055476257eb2bcd11e733766e52195de02f8fad228f570a3511a7c831bdc29",
|
||||
"src/CelerisLab/common/streakline/__init__.py": "13ff1cfa416fdd721a08a659e76b5a5a99b8d3201add10a83b7b0bc654bc1eec",
|
||||
"src/CelerisLab/common/streakline/_config.py": "a9185ef68e9c7b5d5a1dc0b04a28341e2ad91d13c145a7c106636a878cf0a605",
|
||||
"src/CelerisLab/common/streakline/_integrate.py": "3fbd4368b2c8d0e7fda40dc65aac5df02b085008b4c68acd83cb7ae45d33a13b",
|
||||
"src/CelerisLab/common/streakline/_render.py": "236cd637414ee318c4d66f9aed32110d8dc42a100d65fde06172f7cd0ba62c65",
|
||||
"src/CelerisLab/common/streakline/_streakline.py": "1a3e08daa706b5f83cdeb337e9a945a36ddf7583c40af1d0bb9d825ac954df37",
|
||||
"src/CelerisLab/config.py": "2f1bba7515f5bc08cb3a8d140bcafe7fa0689e01b3b06494697bb2956a71530e",
|
||||
"src/CelerisLab/configs/CONFIG.md": "41cafdbe525366c08aa9d0416ea026ccf0026ba7123b8a9b65f968a80d928e3a",
|
||||
"src/CelerisLab/configs/config_body.json": "055f261f0828ca1d4f2bb694bd15b72bbcabe31d552326208f28e37f761adab1",
|
||||
"src/CelerisLab/configs/config_lbm.json": "17e4311f1f250c6ece59177a8b6ff856b69a016c7c10267e774b030a0a390865",
|
||||
"src/CelerisLab/configs/config_lbm_flume_mrt_zouhe.json": "8f593321db05a563a42931603a228d61cbcba06dfbe113262d5cd0ad93c0fe79",
|
||||
"src/CelerisLab/configs/config_lbm_flume_trt_regularized.json": "f4bba8e6a4339fc3c4eb14f6e2f57c4b22993c73703c773d853edfbe34736e56",
|
||||
"src/CelerisLab/configs/config_lbm_three_cylinder_triangle.json": "eeb8e7149dbe4aa6b3a9562802735aa950750dfbe2d972a0727e788573afa817",
|
||||
"src/CelerisLab/cuda/__init__.py": "0d01dff9f0399c8baba822aab5ca0122a135f011008ed8a499ebd9f7e5b06aea",
|
||||
"src/CelerisLab/cuda/compiler_v2.py": "c4cc3ec4445c8d75e6a253dd87963877117a722bc73b9d4811806fc6045d08c1",
|
||||
"src/CelerisLab/cuda/context.py": "013dd4ec6d01d2fbd11afdfb103eac6a273bd9f798d663d761b851eeb27885e9",
|
||||
"src/CelerisLab/cuda/obs_layout.py": "5ffb2c3aeeaaaaeb64f2cd8febfbcf4ad9919e5414020ad753cfade0683b21c2",
|
||||
"src/CelerisLab/lbm/__init__.py": "7f60fb3aaae81501b510d08c2fedff44fcb05657260eb10b6f5cc91e7204306b",
|
||||
"src/CelerisLab/lbm/block_stepper.py": "00b313daddc6e63d8ab8423c9190ca7e92ad291de20a2f6b80eb53e3f2d85ec7",
|
||||
"src/CelerisLab/lbm/blocks.py": "1e644c5719993f418185ad4a10b6950a30636fc912befd9eab41ff48b4cf85cd",
|
||||
"src/CelerisLab/lbm/channel.py": "2d5b5ff43414cb35633ac4ce90ce2c3a3353950b25c168e1c2ab58d498dd8b0f",
|
||||
"src/CelerisLab/lbm/curved_links.py": "b6957fa13d13f864dba4f7364e93a39905d062dbb3ee9b3f5191add81fff0732",
|
||||
"src/CelerisLab/lbm/descriptors.py": "c9f025dfc14da43b989047b84cc22bd05d5cc92c9ec695c1da68fdfb788e3f2b",
|
||||
"src/CelerisLab/lbm/equilibrium.py": "2fb2f2bb7ff326d23abce80fc2a4c0907b17740ea3e29fe6ae079c5044783826",
|
||||
"src/CelerisLab/lbm/field.py": "0e727eacc3706add4d8d15c418e9b631050871f831698d3ac689dd5f2c701b9b",
|
||||
"src/CelerisLab/lbm/hierarchy.py": "f234975074f6b6d289d573ff6ea6832feae0e27cb04f80b37fe81792b13a12e7",
|
||||
"src/CelerisLab/lbm/initializers.py": "dacf9586963e862d6d0a98ef1a066036be6f91e9d423720661d8ef2c1fb2df6a",
|
||||
"src/CelerisLab/lbm/kernels/blocks.cu": "e3b9606f861bfea8c4b0f34e8356bb230081f899c584f67be89178d889099b17",
|
||||
"src/CelerisLab/lbm/kernels/boundary/bounce_back.cuh": "aba3748c564ed91b161d268ef8b737b7c7be96a823063d201f3da684dd845233",
|
||||
"src/CelerisLab/lbm/kernels/boundary/curved_boundary.cuh": "aeb16bfd483514fb03e15a2fed437d673c3b8b2fe68ab83edf4244ef593878ea",
|
||||
"src/CelerisLab/lbm/kernels/boundary/esopull_curved_helpers.cuh": "b9b474bc4edaff05681c5443235472d04072d0d775fc0eb9c5967faef52b0258",
|
||||
"src/CelerisLab/lbm/kernels/boundary/ibm_kernels.cuh": "e6909b547dc8d64cdd8a76a90660243a8f5fee535caa161b52b4dd8b7c29934b",
|
||||
"src/CelerisLab/lbm/kernels/boundary/inlet/channel_stabilized.cuh": "efe077afcbb6b731256a987c2fd79a1dbc470c902f87070d60421ea6cb13d4e2",
|
||||
"src/CelerisLab/lbm/kernels/boundary/inlet/common.cuh": "59b38a89439878e00de7de16b9c7b03feff443fcc5a421593f7d2536dcbb7ab8",
|
||||
"src/CelerisLab/lbm/kernels/boundary/inlet/equilibrium.cuh": "f0964c811b2c41a5aaa1c6d99c490b06e850c634eb8749f1f05ef61f93c2de1d",
|
||||
"src/CelerisLab/lbm/kernels/boundary/inlet/regularized.cuh": "943d4a571818bacb89c70bccfaac202691121e3e385803ce6309123a0a03ddaf",
|
||||
"src/CelerisLab/lbm/kernels/boundary/inlet/zou_he_local.cuh": "e73e66b853b1e4e0e30d8f4185d832aa414ce670a1813ce2b5459f2887f71f89",
|
||||
"src/CelerisLab/lbm/kernels/boundary/inlet_outlet.cuh": "de8b213a6da42c2e5e9f8966199fc66ea4541b85144a90f3f5dbad3c6ab63b97",
|
||||
"src/CelerisLab/lbm/kernels/boundary/outlet/pressure_neq.cuh": "c8b2adc66d12fe602076ddc9693c5c208711fcaddb58aa9a31401a269f51c4c4",
|
||||
"src/CelerisLab/lbm/kernels/boundary/planar_velocity.cuh": "501b2759d0e2e4280cb6fdd127d66a50fa89f6de48fc2cae9a7eafb11ae90bed",
|
||||
"src/CelerisLab/lbm/kernels/config.h": "7d1124125e0b354558297934460e64c760fb68cdd7bf6d01a1238bb2eaab8c37",
|
||||
"src/CelerisLab/lbm/kernels/config/config_grid.h": "1db3e030ebdc116cd7f02362d1fd077daac55e8f0b4329f6285948c224d3ca5d",
|
||||
"src/CelerisLab/lbm/kernels/config/config_method.h": "4374e04a130f90f97d17cc20c40d2f9ea0ed0dd8603817d07f215d02266e247c",
|
||||
"src/CelerisLab/lbm/kernels/config/config_objects.h": "db793af052c756561a190a3ff2cb93ee5fe28462ee4f97c6af80882b4dc8b072",
|
||||
"src/CelerisLab/lbm/kernels/config/config_obs.h": "c11e2249359145b5c4cbaaf0487506fa77c1f4b82c7c169ddc574aa0babcd727",
|
||||
"src/CelerisLab/lbm/kernels/config/config_physics.h": "8ac0990b168e1058588676cc05c80df8634cfd671dbc92a89246c3c372d83a4e",
|
||||
"src/CelerisLab/lbm/kernels/core/descriptors.cuh": "8440bc14857da9007982650f828a23608eec9f7cc4bf772e8c8dc1239cb45356",
|
||||
"src/CelerisLab/lbm/kernels/core/flags.cuh": "0025705f24710330d9d9195f713879bfb650a85a3449baef0e196b831af104ab",
|
||||
"src/CelerisLab/lbm/kernels/core/layout.cuh": "1fbd820021c89ac3efcde24145996cb0147769e607e498e61f308ed3e0b13706",
|
||||
"src/CelerisLab/lbm/kernels/core/obs.cuh": "b742b77c9f61e1f020fe9922c3838ae9d855e17b381154958b58f10a22938922",
|
||||
"src/CelerisLab/lbm/kernels/core/params.cuh": "6e18bf730d936d940e3d85452f0714a2eaae31bf41002f9fd520ec5b372878dd",
|
||||
"src/CelerisLab/lbm/kernels/core/precision.cuh": "849df14b4cce50af52399e4b8f3e997196f3ae5f1163f68e28df3e6b2507a8c4",
|
||||
"src/CelerisLab/lbm/kernels/kernel_v2.cu": "c7bd3fb705b77261ba2441c52a24a7e6a7865c165cba088a1b75201c4d29c408",
|
||||
"src/CelerisLab/lbm/kernels/operators/collision_mrt.cuh": "aee444eb60c47a3fd518dca975d1af05425a0818a0ec6c3fb3f6150f60c2cb44",
|
||||
"src/CelerisLab/lbm/kernels/operators/collision_srt.cuh": "6b7ff842f392c8f853d2d1a97cc69bfe50f21283f73e659404da07cf6c95f5e1",
|
||||
"src/CelerisLab/lbm/kernels/operators/collision_trt.cuh": "9725b9840b9ad8b4ec7be61ff5d06d3151e86d1a87585c13f2fbf934d0d2c5f6",
|
||||
"src/CelerisLab/lbm/kernels/operators/forcing_guo.cuh": "969a430c1af03f32e3bd0df95d805e64f56334717c44dd4ba208ba503062a24b",
|
||||
"src/CelerisLab/lbm/kernels/operators/helpers.cuh": "0b3a4d95d7d19f5fec09e5423b8f4cc99f8a226b541967425967330da5a051ec",
|
||||
"src/CelerisLab/lbm/kernels/operators/macro.cuh": "2be20eb2b7d7f5522daaad7f4b57b1ff8cdf883efe4a67846a96783b2fe846a3",
|
||||
"src/CelerisLab/lbm/kernels/operators/turbulence_smag.cuh": "ff7f000297ee0817e255ad9fcb6a13b647e3ddd5b206518d35f38d2895a9f501",
|
||||
"src/CelerisLab/lbm/kernels/refinement.cu": "129f3d91da93b4324f88a0da73a4da1e5390f72c14cce574ee63306712da9895",
|
||||
"src/CelerisLab/lbm/kernels/step/aux_kernels.cu": "578a5b20a157241ee678547059abb1372dd5a589ad06bb2c15b987eb01ca1013",
|
||||
"src/CelerisLab/lbm/kernels/step/block_channel.cu": "befbf6d757e532a59c166d41f920d16d71557cd3a574478e7aa83da737c48cbd",
|
||||
"src/CelerisLab/lbm/kernels/step/curved_double.cu": "bfa7a1df1e939020314d49755045f7a85fe4a19cc1c68dbe62653c66c5e7c2b3",
|
||||
"src/CelerisLab/lbm/kernels/step/esopull_macro.cu": "c73116020ca217ede1e4de27c8269c31f9d91e33433ac8252a21e9b14187c50f",
|
||||
"src/CelerisLab/lbm/kernels/step/esopull_sync.cu": "c0ff3e72900c3ab89a05dd03684e96d3b740cf1672d565727fc2af165933d087",
|
||||
"src/CelerisLab/lbm/kernels/step/init_flow.cu": "305be3bb12fc0d039acec1701baabcf0e8a35e683c49c34f2af8ca9867d2b29c",
|
||||
"src/CelerisLab/lbm/kernels/step/one_step_double.cu": "f9f8242b38e8e0cf8425b75e2b0215bc15363c62eaa0fb43c761b8e0931bfdc9",
|
||||
"src/CelerisLab/lbm/kernels/step/one_step_esopull.cu": "aa223b2744ae6c9125673df311a96ce588032c1ba58bebb11fd33ecb990f8ed4",
|
||||
"src/CelerisLab/lbm/kernels/streaming/esopull_semantic_helpers.cuh": "dd5a9091628b079efd97e53fd49e52d09dcee88529235db77a5648e02937af6e",
|
||||
"src/CelerisLab/lbm/kernels/streaming/esopull_single_buffer.cuh": "77ed4ab9a0ebc5ff62a91a7c39066ef395391ae36e9040a69fb2bd8b1626dc79",
|
||||
"src/CelerisLab/lbm/kernels/streaming/pull_double_buffer.cuh": "b65d741ed78b7b62f99531ba0c0ce1936663d8dc9640e7d7d16c707f1baf6549",
|
||||
"src/CelerisLab/lbm/population_storage.py": "a6a86c29c52c892edfe4802fb773c387212e3f4cc86708d80e154986ddf88044",
|
||||
"src/CelerisLab/lbm/raw_exchange.py": "8694202466eba848563e298656353b0f5db94e21a01fa05f51aad6dc2b9fd311",
|
||||
"src/CelerisLab/lbm/refinement.py": "08c2a0557276a98cbcaa459d9bb7a9735d8bbbf64a6114c57af2fda61481a687",
|
||||
"src/CelerisLab/lbm/refinement_stepper.py": "f2bb34fa90805ad21c3e7cf9f9a67d88d3ae3e249b4517d3898567b4bf9e364d",
|
||||
"src/CelerisLab/lbm/refinement_tables.py": "fdd344024b89df3a83174dc810ca5e32db5e19eb8b1609f8f73b0821f56546b6",
|
||||
"src/CelerisLab/lbm/stepper.py": "0dcb7cd7ae87e33e3dc67a38b6aa43042fbe673e37d9ad165342ee1d695933ce",
|
||||
"src/CelerisLab/lbm/synchronized_remap.py": "7400fc4beaffd4649d6a9c524d38ce5fd6fa7eeb32eb5332e4030a4b6648f197",
|
||||
"src/CelerisLab/simulation.py": "0a03904dc6de88667d7af699005a289adf8b09f0976cb0d099b041f4830a8f4c",
|
||||
"tests/validation/data/refined_dfg/source_manifest.json": "e495948b10f8112c77ca67255122b5e8bc9e32570e8c899802afcb85e608fef4",
|
||||
"tests/validation/periodic.py": "a2212c0e2705126327a5019e9cafe64eeca398da1b75061ff23630c9843697a6",
|
||||
"tests/validation/re100_helpers.py": "289c6e01075ff361573f862b90cfd61e5980c9a8efcbc78aef69979b4004fd60",
|
||||
"tests/validation/run_refined_dfg.py": "256aacd84b3f8412a31ffaba9c4b5635db895c3177686dd34ef8e31f08119414",
|
||||
"tests/validation/source_provenance.py": "6dfe8f2d819dba0e240ba761d31162a5033685d492d09db75eb2b8aaab3a5a4c"
|
||||
}
|
||||
}
|
||||
@@ -1,100 +0,0 @@
|
||||
"""CPU-only synthetic diagnostic and source-contract tests; no simulation results."""
|
||||
import json
|
||||
from pathlib import Path
|
||||
import sys
|
||||
from tempfile import TemporaryDirectory
|
||||
import unittest
|
||||
import numpy as np
|
||||
sys.path.insert(0,str(Path(__file__).resolve().parent))
|
||||
import diagnose_uniform_srt as d
|
||||
cfg,body,p,manifest=d.source_config(d.DEFAULT_SOURCE)
|
||||
|
||||
|
||||
def fixture():
|
||||
flags=np.ones((12,20),np.uint16)
|
||||
flags[:,0]=2|0x20; flags[:,-1]=2|0x30
|
||||
flags[[0,-1]]=2|0x10; flags[5,6]=2|0x40|0x200
|
||||
g=np.full((9,12,20),1/9,np.float32)
|
||||
macro=dict(rho=np.ones((12,20)),ux=np.zeros((12,20)),uy=np.zeros((12,20)))
|
||||
params=dict(center=[6,5],radius=1,dx=.1,mean_speed=.01,diameter=80)
|
||||
return g,macro,flags,params
|
||||
|
||||
|
||||
def test_exact_config_and_source():
|
||||
assert manifest['commit']=='9805383f9c50d867e8555471baf5dbda8333a652'
|
||||
assert p['diameter']==80 and p['mean_speed']==.01 and p['nx']==1761 and p['ny']==330
|
||||
assert cfg['method']['collision']=='SRT' and cfg['method']['ddf_shifting']
|
||||
assert cfg['method']['outlet']['srt_neq_damp']==.5
|
||||
assert np.isclose(3*p['viscosity']+.5,.524)
|
||||
assert body['objects'][0]['center']==[160,160.5]
|
||||
|
||||
|
||||
def test_inactive_nonfinite_does_not_fail():
|
||||
g,m,f,p=fixture(); fluid,_=d.categories(f,p)
|
||||
g[:,~fluid]=np.nan
|
||||
for a in m.values(): a[~fluid]=np.nan
|
||||
r=d.diagnose(g,m,np.zeros(2),f,p,1)
|
||||
assert not r['physical_failure']
|
||||
assert r['categories']['body_solid']['nonfinite_population_nodes']==1
|
||||
assert r['categories']['outlet_ghost']['nodes']==10
|
||||
assert r['categories']['inlet_ghost']['nodes']==10
|
||||
json.dumps(r,allow_nan=False)
|
||||
|
||||
|
||||
def test_population_macro_force_separate():
|
||||
g,m,f,p=fixture(); g[4,6,17]=np.inf
|
||||
r=d.diagnose(g,m,np.zeros(2),f,p,27)
|
||||
assert r['physical_failure'] and r['physical_population_nonfinite']
|
||||
assert not r['original_health_failure'] and not r['force_nonfinite']
|
||||
assert r['first_physical_examples'][0]['category']=='outlet_near'
|
||||
assert r['first_physical_examples'][0]['nonfinite_q']==[4]
|
||||
assert r['first_physical_examples'][0]['populations'][4]=='+Inf'
|
||||
json.dumps(r,allow_nan=False)
|
||||
g,m,f,p=fixture(); m['ux'][6,10]=np.nan
|
||||
r=d.diagnose(g,m,np.zeros(2),f,p,28)
|
||||
assert r['physical_macro_nonfinite'] and not r['physical_population_nonfinite']
|
||||
assert not r['force_nonfinite'] and r['original_health_failure']
|
||||
g,m,f,p=fixture(); r=d.diagnose(g,m,np.array([np.nan,0]),f,p,29)
|
||||
assert r['force_nonfinite'] and not r['physical_macro_nonfinite']
|
||||
assert not r['first_physical_examples']
|
||||
|
||||
|
||||
def test_original_safety_limits():
|
||||
g,m,f,p=fixture(); m['rho'][5,7]=.49
|
||||
r=d.diagnose(g,m,[0,0],f,p,1)
|
||||
assert r['density_limit'] and r['first_physical_examples'][0]['category']=='body_near'
|
||||
g,m,f,p=fixture(); m['ux'][6,10]=.2
|
||||
assert d.diagnose(g,m,[0,0],f,p,1)['mach_limit']
|
||||
|
||||
|
||||
def test_disjoint_complete_categories():
|
||||
_,_,f,p=fixture(); fluid,masks=d.categories(f,p)
|
||||
np.testing.assert_array_equal(sum(mask.astype(int) for mask in masks.values()),np.ones(f.shape))
|
||||
physical=sum(masks[k].astype(int) for k in ('body_near','inlet_near','outlet_near','wall_near','bulk'))
|
||||
np.testing.assert_array_equal(physical,fluid.astype(int))
|
||||
|
||||
|
||||
def test_bounded_state_evidence():
|
||||
g,m,f,p=fixture(); state=dict(raw=g.copy(),g=g,macro=m,step=1)
|
||||
with TemporaryDirectory() as tmp:
|
||||
dest=Path(tmp); size=d.save_states(dest,state,state,f,{'status':'synthetic_test'})
|
||||
assert size<d.LIMIT_BYTES
|
||||
with np.load(dest/'states.npz') as saved:
|
||||
np.testing.assert_array_equal(saved['previous_raw_shifted'],g)
|
||||
np.testing.assert_array_equal(saved['current_physical'],g)
|
||||
assert sorted(x.name for x in dest.iterdir())==['diagnostics.json','states.npz']
|
||||
actual_bytes=4*(9*330*1761*4)+(330*1761*2)+16
|
||||
assert actual_bytes<d.LIMIT_BYTES-4*1024**2
|
||||
|
||||
|
||||
def test_source_guard_and_deadline():
|
||||
with TemporaryDirectory() as tmp:
|
||||
with unittest.TestCase().assertRaises((ValueError,FileNotFoundError)):
|
||||
d.source_config(Path(tmp))
|
||||
with unittest.TestCase().assertRaises(TimeoutError): d.deadline_check(0)
|
||||
|
||||
|
||||
if __name__=='__main__':
|
||||
result=unittest.TextTestRunner(verbosity=2).run(unittest.TestSuite(
|
||||
unittest.FunctionTestCase(fn) for name,fn in sorted(globals().items()) if name.startswith('test_')))
|
||||
raise SystemExit(not result.wasSuccessful())
|
||||
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
@@ -1,12 +0,0 @@
|
||||
CelerisLab reviewed scalar evidence,2026-10-18.
|
||||
|
||||
The two archives are intact originals. SHA256 and exact sizes are in transport_manifest.json.
|
||||
Equilibrium comparator92da2e8:exit0,2400000steps healthy;ascending-zero v2 qualification passes. Frozen result.json remains periodic=false/accuracy_qualified=false;qualification_v2.json is separate and binds both original receipts.
|
||||
Shifted/unshifted tiny e8b8c58:exit0,23methods pass,one N64 interval each mode only;no shifted full-N64 trajectory.
|
||||
No production/default/dev/main change.
|
||||
|
||||
Both archives retain all their original member bytes,including gzip protection inventories. Metadata were scanned for credentials/private keys/access tokens and unrelated private paths. Only the authorized CelerisLab project/interpreter/system metadata and a reviewed literal official-reference fixture path were found. No credentials or unrelated private paths.
|
||||
|
||||
Original larger archives,all scientific receipts and any successful Drive transfers are retained. This single existing-validation-branch commit is evidence transport only.
|
||||
|
||||
CPU covered-predictor pair5468695:44tests pass;one FP64 raw/stress pair exit0;raw4samples exact to07879bc;both unchanged campaign/comparative/conservation screens pass,historical uniform pressure budget fails separately for both.No GPU pin or production/default/main/dev merge.
|
||||
-505
@@ -1,505 +0,0 @@
|
||||
{
|
||||
"utc": "2026-10-18T23:44:13.848348+00:00",
|
||||
"status": "REMOTE_DEV_INTEGRATED_AND_BOUNDED_CLEANUP_COMPLETE",
|
||||
"integration": {
|
||||
"utc": "2026-10-18T23:41:22.351573+00:00",
|
||||
"status": "remote_dev_fast_forward_confirmed",
|
||||
"candidate": "eec4677db1308e2a9ce4e5f195c994356c11de13",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"local_dev_preserved": "f75d543586315b6272cfdf23046aa7d4550f5fbe",
|
||||
"local_dev_not_ancestor_of_remote_baseline": true,
|
||||
"remote_before": {
|
||||
"refs/heads/claude/dense-jet-validation": "17f3f11007de0df8f5b03e05f5ef0477cb2edb4d",
|
||||
"refs/heads/claude/jet-condition": "fbf6f1d1224f19a42dae4630a74c6aad845134a3",
|
||||
"refs/heads/claude/les-normalization": "5465832fe5617e1685b0f48926b14065fdf84491",
|
||||
"refs/heads/claude/projected-explosion": "519473a61c7b319183aa54e55b9f097499dde0bf",
|
||||
"refs/heads/claude/refinement-mrt": "aceea293a3ad3ba4b6b8de0c21c1ed4413efece1",
|
||||
"refs/heads/claude/smoke-test": "5ad4995f89f7db30db9f6c10321194aa9abbc68c",
|
||||
"refs/heads/claude/window-dfg-runner": "185a919cc5b1e00d2ea98f3a9ae53916e5056120",
|
||||
"refs/heads/dev": "ed9d8c937d446b854d6963bd92d718bb4fb98b96",
|
||||
"refs/heads/main": "eeda651626dbbc4d9fb2695ad069898b0bbcd5ab",
|
||||
"refs/heads/tron/full9-inlet": "2359605b7aae694851671f3229aaa83b783f5856",
|
||||
"refs/heads/tron/multigrid-usage": "f75d543586315b6272cfdf23046aa7d4550f5fbe",
|
||||
"refs/heads/tron/spacetime-coupling": "f287b460fd06125cf83294e4bd8cd8f7bf3230e3",
|
||||
"refs/heads/tron/validation-2d": "e81a103f3007e9bc86a0c29dcf73c35af0ed4f39"
|
||||
},
|
||||
"remote_after": {
|
||||
"refs/heads/claude/dense-jet-validation": "17f3f11007de0df8f5b03e05f5ef0477cb2edb4d",
|
||||
"refs/heads/claude/jet-condition": "fbf6f1d1224f19a42dae4630a74c6aad845134a3",
|
||||
"refs/heads/claude/les-normalization": "5465832fe5617e1685b0f48926b14065fdf84491",
|
||||
"refs/heads/claude/projected-explosion": "519473a61c7b319183aa54e55b9f097499dde0bf",
|
||||
"refs/heads/claude/refinement-mrt": "aceea293a3ad3ba4b6b8de0c21c1ed4413efece1",
|
||||
"refs/heads/claude/smoke-test": "5ad4995f89f7db30db9f6c10321194aa9abbc68c",
|
||||
"refs/heads/claude/window-dfg-runner": "185a919cc5b1e00d2ea98f3a9ae53916e5056120",
|
||||
"refs/heads/dev": "eec4677db1308e2a9ce4e5f195c994356c11de13",
|
||||
"refs/heads/main": "eeda651626dbbc4d9fb2695ad069898b0bbcd5ab",
|
||||
"refs/heads/tron/full9-inlet": "2359605b7aae694851671f3229aaa83b783f5856",
|
||||
"refs/heads/tron/multigrid-usage": "f75d543586315b6272cfdf23046aa7d4550f5fbe",
|
||||
"refs/heads/tron/spacetime-coupling": "f287b460fd06125cf83294e4bd8cd8f7bf3230e3",
|
||||
"refs/heads/tron/validation-2d": "e81a103f3007e9bc86a0c29dcf73c35af0ed4f39"
|
||||
},
|
||||
"push_exit": 0,
|
||||
"checks": {
|
||||
"remote_exact": true,
|
||||
"remote_dev_exact": true,
|
||||
"main_unchanged": true,
|
||||
"all_local_worktrees_unchanged": true,
|
||||
"local_dev_checkout_and_branch_preserved": true,
|
||||
"root_index_unchanged": true,
|
||||
"all_local_branches_tags_preserved": true,
|
||||
"candidate_clean_exact": true
|
||||
},
|
||||
"source_scope": {
|
||||
"chain": [
|
||||
"ed9d8c937d446b854d6963bd92d718bb4fb98b96",
|
||||
"a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"1aa8110ec8caf04350638d2e07361ce72ba5d22e",
|
||||
"2cf9853952e52f59bea63cf5c1d3a1cd76e53eed",
|
||||
"eec4677db1308e2a9ce4e5f195c994356c11de13"
|
||||
],
|
||||
"production_src_tree": "f262316529a99eb922813212d0fbb0c6fb385590",
|
||||
"constant_default": "constant",
|
||||
"files": [
|
||||
"docs/development/projected_pair_explosion.md",
|
||||
"src/CelerisLab/lbm/kernels/blocks.cu",
|
||||
"src/CelerisLab/lbm/refinement_stepper.py",
|
||||
"src/CelerisLab/lbm/refinement_tables.py",
|
||||
"tests/unit/test_les_flow_runner.py",
|
||||
"tests/unit/test_projected_explosion.py",
|
||||
"tests/unit/test_projected_pair_gate.py",
|
||||
"tests/unit/test_projected_pair_stepper.py",
|
||||
"tests/validation/data/les_flow/source_pins_a135252.json",
|
||||
"tests/validation/multigrid/check_projected_pairs.py",
|
||||
"tests/validation/run_uniform_les_flow.py",
|
||||
"tests/validation/taylor_green/assess_projected_pairs.py",
|
||||
"tests/validation/taylor_green/run_case.py",
|
||||
"tests/validation/taylor_green/test_projected_pairs.py"
|
||||
],
|
||||
"diff_stat": " docs/development/projected_pair_explosion.md | 57 +++\n src/CelerisLab/lbm/kernels/blocks.cu | 33 ++\n src/CelerisLab/lbm/refinement_stepper.py | 29 +-\n src/CelerisLab/lbm/refinement_tables.py | 44 +++\n tests/unit/test_les_flow_runner.py | 57 ++-\n tests/unit/test_projected_explosion.py | 394 +++++++++++++++++++\n tests/unit/test_projected_pair_gate.py | 162 ++++++++\n tests/unit/test_projected_pair_stepper.py | 198 ++++++++++\n .../data/les_flow/source_pins_a135252.json | 110 ++++++\n .../validation/multigrid/check_projected_pairs.py | 425 ++++++++++++++++++++\n tests/validation/run_uniform_les_flow.py | 10 +-\n .../taylor_green/assess_projected_pairs.py | 208 ++++++++++\n tests/validation/taylor_green/run_case.py | 155 +++++++-\n .../taylor_green/test_projected_pairs.py | 434 +++++++++++++++++++++\n 14 files changed, 2269 insertions(+), 47 deletions(-)\n"
|
||||
},
|
||||
"remote_commit_tree": "7952cba5b8383712bbafdcc98cbdcd2b4111123d",
|
||||
"remote_src_tree": "f262316529a99eb922813212d0fbb0c6fb385590"
|
||||
},
|
||||
"cleanup": {
|
||||
"utc": "2026-10-18T23:42:13.216523+00:00",
|
||||
"removed": [
|
||||
{
|
||||
"path": "/home/frank14f/CelerisLab/output/review-jet-063508d-20261015",
|
||||
"commit": "063508d1a3440c1311c3a7e6eb1a2b83e12a2092",
|
||||
"tree": "746f07e1aae0de9744e9dcb2dae185577bbacacc",
|
||||
"tracked_files": 440,
|
||||
"source_bytes": 9233268,
|
||||
"allocated_bytes": 10534912,
|
||||
"management_bytes": 81920,
|
||||
"reflog_commits": [
|
||||
"063508d1a3440c1311c3a7e6eb1a2b83e12a2092"
|
||||
],
|
||||
"recoverable_via_remote_dev": "eec4677db1308e2a9ce4e5f195c994356c11de13",
|
||||
"clean": true,
|
||||
"untracked_or_ignored_files": 0,
|
||||
"command": [
|
||||
"git",
|
||||
"-c",
|
||||
"gc.auto=0",
|
||||
"-c",
|
||||
"maintenance.auto=false",
|
||||
"-C",
|
||||
"/home/frank14f/CelerisLab",
|
||||
"worktree",
|
||||
"remove",
|
||||
"/home/frank14f/CelerisLab/output/review-jet-063508d-20261015"
|
||||
],
|
||||
"exit": 0,
|
||||
"stdout": "",
|
||||
"stderr": "",
|
||||
"recovery_map": "review-jet-063508d-20261015_recovery.json.gz",
|
||||
"recovery_map_sha256": "8805598e9274f7f2e1cd1dbb75aca1cecae2412a44e18e221e5e0a75606dbccc"
|
||||
},
|
||||
{
|
||||
"path": "/home/frank14f/CelerisLab/output/review-jet-19bd308-20261015",
|
||||
"commit": "19bd3088ef30e3193402e921c387b50c81ddbd45",
|
||||
"tree": "c1d6203d02404798c597ad2c3755b112d3db6226",
|
||||
"tracked_files": 440,
|
||||
"source_bytes": 9234697,
|
||||
"allocated_bytes": 10534912,
|
||||
"management_bytes": 81920,
|
||||
"reflog_commits": [
|
||||
"19bd3088ef30e3193402e921c387b50c81ddbd45"
|
||||
],
|
||||
"recoverable_via_remote_dev": "eec4677db1308e2a9ce4e5f195c994356c11de13",
|
||||
"clean": true,
|
||||
"untracked_or_ignored_files": 0,
|
||||
"command": [
|
||||
"git",
|
||||
"-c",
|
||||
"gc.auto=0",
|
||||
"-c",
|
||||
"maintenance.auto=false",
|
||||
"-C",
|
||||
"/home/frank14f/CelerisLab",
|
||||
"worktree",
|
||||
"remove",
|
||||
"/home/frank14f/CelerisLab/output/review-jet-19bd308-20261015"
|
||||
],
|
||||
"exit": 0,
|
||||
"stdout": "",
|
||||
"stderr": "",
|
||||
"recovery_map": "review-jet-19bd308-20261015_recovery.json.gz",
|
||||
"recovery_map_sha256": "a83afe1b0900963d9ad7b94f4260a6e55b45e1fd6410b5c09976f0ead96bd5c6"
|
||||
},
|
||||
{
|
||||
"path": "/home/frank14f/CelerisLab/output/review-jet-508d412-20261015",
|
||||
"commit": "508d412e43aff7a27cba2a60255ebf2500fdfb18",
|
||||
"tree": "4b0189adf5480e3f757193e0d660df3a318fadad",
|
||||
"tracked_files": 440,
|
||||
"source_bytes": 9230649,
|
||||
"allocated_bytes": 10530816,
|
||||
"management_bytes": 81920,
|
||||
"reflog_commits": [
|
||||
"508d412e43aff7a27cba2a60255ebf2500fdfb18"
|
||||
],
|
||||
"recoverable_via_remote_dev": "eec4677db1308e2a9ce4e5f195c994356c11de13",
|
||||
"clean": true,
|
||||
"untracked_or_ignored_files": 0,
|
||||
"command": [
|
||||
"git",
|
||||
"-c",
|
||||
"gc.auto=0",
|
||||
"-c",
|
||||
"maintenance.auto=false",
|
||||
"-C",
|
||||
"/home/frank14f/CelerisLab",
|
||||
"worktree",
|
||||
"remove",
|
||||
"/home/frank14f/CelerisLab/output/review-jet-508d412-20261015"
|
||||
],
|
||||
"exit": 0,
|
||||
"stdout": "",
|
||||
"stderr": "",
|
||||
"recovery_map": "review-jet-508d412-20261015_recovery.json.gz",
|
||||
"recovery_map_sha256": "41bd6140c7058cb492f801671ddd3e293127dad0c66d4d1ee0df1c50788d4f3e"
|
||||
},
|
||||
{
|
||||
"path": "/home/frank14f/CelerisLab/output/review-jet-62c525e-20261015",
|
||||
"commit": "62c525e73532a974663be2e112af671fa868b972",
|
||||
"tree": "0152729f4898295c508def8360b415fe147ee57b",
|
||||
"tracked_files": 437,
|
||||
"source_bytes": 9194520,
|
||||
"allocated_bytes": 10489856,
|
||||
"management_bytes": 81920,
|
||||
"reflog_commits": [
|
||||
"62c525e73532a974663be2e112af671fa868b972"
|
||||
],
|
||||
"recoverable_via_remote_dev": "eec4677db1308e2a9ce4e5f195c994356c11de13",
|
||||
"clean": true,
|
||||
"untracked_or_ignored_files": 0,
|
||||
"command": [
|
||||
"git",
|
||||
"-c",
|
||||
"gc.auto=0",
|
||||
"-c",
|
||||
"maintenance.auto=false",
|
||||
"-C",
|
||||
"/home/frank14f/CelerisLab",
|
||||
"worktree",
|
||||
"remove",
|
||||
"/home/frank14f/CelerisLab/output/review-jet-62c525e-20261015"
|
||||
],
|
||||
"exit": 0,
|
||||
"stdout": "",
|
||||
"stderr": "",
|
||||
"recovery_map": "review-jet-62c525e-20261015_recovery.json.gz",
|
||||
"recovery_map_sha256": "a06d4f65f1ed3002bbef0bf21786741276cf0a4a09888238354bf2aab8ae4722"
|
||||
},
|
||||
{
|
||||
"path": "/home/frank14f/CelerisLab/output/review-jet-f1e0342-20261015",
|
||||
"commit": "f1e03423f336bfdf120e5f2ee5c949fded17130c",
|
||||
"tree": "3b6106280809096d1dfb73037894d0846f2572ce",
|
||||
"tracked_files": 440,
|
||||
"source_bytes": 9237148,
|
||||
"allocated_bytes": 10534912,
|
||||
"management_bytes": 81920,
|
||||
"reflog_commits": [
|
||||
"f1e03423f336bfdf120e5f2ee5c949fded17130c"
|
||||
],
|
||||
"recoverable_via_remote_dev": "eec4677db1308e2a9ce4e5f195c994356c11de13",
|
||||
"clean": true,
|
||||
"untracked_or_ignored_files": 0,
|
||||
"command": [
|
||||
"git",
|
||||
"-c",
|
||||
"gc.auto=0",
|
||||
"-c",
|
||||
"maintenance.auto=false",
|
||||
"-C",
|
||||
"/home/frank14f/CelerisLab",
|
||||
"worktree",
|
||||
"remove",
|
||||
"/home/frank14f/CelerisLab/output/review-jet-f1e0342-20261015"
|
||||
],
|
||||
"exit": 0,
|
||||
"stdout": "",
|
||||
"stderr": "",
|
||||
"recovery_map": "review-jet-f1e0342-20261015_recovery.json.gz",
|
||||
"recovery_map_sha256": "1444f7ca5825ce490660f38be89be0331f57a87a26828f9f25eaa123f3a93683"
|
||||
},
|
||||
{
|
||||
"path": "/home/frank14f/CelerisLab/output/review-jet-99ddb5f-20261016",
|
||||
"commit": "99ddb5fc27e5a2c52bd27312981e34e6be98883b",
|
||||
"tree": "d616e328a0afee4e2832fc7999852306205f761e",
|
||||
"tracked_files": 440,
|
||||
"source_bytes": 9242940,
|
||||
"allocated_bytes": 10539008,
|
||||
"management_bytes": 81920,
|
||||
"reflog_commits": [
|
||||
"99ddb5fc27e5a2c52bd27312981e34e6be98883b"
|
||||
],
|
||||
"recoverable_via_remote_dev": "eec4677db1308e2a9ce4e5f195c994356c11de13",
|
||||
"clean": true,
|
||||
"untracked_or_ignored_files": 0,
|
||||
"command": [
|
||||
"git",
|
||||
"-c",
|
||||
"gc.auto=0",
|
||||
"-c",
|
||||
"maintenance.auto=false",
|
||||
"-C",
|
||||
"/home/frank14f/CelerisLab",
|
||||
"worktree",
|
||||
"remove",
|
||||
"/home/frank14f/CelerisLab/output/review-jet-99ddb5f-20261016"
|
||||
],
|
||||
"exit": 0,
|
||||
"stdout": "",
|
||||
"stderr": "",
|
||||
"recovery_map": "review-jet-99ddb5f-20261016_recovery.json.gz",
|
||||
"recovery_map_sha256": "47bef4af7d27850a277603c5247ed9532534c90727e9870b8174ec38e45994ab"
|
||||
}
|
||||
],
|
||||
"skipped": [],
|
||||
"before_bytes": {
|
||||
"output_bytes": 1867370496,
|
||||
"git_management_bytes": 64847872,
|
||||
"receipt_bytes": 5877760,
|
||||
"total_bytes": 1932218368
|
||||
},
|
||||
"after_bytes": {
|
||||
"output_bytes": 1805164544,
|
||||
"git_management_bytes": 64356352,
|
||||
"receipt_bytes": 6836224,
|
||||
"total_bytes": 1869520896
|
||||
},
|
||||
"worktrees_before": 38,
|
||||
"worktrees_after": 32,
|
||||
"checks": {
|
||||
"only_selected_worktrees_removed": true,
|
||||
"remaining_worktrees_unchanged": true,
|
||||
"all_refs_unchanged": true,
|
||||
"branches_tags_root_index_remote_unchanged": true,
|
||||
"all_source_object_files_preserved": true,
|
||||
"all_scientific_evidence_files_preserved": true,
|
||||
"untracked_and_ignored_user_files_preserved": true,
|
||||
"dev_checkout_retained": true
|
||||
},
|
||||
"evidence_files": 10001,
|
||||
"evidence_aggregate_sha256": "503dcd4dbd4514e577b09b761c66502d3f8c8e57ef1c7e12f46c0a24a6af0ea4",
|
||||
"original_source_object_files": 2154,
|
||||
"no_scientific_evidence_deleted": true,
|
||||
"no_refs_or_source_history_pruned": true,
|
||||
"no_environment_changes": true
|
||||
},
|
||||
"current_remote_heads": {
|
||||
"refs/heads/claude/dense-jet-validation": "17f3f11007de0df8f5b03e05f5ef0477cb2edb4d",
|
||||
"refs/heads/claude/jet-condition": "fbf6f1d1224f19a42dae4630a74c6aad845134a3",
|
||||
"refs/heads/claude/les-normalization": "5465832fe5617e1685b0f48926b14065fdf84491",
|
||||
"refs/heads/claude/projected-explosion": "519473a61c7b319183aa54e55b9f097499dde0bf",
|
||||
"refs/heads/claude/refinement-mrt": "aceea293a3ad3ba4b6b8de0c21c1ed4413efece1",
|
||||
"refs/heads/claude/smoke-test": "5ad4995f89f7db30db9f6c10321194aa9abbc68c",
|
||||
"refs/heads/claude/window-dfg-runner": "185a919cc5b1e00d2ea98f3a9ae53916e5056120",
|
||||
"refs/heads/dev": "eec4677db1308e2a9ce4e5f195c994356c11de13",
|
||||
"refs/heads/main": "eeda651626dbbc4d9fb2695ad069898b0bbcd5ab",
|
||||
"refs/heads/tron/full9-inlet": "2359605b7aae694851671f3229aaa83b783f5856",
|
||||
"refs/heads/tron/multigrid-usage": "f75d543586315b6272cfdf23046aa7d4550f5fbe",
|
||||
"refs/heads/tron/spacetime-coupling": "f287b460fd06125cf83294e4bd8cd8f7bf3230e3",
|
||||
"refs/heads/tron/validation-2d": "e81a103f3007e9bc86a0c29dcf73c35af0ed4f39"
|
||||
},
|
||||
"current_local_dev": {
|
||||
"path": "/home/frank14f/CelerisLab/output/dev-worktree",
|
||||
"commit": "f75d543586315b6272cfdf23046aa7d4550f5fbe",
|
||||
"clean": true,
|
||||
"preserved_reason": "f75d543 is not ancestor of remote ed9d8c9;no reset/unrelated local merge"
|
||||
},
|
||||
"constant_default": "constant",
|
||||
"projected_eligibility": "explicit opt-in experimental scope unchanged",
|
||||
"science_scope": {
|
||||
"TG": "narrow four-case Re100 smooth-decay diagnostic only;projected PASS,constant relative velocity FAIL,aggregate false preserved",
|
||||
"LES": "new named current profile resolves only introduced pin mismatches;uniform corrected regression only;Cs1 amplified diagnostic",
|
||||
"unresolved_historical_issues": [
|
||||
"channel.py Jet-CV mismatch",
|
||||
"pre-existing optional dependency errors"
|
||||
],
|
||||
"no_new_GPU_or_tests": true
|
||||
},
|
||||
"preserved_original_archives": {
|
||||
"projected-grid-11901a7-20261018/CelerisLab_projected_grid_11901a7_complete_20261018.zip": "c20e364e72b96858bf7bc317cba3d02a40e03be74ab1816048e78f7e89678f47",
|
||||
"projected-pairs-gate-1aa8110-20261018/CelerisLab_projected_pair_gate_1aa8110_20261018.zip": "589a5537069cb7f10c6e349648aae2900b0af996b0dc1ac147a138581cb913e3",
|
||||
"projected-pairs-tg-2cf9853-20261018/CelerisLab_projected_pairs_TG_2cf9853_20261018.zip": "d312bfd0175e5a79d1a28a595ba229a6d8435ba13e3b9058c409fcc9737cafc1",
|
||||
"uniform-les-eec4677-20261018/CelerisLab_uniform_LES_eec4677_20261018.zip": "7b8e6951b24a8c2852387bc0a026e133c491931d97340056195a981fb51db879"
|
||||
},
|
||||
"proof_files": {
|
||||
"cleanup.py": {
|
||||
"bytes": 6513,
|
||||
"sha256": "5b3db9f9d59b58be1ea9c4427ab06d1e2f41671d3a17245a97cb7979da6b6826"
|
||||
},
|
||||
"cleanup_activity_preflight.json": {
|
||||
"bytes": 588,
|
||||
"sha256": "51d0b5403b66980cb4d272bae498c4c71197634cd5c892877ca4ab351cf02a11"
|
||||
},
|
||||
"cleanup_after.json.gz": {
|
||||
"bytes": 710267,
|
||||
"sha256": "c897f2d61c04c1c2bcc955108d41538b277663ed1059e560bfe7ebf3d993fc00"
|
||||
},
|
||||
"cleanup_before.json.gz": {
|
||||
"bytes": 834537,
|
||||
"sha256": "12213622ee7b4ad2e48b32f3c0d1f8b676b362243430329781dc76a76908cc88"
|
||||
},
|
||||
"cleanup_result.json": {
|
||||
"bytes": 7540,
|
||||
"sha256": "d042619320d9c26ff92cd531cf4d4620dfc673aaacb3a10f892819beb790beb0"
|
||||
},
|
||||
"dev_push_result.json": {
|
||||
"bytes": 333,
|
||||
"sha256": "e6cb70eea47d92840ab2253cc3afc1fa842e3b08a4fc4b8c4fa8c62941f7fa3b"
|
||||
},
|
||||
"dev_push_started.json": {
|
||||
"bytes": 1532,
|
||||
"sha256": "0ff359e7153eaa44f53c9e6a4c61e336ce34a416d27db4fbb59e88d4db36502a"
|
||||
},
|
||||
"evidence_before.json.gz": {
|
||||
"bytes": 470636,
|
||||
"sha256": "f255aec46b524325c006427f809d83f2792f46aac35fe5e089a61e36ba38910b"
|
||||
},
|
||||
"gate_common.py": {
|
||||
"bytes": 3086,
|
||||
"sha256": "106688da96d6946cc7d86bcff9fba16ebebb1cb8ac6d84f083afdac51f44ae30"
|
||||
},
|
||||
"integrate.py": {
|
||||
"bytes": 3831,
|
||||
"sha256": "d25de325d395ef8f315f16bf5471c30776986239980037015ec761c375ed3687"
|
||||
},
|
||||
"integration_before.json.gz": {
|
||||
"bytes": 834540,
|
||||
"sha256": "38a1d639a3dd0be479ddb2959b4cdc9bcd1f28aff9153471e06aa96f44b9f020"
|
||||
},
|
||||
"integration_first_attempt_error.txt": {
|
||||
"bytes": 747,
|
||||
"sha256": "8af828b2e3f1deb96457fd52298f1cfec9b18351e714f6b35ffabcda89d1bb47"
|
||||
},
|
||||
"integration_result.json": {
|
||||
"bytes": 5178,
|
||||
"sha256": "3d8bb9f2ef761e0e94a1695d1b7a7aec02f724f837269922d4faf1c1d239b0ca"
|
||||
},
|
||||
"inventory.json": {
|
||||
"bytes": 997138,
|
||||
"sha256": "2865b1162bfd704c43bb8c108a7b0b75fc9df4709a0d75cb2195d9f71ada601b"
|
||||
},
|
||||
"inventory.py": {
|
||||
"bytes": 2750,
|
||||
"sha256": "78bed3f832fb245cf80e88e80864293242544726b2141a66f4ace6ee08f19547"
|
||||
},
|
||||
"management.py": {
|
||||
"bytes": 4710,
|
||||
"sha256": "3dbfadb0a13532d21282f2830269eb40398485be9063460fc87ff3414516b451"
|
||||
},
|
||||
"protected_extra_files.json.gz": {
|
||||
"bytes": 19413,
|
||||
"sha256": "4efcc18c5d028f38c761ba0ffcf949c793ef8e42aa80f4ba60bb2486944cf9e8"
|
||||
},
|
||||
"protection_before.json.gz": {
|
||||
"bytes": 834539,
|
||||
"sha256": "60a786d506e7dd3b94836541a601821fb26e4a5e68393fb23cc87a73d8c5669d"
|
||||
},
|
||||
"publish_receipt.py": {
|
||||
"bytes": 2736,
|
||||
"sha256": "5ed94713bdf9de11c8a0ce6b772c8ef3f025a7b4cc41f986d442ae3f80e7fa1b"
|
||||
},
|
||||
"publish_reviewed_dev.py": {
|
||||
"bytes": 2817,
|
||||
"sha256": "efb08358295f94a843047804866110d3de132ff2ea372c5c6f3641b3952a54e2"
|
||||
},
|
||||
"remote_only_integration_after.json.gz": {
|
||||
"bytes": 834552,
|
||||
"sha256": "2d2b125fcd1826be790ddecabdb27dec8851c84c0f46e23aa0e749407f6b4045"
|
||||
},
|
||||
"remote_only_integration_before.json.gz": {
|
||||
"bytes": 834552,
|
||||
"sha256": "0368c5f0c393a78474fa872950512c2b3db10b30277d2477056b1696782d8c4c"
|
||||
},
|
||||
"review-jet-063508d-20261015_recovery.json.gz": {
|
||||
"bytes": 35325,
|
||||
"sha256": "8805598e9274f7f2e1cd1dbb75aca1cecae2412a44e18e221e5e0a75606dbccc"
|
||||
},
|
||||
"review-jet-063508d-20261015_removal.json": {
|
||||
"bytes": 942,
|
||||
"sha256": "50381cd4a36e616fdcada15fe2508a3aa4cadfcca22d65ada15b66c8c9b01373"
|
||||
},
|
||||
"review-jet-19bd308-20261015_recovery.json.gz": {
|
||||
"bytes": 35320,
|
||||
"sha256": "a83afe1b0900963d9ad7b94f4260a6e55b45e1fd6410b5c09976f0ead96bd5c6"
|
||||
},
|
||||
"review-jet-19bd308-20261015_removal.json": {
|
||||
"bytes": 942,
|
||||
"sha256": "8fc1b317a8a16ae6325ada98201771834583891a8a81f5f440993441b1675bc0"
|
||||
},
|
||||
"review-jet-508d412-20261015_recovery.json.gz": {
|
||||
"bytes": 35321,
|
||||
"sha256": "41bd6140c7058cb492f801671ddd3e293127dad0c66d4d1ee0df1c50788d4f3e"
|
||||
},
|
||||
"review-jet-508d412-20261015_removal.json": {
|
||||
"bytes": 942,
|
||||
"sha256": "51610ededb9123dfb492e2802ff28f823ba1589a1bb56c675a1adf6e0dfe07af"
|
||||
},
|
||||
"review-jet-62c525e-20261015_recovery.json.gz": {
|
||||
"bytes": 35026,
|
||||
"sha256": "a06d4f65f1ed3002bbef0bf21786741276cf0a4a09888238354bf2aab8ae4722"
|
||||
},
|
||||
"review-jet-62c525e-20261015_removal.json": {
|
||||
"bytes": 942,
|
||||
"sha256": "cf62efc212a7211049ff2d5e338a29f838b741eebad7a23f756ee7d4c651de3f"
|
||||
},
|
||||
"review-jet-99ddb5f-20261016_recovery.json.gz": {
|
||||
"bytes": 35321,
|
||||
"sha256": "47bef4af7d27850a277603c5247ed9532534c90727e9870b8174ec38e45994ab"
|
||||
},
|
||||
"review-jet-99ddb5f-20261016_removal.json": {
|
||||
"bytes": 942,
|
||||
"sha256": "c2ef4fcf118fa0c0eb07ca48ad37c0fdcab50a85a2f7b53c1ccc9f1219fe1977"
|
||||
},
|
||||
"review-jet-f1e0342-20261015_recovery.json.gz": {
|
||||
"bytes": 35320,
|
||||
"sha256": "1444f7ca5825ce490660f38be89be0331f57a87a26828f9f25eaa123f3a93683"
|
||||
},
|
||||
"review-jet-f1e0342-20261015_removal.json": {
|
||||
"bytes": 942,
|
||||
"sha256": "00f9680a25e46a104e5eeb6dd42a762e9755964f4854d5312da51fa5c86d58e4"
|
||||
},
|
||||
"seal_receipt.py": {
|
||||
"bytes": 4270,
|
||||
"sha256": "3b71e9842c3f38a51fb359611dc5a4a1f5bfc389a997b8222f26ac02c808886a"
|
||||
},
|
||||
"source_objects_before.json.gz": {
|
||||
"bytes": 144229,
|
||||
"sha256": "b7eba34841f7cdb8b12718523233778ee241bd05a4cbdd2d3028e1dcc9d57bdf"
|
||||
}
|
||||
},
|
||||
"final_prepublication_footprint": {
|
||||
"output_bytes": 1805185024,
|
||||
"git_management_bytes": 64356352,
|
||||
"receipt_bytes": 6856704,
|
||||
"total_bytes": 1869541376
|
||||
},
|
||||
"no_new_branch": true,
|
||||
"no_force_push": true,
|
||||
"no_GitHub_publication": true,
|
||||
"no_source_history_pruning": true
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
Reviewed projected-pair chain integrated by ordinary fast-forward to Gitea dev.
|
||||
Remote dev:eec4677db1308e2a9ce4e5f195c994356c11de13;main unchanged:eeda651626dbbc4d9fb2695ad069898b0bbcd5ab.
|
||||
Commit source tree:f262316529a99eb922813212d0fbb0c6fb385590;constant default retained.
|
||||
Local dev preserved clean atf75d543586315b6272cfdf23046aa7d4550f5fbe because it is not ancestor
|
||||
of the remote baseline.No reset or unrelated local merge;all other local refs kept.
|
||||
Six clean inactive detached Jet source copies removed only after exact Git-blob
|
||||
recovery verification;all commits remain ancestors of remote dev.All source
|
||||
objects,common refs,scientific evidence/original archives,user files/environments
|
||||
and32 remaining worktrees preserved.Exact paths/commit IDs in JSON receipt.
|
||||
No new GPU/test run.Historical TG constant failure/aggregatefalse,Jet-CV mismatch
|
||||
and optional dependency issues kept separate from current LES pin resolution.
|
||||
Full before/after inventories and per-file recovery maps remain at/home/frank14f/CelerisLab/output/dev-projected-integration-eec4677-20261018 with hashes.
|
||||
Temporary footprint before this small receipt publication:1869541376bytes.
|
||||
-42
@@ -1,42 +0,0 @@
|
||||
{
|
||||
"files": {
|
||||
"INTEGRATION_CLEANUP_RECEIPT.json": {
|
||||
"bytes": 21807,
|
||||
"sha256": "91e30b209c92ee6c117d78caba4c2a07d2b52979f25828e7613070d7eeb682a2"
|
||||
},
|
||||
"README.txt": {
|
||||
"bytes": 1160,
|
||||
"sha256": "83ddbac006c836319f7d7dcc54923a87a63ae6ba98b469e8a651aa473290b45b"
|
||||
}
|
||||
},
|
||||
"candidate": "eec4677db1308e2a9ce4e5f195c994356c11de13",
|
||||
"source_scope": {
|
||||
"chain": [
|
||||
"ed9d8c937d446b854d6963bd92d718bb4fb98b96",
|
||||
"a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"1aa8110ec8caf04350638d2e07361ce72ba5d22e",
|
||||
"2cf9853952e52f59bea63cf5c1d3a1cd76e53eed",
|
||||
"eec4677db1308e2a9ce4e5f195c994356c11de13"
|
||||
],
|
||||
"production_src_tree": "f262316529a99eb922813212d0fbb0c6fb385590",
|
||||
"constant_default": "constant",
|
||||
"files": [
|
||||
"docs/development/projected_pair_explosion.md",
|
||||
"src/CelerisLab/lbm/kernels/blocks.cu",
|
||||
"src/CelerisLab/lbm/refinement_stepper.py",
|
||||
"src/CelerisLab/lbm/refinement_tables.py",
|
||||
"tests/unit/test_les_flow_runner.py",
|
||||
"tests/unit/test_projected_explosion.py",
|
||||
"tests/unit/test_projected_pair_gate.py",
|
||||
"tests/unit/test_projected_pair_stepper.py",
|
||||
"tests/validation/data/les_flow/source_pins_a135252.json",
|
||||
"tests/validation/multigrid/check_projected_pairs.py",
|
||||
"tests/validation/run_uniform_les_flow.py",
|
||||
"tests/validation/taylor_green/assess_projected_pairs.py",
|
||||
"tests/validation/taylor_green/run_case.py",
|
||||
"tests/validation/taylor_green/test_projected_pairs.py"
|
||||
],
|
||||
"diff_stat": " docs/development/projected_pair_explosion.md | 57 +++\n src/CelerisLab/lbm/kernels/blocks.cu | 33 ++\n src/CelerisLab/lbm/refinement_stepper.py | 29 +-\n src/CelerisLab/lbm/refinement_tables.py | 44 +++\n tests/unit/test_les_flow_runner.py | 57 ++-\n tests/unit/test_projected_explosion.py | 394 +++++++++++++++++++\n tests/unit/test_projected_pair_gate.py | 162 ++++++++\n tests/unit/test_projected_pair_stepper.py | 198 ++++++++++\n .../data/les_flow/source_pins_a135252.json | 110 ++++++\n .../validation/multigrid/check_projected_pairs.py | 425 ++++++++++++++++++++\n tests/validation/run_uniform_les_flow.py | 10 +-\n .../taylor_green/assess_projected_pairs.py | 208 ++++++++++\n tests/validation/taylor_green/run_case.py | 155 +++++++-\n .../taylor_green/test_projected_pairs.py | 434 +++++++++++++++++++++\n 14 files changed, 2269 insertions(+), 47 deletions(-)\n"
|
||||
},
|
||||
"original_archives_preserved": true
|
||||
}
|
||||
BIN
Binary file not shown.
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_projected_grid_11901a7_complete_20261018.zip",
|
||||
"bytes": 423726,
|
||||
"sha256": "c20e364e72b96858bf7bc317cba3d02a40e03be74ab1816048e78f7e89678f47",
|
||||
"source": "11901a7f77557a901e017a171eeae1758d584fa5",
|
||||
"numerical_source": "519473a61c7b319183aa54e55b9f097499dde0bf",
|
||||
"route": "ExistingGiteaevidencebranch fallback after explicitlyauthorized same-argumentDrive retry failed atOpenAI fileblob network transport;not an approval bypass",
|
||||
"scope": "Evidence-only transport;no oldsource harness integration;all originalmember bytes retained"
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
Matched projected-G diagnostic onexact11901a7/519numerics.
|
||||
Projected_linear passes allfrozen baselinegates;constantfailsvelocitygate;aggregatefails.
|
||||
All fourcasecontrols valid;finestcontrols andearlypressuretransients reported separately.
|
||||
Complete original receipts,failedattempts,recoveryauthorization,monitor drytests,source/build/PTX/runtime/protection records included.
|
||||
No production/default change,convergence ornewalgorithm qualification.
|
||||
ArchiveSHA256:c20e364e72b96858bf7bc317cba3d02a40e03be74ab1816048e78f7e89678f47
|
||||
BIN
Binary file not shown.
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_projected_pair_gate_1aa8110_20261018.zip",
|
||||
"bytes": 4551692,
|
||||
"sha256": "589a5537069cb7f10c6e349648aae2900b0af996b0dc1ac147a138581cb913e3",
|
||||
"baseline": "ed9d8c937d446b854d6963bd92d718bb4fb98b96",
|
||||
"candidate": "1aa8110ec8caf04350638d2e07361ce72ba5d22e",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"driver_sha256": "3dbaa6547cb0a4cb1541054f3b64ad8b6e18cc70527ac6166e56b944e9bd464a",
|
||||
"route": "Authorized evidence-only fallback to existing Gitea branch after confirmed Drive blob transport failure",
|
||||
"drive_failure": {
|
||||
"action": "Drive upload of exact complete archive",
|
||||
"folder_id": "1nMnnyD2UvwhdfNDHY_L1Bbn9LiDjr_WS",
|
||||
"status": "confirmed_transport_failure",
|
||||
"drive_file_id_returned": false,
|
||||
"approval_denial": false,
|
||||
"endpoint": "sdmntprcentralus.oaiusercontent.com",
|
||||
"elapsed_ms": 216022,
|
||||
"azure_client_request_id": "36a2db34-002d-432b-990c-66a228f87268",
|
||||
"reason": "OpenAI file blob upload failed: error sending request",
|
||||
"retry_attempted": false
|
||||
},
|
||||
"scope": "Complete original ZIP, no fragments; no source integration"
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
PASS: exact ed9d8c9 baseline versus exact 1aa8110 test-only candidate / a135252 production source.
|
||||
Six host guards and both sequential GPU processes passed; 136.855 seconds total.
|
||||
Six default bit-equivalence groups, six projected groups and two changed-remap groups passed.
|
||||
112 actual compiler sidecars retained and source/config/PTX verified.
|
||||
No production promotion/default change, main/dev update, LES re-pin or new conservation claim.
|
||||
Complete original evidence in one ZIP; all 57 manifest payloads verified.
|
||||
Drive blob ingress failed after 216022 ms before any Drive file ID; approved existing-branch fallback.
|
||||
Archive SHA256: 589a5537069cb7f10c6e349648aae2900b0af996b0dc1ac147a138581cb913e3
|
||||
BIN
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_projected_pairs_TG_2cf9853_20261018.zip",
|
||||
"bytes": 4567931,
|
||||
"sha256": "d312bfd0175e5a79d1a28a595ba229a6d8435ba13e3b9058c409fcc9737cafc1",
|
||||
"candidate": "2cf9853952e52f59bea63cf5c1d3a1cd76e53eed",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"source_fingerprint": "a5dbfd804befce868067d79a23e5fd47dce7f505b3f9b1bb2145fb57cb5f2178",
|
||||
"capture_helper_sha256": "3dbaa6547cb0a4cb1541054f3b64ad8b6e18cc70527ac6166e56b944e9bd464a",
|
||||
"route": "Authorized evidence-only fallback to existing Gitea branch after confirmed Drive blob transport failure",
|
||||
"drive_failure": {
|
||||
"action": "Upload intact CelerisLab_projected_pairs_TG_2cf9853_20261018.zip",
|
||||
"folder_id": "1nMnnyD2UvwhdfNDHY_L1Bbn9LiDjr_WS",
|
||||
"status": "confirmed_transport_failure",
|
||||
"drive_file_id_returned": false,
|
||||
"approval_denial": false,
|
||||
"endpoint": "sdmntprcentralus.oaiusercontent.com",
|
||||
"elapsed_ms": 216449,
|
||||
"azure_client_request_id": "2a1827d5-986d-4999-a920-9ea1bd63fba7",
|
||||
"reason": "OpenAI file blob upload failed: error sending request",
|
||||
"retry_attempted": false,
|
||||
"archive_sha256": "d312bfd0175e5a79d1a28a595ba229a6d8435ba13e3b9058c409fcc9737cafc1"
|
||||
},
|
||||
"scope": "Complete original ZIP, no fragments; no source integration"
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
Exact2cf9853 generic projected-pair TG repeat / a135252 production source.
|
||||
Four fresh cases and assessment completed,18.568578 seconds,589299712 active updates.
|
||||
Projected_linear PASS;constant velocity relative gate FAIL;aggregate FALSE.
|
||||
All absolute gates and case/control validity pass;all scalar samples identical to11901a7.
|
||||
19 host tests and dry-run passed;initial external count assertion retained.
|
||||
Six actual build sidecars/source/config/PTX verified;no tuning/default switch/source merge.
|
||||
Complete intact ZIP with105manifest payloads;authorized existing Gitea evidence branch fallback.
|
||||
Archive SHA256: d312bfd0175e5a79d1a28a595ba229a6d8435ba13e3b9058c409fcc9737cafc1
|
||||
@@ -1,37 +0,0 @@
|
||||
{
|
||||
"archives": [
|
||||
{
|
||||
"name": "CelerisLab_equilibrium_DFG_92da2e8_complete_results_20261018.tar.xz",
|
||||
"bytes": 637088,
|
||||
"sha256": "f0d45630c7d72f795ceccfd60a49b29881530903aaeb7b0a655c549ad1b40cd4",
|
||||
"credential_scan": "No credentials/private-key/access-token patterns,including decompressed protection inventories",
|
||||
"metadata_paths": "Only explicitly authorized CelerisLab project,existing interpreter and system/ephemeral paths",
|
||||
"source_fixture_literal": "/workspace/shared/dfg_research/20141124_dfg_bench2_official.zip",
|
||||
"no_unrelated_private_paths": true,
|
||||
"archive_bytes_unchanged": true,
|
||||
"no_credentials_or_unrelated_private_paths": true,
|
||||
"archive_member_bytes_preserved": true
|
||||
},
|
||||
{
|
||||
"name": "CelerisLab_shifted_unshifted_tiny_e8b8c58_20261018.zip",
|
||||
"bytes": 82506,
|
||||
"sha256": "81e05cf4c606310c966f905864497f0254edb70c77b107a6e77af570c7c54efa",
|
||||
"credential_scan": "No credentials/private-key/access-token patterns,including decompressed protection inventories",
|
||||
"metadata_paths": "Only explicitly authorized CelerisLab project,existing interpreter and system/ephemeral paths",
|
||||
"source_fixture_literal": null,
|
||||
"no_unrelated_private_paths": true,
|
||||
"archive_bytes_unchanged": true,
|
||||
"no_credentials_or_unrelated_private_paths": true,
|
||||
"archive_member_bytes_preserved": true
|
||||
},
|
||||
{
|
||||
"name": "CelerisLab_FP64_predictor_pair_5468695_20261018.zip",
|
||||
"bytes": 61110,
|
||||
"sha256": "28b6ce8804e3c448f829ea3516f8dff893373c899eb6d7b0f6a1d0edf6ca772e",
|
||||
"scope": "CPU scalar result only,source5468695 not merged into any GPU/production branch",
|
||||
"no_credentials_or_unrelated_private_paths": true,
|
||||
"archive_member_bytes_preserved": true
|
||||
}
|
||||
],
|
||||
"scope": "Intact original archives,transport only via existing validation branch;original result and qualification hash bindings preserved"
|
||||
}
|
||||
BIN
Binary file not shown.
@@ -1,30 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_uniform_LES_eec4677_20261018.zip",
|
||||
"bytes": 4528905,
|
||||
"sha256": "7b8e6951b24a8c2852387bc0a026e133c491931d97340056195a981fb51db879",
|
||||
"candidate": "eec4677db1308e2a9ce4e5f195c994356c11de13",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"source_fingerprint": "a5dbfd804befce868067d79a23e5fd47dce7f505b3f9b1bb2145fb57cb5f2178",
|
||||
"capture_helper_sha256": "3dbaa6547cb0a4cb1541054f3b64ad8b6e18cc70527ac6166e56b944e9bd464a",
|
||||
"route": "Authorized existing Gitea evidence branch fallback using documented current-session blob transport failures; no Drive submission for this archive",
|
||||
"drive_failure": {
|
||||
"status": "known_session_blob_transport_failure",
|
||||
"approval_denial": false,
|
||||
"this_archive_upload_attempted": false,
|
||||
"basis": [
|
||||
{
|
||||
"archive": "CelerisLab_projected_pairs_TG_2cf9853_20261018.zip",
|
||||
"status": "confirmed blob ingress transport failure",
|
||||
"endpoint": "sdmntprcentralus.oaiusercontent.com",
|
||||
"elapsed_ms": 216449,
|
||||
"azure_client_request_id": "2a1827d5-986d-4999-a920-9ea1bd63fba7"
|
||||
},
|
||||
{
|
||||
"archive": "CelerisLab_TG_2cf9853_REVIEW_SUBSET_20261018.zip",
|
||||
"status": "MCP upload timeout,no ID returned,two folder lookups found no matches"
|
||||
}
|
||||
],
|
||||
"current_archive_sha256": "7b8e6951b24a8c2852387bc0a026e133c491931d97340056195a981fb51db879"
|
||||
},
|
||||
"scope": "Complete original ZIP, no fragments; no source integration"
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
PASS: exacteec4677 existing uniform LES corrected regression / a135252 production source.
|
||||
12 host runner/oracle checks and one actual corrected GPU run passed,exit0.
|
||||
Three READY/reset records,DONEpassedtrue;Cs0/.16/1;6228 reported launches,10.535915seconds.
|
||||
Manifest pins101 sources;historical profiles unchanged.Three actual build sidecars/PTX/source/config audits passed.
|
||||
No baseline GPU,sweep,threshold/default/source integration changes;Cs1 amplified diagnostic only.
|
||||
Complete intact archive with47manifest payloads;all original bytes verified.
|
||||
Existing-session confirmed Drive blob failures used as authorized fallback basis;this archive not submitted to Drive.
|
||||
Archive SHA256: 7b8e6951b24a8c2852387bc0a026e133c491931d97340056195a981fb51db879
|
||||
BIN
Binary file not shown.
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_axis_square_afa8f6a_20261019.zip",
|
||||
"bytes": 170503,
|
||||
"sha256": "e5348495e462973df35ab8675d456f024856397232010e276e132d5c21609c5c",
|
||||
"candidate": "afa8f6aca10177d5901a9aeae650d3419212c6d0",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"source_branch": "tron/shear-probe-guards-caa573f",
|
||||
"diagnostic": "axis_square_shear_n128",
|
||||
"axis_module_sha256": "0baffa6eb99c268ce998d90300c993d45bb3b7b27c524b636874d75808bd0a8c",
|
||||
"screening_pass": null,
|
||||
"qualification_eligible": false,
|
||||
"all_traces_complete": true,
|
||||
"global_rows": 8,
|
||||
"trace_times": 36,
|
||||
"native_cell_time_triplets": 720,
|
||||
"independently_verified_before_cleanup": true,
|
||||
"matrix_assessor_run": false,
|
||||
"late_fit_performed": false,
|
||||
"physical_pass_claim": false,
|
||||
"route": "Existing Gitea validation evidence branch",
|
||||
"payload_scope": "Complete scientific ZIP, transport README and manifest only"
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
Short square shear orientation diagnostic: exact afa8f6aca10177d5901a9aeae650d3419212c6d0; production a135252ae78b47b57d7e77d19001700b3bedac8b unchanged.
|
||||
Four fresh cases, root steps 0..8 only; no extra cases or broad test reruns.
|
||||
axis_square_shear_n128; mode(2,0), phase pi/4, POST-G initialization, square(32,32,96,96).
|
||||
8 global rows, 36 trace times, 720 native rho/ux/uy cell-time triplets; six build sidecars audited before cleanup.
|
||||
screening_pass=null; qualification_eligible=false; no late fit or physical pass claim.
|
||||
Signed unit-area native group moments retain actual centers, widths, areas and parity; no interpolation.
|
||||
Root-sync samples do not resolve fine substeps. No snapshot, field dump, checkpoint or rerun.
|
||||
Archive SHA256: e5348495e462973df35ab8675d456f024856397232010e276e132d5c21609c5c
|
||||
Only intended scientific files; no task history or process listings.
|
||||
BIN
Binary file not shown.
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_centered_face_3552e6e_20261019.zip",
|
||||
"bytes": 681926,
|
||||
"sha256": "0cc8db143a72d6f3a2957a27279b4fa4a7b76d4d20a2da1ea48599e0f250eb79",
|
||||
"candidate": "3552e6ee92696415491e756824887a3dbbbec492",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"source_branch": "experiment/centered-face-square",
|
||||
"diagnostic": "centered_face_square_n128",
|
||||
"advance_to_review": false,
|
||||
"checks": {
|
||||
"bottom_step1_clear": true,
|
||||
"top_step1_nonworse": false,
|
||||
"bottom_step8_nonworse": true,
|
||||
"top_step8_nonworse": true,
|
||||
"vertical_null": true,
|
||||
"acoustic_nonworse": false,
|
||||
"sampled_pressure_nonworse": true,
|
||||
"step8_pressure_nonworse": true
|
||||
},
|
||||
"qualification_eligible": false,
|
||||
"qualified": false,
|
||||
"global_rows": 8,
|
||||
"trace_times": 36,
|
||||
"native_cell_time_triplets": 720,
|
||||
"actual_source_config_ptx_captured_and_verified_before_cleanup": true,
|
||||
"official_comparison_serialization_failed": true,
|
||||
"recovered_unchanged_comparison": true,
|
||||
"no_gpu_reruns": true,
|
||||
"physical_pass_claim": false,
|
||||
"route": "Existing Gitea validation evidence branch",
|
||||
"payload_scope": "Complete scientific ZIP, transport README and manifest only"
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
Centered-face square experimental comparison: exact 3552e6ee92696415491e756824887a3dbbbec492; production a135252ae78b47b57d7e77d19001700b3bedac8b unchanged.
|
||||
Four fresh sequential cases: U128/U256/current projected/centered_face_v1. Root steps 0..8 only.
|
||||
1900544 ACTIVE updates, 8 global rows, 36 trace times, 720 native cell-time triplets; six actual source/config/PTX builds captured and audited before cleanup.
|
||||
Recovered unchanged comparison: advance_to_review=false; top_step1_nonworse and acoustic_nonworse fail.
|
||||
Official comparison CLI exit1 was a NumPy bool_ JSON serialization defect; partial output and traceback retained. Host-only comparison recovery converted scalar types only. No GPU or CLI reruns.
|
||||
qualification_eligible=false; qualified=false; no physical pass or main promotion. Local arithmetic deadbands are not accumulated error bounds.
|
||||
Archive SHA256: 0cc8db143a72d6f3a2957a27279b4fa4a7b76d4d20a2da1ea48599e0f250eb79
|
||||
Only intended scientific files; no task history, process listings or approval exchanges.
|
||||
BIN
Binary file not shown.
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_nested_shear_335624c_20261019.zip",
|
||||
"bytes": 2110640,
|
||||
"sha256": "8ff04b86f58d5e863394fedf8a87648879cdf7277b6d1bb326208858322d3e04",
|
||||
"snapshot_sha256": "4e8b8af02ba54db48dc2ea36f24c16fc6004f77e4c8f143fca809ec7fbaa7884",
|
||||
"candidate": "335624c27b8fc9925e708fb61bde5eea5c04d2a4",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"diagnostic": "nested_shear_n128",
|
||||
"scientific_status": "FAIL",
|
||||
"contract_valid": true,
|
||||
"route": "Existing authorized Gitea validation evidence branch",
|
||||
"payload_scope": "Complete scientific ZIP, transport README and manifest only"
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
Nested shear validation: exact 335624c27b8fc9925e708fb61bde5eea5c04d2a4; production a135252ae78b47b57d7e77d19001700b3bedac8b unchanged.
|
||||
57 host tests and four source-only dry runs passed. Four fresh GPU cases completed
|
||||
sequentially; valid frozen scientific outcome: FAIL.
|
||||
Both uniform controls pass; constant and projected depth-3 runs fail own pressure
|
||||
and comparative rate/residual/pressure budgets. No rerun or tuning.
|
||||
Eight actual build sidecars audited; one projected final macro snapshot, no
|
||||
population dump or time series. Complete original archive with 66 intended members.
|
||||
Archive SHA256: 8ff04b86f58d5e863394fedf8a87648879cdf7277b6d1bb326208858322d3e04
|
||||
Snapshot SHA256: 4e8b8af02ba54db48dc2ea36f24c16fc6004f77e4c8f143fca809ec7fbaa7884
|
||||
Archive excludes private task history, process listings and unrelated artifacts.
|
||||
This evidence-only commit changes no source branch or source file.
|
||||
Binary file not shown.
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_postg_70c83b7_20261019.zip",
|
||||
"bytes": 575798,
|
||||
"sha256": "0e18ae96a1f3e87f0482385b8c683d9e8a349de39c4155dd7bcedc1686200cf6",
|
||||
"candidate": "70c83b7233888cb7287c8d1905563590c9e72ef4",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"source_branch": "tron/shear-probe-guards-caa573f",
|
||||
"diagnostic": "postg_shear_n128",
|
||||
"initialization_id": "postg_first_gradient_v1",
|
||||
"qualification_eligible": false,
|
||||
"initializer_sha256": "9c909fa013c092490ee21532e3125b2a78a4c5102c7a1bdc0e76986d3f0ef903",
|
||||
"probe_module_sha256": "e2e6490d281cc275f448dc6d6ea7b9b4407cc74a51e9256b86c08c8626b89b76",
|
||||
"all_trace_complete": true,
|
||||
"total_trace_rows": 774,
|
||||
"independently_verified_before_cleanup": true,
|
||||
"matrix_assessor_run": false,
|
||||
"route": "Existing authorized Gitea validation evidence branch",
|
||||
"payload_scope": "Complete scientific ZIP, transport README and manifest only"
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
POST-G startup counterfactual: exact 70c83b7233888cb7287c8d1905563590c9e72ef4; production a135252ae78b47b57d7e77d19001700b3bedac8b and equilibrium oracle unchanged.
|
||||
76 host tests and three exact dry runs pass; three fresh serial cases, no matrix assessor.
|
||||
postg_shear_n128; initialization_id=postg_first_gradient_v1; qualification_eligible=false.
|
||||
All traces complete: True; total trace rows: 774.
|
||||
15 main rows, 24 probes, five source/config/PTX sidecars independently verified before cleanup.
|
||||
Equilibrium source1f64f7e cases are historical controls; per-time metrics compared without scalar-equality assertions.
|
||||
Finite projected scalar failure retained. Startup compatibility diagnostic only, not a production fix or long-time qualification.
|
||||
No extra cases, tuning, reruns, snapshots, field dumps or checkpoints. Fine substeps unresolved.
|
||||
Archive SHA256: 0e18ae96a1f3e87f0482385b8c683d9e8a349de39c4155dd7bcedc1686200cf6
|
||||
Only intended scientific files; no task history or process listings.
|
||||
BIN
Binary file not shown.
@@ -1,30 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_scaled_n256_92b8afe_20261019.zip",
|
||||
"bytes": 4047594,
|
||||
"sha256": "e1a970d0359c8a5f2df6a66bad4c8b8ab64e01fac4f7660ac8e604046f89abcb",
|
||||
"candidate": "92b8afeeed66c8ac05b37e90d0a592b2b3d0ce01",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"source_fingerprint": "a5dbfd804befce868067d79a23e5fd47dce7f505b3f9b1bb2145fb57cb5f2178",
|
||||
"capture_helper_sha256": "3dbaa6547cb0a4cb1541054f3b64ad8b6e18cc70527ac6166e56b944e9bd464a",
|
||||
"route": "Authorized existing Gitea evidence branch fallback using documented current-session blob transport failures; no Drive submission for this archive",
|
||||
"drive_failure": {
|
||||
"status": "known_session_blob_transport_failure",
|
||||
"approval_denial": false,
|
||||
"this_archive_upload_attempted": false,
|
||||
"basis": [
|
||||
{
|
||||
"archive": "CelerisLab_projected_pairs_TG_2cf9853_20261018.zip",
|
||||
"status": "confirmed blob ingress transport failure",
|
||||
"endpoint": "sdmntprcentralus.oaiusercontent.com",
|
||||
"elapsed_ms": 216449,
|
||||
"azure_client_request_id": "2a1827d5-986d-4999-a920-9ea1bd63fba7"
|
||||
},
|
||||
{
|
||||
"archive": "CelerisLab_TG_2cf9853_REVIEW_SUBSET_20261018.zip",
|
||||
"status": "MCP upload timeout,no ID returned,two folder lookups found no matches"
|
||||
}
|
||||
],
|
||||
"current_archive_sha256": "e1a970d0359c8a5f2df6a66bad4c8b8ab64e01fac4f7660ac8e604046f89abcb"
|
||||
},
|
||||
"scope": "Complete original ZIP, no fragments; no source integration"
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
Exact92b8afe bounded scaled_n256 same-placement resolution diagnostic / unchangeda135252 production.
|
||||
22 host tests and four dry guards passed;four fresh GPU cases+assessment completed41.122633seconds.
|
||||
4714397696 active updates;constant/projected/aggregate frozen gates allPASS.
|
||||
Uniform256 fresh/historical main+early bridge and recorded runtime identical.
|
||||
AMR velocity/pressure/energy raw errors lower at all4postinitial times;mass errors higher.
|
||||
Uniform512 controls not uniformly better;all6relative budgets floor-dominated;no convergence certificate.
|
||||
Six actual build sidecars/source/config/PTX audits pass.Original pinned2cf references included separately.
|
||||
Complete intact ZIP with117manifest payloads;no source push/default change/extra case/tuning.
|
||||
Known session Drive blob transport failures used as authorized existing Gitea fallback;this archive not submitted to Drive.
|
||||
Archive SHA256: e1a970d0359c8a5f2df6a66bad4c8b8ab64e01fac4f7660ac8e604046f89abcb
|
||||
BIN
Binary file not shown.
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_scaled_shear_9748ef9_20261019.zip",
|
||||
"bytes": 4084568,
|
||||
"sha256": "81db3d724a7de1d08202bf693d9ef94ff1a8ade086614b843868657d9de54dda",
|
||||
"candidate": "9748ef91ef3bfd366756ef0c8a056df8faa75679",
|
||||
"review_base": "eec4677db1308e2a9ce4e5f195c994356c11de13",
|
||||
"flow": "shear_wave",
|
||||
"shear_wave_sha256": "81d5c8ee60864372887cddf9239580c82fb6750d956038f1e3ee9de61aa4e877",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"source_fingerprint": "a5dbfd804befce868067d79a23e5fd47dce7f505b3f9b1bb2145fb57cb5f2178",
|
||||
"capture_helper_sha256": "3dbaa6547cb0a4cb1541054f3b64ad8b6e18cc70527ac6166e56b944e9bd464a",
|
||||
"route": "Authorized existing Gitea evidence branch fallback using documented current-session blob transport failures; no Drive submission for this archive",
|
||||
"drive_failure": {
|
||||
"status": "known_session_blob_transport_failure",
|
||||
"approval_denial": false,
|
||||
"this_archive_upload_attempted": false,
|
||||
"basis": [
|
||||
{
|
||||
"archive": "CelerisLab_projected_pairs_TG_2cf9853_20261018.zip",
|
||||
"status": "confirmed blob ingress transport failure",
|
||||
"endpoint": "sdmntprcentralus.oaiusercontent.com",
|
||||
"elapsed_ms": 216449,
|
||||
"azure_client_request_id": "2a1827d5-986d-4999-a920-9ea1bd63fba7"
|
||||
},
|
||||
{
|
||||
"archive": "CelerisLab_TG_2cf9853_REVIEW_SUBSET_20261018.zip",
|
||||
"status": "MCP upload timeout,no ID returned,two folder lookups found no matches"
|
||||
}
|
||||
],
|
||||
"current_archive_sha256": "81db3d724a7de1d08202bf693d9ef94ff1a8ade086614b843868657d9de54dda"
|
||||
},
|
||||
"scope": "Complete original ZIP, no fragments; no source integration"
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
Exact9748ef9 scaled oblique(2,1) shear-wave diagnostic;production unchanged a135252.
|
||||
51 host tests/four source-only preflights passed;four fixed fresh cases and assessment completed 19.712796s.
|
||||
4714397696 active updates;contract_valid=True;scientificstatus=FAIL;passed=False.
|
||||
Independent uniform256 bridge:complete scalar rows/build sidecars/runtime exact to retained de5b0cc.
|
||||
Both uniform controls pass own screens;projected256 own/budget/controlled PASS.
|
||||
Constant256 pressure own screen and rate/residual/pressure budgets FAIL;finite exit1 retained.
|
||||
Signed rate bias,excess over BOTH controls,raw/scaled pressure,full modal/phase/mass and interval data retained.
|
||||
All six actual sidecars independently audited;no tuning,retry,extra cases,source publication or integration.
|
||||
Two resolutions/one phase and placement give descriptive trends,not an order or localization proof.
|
||||
Known session Drive blob transport failure used for authorized Gitea fallback;this archive not submitted to Drive.
|
||||
Complete original ZIP;archive SHA256:81db3d724a7de1d08202bf693d9ef94ff1a8ade086614b843868657d9de54dda
|
||||
BIN
Binary file not shown.
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_shear_wave_de5b0cc_20261019.zip",
|
||||
"bytes": 4031180,
|
||||
"sha256": "a8924472f25c61dc107f344a80cd8d07baa35772542bf76357475d0c3346cffa",
|
||||
"candidate": "de5b0cc080794d0ce44d37f845aa8e8dbf8c2016",
|
||||
"review_base": "eec4677db1308e2a9ce4e5f195c994356c11de13",
|
||||
"flow": "shear_wave",
|
||||
"shear_wave_sha256": "81d5c8ee60864372887cddf9239580c82fb6750d956038f1e3ee9de61aa4e877",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"source_fingerprint": "a5dbfd804befce868067d79a23e5fd47dce7f505b3f9b1bb2145fb57cb5f2178",
|
||||
"capture_helper_sha256": "3dbaa6547cb0a4cb1541054f3b64ad8b6e18cc70527ac6166e56b944e9bd464a",
|
||||
"route": "Authorized existing Gitea evidence branch fallback using documented current-session blob transport failures; no Drive submission for this archive",
|
||||
"drive_failure": {
|
||||
"status": "known_session_blob_transport_failure",
|
||||
"approval_denial": false,
|
||||
"this_archive_upload_attempted": false,
|
||||
"basis": [
|
||||
{
|
||||
"archive": "CelerisLab_projected_pairs_TG_2cf9853_20261018.zip",
|
||||
"status": "confirmed blob ingress transport failure",
|
||||
"endpoint": "sdmntprcentralus.oaiusercontent.com",
|
||||
"elapsed_ms": 216449,
|
||||
"azure_client_request_id": "2a1827d5-986d-4999-a920-9ea1bd63fba7"
|
||||
},
|
||||
{
|
||||
"archive": "CelerisLab_TG_2cf9853_REVIEW_SUBSET_20261018.zip",
|
||||
"status": "MCP upload timeout,no ID returned,two folder lookups found no matches"
|
||||
}
|
||||
],
|
||||
"current_archive_sha256": "a8924472f25c61dc107f344a80cd8d07baa35772542bf76357475d0c3346cffa"
|
||||
},
|
||||
"scope": "Complete original ZIP, no fragments; no source integration"
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
Exactde5b0cc first bounded oblique(2,1) shear-wave diagnostic / unchangeda135252 production.
|
||||
43 host checks and four source-only preflights passed;four fresh physical cases+assessment completed12.081603seconds.
|
||||
589299712 active updates;valid finite data,contract_validtrue,scientificassessmentFAIL.
|
||||
Both uniform controls own screensPASS;constant pressure screenFAIL(exit1 retained).
|
||||
Projected own screensPASS,but rate/residual controlled budgetsFAIL;no controlled-pass.
|
||||
All fits available;modal/phase,fit/interval rates,residuals,raw/scaled spuriouspressure andmass retained.
|
||||
Pressure usescontinuumA_exact^2/4,notTG pressure semantics;coefficient-one|kh|² screens diagnostic only.
|
||||
Six actual sidecars/source/config/PTX audits pass;no tuning/retry/source publication/merge.
|
||||
Complete intact ZIP with114manifest payloads;older92b8afe object/bundle/archive preserved.
|
||||
Known session Drive blob transport failures used as authorized existing Gitea fallback;this archive not submitted to Drive.
|
||||
Archive SHA256: a8924472f25c61dc107f344a80cd8d07baa35772542bf76357475d0c3346cffa
|
||||
BIN
Binary file not shown.
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_signed_probes_1f64f7e_20261019.zip",
|
||||
"bytes": 777103,
|
||||
"sha256": "3cc338af0bad8e44ff5bd89232f2981e513797875b58d8aa3ed3ae6d2ce7f97e",
|
||||
"candidate": "1f64f7eb11c14ae1106136de941b74a02142382e",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"source_branch": "tron/shear-probe-guards-caa573f",
|
||||
"probe_module_sha256": "e2e6490d281cc275f448dc6d6ea7b9b4407cc74a51e9256b86c08c8626b89b76",
|
||||
"scalar_rows_and_checked_runtime_exact": true,
|
||||
"mechanism_diagnostic_usable": true,
|
||||
"independently_verified_before_cleanup": true,
|
||||
"matrix_assessor_run": false,
|
||||
"route": "Existing authorized Gitea validation evidence branch",
|
||||
"payload_scope": "Complete scientific ZIP, transport README and manifest only"
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
Signed shear probes: exact 1f64f7eb11c14ae1106136de941b74a02142382e; production a135252ae78b47b57d7e77d19001700b3bedac8b unchanged.
|
||||
68 host tests and four exact dry runs pass; four fresh serial cases; no matrix assessor.
|
||||
20 main rows match audited previous rows. All four raw traces are retained when valid, with 258 root times and 24 probes.
|
||||
Seven actual source/config/PTX sidecars independently verified before module load and compiler cleanup.
|
||||
Scalar consistency: True; mechanism usable: True.
|
||||
Nested projected finite scalar screen failure preserved. No algorithm changes, reruns, snapshots, populations or checkpoints.
|
||||
Root-sync samples do not resolve fine substeps; actual centers and displacements retained.
|
||||
Archive SHA256: 3cc338af0bad8e44ff5bd89232f2981e513797875b58d8aa3ed3ae6d2ce7f97e
|
||||
Only intended scientific files; no task history or process listings; no source-branch changes in this evidence commit.
|
||||
BIN
Binary file not shown.
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_twin_shear_02bde0f_20261019.zip",
|
||||
"bytes": 127830,
|
||||
"sha256": "a93ec5a45868cc0c550588a0eacc6702f442d4b7675cff82608694bcf4117451",
|
||||
"candidate": "02bde0f75187786a2ce10abc9a863f750b6343a8",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"diagnostic": "twin_shear_n128",
|
||||
"scientific_status": "FAIL",
|
||||
"contract_valid": true,
|
||||
"audit_order_limitation": "Sidecars and PTX hashes were captured/verified before cleanup. Independent source/config reconstruction occurred after cleanup; the requested independent pre-cleanup source audit was not performed. No rerun or source fix.",
|
||||
"independent_pre_cleanup_source_audit_complete": false,
|
||||
"route": "Existing authorized Gitea validation evidence branch",
|
||||
"payload_scope": "Complete scientific ZIP, transport README and manifest only"
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
Depth-2 twin shear validation: exact 02bde0f75187786a2ce10abc9a863f750b6343a8; production a135252ae78b47b57d7e77d19001700b3bedac8b unchanged.
|
||||
61 host tests and four dry runs pass; four fresh serial cases; scientific FAIL, contract valid.
|
||||
Controls pass. Constant fails own pressure and comparative rate/residual/pressure budgets.
|
||||
Projected passes own screens and pressure budget, but fails comparative rate/residual budgets.
|
||||
Six actual sidecars independently reconstructed after scratch cleanup; requested independent pre-cleanup audit was not performed.
|
||||
No GPU rerun, tuning, snapshots, early traces, checkpoints or population dumps.
|
||||
Audit-order limitation: Sidecars and PTX hashes were captured/verified before cleanup. Independent source/config reconstruction occurred after cleanup; the requested independent pre-cleanup source audit was not performed. No rerun or source fix.
|
||||
Archive SHA256: a93ec5a45868cc0c550588a0eacc6702f442d4b7675cff82608694bcf4117451
|
||||
Only intended scientific files; no task history or process listings; no source-branch changes.
|
||||
Binary file not shown.
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"archive": "CelerisLab_wide_x_be8e6d6_20261019.zip",
|
||||
"bytes": 260873,
|
||||
"sha256": "ff50714f38df9c2ce37ce8e11bd88751477133a62b9fadd5da54a3be47705d1e",
|
||||
"candidate": "be8e6d691d6d18baa8403f2d942b5aa382456ac1",
|
||||
"production": "a135252ae78b47b57d7e77d19001700b3bedac8b",
|
||||
"source_branch": "tron/shear-probe-guards-caa573f",
|
||||
"preset_sha256": "13d16ba355117e2d074edccd9dc5d694c2fc13c673a0abdfca6401f6ed917733",
|
||||
"probe_module_sha256": "e2e6490d281cc275f448dc6d6ea7b9b4407cc74a51e9256b86c08c8626b89b76",
|
||||
"runner_screening_pass": false,
|
||||
"mechanism_diagnostic_usable": true,
|
||||
"independently_verified_before_cleanup": true,
|
||||
"matrix_assessor_run": false,
|
||||
"route": "Existing authorized Gitea validation evidence branch",
|
||||
"payload_scope": "Complete scientific ZIP, transport README and manifest only"
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
Wide-x projected three-level shear: exact be8e6d691d6d18baa8403f2d942b5aa382456ac1; production a135252ae78b47b57d7e77d19001700b3bedac8b unchanged.
|
||||
72 host tests and one exact dry run pass; one fresh GPU case, no controls or matrix assessor.
|
||||
Runner screen pass: False; mechanism usable: True.
|
||||
Five main rows, 258 root trace times, unchanged 24 targets and three independently verified pre-cleanup build sidecars.
|
||||
Twenty probe locations match original nested, four horizontal probes shift; changed locations excluded from direct comparisons.
|
||||
None crosses the new x=28 face. No qualification pass, reflection proof or pure gap-effect claim. Fine substeps unresolved.
|
||||
No algorithm changes, reruns, snapshots, field dumps or checkpoints.
|
||||
Archive SHA256: ff50714f38df9c2ce37ce8e11bd88751477133a62b9fadd5da54a3be47705d1e
|
||||
Only intended scientific files; no task history or process listings.
|
||||
Reference in New Issue
Block a user