From 050d12b76c800b3543234d6b4c0a122752d17d12 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 21 Oct 2026 02:00:15 +0000 Subject: [PATCH] P1 (10/n): blocked-fine GPU/CPU tests use the level-list constructor Dense root + blocked fine level is level_blocks=[None, block]; bodies go to level_objects[1]. Both before-CUDA rejections (non-dividing and malformed fine block) keep their inputs. Assertions unchanged. Co-Authored-By: Claude Opus 5.5 --- .../multigrid/test_refinement_blocked_fine.py | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/tests/validation/multigrid/test_refinement_blocked_fine.py b/tests/validation/multigrid/test_refinement_blocked_fine.py index 23e36e6..6a0351f 100644 --- a/tests/validation/multigrid/test_refinement_blocked_fine.py +++ b/tests/validation/multigrid/test_refinement_blocked_fine.py @@ -105,9 +105,10 @@ class BlockedFineCPU(unittest.TestCase): return Mock(activate=Mock(side_effect=AssertionError("CUDA reached")), sm_arch="sm_70") def test_rejections_before_cuda(self): - for kw in ({"fine_block": (7, 7)}, {"fine_block": (16,)}): + for kw in ({"level_blocks": [None, (7, 7)]}, {"level_blocks": [None, (16,)]}): with self.subTest(kw=kw), self.assertRaises(ValueError): - FixedPatchStepper(config("periodic"), BOUNDS, context=self.forbidden_context(), **kw) + FixedPatchStepper(config("periodic"), context=self.forbidden_context(), + refinements=[BOUNDS], **kw) def test_single_block_layout_allocates_no_empty_halo_tables(self): # A 1x1 non-periodic fine layout has zero halo pairs; CUDA rejects mem_alloc(0). @@ -125,8 +126,8 @@ class BlockedFineCPU(unittest.TestCase): patch.object(compiler, "compile_kernel"), patch.object(compiler, "cleanup_build_dir"), \ patch.object(compiler, "load_module", return_value=module), \ patch.object(cuda, "mem_alloc", side_effect=alloc), patch.object(cuda, "memcpy_htod"): - backend = FixedPatchStepper(config("periodic"), BOUNDS, context=context, - fine_block=FINE_BLOCKS[0]) + backend = FixedPatchStepper(config("periodic"), context=context, refinements=[BOUNDS], + level_blocks=[None, FINE_BLOCKS[0]]) self.assertEqual(len(backend.fine_layout.halo_dst), 0) self.assertIsNone(backend._levels[1].halo_dst) backend._gather_halo(backend._levels[1], Mock()) # no launch without pairs @@ -177,8 +178,9 @@ class BlockedFineCPU(unittest.TestCase): patch.object(cuda, "mem_alloc", side_effect=lambda size: Mock()), \ patch.object(cuda, "memcpy_htod"), \ patch.object(curved_links, "CurvedLinkSoA", side_effect=AssertionError("dense SoA built")): - backend = FixedPatchStepper(config("periodic"), BOUNDS, context=context, - fine_objects=objects, fine_block=FINE_BLOCKS[1]) + backend = FixedPatchStepper(config("periodic"), context=context, refinements=[BOUNDS], + level_blocks=[None, FINE_BLOCKS[1]], + level_objects=[(), tuple(objects)]) backend.initialize(state(NY, NX, 1), state(*backend.patch.fine_shape, 2)) return backend, calls @@ -289,8 +291,9 @@ class BlockedFineGPU(unittest.TestCase): results = [] with CudaContext(0) as context: for fine_block in (None, *FINE_BLOCKS): - with FixedPatchStepper(cfg, BOUNDS, context=context, coarse_boundary=mode, - fine_block=fine_block) as backend: + with FixedPatchStepper(cfg, context=context, coarse_boundary=mode, + refinements=[BOUNDS], + level_blocks=[None, fine_block]) as backend: backend.initialize(g_coarse, g_fine) backend.step(STEPS) self.assertEqual(backend.step_count, STEPS) @@ -318,8 +321,9 @@ class BlockedFineGPU(unittest.TestCase): results = [] with CudaContext(0) as context: for fine_block in (None, *FINE_BLOCKS): - with FixedPatchStepper(cfg, BOUNDS, context=context, coarse_boundary=mode, - fine_objects=[circle()], fine_block=fine_block) as backend: + with FixedPatchStepper(cfg, context=context, coarse_boundary=mode, + refinements=[BOUNDS], level_blocks=[None, fine_block], + level_objects=[(), (circle(),)]) as backend: backend.initialize(g_coarse, g_fine) backend.step(STEPS) results.append((backend.download(), raw(backend))) @@ -346,9 +350,9 @@ class BlockedFineGPU(unittest.TestCase): results = [] with CudaContext(0) as context: for fine_block in (None, *FINE_BLOCKS): - with FixedPatchStepper(cfg, BOUNDS, context=context, coarse_boundary=mode, - fine_objects=[circle(actuation(speed))], - fine_block=fine_block) as backend: + with FixedPatchStepper(cfg, context=context, coarse_boundary=mode, + refinements=[BOUNDS], level_blocks=[None, fine_block], + level_objects=[(), (circle(actuation(speed)),)]) as backend: backend.initialize(g_coarse, g_fine) backend.step(STEPS) results.append((backend.download(), raw(backend)))