Source code for nbodykit.source.catalog.subvolumes
from nbodykit.base.catalog import CatalogSource
from pmesh.domain import GridND
from nbodykit.utils import split_size_3d
import numpy
[docs]class SubVolumesCatalog(CatalogSource):
""" A catalog that distributes the particles spatially into subvolumes per
MPI rank.
Attributes
----------
domain : :class:`pmesh.domain.GridND`;
The domain objects for decomposition. If None, generate
a domain to decompose the catalog into a 3d grid.
layout : A large object that holds which particle belongs to which rank.
source : the original source object
Parameters
----------
columns: list
a list of columns to already exchange
"""
def __init__(self, source, domain=None, position='Position', columns=None):
comm = source.comm
if domain is None:
# determine processor division for domain decomposition
np = split_size_3d(comm.size)
if comm.rank == 0:
self.logger.info("using cpu grid decomposition: %s" %str(np))
grid = [
numpy.linspace(0, source.attrs['BoxSize'][0], np[0] + 1, endpoint=True),
numpy.linspace(0, source.attrs['BoxSize'][1], np[1] + 1, endpoint=True),
numpy.linspace(0, source.attrs['BoxSize'][2], np[2] + 1, endpoint=True),
]
domain = GridND(grid, comm=comm)
self.domain = domain
self.source = source
layout = domain.decompose(source[position].compute())
self._size = layout.recvlength
CatalogSource.__init__(self, comm=comm)
self.attrs.update(source.attrs)
self._frozen = {}
if columns is None: columns = source.columns
for column in columns:
data = source[column].compute()
self._frozen[column] = self.make_column(layout.exchange(data))
@property
def hardcolumns(self):
return sorted(list(self._frozen.keys()))
[docs] def get_hardcolumn(self, col):
return self._frozen[col]