예제 #1
0
 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)
예제 #2
0
 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
예제 #5
0
    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
예제 #7
0
    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)
예제 #9
0
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