diff --git a/src/CelerisLab/lbm/refinement_stepper.py b/src/CelerisLab/lbm/refinement_stepper.py index 4f38244..bfaef56 100644 --- a/src/CelerisLab/lbm/refinement_stepper.py +++ b/src/CelerisLab/lbm/refinement_stepper.py @@ -317,26 +317,25 @@ class FixedPatchStepper: self._window_valid = False self._window_start = None self._exchange_valid = False - self._exchange_spacing = tuple(self.hierarchy.edge_frame(l)[1] for l in range(depth)) - self._exchange_centers = tuple(tuple(tuple(o.geometry.center) for o in objects) - for objects in level_objects) root = None if depth == 1 and level_objects[0]: tables = static_circle_tables(self._layouts[0], level_objects[0]) root = _BlockedBoundary(None, tables, (), False) # The one boundary/Jet record per level; host geometry and Jets are views of it. - self._device_boundaries = [root] + [ + self._boundaries = [root] + [ _prepare_blocked_boundary(hosts[level], self._layouts[level], self._level_cfgs[level], level_jets[level], _shifted_blocked=self._ddf_shifting) for level in range(1, depth)] - self._leaf = _fluid_leaves(self.hierarchy, self._device_boundaries) + for level, b in enumerate(self._boundaries): + if b is not None: # exchange scaling (dt_l = h_l) and root-edge-frame moment centers + b.spacing = self.hierarchy.edge_frame(level)[1] + b.centers = tuple(tuple(o.geometry.center) for o in level_objects[level]) + self._leaf = _fluid_leaves(self.hierarchy, self._boundaries) self._state = [mask.copy() for mask in self._leaf] if self._channel: self._leaf[0] &= channel_masks((cfg.ny, cfg.nx))[0] - # Private constructor inputs for remap_finest. - self._root_cfg = replace(cfg) - self._level_blocks = level_blocks + self._root_cfg = replace(cfg) # private constructor input for remap_finest self.ctx = context self._lock = RLock() self._status = "new" @@ -391,7 +390,7 @@ class FixedPatchStepper: for index, layout in enumerate(self._layouts): total += 2 * 4 * int(np.prod(layout.blocked_shape)) total += layout.halo_dst.nbytes + layout.halo_src.nbytes - b = self._device_boundaries[index] + b = self._boundaries[index] if b is not None: total += sum(np.asarray(v).nbytes for k, v in b.tables.items() if k == "flags" or k in BLOCKED_BOUNDARY_DEVICE_COLUMNS) @@ -414,7 +413,7 @@ class FixedPatchStepper: grid = ((config.nx + self._block[0] - 1) // self._block[0], config.ny, layout.nblocks) level = _Level(shape, module, self._allocate(size), self._allocate(size), module.get_function(name), grid, layout) - level.boundary = self._device_boundaries[index] + level.boundary = self._boundaries[index] level.halo_copy = module.get_function("BlockHaloCopy") if len(layout.halo_dst): level.halo_dst = self._upload(layout.halo_dst) @@ -576,12 +575,12 @@ class FixedPatchStepper: pairs = self.hierarchy.pairs if (self._wall_aware or self._channel or self.hierarchy.depth != 3 or not isinstance(pairs[1], FixedPatchSet2D) - or any(b is not None for b in self._device_boundaries[:2])): + or any(b is not None for b in self._boundaries[:2])): raise ValueError("remap_finest requires a periodic three-level hierarchy with a " "level-2 set and no level-0/1 bodies") cfg = self._root_cfg objects = tuple(objects) - actual = self._device_boundaries[2] + actual = self._boundaries[2] jets = () if actual is None else actual.jets old = RemapTopology.from_config(cfg, pairs[0], pairs[1].bounds, child_objects=objects, child_jets=jets, @@ -603,7 +602,7 @@ class FixedPatchStepper: or not np.array_equal(old.surface_velocity, new.surface_velocity)): raise ValueError("remap requires the identical pinned physical boundary and BFL support") # Check sparse block alignment/launch size before any device read/allocation. - layout = new.child.fine_layout(self._level_blocks[2]) + layout = new.child.fine_layout(self._layouts[2].block) if layout.nblocks > MAX_GRID_DIM or layout.local_shape[0] > MAX_GRID_DIM: raise ValueError("level 2 blocks exceed launch limits") with self.ctx.activate(): @@ -621,7 +620,7 @@ class FixedPatchStepper: phase="postcollision_g", **options) candidate = type(self)( cfg, context=self.ctx, refinements=[pairs[0].bounds, new.child.bounds], - level_blocks=list(self._level_blocks), + level_blocks=[layout.block for layout in self._layouts], level_objects=[(), (), objects], level_jets=[(), (), jets], observe_raw_exchange=self._observe_raw_exchange, observe_window_exchange=self._observe_window, explosion=self._explosion) @@ -651,7 +650,7 @@ class FixedPatchStepper: if (isinstance(level, bool) or not isinstance(level, Integral) or not 1 <= level < self.hierarchy.depth): raise ValueError("Jet level must name an existing refined level (1 .. depth-1)") - boundary = self._device_boundaries[level] + boundary = self._boundaries[level] # Host preparation: validate and build the new column without touching state. jets = list(() if boundary is None else boundary.jets) jets[index] = jets[index].with_amplitude(amplitude) # validates first @@ -711,7 +710,7 @@ class FixedPatchStepper: b = level.boundary if b is not None and b.last_raw is not None: count = len(b.tables["cell"]) - h = self._exchange_spacing[index] # acoustic scaling: dt_l = h_l + h = b.spacing # acoustic scaling: dt_l = h_l b.accumulate(b.last_raw, b.interval_integral, np.uint32(count), np.float64(h), np.float64(h), grid=((count + self._block[0] - 1) // self._block[0], 1), **kw) @@ -755,7 +754,7 @@ class FixedPatchStepper: self._exchange_valid = False for _ in range(n): if self._observe_raw_exchange: # stream-ordered: holds the last interval only - for b in self._device_boundaries: + for b in self._boundaries: if b is not None: cuda.memset_d8_async(b.interval_integral, 0, len(b.tables["cell"]) * 32, self._stream) @@ -778,7 +777,7 @@ class FixedPatchStepper: raise RuntimeError("window exchange observation is disabled") self._window_valid = False try: - for b in self._device_boundaries: + for b in self._boundaries: if b is not None and b.window_integral is not None: cuda.memset_d8(b.window_integral, 0, len(b.tables["cell"]) * 32) except BaseException: @@ -791,7 +790,7 @@ class FixedPatchStepper: if (isinstance(level, bool) or not isinstance(level, Integral) or not 0 <= level < len(self._levels)): raise ValueError("level must name an existing level") - b = self._device_boundaries[level] + b = self._boundaries[level] if (b is None or isinstance(body_id, bool) or not isinstance(body_id, Integral) or not 0 <= body_id < len(b.host.objects)): raise ValueError("body_id must name a body on this level") @@ -799,9 +798,9 @@ class FixedPatchStepper: def _summarize(self, b, rows, level, body_id, window, **kw): return summarize_exchange(rows, b.tables["body_id"], b.tables["aperture"], - body_id=body_id, level=level, h=self._exchange_spacing[level], + body_id=body_id, level=level, h=b.spacing, time_end=self._step_count, window=window, - reference_center=self._exchange_centers[level][body_id], **kw) + reference_center=b.centers[body_id], **kw) def read_exchange_window(self, body_id, *, level): """Non-destructive read of [window start, current step count] in base-lattice units.""" @@ -888,7 +887,7 @@ class FixedPatchStepper: self._stream.synchronize() except Exception as exc: error = exc - for b in getattr(self, "_device_boundaries", ()): + for b in getattr(self, "_boundaries", ()): if b is not None: b.flags = b.device = b.kernel = None b.last_raw = b.interval_integral = b.accumulate = None @@ -923,11 +922,11 @@ class FixedPatchStepper: @property def boundaries(self): """Host boundary geometry per level (None: no bodies/Jets on a refined level).""" - return tuple(None if b is None else b.host for b in self._device_boundaries) + return tuple(None if b is None else b.host for b in self._boundaries) @property def jets(self): - return tuple(() if b is None else b.jets for b in self._device_boundaries) + return tuple(() if b is None else b.jets for b in self._boundaries) @property def leaf(self): diff --git a/src/CelerisLab/lbm/refinement_tables.py b/src/CelerisLab/lbm/refinement_tables.py index 53fee70..b959637 100644 --- a/src/CelerisLab/lbm/refinement_tables.py +++ b/src/CelerisLab/lbm/refinement_tables.py @@ -130,6 +130,8 @@ class _BlockedBoundary: interval_integral: object = None accumulate: object = None window_integral: object = None # optional observation-window FP64 ledger + spacing: float = None # level spacing h_l in root units (exchange scaling) + centers: tuple = () # body reference centers in the root edge frame def _prepare_blocked_boundary(boundary, layout, cfg, jets, *, _shifted_blocked=False): diff --git a/tests/unit/test_jet_update_failure.py b/tests/unit/test_jet_update_failure.py index 72d2373..65c1e46 100644 --- a/tests/unit/test_jet_update_failure.py +++ b/tests/unit/test_jet_update_failure.py @@ -102,7 +102,7 @@ def test_simulation_before_initialize_commits_host_only(monkeypatch): def stepper_state(run): - boundary = run._device_boundaries[2] + boundary = run._boundaries[2] return boundary.tables["surface_velocity"].copy(), boundary.jets, run.jets[2] @@ -116,8 +116,8 @@ def test_stepper_invalid_input_writes_nothing_and_stays_ready(): with pytest.raises(error): run.set_jet_amplitude(*args, **kw) module.cuda.memcpy_htod.assert_not_called() - np.testing.assert_array_equal(run._device_boundaries[2].tables["surface_velocity"], velocity) - assert (run._device_boundaries[2].jets, run.jets[2]) == (jets, level_jets) + np.testing.assert_array_equal(run._boundaries[2].tables["surface_velocity"], velocity) + assert (run._boundaries[2].jets, run.jets[2]) == (jets, level_jets) assert run._status == "ready" run.set_jet_amplitude(0, .017, level=2) assert run.jets[2][0].amplitude == .017 @@ -136,8 +136,8 @@ def test_stepper_device_failure_keeps_host_and_blocks_reuse(where): run._stream.synchronize.side_effect = RuntimeError("upload failed") with pytest.raises(RuntimeError, match="upload failed"): run.set_jet_amplitude(0, .017, level=2) - np.testing.assert_array_equal(run._device_boundaries[2].tables["surface_velocity"], velocity) - assert (run._device_boundaries[2].jets, run.jets[2]) == (jets, level_jets) + np.testing.assert_array_equal(run._boundaries[2].tables["surface_velocity"], velocity) + assert (run._boundaries[2].jets, run.jets[2]) == (jets, level_jets) assert run._status == "failed" module.cuda.memcpy_htod.side_effect = None run._stream.synchronize.side_effect = None diff --git a/tests/unit/test_multiple_pinned_remap.py b/tests/unit/test_multiple_pinned_remap.py index bffba49..67ec68a 100644 --- a/tests/unit/test_multiple_pinned_remap.py +++ b/tests/unit/test_multiple_pinned_remap.py @@ -96,11 +96,11 @@ class MultiplePinnedRemap(unittest.TestCase): before = run.download() clone = run.remap_finest((PINS+MOVED+ADDED)[::-1], objects=bodies) try: - self.assertEqual(tuple(j.amplitude for j in clone._device_boundaries[2].jets), (.017, -.011)) - np.testing.assert_array_equal(clone._device_boundaries[2].tables['surface_velocity'], - run._device_boundaries[2].tables['surface_velocity']) + self.assertEqual(tuple(j.amplitude for j in clone._boundaries[2].jets), (.017, -.011)) + np.testing.assert_array_equal(clone._boundaries[2].tables['surface_velocity'], + run._boundaries[2].tables['surface_velocity']) clone.set_jet_amplitude(1, .005, level=2) - self.assertEqual(run._device_boundaries[2].jets[1].amplitude, -.011) + self.assertEqual(run._boundaries[2].jets[1].amplitude, -.011) clone.step() self.assertEqual((run.step_count, clone.step_count), (7, 8)) for got, want in zip(run.download(), before): diff --git a/tests/unit/test_pinned_body_remap.py b/tests/unit/test_pinned_body_remap.py index 5872903..55f5ce4 100644 --- a/tests/unit/test_pinned_body_remap.py +++ b/tests/unit/test_pinned_body_remap.py @@ -62,9 +62,9 @@ class PinnedBodyRemap(unittest.TestCase): run.set_jet_amplitude(0,.017,level=2) before=run.download() clone=run.remap_finest(B,objects=objects) - self.assertEqual(clone._device_boundaries[2].jets[0].amplitude,.017) - np.testing.assert_array_equal(clone._device_boundaries[2].tables['surface_velocity'], - run._device_boundaries[2].tables['surface_velocity']) + self.assertEqual(clone._boundaries[2].jets[0].amplitude,.017) + np.testing.assert_array_equal(clone._boundaries[2].tables['surface_velocity'], + run._boundaries[2].tables['surface_velocity']) self.assertTrue(same_physical_boundary(run.boundaries[2],clone.boundaries[2])) clone.step() self.assertEqual((run.step_count,clone.step_count),(7,8)) @@ -74,8 +74,8 @@ class PinnedBodyRemap(unittest.TestCase): def test_static_body_without_actuation(self): run,module,allocations,storage,objects=ready(jets=()) clone=run.remap_finest(A,objects=objects) - self.assertFalse(clone._device_boundaries[2].actuated) - self.assertNotIn('surface_velocity',clone._device_boundaries[2].tables) + self.assertFalse(clone._boundaries[2].actuated) + self.assertNotIn('surface_velocity',clone._boundaries[2].tables) for a,b in zip(run.download(),clone.download()): np.testing.assert_array_equal(a,b) clone.close();run.close() diff --git a/tests/unit/test_raw_exchange.py b/tests/unit/test_raw_exchange.py index d4f94be..2791418 100644 --- a/tests/unit/test_raw_exchange.py +++ b/tests/unit/test_raw_exchange.py @@ -85,7 +85,7 @@ class RawExchange(unittest.TestCase): def test_four_level_schedule_publication_and_fixed_storage(self): run, host, calls, arrays = backend() - b = run._device_boundaries[3] + b = run._boundaries[3] rows = len(b.tables['cell']) self.assertEqual(b.last_raw.size, rows * 16) self.assertEqual(b.interval_integral.size, rows * 32) @@ -128,7 +128,7 @@ class RawExchange(unittest.TestCase): def test_disabled_has_nulls_and_no_observation_allocation_or_launch(self): run, host, calls, _ = backend(False) - b = run._device_boundaries[3] + b = run._boundaries[3] self.assertIs(b.last_raw, b.interval_integral) self.assertIs(b.interval_integral, None) run.step() diff --git a/tests/unit/test_runtime_child_remap.py b/tests/unit/test_runtime_child_remap.py index f9c4d6e..02ace81 100644 --- a/tests/unit/test_runtime_child_remap.py +++ b/tests/unit/test_runtime_child_remap.py @@ -70,11 +70,11 @@ class RuntimeChildRemap(unittest.TestCase): run._status = 'ready' for bad in ([], [(40,16,48,40)], [(16,16,32,24),(16,27,32,55)]): with self.assertRaises(ValueError): run.remap_finest(bad) - records, pairs = run._device_boundaries, run.hierarchy.pairs + records, pairs = run._boundaries, run.hierarchy.pairs for attribute, value in (('_wall_aware', True), # level-2 record whose host geometry differs from objects=() - ('_device_boundaries', [*records[:2], SimpleNamespace(host=object(), jets=())]), - ('_device_boundaries', [records[0], object(), records[2]]), # level-1 body + ('_boundaries', [*records[:2], SimpleNamespace(host=object(), jets=())]), + ('_boundaries', [records[0], object(), records[2]]), # level-1 body ('hierarchy', replace(run.hierarchy, pairs=(pairs[0], None)))): with patch.object(run, attribute, value): with self.assertRaises(ValueError): run.remap_finest(B) diff --git a/tests/unit/test_shifted_jets.py b/tests/unit/test_shifted_jets.py index 163cc0f..7665f1a 100644 --- a/tests/unit/test_shifted_jets.py +++ b/tests/unit/test_shifted_jets.py @@ -67,7 +67,7 @@ class ShiftedJets(unittest.TestCase): def test_switch_upload_only_then_raw_remap_keeps_live_velocity(self): run,module,allocations,storage,objects=ready();clone=None try: - boundary=run._device_boundaries[2] + boundary=run._boundaries[2] before=run._download_raw() original=boundary.tables['surface_velocity'].copy() module.cuda.memcpy_htod.reset_mock() @@ -79,7 +79,7 @@ class ShiftedJets(unittest.TestCase): for a,b in zip(before.values,run._download_raw().values):self.assertEqual(a.tobytes(),b.tobytes()) clone=run.remap_finest(B,objects=objects) self.assertEqual(clone.jets[2][0].amplitude,-jet().amplitude) - np.testing.assert_array_equal(clone._device_boundaries[2].tables['surface_velocity'], + np.testing.assert_array_equal(clone._boundaries[2].tables['surface_velocity'], boundary.tables['surface_velocity']) self.assertEqual(clone.step_count,7) saved=run._download_raw() @@ -92,12 +92,12 @@ class ShiftedJets(unittest.TestCase): def test_invalid_amplitude_does_not_upload_or_commit(self): run,module,_,_,_=ready() try: - before=run._device_boundaries[2].tables['surface_velocity'].copy() + before=run._boundaries[2].tables['surface_velocity'].copy() module.cuda.memcpy_htod.reset_mock() for amplitude in (float('nan'),float('inf'),1.): with self.assertRaises(ValueError):run.set_jet_amplitude(0,amplitude,level=2) module.cuda.memcpy_htod.assert_not_called() - np.testing.assert_array_equal(before,run._device_boundaries[2].tables['surface_velocity']) + np.testing.assert_array_equal(before,run._boundaries[2].tables['surface_velocity']) finally:run.close() diff --git a/tests/unit/test_single_level.py b/tests/unit/test_single_level.py index 190f978..351e8a6 100644 --- a/tests/unit/test_single_level.py +++ b/tests/unit/test_single_level.py @@ -73,7 +73,7 @@ class SingleLevel(unittest.TestCase): def test_circle_solids_are_not_state(self): run, _, _ = backend((circle(),)) - solid = run._device_boundaries[0].tables["solid"] + solid = run._boundaries[0].tables["solid"] self.assertTrue(solid.any()) np.testing.assert_array_equal(run._state[0], ~solid) diff --git a/tests/unit/test_union_body_support.py b/tests/unit/test_union_body_support.py index c6f34f2..4ac601d 100644 --- a/tests/unit/test_union_body_support.py +++ b/tests/unit/test_union_body_support.py @@ -37,7 +37,7 @@ class UnionBodySupport(unittest.TestCase): run.set_jet_amplitude(0,.017,level=2) clone=run.remap_finest(((16,16,24,40),(24,16,32,40),A[1]),objects=objects) try: - self.assertEqual(clone._device_boundaries[2].jets[0].amplitude,.017) + self.assertEqual(clone._boundaries[2].jets[0].amplitude,.017) self.assertTrue(same_physical_boundary(run.boundaries[2],clone.boundaries[2])) for a,b in zip(run.download(),clone.download()):np.testing.assert_array_equal(a,b) finally:clone.close() diff --git a/tests/validation/multigrid/test_block_stepper.py b/tests/validation/multigrid/test_block_stepper.py index 25f8434..837342a 100644 --- a/tests/validation/multigrid/test_block_stepper.py +++ b/tests/validation/multigrid/test_block_stepper.py @@ -240,7 +240,7 @@ class SingleLevelGPU(unittest.TestCase): with CudaContext(0) as context: for split in SPLITS: with single(context=context, block=split, objects=[circle()]) as backend: - tables = backend._device_boundaries[0].tables + tables = backend._boundaries[0].tables for key, values, dtype in (("q", [l.q for l in links], np.float32), ("dir", [l.dir for l in links], np.uint8), ("fallback", [l.fallback for l in links], np.uint8)): diff --git a/tests/validation/multigrid/test_exchange_window.py b/tests/validation/multigrid/test_exchange_window.py index 8171b62..6dc4cf5 100644 --- a/tests/validation/multigrid/test_exchange_window.py +++ b/tests/validation/multigrid/test_exchange_window.py @@ -59,7 +59,7 @@ class ExchangeWindowCPU(unittest.TestCase): stack.enter_context(patch.object(cuda, "memcpy_dtoh", side_effect=lambda out, src: out.fill(0))) backend = build(m) - b = backend._device_boundaries[1] + b = backend._boundaries[1] self.assertIsNotNone(b.window_integral) with self.assertRaises(RuntimeError): backend.start_exchange_window() # not initialized @@ -96,7 +96,7 @@ class ExchangeWindowCPU(unittest.TestCase): with mocked_backend() as m, ExitStack() as stack: stack.enter_context(patch.object(cuda, "memset_d8_async")) backend = build(m, window=False) - self.assertIsNone(backend._device_boundaries[1].window_integral) + self.assertIsNone(backend._boundaries[1].window_integral) backend.initialize(*[np.full(l.shape, 1 / 9, np.float32) for l in backend._levels]) backend.step(1) self.assertEqual(len(accumulations(m)), 2) @@ -120,7 +120,7 @@ class ExchangeWindowGPU(unittest.TestCase): windowed.step(2) plain.step(2) windowed.start_exchange_window() - b = windowed._device_boundaries[1] + b = windowed._boundaries[1] count = len(b.tables["cell"]) factors = np.array([.25, .25, .125, .25]) # h*dt, h*h*dt, h*h for level-1 h=.5 scale = np.zeros(4) @@ -212,7 +212,7 @@ class ExchangeWindowShiftedMRTGPU(unittest.TestCase): run.step(2) if run is not plain: run.start_exchange_window() - b = windowed._device_boundaries[1] + b = windowed._boundaries[1] count = len(b.tables["cell"]) record = dict(scale=np.zeros(4), substeps=0) audit_substeps(windowed, b, count, record) @@ -228,7 +228,7 @@ class ExchangeWindowShiftedMRTGPU(unittest.TestCase): same_bits(self, a, e) rows = [np.empty((count, 4), np.float64) for _ in range(2)] cuda.memcpy_dtoh(rows[0], b.window_integral) - cuda.memcpy_dtoh(rows[1], split._device_boundaries[1].window_integral) + cuda.memcpy_dtoh(rows[1], split._boundaries[1].window_integral) np.testing.assert_array_equal(rows[0].view(np.uint64), rows[1].view(np.uint64)) out = windowed.read_exchange_window(0, level=1) diff --git a/tests/validation/multigrid/test_multiple_pinned_remap_gpu.py b/tests/validation/multigrid/test_multiple_pinned_remap_gpu.py index 53ae501..47f4856 100644 --- a/tests/validation/multigrid/test_multiple_pinned_remap_gpu.py +++ b/tests/validation/multigrid/test_multiple_pinned_remap_gpu.py @@ -57,7 +57,7 @@ def make(context): def topology(run, rectangles, objects): return RemapTopology.from_config( CFG, run.hierarchy.pairs[0], rectangles, child_objects=objects, - child_jets=run._device_boundaries[2].jets, + child_jets=run._boundaries[2].jets, ) @@ -74,7 +74,7 @@ class MultiplePinnedRemapGPU(unittest.TestCase): def change_amplitudes(self, run, amplitudes): # Each jet selects a different body. Updating one must preserve the # other body's current per-link velocities, including its driven links. - boundary = run._device_boundaries[2] + boundary = run._boundaries[2] body_ids = run.boundaries[2].curved_host[3] for index, amplitude in enumerate(amplitudes): before = boundary.tables['surface_velocity'].copy() @@ -91,7 +91,7 @@ class MultiplePinnedRemapGPU(unittest.TestCase): self.assertTrue(same_physical_boundary(new.boundaries[2], mesh.boundary)) # Compare physical cut-link rows, never layout-dependent blocked addresses. for run in (old, new): - boundary = run._device_boundaries[2] + boundary = run._boundaries[2] self.assertEqual(tuple(jet.amplitude for jet in boundary.jets), amplitudes) exact(self, boundary.tables['surface_velocity'], mesh.surface_velocity, 'latest physical per-link velocities') diff --git a/tests/validation/multigrid/test_pinned_body_remap_gpu.py b/tests/validation/multigrid/test_pinned_body_remap_gpu.py index 637cc1f..891e265 100644 --- a/tests/validation/multigrid/test_pinned_body_remap_gpu.py +++ b/tests/validation/multigrid/test_pinned_body_remap_gpu.py @@ -39,9 +39,9 @@ class PinnedBodyRemapGPU(unittest.TestCase): exact(self,getattr(after.boundaries[2],name),getattr(before.boundaries[2],name),name) for a,b in zip(after.boundaries[2].curved_host,before.boundaries[2].curved_host): exact(self,a,b,'physical cut links') - exact(self,after._device_boundaries[2].tables['surface_velocity'], - before._device_boundaries[2].tables['surface_velocity'],'current per-link velocities') - self.assertEqual(after._device_boundaries[2].jets[0].amplitude,.017) + exact(self,after._boundaries[2].tables['surface_velocity'], + before._boundaries[2].tables['surface_velocity'],'current per-link velocities') + self.assertEqual(after._boundaries[2].jets[0].amplitude,.017) def test_noop_next_step_bitwise(self): with CudaContext(0) as ctx, ExitStack() as owned: @@ -63,7 +63,7 @@ class PinnedBodyRemapGPU(unittest.TestCase): current.set_jet_amplitude(0,.017,level=2) for rects in (B,A): previous=current;before=previous.download();count=previous.step_count - jets=previous._device_boundaries[2].jets + jets=previous._boundaries[2].jets old=RemapTopology.from_config(CFG,previous.hierarchy.pairs[0],previous.hierarchy.pairs[1].bounds, child_objects=objects,child_jets=jets) new=RemapTopology.from_config(CFG,previous.hierarchy.pairs[0],rects, diff --git a/tests/validation/multigrid/test_raw_exchange_gpu.py b/tests/validation/multigrid/test_raw_exchange_gpu.py index 74777e3..4539db0 100644 --- a/tests/validation/multigrid/test_raw_exchange_gpu.py +++ b/tests/validation/multigrid/test_raw_exchange_gpu.py @@ -105,7 +105,7 @@ class RawExchangeGPU(unittest.TestCase): arrays = [state(l.shape) for l in measured._levels] measured.initialize(*arrays) plain.initialize(*arrays) - b = measured._device_boundaries[1] + b = measured._boundaries[1] count = len(b.tables['cell']) kernel = measured._levels[1].kernel samples = [] @@ -158,7 +158,7 @@ class RawExchangeGPU(unittest.TestCase): FixedPatchStepper(cfg, context=ctx, **settings) as plain: arrays = [state(l.shape, ux=0.) for l in run._levels] run.initialize(*arrays); plain.initialize(*arrays) - b = run._device_boundaries[3] + b = run._boundaries[3] count = len(b.tables['cell']) kernel = run._levels[3].kernel samples, independent_samples = [], [] @@ -213,7 +213,7 @@ class RawExchangeGPU(unittest.TestCase): FixedPatchStepper(CFG, context=ctx, **fine((16, 20)), observe_raw_exchange=True) as amr: amr.initialize(*(state(l.shape) for l in amr._levels)) uniform.initialize(state((9, 48, 64))) - b = amr._device_boundaries[1] + b = amr._boundaries[1] count = len(b.tables['cell']) links = obj.geometry.build_cut_links(64, 48) np.testing.assert_array_equal([v.dir for v in links], b.tables['dir']) @@ -221,7 +221,7 @@ class RawExchangeGPU(unittest.TestCase): # Same fine-grid force arms after translation to the same center: the # single level's static BFL gets the AMR Jet column and force arms; the raw # output pointer is substituted at launch (no stepper-side accumulation). - root = uniform._device_boundaries[0] + root = uniform._boundaries[0] velocity = uniform._upload(b.tables['surface_velocity']) root.device.update(surface_velocity=velocity, rx=uniform._upload(b.tables['rx']), ry=uniform._upload(b.tables['ry'])) diff --git a/tests/validation/multigrid/test_refinement_blocked_fine.py b/tests/validation/multigrid/test_refinement_blocked_fine.py index 3afaf95..91323e3 100644 --- a/tests/validation/multigrid/test_refinement_blocked_fine.py +++ b/tests/validation/multigrid/test_refinement_blocked_fine.py @@ -187,8 +187,8 @@ class BlockedFineCPU(unittest.TestCase): backend, calls = self.mocked_backend([circle(spec)]) c, f = backend._levels coarse, cur, spare = c.current, f.current, f.spare - flags, kind = backend._device_boundaries[1].flags, backend._levels[1].kind - velocity = backend._device_boundaries[1].device.get("surface_velocity") + flags, kind = backend._boundaries[1].flags, backend._levels[1].kind + velocity = backend._boundaries[1].device.get("surface_velocity") self.assertEqual(velocity is None, spec is None) backend.step(1) backend.close() @@ -213,8 +213,8 @@ class BlockedFineCPU(unittest.TestCase): def test_actuation_without_velocity_buffer_fails_before_bfl(self): for speed in (0.0, .002): # any spec, even zero amplitude backend, calls = self.mocked_backend([circle(actuation(speed))]) - self.assertIsNotNone(backend._device_boundaries[1].tables["surface_velocity"]) - del backend._device_boundaries[1].device["surface_velocity"] + self.assertIsNotNone(backend._boundaries[1].tables["surface_velocity"]) + del backend._boundaries[1].device["surface_velocity"] with self.assertRaisesRegex(RuntimeError, "Surface velocity device buffer is missing"): backend.step(1) names = [name for name, _ in calls] diff --git a/tests/validation/multigrid/test_refinement_jets.py b/tests/validation/multigrid/test_refinement_jets.py index 0297d05..dbb4571 100644 --- a/tests/validation/multigrid/test_refinement_jets.py +++ b/tests/validation/multigrid/test_refinement_jets.py @@ -62,8 +62,8 @@ class JetStepperCPU(unittest.TestCase): C = (16.0, 12.0) whole = Jet(Sector(C, .1, math.pi, 3.), Radial(C, inward=False), amplitude=0.) backend, _ = mocked([circle()], [whole], FINE_BLOCKS[1]) - _, jet_id = backend._device_boundaries[1].jet_cache - self.assertGreater(len(np.unique(backend._device_boundaries[1].tables["block"][jet_id == 0])), 1) + _, jet_id = backend._boundaries[1].jet_cache + self.assertGreater(len(np.unique(backend._boundaries[1].tables["block"][jet_id == 0])), 1) backend.close() def test_fine_ownership_uses_remapped_physical_owner(self): @@ -76,10 +76,10 @@ class JetStepperCPU(unittest.TestCase): source = SimObject(99, geometry=CircleGeometry(*C, 2.15), center=C, radius=2.15) whole = Jet(Sector(C, .1, math.pi, 3.), Radial(C, inward=False), amplitude=0.) backend, _ = mocked([source], [whole], FINE_BLOCKS[1]) - _, jet_id = backend._device_boundaries[1].jet_cache + _, jet_id = backend._boundaries[1].jet_cache owners = backend.boundaries[1].curved_host[3][jet_id == 0] self.assertEqual(np.unique(owners).tolist(), [0]) - self.assertGreater(len(np.unique(backend._device_boundaries[1].tables["block"][jet_id == 0])), 1) + self.assertGreater(len(np.unique(backend._boundaries[1].tables["block"][jet_id == 0])), 1) self.assertEqual(source.obj_id, 99) backend.close() cfg = config("periodic") @@ -97,8 +97,8 @@ class JetStepperCPU(unittest.TestCase): def test_blocked_jet_velocity_matches_legacy_rows(self): legacy, _ = mocked([circle(actuation(SPEED))], (), FINE_BLOCKS[1]) driven, _ = mocked([circle()], [jet()], FINE_BLOCKS[1]) - a = legacy._device_boundaries[1].tables["surface_velocity"] - b = driven._device_boundaries[1].tables["surface_velocity"] + a = legacy._boundaries[1].tables["surface_velocity"] + b = driven._boundaries[1].tables["surface_velocity"] diff = np.abs(a - b).max() print(f"fine jet vs legacy velocity rows: max |dU| = {diff:.3e} (exact={diff == 0})") self.assertLessEqual(diff, 4 * np.finfo(np.float32).eps * SPEED) @@ -106,8 +106,8 @@ class JetStepperCPU(unittest.TestCase): def test_blocked_amplitude_update_rewrites_only_velocity_column(self): backend, htod = mocked([circle()], [jet()], FINE_BLOCKS[1]) - before = backend._device_boundaries[1].tables["surface_velocity"].copy() - device = backend._device_boundaries[1].device["surface_velocity"] + before = backend._boundaries[1].tables["surface_velocity"].copy() + device = backend._boundaries[1].device["surface_velocity"] with patch.object(cuda, "memcpy_htod", htod): htod.reset_mock() backend.set_jet_amplitude(0, -SPEED, level=1) @@ -115,7 +115,7 @@ class JetStepperCPU(unittest.TestCase): self.assertEqual(htod.call_count, 1) self.assertIs(ptr, device) np.testing.assert_allclose(sent, -before, rtol=1e-6, atol=0) - np.testing.assert_array_equal(backend._device_boundaries[1].tables["surface_velocity"], sent) + np.testing.assert_array_equal(backend._boundaries[1].tables["surface_velocity"], sent) with self.assertRaises(ValueError): backend.set_jet_amplitude(0, 1.5, level=1) self.assertEqual(htod.call_count, 1) @@ -133,7 +133,7 @@ class JetStepperCPU(unittest.TestCase): with self.assertRaises(IndexError): backend.set_jet_amplitude(1, -SPEED, level=1) self.assertEqual(backend._status, status) - before = backend._device_boundaries[1].tables["surface_velocity"].copy() + before = backend._boundaries[1].tables["surface_velocity"].copy() boom = Mock(side_effect=RuntimeError("copy failed")) with patch.object(cuda, "memcpy_htod", boom), patch.object(cuda, "memcpy_htod_async", boom), \ patch.object(cuda, "pagelocked_empty", side_effect=lambda shape, dtype: np.empty(shape, dtype)): @@ -141,7 +141,7 @@ class JetStepperCPU(unittest.TestCase): backend.set_jet_amplitude(0, -SPEED, level=1) self.assertEqual(backend._status, "failed", fine_block) self.assertEqual(backend.jets[1][0].amplitude, SPEED) - np.testing.assert_array_equal(backend._device_boundaries[1].tables["surface_velocity"], before) + np.testing.assert_array_equal(backend._boundaries[1].tables["surface_velocity"], before) with self.assertRaisesRegex(RuntimeError, "failed"): backend.step(1) with self.assertRaisesRegex(RuntimeError, "failed"): diff --git a/tests/validation/multigrid/test_shifted_jets_gpu.py b/tests/validation/multigrid/test_shifted_jets_gpu.py index 343c53b..d993e9a 100644 --- a/tests/validation/multigrid/test_shifted_jets_gpu.py +++ b/tests/validation/multigrid/test_shifted_jets_gpu.py @@ -102,7 +102,7 @@ class Ledger: def step(self): run=self.run;self.samples.clear();run.step() - b=run._device_boundaries[self.index];h=run._exchange_spacing[self.index] + b=run._boundaries[self.index];h=b.spacing self.test.assertEqual(len(self.samples),2**self.index) expected=np.zeros_like(self.samples[0],dtype=np.float64) weights=np.array([h*h,h*h,h*h*h,h*h]) @@ -140,7 +140,7 @@ class ShiftedJetsGPU(unittest.TestCase): level_objects=[(),(obj,)],level_jets=[(),(whole,)],observe_raw_exchange=True) as run: run._initialize_raw(initial(run,rho,u=.013,v=0.)) expected=run._download_raw();ledger=Ledger(self,run,1) - self.assertTrue(run._device_boundaries[1].tables['aperture'].all()) + self.assertTrue(run._boundaries[1].tables['aperture'].all()) for _ in range(4):ledger.step() error=max(float(abs(a[:,leaf]-b[:,leaf]).max()) for a,b,leaf in zip(run._download_raw().values,expected.values,run.leaf)) @@ -201,7 +201,7 @@ class ShiftedJetsGPU(unittest.TestCase): self.exact_raw(before,old._download_raw()) self.exact_raw(_StoredPopulations(expected.g,True),new._download_raw()) self.assertEqual(new.jets[2][0].amplitude,-.001) - np.testing.assert_array_equal(new._device_boundaries[2].tables['surface_velocity'],old._device_boundaries[2].tables['surface_velocity']) + np.testing.assert_array_equal(new._boundaries[2].tables['surface_velocity'],old._boundaries[2].tables['surface_velocity']) newledger=Ledger(self,new,2);ledger.step();newledger.step() self.assertEqual((old.step_count,new.step_count),(count+1,count+1)) ledger.report('L2 source');newledger.report('L2 remapped')