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)
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
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
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())
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())
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())
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())
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())
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())
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())
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())
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
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))
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):
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)
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()
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()
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)
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()
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'