def slice_traverse(self, viewpoint=None): if not hasattr(self.ds.index, "grid"): raise NotImplementedError for node in kd_traverse(self.tree.trunk, viewpoint=viewpoint): grid = self.ds.index.grids[node.grid - self._id_offset] dds = grid.dds gle = grid.LeftEdge.in_units("code_length").ndarray_view() nle = get_left_edge(node) nre = get_right_edge(node) li = np.rint((nle - gle) / dds).astype('int32') ri = np.rint((nre - gle) / dds).astype('int32') dims = (ri - li).astype('int32') sl = (slice(li[0], ri[0]), slice(li[1], ri[1]), slice(li[2], ri[2])) gi = grid.get_global_startindex() + li yield grid, node, (sl, dims, gi)
def sum_cells(self, all_cells=False): cells = 0 for node in depth_traverse(self.trunk): if node.grid == -1: continue if not all_cells and not kd_is_leaf(node): continue grid = self.ds.index.grids[node.grid - self._id_offset] dds = grid.dds gle = grid.LeftEdge nle = self.ds.arr(get_left_edge(node), input_units="code_length") nre = self.ds.arr(get_right_edge(node), input_units="code_length") li = np.rint((nle - gle) / dds).astype('int32') ri = np.rint((nre - gle) / dds).astype('int32') dims = (ri - li).astype('int32') cells += np.prod(dims) return cells
def slice_traverse(self, viewpoint = None): if not hasattr(self.ds.index, "grid"): raise NotImplementedError for node in kd_traverse(self.tree.trunk, viewpoint=viewpoint): grid = self.ds.index.grids[node.grid - self._id_offset] dds = grid.dds gle = grid.LeftEdge.in_units("code_length").ndarray_view() nle = get_left_edge(node) nre = get_right_edge(node) li = np.rint((nle-gle)/dds).astype('int32') ri = np.rint((nre-gle)/dds).astype('int32') dims = (ri - li).astype('int32') sl = (slice(li[0], ri[0]), slice(li[1], ri[1]), slice(li[2], ri[2])) gi = grid.get_global_startindex() + li yield grid, node, (sl, dims, gi)
def sum_cells(self, all_cells=False): cells = 0 for node in depth_traverse(self.trunk): if node.grid == -1: continue if not all_cells and not kd_is_leaf(node): continue grid = self.ds.index.grids[node.grid - self._id_offset] dds = grid.dds gle = grid.LeftEdge nle = self.ds.arr(get_left_edge(node), input_units="code_length") nre = self.ds.arr(get_right_edge(node), input_units="code_length") li = np.rint((nle-gle)/dds).astype('int32') ri = np.rint((nre-gle)/dds).astype('int32') dims = (ri - li).astype('int32') cells += np.prod(dims) return cells
def get_brick_data(self, node): if node.data is not None: return node.data grid = self.ds.index.grids[node.grid - self._id_offset] dds = grid.dds.ndarray_view() gle = grid.LeftEdge.ndarray_view() nle = get_left_edge(node) nre = get_right_edge(node) li = np.rint((nle - gle) / dds).astype('int32') ri = np.rint((nre - gle) / dds).astype('int32') dims = (ri - li).astype('int32') assert (np.all(grid.LeftEdge <= nle)) assert (np.all(grid.RightEdge >= nre)) if grid in self.current_saved_grids: dds = self.current_vcds[self.current_saved_grids.index(grid)] else: dds = [] for i, field in enumerate(self.fields): vcd = grid.get_vertex_centered_data( field, smoothed=True, no_ghost=self.no_ghost).astype('float64') if self.log_fields[i]: vcd = np.log10(vcd) dds.append(vcd) self.current_saved_grids.append(grid) self.current_vcds.append(dds) if self.data_source.selector is None: mask = np.ones(dims, dtype='uint8') else: mask = self.data_source.selector.fill_mask(grid)[ li[0]:ri[0], li[1]:ri[1], li[2]:ri[2]].astype('uint8') data = [ d[li[0]:ri[0] + 1, li[1]:ri[1] + 1, li[2]:ri[2] + 1].copy() for d in dds ] brick = PartitionedGrid(grid.id, data, mask, nle.copy(), nre.copy(), dims.astype('int64')) node.data = brick if not self._initialized: self.brick_dimensions.append(dims) return brick
def get_brick_data(self, node): if node.data is not None: return node.data grid = self.ds.index.grids[node.grid - self._id_offset] dds = grid.dds.ndarray_view() gle = grid.LeftEdge.ndarray_view() nle = get_left_edge(node) nre = get_right_edge(node) li = np.rint((nle-gle)/dds).astype('int32') ri = np.rint((nre-gle)/dds).astype('int32') dims = (ri - li).astype('int32') assert(np.all(grid.LeftEdge <= nle)) assert(np.all(grid.RightEdge >= nre)) if grid in self.current_saved_grids: dds = self.current_vcds[self.current_saved_grids.index(grid)] else: dds = [] for i, field in enumerate(self.fields): vcd = grid.get_vertex_centered_data(field, smoothed=True, no_ghost=self.no_ghost).astype('float64') if self.log_fields[i]: vcd = np.log10(vcd) dds.append(vcd) self.current_saved_grids.append(grid) self.current_vcds.append(dds) if self.data_source.selector is None: mask = np.ones(dims, dtype='uint8') else: mask = self.data_source.selector.fill_mask(grid)[li[0]:ri[0], li[1]:ri[1], li[2]:ri[2] ].astype('uint8') data = [d[li[0]:ri[0]+1, li[1]:ri[1]+1, li[2]:ri[2]+1].copy() for d in dds] brick = PartitionedGrid(grid.id, data, mask, nle.copy(), nre.copy(), dims.astype('int64')) node.data = brick if not self._initialized: self.brick_dimensions.append(dims) return brick
def check_tree(self): for node in depth_traverse(self.trunk): if node.grid == -1: continue grid = self.ds.index.grids[node.grid - self._id_offset] dds = grid.dds gle = grid.LeftEdge nle = self.ds.arr(get_left_edge(node), input_units="code_length") nre = self.ds.arr(get_right_edge(node), input_units="code_length") li = np.rint((nle - gle) / dds).astype('int32') ri = np.rint((nre - gle) / dds).astype('int32') dims = (ri - li).astype('int32') assert (np.all(grid.LeftEdge <= nle)) assert (np.all(grid.RightEdge >= nre)) assert (np.all(dims > 0)) # print grid, dims, li, ri # Calculate the Volume vol = kd_sum_volume(self.trunk) mylog.debug('AMRKDTree volume = %e' % vol) kd_node_check(self.trunk)
def check_tree(self): for node in depth_traverse(self.trunk): if node.grid == -1: continue grid = self.ds.index.grids[node.grid - self._id_offset] dds = grid.dds gle = grid.LeftEdge nle = self.ds.arr(get_left_edge(node), input_units="code_length") nre = self.ds.arr(get_right_edge(node), input_units="code_length") li = np.rint((nle-gle)/dds).astype('int32') ri = np.rint((nre-gle)/dds).astype('int32') dims = (ri - li).astype('int32') assert(np.all(grid.LeftEdge <= nle)) assert(np.all(grid.RightEdge >= nre)) assert(np.all(dims > 0)) # print grid, dims, li, ri # Calculate the Volume vol = kd_sum_volume(self.trunk) mylog.debug('AMRKDTree volume = %e' % vol) kd_node_check(self.trunk)
def test_amr_kdtree_coverage(): return #TESTDISABLED domain_dims = (32, 32, 32) data = np.zeros(domain_dims) + 0.25 fo = [ ic.CoredSphere(0.05, 0.3, [0.7, 0.4, 0.75], {"density": (0.25, 100.0)}) ] rc = [fm.flagging_method_registry["overdensity"](8.0)] ug = load_uniform_grid({"density": data}, domain_dims, 1.0) ds = refine_amr(ug, rc, fo, 5) kd = AMRKDTree(ds) volume = kd.count_volume() yield assert_equal, volume, \ np.prod(ds.domain_right_edge - ds.domain_left_edge) cells = kd.count_cells() true_cells = ds.all_data().quantities['TotalQuantity']('Ones')[0] yield assert_equal, cells, true_cells # This largely reproduces the AMRKDTree.tree.check_tree() functionality tree_ok = True for node in depth_traverse(kd.tree.trunk): if node.grid is None: continue grid = ds.index.grids[node.grid - kd._id_offset] dds = grid.dds gle = grid.LeftEdge nle = get_left_edge(node) nre = get_right_edge(node) li = np.rint((nle - gle) / dds).astype('int32') ri = np.rint((nre - gle) / dds).astype('int32') dims = (ri - li).astype('int32') tree_ok *= np.all(grid.LeftEdge <= nle) tree_ok *= np.all(grid.RightEdge >= nre) tree_ok *= np.all(dims > 0) yield assert_equal, True, tree_ok
def test_amr_kdtree_coverage(): return #TESTDISABLED domain_dims = (32, 32, 32) data = np.zeros(domain_dims) + 0.25 fo = [ic.CoredSphere(0.05, 0.3, [0.7, 0.4, 0.75], {"density": (0.25, 100.0)})] rc = [fm.flagging_method_registry["overdensity"](8.0)] ug = load_uniform_grid({"density": data}, domain_dims, 1.0) ds = refine_amr(ug, rc, fo, 5) kd = AMRKDTree(ds) volume = kd.count_volume() yield assert_equal, volume, \ np.prod(ds.domain_right_edge - ds.domain_left_edge) cells = kd.count_cells() true_cells = ds.all_data().quantities['TotalQuantity']('Ones')[0] yield assert_equal, cells, true_cells # This largely reproduces the AMRKDTree.tree.check_tree() functionality tree_ok = True for node in depth_traverse(kd.tree.trunk): if node.grid is None: continue grid = ds.index.grids[node.grid - kd._id_offset] dds = grid.dds gle = grid.LeftEdge nle = get_left_edge(node) nre = get_right_edge(node) li = np.rint((nle-gle)/dds).astype('int32') ri = np.rint((nre-gle)/dds).astype('int32') dims = (ri - li).astype('int32') tree_ok *= np.all(grid.LeftEdge <= nle) tree_ok *= np.all(grid.RightEdge >= nre) tree_ok *= np.all(dims > 0) yield assert_equal, True, tree_ok