Most of these capacities are developed as part of the Earth System Modeling
Framework-ESMF (http://www.earthsystemmodeling.org/
def map_points(oldcoord, newcoord):
"""
Routine to create mapping from fine resolution to course for area averaging using aggregated_by method
"""
oldind = np.arange(oldcoord.points.size)
newind = np.arange(newcoord.points.size)
if oldcoord.circular:
mapind = np.around((oldind.astype(float) * newind.size)/oldind.size).astype(int)
else:
mapind = np.around((oldind.astype(float) * (newind.size-1))/(oldind.size-1)).astype(int)
if oldcoord.circular:
mapind = np.fmod(mapind, newind.size)
mapcoord = iris.coords.AuxCoord(newcoord.points[mapind], units=newcoord.units, coord_system=newcoord.coord_system)
mapcoord.rename(newcoord.name())
return mapcoord
def area_average(cube, aggfunc, samplepoints):
"""
Calculate crude box area average using aggregated_by method
- Useful for interpolating from fine to course resolution
- Does not allow for intersecting grid boxes, or areas of boxes.
aggfunc is one of Iris' aggregator objects
samplepoints is the list of new grid points cf. iris.analyis.interpolate.linear
"""
aggcube = cube.copy()
for (coordname, points) in samplepoints:
if aggcube.coords(coordname):
aggcube.coord(coordname).rename('old_%s'%coordname)
oldcoord = aggcube.coord('old_%s'%coordname)
newcoord = iris.coords.AuxCoord(points, units=oldcoord.units, coord_system=oldcoord.coord_system)
newcoord.rename(coordname)
aggcube.add_aux_coord(map_points(oldcoord, newcoord), aggcube.coord_dims(oldcoord))
# This line requires the fudged iris
aggcube = aggcube.aggregated_by(coordname, aggfunc)
aggcube = swap_aux_dim(aggcube, coordname)
return aggcube
def test_regrid_masked(self):
cs = iris.coord_systems.GeogCS(654321)
src = iris.cube.Cube(np.ma.masked_less(np.arange(25, dtype='f').reshape((5,5)), 10))
src.add_dim_coord(DimCoord(range(5), "latitude", coord_system=cs), 0)
src.add_dim_coord(DimCoord(range(5), "longitude", coord_system=cs), 1)
dst = iris.cube.Cube(np.ndarray((2,2)))
dst.add_dim_coord(DimCoord([1,3], "latitude", coord_system=cs), 0)
dst.add_dim_coord(DimCoord([1,3], "longitude", coord_system=cs), 1)
r = iris.analysis.interpolate.regrid(src, dst)
self.assertCMLApproxData(r, ('regrid', 'masked.cml'))
src = iris.cube.Cube(np.ma.MaskedArray(np.arange(25, dtype='f').reshape((5,5)), mask=np.zeros((5,5))))
src.data.mask[1:-1, 1:-1] = True
src.data.data[1,1] = 99