示例#1
0
    def test_non_overlapping_bbox(self):
        EPSG, bbox = self.wrf_epsg_bbox
        bbox = list(bbox)
        bbox[0] = [-100000.0, -90000.0, -90000.0, -100000]
        # Period start

        year = 1999
        month = 10
        n_hours = 30
        date_str = "{}-{:02}".format(year, month)
        utc = api.Calendar()  # No offset gives Utc
        t0 = api.YMDhms(year, month)
        period = api.UtcPeriod(utc.time(t0),
                               utc.time(t0) + api.deltahours(n_hours))

        base_dir = path.join(shyftdata_dir, "repository",
                             "wrf_data_repository")
        filename = "wrfout_d03_{}".format(date_str)
        reader = WRFDataRepository(EPSG,
                                   base_dir,
                                   filename=filename,
                                   bounding_box=bbox)
        data_names = ("temperature", "wind_speed", "precipitation",
                      "relative_humidity")
        with self.assertRaises(WRFDataRepositoryError) as context:
            reader.get_timeseries(data_names, period, None)
        self.assertEqual("Bounding box doesn't intersect with dataset.",
                         context.exception.args[0])
示例#2
0
    def test_rel_hum_only(self):

        print("rel hum test: ")
        # relative humidity needs temperature and pressure to be calculated
        EPSG, bbox = self.wrf_epsg_bbox
        # Period start
        year = 1999
        month = 10
        n_hours = 30
        date_str = "{}-{:02}".format(year, month)
        utc = api.Calendar()  # No offset gives Utc
        t0 = api.YMDhms(year, month)
        period = api.UtcPeriod(utc.time(t0),
                               utc.time(t0) + api.deltahours(n_hours))

        base_dir = path.join(shyftdata_dir, "repository",
                             "wrf_data_repository")
        filename = "wrfout_d03_{}".format(date_str)

        data_names = ["relative_humidity"]
        reader = WRFDataRepository(EPSG,
                                   base_dir,
                                   filename=filename,
                                   bounding_box=bbox)
        sources = reader.get_timeseries(data_names, period, None)

        self.assertTrue(list(sources.keys()) == ["relative_humidity"])
示例#3
0
    def test_utc_period_is_None(self):
        EPSG, bbox, bpoly = self.wrf_epsg_bbox
        # Period start
        utc = api.Calendar()  # No offset gives Utc
        t0 = utc.time(1999, 10)
        t0_ymdhs = utc.calendar_units(t0)
        date_str = "{}-{:02}".format(
            *[getattr(t0_ymdhs, k) for k in ['year', 'month']])
        period = None

        base_dir = path.join(shyftdata_dir, "repository",
                             "wrf_data_repository")
        filename = "wrfout_d03_{}".format(date_str)
        reader = WRFDataRepository(EPSG, base_dir, filename=filename)
        src_name = "temperature"
        var_name_in_file = [
            k for k, v in reader.wrf_shyft_map.items() if v == src_name
        ][0]
        with Dataset(path.join(base_dir, filename)) as ds:
            var = ds.variables[var_name_in_file]
            nb_timesteps = var.shape[var.dimensions.index('Time')]
        srcs = reader.get_timeseries((src_name, ),
                                     period,
                                     geo_location_criteria=bpoly)
        self.assertEqual(srcs[src_name][0].ts.size(), nb_timesteps)
示例#4
0
 def test_wrong_file(self):
     with self.assertRaises(WRFDataRepositoryError) as context:
         utc = api.Calendar()  # No offset gives Utc
         t0 = api.YMDhms(2015, 12, 25, 18)
         period = api.UtcPeriod(utc.time(t0),
                                utc.time(t0) + api.deltahours(30))
         ar1 = WRFDataRepository(32632,
                                 shyftdata_dir,
                                 filename="plain_wrong.nc")
         ar1.get_timeseries(("temperature", ), period, None)
     self.assertTrue(
         all(x in context.exception.args[0] for x in ["File", "not found"]))
