Example #1
0
    def testGaussian(self):
        lat = cdms2.createGaussianAxis(3)
        out = self.toCross(lat)
        good = [[3.2598915100097656, 2.0, 0.7401084899902344],
                [8.259891510009766, 7.0, 5.740108489990234],
                [13.259891510009766, 12.0, 10.740108489990234],
                [18.259891510009766, 17.0, 15.740108489990234],
                [23.259891510009766, 22.0, 20.740108489990234]]
        self.assertAllClose(out, good)
        lat = cdms2.createGaussianAxis(4)
        out = self.toCross(lat)
        good = [[
            3.2188282012939453, 2.4131927490234375, 1.586807131767273,
            0.7811717987060547
        ],
                [
                    8.218828201293945, 7.4131927490234375, 6.586806774139404,
                    5.781171798706055
                ],
                [
                    13.218828201293945, 12.413192749023438, 11.586806297302246,
                    10.781171798706055
                ],
                [
                    18.218828201293945, 17.413192749023438, 16.586807250976562,
                    15.781171798706055
                ],
                [
                    23.218828201293945, 22.413192749023438, 21.586807250976562,
                    20.781171798706055
                ]]
        self.assertAllClose(out, good)
        lat = cdms2.createGaussianAxis(7)
        out = self.toCross(lat)
        good = [[
            3.5878708362579346, 3.0, 2.5450754165649414, 2.0,
            1.454924464225769, 1.0, 0.4121290147304535
        ],
                [
                    8.587870597839355, 8.0, 7.545075416564941, 7.0,
                    6.4549241065979, 6.0, 5.412128925323486
                ],
                [
                    13.587870597839355, 13.0, 12.545075416564941, 12.0,
                    11.454924583435059, 11.0, 10.412129402160645
                ],
                [
                    18.587871551513672, 18.0, 17.545076370239258, 17.0,
                    16.454925537109375, 16.0, 15.412128448486328
                ],
                [
                    23.587871551513672, 23.0, 22.545074462890625, 22.0,
                    21.454923629760742, 21.0, 20.412128448486328
                ]]
        self.assertAllClose(out, good)

        # now test a bunch
        for i in range(2, 205):
            lat = cdms2.createGaussianAxis(i)
            out = self.toCross(lat)
Example #2
0
    def _gridtype(self, lat):
        """Determines the type of grid from the latitude dimension.

        Performs basic checks to make sure the axis is valid for
        spherical harmonic computations.

        """
        nlat = len(lat)
        d = np.abs(np.diff(lat))
        if (np.abs(d - d[0]) > 0.001).any():
            # Might be a Gaussian axis, construct one and check.
            gax = cdms2.createGaussianAxis(nlat)
            d = np.abs(np.abs(lat) - np.abs(gax))
            if (d > 0.001).any():
                raise ValueError("non-evenly-spaced " "latitudes are not Gaussian")
            gridtype = "gaussian"
        else:
            # Grid is evenly spaced, does it match what we expect?
            if nlat % 2:
                eax = np.linspace(-90, 90, nlat)
            else:
                dlat = 180.0 / nlat
                eax = np.linspace(-90 + 0.5 * dlat, 90 - 0.5 * dlat, nlat)
            d = np.abs(np.abs(lat) - np.abs(eax))
            if (d > 0.001).any():
                raise ValueError("evenly-spaced grid is invalid")
            gridtype = "regular"
        return gridtype
