def build_analyticfieldgrid(field, grid):
  '''
  PRECONDITIONS: An ESMP_Field has been created.
  POSTCONDITIONS: The 'field' has been initialized to an analytic field.
  '''
  # get the field pointer first
  fieldPtr = ESMP.ESMP_FieldGetPtr(field) 
   
  # get the grid bounds and coordinate pointers
  exLB, exUB = ESMP.ESMP_GridGetCoord(grid, ESMP.ESMP_STAGGERLOC_CENTER)

  # get the coordinate pointers and set the coordinates
  [x,y] = [0, 1]
  gridXCoord = ESMP.ESMP_GridGetCoordPtr(grid, x, ESMP.ESMP_STAGGERLOC_CENTER)
  gridYCoord = ESMP.ESMP_GridGetCoordPtr(grid, y, ESMP.ESMP_STAGGERLOC_CENTER)

  #print "Grid center coordinates"
  p = 0 
  for i1 in range(exLB[1], exUB[1]): 
    for i0 in range(exLB[0], exUB[0]): 
      xc = gridXCoord[p]
      yc = gridYCoord[p]
      fieldPtr[p] = 20.0+xc+yc
      #fieldPtr[p] = 20.0+xc*yc+yc**2
      #print '[{0},{1}] = {2}'.format(xc,yc,fieldPtr[p]) 
      p = p + 1 
  #print "\n"

  return field
Esempio n. 2
0
def esmfGrid(grid, cds, sloc):
    """
    @param grid ESMF grid
    @param cds list of coordinates
    @param sloc ESMP staggerlocation
    """
    # Destination Centers
    ESMP.ESMP_GridAddCoord(grid, staggerloc = sloc)

    lo, hi = ESMP.ESMP_GridGetCoord(grid, staggerloc = sloc)
    ndims = len(lo)
    # Dimensions for local processor
    Ntot = reduce(operator.mul, [hi[i] - lo[i] for i in range(ndims)])
    ijkBE = []
    shape = []
    for i in range(ndims):
        ind = (ndims-1)-i
        ijkBE.append(slice(lo[ind], hi[ind], None))
        shape.append(hi[ind] - lo[ind])
        
    print ijkBE
    xyzPtr = []
    for i in range(ndims):
        xyzPtr.append(ESMP.ESMP_GridGetCoordPtr(grid, i, staggerloc = sloc))
        xyzPtr[i][:] = cds[i][ijkBE].flat
    shape = tuple(shape)

    return xyzPtr, ijkBE, shape
Esempio n. 3
0
    def setCoords(self, coords, staggerloc = CENTER, globalIndexing = False):
        """
        Populate the grid with staggered coordinates (e.g. corner or center).
        @param coords   The curvilinear coordinates of the grid.
                        List of numpy arrays. Must exist on all procs.
        @param staggerloc  The stagger location
                           ESMP.ESMP_STAGGERLOC_CENTER (default)
                           ESMP.ESMP_STAGGERLOC_CORNER
        @param globalIndexing if True array was allocated over global index
                              space, otherwise array was allocated over
                              local index space on this processor. This
                              is only relevant if rootPe is None
        Note: coord dims in cdms2 are ordered in y, x, but ESMF expects x, y,
        hence the dimensions are reversed here.
        """
        # allocate space for coordinates, can only add coordinates once

        for i in range(self.ndims):
            ptr = ESMP.ESMP_GridGetCoordPtr(self.grid, i, staggerloc)
            if globalIndexing:
                slab = self.getLocalSlab(staggerloc)
                # Populate self.grid with coordinates or the bounds as needed
                ptr[:] = coords[self.ndims-i-1][slab].flat
            else:
                ptr[:] = coords[self.ndims-i-1].flat
Esempio n. 4
0
 def getCoords(self, dim, staggerloc):
     """
     Return the coordinates for a dimension
     @param dim desired dimension (zero based indexing)
     @param staggerloc Stagger location
     """
     gridPtr = ESMP.ESMP_GridGetCoordPtr(self.grid, dim, staggerloc)
     shp = self.getCoordShape(staggerloc)
     return numpy.reshape(gridPtr, shp)
