1cdef class OctreeSubsetSelector(SelectorObject):
2
3    def __init__(self, dobj):
4        self.base_selector = dobj.base_selector
5        self.min_level = self.base_selector.min_level
6        self.max_level = self.base_selector.max_level
7        self.domain_id = dobj.domain_id
8        self.overlap_cells = getattr(dobj.oct_handler, 'overlap_cells', 1)
9
10    @cython.boundscheck(False)
11    @cython.wraparound(False)
12    @cython.cdivision(True)
13    def select_grids(self,
14                     np.ndarray[np.float64_t, ndim=2] left_edges,
15                     np.ndarray[np.float64_t, ndim=2] right_edges,
16                     np.ndarray[np.int32_t, ndim=2] levels):
17        raise RuntimeError
18
19    @cython.boundscheck(False)
20    @cython.wraparound(False)
21    @cython.cdivision(True)
22    cdef int select_sphere(self, np.float64_t pos[3], np.float64_t radius) nogil:
23        return 1
24
25    @cython.boundscheck(False)
26    @cython.wraparound(False)
27    @cython.cdivision(True)
28    cdef int select_cell(self, np.float64_t pos[3], np.float64_t dds[3]) nogil:
29        return 1
30
31    @cython.boundscheck(False)
32    @cython.wraparound(False)
33    @cython.cdivision(True)
34    cdef int select_point(self, np.float64_t pos[3]) nogil:
35        return self.base_selector.select_point(pos)
36
37    @cython.boundscheck(False)
38    @cython.wraparound(False)
39    @cython.cdivision(True)
40    cdef int select_bbox(self, np.float64_t left_edge[3],
41                               np.float64_t right_edge[3]) nogil:
42        # return 1
43        return self.base_selector.select_bbox(left_edge, right_edge)
44
45    @cython.boundscheck(False)
46    @cython.wraparound(False)
47    @cython.cdivision(True)
48    cdef int select_grid(self, np.float64_t left_edge[3],
49                         np.float64_t right_edge[3], np.int32_t level,
50                         Oct *o = NULL) nogil:
51        # Because visitors now use select_grid, we should be explicitly
52        # checking this.
53        cdef int res
54        res = self.base_selector.select_grid(left_edge, right_edge, level, o)
55        if self.domain_id == -1:
56            return res
57        elif res == 1 and o != NULL and o.domain != self.domain_id:
58            return -1
59        return res
60
61    def _hash_vals(self):
62        return (hash(self.base_selector), self.domain_id)
63
64octree_subset_selector = OctreeSubsetSelector
65