Example #3
0
    def _gridtype(self, lat):
        """Determines the type of grid from the latitude dimension.

        Performs basic checks to make sure the axis is valid for
        spherical harmonic computations.

        """
        nlat = len(lat)
        d = np.abs(np.diff(lat))
        if (np.abs(d - d[0]) > 0.001).any():
            # Might be a Gaussian axis, construct one and check.
            gax = cdms2.createGaussianAxis(nlat)
            d = np.abs(np.abs(lat) - np.abs(gax))
            if (d > 0.001).any():
                raise ValueError('non-evenly-spaced '
                                 'latitudes are not Gaussian')
            gridtype = 'gaussian'
        else:
            # Grid is evenly spaced, does it match what we expect?
            if nlat % 2:
                eax = np.linspace(-90, 90, nlat)
            else:
                dlat = 180. / nlat
                eax = np.linspace(-90 + 0.5 * dlat, 90 - 0.5 * dlat, nlat)
            d = np.abs(np.abs(lat) - np.abs(eax))
            if (d > 0.001).any():
                raise ValueError('evenly-spaced grid is invalid')
            gridtype = 'regular'
        return gridtype
Example #4
0
 def setUp(self):
     dir = "../cdat_data/"
     filename = dir + "so_Omon_NorESM1-M_historicalNat_r1i1p1_185001-185312_2timesteps.nc"
     g = cdms2.open(filename)
     self.so = g("so")[0, 0, ...]
     gLat = cdms2.createGaussianAxis(64)
     deltaLon = 360 / 128.0
     gLon = cdms2.createUniformLongitudeAxis(0, 128, deltaLon)
     self.gaussGrid = cdms2.grid.createGenericGrid(gLat[:], gLon[:], gLat.getBounds(), gLon.getBounds())
Example #5
0
 def setUp(self):
   dir = cdat_info.get_prefix() + "/sample_data/"
   filename = dir + "so_Omon_MPI-ESM-LR_1pctCO2_r1i1p1_185001-185912_2timesteps.nc"
   g = cdms2.open(filename)
   self.so = g('so')[0,0,:,:254]
   gLat = cdms2.createGaussianAxis(64)
   deltaLon = (360/128.)
   gLon = cdms2.createUniformLongitudeAxis(0, 128, deltaLon)
   self.gaussGrid = cdms2.grid.createGenericGrid(gLat[:], gLon[:], 
                                        gLat.getBounds(),
                                        gLon.getBounds())
Example #6
0
 def setUp(self):
     dir = "../cdat_data/"
     filename = dir + "so_Omon_NorESM1-M_historicalNat_r1i1p1_185001-185312_2timesteps.nc"
     g = cdms2.open(filename)
     self.so = g('so')[0, 0, ...]
     gLat = cdms2.createGaussianAxis(64)
     deltaLon = (360 / 128.)
     gLon = cdms2.createUniformLongitudeAxis(0, 128, deltaLon)
     self.gaussGrid = cdms2.grid.createGenericGrid(gLat[:], gLon[:],
                                                   gLat.getBounds(),
                                                   gLon.getBounds())
Example #7
0
 def setUp(self):
   dir = "../cdat_data/"
   filename = dir + "so_Omon_IPSL-CM5A-LR_1pctCO2_r1i1p1_185001-189912_2timesteps.nc"
   g = cdms2.open(filename)
   self.so = g('so')[0,0,...]
   gLat = cdms2.createGaussianAxis(64)
   deltaLon = (360/128.)
   gLon = cdms2.createUniformLongitudeAxis(0, 128, deltaLon)
   self.gaussGrid = cdms2.grid.createGenericGrid(gLat[:], gLon[:], 
                                        gLat.getBounds(),
                                        gLon.getBounds())
Example #8
0
 def setUp(self):
   dir = "../cdat_data/"
   filename = dir + "so_Omon_HadGEM2-ES_esmFixClim1_r1i1p1_185912-186911_2timesteps.nc"
   g = cdms2.open(filename)
   self.so = g('so')[0,0,...]
   gLat = cdms2.createGaussianAxis(64)
   deltaLon = (360/128.)
   gLon = cdms2.createUniformLongitudeAxis(0, 128, deltaLon)
   self.gaussGrid = cdms2.grid.createGenericGrid(gLat[:], gLon[:], 
                                        gLat.getBounds(),
                                        gLon.getBounds())
