Blocked fine: fix INNER assertion, skip empty halo uploads, explicit fixture

- GPU test: after hop 2 some INNER_GHOST populations are NaN (pulled from
  OUTER poisoned on hop 1; 236 slots in pinned CPUREF); assert ACTIVE
  finite and OUTER NaN, keep the full dense-vs-blocked raw value/NaN-mask
  comparison.
- A 1x1 non-periodic fine layout has zero halo pairs: skip the halo table
  uploads (CUDA rejects mem_alloc(0)); _fine_halo already skips launch.
  CPU guard test with driver doubles.
- Drop the class-level fine_layout default; the followup fake backend now
  sets fine_layout = None explicitly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-15 03:52:42 +00:00
1 parent dc5850c198
commit 59921a0181
3 files changed
+35 -6

No files matched your search

+3 -4
View File
@@ -72,8 +72,6 @@ class FixedPatchStepper:
only, ACTIVE collide); halos are gathered before each fine hop. Public
arrays keep the dense (9, ny, nx) fine shape; only the allocation differs.
"""
fine_layout = None # dense fine storage unless fine_block is given
def __init__(self, cfg, bounds, *, context, coarse_boundary="periodic", fine_objects=(),
fine_block=None):
if HALO != 4:
@@ -169,8 +167,9 @@ class FixedPatchStepper:
else:
self._children = self._upload(tables[1])
self._kind = self._upload(tables[2])
self._halo_dst = self._upload(layout.halo_dst)
self._halo_src = self._upload(layout.halo_src)
if len(layout.halo_dst): # a 1x1 non-periodic layout has no pairs
self._halo_dst = self._upload(layout.halo_dst)
self._halo_src = self._upload(layout.halo_src)
module = self._levels[1].module
self._explode = module.get_function("BlockExplode")
self._halo_copy = module.get_function("BlockHaloCopy")