Esempio n. 5
0
    def XXtest0_ESMP(self):

        import scipy.io.netcdf
        srcF = scipy.io.netcdf.netcdf_file(
            'so_Omon_ACCESS1-0_historical_r1i1p1_185001-185412_2timesteps.nc')
        so = srcF.variables['so'][0, 0, ...]
        missing_value = 1.e20
        srcGrd = [srcF.variables['lat'][:], srcF.variables['lon'][:]]
        srcBounds = _getCorners([
            srcF.variables['lat_vertices'][:],
            srcF.variables['lon_vertices'][:]
        ])

        lat1dBounds = numpy.arange(-90.0, 90.001, 5.0)
        lon1dBounds = numpy.arange(-180.0, 180.001, 5.0)
        lat1dCenter = 0.5 * (lat1dBounds[:-1] + lat1dBounds[1:])
        lon1dCenter = 0.5 * (lon1dBounds[:-1] + lon1dBounds[1:])
        lat2dBounds = numpy.outer(
            lat1dBounds, numpy.ones((len(lon1dBounds), ), lon1dBounds.dtype))
        lon2dBounds = numpy.outer(
            numpy.ones((len(lat1dBounds), ), lat1dBounds.dtype), lon1dBounds)
        lat2dCenter = numpy.outer(
            lat1dCenter, numpy.ones((len(lon1dCenter), ), lon1dCenter.dtype))
        lon2dCenter = numpy.outer(
            numpy.ones((len(lat1dCenter), ), lat1dCenter.dtype), lon1dCenter)
        dstGrd = [lat2dCenter, lon2dCenter]
        dstBounds = [lat2dBounds, lon2dBounds]

        coordSys = ESMP.ESMP_COORDSYS_SPH_DEG  # ESMP.ESMP_COORDSYS_CART fails

        srcDims = srcGrd[0].shape
        dstDims = dstGrd[0].shape

        # do we need to revert the order here?
        srcMaxIndex = numpy.array(srcDims[::-1],
                                  numpy.int32)  # number of cells
        dstMaxIndex = numpy.array(dstDims[::-1],
                                  numpy.int32)  # number of cells

        # grids
        srcGrid = ESMP.ESMP_GridCreateNoPeriDim(srcMaxIndex, coordSys=coordSys)
        dstGrid = ESMP.ESMP_GridCreateNoPeriDim(dstMaxIndex, coordSys=coordSys)

        # it's a good idea to always add the nodal coordinates
        ESMP.ESMP_GridAddCoord(srcGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER)
        ESMP.ESMP_GridAddCoord(srcGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        ESMP.ESMP_GridAddCoord(dstGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER)
        ESMP.ESMP_GridAddCoord(dstGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)

        # masks
        ESMP.ESMP_GridAddItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)
        srcGridMaskPtr = ESMP.ESMP_GridGetItem(srcGrid,
                                               item=ESMP.ESMP_GRIDITEM_MASK)

        ESMP.ESMP_GridAddItem(dstGrid, item=ESMP.ESMP_GRIDITEM_MASK)
        dstGridMaskPtr = ESMP.ESMP_GridGetItem(dstGrid,
                                               item=ESMP.ESMP_GRIDITEM_MASK)

        # get pointer to coordinates array and dimensions
        # src
        srcXCorner = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        srcYCorner = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        srcLoCorner, srcHiCorner = ESMP.ESMP_GridGetCoord(
            srcGrid, ESMP.ESMP_STAGGERLOC_CORNER)

        srcXCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcYCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcLoCenter, srcHiCenter = ESMP.ESMP_GridGetCoord(
            srcGrid, ESMP.ESMP_STAGGERLOC_CENTER)

        # dst
        dstXCorner = ESMP.ESMP_GridGetCoordPtr(dstGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        dstYCorner = ESMP.ESMP_GridGetCoordPtr(dstGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        dstLoCorner, dstHiCorner = ESMP.ESMP_GridGetCoord(
            dstGrid, ESMP.ESMP_STAGGERLOC_CORNER)

        dstXCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstYCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstLoCenter, dstHiCenter = ESMP.ESMP_GridGetCoord(
            dstGrid, ESMP.ESMP_STAGGERLOC_CENTER)

        # fields
        srcFld = ESMP.ESMP_FieldCreateGrid(
            srcGrid,
            'srcFld',
            typekind=ESMP.ESMP_TYPEKIND_R8,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        dstFld = ESMP.ESMP_FieldCreateGrid(
            dstGrid,
            'dstFld',
            typekind=ESMP.ESMP_TYPEKIND_R8,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        srcAreaField = ESMP.ESMP_FieldCreateGrid(
            srcGrid,
            'srcAreas',
            typekind=ESMP.ESMP_TYPEKIND_R8,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        dstAreaField = ESMP.ESMP_FieldCreateGrid(
            dstGrid,
            'dstAreas',
            typekind=ESMP.ESMP_TYPEKIND_R8,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        srcFracField = ESMP.ESMP_FieldCreateGrid(
            srcGrid,
            'srcFracAreas',
            typekind=ESMP.ESMP_TYPEKIND_R8,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        dstFracField = ESMP.ESMP_FieldCreateGrid(
            dstGrid,
            'dstFracAreas',
            typekind=ESMP.ESMP_TYPEKIND_R8,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)

        srcFieldPtr = ESMP.ESMP_FieldGetPtr(srcFld)
        srcFracPtr = ESMP.ESMP_FieldGetPtr(srcFracField)
        dstFieldPtr = ESMP.ESMP_FieldGetPtr(dstFld)
        dstFracPtr = ESMP.ESMP_FieldGetPtr(dstFracField)

        # set the coordinates and field values. In ESMP, arrays are column major!

        # src-corners
        srcNx1 = srcHiCorner[0] - srcLoCorner[0]
        srcNy1 = srcHiCorner[1] - srcLoCorner[1]
        srcYCorner[:] = srcBounds[0][srcLoCorner[1]:srcHiCorner[1],
                                     srcLoCorner[0]:srcHiCorner[0]].flat
        srcXCorner[:] = srcBounds[1][srcLoCorner[1]:srcHiCorner[1],
                                     srcLoCorner[0]:srcHiCorner[0]].flat

        # src-center coordinates, field, and mask
        srcNx = srcHiCenter[0] - srcLoCenter[0]
        srcNy = srcHiCenter[1] - srcLoCenter[1]
        yc = numpy.array(srcGrd[0][srcLoCenter[1]:srcHiCenter[1],
                                   srcLoCenter[0]:srcHiCenter[0]])
        xc = numpy.array(srcGrd[1][srcLoCenter[1]:srcHiCenter[1],
                                   srcLoCenter[0]:srcHiCenter[0]])
        srcYCenter[:] = yc.flat
        srcXCenter[:] = xc.flat
        msk = numpy.array(so[srcLoCenter[1]:srcHiCenter[1], srcLoCenter[0]:srcHiCenter[0]] \
                              == missing_value, numpy.int32)
        srcGridMaskPtr[:] = msk.flat
        fld = numpy.array(
            so[srcLoCenter[1]:srcHiCenter[1], srcLoCenter[0]:srcHiCenter[0]],
            so.dtype)
        # set to zero where masked
        fld *= (1 - msk)
        srcFieldPtr[:] = fld.flat
        srcFracPtr[:] = 1.0

        # dst-corners
        dstNx1 = dstHiCorner[0] - dstLoCorner[0]
        dstNy1 = dstHiCorner[1] - dstLoCorner[1]
        dstYCorner[:] = dstBounds[0][dstLoCorner[1]:dstHiCorner[1],
                                     dstLoCorner[0]:dstHiCorner[0]].flat
        dstXCorner[:] = dstBounds[1][dstLoCorner[1]:dstHiCorner[1],
                                     dstLoCorner[0]:dstHiCorner[0]].flat

        # dst-center coordinates, field, and mask
        dstNx = dstHiCenter[0] - dstLoCenter[0]
        dstNy = dstHiCenter[1] - dstLoCenter[1]
        yc = numpy.array(dstGrd[0][dstLoCenter[1]:dstHiCenter[1],
                                   dstLoCenter[0]:dstHiCenter[0]])
        xc = numpy.array(dstGrd[1][dstLoCenter[1]:dstHiCenter[1],
                                   dstLoCenter[0]:dstHiCenter[0]])
        dstYCenter[:] = yc.flat
        dstXCenter[:] = xc.flat
        dstGridMaskPtr[:] = 0
        dstFieldPtr[:] = missing_value
        dstFracPtr[:] = 1.0

        # interpolation
        maskVals = numpy.array([1], numpy.int32)  # values defining mask
        regrid = ESMP.ESMP_FieldRegridStore(
            srcFld,
            dstFld,
            srcMaskValues=maskVals,
            dstMaskValues=maskVals,
            regridmethod=ESMP.ESMP_REGRIDMETHOD_CONSERVE,
            unmappedaction=ESMP.ESMP_UNMAPPEDACTION_IGNORE,
            srcFracField=srcFracField,
            dstFracField=dstFracField)

        ESMP.ESMP_FieldRegrid(srcFld, dstFld, regrid)

        # get the cell areas
        ESMP.ESMP_FieldRegridGetArea(srcAreaField)
        ESMP.ESMP_FieldRegridGetArea(dstAreaField)
        srcAreasPtr = ESMP.ESMP_FieldGetPtr(srcAreaField)
        dstAreasPtr = ESMP.ESMP_FieldGetPtr(dstAreaField)

        srcFracPtr = ESMP.ESMP_FieldGetPtr(srcFracField)
        dstFracPtr = ESMP.ESMP_FieldGetPtr(dstFracField)

        # check conservation
        srcFldSum, dstFldSum = srcFieldPtr.sum(), dstFieldPtr.sum()
        srcFldIntegral = (srcFieldPtr * srcAreasPtr * srcFracPtr).sum()
        dstFldIntegral = (dstFieldPtr * dstAreasPtr * dstFracPtr).sum()
        lackConservLocal = srcFldIntegral - dstFldIntegral

        # check for nans
        if numpy.isnan(srcFracPtr).sum() > 0:
            print '[%d] *** %d Nans found in srcFracPtr!!' % (
                self.pe, numpy.isnan().sum(srcFracPtr))
        if numpy.isnan(dstFracPtr).sum() > 0:
            print '[%d] *** %d Nans found in dstFracPtr!!' % (
                self.pe, numpy.isnan().sum(dstFracPtr))

        print '[%d] checksum of src: %g checksum of dst: %g' % (
            self.pe, srcFldSum, dstFldSum)
        print '[%d] src total area integral: %g dst total area integral: %g diff: %g\n' % \
            (self.pe, srcFldIntegral, dstFldIntegral, lackConservLocal)

        if HAS_MPI:
            lackConserv = MPI.COMM_WORLD.reduce(lackConservLocal,
                                                op=MPI.SUM,
                                                root=0)
        else:
            lackConserv = lackConservLocal

        if self.pe == 0:
            print 'ROOT: total lack of conservation (should be small): %f' % lackConserv

        # cleanup
        ESMP.ESMP_FieldRegridRelease(regrid)
        ESMP.ESMP_FieldDestroy(srcAreaField)
        ESMP.ESMP_FieldDestroy(dstAreaField)
        ESMP.ESMP_FieldDestroy(srcFracField)
        ESMP.ESMP_FieldDestroy(dstFracField)
        ESMP.ESMP_FieldDestroy(srcFld)
        ESMP.ESMP_FieldDestroy(dstFld)
        ESMP.ESMP_GridDestroy(srcGrid)
        ESMP.ESMP_GridDestroy(dstGrid)
Esempio n. 6
0
    def test_2d_esmf_native(self):
        print 'running test_2d_esmf_native...'
        f = cdms2.open(sys.prefix + \
                           '/sample_data/so_Omon_ACCESS1-0_historical_r1i1p1_185001-185412_2timesteps.nc')
        so = f('so')[0, 0, :, :]

        clt = cdms2.open(sys.prefix + '/sample_data/clt.nc')('clt')[0, :, :]
        cltBounds = clt.getGrid().getBounds()

        tic = time.time()

        ny, nx = clt.shape
        yb = numpy.zeros((ny + 1, ), numpy.float32)
        yb[:ny] = cltBounds[0][:, 0]
        yb[ny] = cltBounds[0][ny - 1, 1]
        xb = numpy.zeros((nx + 1, ), numpy.float32)
        xb[:nx] = cltBounds[1][:, 0]
        xb[nx] = cltBounds[1][nx - 1, 1]
        # make curvilinear
        dstLatCorner = numpy.outer(yb, numpy.ones((nx + 1, ), numpy.float32))
        dstLonCorner = numpy.outer(numpy.ones((ny + 1, ), numpy.float32), xb)

        ny, nx = so.shape
        soBounds = so.getGrid().getBounds()

        srcLatCorner = numpy.zeros((ny + 1, nx + 1), numpy.float32)
        srcLatCorner[:ny, :nx] = soBounds[0][:, :, 0]
        srcLatCorner[:ny, nx] = soBounds[0][:ny, nx - 1, 1]
        srcLatCorner[ny, nx] = soBounds[0][ny - 1, nx - 1, 2]
        srcLatCorner[ny, :nx] = soBounds[0][ny - 1, :nx, 3]

        srcLonCorner = numpy.zeros((ny + 1, nx + 1), numpy.float32)
        srcLonCorner[:ny, :nx] = soBounds[1][:, :, 0]
        srcLonCorner[:ny, nx] = soBounds[1][:ny, nx - 1, 1]
        srcLonCorner[ny, nx] = soBounds[1][ny - 1, nx - 1, 2]
        srcLonCorner[ny, :nx] = soBounds[1][ny - 1, :nx, 3]

        # create grid
        srcMaxIndex = numpy.array(so.shape[::-1], dtype=numpy.int32)
        srcGrid = ESMP.ESMP_GridCreateNoPeriDim(
            srcMaxIndex, coordSys=ESMP.ESMP_COORDSYS_SPH_DEG)
        ESMP.ESMP_GridAddCoord(srcGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        ESMP.ESMP_GridAddCoord(srcGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER)
        srcDimsCenter = ESMP.ESMP_GridGetCoord(srcGrid,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcDimsCorner = ESMP.ESMP_GridGetCoord(srcGrid,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        srcXCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcYCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcXCorner = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        srcYCorner = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CORNER)

        dstMaxIndex = numpy.array(clt.shape[::-1], dtype=numpy.int32)
        dstGrid = ESMP.ESMP_GridCreateNoPeriDim(
            dstMaxIndex, coordSys=ESMP.ESMP_COORDSYS_SPH_DEG)
        ESMP.ESMP_GridAddCoord(dstGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        ESMP.ESMP_GridAddCoord(dstGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER)
        dstDimsCenter = ESMP.ESMP_GridGetCoord(dstGrid,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstDimsCorner = ESMP.ESMP_GridGetCoord(dstGrid,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        dstXCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstYCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstXCorner = ESMP.ESMP_GridGetCoordPtr(dstGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        dstYCorner = ESMP.ESMP_GridGetCoordPtr(dstGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        # mask
        ESMP.ESMP_GridAddItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)
        srcMask = ESMP.ESMP_GridGetItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)

        # create field
        srcFld = ESMP.ESMP_FieldCreateGrid(
            srcGrid,
            'srcFld',
            typekind=ESMP.ESMP_TYPEKIND_R4,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        srcFldPtr = ESMP.ESMP_FieldGetPtr(srcFld)
        srcFld2 = ESMP.ESMP_FieldCreateGrid(
            srcGrid,
            'srcFld2',
            typekind=ESMP.ESMP_TYPEKIND_R4,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        srcFldPtr2 = ESMP.ESMP_FieldGetPtr(srcFld2)
        dstFld = ESMP.ESMP_FieldCreateGrid(
            dstGrid,
            'dstFld',
            typekind=ESMP.ESMP_TYPEKIND_R4,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        dstFldPtr = ESMP.ESMP_FieldGetPtr(dstFld)

        # set coords, mask, and field values for src and dst

        srcNtotCenter = reduce(operator.mul,
                               [srcDimsCenter[1][i] - srcDimsCenter[0][i] \
                                    for i in range(2)])
        srcNtotCorner = reduce(operator.mul,
                               [srcDimsCorner[1][i] - srcDimsCorner[0][i] \
                                    for i in range(2)])
        srcJCenterBeg = srcDimsCenter[0][1]
        srcJCenterEnd = srcDimsCenter[1][1]
        srcJCornerBeg = srcDimsCorner[0][1]
        srcJCornerEnd = srcDimsCorner[1][1]
        srcICenterBeg = srcDimsCenter[0][0]
        srcICenterEnd = srcDimsCenter[1][0]
        srcICornerBeg = srcDimsCorner[0][0]
        srcICornerEnd = srcDimsCorner[1][0]
        srcLonCenter = so.getLongitude()
        srcLatCenter = so.getLatitude()
        srcXCenter[:] = numpy.reshape(
            srcLonCenter[srcJCenterBeg:srcJCenterEnd,
                         srcICenterBeg:srcICenterEnd], (srcNtotCenter, ))
        srcYCenter[:] = numpy.reshape(
            srcLatCenter[srcJCenterBeg:srcJCenterEnd,
                         srcICenterBeg:srcICenterEnd], (srcNtotCenter, ))
        srcXCorner[:] = numpy.reshape(
            srcLonCorner[srcJCornerBeg:srcJCornerEnd,
                         srcICornerBeg:srcICornerEnd], (srcNtotCorner, ))
        srcYCorner[:] = numpy.reshape(
            srcLatCorner[srcJCornerBeg:srcJCornerEnd,
                         srcICornerBeg:srcICornerEnd], (srcNtotCorner, ))
        srcFldPtr[:] = numpy.reshape(
            so[srcJCenterBeg:srcJCenterEnd, srcICenterBeg:srcICenterEnd],
            (srcNtotCenter, ))
        srcMask[:] = (srcFldPtr == so.missing_value)

        dstNtotCenter = reduce(
            operator.mul,
            [dstDimsCenter[1][i] - dstDimsCenter[0][i] for i in range(2)])
        dstNtotCorner = reduce(
            operator.mul,
            [dstDimsCorner[1][i] - dstDimsCorner[0][i] for i in range(2)])

        # clt grid is rectilinear, transform to curvilinear
        lons = clt.getGrid().getLongitude()
        lats = clt.getGrid().getLatitude()
        ny, nx = dstDimsCenter[1][1] - dstDimsCenter[0][1], dstDimsCenter[1][
            0] - dstDimsCenter[0][0]
        yy = numpy.outer(lats[dstDimsCenter[0][1]:dstDimsCenter[1][1]],
                         numpy.ones((nx, ), dtype=numpy.float32))
        xx = numpy.outer(numpy.ones((ny, ), dtype=numpy.float32),
                         lons[dstDimsCenter[0][0]:dstDimsCenter[1][0]])
        y = yy.reshape((dstNtotCenter, ))
        x = xx.reshape((dstNtotCenter, ))

        dstXCenter[:] = x[:]
        dstYCenter[:] = y[:]
        dstXCorner[:] = numpy.reshape(
            dstLonCorner[dstDimsCorner[0][1]:dstDimsCorner[1][1],
                         dstDimsCorner[0][0]:dstDimsCorner[1][0]],
            (dstNtotCorner, ))
        dstYCorner[:] = numpy.reshape(
            dstLatCorner[dstDimsCorner[0][1]:dstDimsCorner[1][1],
                         dstDimsCorner[0][0]:dstDimsCorner[1][0]],
            (dstNtotCorner, ))
        dstFldPtr[:] = 0

        # regrid forward and backward
        maskVals = numpy.array([1], numpy.int32)  # values defining mask
        regrid1 = ESMP.ESMP_FieldRegridStore(
            srcFld,
            dstFld,
            srcMaskValues=maskVals,
            dstMaskValues=None,
            regridmethod=ESMP.ESMP_REGRIDMETHOD_CONSERVE,
            unmappedaction=ESMP.ESMP_UNMAPPEDACTION_IGNORE,
            srcFracField=None,
            dstFracField=None)

        ESMP.ESMP_FieldRegrid(srcFld, dstFld, regrid1)

        jbeg, jend = dstDimsCenter[0][1], dstDimsCenter[1][1]
        ibeg, iend = dstDimsCenter[0][0], dstDimsCenter[1][0]
        soInterp = numpy.reshape(dstFldPtr, (jend - jbeg, iend - ibeg))

        regrid2 = ESMP.ESMP_FieldRegridStore(
            dstFld,
            srcFld2,
            srcMaskValues=None,
            dstMaskValues=None,
            regridmethod=ESMP.ESMP_REGRIDMETHOD_CONSERVE,
            unmappedaction=ESMP.ESMP_UNMAPPEDACTION_IGNORE,
            srcFracField=None,
            dstFracField=None)
        ESMP.ESMP_FieldRegrid(dstFld, srcFld2, regrid2)

        jbeg, jend = srcDimsCenter[0][1], srcDimsCenter[1][1]
        ibeg, iend = srcDimsCenter[0][0], srcDimsCenter[1][0]
        soInterpInterp = numpy.reshape(srcFldPtr2, (jend - jbeg, iend - ibeg))

        toc = time.time()
        avgdiff = numpy.sum(so[jbeg:jend, ibeg:iend] -
                            soInterpInterp) / float(srcNtotCenter)
        print 'avgdiff = ', avgdiff
        self.assertLess(abs(avgdiff), 3.0)

        if PLOT:
            pylab.figure(1)
            pylab.subplot(2, 2, 1)
            pylab.pcolor(so, vmin=20.0, vmax=40.0)
            pylab.colorbar()
            pylab.title('ESMF conserve native: so')
            pylab.subplot(2, 2, 2)
            pylab.pcolor(soInterp, vmin=20.0, vmax=40.0)
            pylab.colorbar()
            pylab.title('ESMF conserve native: soInterp')
            pylab.subplot(2, 2, 3)
            pylab.pcolor(soInterpInterp, vmin=20.0, vmax=40.0)
            pylab.colorbar()
            pylab.title('ESMF conserve native: soInterpInterp')
            pylab.subplot(2, 2, 4)
            pylab.pcolor(so[jbeg:jend, ibeg:iend] - soInterpInterp,
                         vmin=-0.5,
                         vmax=0.5)
            pylab.colorbar()
            pylab.title('ESMF conserve native: error')

        # clean up
        ESMP.ESMP_FieldRegridRelease(regrid2)
        ESMP.ESMP_FieldRegridRelease(regrid1)
        ESMP.ESMP_FieldDestroy(dstFld)
        ESMP.ESMP_GridDestroy(dstGrid)
        ESMP.ESMP_FieldDestroy(srcFld)
        ESMP.ESMP_FieldDestroy(srcFld2)
        ESMP.ESMP_GridDestroy(srcGrid)
Esempio n. 7
0
    def test_2d_esmf_native(self):
        #print 'running test_2d_esmf_native...'
        f = cdms2.open(sys.prefix + \
                           '/sample_data/so_Omon_ACCESS1-0_historical_r1i1p1_185001-185412_2timesteps.nc')
        so = f('so')[0, 0, :, :]
        clt = cdms2.open(sys.prefix + '/sample_data/clt.nc')('clt')[0, :, :]
        tic = time.time()

        # create grid
        srcMaxIndex = numpy.array(so.shape[::-1], dtype=numpy.int32)
        srcGrid = ESMP.ESMP_GridCreateNoPeriDim(srcMaxIndex, 
                                                coordSys = ESMP.ESMP_COORDSYS_SPH_DEG)
        #srcGrid = ESMP.ESMP_GridCreate1PeriDim(srcMaxIndex, 
        #                                       coordSys = ESMP.ESMP_COORDSYS_SPH_DEG)
        ESMP.ESMP_GridAddCoord(srcGrid, 
                               staggerloc = ESMP.ESMP_STAGGERLOC_CENTER)
        srcDimsCenter = ESMP.ESMP_GridGetCoord(srcGrid,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcXCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0, 
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcYCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1, 
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstMaxIndex = numpy.array(clt.shape[::-1], dtype=numpy.int32)
        dstGrid = ESMP.ESMP_GridCreateNoPeriDim(dstMaxIndex, 
                                                coordSys = ESMP.ESMP_COORDSYS_SPH_DEG)
        ESMP.ESMP_GridAddCoord(dstGrid, 
                               staggerloc = ESMP.ESMP_STAGGERLOC_CENTER)
        dstDimsCenter = ESMP.ESMP_GridGetCoord(dstGrid,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstXCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 0, 
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstYCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 1, 
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        # mask 
        ESMP.ESMP_GridAddItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)
        srcMask = ESMP.ESMP_GridGetItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)
    
        # create field
        srcFld = ESMP.ESMP_FieldCreateGrid(srcGrid, 'srcFld', 
                                        typekind = ESMP.ESMP_TYPEKIND_R4,
                                        staggerloc = ESMP.ESMP_STAGGERLOC_CENTER)
        srcFldPtr = ESMP.ESMP_FieldGetPtr(srcFld)
        srcFld2 = ESMP.ESMP_FieldCreateGrid(srcGrid, 'srcFld2', 
                                        typekind = ESMP.ESMP_TYPEKIND_R4,
                                        staggerloc = ESMP.ESMP_STAGGERLOC_CENTER)
        srcFldPtr2 = ESMP.ESMP_FieldGetPtr(srcFld2)
        dstFld = ESMP.ESMP_FieldCreateGrid(dstGrid, 'dstFld', 
                                        typekind = ESMP.ESMP_TYPEKIND_R4,
                                        staggerloc = ESMP.ESMP_STAGGERLOC_CENTER)
        dstFldPtr = ESMP.ESMP_FieldGetPtr(dstFld)
        
        # set coords, mask, and field values for src and dst
        
        srcNtot = reduce(operator.mul, [srcDimsCenter[1][i] - srcDimsCenter[0][i] for i in range(2)])

        srcXCenter[:] = numpy.reshape(so.getGrid().getLongitude()[srcDimsCenter[0][1]:srcDimsCenter[1][1],
                                                                  srcDimsCenter[0][0]:srcDimsCenter[1][0]], 
                                      (srcNtot,))
        srcYCenter[:] = numpy.reshape(so.getGrid().getLatitude()[srcDimsCenter[0][1]:srcDimsCenter[1][1],
                                                                 srcDimsCenter[0][0]:srcDimsCenter[1][0]], 
                                      (srcNtot,))
        srcFldPtr[:] = numpy.reshape(so[srcDimsCenter[0][1]:srcDimsCenter[1][1],
                                        srcDimsCenter[0][0]:srcDimsCenter[1][0]], 
                                     (srcNtot,))
        srcMask[:] = (srcFldPtr == so.missing_value)

        dstNtot = reduce(operator.mul, [dstDimsCenter[1][i] - dstDimsCenter[0][i] for i in range(2)])

        # clt grid is rectilinear, transform to curvilinear
        lons = clt.getGrid().getLongitude()
        lats = clt.getGrid().getLatitude()
        ny, nx = dstDimsCenter[1][1]-dstDimsCenter[0][1], dstDimsCenter[1][0]-dstDimsCenter[0][0]
        xx = numpy.outer(numpy.ones((ny,), dtype=numpy.float32), lons)
        yy = numpy.outer(lats, numpy.ones((nx,), dtype=numpy.float32))
        x = xx.reshape( (dstNtot,) )
        y = yy.reshape( (dstNtot,) )

        dstXCenter[:] = x[:]
        dstYCenter[:] = y[:]
        dstFldPtr[:] = 0

        # regrid forward and backward
        maskVals = numpy.array([1], numpy.int32) # values defining mask
        regrid1 = ESMP.ESMP_FieldRegridStore(srcFld, 
                                             dstFld, 
                                             srcMaskValues=maskVals, 
                                             dstMaskValues=None, 
                                             regridmethod=ESMP.ESMP_REGRIDMETHOD_BILINEAR, 
                                             unmappedaction=ESMP.ESMP_UNMAPPEDACTION_IGNORE, 
                                             srcFracField=None, 
                                             dstFracField=None)

        ESMP.ESMP_FieldRegrid(srcFld, dstFld, regrid1)
        
        jbeg, jend = dstDimsCenter[0][1], dstDimsCenter[1][1]
        ibeg, iend = dstDimsCenter[0][0], dstDimsCenter[1][0]        
        soInterp = numpy.reshape(dstFldPtr, (jend-jbeg, iend-ibeg))

        regrid2 = ESMP.ESMP_FieldRegridStore(dstFld, 
                                             srcFld2, 
                                             srcMaskValues=None, 
                                             dstMaskValues=None, 
                                             regridmethod=ESMP.ESMP_REGRIDMETHOD_BILINEAR, 
                                             unmappedaction=ESMP.ESMP_UNMAPPEDACTION_IGNORE, 
                                             srcFracField=None, 
                                             dstFracField=None)
        ESMP.ESMP_FieldRegrid(dstFld, srcFld2, regrid2)

        jbeg, jend = srcDimsCenter[0][1], srcDimsCenter[1][1]
        ibeg, iend = srcDimsCenter[0][0], srcDimsCenter[1][0]
        soInterpInterp = numpy.reshape(srcFldPtr2, (jend-jbeg, iend-ibeg))
        
        toc = time.time()
        #print 'time to interpolate (ESMF linear native) forward/backward: ', toc - tic
        ntot = reduce(operator.mul, so.shape)
        avgdiff = numpy.sum(so - soInterpInterp) / float(ntot)
        #print 'avgdiff = ', avgdiff
        self.assertLess(abs(avgdiff), 3.0)
        
        if PLOT:
            pylab.figure(3)
            pylab.subplot(2, 2, 1)
            pylab.pcolor(so, vmin=20.0, vmax=40.0)
            pylab.colorbar()
            pylab.title('ESMF linear native: so')
            pylab.subplot(2, 2, 2)
            pylab.pcolor(soInterp, vmin=20.0, vmax=40.0)
            pylab.colorbar()
            pylab.title('ESMF linear native: soInterp')
            pylab.subplot(2, 2, 3)
            pylab.pcolor(soInterpInterp, vmin=20.0, vmax=40.0)
            pylab.colorbar()
            pylab.title('ESMF linear native: soInterpInterp')
            pylab.subplot(2, 2, 4)
            pylab.pcolor(so - soInterpInterp, vmin=-0.5, vmax=0.5)
            pylab.colorbar()
            pylab.title('ESMF linear native: error')

        # clean up
        ESMP.ESMP_FieldRegridRelease(regrid2)
        ESMP.ESMP_FieldRegridRelease(regrid1)
        ESMP.ESMP_FieldDestroy(dstFld)
        ESMP.ESMP_GridDestroy(dstGrid)
        ESMP.ESMP_FieldDestroy(srcFld)
        ESMP.ESMP_FieldDestroy(srcFld2)
        ESMP.ESMP_GridDestroy(srcGrid)
Esempio n. 8
0
    def Xtest0_ESMP(self):

        import scipy.io.netcdf

        #
        # 1. input
        #

        coordSys = ESMP.ESMP_COORDSYS_SPH_DEG # ESMP.ESMP_COORDSYS_CART fails

        inFile = sys.prefix + \
            '/sample_data/so_Omon_ACCESS1-0_historical_r1i1p1_185001-185412_2timesteps.nc'
        srcF = scipy.io.netcdf.netcdf_file(inFile)
        #so = srcF.variables['so'][0, 0,...]
        missing_value = 1.e20
        srcGrd = [srcF.variables['lat'][:], srcF.variables['lon'][:]]
        srcBounds = _getCorners([srcF.variables['lat_vertices'][:], srcF.variables['lon_vertices'][:]])

        lat1dBounds = numpy.arange(-90.0, 90.001, 5.0)
        lon1dBounds = numpy.arange(-180.0, 180.001, 5.0)
        lat1dCenter = 0.5*(lat1dBounds[:-1] + lat1dBounds[1:])
        lon1dCenter = 0.5*(lon1dBounds[:-1] + lon1dBounds[1:])
        lat2dBounds = numpy.outer(lat1dBounds,
                                  numpy.ones( (len(lon1dBounds),), lon1dBounds.dtype ) )
        lon2dBounds = numpy.outer(numpy.ones( (len(lat1dBounds),),
                                              lat1dBounds.dtype ), lon1dBounds )
        lat2dCenter = numpy.outer(lat1dCenter,
                                  numpy.ones( (len(lon1dCenter),), lon1dCenter.dtype ) )
        lon2dCenter = numpy.outer(numpy.ones( (len(lat1dCenter),),
                                              lat1dCenter.dtype ), lon1dCenter )
        dstGrd = [lat2dCenter, lon2dCenter]
        dstBounds = [lat2dBounds, lon2dBounds]


        srcDims = srcGrd[0].shape
        dstDims = dstGrd[0].shape

        srcMaxIndex = numpy.array(srcDims[::-1], numpy.int32) # number of cells
        dstMaxIndex = numpy.array(dstDims[::-1], numpy.int32) # number of cells

        #
        # 2. create grid objects
        #

        srcGrid = ESMP.ESMP_GridCreateNoPeriDim(srcMaxIndex, coordSys = coordSys)
        dstGrid = ESMP.ESMP_GridCreateNoPeriDim(dstMaxIndex, coordSys = coordSys)

        ESMP.ESMP_GridAddCoord(srcGrid, staggerloc = CORNER)
        ESMP.ESMP_GridAddCoord(srcGrid, staggerloc = CENTER)
        ESMP.ESMP_GridAddCoord(dstGrid, staggerloc = CORNER)
        ESMP.ESMP_GridAddCoord(dstGrid, staggerloc = CENTER)

        # add masks
        ESMP.ESMP_GridAddItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)
        srcGridMaskPtr = ESMP.ESMP_GridGetItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)

        ESMP.ESMP_GridAddItem(dstGrid, item=ESMP.ESMP_GRIDITEM_MASK)
        dstGridMaskPtr = ESMP.ESMP_GridGetItem(dstGrid, item=ESMP.ESMP_GRIDITEM_MASK)

        srcLoCorner, srcHiCorner = ESMP.ESMP_GridGetCoord(srcGrid, CORNER)
        srcLoCenter, srcHiCenter = ESMP.ESMP_GridGetCoord(srcGrid, CENTER)
        dstLoCorner, dstHiCorner = ESMP.ESMP_GridGetCoord(dstGrid, CORNER)
        dstLoCenter, dstHiCenter = ESMP.ESMP_GridGetCoord(dstGrid, CENTER)

        srcNx1 = srcHiCorner[0] - srcLoCorner[0]
        srcNy1 = srcHiCorner[1] - srcLoCorner[1]
        srcNx = srcHiCenter[0] - srcLoCenter[0]
        srcNy = srcHiCenter[1] - srcLoCenter[1]

        dstNx1 = dstHiCorner[0] - dstLoCorner[0]
        dstNy1 = dstHiCorner[1] - dstLoCorner[1]
        dstNx = dstHiCenter[0] - dstLoCenter[0]
        dstNy = dstHiCenter[1] - dstLoCenter[1]

        srcXCorner = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0, CORNER)
        srcYCorner = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1, CORNER)

        srcXCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0, CENTER)
        srcYCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1, CENTER)

        dstXCorner = ESMP.ESMP_GridGetCoordPtr(dstGrid, 0, CORNER)
        dstYCorner = ESMP.ESMP_GridGetCoordPtr(dstGrid, 1, CORNER)

        dstXCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 0, CENTER)
        dstYCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 1, CENTER)

        #
        # 3. create fields
        #

        srcFld = ESMP.ESMP_FieldCreateGrid(srcGrid, 'srcFld',
                                           typekind = R8, staggerloc = CENTER)
        dstFld = ESMP.ESMP_FieldCreateGrid(dstGrid, 'dstFld',
                                           typekind = R8, staggerloc = CENTER)
        srcAreaField = ESMP.ESMP_FieldCreateGrid(srcGrid, 'srcAreas',
                                                 typekind = R8, staggerloc = CENTER)
        dstAreaField = ESMP.ESMP_FieldCreateGrid(dstGrid, 'dstAreas',
                                                 typekind = R8, staggerloc = CENTER)
        srcFracField = ESMP.ESMP_FieldCreateGrid(srcGrid, 'srcFracAreas',
                                                 typekind = R8, staggerloc = CENTER)
        dstFracField = ESMP.ESMP_FieldCreateGrid(dstGrid, 'dstFracAreas',
                                                 typekind = R8, staggerloc = CENTER)
        srcFieldPtr = ESMP.ESMP_FieldGetPtr(srcFld)
        srcFracPtr = ESMP.ESMP_FieldGetPtr(srcFracField)
        dstFieldPtr = ESMP.ESMP_FieldGetPtr(dstFld)
        dstFracPtr = ESMP.ESMP_FieldGetPtr(dstFracField)

        #
        # 4. set the coordinates and the fields
        #

        srcYCorner[:] = srcBounds[0][srcLoCorner[1]:srcHiCorner[1], srcLoCorner[0]:srcHiCorner[0]].flat
        srcXCorner[:] = srcBounds[1][srcLoCorner[1]:srcHiCorner[1], srcLoCorner[0]:srcHiCorner[0]].flat

        # src-center coordinates, field, and mask
        yc = numpy.array(srcGrd[0][srcLoCenter[1]:srcHiCenter[1], srcLoCenter[0]:srcHiCenter[0]])
        xc = numpy.array(srcGrd[1][srcLoCenter[1]:srcHiCenter[1], srcLoCenter[0]:srcHiCenter[0]])
        srcYCenter[:] = yc.flat
        srcXCenter[:] = xc.flat
        # read the local data
        soLocalToPe = srcF.variables['so'][0, 0, srcLoCenter[1]:srcHiCenter[1], srcLoCenter[0]:srcHiCenter[0]]
        msk = numpy.array(soLocalToPe == missing_value, numpy.int32)
        srcGridMaskPtr[:] = msk.flat
        fld = numpy.array(soLocalToPe, soLocalToPe.dtype)
        # set to zero where masked
        fld *= (1 - msk)
        srcFieldPtr[:] = fld.flat
        srcFracPtr[:] = 1.0

        dstYCorner[:] = dstBounds[0][dstLoCorner[1]:dstHiCorner[1], dstLoCorner[0]:dstHiCorner[0]].flat
        dstXCorner[:] = dstBounds[1][dstLoCorner[1]:dstHiCorner[1], dstLoCorner[0]:dstHiCorner[0]].flat

        # dst-center coordinates, field, and mask
        yc = numpy.array(dstGrd[0][dstLoCenter[1]:dstHiCenter[1], dstLoCenter[0]:dstHiCenter[0]])
        xc = numpy.array(dstGrd[1][dstLoCenter[1]:dstHiCenter[1], dstLoCenter[0]:dstHiCenter[0]])
        dstYCenter[:] = yc.flat
        dstXCenter[:] = xc.flat
        dstGridMaskPtr[:] = 0
        dstFieldPtr[:] = missing_value
        dstFracPtr[:] = 1.0

        #
        # 5. interpolate
        #

        maskVals = numpy.array([1], numpy.int32) # values defining mask
        regrid = ESMP.ESMP_FieldRegridStore(srcFld,
                                            dstFld,
                                            srcMaskValues=maskVals,
                                            dstMaskValues=maskVals,
                                            regridmethod=ESMP.ESMP_REGRIDMETHOD_CONSERVE,
                                            unmappedaction=ESMP.ESMP_UNMAPPEDACTION_IGNORE,
                                            srcFracField=srcFracField,
                                            dstFracField=dstFracField)

        ESMP.ESMP_FieldRegrid(srcFld, dstFld, regrid)

        #
        # 6. check
        #

        ESMP.ESMP_FieldRegridGetArea(srcAreaField)
        ESMP.ESMP_FieldRegridGetArea(dstAreaField)
        srcAreasPtr = ESMP.ESMP_FieldGetPtr(srcAreaField)
        dstAreasPtr = ESMP.ESMP_FieldGetPtr(dstAreaField)

        srcFracPtr = ESMP.ESMP_FieldGetPtr(srcFracField)
        dstFracPtr = ESMP.ESMP_FieldGetPtr(dstFracField)

        # conservation
        srcFldSum, dstFldSum = srcFieldPtr.sum(), dstFieldPtr.sum()
        srcFldIntegral = (srcFieldPtr * srcAreasPtr * srcFracPtr).sum()
        dstFldIntegral = (dstFieldPtr * dstAreasPtr * dstFracPtr).sum()
        lackConservLocal = srcFldIntegral - dstFldIntegral

        # nans
        if numpy.isnan(srcFracPtr).sum() > 0:
            print '[%d] *** %d Nans found in srcFracPtr!!' % \
                (self.pe, numpy.isnan().sum(srcFracPtr))
        if numpy.isnan(dstFracPtr).sum() > 0:
            print '[%d] *** %d Nans found in dstFracPtr!!' % \
                (self.pe, numpy.isnan().sum(dstFracPtr))

        print '[%d] checksum of src: %g checksum of dst: %g' % \
            (self.pe, srcFldSum, dstFldSum)
        print '[%d] src total area integral: %g dst total area integral: %g diff: %g\n' % \
            (self.pe, srcFldIntegral, dstFldIntegral, lackConservLocal)

        if HAS_MPI:
            lackConserv = MPI.COMM_WORLD.reduce(lackConservLocal,
                                                op=MPI.SUM, root=0)
        else:
            lackConserv = lackConservLocal

        if self.pe == 0:
            print 'ROOT: total lack of conservation (should be small): %f' % lackConserv

        #
        # 7. clean up
        #

        ESMP.ESMP_FieldRegridRelease(regrid)
        ESMP.ESMP_FieldDestroy(srcAreaField)
        ESMP.ESMP_FieldDestroy(dstAreaField)
        ESMP.ESMP_FieldDestroy(srcFracField)
        ESMP.ESMP_FieldDestroy(dstFracField)
        ESMP.ESMP_FieldDestroy(srcFld)
        ESMP.ESMP_FieldDestroy(dstFld)
        ESMP.ESMP_GridDestroy(srcGrid)
        ESMP.ESMP_GridDestroy(dstGrid)
Esempio n. 9
0
    def test1_EDGE1_linear_cart_nopd_native(self):
        # Cells
        maxIndexdstGrid = numpy.array(self.datadstGrid.shape[::-1],
                                      numpy.int32)
        grid = ESMP.ESMP_GridCreateNoPeriDim(maxIndexdstGrid,
                                             coordSys=ESMP.ESMP_COORDSYS_CART)
        ESMP.ESMP_GridAddCoord(grid, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)

        cGrdXPtr = ESMP.ESMP_GridGetCoordPtr(grid, 0,
                                             ESMP.ESMP_STAGGERLOC_CENTER)
        cGrdYPtr = ESMP.ESMP_GridGetCoordPtr(grid, 1,
                                             ESMP.ESMP_STAGGERLOC_CENTER)

        # Destination u and v fields in the cell centers
        cuFld = ESMP.ESMP_FieldCreateGrid(
            grid,
            'cell_U_Fld',
            typekind=ESMP.ESMP_TYPEKIND_R4,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        cvFld = ESMP.ESMP_FieldCreateGrid(
            grid,
            'cell_V_Fld',
            typekind=ESMP.ESMP_TYPEKIND_R4,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        cuFldPtr = ESMP.ESMP_FieldGetPtr(cuFld)
        cvFldPtr = ESMP.ESMP_FieldGetPtr(cvFld)

        # u Grid
        ESMP.ESMP_GridAddCoord(grid, staggerloc=ESMP.ESMP_STAGGERLOC_EDGE1)
        uGrdXPtr = ESMP.ESMP_GridGetCoordPtr(grid, 0,
                                             ESMP.ESMP_STAGGERLOC_EDGE1)
        uGrdYPtr = ESMP.ESMP_GridGetCoordPtr(grid, 1,
                                             ESMP.ESMP_STAGGERLOC_EDGE1)
        uFld = ESMP.ESMP_FieldCreateGrid(grid,
                                         'srcEdge1',
                                         typekind=ESMP.ESMP_TYPEKIND_R4,
                                         staggerloc=ESMP.ESMP_STAGGERLOC_EDGE1)
        uFldPtr = ESMP.ESMP_FieldGetPtr(uFld)

        # v Grid
        ESMP.ESMP_GridAddCoord(grid, staggerloc=ESMP.ESMP_STAGGERLOC_EDGE2)
        vGrdXPtr = ESMP.ESMP_GridGetCoordPtr(grid, 0,
                                             ESMP.ESMP_STAGGERLOC_EDGE2)
        vGrdYPtr = ESMP.ESMP_GridGetCoordPtr(grid, 1,
                                             ESMP.ESMP_STAGGERLOC_EDGE2)
        vFld = ESMP.ESMP_FieldCreateGrid(grid,
                                         'srcEdge2',
                                         typekind=ESMP.ESMP_TYPEKIND_R4,
                                         staggerloc=ESMP.ESMP_STAGGERLOC_EDGE2)
        vFldPtr = ESMP.ESMP_FieldGetPtr(vFld)

        # Get the indices
        ccLo, ccHi = ESMP.ESMP_GridGetCoord(grid, ESMP.ESMP_STAGGERLOC_CENTER)
        e1Lo, e1Hi = ESMP.ESMP_GridGetCoord(grid, ESMP.ESMP_STAGGERLOC_EDGE1)
        e2Lo, e2Hi = ESMP.ESMP_GridGetCoord(grid, ESMP.ESMP_STAGGERLOC_EDGE2)

        # Set the data
        cGrdXPtr[:] = self.dstGrid[1][ccLo[1]:ccHi[1], ccLo[0]:ccHi[0]].flat
        cGrdYPtr[:] = self.dstGrid[0][ccLo[1]:ccHi[1], ccLo[0]:ccHi[0]].flat
        uGrdXPtr[:] = self.dEdge2[1][e1Lo[1]:e1Hi[1], e1Lo[0]:e1Hi[0]].flat
        uGrdYPtr[:] = self.dEdge2[0][e1Lo[1]:e1Hi[1], e1Lo[0]:e1Hi[0]].flat
        vGrdXPtr[:] = self.dEdge1[1][e2Lo[1]:e2Hi[1], e2Lo[0]:e2Hi[0]].flat
        vGrdYPtr[:] = self.dEdge1[0][e2Lo[1]:e2Hi[1], e2Lo[0]:e2Hi[0]].flat
        cuFldPtr[:] = self.datadstGrid[ccLo[1]:ccHi[1], ccLo[0]:ccHi[0]].flat
        cvFldPtr[:] = self.datadstGrid[ccLo[1]:ccHi[1], ccLo[0]:ccHi[0]].flat
        uFldPtr[:] = self.dataEdge2[e1Lo[1]:e1Hi[1], e1Lo[0]:e1Hi[0]].flat
        vFldPtr[:] = self.dataEdge1[e2Lo[1]:e2Hi[1], e2Lo[0]:e2Hi[0]].flat

        # Regrid
        regridObj1 = ESMP.ESMP_FieldRegridStore(
            uFld,
            cuFld,
            srcMaskValues=None,
            dstMaskValues=None,
            regridmethod=ESMP.ESMP_REGRIDMETHOD_BILINEAR,
            unmappedaction=ESMP.ESMP_UNMAPPEDACTION_IGNORE,
            srcFracField=None,
            dstFracField=None)
        ESMP.ESMP_FieldRegrid(uFld, cuFld, regridObj1)
        regridObj2 = ESMP.ESMP_FieldRegridStore(
            vFld,
            cvFld,
            srcMaskValues=None,
            dstMaskValues=None,
            regridmethod=ESMP.ESMP_REGRIDMETHOD_BILINEAR,
            unmappedaction=ESMP.ESMP_UNMAPPEDACTION_IGNORE,
            srcFracField=None,
            dstFracField=None)
        ESMP.ESMP_FieldRegrid(vFld, cvFld, regridObj2)

        if self.pe == 0:
            print cuFldPtr.shape, self.datadstGrid.shape
            cuFldArr = numpy.reshape(cuFldPtr, self.datadstGrid.shape)
            cvFldArr = numpy.reshape(cvFldPtr, self.datadstGrid.shape)

            print
            print "U's"
            print self.dataEdge2
            print cuFldArr
            print
            print self.dataEdge1
            print cvFldArr
Esempio n. 10
0
    def test_2d(self):

        mype = 0
        if HAS_MPI:
            mype = MPI.COMM_WORLD.Get_rank()

        f = cdms2.open(cdat_info.get_prefix() + \
                           '/sample_data/so_Omon_ACCESS1-0_historical_r1i1p1_185001-185412_2timesteps.nc')
        so = f['so']  #[0, 0, :, :]
        clt = cdms2.open(cdat_info.get_prefix() +
                         '/sample_data/clt.nc')('clt')[0, :, :]

        # ESMF interface, assume so and clt are cell centered
        srcGrid = regrid2.esmf.EsmfStructGrid(
            so[0, 0, ...].shape,
            coordSys=ESMP.ESMP_COORDSYS_SPH_DEG,
            periodicity=0)
        dstGrid = regrid2.esmf.EsmfStructGrid(
            clt.shape, coordSys=ESMP.ESMP_COORDSYS_SPH_DEG, periodicity=0)
        grid = [so.getGrid().getLatitude(), so.getGrid().getLongitude()]
        srcGrid.setCoords([numpy.array(g[:]) for g in grid],
                          staggerloc=ESMP.ESMP_STAGGERLOC_CENTER,
                          globalIndexing=True)
        # convert to curvilinear
        ny, nx = clt.shape
        y = clt.getGrid().getLatitude()
        x = clt.getGrid().getLongitude()
        yy = numpy.outer(y, numpy.ones((nx, ), numpy.float32))
        xx = numpy.outer(numpy.ones((ny, ), numpy.float32), x)
        dstGrid.setCoords([yy, xx],
                          staggerloc=ESMP.ESMP_STAGGERLOC_CENTER,
                          globalIndexing=True)
        mask = numpy.zeros(so[0, 0, ...].shape, numpy.int32)
        mask[:] = (so[0, 0, ...] == so.missing_value)
        srcGrid.setMask(mask)
        srcFld = regrid2.esmf.EsmfStructField(
            srcGrid,
            'srcFld',
            datatype=so[:].dtype,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        srcSlab = srcGrid.getLocalSlab(ESMP.ESMP_STAGGERLOC_CENTER)
        dstSlab = dstGrid.getLocalSlab(ESMP.ESMP_STAGGERLOC_CENTER)
        srcFld.setLocalData(numpy.array(so[0, 0, srcSlab[0], srcSlab[1]]),
                            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        dstFld = regrid2.esmf.EsmfStructField(
            dstGrid,
            'dstFld',
            datatype=so.dtype,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        dstData = numpy.ones(clt.shape, numpy.float32)[dstSlab[0], dstSlab[1]]
        dstFld.setLocalData(so.missing_value * dstData,
                            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)

        rgrd1 = regrid2.esmf.EsmfRegrid(
            srcFld,
            dstFld,
            srcFrac=None,
            dstFrac=None,
            srcMaskValues=numpy.array([1], numpy.int32),
            dstMaskValues=numpy.array([1], numpy.int32),
            regridMethod=ESMP.ESMP_REGRIDMETHOD_BILINEAR,
            unMappedAction=ESMP.ESMP_UNMAPPEDACTION_IGNORE)

        # now interpolate
        rgrd1(srcFld, dstFld)

        # get the data on this proc
        soInterpEsmfInterface = dstFld.getData(rootPe=None)

        # gather the data on proc 0
        soInterpEsmfInterfaceRoot = dstFld.getData(rootPe=0)

        print '[%d] esmfInterface chksum = %f' % (mype,
                                                  soInterpEsmfInterface.sum())
        if mype == 0:
            print 'ROOT esmfInterface chksum = %f' % soInterpEsmfInterfaceRoot.sum(
            )

        # Native ESMP
        srcMaxIndex = numpy.array(so[0, 0, ...].shape[::-1], dtype=numpy.int32)
        srcGrid = ESMP.ESMP_GridCreateNoPeriDim(
            srcMaxIndex, coordSys=ESMP.ESMP_COORDSYS_SPH_DEG)
        ESMP.ESMP_GridAddCoord(srcGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        srcDimsCenter = ESMP.ESMP_GridGetCoord(srcGrid,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcXCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcYCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstMaxIndex = numpy.array(clt.shape[::-1], dtype=numpy.int32)
        dstGrid = ESMP.ESMP_GridCreateNoPeriDim(
            dstMaxIndex, coordSys=ESMP.ESMP_COORDSYS_SPH_DEG)
        ESMP.ESMP_GridAddCoord(dstGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        dstDimsCenter = ESMP.ESMP_GridGetCoord(dstGrid,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstXCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstYCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        # mask
        ESMP.ESMP_GridAddItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)
        srcMask = ESMP.ESMP_GridGetItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)

        # create field
        srcFld = ESMP.ESMP_FieldCreateGrid(
            srcGrid,
            'srcFld',
            typekind=ESMP.ESMP_TYPEKIND_R4,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        srcFldPtr = ESMP.ESMP_FieldGetPtr(srcFld)
        dstFld = ESMP.ESMP_FieldCreateGrid(
            dstGrid,
            'dstFld',
            typekind=ESMP.ESMP_TYPEKIND_R4,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        dstFldPtr = ESMP.ESMP_FieldGetPtr(dstFld)

        # set coords, mask, and field values for src and dst

        srcNtot = reduce(
            operator.mul,
            [srcDimsCenter[1][i] - srcDimsCenter[0][i] for i in range(2)])

        srcXCenter[:] = numpy.reshape(
            so.getGrid().getLongitude()
            [srcDimsCenter[0][1]:srcDimsCenter[1][1],
             srcDimsCenter[0][0]:srcDimsCenter[1][0]], (srcNtot, ))
        srcYCenter[:] = numpy.reshape(
            so.getGrid().getLatitude()
            [srcDimsCenter[0][1]:srcDimsCenter[1][1],
             srcDimsCenter[0][0]:srcDimsCenter[1][0]], (srcNtot, ))
        srcFldPtr[:] = numpy.reshape(
            so[0, 0, srcDimsCenter[0][1]:srcDimsCenter[1][1],
               srcDimsCenter[0][0]:srcDimsCenter[1][0]], (srcNtot, ))
        srcMask[:] = (srcFldPtr == so.missing_value)

        dstNtot = reduce(
            operator.mul,
            [dstDimsCenter[1][i] - dstDimsCenter[0][i] for i in range(2)])

        # clt grid is rectilinear, transform to curvilinear
        lons = clt.getGrid().getLongitude()
        lats = clt.getGrid().getLatitude()
        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(numpy.ones((ny, ), dtype=numpy.float32), localLons)
        yy = numpy.outer(localLats, numpy.ones((nx, ), dtype=numpy.float32))

        dstXCenter[:] = xx.reshape((dstNtot, ))
        dstYCenter[:] = yy.reshape((dstNtot, ))
        dstFldPtr[:] = so.missing_value

        # regrid forward and backward
        maskVals = numpy.array([1], numpy.int32)  # values defining mask
        regrid1 = ESMP.ESMP_FieldRegridStore(
            srcFld,
            dstFld,
            srcMaskValues=maskVals,
            dstMaskValues=None,
            regridmethod=ESMP.ESMP_REGRIDMETHOD_BILINEAR,
            unmappedaction=ESMP.ESMP_UNMAPPEDACTION_IGNORE,
            srcFracField=None,
            dstFracField=None)

        ESMP.ESMP_FieldRegrid(srcFld,
                              dstFld,
                              regrid1,
                              zeroregion=ESMP.ESMP_REGION_SELECT)

        jbeg, jend = dstDimsCenter[0][1], dstDimsCenter[1][1]
        ibeg, iend = dstDimsCenter[0][0], dstDimsCenter[1][0]
        soInterpESMP = numpy.reshape(dstFldPtr, (jend - jbeg, iend - ibeg))

        # check local diffs
        ntot = reduce(operator.mul, soInterpESMP.shape)
        avgdiff = numpy.sum(soInterpEsmfInterface - soInterpESMP) / float(ntot)
        self.assertLess(abs(avgdiff), 1.e-7)

        # check gather
        chksumESMP = numpy.sum(soInterpESMP)
        chksumEsmfInterface = numpy.sum(soInterpEsmfInterface)
        if HAS_MPI:
            chksumsESMP = MPI.COMM_WORLD.gather(chksumESMP, root=0)
        else:
            chksumsESMP = chksumESMP

        print '[%d] ESMP chksum = %f' % (mype, chksumESMP)
        if mype == 0:
            print 'ROOT ESMP chksum = %f' % numpy.sum(chksumsESMP)

        if mype == 0:
            chksumESMPRoot = numpy.sum(chksumsESMP)
            chksumESMFInterfaceRoot = numpy.sum(soInterpEsmfInterfaceRoot)
            self.assertLess(abs(chksumESMFInterfaceRoot - chksumESMPRoot),
                            1.e-5 * chksumESMPRoot)

        if PLOT:
            pylab.subplot(2, 2, 1)
            pylab.pcolor(so, vmin=20.0, vmax=40.0)
            pylab.colorbar()
            pylab.title('so')
            pylab.subplot(2, 2, 2)
            pylab.pcolor(soInterpEsmfInterface - soInterpESMP,
                         vmin=-0.5,
                         vmax=0.5)
            pylab.colorbar()
            pylab.title('[%d] EsmfInterface - ESMP' % mype)
            pylab.subplot(2, 2, 3)
            pylab.pcolor(soInterpEsmfInterface, vmin=20.0, vmax=40.0)
            pylab.colorbar()
            pylab.title('[%d] ESMFInterface' % mype)
            pylab.subplot(2, 2, 4)
            pylab.pcolor(soInterpESMP, vmin=20, vmax=40)
            pylab.colorbar()
            pylab.title('[%d] ESMP' % mype)

        # clean up
        ESMP.ESMP_FieldRegridRelease(regrid1)
        ESMP.ESMP_FieldDestroy(dstFld)
        ESMP.ESMP_GridDestroy(dstGrid)
        ESMP.ESMP_FieldDestroy(srcFld)
        ESMP.ESMP_GridDestroy(srcGrid)
def grid_create():
  '''
  PRECONDITIONS: ESMP has been initialized.
  POSTCONDITIONS: A ESMP_Grid has been created.
  '''
  ub_x = float(4)
  ub_y = float(4)

  lb_x = float(0)
  lb_y = float(0)
  
  max_x = float(4)
  max_y = float(4)

  min_x = float(0)
  min_y = float(0)

  cellwidth_x = (max_x-min_x)/(ub_x-lb_x)
  cellwidth_y = (max_y-min_y)/(ub_y-lb_y)
  
  cellcenter_x = cellwidth_x/2
  cellcenter_y = cellwidth_y/2
  
  maxIndex = _NP.array([ub_x,ub_y], dtype=_NP.int32)

  grid = ESMP.ESMP_GridCreateNoPeriDim(maxIndex,
                                       coordSys=ESMP.ESMP_COORDSYS_CART)
  
  ##   CORNERS
  ESMP.ESMP_GridAddCoord(grid, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER)

  exLB_corner, exUB_corner = ESMP.ESMP_GridGetCoord(grid, \
                                       ESMP.ESMP_STAGGERLOC_CORNER)

  # get the coordinate pointers and set the coordinates
  [x,y] = [0, 1]
  gridXCorner = ESMP.ESMP_GridGetCoordPtr(grid, x, ESMP.ESMP_STAGGERLOC_CORNER)
  gridYCorner = ESMP.ESMP_GridGetCoordPtr(grid, y, ESMP.ESMP_STAGGERLOC_CORNER)
  
  #print 'lower corner bounds = [{0},{1}]'.format(exLB_corner[0],exLB_corner[1])
  #print 'upper corner bounds = [{0},{1}]'.format(exUB_corner[0],exUB_corner[1])

  p = 0
  for i1 in range(exLB_corner[1], exUB_corner[1]):
    for i0 in range(exLB_corner[0], exUB_corner[0]):
      gridXCorner[p] = float(i0)*cellwidth_x
      gridYCorner[p] = float(i1)*cellwidth_y
      p = p + 1
 
  #print 'Grid corner coordinates:'
  p = 0
  for i1 in range(exLB_corner[1], exUB_corner[1]):
    for i0 in range(exLB_corner[0], exUB_corner[0]):
      #print '[{0},{1}]'.format(gridXCorner[p], gridYCorner[p])
      p = p + 1
  #print '\n'

  ##   CENTERS
  ESMP.ESMP_GridAddCoord(grid, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)

  exLB_center, exUB_center = ESMP.ESMP_GridGetCoord(grid, \
                                       ESMP.ESMP_STAGGERLOC_CENTER)

  # get the coordinate pointers and set the coordinates
  [x,y] = [0, 1]
  gridXCenter = ESMP.ESMP_GridGetCoordPtr(grid, x, ESMP.ESMP_STAGGERLOC_CENTER)
  gridYCenter = ESMP.ESMP_GridGetCoordPtr(grid, y, ESMP.ESMP_STAGGERLOC_CENTER)
  
  #print 'lower corner bounds = [{0},{1}]'.format(exLB_center[0],exLB_center[1])
  #print 'upper corner bounds = [{0},{1}]'.format(exUB_center[0],exUB_center[1])

  p = 0
  for i1 in range(exLB_center[1], exUB_center[1]):
    for i0 in range(exLB_center[0], exUB_center[0]):
      gridXCenter[p] = float(i0)*cellwidth_x + cellwidth_x/2.0
      gridYCenter[p] = float(i1)*cellwidth_y + cellwidth_y/2.0
      p = p + 1
  
  #print 'Grid center coordinates:'
  p = 0
  for i1 in range(exLB_center[1], exUB_center[1]):
    for i0 in range(exLB_center[0], exUB_center[0]):
      #print '[{0},{1}]'.format(gridXCenter[p], gridYCenter[p])
      p = p + 1
  #print '\n'

  return grid
Esempio n. 12
0
    def test1_ESMP(self):

        rk = 0
        if HAS_MPI:
            rk = MPI.COMM_WORLD.Get_rank()

        coordSys = ESMP.ESMP_COORDSYS_CART

        nres = 4
        self.srcDims = (4 * nres, 3 * nres)
        self.dstDims = (4 * nres, 3 * nres)

        srcMaxIndex = numpy.array(self.srcDims, numpy.int32)  # number of cells
        dstMaxIndex = numpy.array(self.dstDims, numpy.int32)  # number of cells

        # grids
        srcGrid = ESMP.ESMP_GridCreateNoPeriDim(srcMaxIndex, coordSys=coordSys)
        dstGrid = ESMP.ESMP_GridCreateNoPeriDim(dstMaxIndex, coordSys=coordSys)
        ESMP.ESMP_GridAddCoord(srcGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER)
        ESMP.ESMP_GridAddCoord(srcGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        ESMP.ESMP_GridAddCoord(dstGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER)
        ESMP.ESMP_GridAddCoord(dstGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)

        # masks
        ESMP.ESMP_GridAddItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)
        srcGridMaskPtr = ESMP.ESMP_GridGetItem(srcGrid,
                                               item=ESMP.ESMP_GRIDITEM_MASK)

        ESMP.ESMP_GridAddItem(dstGrid, item=ESMP.ESMP_GRIDITEM_MASK)
        dstGridMaskPtr = ESMP.ESMP_GridGetItem(dstGrid,
                                               item=ESMP.ESMP_GRIDITEM_MASK)

        # coordinates
        srcXCorner = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        srcYCorner = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        srcLoCorner, srcHiCorner = ESMP.ESMP_GridGetCoord(
            srcGrid, ESMP.ESMP_STAGGERLOC_CORNER)

        srcXCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcYCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcLoCenter, srcHiCenter = ESMP.ESMP_GridGetCoord(
            srcGrid, ESMP.ESMP_STAGGERLOC_CENTER)

        dstXCorner = ESMP.ESMP_GridGetCoordPtr(dstGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        dstYCorner = ESMP.ESMP_GridGetCoordPtr(dstGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        dstLoCorner, dstHiCorner = ESMP.ESMP_GridGetCoord(
            dstGrid, ESMP.ESMP_STAGGERLOC_CORNER)

        dstXCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstYCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstLoCenter, dstHiCenter = ESMP.ESMP_GridGetCoord(
            dstGrid, ESMP.ESMP_STAGGERLOC_CENTER)

        # fields
        srcFld = ESMP.ESMP_FieldCreateGrid(
            srcGrid,
            'srcFld',
            typekind=ESMP.ESMP_TYPEKIND_R8,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        dstFld = ESMP.ESMP_FieldCreateGrid(
            dstGrid,
            'dstFld',
            typekind=ESMP.ESMP_TYPEKIND_R8,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        srcFieldPtr = ESMP.ESMP_FieldGetPtr(srcFld)
        dstFieldPtr = ESMP.ESMP_FieldGetPtr(dstFld)

        # set the coordinates and field values

        # src-corners
        srcNx1 = srcHiCorner[0] - srcLoCorner[0]
        srcNy1 = self.srcDims[1] + 1
        self.dims = self.srcDims
        for iy in range(srcNy1):
            iyp = iy + srcLoCorner[0]
            for ix in range(srcNx1):
                ixp = ix + srcLoCorner[1]
                srcXCorner[ix + iy * srcNx1] = self.xFunct(iyp, ixp)
                srcYCorner[ix + iy * srcNx1] = self.yFunct(iyp, ixp)

        # src-centers and mask
        srcNx = srcHiCenter[0] - srcLoCenter[0]
        srcNy = srcHiCenter[1] - srcLoCenter[1]
        self.dims = self.srcDims
        for iy in range(srcNy):
            iyp = iy + srcLoCenter[0]
            for ix in range(srcNx):
                ixp = ix + srcLoCenter[1]
                x = self.xFunct(iyp + 0.5, ixp + 0.5)
                y = self.yFunct(iyp + 0.5, ixp + 0.5)
                srcXCenter[ix + iy * srcNx] = x
                srcYCenter[ix + iy * srcNx] = y
                mask = 0
                if ((iyp * ixp) % 3) == 1:
                    mask = 1
                srcGridMaskPtr[ix + iy * srcNx] = mask  # valid
                srcFieldPtr[ix + iy * srcNx] = self.func(ixp, iyp)

        # dst-corners
        dstNx1 = dstHiCorner[0] - dstLoCorner[0]
        dstNy1 = dstHiCorner[1] - dstLoCorner[1]
        self.dims = self.dstDims
        for iy in range(dstNy1):
            iyp = iy + dstLoCorner[0]
            for ix in range(dstNx1):
                ixp = ix + dstLoCorner[1]
                dstXCorner[ix + iy * dstNx1] = self.xFunct(iyp, ixp)
                dstYCorner[ix + iy * dstNx1] = self.yFunct(iyp, ixp)

        # dst-centers and mask
        dstNx = dstHiCenter[0] - dstLoCenter[0]
        dstNy = dstHiCenter[1] - dstLoCenter[1]
        self.dims = self.dstDims
        for iy in range(dstNy):
            iyp = iy + dstLoCenter[0]
            for ix in range(dstNx):
                ixp = ix + dstLoCenter[1]
                x = self.xFunct(iyp + 0.5, ixp + 0.5)
                y = self.yFunct(iyp + 0.5, ixp + 0.5)
                dstXCenter[ix + iy * dstNx] = x
                dstYCenter[ix + iy * dstNx] = y
                dstGridMaskPtr[ix + iy * dstNx] = 0  # valid
                dstFieldPtr[ix + iy * dstNx] = -20  # fill value

        srcAreaField = ESMP.ESMP_FieldCreateGrid(srcGrid, 'srcArea')
        dstAreaField = ESMP.ESMP_FieldCreateGrid(dstGrid, 'dstArea')
        srcFracField = ESMP.ESMP_FieldCreateGrid(srcGrid, 'srcFrac')
        dstFracField = ESMP.ESMP_FieldCreateGrid(dstGrid, 'dstFrac')

        # IF you want to set your own area. These lines are required.
        # Otherwise, let ESMF do it.
        #        ESMP.ESMP_GridAddItem(srcGrid, item = ESMP.ESMP_GRIDITEM_AREA)
        #        srcAreas = ESMP.ESMP_GridGetItem(srcGrid, item = ESMP.ESMP_GRIDITEM_AREA)
        #        ESMP.ESMP_GridAddItem(dstGrid, item = ESMP.ESMP_GRIDITEM_AREA)
        #        dstAreas = ESMP.ESMP_GridGetItem(dstGrid, item = ESMP.ESMP_GRIDITEM_AREA)
        #        srcAreas[:] = 0.02080333333
        #        dstAreas[:] = 0.08333333333

        # interpolation
        maskVals = numpy.array([1], numpy.int32)  # values defining mask
        regrid = ESMP.ESMP_FieldRegridStore(
            srcFld,
            dstFld,
            srcMaskValues=maskVals,
            dstMaskValues=None,
            regridmethod=ESMP.ESMP_REGRIDMETHOD_CONSERVE,
            unmappedaction=ESMP.ESMP_UNMAPPEDACTION_IGNORE,
            srcFracField=srcFracField,
            dstFracField=None)

        ESMP.ESMP_FieldRegrid(srcFld, dstFld, regrid)

        # get the cell areas
        ESMP.ESMP_FieldRegridGetArea(srcAreaField)
        ESMP.ESMP_FieldRegridGetArea(dstAreaField)
        srcarea = ESMP.ESMP_FieldGetPtr(srcAreaField)
        dstarea = ESMP.ESMP_FieldGetPtr(dstAreaField)

        srcFracPtr = ESMP.ESMP_FieldGetPtr(srcFracField)

        # check conservation
        marr = numpy.array(mask == 0, dtype=numpy.int32)
        srcFldSum, dstFldSum = srcFieldPtr.sum(), dstFieldPtr.sum()
        srcFldIntegral = (srcFieldPtr * srcarea * srcFracPtr).sum()
        dstFldIntegral = (dstFieldPtr * dstarea).sum()

        lackConservLocal = srcFldIntegral - dstFldIntegral

        print '[%d] src corner lo = %s hi = %s dst corner lo = %s hi = %s' % (
            rk, str(srcLoCorner), str(srcHiCorner), str(dstLoCorner),
            str(dstHiCorner))
        print '[%d] src center lo = %s hi = %s dst center lo = %s hi = %s' % (
            rk, str(srcLoCenter), str(srcHiCenter), str(dstLoCenter),
            str(dstHiCenter))

        print '[%d] checksum of src: %f checksum of dst: %f' % (rk, srcFldSum,
                                                                dstFldSum)
        print '[%d] src total area integral: %g dst total area integral: %g diff: %g\n' % \
            (rk, srcFldIntegral, dstFldIntegral, lackConservLocal)

        if HAS_MPI:
            lackConserv = MPI.COMM_WORLD.reduce(lackConservLocal,
                                                op=MPI.SUM,
                                                root=0)
        else:
            lackConserv = lackConservLocal

        if rk == 0:
            print '[0] total lack of conservation (should be small): %f' % lackConserv
            assert (abs(lackConserv) < 1.e-6)

        # cleanup
        ESMP.ESMP_FieldRegridRelease(regrid)
        ESMP.ESMP_FieldDestroy(srcFld)
        ESMP.ESMP_FieldDestroy(dstFld)
        ESMP.ESMP_GridDestroy(srcGrid)
        ESMP.ESMP_GridDestroy(dstGrid)
Esempio n. 13
0
    def test_2d_esmf_native(self):

        print 'running test_2d_esmf_native...'
        f = cdms2.open(sys.prefix + \
                           '/sample_data/so_Omon_ACCESS1-0_historical_r1i1p1_185001-185412_2timesteps.nc')
        so = f('so')[0, 0, :, :]

        ny, nx = so.shape
        soBounds = so.getGrid().getBounds()

        srcLatCorner = numpy.zeros( (ny+1, nx+1), numpy.float32 )
        srcLatCorner[:ny, :nx] = soBounds[0][:, :, 0]
        srcLatCorner[:ny, nx] = soBounds[0][:ny, nx-1, 1]
        srcLatCorner[ny, nx] = soBounds[0][ny-1, nx-1, 2]
        srcLatCorner[ny, :nx] = soBounds[0][ny-1, :nx, 3]

        srcLonCorner = numpy.zeros( (ny+1, nx+1), numpy.float32 )
        srcLonCorner[:ny, :nx] = soBounds[1][:, :, 0]
        srcLonCorner[:ny, nx] = soBounds[1][:ny, nx-1, 1]
        srcLonCorner[ny, nx] = soBounds[1][ny-1, nx-1, 2]
        srcLonCorner[ny, :nx] = soBounds[1][ny-1, :nx, 3]

        # create grid
        srcMaxIndex = numpy.array(so.shape[::-1], dtype=numpy.int32)
        srcGrid = ESMP.ESMP_GridCreateNoPeriDim(srcMaxIndex, 
                                                coordSys = ESMP.ESMP_COORDSYS_SPH_DEG)
        ESMP.ESMP_GridAddCoord(srcGrid, 
                               staggerloc = ESMP.ESMP_STAGGERLOC_CENTER)
        ESMP.ESMP_GridAddCoord(srcGrid, 
                               staggerloc = ESMP.ESMP_STAGGERLOC_CORNER)

        srcDimsCenter = ESMP.ESMP_GridGetCoord(srcGrid,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcDimsCorner = ESMP.ESMP_GridGetCoord(srcGrid,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        srcXCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0, 
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcYCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1, 
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcXCorner = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0, 
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        srcYCorner = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1, 
                                               ESMP.ESMP_STAGGERLOC_CORNER)

        # mask 
        ESMP.ESMP_GridAddItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)
        srcMask = ESMP.ESMP_GridGetItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)
    
        # create field
        srcFld = ESMP.ESMP_FieldCreateGrid(srcGrid, 'srcFld', 
                                        typekind = ESMP.ESMP_TYPEKIND_R4,
                                        staggerloc = ESMP.ESMP_STAGGERLOC_CENTER)

        srcFldPtr = ESMP.ESMP_FieldGetPtr(srcFld) # local field

        
        # set coords, mask, and field values for src
        
        srcNtotCenter = reduce(operator.mul, 
                               [srcDimsCenter[1][i] - srcDimsCenter[0][i] \
                                    for i in range(2)])
        srcNtotCorner = reduce(operator.mul, 
                               [srcDimsCorner[1][i] - srcDimsCorner[0][i] \
                                    for i in range(2)])
        srcJCenterBeg = srcDimsCenter[0][1]
        srcJCenterEnd = srcDimsCenter[1][1]
        srcJCornerBeg = srcDimsCorner[0][1]
        srcJCornerEnd = srcDimsCorner[1][1]
        srcICenterBeg = srcDimsCenter[0][0]
        srcICenterEnd = srcDimsCenter[1][0]
        srcICornerBeg = srcDimsCorner[0][0]
        srcICornerEnd = srcDimsCorner[1][0]
        srcLonCenter = so.getLongitude()
        srcLatCenter = so.getLatitude()
        srcXCenter[:] = numpy.reshape(srcLonCenter[srcJCenterBeg:srcJCenterEnd,
                                                   srcICenterBeg:srcICenterEnd], 
                                      (srcNtotCenter,))
        srcYCenter[:] = numpy.reshape(srcLatCenter[srcJCenterBeg:srcJCenterEnd,
                                                   srcICenterBeg:srcICenterEnd], 
                                      (srcNtotCenter,))
        srcXCorner[:] = numpy.reshape(srcLonCorner[srcJCornerBeg:srcJCornerEnd, 
                                                   srcICornerBeg:srcICornerEnd], 
                                      (srcNtotCorner,))
        srcYCorner[:] = numpy.reshape(srcLatCorner[srcJCornerBeg:srcJCornerEnd, 
                                                   srcICornerBeg:srcICornerEnd], 
                                      (srcNtotCorner,))
        srcFldPtr[:] = numpy.reshape(so[srcJCenterBeg:srcJCenterEnd,
                                        srcICenterBeg:srcICenterEnd], 
                                     (srcNtotCenter,))
        srcMask[:] = (srcFldPtr == so.missing_value)
        
        
        # pe local start/end indices
        jbeg, jend = srcDimsCenter[0][1], srcDimsCenter[1][1]
        ibeg, iend = srcDimsCenter[0][0], srcDimsCenter[1][0]

        lo, hi = ESMP.ESMP_GridGetCoord(srcGrid)
        ptr =  ESMP.ESMP_FieldGetPtr(srcFld)
        chksum = numpy.sum(ptr)

        # gather the result on proc 0
        from mpi4py import MPI
        comm = MPI.COMM_WORLD
        chksums = comm.gather(chksum, root = 0)
        ptrs = comm.gather(ptr, root = 0)
        mype = comm.Get_rank()
        nprocs = comm.Get_size()
        if mype == 0:
            for i in range(nprocs):
                chksum = numpy.sum(ptrs[i])
                print '[%d] ptrs[i].shape = %s sum(ptrs[i]) = %f' % (i, 
                                                                     str(ptrs[i].shape), 
                                                                     chksum)
                self.assertEqual(chksum, chksums[i])
        # clean up
        ESMP.ESMP_FieldDestroy(srcFld)
        ESMP.ESMP_GridDestroy(srcGrid)
Esempio n. 14
0
    def test_3D_Native(self):
        print 'running test_3d_esmf_native...'
        f = cdms2.open(cdat_info.get_prefix() + \
          '/sample_data/so_Omon_ACCESS1-0_historical_r1i1p1_185001-185412_2timesteps.nc')
        so = f('so')[0, ...]

        # Coords
        soLats = so.getLatitude()[:]
        soLons = so.getLongitude()[:]
        soLevs = so.getLevel()[:]
        soX1 = numpy.ones(soLats.shape)
        soZ1 = numpy.ones(soLevs.shape)
        soLevs = numpy.outer(soLevs, soX1).reshape(so.shape)
        soLats = numpy.outer(soZ1, soLats).reshape(so.shape)
        soLons = numpy.outer(soZ1, soLons).reshape(so.shape)
        shape1 = tuple([i + 1 for i in so.shape])
        shape = so.shape

        print 'Source Center'
        srcXYZCenter = convertToXYZ(soLons, soLats, soLevs)

        # Bounds
        soLtBd0 = so.getLatitude().getBounds()
        soLnBd0 = so.getLongitude().getBounds()
        soLvBd0 = so.getLevel().getBounds()

        soLtBd1 = numpy.zeros(shape1, dtype=numpy.float32)
        soLnBd1 = numpy.zeros(shape1, dtype=numpy.float32)
        soLvBd1 = numpy.zeros(shape1, dtype=numpy.float32)

        soLtBd1[:, :shape[1], :shape[2]] = soLtBd0[:, :, 0]
        soLtBd1[:, shape[1], :shape[2]] = soLtBd0[shape[1] - 1, :, 3]
        soLtBd1[:, :shape[1], shape[2]] = soLtBd0[:, shape[2] - 1, 1]
        soLtBd1[:, shape[1], shape[2]] = soLtBd0[shape[1] - 1, shape[2] - 1, 2]

        soLnBd1[:, :shape[1], :shape[2]] = soLnBd0[:, :, 0]
        soLnBd1[:, shape[1], :shape[2]] = soLnBd0[shape[1] - 1, :, 3]
        soLnBd1[:, :shape[1], shape[2]] = soLnBd0[:, shape[2] - 1, 1]
        soLnBd1[:, shape[1], shape[2]] = soLnBd0[shape[1] - 1, shape[2] - 1, 2]

        soLvBd2 = numpy.zeros(shape1[0], dtype=numpy.float32)
        soLvBd2[:-1] = soLvBd0[:, 0]
        soLvBd2[-1] = soLvBd0[-1, 1]
        soLvBd1 = numpy.outer(soLvBd2, numpy.ones(shape1[1:])).reshape(shape1)

        print 'Source Corner'
        srcXYZCorner = convertToXYZ(soLtBd1, soLnBd1, soLvBd1)

        clt = cdms2.open(cdat_info.get_prefix() +
                         '/sample_data/clt.nc')('clt')[0, :, :]
        cltBounds = clt.getGrid().getBounds()

        # Destination grid dimensions
        nz = 10
        ny, nx = clt.shape
        shape = (nz, ny, nx)
        nz1, ny1, nx1 = nz + 1, ny + 1, nx + 1
        shape1 = (nz1, ny1, nx1)

        # Corners (Nodes) - Destination
        zb = numpy.linspace(0., 5000., nz1)
        yb = numpy.zeros((ny1, ), numpy.float32)
        yb[:ny] = cltBounds[0][:, 0]
        yb[ny] = cltBounds[0][ny - 1, 1]
        xb = numpy.zeros((nx1, ), numpy.float32)
        xb[:nx] = cltBounds[1][:, 0]
        xb[nx] = cltBounds[1][nx - 1, 1]

        # Centers (Cells) - Destination
        zint = (zb[1] - zb[0]) / 2
        z = numpy.linspace(zint, 5000 - zint, nz)
        y = clt.getLatitude()
        x = clt.getLongitude()
        z1 = numpy.ones((nz1, ), numpy.float32)
        y1 = numpy.ones((ny1, ), numpy.float32)
        x1 = numpy.ones((nx1, ), numpy.float32)

        dstLevCorner = numpy.outer(zb, numpy.outer(y1, x1)).reshape((shape1))
        dstLatCorner = numpy.outer(z1, numpy.outer(yb, x1)).reshape((shape1))
        dstLonCorner = numpy.outer(z1, numpy.outer(y1, xb)).reshape((shape1))

        print 'Desintation Corner'
        dstXYZCorner = convertToXYZ(dstLonCorner, dstLatCorner, dstLevCorner)

        # make Centers curvilinear
        z1 = numpy.ones((nz, ), numpy.float32)
        y1 = numpy.ones((ny, ), numpy.float32)
        x1 = numpy.ones((nx, ), numpy.float32)

        dstLevCenter = numpy.outer(z, numpy.outer(y1, x1)).reshape((shape))
        dstLatCenter = numpy.outer(z1, numpy.outer(y, x1)).reshape((shape))
        dstLonCenter = numpy.outer(z1, numpy.outer(y1, x)).reshape((shape))

        print 'Desintation Center'
        dstXYZCenter = convertToXYZ(dstLonCenter, dstLatCenter, dstLevCenter)

        tic = time.time()

        dstShapeCorner = dstXYZCorner[0].shape
        dstShapeCenter = dstXYZCenter[0].shape
        srcShapeCorner = srcXYZCorner[0].shape
        srcShapeCenter = srcXYZCenter[0].shape

        # Establish the destination grid
        maxIndex = numpy.array(dstShapeCenter[::-1], dtype=numpy.int32)
        dstGrid3D = ESMP.ESMP_GridCreateNoPeriDim(
            maxIndex, coordSys=ESMP.ESMP_COORDSYS_CART)

        # Destination Corners
        ESMP.ESMP_GridAddCoord(dstGrid3D,
                               staggerloc=ESMP.ESMP_STAGGERLOC_CORNER_VFACE)

        dstDimsCorner = ESMP.ESMP_GridGetCoord(
            dstGrid3D, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER_VFACE)
        dstXCorner = ESMP.ESMP_GridGetCoordPtr(
            dstGrid3D, 0, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER_VFACE)
        dstYCorner = ESMP.ESMP_GridGetCoordPtr(
            dstGrid3D, 1, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER_VFACE)
        dstZCorner = ESMP.ESMP_GridGetCoordPtr(
            dstGrid3D, 2, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER_VFACE)
        dstNtotCorner = reduce(operator.mul,
                               [dstDimsCorner[1][i] - dstDimsCorner[0][i] \
                                    for i in range(3)])
        dstICornerBE = slice(dstDimsCorner[0][0], dstDimsCorner[1][0])
        dstJCornerBE = slice(dstDimsCorner[0][1], dstDimsCorner[1][1])
        dstKCornerBE = slice(dstDimsCorner[0][2], dstDimsCorner[1][2])
        dstXCorner[:] = dstXYZCorner[0][dstKCornerBE, dstJCornerBE,
                                        dstICornerBE].reshape(dstNtotCorner)
        dstYCorner[:] = dstXYZCorner[1][dstKCornerBE, dstJCornerBE,
                                        dstICornerBE].reshape(dstNtotCorner)
        dstZCorner[:] = dstXYZCorner[2][dstKCornerBE, dstJCornerBE,
                                        dstICornerBE].reshape(dstNtotCorner)
        # Destination Centers
        ESMP.ESMP_GridAddCoord(dstGrid3D,
                               staggerloc=ESMP.ESMP_STAGGERLOC_CENTER_VCENTER)

        dstDimsCenter = ESMP.ESMP_GridGetCoord(
            dstGrid3D, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER_VCENTER)
        dstXCenter = ESMP.ESMP_GridGetCoordPtr(
            dstGrid3D, 0, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER_VCENTER)
        dstYCenter = ESMP.ESMP_GridGetCoordPtr(
            dstGrid3D, 1, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER_VCENTER)
        dstZCenter = ESMP.ESMP_GridGetCoordPtr(
            dstGrid3D, 2, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER_VCENTER)

        # Dimensions for local processor
        dstNtotCenter = reduce(operator.mul,
                               [dstDimsCenter[1][i] - dstDimsCenter[0][i] \
                                    for i in range(3)])
        dstICenterBE = slice(dstDimsCenter[0][0], dstDimsCenter[1][0])
        dstJCenterBE = slice(dstDimsCenter[0][1], dstDimsCenter[1][1])
        dstKCenterBE = slice(dstDimsCenter[0][2], dstDimsCenter[1][2])
        dstKJIShape = ((dstDimsCenter[1][2] - dstDimsCenter[0][2]),
                       (dstDimsCenter[1][1] - dstDimsCenter[0][1]),
                       (dstDimsCenter[1][0] - dstDimsCenter[0][0]))

        # Populate Destination Grid
        dstXCenter[:] = dstXYZCenter[0][dstKCenterBE, dstJCenterBE,
                                        dstICenterBE].flat
        dstYCenter[:] = dstXYZCenter[1][dstKCenterBE, dstJCenterBE,
                                        dstICenterBE].flat
        dstZCenter[:] = dstXYZCenter[2][dstKCenterBE, dstJCenterBE,
                                        dstICenterBE].flat

        # Create and Populate Destination Field
        dstField = ESMP.ESMP_FieldCreateGrid(
            dstGrid3D,
            'dst_salinity',
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER_VCENTER,
            typekind=ESMP.ESMP_TYPEKIND_R4)
        dstFieldPtr = ESMP.ESMP_FieldGetPtr(dstField)
        dstFieldPtr[:] = 1.

        # Establish the source grid
        maxIndex = numpy.array(so.shape[::-1], dtype=numpy.int32)
        srcGrid3D = ESMP.ESMP_GridCreateNoPeriDim(
            maxIndex, coordSys=ESMP.ESMP_COORDSYS_CART)

        # Source Corners
        ESMP.ESMP_GridAddCoord(srcGrid3D,
                               staggerloc=ESMP.ESMP_STAGGERLOC_CORNER_VFACE)

        srcDimsCorner = ESMP.ESMP_GridGetCoord(
            srcGrid3D, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER_VFACE)
        srcXCorner = ESMP.ESMP_GridGetCoordPtr(
            srcGrid3D, 0, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER_VFACE)
        srcYCorner = ESMP.ESMP_GridGetCoordPtr(
            srcGrid3D, 1, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER_VFACE)
        srcZCorner = ESMP.ESMP_GridGetCoordPtr(
            srcGrid3D, 2, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER_VFACE)

        # Dimensions for local processor
        srcNtotCorner = reduce(operator.mul,
                               [srcDimsCorner[1][i] - srcDimsCorner[0][i] \
                                    for i in range(3)])
        srcICornerBE = slice(srcDimsCorner[0][0], srcDimsCorner[1][0])
        srcJCornerBE = slice(srcDimsCorner[0][1], srcDimsCorner[1][1])
        srcKCornerBE = slice(srcDimsCorner[0][2], srcDimsCorner[1][2])
        srcKJIShape = ((srcDimsCorner[1][2] - srcDimsCorner[0][2]),
                       (srcDimsCorner[1][1] - srcDimsCorner[0][1]),
                       (srcDimsCorner[1][0] - srcDimsCorner[0][0]))

        # Populate the Source Grid Corners
        srcXCorner[:] = numpy.reshape(
            srcXYZCorner[0][srcKCornerBE, srcJCornerBE, srcICornerBE],
            srcNtotCorner)
        srcYCorner[:] = numpy.reshape(
            srcXYZCorner[1][srcKCornerBE, srcJCornerBE, srcICornerBE],
            srcNtotCorner)
        srcZCorner[:] = numpy.reshape(
            srcXYZCorner[2][srcKCornerBE, srcJCornerBE, srcICornerBE],
            srcNtotCorner)
        # Source Centers
        ESMP.ESMP_GridAddCoord(srcGrid3D,
                               staggerloc=ESMP.ESMP_STAGGERLOC_CENTER_VCENTER)

        srcDimsCenter = ESMP.ESMP_GridGetCoord(
            srcGrid3D, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER_VCENTER)
        srcXCenter = ESMP.ESMP_GridGetCoordPtr(
            srcGrid3D, 0, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER_VCENTER)
        srcYCenter = ESMP.ESMP_GridGetCoordPtr(
            srcGrid3D, 1, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER_VCENTER)
        srcZCenter = ESMP.ESMP_GridGetCoordPtr(
            srcGrid3D, 2, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER_VCENTER)

        # Dimensions for local processor
        srcNtotCenter = reduce(operator.mul,
                               [srcDimsCenter[1][i] - srcDimsCenter[0][i] \
                                    for i in range(3)])
        srcICenterBE = slice(srcDimsCenter[0][0], srcDimsCenter[1][0])
        srcJCenterBE = slice(srcDimsCenter[0][1], srcDimsCenter[1][1])
        srcKCenterBE = slice(srcDimsCenter[0][2], srcDimsCenter[1][2])
        srcKJIShape = ((srcDimsCenter[1][2] - srcDimsCenter[0][2]) - 1,
                       (srcDimsCenter[1][1] - srcDimsCenter[0][1]) - 1,
                       (srcDimsCenter[1][0] - srcDimsCenter[0][0]) - 1)

        # Populate the Source Grid Centers
        srcXCenter[:] = numpy.reshape(
            srcXYZCenter[0][srcKCenterBE, srcJCenterBE, srcICenterBE],
            srcNtotCenter)
        srcYCenter[:] = numpy.reshape(
            srcXYZCenter[1][srcKCenterBE, srcJCenterBE, srcICenterBE],
            srcNtotCenter)
        srcZCenter[:] = numpy.reshape(
            srcXYZCenter[2][srcKCenterBE, srcJCenterBE, srcICenterBE],
            srcNtotCenter)
        # Source Mask
        ESMP.ESMP_GridAddItem(srcGrid3D, item=ESMP.ESMP_GRIDITEM_MASK)
        srcMaskPtr = ESMP.ESMP_GridGetItem(srcGrid3D,
                                           item=ESMP.ESMP_GRIDITEM_MASK)
        srcMaskPtr[:] = numpy.reshape(
            so[srcKCornerBE, srcJCornerBE, srcICornerBE].mask, srcNtotCenter)

        # Create and Populate Source Field
        srcField = ESMP.ESMP_FieldCreateGrid(
            srcGrid3D,
            'src_salinity',
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER_VCENTER,
            typekind=ESMP.ESMP_TYPEKIND_R4)
        srcFieldPtr = ESMP.ESMP_FieldGetPtr(srcField)
        aa = numpy.array(so)
        srcFieldPtr[:] = numpy.reshape(
            aa[srcKCornerBE, srcJCornerBE, srcICornerBE], srcNtotCenter)

        srcMaskValues = numpy.array([1], numpy.int32)

        # Regrid
        regridOut = ESMP.ESMP_FieldRegridStore(
            srcField,
            dstField,
            srcMaskValues=srcMaskValues,
            dstMaskValues=None,
            srcFracField=None,
            dstFracField=None,
            regridmethod=ESMP.ESMP_REGRIDMETHOD_BILINEAR,
            unmappedaction=ESMP.ESMP_UNMAPPEDACTION_ERROR)
        ESMP.ESMP_FieldRegrid(srcField, dstField, regridOut)

        soInterp = numpy.reshape(dstFieldPtr, dstKJIShape)

        regridBck = ESMP.ESMP_FieldRegridStore(
            dstField,
            srcField,
            srcMaskValues=None,
            dstMaskValues=None,
            srcFracField=None,
            dstFracField=None,
            regridmethod=ESMP.ESMP_REGRIDMETHOD_BILINEAR,
            unmappedaction=ESMP.ESMP_UNMAPPEDACTION_IGNORE)
        ESMP.ESMP_FieldRegrid(dstField, srcField, regridBck)

        soInterpInterp = numpy.reshape(srcFieldPtr, dstKJIShape)

        so.toVisit('so.vsh5')
        soInterp.toVisit('soInterp.vsh5')
        soInterpInterp.toVisit('soInterpInterp.vsh5')
 def getCoordPointer(self):
     return ESMP.ESMP_GridGetCoordPtr(self.grid, 0, staggerloc=CENTER)
Esempio n. 16
0
    def test1_2d_esmf_native_tripolar_fraction(self):

        mype = MPI.COMM_WORLD.Get_rank()

        f = cdms2.open(sys.prefix + \
                           '/sample_data/so_Omon_ACCESS1-0_historical_r1i1p1_185001-185412_2timesteps.nc')
        so = f('so')[0, 0, :, :]

        h = cdms2.open(sys.prefix + \
                           '/sample_data/so_Omon_HadGEM2-CC_historical_r1i1p1_185912-186911_2timesteps.nc')
        hadGEM2Model = h('so')[0, 0, ...]

        ny, nx = so.shape
        soBounds = so.getGrid().getBounds()

        srcLatCorner = numpy.zeros((ny + 1, nx + 1), numpy.float32)
        srcLatCorner[:ny, :nx] = soBounds[0][:, :, 0]
        srcLatCorner[:ny, nx] = soBounds[0][:ny, nx - 1, 1]
        srcLatCorner[ny, nx] = soBounds[0][ny - 1, nx - 1, 2]
        srcLatCorner[ny, :nx] = soBounds[0][ny - 1, :nx, 3]

        srcLonCorner = numpy.zeros((ny + 1, nx + 1), numpy.float32)
        srcLonCorner[:ny, :nx] = soBounds[1][:, :, 0]
        srcLonCorner[:ny, nx] = soBounds[1][:ny, nx - 1, 1]
        srcLonCorner[ny, nx] = soBounds[1][ny - 1, nx - 1, 2]
        srcLonCorner[ny, :nx] = soBounds[1][ny - 1, :nx, 3]

        srcCells = [so.getLatitude(), so.getLongitude()]
        srcNodes = [srcLatCorner, srcLonCorner]

        clt = cdms2.open(sys.prefix + 'sample_data/clt.nc')('clt')[0, :, :]
        cltBounds = clt.getGrid().getBounds()

        ny, nx = clt.shape

        # clt grid is rectilinear, transform to curvilinear
        CLGrid = clt.getGrid().toCurveGrid()
        #lats = CLGrid.getLatitude()[:].data
        lons = CLGrid.getLongitude()[:].data

        # Make the bounds go from -90, 90 with uniform spacing and the
        # Cell Centers go from -88.something to 88.something
        yb = numpy.linspace(-90, 90, ny + 1)
        interval = abs(yb[0] - yb[1])
        y = numpy.linspace(-90 + interval / 2., 90 - interval / 2., ny)
        lats = numpy.outer(y, numpy.ones((nx), numpy.float32))

        ny, nx = clt.shape
        #yb = numpy.zeros((ny+1,), numpy.float32)
        #yb[:ny] = cltBounds[0][:, 0]
        #yb[ny] = cltBounds[0][ny-1, 1]
        xb = numpy.zeros((nx + 1, ), numpy.float32)
        xb[:nx] = cltBounds[1][:, 0]
        xb[nx] = cltBounds[1][nx - 1, 1]

        # make curvilinear
        dstLatCorner = numpy.outer(yb, numpy.ones((nx + 1, ), numpy.float32))
        dstLonCorner = numpy.outer(numpy.ones((ny + 1, ), numpy.float32), xb)

        dstCells = [lats, lons]
        dstNodes = [dstLatCorner, dstLonCorner]

        print 'running test2_2d_esmf_native_tripolar_fraction...'
        tic = time.time()
        # create grid
        srcMaxIndex = numpy.array(so.shape[::-1], dtype=numpy.int32)
        srcGrid = ESMP.ESMP_GridCreate1PeriDim(
            srcMaxIndex, coordSys=ESMP.ESMP_COORDSYS_SPH_DEG)
        ESMP.ESMP_GridAddCoord(srcGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        ESMP.ESMP_GridAddCoord(srcGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER)
        srcDimsCenter = ESMP.ESMP_GridGetCoord(srcGrid,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcDimsCorner = ESMP.ESMP_GridGetCoord(srcGrid,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        srcXCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcYCenter = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        srcXCorner = ESMP.ESMP_GridGetCoordPtr(srcGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        srcYCorner = ESMP.ESMP_GridGetCoordPtr(srcGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CORNER)

        dstMaxIndex = numpy.array(clt.shape[::-1], dtype=numpy.int32)
        dstGrid = ESMP.ESMP_GridCreate1PeriDim(
            dstMaxIndex, coordSys=ESMP.ESMP_COORDSYS_SPH_DEG)
        ESMP.ESMP_GridAddCoord(dstGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        ESMP.ESMP_GridAddCoord(dstGrid, staggerloc=ESMP.ESMP_STAGGERLOC_CORNER)
        dstDimsCenter = ESMP.ESMP_GridGetCoord(dstGrid,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstDimsCorner = ESMP.ESMP_GridGetCoord(dstGrid,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        dstXCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstYCenter = ESMP.ESMP_GridGetCoordPtr(dstGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CENTER)
        dstXCorner = ESMP.ESMP_GridGetCoordPtr(dstGrid, 0,
                                               ESMP.ESMP_STAGGERLOC_CORNER)
        dstYCorner = ESMP.ESMP_GridGetCoordPtr(dstGrid, 1,
                                               ESMP.ESMP_STAGGERLOC_CORNER)

        # mask
        ESMP.ESMP_GridAddItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)
        srcMask = ESMP.ESMP_GridGetItem(srcGrid, item=ESMP.ESMP_GRIDITEM_MASK)

        # create field
        srcFld = ESMP.ESMP_FieldCreateGrid(
            srcGrid,
            'srcFld',
            typekind=ESMP.ESMP_TYPEKIND_R4,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        srcFldPtr = ESMP.ESMP_FieldGetPtr(srcFld)

        dstFld = ESMP.ESMP_FieldCreateGrid(
            dstGrid,
            'dstFld',
            typekind=ESMP.ESMP_TYPEKIND_R4,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        dstFldPtr = ESMP.ESMP_FieldGetPtr(dstFld)

        # Create the field for the fractional areas
        srcFracFld = ESMP.ESMP_FieldCreateGrid(
            srcGrid,
            'srcFrac',
            typekind=ESMP.ESMP_TYPEKIND_R4,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        srcFracPtr = ESMP.ESMP_FieldGetPtr(srcFracFld)
        dstFracFld = ESMP.ESMP_FieldCreateGrid(
            dstGrid,
            'dstFrac',
            typekind=ESMP.ESMP_TYPEKIND_R4,
            staggerloc=ESMP.ESMP_STAGGERLOC_CENTER)
        dstFracPtr = ESMP.ESMP_FieldGetPtr(dstFracFld)

        # set coords, mask, and field values for src and dst

        srcNtotCenter = reduce(operator.mul,
                               [srcDimsCenter[1][i] - srcDimsCenter[0][i] \
                                    for i in range(2)])
        srcNtotCorner = reduce(operator.mul,
                               [srcDimsCorner[1][i] - srcDimsCorner[0][i] \
                                    for i in range(2)])
        srcJCenterBeg = srcDimsCenter[0][1]
        srcJCenterEnd = srcDimsCenter[1][1]
        srcJCornerBeg = srcDimsCorner[0][1]
        srcJCornerEnd = srcDimsCorner[1][1]
        srcICenterBeg = srcDimsCenter[0][0]
        srcICenterEnd = srcDimsCenter[1][0]
        srcICornerBeg = srcDimsCorner[0][0]
        srcICornerEnd = srcDimsCorner[1][0]

        srcXCenter[:] = numpy.reshape(
            srcCells[1][srcJCenterBeg:srcJCenterEnd,
                        srcICenterBeg:srcICenterEnd], (srcNtotCenter, ))
        srcYCenter[:] = numpy.reshape(
            srcCells[0][srcJCenterBeg:srcJCenterEnd,
                        srcICenterBeg:srcICenterEnd], (srcNtotCenter, ))
        srcXCorner[:] = numpy.reshape(
            srcNodes[1][srcJCornerBeg:srcJCornerEnd,
                        srcICornerBeg:srcICornerEnd], (srcNtotCorner, ))
        srcYCorner[:] = numpy.reshape(
            srcNodes[0][srcJCornerBeg:srcJCornerEnd,
                        srcICornerBeg:srcICornerEnd], (srcNtotCorner, ))
        srcFldPtr[:] = numpy.reshape(
            so[srcJCenterBeg:srcJCenterEnd, srcICenterBeg:srcICenterEnd],
            (srcNtotCenter, ))
        srcMask[:] = (srcFldPtr == so.missing_value)

        srcFracPtr[:] = -999
        dstFracPtr[:] = -999

        dstNtotCenter = reduce(
            operator.mul,
            [dstDimsCenter[1][i] - dstDimsCenter[0][i] for i in range(2)])
        dstNtotCorner = reduce(
            operator.mul,
            [dstDimsCorner[1][i] - dstDimsCorner[0][i] for i in range(2)])

        dstXCenter[:] = numpy.reshape(
            dstCells[1][dstDimsCenter[0][1]:dstDimsCenter[1][1],
                        dstDimsCenter[0][0]:dstDimsCenter[1][0]],
            (dstNtotCenter))
        dstXCenter[:] = numpy.reshape(
            dstCells[0][dstDimsCenter[0][1]:dstDimsCenter[1][1],
                        dstDimsCenter[0][0]:dstDimsCenter[1][0]],
            (dstNtotCenter))
        dstXCorner[:] = numpy.reshape(
            dstNodes[1][dstDimsCorner[0][1]:dstDimsCorner[1][1],
                        dstDimsCorner[0][0]:dstDimsCorner[1][0]],
            (dstNtotCorner, ))
        dstYCorner[:] = numpy.reshape(
            dstNodes[0][dstDimsCorner[0][1]:dstDimsCorner[1][1],
                        dstDimsCorner[0][0]:dstDimsCorner[1][0]],
            (dstNtotCorner, ))
        dstFldPtr[:] = 0
        srcAreaFld = ESMP.ESMP_FieldCreateGrid(srcGrid, 'srcArea')
        dstAreaFld = ESMP.ESMP_FieldCreateGrid(dstGrid, 'dstArea')

        # regrid forward and backward
        maskVals = numpy.array([1], numpy.int32)  # values defining mask
        regrid1 = ESMP.ESMP_FieldRegridStore(
            srcFld,
            dstFld,
            srcMaskValues=maskVals,
            dstMaskValues=None,
            regridmethod=ESMP.ESMP_REGRIDMETHOD_CONSERVE,
            unmappedaction=ESMP.ESMP_UNMAPPEDACTION_IGNORE,
            srcFracField=srcFracFld,
            dstFracField=dstFracFld)

        ESMP.ESMP_FieldRegrid(srcFld, dstFld, regrid1)

        srcAreas = ESMP.ESMP_FieldRegridGetArea(srcAreaFld)
        dstAreas = ESMP.ESMP_FieldRegridGetArea(dstAreaFld)

        srcAreaPtr = ESMP.ESMP_FieldGetPtr(srcAreaFld)
        dstAreaPtr = ESMP.ESMP_FieldGetPtr(dstAreaFld)

        if mype == 0:
            srcHasNan = numpy.any(numpy.isnan(srcFracPtr))
            dstHasNan = numpy.any(numpy.isnan(dstFracPtr))

            aa = numpy.isnan(srcFracPtr)
            bb = numpy.isnan(dstFracPtr)

            cc = srcFldPtr == 0
            dd = dstFldPtr == 0

            if PLOT:
                pl.figure(1)
                pl.subplot(2, 1, 1)
                pl.pcolor(numpy.reshape(aa, so.shape))
                pl.colorbar()
                pl.title('source')
                pl.subplot(2, 1, 2)
                pl.pcolor(numpy.reshape(bb, clt.shape))
                pl.colorbar()
                pl.title('destination')
                pl.suptitle("Red == location of nan's")

            print srcHasNan, dstHasNan

            # Do they have nans?
            self.assertFalse(srcHasNan, True)
            self.assertFalse(dstHasNan, True)

            jbeg, jend = dstDimsCenter[0][1], dstDimsCenter[1][1]
            ibeg, iend = dstDimsCenter[0][0], dstDimsCenter[1][0]
            soInterp = numpy.reshape(dstFldPtr, (jend - jbeg, iend - ibeg))

        toc = time.time()

        # clean up
        ESMP.ESMP_FieldRegridRelease(regrid1)
        ESMP.ESMP_FieldDestroy(dstFld)
        ESMP.ESMP_GridDestroy(dstGrid)
        ESMP.ESMP_FieldDestroy(srcFld)
        ESMP.ESMP_GridDestroy(srcGrid)