Example #9
0
 def setUp(self):
   dir = cdat_info.get_sampledata_path() + "/"
   filename = dir + "so_Omon_MPI-ESM-LR_1pctCO2_r1i1p1_185001-185912_2timesteps.nc"
   g = cdms2.open(filename)
   self.so = g('so')[0,0,:,:254]
   gLat = cdms2.createGaussianAxis(64)
   deltaLon = (360/128.)
   gLon = cdms2.createUniformLongitudeAxis(0, 128, deltaLon)
   self.gaussGrid = cdms2.grid.createGenericGrid(gLat[:], gLon[:], 
                                        gLat.getBounds(),
                                        gLon.getBounds())
Example #10
0
 def setUp(self):
     dir = "../cdat_data/"
     filename = dir + "so_Omon_HadGEM2-ES_esmFixClim1_r1i1p1_185912-186911_2timesteps.nc"
     g = cdms2.open(filename)
     self.so = g('so')[0, 0, ...]
     gLat = cdms2.createGaussianAxis(64)
     deltaLon = (360 / 128.)
     gLon = cdms2.createUniformLongitudeAxis(0, 128, deltaLon)
     self.gaussGrid = cdms2.grid.createGenericGrid(gLat[:], gLon[:],
                                                   gLat.getBounds(),
                                                   gLon.getBounds())
Example #11
0
 def setUp(self):
     filename = cdat_info.get_prefix() + \
         "/sample_data/so_Omon_CNRM-CM5_decadal2004_r9i1p1_200501-201412_2timesteps.nc"
     g = cdms2.open(filename)
     self.so = g('so')[0, 0, ...]
     self.so.toVisit('soCNRM.vsh5', 'Vs')
     gLat = cdms2.createGaussianAxis(64)
     deltaLon = (360 / 128.)
     gLon = cdms2.createUniformLongitudeAxis(0, 128, deltaLon)
     self.gaussGrid = cdms2.grid.createGenericGrid(gLat[:], gLon[:],
                                                   gLat.getBounds(),
                                                   gLon.getBounds())
Example #12
0
 def setUp(self):
   filename = sys.prefix + \
       "/sample_data/so_Omon_CNRM-CM5_decadal2004_r9i1p1_200501-201412_2timesteps.nc"
   g = cdms2.open(filename)
   self.so = g('so')[0,0,...]
   self.so.toVisit('soCNRM.vsh5', 'Vs')
   gLat = cdms2.createGaussianAxis(64)
   deltaLon = (360/128.)
   gLon = cdms2.createUniformLongitudeAxis(0, 128, deltaLon)
   self.gaussGrid = cdms2.grid.createGenericGrid(gLat[:], gLon[:], 
                                        gLat.getBounds(),
                                        gLon.getBounds())
	def gaussian_latitude_axis(self,latitude):
		''' gaussian latitude axis checking and generating its bounds using in-build method of cdms2. '''
		# have to develop this function in some other manner soon
		
		#checking the given latitude is either gaussian's latitude axis or not in nasty way at present
		
		gaussian_axis = cdms2.createGaussianAxis(len(latitude))
		gaussian_axis_latitude = gaussian_axis[:]
		
		gaussian_axis_latitude = map(str,gaussian_axis_latitude)
		latitude = map(str,latitude)
				
		if len([ 'match' for i in range(len(latitude)) if latitude[i][0:5] == gaussian_axis_latitude[i][0:5]  ] ) == len(latitude) :
			#print 'match'
			#print gaussian_axis[:]
			#print gaussian_axis.getBounds()
			return gaussian_axis
		else:
			#print 'dont match'
			print " Latitude is not matching to gaussian pattern \n"
			return 0
