def test_grid_from_inner(self): fileNameInner = os.path.join(test_srcdir, "test_merge_inner.nc") fileNameOuter = os.path.join(test_srcdir, "test_merge_outer.nc") readerI = pyfi.createFileReader("", fileNameInner) readerO = pyfi.createFileReader("", fileNameOuter) merger = pyfi.createMerger(readerI, readerO) merger.setSmoothing("LINEAR(2,5)") merger.setTargetGridFromInner() sliceM = merger.getDataSlice("ga_2t_1", 0) self.assertTrue(sliceM is not None)
def test_scaled(self): test_rwfile = 'test_scaled.nc' shutil.copyfile(os.path.join(test_srcdir, 'test_merge_inner.nc'), test_rwfile) addF = 1.0 addK = addF * 5.0 / 9.0 rw = pyfimex0.createFileReaderWriter('netcdf', test_rwfile) self.assertIsNotNone(rw) read1 = rw.getScaledDataSlice("ga_2t_1", 0) self.assertIsNotNone(read1) write1 = rw.getScaledDataSliceInUnit("ga_2t_1", "deg_F", 0) self.assertIsNotNone(write1) wmod1 = pyfimex0.createData(pyfimex0.CDMDataType.DOUBLE, [x + addF for x in write1.values()]) rw.putScaledDataSliceInUnit("ga_2t_1", "deg_F", 0, wmod1) del rw # read back and compare r = pyfimex0.createFileReader('netcdf', test_rwfile) self.assertIsNotNone(r) read2 = r.getScaledDataSlice("ga_2t_1", 0) self.assertIsNotNone(read2) values1 = read1.values() values2 = read2.values() self.assertEqual(len(values1), len(values2)) for i, (v1, v2), in enumerate(zip(values1, values2)): self.assertAlmostEqual(v1 + addK, v2, msg="at index {}".format(i))
def test_update(self): test_rwfile = 'test_update.nc' shutil.copyfile(os.path.join(test_srcdir, 'test_merge_inner.nc'), test_rwfile) diff = 10.0 scale = 1.2 rw = pyfimex0.createFileReaderWriter('netcdf', test_rwfile) self.assertIsNotNone(rw) read1 = rw.getDataSlice("ga_2t_1", 0) self.assertIsNotNone(read1) write1 = pyfimex0.createData( pyfimex0.CDMDataType.DOUBLE, [diff + x * scale for x in read1.values()]) rw.putDataSlice("ga_2t_1", 0, write1) del rw r = pyfimex0.createFileReader('netcdf', test_rwfile) self.assertIsNotNone(r) read2 = r.getScaledDataSlice("ga_2t_1", 0) self.assertIsNotNone(read2) values1 = read1.values() values2 = read2.values() self.assertEqual(len(values1), len(values2)) for i, (v1, v2), in enumerate(zip(values1, values2)): self.assertAlmostEqual(diff + v1 * scale, v2, msg="at index {}".format(i))
def loadFile(self): if (DEBUG): self.printTime("Loading file " + self.filename) self.minutesOfTheHour = [0] self.undef = 9.969209968386869e+36 self.reader = pyfimex0.createFileReader('nc', self.filename) self.interpolator = pyfimex0.createInterpolator(self.reader) self.filetime = self.getFileTime(self.filename)
def test_reduceLatLonBoundingBox(self): test_ncfile = os.path.join(test_srcdir, 'erai.sfc.40N.0.75d.200301011200.nc') r = pyfimex0.createFileReader('netcdf', test_ncfile) extra = pyfimex0.createExtractor(r) extra.reduceLatLonBoundingBox(59, 60, 9, 11) del extra del r
def test_writeExtracted(self): test_ncfile = os.path.join(test_srcdir, 'testdata_vertical_ensemble_in.nc') r1 = pyfimex0.createFileReader('netcdf', test_ncfile) v_x_wind = 'x_wind_10m' r1v_x_wind = r1.getDataSlice(v_x_wind, 0).values() extra = pyfimex0.createExtractor(r1) extra.selectVariables([v_x_wind]) outfile = "extracted_wind_x.nc" pyfimex0.createFileWriter(extra, 'netcdf', outfile) del extra del r1 r2 = pyfimex0.createFileReader('netcdf', outfile) r2v_x_wind = r2.getDataSlice(v_x_wind, 0).values() for v1, v2 in zip(r1v_x_wind, r2v_x_wind): self.assertEqual(v1, v2)
def test_Variable(self): test_ncfile = os.path.join(test_srcdir, 'testdata_vertical_ensemble_in.nc') r = pyfimex0.createFileReader('netcdf', test_ncfile) r_cdm = r.getCDM() v_xwind10m = r_cdm.getVariable('x_wind_10m') v_xwind10m_name = v_xwind10m.getName() self.assertEqual('x_wind_10m', v_xwind10m_name) self.assertEqual(['x', 'y', 'ensemble_member', 'height7', 'time'], v_xwind10m.getShape())
def test_reduceTimeIso8601(self): test_ncfile = os.path.join(test_srcdir, 'erai.sfc.40N.0.75d.200301011200.nc') r = pyfimex0.createFileReader('netcdf', test_ncfile) extra = pyfimex0.createExtractor(r) extra.reduceTimeStartEnd('2017-05-22T06:00:00', '2017-05-22T07:00:00') with self.assertRaises(Exception): extra.reduceTimeStartEnd('ooops', '2017-05-22T07:00:00') del extra del r
def test_reduceDimension(self): test_ncfile = os.path.join(test_srcdir, 'testdata_vertical_ensemble_in.nc') r = pyfimex0.createFileReader('netcdf', test_ncfile) extra = pyfimex0.createExtractor(r) extra.reduceDimension('x', [0, 1, 3]) extra.reduceDimension('y', 1, 2) e_cdm = extra.getCDM() self.assertEqual(3, e_cdm.getDimension('x').getLength()) self.assertEqual(2, e_cdm.getDimension('y').getLength()) del extra del r
def test_Attributes(self): test_ncfile = os.path.join(test_srcdir, 'testdata_vertical_ensemble_in.nc') r = pyfimex0.createFileReader('netcdf', test_ncfile) r_cdm = r.getCDM() self.assertTrue('long_name' in r_cdm.getAttributeNames('x_wind_10m')) r_att = r_cdm.getAttribute('x_wind_10m', 'long_name') self.assertEqual("Zonal 10 metre wind (U10M)", r_att.getStringValue()) self.assertTrue('title' in r_cdm.getGlobalAttributeNames()) r_gatt = r_cdm.getGlobalAttribute('title') self.assertEqual("MEPS 2.5km", r_gatt.getStringValue())
def test_selectVariables(self): test_ncfile = os.path.join(test_srcdir, 'erai.sfc.40N.0.75d.200301011200.nc') r = pyfimex0.createFileReader('netcdf', test_ncfile) extra = pyfimex0.createExtractor(r) extra.selectVariables(['x_wind_10m', 'x_wind_10m']) e_cdm = extra.getCDM() e_vars = e_cdm.getVariableNames() self.assertTrue('specific_humidity_ml' not in e_vars) del extra del r
def test_removeVariable(self): test_ncfile = os.path.join(test_srcdir, 'erai.sfc.40N.0.75d.200301011200.nc') r = pyfimex0.createFileReader('netcdf', test_ncfile) self.assertTrue('ga_skt' in r.getCDM().getVariableNames()) extra = pyfimex0.createExtractor(r) extra.removeVariable('ga_skt') self.assertTrue('ga_skt' not in extra.getCDM().getVariableNames()) del extra del r
def test_Proj4(self): test_ncfile = os.path.join(test_srcdir, 'erai.sfc.40N.0.75d.200301011200.nc') r = pyfimex0.createFileReader('netcdf', test_ncfile) inter_ll = pyfimex0.createInterpolator(r) inter_ll.changeProjection( pyfimex0.InterpolationMethod.BILINEAR, "+proj=utm +zone=32 +datum=WGS84 +no_defs", range(250000, 280000, 10000), # 3 x-axis values range(6630000, 6680000, 10000), # 6 y-axis values "m", # x-axis unit "m" # y-axis unit ) values = inter_ll.getDataSlice('ga_skt', 0).values() for v in values: self.assertTrue((v < 281.1) and (v > 266))
def test_listCoordinateSystems(self): test_ncfile = os.path.join(test_srcdir, 'testdata_vertical_ensemble_in.nc') r = pyfimex0.createFileReader('netcdf', test_ncfile) cs = pyfimex0.listCoordinateSystems(r) self.assertEqual(len(cs), 6) cs_var = pyfimex0.findCompleteCoordinateSystemFor(cs, 'x_wind_10m') self.assertEqual( cs_var.id(), 'CF-1.X:ensemble_member,height7,latitude,longitude,time,x,y') cax1 = cs_var.findAxisOfType(pyfimex0.CoordinateAxisType.GeoX) self.assertEqual(cax1.getName(), 'x') cax2 = cs_var.findAxisOfType([ pyfimex0.CoordinateAxisType.GeoX, pyfimex0.CoordinateAxisType.Lon ]) self.assertEqual(cax2.getName(), 'x')
def test_LonLatPoints(self): test_ncfile = os.path.join(test_srcdir, 'erai.sfc.40N.0.75d.200301011200.nc') r = pyfimex0.createFileReader('netcdf', test_ncfile) inter_ll = pyfimex0.createInterpolator(r) lats = [ 59.109, 59.052, 58.994, 58.934, 58.874, 58.812, 58.749, 58.685, 58.62, 64. ] lons = [ 4.965, 5.13, 5.296, 5.465, 5.637, 5.81, 5.986, 6.164001, 6.344, 3. ] inter_ll.changeProjection(pyfimex0.InterpolationMethod.BILINEAR, lons, lats) i_cdm = inter_ll.getCDM() self.assertEqual(len(lons), i_cdm.getDimension('x').getLength()) self.assertEqual(1, i_cdm.getDimension('y').getLength()) for v in inter_ll.getDataSlice('ga_skt', 0).values(): self.assertTrue((v < 281.1) and (v > 266))
def test_OpenAndInspect(self): test_ncfile = os.path.join(test_srcdir, 'testdata_vertical_ensemble_in.nc') r = pyfimex0.createFileReader('netcdf', test_ncfile) self.assertTrue( type(r.getDataSlice('hybrid', 0).values()[0]) is numpy.float64) self.assertEqual( r.getDataSlice('upward_air_velocity_ml', 0).values()[0], 305) self.assertAlmostEqual( r.getScaledDataSlice('upward_air_velocity_ml', 0).values()[0], 0.0305) self.assertAlmostEqual( r.getScaledDataSliceInUnit('upward_air_velocity_ml', 'mm/s', 0).values()[0], 30.5) self.assertTrue( numpy.isnan( r.getScaledDataSlice('upward_air_velocity_ml', 1).values()[-1])) r_cdm = r.getCDM() d_ens = r_cdm.getDimension('ensemble_member') d_ens_len = d_ens.getLength() self.assertEqual(3, d_ens_len) self.assertFalse(d_ens.isUnlimited()) d_time = r_cdm.getDimension('time') self.assertTrue(d_time.isUnlimited()) r_dims = r_cdm.getDimensionNames() self.assertTrue('time' in r_dims) r_vars = r_cdm.getVariableNames() self.assertTrue('surface_geopotential' in r_vars)
def __init__(self, inputFile, outputFile, inputType=None, reduceTimeStart=None, reduceTimeEnd=None, reduceBBNorth=None, reduceBBEast=None, reduceBBSouth=None, reduceBBWest=None, selectVariables=None, interpolateXAxisUnit=None, interpolateYAxisUnit=None, interpolateMethod=None, interpolateProjString=None, interpolateXAxisValues=None, interpolateYAxisValues=None, outputType=None): self.inputFile = inputFile self.outputFile = outputFile self.inputType = inputType self.reduceTimeStart = reduceTimeStart self.reduceTimeEnd = reduceTimeEnd self.reduceBBNorth = reduceBBNorth self.reduceBBEast = reduceBBEast self.reduceBBSouth = reduceBBSouth self.reduceBBWest = reduceBBWest self.selectVariables = selectVariables self.interpolateXAxisUnit = interpolateXAxisUnit self.interpolateYAxisUnit = interpolateYAxisUnit self.interpolateMethod = interpolateMethod self.interpolateProjString = interpolateProjString self.interpolateXAxisValues = interpolateXAxisValues self.interpolateYAxisValues = interpolateYAxisValues self.outputType = outputType #======================================================== # Read file using pyfimex0 # NOTE: should be self.inputType instead of 'netcdf'... #======================================================== try: self.fimex_reader = pyfimex0.createFileReader( 'netcdf', self.inputFile) print("\nStart manipulating file") except: print("\nCould not open file in fimex_reader. Hence terminating") sys.exit([1]) #======================================================== # Extract values using pyfimex0 by means of reducing # dimension(s) and/or extraxting variables #======================================================== self.extractor = self.extractFromFile() #======================================================== # Parse the time, x, y and/or z (NOTE: z not implemented) #======================================================== cdm = self.extractor.getCDM() # get Common Data Model time_dimensions = ['time', 't'] east_dimensions = ['x', 'X', 'xc', 'xtrack', 'ncols', 'pixel'] north_dimensions = ['y', 'Y', 'yc', 'atrack', 'nrows', 'line'] for dimension in cdm.getDimensionNames(): if dimension in time_dimensions: self.time_dim = dimension elif dimension in east_dimensions: self.east_dim = dimension elif dimension in north_dimensions: self.north_dim = dimension #======================================================== # Interpolate to preferred projection #======================================================== self.interpolator = self.interpolateFile() #======================================================== # Write manipulated input file to disk #======================================================== write_ok = self.writeToFile() if write_ok: print('\nSuccessful writing of input file:' + ' %s to: %s, using %s format' % (self.inputFile, self.outputFile, self.outputType)) else: print('\nWriting of input file:' + ' %s to: %s (format: %s ), did not work.' % (self.inputFile, self.outputFile, self.outputType))