コード例 #1
0
    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)
コード例 #2
0
    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))
コード例 #3
0
    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)
コード例 #5
0
    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
コード例 #6
0
    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)
コード例 #7
0
    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())
コード例 #8
0
    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
コード例 #9
0
    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
コード例 #10
0
    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())
コード例 #11
0
    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
コード例 #12
0
    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
コード例 #13
0
    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))
コード例 #14
0
    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')
コード例 #15
0
    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))
コード例 #16
0
    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)
コード例 #17
0
    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))