Example #14
0
    def testTV(self):
        f = self.getDataFile("test.xml")

        x = self.test_arr
        v = f.variables['v']
        vp = x[1, 1:, 4:12, 8:25]
        vp2 = vp[1, 1:-1, 1:]
        tv = v.subRegion((366., 731., 'ccn'), (-42., 42., 'ccn'), (90., 270.))
        tvv = v[0:2, 0:10, 30:40]

        # Make sure we retrieve a scalar
        xx = tv[1, 7, 15]
        self.assertFalse(isinstance(xx, numpy.ndarray))

        # Variable get: axis, grid, latitude, level, longitude, missing, order,
        # time, len, typecode

        vaxis0 = v.getAxis(0)
        axis0 = tv.getAxis(0)
        self.assertFalse(not numpy.ma.allequal(axis0[:], vaxis0[1:]))

        taxis = tv.getTime()
        taxisarray = taxis[:]
        vaxisarray = vaxis0[1:]
        self.assertFalse(not numpy.ma.allequal(taxisarray, vaxisarray))

        vaxis1 = v.getAxis(1)
        lataxis = tv.getLatitude()
        self.assertFalse(not numpy.ma.allequal(lataxis[:], vaxis1[4:12]))

        vaxis2 = v.getAxis(2)
        lonaxis = tv.getLongitude()

        #
        #  default is 'ccn' -- now it 8:25
        #
        self.assertFalse(not numpy.ma.allequal(lonaxis[:], vaxis2[8:25]))

        tv = v.subRegion((366., 731., 'ccn'), (-42., 42., 'ccn'), (90., 270.))
        missing_value = v.getMissing()
        self.assertEqual(missing_value, -99.9)

        tmv = tv.fill_value
        # TODO: Did the default value of fill_value/missing change? This is failing.
        #self.assertEqual(tmv, -99.9)

        grid = tv.getGrid()
        self.assertFalse(grid is None)

        order = tv.getOrder()
        self.assertEqual(order, 'tyx')

        self.assertEqual(len(tv), 2)

        # get TV domain
        domain = tv.getDomain()
        self.assertEqual(len(domain), 3)

        # getRegion of a TV
        tv2 = tv.getRegion(731., (-30., 30., 'ccn'), (101.25, 270.0))
        self.assertFalse(not numpy.ma.allequal(tv2, vp2))

        # Axis get: bounds, calendar, value, isXXX, len, subaxis, typecode
        axis1 = tv.getAxis(1)
        axis2 = tv.getAxis(2)
        bounds = axis1.getBounds()
        self.assertFalse(bounds is None)
        self.assertEqual(axis0.getCalendar(), cdtime.MixedCalendar)
        val = axis1.getValue()
        self.assertFalse(not numpy.ma.allequal(axis1.getValue(), axis1[:]))
        self.assertFalse(not axis0.isTime())
        self.assertFalse(not axis1.isLatitude())
        self.assertFalse(not axis2.isLongitude())
        self.assertTrue(axis2.isCircular())
        self.assertEqual(len(axis2), 17)

        saxis = axis2.subAxis(1, -1)
        self.assertFalse(not numpy.ma.allequal(saxis[:], axis2[1:-1]))
        self.assertEqual(axis1.typecode(), numpy.sctype2char(numpy.float))
        self.assertEqual(axis2.shape, (17, ))

        # Axis set: bounds, calendar
        savebounds = copy.copy(bounds)
        bounds[0, 0] = -90.0
        axis1.setBounds(bounds)
        nbounds = axis1.getBounds()
        self.assertFalse(not numpy.ma.allequal(bounds, nbounds))
        axis0.setCalendar(cdtime.NoLeapCalendar)
        self.assertEqual(axis0.getCalendar(), cdtime.NoLeapCalendar)
        gaussaxis = cdms2.createGaussianAxis(32)
        try:
            testaxis = cdms2.createGaussianAxis(31)
        except BaseException:
            markError('Gaussian axis with odd number of latitudes')

        # Grid get: axis, bounds, latitude, longitude, mask, order, type,
        # weights, subgrid, subgridRegion
        a1 = grid.getAxis(1)
        self.assertFalse(not numpy.ma.allequal(a1[:], axis2[:]))

        bounds[0, 0] = savebounds[0, 0]
        axis1.setBounds(bounds)
        latbounds, lonbounds = grid.getBounds()
        self.assertFalse(not numpy.ma.allequal(latbounds, savebounds))
        glat = grid.getLatitude()
        glon = grid.getLongitude()
        mask = grid.getMask()
        order = grid.getOrder()
        self.assertEqual(order, 'yx')
        gtype = grid.getType()
        weights = grid.getWeights()
        subg = grid.subGrid((1, 7), (1, 15))
        subg2 = grid.subGridRegion((-30., 30., 'ccn'), (101.25, 247.5, 'ccn'))
        self.assertFalse(not numpy.ma.allequal(subg.getLongitude()[:],
                                               subg2.getLongitude()[:]))
        self.assertEqual(grid.shape, (8, 17))

        # Grid set: bounds, mask, type
        latbounds[0, 0] = -90.0
        grid.setBounds(latbounds, lonbounds)
        nlatb, nlonb = grid.getBounds()
        self.assertFalse(not numpy.ma.allequal(latbounds, nlatb))
        grid.setType('uniform')
        self.assertEqual(grid.getType(), 'uniform')

        yy = numpy.ma.reshape(numpy.ma.arange(272.0), tv.shape)
        tv.assignValue(yy)
        self.assertFalse(not numpy.ma.allequal(tv, yy))
        tv3 = tv[0:-1]
        self.assertEqual(tv3.shape, (1, 8, 17))

        # Create a transient variable from scratch
        oldlat = tv.getLatitude()
        oldBounds = oldlat.getBounds()
        newlat = cdms2.createAxis(numpy.ma.array(oldlat[:]),
                                  numpy.ma.array(oldBounds))
        b = newlat.getBounds()
        b[0, 0] = -48.
        newlat.setBounds(b)

        tv4 = cdms2.createVariable(tv[:], copy=1, fill_value=255.)
        tv4[0, 1:4] = 20.0

        self.assertEqual(tv[:, ::-1, :].shape, tv.shape)

        # Test asVariable
        www = cdms2.asVariable(tv4)
        self.assertFalse(www is not tv4)
        www = cdms2.asVariable(v, 0)
        self.assertFalse(www is not v)
        www = cdms2.asVariable([1., 2., 3.])
        self.assertFalse(not cdms2.isVariable(www))

        # Check that createAxis allows an axis as an argument
        lon = f.axes['longitude']
        newlon = cdms2.createAxis(lon)
        self.assertFalse(newlon.typecode() == 'O')

        # Test take of axis without bounds
        newlat.setBounds(None)
        samp = cdms2.axis.take(newlat, (2, 4, 6))
