def test_compressed_octree_works_for_large_domain(self): # Given pa = self._make_particles(20) # We turn on cache so it computes all the neighbors quickly for us. nps = nnps.CompressedOctreeNNPS(dim=3, particles=[pa], cache=True) nbrs = UIntArray() direct = UIntArray() nps.set_context(0, 0) for i in range(pa.get_number_of_particles()): nps.get_nearest_particles(0, 0, i, nbrs) nps.brute_force_neighbors(0, 0, i, direct) x = nbrs.get_npy_array() y = direct.get_npy_array() x.sort() y.sort() assert numpy.all(x == y)
def test_cache_updates_with_changed_particles(self): # Given pa1 = self._make_random_parray('pa1', 5) particles = [pa1] nnps = LinkedListNNPS(dim=3, particles=particles) cache = NeighborCache(nnps, dst_index=0, src_index=0) cache.update() # When pa2 = self._make_random_parray('pa2', 2) pa1.add_particles(x=pa2.x, y=pa2.y, z=pa2.z) nnps.update() cache.update() nb_cached = UIntArray() nb_direct = UIntArray() for i in range(len(particles[0].x)): nnps.get_nearest_particles_no_cache(0, 0, i, nb_direct, False) cache.get_neighbors(0, i, nb_cached) nb_e = nb_direct.get_npy_array() nb_c = nb_cached.get_npy_array() self.assertTrue(np.all(nb_e == nb_c))
def test_neighbors_cached_properly(self): # Given pa1 = self._make_random_parray('pa1', 5) pa2 = self._make_random_parray('pa2', 4) particles = [pa1, pa2] nnps = LinkedListNNPS(dim=3, particles=particles) for dst_index in (0, 1): for src_idx in (0, 1): # When cache = NeighborCache(nnps, dst_index, src_idx) cache.update() nb_cached = UIntArray() nb_direct = UIntArray() # Then. for i in range(len(particles[dst_index].x)): nnps.get_nearest_particles_no_cache( src_idx, dst_index, i, nb_direct, False) cache.get_neighbors(src_idx, i, nb_cached) nb_e = nb_direct.get_npy_array() nb_c = nb_cached.get_npy_array() self.assertTrue(np.all(nb_e == nb_c))
def test_empty_neigbors_works_correctly(self): # Given pa1 = self._make_random_parray('pa1', 5) pa2 = self._make_random_parray('pa2', 2) pa2.x += 10.0 particles = [pa1, pa2] # When nnps = LinkedListNNPS(dim=3, particles=particles) # Cache for neighbors of destination 0. cache = NeighborCache(nnps, dst_index=0, src_index=1) cache.update() # Then nb_cached = UIntArray() nb_direct = UIntArray() for i in range(len(particles[0].x)): nnps.get_nearest_particles_no_cache(1, 0, i, nb_direct, False) # Get neighbors from source 1 on destination 0. cache.get_neighbors(src_index=1, d_idx=i, nbrs=nb_cached) nb_e = nb_direct.get_npy_array() nb_c = nb_cached.get_npy_array() self.assertEqual(len(nb_e), 0) self.assertTrue(np.all(nb_e == nb_c))
def test_nnps_sorts_without_gids(self): # Given pa, nps = self._make_particles(10) # When nps.set_context(0, 0) # Test the that gids are actually huge and invalid. self.assertEqual(numpy.max(pa.gid), numpy.min(pa.gid)) self.assertTrue(numpy.max(pa.gid) > pa.gid.size) # Then nbrs = UIntArray() for i in range(pa.get_number_of_particles()): nps.get_nearest_particles(0, 0, i, nbrs) nb = nbrs.get_npy_array() sorted_nbrs = sorted(nb.copy()) self.assertTrue(numpy.all(nb == sorted_nbrs))
def test_nnps_sorts_with_valid_gids(self): # Given pa, nps = self._make_particles(10) pa.gid[:] = numpy.arange(pa.x.size) nps.update() # When nps.set_context(0, 0) # Test the that gids are actually valid. self.assertEqual(numpy.max(pa.gid), pa.gid.size - 1) self.assertEqual(numpy.min(pa.gid), 0) # Then nbrs = UIntArray() for i in range(pa.get_number_of_particles()): nps.get_nearest_particles(0, 0, i, nbrs) nb = nbrs.get_npy_array() sorted_nbrs = nb.copy() sorted_nbrs.sort() self.assertTrue(numpy.all(nb == sorted_nbrs))