diff --git a/src/CelerisLab/lbm/blocks.py b/src/CelerisLab/lbm/blocks.py index 1bc665a..a1aa588 100644 --- a/src/CelerisLab/lbm/blocks.py +++ b/src/CelerisLab/lbm/blocks.py @@ -144,7 +144,7 @@ class BlockLayout2D: jy, jx = np.divmod(np.arange(nby * nbx), nbx) origins = np.stack([jy * by, jx * bx], axis=1) selected = _selected_blocks(origins, ny, nx, by, bx) - origins = np.asarray(origins, dtype=np.int64).reshape(-1, 2) + origins = np.array(origins, dtype=np.int64).reshape(-1, 2) # own copy, never caller storage if (len(origins) + 1) * NQ * cells > np.iinfo(np.int64).max // 2: raise ValueError("blocked storage exceeds 64-bit indexing") diff --git a/tests/unit/test_block_layout.py b/tests/unit/test_block_layout.py index da18501..9599c08 100644 --- a/tests/unit/test_block_layout.py +++ b/tests/unit/test_block_layout.py @@ -411,6 +411,17 @@ class SparseBlockLayoutTests(unittest.TestCase): np.testing.assert_array_equal(stored[layout.owner.ravel()[owned].astype(np.intp)], flags[owned]) self.assertEqual(np.count_nonzero(stored), owned.sum()) + def test_caller_origins_are_copied(self): + origins = np.array([[0, 0], [0, 4]], dtype=np.int64) + layout = BlockLayout2D.build(6, 8, 3, 4, origins=origins) + owner, address = layout.owner.copy(), layout.block_cell(0, 0, 0) + self.assertTrue(origins.flags.writeable) # caller array is not frozen + origins[0] = [3, 0] + np.testing.assert_array_equal(layout.origins, [[0, 0], [0, 4]]) + np.testing.assert_array_equal(layout.owner, owner) + self.assertEqual(layout.block_cell(0, 0, 0), address) + self.assertEqual(address, layout.owner[0, 0]) + def test_invalid_origins_rejected(self): for origins in ([(0, 4), (0, 0)], # not row-major [(3, 0), (0, 4)], # not row-major across rows