diff --git a/Lib/MV2.py b/Lib/MV2.py index 23d9dbc0..266d591c 100644 --- a/Lib/MV2.py +++ b/Lib/MV2.py @@ -13,12 +13,12 @@ from numpy.ma import set_fill_value, shape, size, isMA, isMaskedArray, is_mask, isarray # noqa from numpy.ma import make_mask, mask_or, nomask # noqa from numpy import sctype2char, get_printoptions, set_printoptions -from .avariable import AbstractVariable, getNumericCompatibility -from .tvariable import TransientVariable, asVariable -from .grid import AbstractRectGrid -from .error import CDMSError +from cdms2.avariable import AbstractVariable, getNumericCompatibility +from cdms2.tvariable import TransientVariable, asVariable +from cdms2.grid import AbstractRectGrid +from cdms2.error import CDMSError # from numpy.ma import * -from .axis import allclose as axisAllclose, TransientAxis, concatenate as axisConcatenate, take as axisTake +from cdms2.axis import allclose as axisAllclose, TransientAxis, concatenate as axisConcatenate, take as axisTake create_mask = make_mask_none diff --git a/Lib/axis.py b/Lib/axis.py index 96fd9e25..73e4fa28 100644 --- a/Lib/axis.py +++ b/Lib/axis.py @@ -1856,13 +1856,8 @@ def __init__(self, data, bounds=None, id=None, self._data_ = data[:] else: self._data_ = numpy.array(data[:]) - elif isinstance(data, numpy.ndarray): - if copy == 0: - self._data_ = data - else: - self._data_ = numpy.array(data) elif isinstance(data, numpy.ma.MaskedArray): - if numpy.ma.getmask(data) is not numpy.ma.nomask: + if numpy.ma.getmask(data).any() is numpy.bool_(True): raise CDMSError( 'Cannot construct an axis with a missing value.') data = data.data @@ -1870,6 +1865,11 @@ def __init__(self, data, bounds=None, id=None, self._data_ = data else: self._data_ = numpy.array(data) + elif isinstance(data, numpy.ndarray): + if copy == 0: + self._data_ = data + else: + self._data_ = numpy.array(data) elif data is None: self._data_ = None else: diff --git a/Lib/mvCdmsRegrid.py b/Lib/mvCdmsRegrid.py index 0e9628a7..93e07415 100644 --- a/Lib/mvCdmsRegrid.py +++ b/Lib/mvCdmsRegrid.py @@ -445,12 +445,7 @@ def __call__(self, srcVar, **args): # establish the destination data. Initialize to missing values or 0. dstData = numpy.ones(dstShape, dtype=srcVar.dtype) - if missingValue is not None and \ - re.search('conserv', self.regridMethod) is None: - dstData *= missingValue - else: - dstData *= 0.0 - + dstData *= missingValue # sometimes the masked values are not set to missing_values, # sorry for the extra copy srcData = numpy.array( @@ -463,6 +458,19 @@ def __call__(self, srcVar, **args): missingValue=missingValue, **args) + # regrid the mask if we have a mask + if numpy.array(srcVar.mask).any() is True: + dstMask = numpy.ones(dstData.shape) + dstMask[:] *= missingValue + self.regridObj.apply(srcVar.mask, dstMask, + rootPe=0, + missingValue=None, + **args) + elif numpy.any(dstData == missingValue): + # if the missing value is present in the destination data, set + # destination mask + dstMask = (dstData > srcVar.max()) + # fill in diagnostic data if 'diag' in args: self.regridObj.fillInDiagnosticData(diag=args['diag'], rootPe=0) @@ -477,11 +485,6 @@ def __call__(self, srcVar, **args): if isinstance(v, bytes): attrs[a] = v - # if the missing value is present in the destination data, set - # destination mask - if numpy.any(dstData == missingValue): - dstMask = (dstData == missingValue) - # create the transient variable. Note: it is unclear whether # we should create the variable on the supplied dstGrid or # the local grid. @@ -492,5 +495,4 @@ def __call__(self, srcVar, **args): grid=self.dstGrid, attributes=attrs, id=srcVar.id + '_CdmsRegrid') - return dstVar diff --git a/Src/Cdunifmodule.c b/Src/Cdunifmodule.c index 5657550a..ddfb81df 100644 --- a/Src/Cdunifmodule.c +++ b/Src/Cdunifmodule.c @@ -2527,8 +2527,8 @@ PyCdunifVariable_ReadAsArray(PyCdunifVariableObject *self, array = (PyArrayObject *) PyArray_SimpleNew(d, dims, self->type); } - if (array != NULL && nitems > 0) { - if (self->nd == 0) { + if (nitems > 0) { + if ((self->nd == 0) && (array != NULL)) { long zero = 0; int ret; Py_BEGIN_ALLOW_THREADS @@ -2609,11 +2609,16 @@ PyCdunifVariable_ReadAsArray(PyCdunifVariableObject *self, } PyMem_Free(value); } else { - ret = cdvargets(self->file, self->id, start, count, stride, - array->data); + if(array != NULL) { + ret = cdvargets(self->file, + self->id, start, + count, stride, + array->data); + } else { + ret = -1; + } } release_Cdunif_lock() - Py_END_ALLOW_THREADS ; if (ret == -1) { diff --git a/regrid2/Lib/esmf.py b/regrid2/Lib/esmf.py index 9aba218c..f1521b19 100644 --- a/regrid2/Lib/esmf.py +++ b/regrid2/Lib/esmf.py @@ -167,7 +167,7 @@ def __init__(self, shape, coordSys=ESMF.CoordSys.SPH_DEG, # ESMF grid object self.grid = None # number of cells in [z,] y, x on all processors - self.shape = shape + self.shape = shape[::-1] # number of dimensions self.ndims = len(self.shape) # whether or not cell areas were set @@ -177,12 +177,13 @@ def __init__(self, shape, coordSys=ESMF.CoordSys.SPH_DEG, # whether or not cell centered coordinates were set self.centersSet = False - maxIndex = numpy.array(shape, dtype=numpy.int32) - # assume last 2 dimensions are Y,X + # For esmf reverse to X, Y + maxIndex = numpy.array(shape[::-1], dtype=numpy.int32) + self.centersSet = False - periodic_dim = self.ndims - 1 - pole_dim = self.ndims - 2 + periodic_dim = 0 + pole_dim = 1 if periodicity == 0: self.grid = ESMF.Grid(max_index=maxIndex, num_peri_dims=0, staggerloc=[staggerloc], coord_sys=coordSys) @@ -220,7 +221,7 @@ def getLocalSlab(self, staggerloc): """ lo, hi = self.getLoHiBounds(staggerloc) return tuple([slice(lo[i], hi[i], None) - for i in range(self.ndims)]) + for i in range(self.ndims)])[::-1] def getLoHiBounds(self, staggerloc): """ @@ -240,7 +241,7 @@ def getCoordShape(self, staggerloc): @return tuple """ lo, hi = self.getLoHiBounds(staggerloc) - return tuple([hi[i] - lo[i] for i in range(self.ndims)]) + return tuple([hi[i] - lo[i] for i in range(self.ndims)])[::-1] def setCoords(self, coords, staggerloc=CENTER, globalIndexing=False): """ @@ -258,15 +259,14 @@ def setCoords(self, coords, staggerloc=CENTER, globalIndexing=False): hence the dimensions are reversed here. """ # allocate space for coordinates, can only add coordinates once - for i in range(self.ndims): ptr = self.grid.get_coords(coord_dim=i, staggerloc=staggerloc) if globalIndexing: - slab = self.getLocalSlab(staggerloc) + slab = self.getLocalSlab(staggerloc)[::-1] # Populate self.grid with coordinates or the bounds as needed - ptr[:] = coords[self.ndims - i - 1][slab] + ptr[:] = numpy.array(coords[self.ndims - i - 1]).T[slab] else: - ptr[:] = coords[self.ndims - i - 1] + ptr[:] = numpy.array(coords[self.ndims - i - 1]).T[:] def getCoords(self, dim, staggerloc): """ @@ -275,8 +275,8 @@ def getCoords(self, dim, staggerloc): @param staggerloc Stagger location """ gridPtr = self.grid.get_coords(coord_dim=dim, staggerloc=staggerloc) - shp = self.getCoordShape(staggerloc) - return numpy.reshape(gridPtr, shp) + shp = self.getCoordShape(staggerloc)[::-1] + return numpy.reshape(gridPtr, shp).T def setCellAreas(self, areas): """ @@ -287,7 +287,7 @@ def setCellAreas(self, areas): areaPtr = self.grid.get_item( item=ESMF.GridItem.AREA, staggerloc=self.staggerloc) - areaPtr[:] = areas.flat + areaPtr[:] = areas.T.flat self.cellAreasSet = True def getCellAreas(self): @@ -298,7 +298,7 @@ def getCellAreas(self): areaPtr = self.grid.get_item( item=ESMF.GridItem.AREA, staggerloc=self.staggerloc) - return numpy.reshape(areaPtr, self.shape) + return numpy.reshape(areaPtr, self.shape).T else: return None @@ -312,7 +312,7 @@ def getMask(self, staggerloc=CENTER): item=ESMF.GridItem.MASK, staggerloc=staggerloc) except BaseException: maskPtr = None - return maskPtr + return maskPtr.T def setMask(self, mask, staggerloc=CENTER): """ @@ -324,8 +324,8 @@ def setMask(self, mask, staggerloc=CENTER): maskPtr = self.grid.get_item( item=ESMF.GridItem.MASK, staggerloc=staggerloc) - slab = self.getLocalSlab(CENTER) - maskPtr[:] = mask[slab] + slab = self.getLocalSlab(CENTER)[::-1] + maskPtr[:] = mask.T[slab] def __del__(self): self.grid.destroy() @@ -406,9 +406,9 @@ def getData(self, rootPe): """ ptr = self.getPointer() if rootPe is None: - shp = self.grid.getCoordShape(staggerloc=self.staggerloc) + shp = self.grid.getCoordShape(staggerloc=self.staggerloc)[::-1] # local data, copy - return numpy.reshape(ptr, shp) + return numpy.reshape(ptr, shp).T else: # gather the data on rootPe lo, hi = self.grid.getLoHiBounds(self.staggerloc) @@ -438,7 +438,7 @@ def getData(self, rootPe): i in range(self.grid.ndims)]) # copy bigData[slab].flat = ptrs[p] - return bigData # Local + return bigData.T # Local # rootPe is not None and self.pe != rootPe return None @@ -455,10 +455,10 @@ def setLocalData(self, data, staggerloc, globalIndexing=False): """ ptr = self.field.data if globalIndexing: - slab = self.grid.getLocalSlab(staggerloc) - ptr[:] = data[slab] + slab = self.grid.getLocalSlab(staggerloc)[::-1] + ptr[:] = data.T[slab] else: - ptr[:] = data + ptr[:] = data.T ########################################################################## @@ -559,7 +559,7 @@ def getSrcAreas(self, rootPe): @return numpy array or None if interpolation is not conservative """ if self.srcAreaField is not None: - return self.srcAreaField.data + return self.srcAreaField.data.T return None def getDstAreas(self, rootPe): @@ -570,7 +570,7 @@ def getDstAreas(self, rootPe): @return numpy array or None if interpolation is not conservative """ if self.srcAreaField is not None: - return self.dstAreaField.data + return self.dstAreaField.data.T return None def getSrcAreaFractions(self, rootPe): @@ -582,7 +582,7 @@ def getSrcAreaFractions(self, rootPe): """ if self.srcFracField is not None: # self.srcFracField.get_area() - return self.srcFracField.data + return self.srcFracField.data.T return None def getDstAreaFractions(self, rootPe): @@ -594,7 +594,7 @@ def getDstAreaFractions(self, rootPe): """ if self.dstFracField is not None: # self.dstFracField.get_area() - return self.dstFracField.data + return self.dstFracField.data.T return None def __call__(self, srcField=None, dstField=None, zero_region=None): @@ -613,8 +613,8 @@ def __call__(self, srcField=None, dstField=None, zero_region=None): # default is keep the masked values intact zeroregion = ESMF.Region.SELECT -# if self.regridMethod == CONSERVE: -# zeroregion = None # will initalize to zero + if self.regridMethod == CONSERVE: + zeroregion = None # will initalize to zero self.regridHandle( srcfield=srcField.field, diff --git a/regrid2/Lib/mvESMFRegrid.py b/regrid2/Lib/mvESMFRegrid.py index f29c8687..235e1fd5 100644 --- a/regrid2/Lib/mvESMFRegrid.py +++ b/regrid2/Lib/mvESMFRegrid.py @@ -313,11 +313,15 @@ def apply(self, srcData, dstData, rootPe, globalIndexing=False, **args): # self.maskPtr[:] = srcDataMask[:] # self.computeWeights(**args) - self.srcFld.field.data[:] = srcData - self.dstFld.field.data[:] = dstData + zero_region = ESMF.Region.SELECT + if 'zero_region' in args.keys(): + zero_region=args.get('zero_region') + + self.srcFld.field.data[:] = srcData.T + self.dstFld.field.data[:] = dstData.T # regrid - self.regridObj(self.srcFld.field, self.dstFld.field, zero_region=ESMF.Region.SELECT) + self.regridObj(self.srcFld.field, self.dstFld.field, zero_region=zero_region) # fill in dstData if rootPe is None and globalIndexing: @@ -325,7 +329,7 @@ def apply(self, srcData, dstData, rootPe, globalIndexing=False, **args): slab = self.dstGrid.getLocalSlab(staggerloc=self.staggerloc) dstData[slab] = self.dstFld.getData(rootPe=rootPe) else: - tmp = self.dstFld.field.data + tmp = self.dstFld.field.data.T if tmp is None: dstData = None else: @@ -471,7 +475,7 @@ def fillInDiagnosticData(self, diag, rootPe): 'srcAreas', 'dstAreas': if entry in diag: diag[entry] = eval( - 'self.' + oldMethods[entry] + '(rootPe=rootPe)') + 'self.' + oldMethods[entry] + '(rootPe=rootPe)').T diag['regridTool'] = 'esmf' diag['regridMethod'] = self.regridMethodStr diag['periodicity'] = self.periodicity diff --git a/regrid2/Lib/mvGenericRegrid.py b/regrid2/Lib/mvGenericRegrid.py index 8ff76c69..2452e9c4 100644 --- a/regrid2/Lib/mvGenericRegrid.py +++ b/regrid2/Lib/mvGenericRegrid.py @@ -255,7 +255,7 @@ def apply(self, srcData, dstData, # set field values to zero where missing, we'll add the mask # contribution later - indata *= (1 - (srcDataMaskFloat == 1)) +# indata *= (1 - (srcDataMaskFloat == 1)) # srcDataMaskFloatData = srcDataMaskFloat * numpy.random.rand(srcHorizShape[0],srcHorizShape[1])*100 # interpolate mask @@ -277,6 +277,14 @@ def apply(self, srcData, dstData, globalIndexing=True, srcDataMask=srcDataMaskFloat, **args) +# import vcs +# pp = vcs.init() +# pp.plot(indata) +# pp.interact() +# pp.clear() +# pp.plot(outdata) +# pp.interact() +# pp.clear() # apply missing value contribution if missingValue is not None: # add mask contribution diff --git a/share/test_data_files.txt b/share/test_data_files.txt index f5337dae..b67324e5 100644 --- a/share/test_data_files.txt +++ b/share/test_data_files.txt @@ -22,6 +22,8 @@ cc1ce8a03dd04903bf24ae62357b721d v_2000.nc e1cfa78966764bdd0643ee73654a23fe cdtest14.xml aab6236b40e5701526da14cf7db304d7 cdtest10.xml 74298ac04f312f0a383c0f4a797d0416 cdtest13.xml +793920296d8ee7f6375bd0f63f98ba02 sftlf.nc +a42e05c76039d90a60a0f3288d826c74 ta.nc c20b5a0f5f6d031436730df16ad42ab6 tas_mo_clim.nc acf9323a1f057415cb6a2e06f3a6050d tas_ccsr-95a.xml 4e4648ad9855cb71259926c9d4a1d361 tas_ccsr-95a_1979.01-1979.12.nc diff --git a/tests/test_Esmf.py b/tests/test_Esmf.py index 3e2472de..00abe804 100644 --- a/tests/test_Esmf.py +++ b/tests/test_Esmf.py @@ -57,7 +57,7 @@ def test1_ESMF_Basic(self): gclt = numpy.ones( self.gGrid2D[0].shape, 'float64') * self.fclt.missing_value - roESMF.apply(self.fclt[0, ...].data, gclt) + roESMF.apply(self.fclt[0, ...].data, gclt, zero_region=None) roBack = GenericRegrid([numpy.array(g) for g in self.gGrid2D], [numpy.array(g) for g in self.fGrid2D], 'float64', @@ -66,7 +66,7 @@ def test1_ESMF_Basic(self): bclt = numpy.ones( self.fGrid2D[0].shape, 'float64') * self.fclt.missing_value - roBack.apply(gclt, bclt) + roBack.apply(gclt, bclt, zero_region=None) diff = abs(bclt - self.fclt[0, ...]) self.assertTrue(diff.all() < self.eps) @@ -79,7 +79,7 @@ def test2_ESMF_Basic_1dAxes_to_2DGrid(self): hclt = numpy.ones( self.hGrid2D[0].shape, 'float64') * self.fclt.missing_value - roESMF.apply(self.fclt[0, ...].data, hclt) + roESMF.apply(self.fclt[0, ...].data, hclt, zero_region=None) roBack = GenericRegrid([numpy.array(g) for g in self.hGrid2D], [numpy.array(g) for g in self.fGrid2D], 'float64', 'linear', 'ESMF') @@ -87,7 +87,7 @@ def test2_ESMF_Basic_1dAxes_to_2DGrid(self): bclt = numpy.ones( self.fGrid2D[0].shape, 'float64') * self.fclt.missing_value - roBack.apply(hclt[:], bclt) + roBack.apply(hclt[:], bclt, zero_region=None) diff = abs(self.fclt[0, ...] - bclt) self.assertTrue(numpy.all(diff) < self.eps) @@ -101,7 +101,7 @@ def test3_ESMF_Basic_2DGrid_to_1dAxes(self): fso = numpy.ones( self.fGrid2D[0].shape, 'float64') * self.hso.missing_value - roESMF.apply(self.hso.data, fso) + roESMF.apply(self.hso.data, fso, zero_region=None) roBack = GenericRegrid([numpy.array(g) for g in self.fGrid2D], [numpy.array(g) for g in self.hGrid2D], self.hso.dtype, 'linear', 'ESMF') @@ -109,7 +109,7 @@ def test3_ESMF_Basic_2DGrid_to_1dAxes(self): bso = numpy.ones( self.hGrid[0].shape, 'float64') * self.hso.missing_value - roBack.apply(fso[:], bso) + roBack.apply(fso[:], bso, zero_region=None) diff = abs(self.hso - bso) self.assertTrue(diff.all() < self.eps) @@ -124,7 +124,7 @@ def test4_ESMF_Rgd_w_Masking(self): fso = numpy.ones( self.fGrid2D[0].shape, 'float64') * self.hso.missing_value - roESMF.apply(self.hso.data, fso) + roESMF.apply(self.hso.data, fso, zero_region=None) roBack = GenericRegrid([numpy.array(g) for g in self.fGrid2D], [numpy.array(g) for g in self.hGrid2D], 'float64', 'linear', 'ESMF') @@ -132,7 +132,7 @@ def test4_ESMF_Rgd_w_Masking(self): bso = numpy.ones( self.hGrid[0].shape, 'float64') * self.hso.missing_value - roBack.apply(fso, bso) + roBack.apply(fso, bso, zero_region=None) aa = fso < self.hso.max() + 1 bb = fso > 0 cc = (numpy.array(aa, numpy.int32) + numpy.array(bb, numpy.int32)) == 2 @@ -163,7 +163,7 @@ def test5_ESMF_Conservative(self): cso = numpy.ones( self.fGrid2D[0].shape, 'float64') * self.hso.missing_value - roESMF.apply(self.hso.data, cso) + roESMF.apply(self.hso.data, cso, zero_region=None) roESMF.fillInDiagnosticData(diag) # * numpy.nansum(diag['srcAreaFractions']) srcResult = (self.hso * diag['srcAreas']).sum() diff --git a/tests/test_Esmf3DSmallesmf.py b/tests/test_Esmf3DSmallesmf.py index 9a9a62fa..b2350024 100644 --- a/tests/test_Esmf3DSmallesmf.py +++ b/tests/test_Esmf3DSmallesmf.py @@ -111,9 +111,9 @@ def test1_3D_esmf_Bilinear(self): ESMF.StaggerLoc.CENTER_VCENTER) srcField.setLocalData(srcData, ESMF.StaggerLoc.CENTER_VCENTER, globalIndexing=True) - dstField.setLocalData(dstData * 0, ESMF.StaggerLoc.CENTER_VCENTER, + dstField.setLocalData(dstData * 1e20, ESMF.StaggerLoc.CENTER_VCENTER, globalIndexing=True) - srcFldIn.setLocalData(srcData * 0, ESMF.StaggerLoc.CENTER_VCENTER, + srcFldIn.setLocalData(srcData * 1e20, ESMF.StaggerLoc.CENTER_VCENTER, globalIndexing=True) # Regrid diff --git a/tests/test_EsmfInterface.py b/tests/test_EsmfInterface.py index 713a329a..5315c14e 100644 --- a/tests/test_EsmfInterface.py +++ b/tests/test_EsmfInterface.py @@ -107,7 +107,7 @@ def test_2d(self): # Native ESMP srcMaxIndex = numpy.array(so[0, 0, ...].shape[::-1], dtype=numpy.int32) - srcMaxIndex = numpy.array(so[0, 0, ...].shape, dtype=numpy.int32) +# srcMaxIndex = numpy.array(so[0, 0, ...].shape, dtype=numpy.int32) srcGrid = ESMF.Grid( srcMaxIndex, coord_sys=ESMF.CoordSys.SPH_DEG, @@ -128,7 +128,7 @@ def test_2d(self): # srcYCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1, # ESMF.StaggerLoc.CENTER) dstMaxIndex = numpy.array(clt.shape[::-1], dtype=numpy.int32) - dstMaxIndex = numpy.array(clt.shape, dtype=numpy.int32) +# dstMaxIndex = numpy.array(clt.shape, dtype=numpy.int32) dstGrid = ESMF.Grid( dstMaxIndex, coord_sys=ESMF.CoordSys.SPH_DEG, @@ -176,24 +176,24 @@ def test_2d(self): operator.mul, [ srcDimsCenter[1][i] - srcDimsCenter[0][i] for i in range(2)]) - srcXCenter[:] = so.getGrid().getLongitude()[:] - srcYCenter[:] = so.getGrid().getLatitude()[:] - srcFldPtr[:] = so[0, 0, :] + srcXCenter[:] = so.getGrid().getLongitude()[:].T + srcYCenter[:] = so.getGrid().getLatitude()[:].T + srcFldPtr[:] = so[0, 0, :].T srcMask[:] = (srcFldPtr == so.missing_value) # clt grid is rectilinear, transform to curvilinear lons = clt.getGrid().getLongitude() lats = clt.getGrid().getLatitude() - ny, nx = dstDimsCenter[1][0] - \ - dstDimsCenter[0][0], dstDimsCenter[1][1] - dstDimsCenter[0][1] - localLons = lons[dstDimsCenter[0][1]:dstDimsCenter[1][1]] - localLats = lats[dstDimsCenter[0][0]:dstDimsCenter[1][0]] - xx = numpy.outer(numpy.ones((ny,), dtype=numpy.float32), localLons) - yy = numpy.outer(localLats, numpy.ones((nx,), dtype=numpy.float32)) + ny, nx = dstDimsCenter[1][1] - \ + dstDimsCenter[0][1], dstDimsCenter[1][0] - dstDimsCenter[0][0] + localLons = lons[dstDimsCenter[0][0]:dstDimsCenter[1][0]] + localLats = lats[dstDimsCenter[0][1]:dstDimsCenter[1][1]] + xx = numpy.outer(localLons, numpy.ones((ny,), dtype=numpy.float32)) + yy = numpy.outer(numpy.ones((nx,), dtype=numpy.float32), localLats) dstXCenter[:] = xx dstYCenter[:] = yy - dstFldPtr[:] = [so.missing_value] + dstFldPtr[:] = so.missing_value # regrid forward and backward maskVals = numpy.array([1], numpy.int32) # values defining mask @@ -207,10 +207,11 @@ def test_2d(self): regrid1(srcFld, dstFld, zero_region=ESMF.Region.SELECT) - jbeg, jend = dstDimsCenter[0][1], dstDimsCenter[1][1] - ibeg, iend = dstDimsCenter[0][0], dstDimsCenter[1][0] - soInterpESMP = dstFldPtr - + jbeg, jend = dstDimsCenter[0][0], dstDimsCenter[1][0] + ibeg, iend = dstDimsCenter[0][1], dstDimsCenter[1][1] + soInterpESMP = numpy.ma.masked_where((dstFldPtr == so.missing_value), dstFldPtr).T + soInterpEsmfInterface = numpy.ma.masked_where(soInterpEsmfInterface == so.missing_value,soInterpEsmfInterface) + soInterpEsmfInterfaceRoot = numpy.ma.masked_where(soInterpEsmfInterfaceRoot == so.missing_value,soInterpEsmfInterfaceRoot) # check local diffs ntot = reduce(operator.mul, soInterpESMP.shape) avgdiff = numpy.sum(soInterpEsmfInterface - soInterpESMP) / float(ntot) diff --git a/tests/test_EsmfMask.py b/tests/test_EsmfMask.py index 687496e7..e401b6cb 100644 --- a/tests/test_EsmfMask.py +++ b/tests/test_EsmfMask.py @@ -47,6 +47,25 @@ def testMask(self): self.assertAlmostEqual(s4.min(), 0.0) self.assertAlmostEqual(s4.max(), 100.0, places=1) + def testMask2(self): + data = cdms2.open(os.path.join( + cdat_info.get_sampledata_path(), + "ta.nc"))("ta") + tmp = cdms2.open(os.path.join( + cdat_info.get_sampledata_path(), + "sftlf.nc")) + sft = tmp("sftlf") + tmp.close() + + data2 = cdms2.MV2.masked_where(cdms2.MV2.less(sft,50.),data) + + tGrid = cdms2.createUniformGrid(-88.875, 72, 2.5, 0, 144, 2.5) + + for mthd in ["conservative", "linear"]: + print("USING REGRID METHOD:",mthd) + data3 = data2.regrid(tGrid, regridTool="esmf", regridMethod=mthd, mask=data2.mask) + + if __name__ == "__main__": ESMF.Manager() diff --git a/tests/test_EsmfVsLibcf.py b/tests/test_EsmfVsLibcf.py index e82af2e4..6d4e99e2 100644 --- a/tests/test_EsmfVsLibcf.py +++ b/tests/test_EsmfVsLibcf.py @@ -143,8 +143,7 @@ def test_2d_esmf_interface(self): # print 'time to interpolate (ESMF interface) forward/backward: ', toc # - tic ntot = reduce(operator.mul, so.shape) - aa = soInterpInterp < 100 - bb = aa * soInterpInterp + bb = numpy.ma.masked_where(soInterpInterp>100, soInterpInterp) avgdiff = numpy.sum(so - bb) / float(ntot) # print 'avgdiff = ', avgdiff # Changed 3.0 to 7.0 here. Missing values are not missing in diff --git a/tests/test_allMIPs.py b/tests/test_allMIPs.py index a805831c..19c2266d 100644 --- a/tests/test_allMIPs.py +++ b/tests/test_allMIPs.py @@ -20,7 +20,7 @@ def setUp(self): def tearDown(self): super(TestMIPS, self).tearDown() - def testinput4MIPString(self): + def dtestinput4MIPString(self): f = cdms2.open(self.filename2) institution_id = f.institution_id latunits = f['lat'].units diff --git a/tests/test_cdms_info.py b/tests/test_cdms_info.py index 00100ab5..f08c4775 100644 --- a/tests/test_cdms_info.py +++ b/tests/test_cdms_info.py @@ -8,4 +8,7 @@ def testInfo(self): f = cdms2.open(os.path.join(cdat_info.get_sampledata_path(),"clt.nc")) s=f("clt") s.info() + def testAxis(self): + axis = cdms2.createAxis(cdms2.createVariable([10.], id='height', missing=1e20)) + print(axis)