Example #15
0
levout = cdms2.createAxis(levsout, id='level')
dat = numpy.zeros((3, 16, 32), numpy.float32)
dat2 = numpy.zeros((2, 16, 32), numpy.float32)
dat[0] = 2.0
dat[1] = 4.0
dat[2] = 6.0
var = cdms2.createVariable(dat,
                           axes=(lev, g),
                           attributes={'units': 'N/A'},
                           id='test')
result = var.pressureRegrid(levout)

if (abs(result[0, 0, 0] - 3.26185) > 1.e-4):
    markError('regrid pressure', result[0, 0, 0])
# Test cross-section regridder --------------------------------
latin = cdms2.createGaussianAxis(16)
latout = cdms2.createGaussianAxis(24)
levsin = numpy.array([1.0, 3.0, 5.0])
lev = cdms2.createAxis(levsin, id='level')
levsout = numpy.array([2.0, 4.0])
levout = cdms2.createAxis(levsout, id='level')
dat = numpy.zeros((3, 16), numpy.float32)
dat[0] = 2.0
dat[1] = 4.0
dat[2] = 6.0
var = cdms2.createVariable(dat,
                           axes=(lev, latin),
                           attributes={'units': 'N/A'},
                           id='test')
dat2 = var.crossSectionRegrid(levout, latout)
if (abs(dat2[0, 0] - 3.26185) > 1.e-4):
Example #16
0
    sq = (d1 - d2) * (d1 - d2)
    error = numpy.sum(sq) / len(d1)
    rmserror = numpy.sqrt(error)

    return rmserror