示例#5
0
    def test_missing_bbox(self):
        EPSG, _ = self.wrf_epsg_bbox
        # Period start
        year = 1999
        month = 10
        n_hours = 30
        date_str = "{}-{:02}".format(year, month)
        utc = api.Calendar()  # No offset gives Utc
        t0 = api.YMDhms(year, month)
        period = api.UtcPeriod(utc.time(t0),
                               utc.time(t0) + api.deltahours(n_hours))

        base_dir = path.join(shyftdata_dir, "repository",
                             "wrf_data_repository")
        filename = "wrfout_d03_{}".format(date_str)
        reader = WRFDataRepository(EPSG, base_dir, filename=filename)
        data_names = ("temperature", "wind_speed", "precipitation",
                      "relative_humidity")
        with self.assertRaises(WRFDataRepositoryError) as context:
            reader.get_timeseries(data_names, period, None)
        self.assertEqual("A bounding box must be provided.",
                         context.exception.args[0])
示例#6
0
    def test_tiny_bbox(self):
        EPSG, _ = self.wrf_epsg_bbox
        x0 = 726270.0  # lower left
        y0 = 3525350.0  # lower right
        nx = 1
        ny = 1
        dx = 1.0
        dy = 1.0
        bbox = ([x0, x0 + nx * dx, x0 + nx * dx,
                 x0], [y0, y0, y0 + ny * dy, y0 + ny * dy])
        print(bbox)

        # Period start
        year = 1999
        month = 10
        n_hours = 30
        date_str = "{}-{:02}".format(year, month)
        utc = api.Calendar()  # No offset gives Utc
        t0 = api.YMDhms(year, month)
        period = api.UtcPeriod(utc.time(t0),
                               utc.time(t0) + api.deltahours(n_hours))

        base_dir = path.join(shyftdata_dir, "repository",
                             "wrf_data_repository")
        filename = "wrfout_d03_{}".format(date_str)
        reader = WRFDataRepository(EPSG,
                                   base_dir,
                                   filename=filename,
                                   bounding_box=bbox,
                                   x_padding=0,
                                   y_padding=0)
        data_names = ("temperature", "wind_speed", "precipitation",
                      "relative_humidity")

        tss = reader.get_timeseries(data_names, period, None)

        for name, ts in tss.items():
            self.assertTrue(len(ts) == 1)
示例#7
0
    def test_subsets(self):
        EPSG, bbox, bpoly = self.wrf_epsg_bbox
        # Period start
        year = 1999
        month = 10
        n_hours = 30
        date_str = "{}-{:02}".format(year, month)
        utc = api.Calendar()  # No offset gives Utc
        t0 = api.YMDhms(year, month)
        period = api.UtcPeriod(utc.time(t0),
                               utc.time(t0) + api.deltahours(n_hours))

        base_dir = path.join(shyftdata_dir, "repository",
                             "wrf_data_repository")
        filename = "wrfout_d03_{}".format(date_str)

        data_names = ("temperature", "wind_speed", "precipitation",
                      "relative_humidity", "radiation", "foo")
        allow_subset = False
        reader = WRFDataRepository(EPSG,
                                   base_dir,
                                   filename=filename,
                                   allow_subset=allow_subset)
        with self.assertRaises(WRFDataRepositoryError) as context:
            reader.get_timeseries(data_names,
                                  period,
                                  geo_location_criteria=bpoly)
        self.assertEqual("Could not find all data fields",
                         context.exception.args[0])
        allow_subset = True
        reader = WRFDataRepository(EPSG,
                                   base_dir,
                                   filename=filename,
                                   allow_subset=allow_subset)
        try:
            sources = reader.get_timeseries(data_names,
                                            period,
                                            geo_location_criteria=bpoly)
        except WRFDataRepositoryError as e:
            self.fail(
                "AromeDataRepository.get_timeseries(data_names, period, None) "
                "raised AromeDataRepositoryError unexpectedly.")
        self.assertEqual(len(sources), len(data_names) - 1)
