Source code for yt.data_objects.index_subobjects.particle_container
import contextlib
from more_itertools import always_iterable
from yt.data_objects.data_containers import YTFieldData
from yt.data_objects.selection_objects.data_selection_objects import (
YTSelectionContainer,
)
from yt.utilities.exceptions import (
YTDataSelectorNotImplemented,
YTNonIndexedDataContainer,
)
def _non_indexed(name):
def _func_non_indexed(self, *args, **kwargs):
raise YTNonIndexedDataContainer(self)
return _func_non_indexed
[docs]
class ParticleContainer(YTSelectionContainer):
_spatial = False
_type_name = "particle_container"
_skip_add = True
_con_args = ("base_region", "base_selector", "data_files", "overlap_files")
def __init__(
self, base_region, base_selector, data_files, overlap_files=None, domain_id=-1
):
if overlap_files is None:
overlap_files = []
self.field_data = YTFieldData()
self.field_parameters = {}
self.data_files = list(always_iterable(data_files))
self.overlap_files = list(always_iterable(overlap_files))
self.ds = self.data_files[0].ds
self._last_mask = None
self._last_selector_id = None
self._current_particle_type = "all"
# self._current_fluid_type = self.ds.default_fluid_type
self.base_region = base_region
self.base_selector = base_selector
self._octree = None
self._temp_spatial = False
if isinstance(base_region, ParticleContainer):
self._temp_spatial = base_region._temp_spatial
self._octree = base_region._octree
# To ensure there are not domains if global octree not used
self.domain_id = -1
def __reduce__(self):
# we need to override the __reduce__ from data_containers as this method is not
# a registered dataset method (i.e., ds.particle_container does not exist)
arg_tuple = tuple(getattr(self, attr) for attr in self._con_args)
return (self.__class__, arg_tuple)
@property
def selector(self):
raise YTDataSelectorNotImplemented(self.oc_type_name)
[docs]
def select_particles(self, selector, x, y, z):
mask = selector.select_points(x, y, z)
return mask
@contextlib.contextmanager
def _expand_data_files(self):
old_data_files = self.data_files
old_overlap_files = self.overlap_files
self.data_files = list(set(self.data_files + self.overlap_files))
self.data_files.sort()
self.overlap_files = []
yield self
self.data_files = old_data_files
self.overlap_files = old_overlap_files
[docs]
def retrieve_ghost_zones(self, ngz, coarse_ghosts=False):
gz_oct = self.octree.retrieve_ghost_zones(ngz, coarse_ghosts=coarse_ghosts)
gz = ParticleContainer(
gz_oct.base_region,
gz_oct.base_selector,
gz_oct.data_files,
overlap_files=gz_oct.overlap_files,
selector_mask=gz_oct.selector_mask,
domain_id=gz_oct.domain_id,
)
gz._octree = gz_oct
return gz
select_blocks = _non_indexed("select_blocks")
deposit = _non_indexed("deposit")
smooth = _non_indexed("smooth")
select_icoords = _non_indexed("select_icoords")
select_fcoords = _non_indexed("select_fcoords")
select_fwidth = _non_indexed("select_fwidth")
select_ires = _non_indexed("select_ires")
select = _non_indexed("select")
count = _non_indexed("count")
count_particles = _non_indexed("count_particles")