Source code for yt.frontends.nc4_cm1.io
import numpy as np
from yt.utilities.file_handler import NetCDF4FileHandler
from yt.utilities.io_handler import BaseIOHandler
[docs]
class CM1IOHandler(BaseIOHandler):
_particle_reader = False
_dataset_type = "cm1"
def __init__(self, ds):
self.filename = ds.filename
self._handle = NetCDF4FileHandler(self.filename)
super().__init__(ds)
def _read_particle_coords(self, chunks, ptf):
# This needs to *yield* a series of tuples of (ptype, (x, y, z)).
# chunks is a list of chunks, and ptf is a dict where the keys are
# ptypes and the values are lists of fields.
raise NotImplementedError
def _read_particle_fields(self, chunks, ptf, selector):
# This gets called after the arrays have been allocated. It needs to
# yield ((ptype, field), data) where data is the masked results of
# reading ptype, field and applying the selector to the data read in.
# Selector objects have a .select_points(x,y,z) that returns a mask, so
# you need to do your masking here.
raise NotImplementedError
def _read_fluid_selection(self, chunks, selector, fields, size):
# This needs to allocate a set of arrays inside a dictionary, where the
# keys are the (ftype, fname) tuples and the values are arrays that
# have been masked using whatever selector method is appropriate. The
# dict gets returned at the end and it should be flat, with selected
# data. Note that if you're reading grid data, you might need to
# special-case a grid selector object.
# Also note that "chunks" is a generator for multiple chunks, each of
# which contains a list of grids. The returned numpy arrays should be
# in 64-bit float and contiguous along the z direction. Therefore, for
# a C-like input array with the dimension [x][y][z] or a
# Fortran-like input array with the dimension (z,y,x), a matrix
# transpose is required (e.g., using np_array.transpose() or
# np_array.swapaxes(0,2)).
data = {}
chunks = list(chunks)
with self._handle.open_ds() as ds:
for field in fields:
data[field] = np.empty(size, dtype="float64")
offset = 0
for chunk in chunks:
for grid in chunk.objs:
variable = ds.variables[field[1]][:][0]
values = np.squeeze(variable.T)
offset += grid.select(selector, values, data[field], offset)
return data
def _read_chunk_data(self, chunk, fields):
# This reads the data from a single chunk without doing any selection,
# and is only used for caching data that might be used by multiple
# different selectors later. For instance, this can speed up ghost zone
# computation.
pass