if __name__ == '__main__':
    import math

    latIn = cdms2.createUniformLatitudeAxis(90.0, 46, -4.0)
    levList = [10., 40., 75., 100., 150., 250., 350., 500., 650., 850.,
               1000.]  # pick some levels
    levIn = cdms2.createAxis(numpy.array(levList, numpy.float64), id='level')
    latOut = cdms2.createGaussianAxis(64)
    levList = [
        10., 30., 50., 70., 100., 200., 300., 400., 500., 700., 850., 1000.
    ]  # pick some levels
    levOut = cdms2.createAxis(numpy.array(levList, numpy.float64), id='level')

    xregridf = CrossSectionRegridder(latIn, latOut, levIn, levOut)

    # make some artificial data
    dataIn = section(latIn[:], levIn[:])
    var = cdms2.createVariable(dataIn,
                               axes=(levIn, latIn),
                               attributes={'units': 'N/A'},
                               id='test')

    dataOut = xregridf(dataIn)
Example #17
0
saxis = axis2.subAxis(1, -1)
if not numpy.ma.allequal(saxis[:], axis2[1:-1]): markError('subAxis', saxis[:])
if axis1.typecode() != numpy.sctype2char(numpy.float):
    markError('Axis typecode')
if axis2.shape != (17, ): markError('Axis shape')

# Axis set: bounds, calendar
savebounds = copy.copy(bounds)
bounds[0, 0] = -90.0
axis1.setBounds(bounds)
nbounds = axis1.getBounds()
if not numpy.ma.allequal(bounds, nbounds): markError('Axis setBounds')
axis0.setCalendar(cdtime.NoLeapCalendar)
if axis0.getCalendar() != cdtime.NoLeapCalendar: markError('setCalendar')
gaussaxis = cdms2.createGaussianAxis(32)
try:
    testaxis = cdms2.createGaussianAxis(31)
except:
    markError('Gaussian axis with odd number of latitudes')

# Grid get: axis, bounds, latitude, longitude, mask, order, type, weights, subgrid, subgridRegion
a1 = grid.getAxis(1)
if not numpy.ma.allequal(a1[:], axis2[:]): markError('Grid getAxis')

bounds[0, 0] = savebounds[0, 0]
axis1.setBounds(bounds)
latbounds, lonbounds = grid.getBounds()
if not numpy.ma.allequal(latbounds, savebounds): markError('Grid getBounds')
glat = grid.getLatitude()
glon = grid.getLongitude()
Example #18
0
if len(axis2)!=17: markError('Axis length')

saxis = axis2.subAxis(1,-1)
if not numpy.ma.allequal(saxis[:],axis2[1:-1]): markError('subAxis',saxis[:])
if axis1.typecode()!=numpy.sctype2char(numpy.float): markError('Axis typecode')
if axis2.shape!=(17,): markError('Axis shape')

# Axis set: bounds, calendar
savebounds = copy.copy(bounds)
bounds[0,0]=-90.0
axis1.setBounds(bounds)
nbounds = axis1.getBounds()
if not numpy.ma.allequal(bounds,nbounds): markError('Axis setBounds')
axis0.setCalendar(cdtime.NoLeapCalendar)
if axis0.getCalendar()!=cdtime.NoLeapCalendar: markError('setCalendar')
gaussaxis = cdms2.createGaussianAxis(32)
try:
    testaxis = cdms2.createGaussianAxis(31)
except:
    markError('Gaussian axis with odd number of latitudes')

# Grid get: axis, bounds, latitude, longitude, mask, order, type, weights, subgrid, subgridRegion
a1 = grid.getAxis(1)
if not numpy.ma.allequal(a1[:],axis2[:]): markError('Grid getAxis')

