Source code for parcels.gridset
import numpy as np
__all__ = ['GridSet']
[docs]class GridSet(object):
"""GridSet class that holds the Grids on which the Fields are defined
"""
def __init__(self):
self.grids = []
def add_grid(self, field):
grid = field.grid
existing_grid = False
for g in self.grids:
if field.chunksize == 'auto':
break
if g == grid:
existing_grid = True
break
sameGrid = True
if grid.time_origin != g.time_origin:
continue
for attr in ['lon', 'lat', 'depth', 'time']:
gattr = getattr(g, attr)
gridattr = getattr(grid, attr)
if gattr.shape != gridattr.shape or not np.allclose(gattr, gridattr):
sameGrid = False
break
if (g.chunksize != grid.chunksize) and (grid.chunksize not in [False, None]):
for dim in grid.chunksize:
if grid.chunksize[dim][1] != g.chunksize[dim][1]:
sameGrid &= False
break
if sameGrid:
existing_grid = True
field.grid = g
break
if not existing_grid:
self.grids.append(grid)
field.igrid = self.grids.index(field.grid)
[docs] def dimrange(self, dim):
"""Returns maximum value of a dimension (lon, lat, depth or time)
on 'left' side and minimum value on 'right' side for all grids
in a gridset. Useful for finding e.g. longitude range that
overlaps on all grids in a gridset"""
maxleft, minright = (-np.inf, np.inf)
for g in self.grids:
if getattr(g, dim).size == 1:
continue # not including grids where only one entry
else:
if dim == 'depth':
maxleft = max(maxleft, np.min(getattr(g, dim)))
minright = min(minright, np.max(getattr(g, dim)))
else:
maxleft = max(maxleft, getattr(g, dim)[0])
minright = min(minright, getattr(g, dim)[-1])
maxleft = 0 if maxleft == -np.inf else maxleft # if all len(dim) == 1
minright = 0 if minright == np.inf else minright # if all len(dim) == 1
return maxleft, minright
@property
def size(self):
return len(self.grids)