示例#8
0
    def test_get_timeseries(self):
        """
        Simple regression test of WRF data repository.
        """
        EPSG, bbox = self.wrf_epsg_bbox

        # Period start
        n_hours = 60
        t0 = api.YMDhms(1999, 10)
        date_str = "{}-{:02}".format(t0.year, t0.month)
        utc = api.Calendar()  # No offset gives Utc
        period = api.UtcPeriod(utc.time(t0),
                               utc.time(t0) + api.deltahours(n_hours))

        base_dir = path.join(shyftdata_dir, "repository",
                             "wrf_data_repository")
        f1 = "wrfout_d03_{}".format(date_str)

        wrf1 = WRFDataRepository(EPSG,
                                 base_dir,
                                 filename=f1,
                                 bounding_box=bbox,
                                 allow_subset=True)
        wrf1_data_names = ("temperature", "wind_speed", "precipitation",
                           "relative_humidity", "radiation")
        sources = wrf1.get_timeseries(wrf1_data_names, period, None)
        self.assertTrue(len(sources) > 0)

        self.assertTrue(set(sources) == set(wrf1_data_names))
        self.assertTrue(sources["temperature"][0].ts.size() == n_hours + 1)
        r0 = sources["radiation"][0].ts
        p0 = sources["precipitation"][0].ts
        temp0 = sources["temperature"][0].ts
        self.assertTrue(r0.size() == n_hours + 1)
        self.assertTrue(p0.size() == n_hours + 1)
        self.assertTrue(r0.time(0) == temp0.time(0))
        self.assertTrue(p0.time(0) == temp0.time(0))
        self.assertTrue(r0.time(r0.size() - 1) == temp0.time(temp0.size() - 1))
        self.assertTrue(p0.time(r0.size() - 1) == temp0.time(temp0.size() - 1))
        self.assertTrue(p0.time(0), period.start)

        # Number test:
        # asserting shyft-sources time series are same as time series of corresponding location in wrf dataset.
        dset = Dataset(path.join(base_dir, f1))
        lat = dset.variables["XLAT"]
        lon = dset.variables["XLONG"]

        wrf_data = {}

        wrf_data["temperature"] = dset.variables["T2"][:]
        wrf_data["precipitation"] = dset.variables["PREC_ACC_NC"][:]
        wrf_data["radiation"] = dset.variables["SWDOWN"][:]
        pressure = dset.variables["PSFC"][:]
        mixing_ratio = dset.variables["Q2"][:]
        wrf_data["relative_humidity"] = wrf1._calculate_rel_hum(
            wrf_data["temperature"], pressure, mixing_ratio)
        wrf_data["temperature"] -= 273.16

        data_cs = "latlong"
        target_cs = "+init=EPSG:32643"
        data_proj = Proj(proj=data_cs)
        target_proj = Proj(target_cs)
        x, y = transform(data_proj, target_proj, lon[0, :, :], lat[0, :, :])

        for name, wrf_d in wrf_data.items():
            srs = sources[name]
            for i, s in enumerate(srs):
                mp = s.mid_point()
                x_ts, y_ts, z_ts = mp.x, mp.y, mp.z
                ts = s.ts
                ts_values = ts.v.to_numpy()

                # find indixes in wrf-dataset
                m = (x == x_ts) & (y == y_ts)
                idxs = np.where(m > 0)
                x_idx, y_idx = idxs[0][0], idxs[1][
                    0]  # assumung geo-location is unique in dataset
                self.assertTrue(
                    all(ts_values == wrf_d[:n_hours + 1, x_idx, y_idx]),
                    "wrf and shyft-TS of {} are not the same.".format(name))
示例#9
0
 def test_wrong_directory(self):
     with self.assertRaises(WRFDataRepositoryError) as context:
         WRFDataRepository(32632, "Foobar", filename="")
     self.assertEqual("No such directory 'Foobar'",
                      context.exception.args[0])