bounds[0,0]=savebounds[0,0]
axis1.setBounds(bounds)
latbounds,lonbounds = grid.getBounds()
if not numpy.ma.allequal(latbounds,savebounds): markError('Grid getBounds')
glat = grid.getLatitude()
glon = grid.getLongitude()
Example #19
0
    def testRegrid2(self):
        outgrid = cdms2.createGaussianGrid(32)

        pth = os.path.dirname(os.path.abspath(__file__))
        f = self.getDataFile('readonly.nc')
        u = f.variables['u']
        ingrid = u.getGrid()

        sh = ingrid.shape

        regridf = Horizontal(ingrid, outgrid)
        newu = regridf(u)

        self.assertLess(abs(newu[0, 0, -1] - 488.4763488), 1.e-3)
        newu = u.regrid(outgrid, regridTool='regrid2')
        self.assertLess(abs(newu[0, 0, -1] - 488.4763488), 1.e-3)

        # Regrid TV
        tv = u.subSlice(0)
        newtv = regridf(tv)
        self.assertLess(abs(newtv[0, 0, -1] - 488.4763488), 1.e-3)
        newtv = tv.regrid(outgrid, regridTool='regrid2')
        self.assertLess(abs(newtv[0, 0, -1] - 488.4763488), 1.e-3)

        # Regrid numpy.ma
        ma = u[0]
        newma = regridf(ma)
        # Force slice result to be a scalar
        self.assertLess(abs(newma[0][-1] - 488.4763488), 1.e-3)

        # Regrid numpy
        numar = numpy.ma.filled(u[0])
        newar = regridf(numar)
        self.assertLess(abs(newar[0][-1] - 488.4763488), 1.e-3)

        # Regrid masked Variable
        umasked = f.variables['umasked']
        newum = regridf(umasked)
        self.assertLess(abs(newum[0, 0, -1] - 488.4763488), 1.e-3)

        # Set explicit missing variable
        numar = numpy.ma.filled(umasked[0])
        newar = regridf(numar, missing=-99.9)
        self.assertLess(abs(newar[0][-1] - 488.4763488), 1.e-3)

        # Set explicit mask
        mask = umasked.subRegion().mask[0]
        newar = regridf(numar, mask=mask)
        self.assertLess(abs(newar[0][-1] - 488.4763488), 1.e-3)

        # Set the input grid mask
        ingrid.setMask(mask)
        regridf2 = Horizontal(ingrid, outgrid)
        newar = regridf2(numar)
        self.assertLess(abs(newar[0][-1] - 488.4763488), 1.e-3)

        # Dataset
        g = self.getDataFile('test.xml')
        u = g.variables['u']
        outgrid = cdms2.createGaussianGrid(24)
        regridf3 = Horizontal(u.getGrid(), outgrid)
        try:
            unew = regridf3(u)
        except BaseException:
            markError('regrid dataset variable')

        lon2 = numpy.ma.array([
            90.,
            101.25,
            112.5,
            123.75,
            135.,
            146.25,
            157.5,
            168.75,
            180.,
            191.25,
            202.5,
            213.75,
            225.,
            236.25,
            247.5,
            258.75,
        ])
        lat2 = numpy.ma.array([
            -42.,
            -30.,
            -18.,
            -6.,
            6.,
            18.,
            30.,
            42.,
        ])
        grid2 = cdms2.createGenericGrid(lat2, lon2)
        b1, b2 = grid2.getBounds()
        grid2.setBounds(b1, b2)
        latw, lonw = grid2.getWeights()

        g = cdms2.createGaussianGrid(16)
        levs = numpy.array([1.0, 3.0, 5.0])
        lev = cdms2.createAxis(levs, id='level')
        levsout = numpy.array([2.0, 4.0])
        levout = cdms2.createAxis(levsout, id='level')
        dat = numpy.zeros((3, 16, 32), numpy.float32)
        dat2 = numpy.zeros((2, 16, 32), numpy.float32)
        dat[0] = 2.0
        dat[1] = 4.0
        dat[2] = 6.0
        var = cdms2.createVariable(dat,
                                   axes=(lev, g),
                                   attributes={'units': 'N/A'},
                                   id='test')
        result = var.pressureRegrid(levout)

        self.assertLess(abs(result[0, 0, 0] - 3.26185), 1.e-4)
        # Test cross-section regridder --------------------------------
        latin = cdms2.createGaussianAxis(16)
        latout = cdms2.createGaussianAxis(24)
        levsin = numpy.array([1.0, 3.0, 5.0])
        lev = cdms2.createAxis(levsin, id='level')
        levsout = numpy.array([2.0, 4.0])
        levout = cdms2.createAxis(levsout, id='level')
        dat = numpy.zeros((3, 16), numpy.float32)
        dat[0] = 2.0
        dat[1] = 4.0
        dat[2] = 6.0
        var = cdms2.createVariable(dat,
                                   axes=(lev, latin),
                                   attributes={'units': 'N/A'},
                                   id='test')
        dat2 = var.crossSectionRegrid(levout, latout)
        self.assertLess(abs(dat2[0, 0] - 3.26185), 1.e-4)
Example #20
0
g = cdms2.createGaussianGrid(16)
levs = numpy.array([1.0,3.0,5.0])
lev = cdms2.createAxis(levs, id='level')
levsout = numpy.array([2.0,4.0])
levout = cdms2.createAxis(levsout, id='level')
dat = numpy.zeros((3,16,32), numpy.float32)
dat2 = numpy.zeros((2,16,32), numpy.float32)
dat[0] = 2.0
dat[1] = 4.0
dat[2] = 6.0
var = cdms2.createVariable(dat, axes=(lev,g), attributes={'units':'N/A'}, id='test')
result = var.pressureRegrid(levout)

if (abs(result[0,0,0]-3.26185) > 1.e-4): markError('regrid pressure',result[0,0,0])
# Test cross-section regridder --------------------------------
latin = cdms2.createGaussianAxis(16)
latout = cdms2.createGaussianAxis(24)
levsin = numpy.array([1.0,3.0,5.0])
lev = cdms2.createAxis(levsin, id='level')
levsout = numpy.array([2.0,4.0])
levout = cdms2.createAxis(levsout, id='level')
dat = numpy.zeros((3,16), numpy.float32)
dat[0] = 2.0
dat[1] = 4.0
dat[2] = 6.0
var = cdms2.createVariable(dat, axes=(lev,latin), attributes={'units':'N/A'}, id='test')
dat2 = var.crossSectionRegrid(levout, latout)
if (abs(dat2[0,0]-3.26185) > 1.e-4): markError('regrid cross-section',result[0,0,0])

reportError()
Example #21
0
    d1 = numpy.ravel(data1)
    d2 = numpy.ravel(data2)

    sq = (d1 - d2)*(d1 - d2)
    error = numpy.sum(sq)/len(d1)
    rmserror =  numpy.sqrt(error)

    return  rmserror

if __name__=='__main__':
    import cdms2, math

    latIn = cdms2.createUniformLatitudeAxis(90.0, 46, -4.0)
    levList = [10., 40., 75., 100., 150., 250., 350.,   500., 650.,  850., 1000.]                  # pick some levels
    levIn = cdms2.createAxis(numpy.array(levList, numpy.float64), id='level')
    latOut = cdms2.createGaussianAxis(64)
    levList = [10., 30., 50., 70., 100., 200., 300., 400., 500., 700.,850., 1000.]         # pick some levels
    levOut = cdms2.createAxis(numpy.array(levList, numpy.float64), id='level')

    xregridf = CrossSectionRegridder(latIn, latOut, levIn, levOut)

    dataIn = section(latIn[:], levIn[:])                                              # make some artificial data
    var = cdms2.createVariable(dataIn, axes=(levIn, latIn), attributes={'units':'N/A'}, id='test')

    dataOut = xregridf(dataIn)

    dataCheck = section(latOut[:], levOut[:])                                         # make the exact answer
    error = rmserror(dataOut, dataCheck)                                        # find the rms error

    print 'expected cross section test case rms error =  0.18581882'
    # print 'expected cross section test case rms error =  0.23062'