コード例 #1
0
def test_Geo_frostnumber_get_datacube_slice():
    fn_geo = frost_number_Geo.FrostnumberGeoMethod()
    config_dict = \
        {'n_temperature_grid_fields': 4,
         'temperature_grid_date_0': datetime.date(1901, 01, 01),
         'temperature_grid_data_0': '((-10, -5), (-20, -15), (0, 5))',
         'temperature_grid_date_1': datetime.date(1901, 07, 01),
         'temperature_grid_data_1': '((10, 15), (0, 5), (20, 15))',
         'temperature_grid_date_2': datetime.date(1902, 01, 01),
         'temperature_grid_data_2': '((-7, -2), (-17, -12), (3, 8))',
         'temperature_grid_date_3': datetime.date(1902, 07, 01),
         'temperature_grid_data_3': '((7, 2), (17, 12), (23, 28))'}
    dates, cube = fn_geo.initialize_datacube('temperature', config_dict)

    test_date = datetime.date(1901, 2, 27)
    test_field = fn_geo.get_datacube_slice(test_date, cube, dates)
    assert_equal(test_field[0, 0], -10)
    assert_equal(test_field[1, 1], -15)

    test_date = datetime.date(1902, 3, 10)
    test_field = fn_geo.get_datacube_slice(test_date, cube, dates)
    assert_equal(test_field[1, 0], -17)
    assert_equal(test_field[2, 1], 8)

    test_date = datetime.date(1900, 3, 10)
    assert_raises(ValueError, fn_geo.get_datacube_slice, test_date, cube,
                  dates)

    test_date = datetime.date(1980, 3, 10)
    assert_raises(ValueError, fn_geo.get_datacube_slice, test_date, cube,
                  dates)
コード例 #2
0
def test_Geo_frostnumber_can_return_temperature_field():
    fn_geo = frost_number_Geo.FrostnumberGeoMethod()
    fn_geo.initialize_frostnumberGeo_component()

    current_temperature_field = fn_geo.get_temperature_field()
    assert_equal(current_temperature_field.shape, fn_geo._grid_shape)

    bad_date_field = fn_geo.get_temperature_field(datetime.date(100, 1, 1))
    assert_true(np.all(np.isnan(bad_date_field)))

    fn_geo.finalize_frostnumber_Geo()
コード例 #3
0
def test_Geo_frostnumber_compute_array_of_degree_days():
    fn_geo = frost_number_Geo.FrostnumberGeoMethod()
    fn_geo.initialize_frostnumberGeo_component()

    if fn_geo._using_WMT:
        print("Can't test WMT in standalone mode")
        return
    elif not (fn_geo._using_Files or fn_geo._using_ConfigVals):
        raise ValueError("Frostnumber must use either Files, ConfigVals, \
                         or WMT to get input variables")

    # Test that we get NaN-filled arrays when no input vars available
    fn_geo.set_current_date_and_timestep_with_timestep(-100)
    fn_geo.get_input_vars()
    assert_less(fn_geo._date_current, fn_geo._temperature_first_date)
    if fn_geo._dd_method == 'MinJanMaxJul':
        # A timestep out of bounds should yield nans for temp and dd
        assert_true(np.all(np.isnan(fn_geo.T_air_min)))
        assert_true(np.all(np.isnan(fn_geo.T_air_max)))

        # Calculating degree days on all NaNs yields all NaNs
        fn_geo.compute_degree_days()
        assert_true(np.all(np.isnan(fn_geo.ddt)))
        assert_true(np.all(np.isnan(fn_geo.ddf)))

        # Calculating air frost number on NaNs yields NaNs
        fn_geo.compute_air_frost_number_Geo()
        assert_true(np.all(np.isnan(fn_geo.air_frost_number_Geo)))

    # Test that we get real values
    fn_geo.set_current_date_and_timestep_with_timestep(2)
    fn_geo.get_input_vars()
    assert_greater_equal(fn_geo._date_current, fn_geo._temperature_first_date)
    if fn_geo._dd_method == 'MinJanMaxJul':
        # The default should have no missing temperature values
        assert_false(np.any(np.isnan(fn_geo.T_air_min)))
        assert_false(np.any(np.isnan(fn_geo.T_air_max)))
        #fn_geo.T_air_min.tofile("Tairmin.dat")
        #fn_geo.T_air_max.tofile("Tairmax.dat")

        # Calculating degree days on all NaNs yields all NaNs
        fn_geo.compute_degree_days()
        assert_false(np.any(np.isnan(fn_geo.ddt)))
        assert_false(np.any(np.isnan(fn_geo.ddf)))
        #fn_geo.ddt.tofile("ddt.dat")
        #fn_geo.ddf.tofile("ddf.dat")

        # Calculating air frost number on NaNs yields NaNs
        fn_geo.compute_air_frost_number_Geo()
        assert_false(np.any(np.isnan(fn_geo.air_frost_number_Geo)))
        #fn_geo.air_frost_number_Geo.tofile("afn_geod.dat")
    fn_geo.finalize_frostnumber_Geo()
コード例 #4
0
def test_Geo_frostnumber_output_a_netcdf_file():
    fn_geo = frost_number_Geo.FrostnumberGeoMethod()
    fn_geo.initialize_frostnumberGeo_component()
    assert_true(fn_geo.output_filename is not None)
    assert_true(fn_geo.output_filename[-3:] == '.nc')
    fn_geo.initial_update()
    for t in range(0, 10):
        fn_geo.get_input_vars()
        fn_geo.compute_degree_days()
        fn_geo.calculate_frost_numbers_Geo()
        fn_geo.add_to_output()
        fn_geo.update()
    fn_geo.finalize()
コード例 #5
0
def test_Geo_frostnumber_get_latest_min_max_months():
    fn_geo = frost_number_Geo.FrostnumberGeoMethod()
    fn_geo.initialize_frostnumberGeo_component()

    this_date = datetime.date(1905, 1, 1)
    (mindate, maxdate) = fn_geo.get_min_and_max_dates(this_date)
    assert_equal(mindate, datetime.date(1905, 1, 15))
    assert_equal(maxdate, datetime.date(1904, 7, 15))

    this_date = datetime.date(2004, 8, 1)
    (mindate, maxdate) = fn_geo.get_min_and_max_dates(this_date)
    assert_equal(mindate, datetime.date(2004, 1, 15))
    assert_equal(maxdate, datetime.date(2004, 7, 15))

    fn_geo.finalize_frostnumber_Geo()
コード例 #6
0
def test_Geo_frostnumber_initializes_from_default_config_file():
    fn_geo = frost_number_Geo.FrostnumberGeoMethod()
    assert os.path.isfile(fn_geo._config_filename)
    fn_geo.initialize_frostnumberGeo_component()
    assert fn_geo._grid_type == 'uniform rectilinear'
    assert fn_geo._calc_surface_fn is not None
    assert fn_geo._calc_stefan_fn is not None
    assert fn_geo._dd_method in ('ObservedMinMax', 'MinJanMaxJul',
                                 'MonthlyAverages', 'DailyValues')
    if fn_geo._dd_method == 'MinJanMaxJul':
        assert fn_geo.T_air_min.shape == fn_geo._grid_shape
        assert fn_geo.T_air_max.shape == fn_geo._grid_shape
        if fn_geo._using_Files:
            assert fn_geo._temperature_dataset is not None

    fn_geo.finalize_frostnumber_Geo()
    files_to_remove.append(fn_geo.output_filename)
コード例 #7
0
def test_Geo_frostnumber_initialize_datacube():
    fn_geo = frost_number_Geo.FrostnumberGeoMethod()
    config_dict = \
        {'n_temperature_grid_fields': 4,
         'temperature_grid_date_0': '1901-01-01',
         'temperature_grid_data_0': '((-10, -5), (-20, -15), (0, 5))',
         'temperature_grid_date_1': '1901-07-01',
         'temperature_grid_data_1': '((10, 15), (0, 5), (20, 15))',
         'temperature_grid_date_2': '1902-01-01',
         'temperature_grid_data_2': '((-7, -2), (-17, -12), (3, 8))',
         'temperature_grid_date_3': '1902-07-01',
         'temperature_grid_data_3': '((7, 2), (17, 12), (23, 28))'}
    dates, cube = fn_geo.initialize_datacube('temperature', config_dict)

    assert_in(datetime.date(1901, 7, 1), dates)  # second date

    assert_equal(cube[0, 0, 0], -10)  # very first value
    assert_equal(cube[3, 2, 1], 28)  # very last value
    assert_equal(cube[2, 1, 0], -17)  # 3rd date, 2nd set, 1st value
コード例 #8
0
def test_Geo_frostnumber_can_compute_real_date_from_timestep():
    fn_geo = frost_number_Geo.FrostnumberGeoMethod()
    fn_geo.initialize_frostnumberGeo_component()

    # Timestep should be one year
    assert_equal(fn_geo._timestep_duration, 1)

    # Model reference date should have timestep of zero
    assert_equal(fn_geo.get_timestep_from_date(fn_geo._reference_date), 0)

    # Timestep of first date should be first timestep
    assert_equal(fn_geo._timestep_first,
                 fn_geo.get_timestep_from_date(fn_geo._start_date))

    # Last date should be date of last timestep
    assert_equal(fn_geo._end_date,
                 fn_geo.get_date_from_timestep(fn_geo._timestep_last))

    fn_geo.finalize_frostnumber_Geo()
コード例 #9
0
def test_Geo_frostnumber_can_be_passed_config_filename():
    fn_geo = frost_number_Geo.FrostnumberGeoMethod(cfgfile="a file")
    assert_true(fn_geo._config_filename == "a file")
コード例 #10
0
def test_Geo_frostnumber_has_default_config_file():
    fn_geo = frost_number_Geo.FrostnumberGeoMethod()
    assert_true(fn_geo._config_filename is not None)
コード例 #11
0
def test_can_initialize_Geo_frostnumber_module():
    fn_geo = frost_number_Geo.FrostnumberGeoMethod()
コード例 #12
0
def test_Geo_frostnumber_update_until_timestep():
    fn_geo = frost_number_Geo.FrostnumberGeoMethod()
    fn_geo.initialize_frostnumberGeo_component()
    fn_geo.initial_update()
    fn_geo.update_until_timestep(fn_geo._timestep_last)
    fn_geo.finalize()
コード例 #13
0
    def initialize(self, cfg_file=None):
        self._model = frost_number_Geo.FrostnumberGeoMethod(cfg_file)

        self._model.initialize_frostnumberGeo_component()

        # Set the name of this component
        self._name = "Permamodel FrostnumberGeo Component"

        # Set the internal (frost number) variables that correspond
        # to the input and output variable names
        # Note: since we used Topoflow's _var_name_map for this, it is that
        self._values = {
            # These are the links to the model's variables and
            # should be consistent with _var_name_map
            'atmosphere_bottom_air__temperature':
            self._model._temperature_current,
            'atmosphere_bottom_air__temperature_mean_jan':
            self._model._temperature_jan,
            'atmosphere_bottom_air__temperature_mean_jul':
            self._model._temperature_jul,
            'datetime__start':          self._model._start_date,
            'datetime__end':            self._model._end_date,
            'frostnumber__air':         self._model.air_frost_number_Geo,
            'frostnumber__surface':     self._model.surface_frost_number_Geo,
            'frostnumber__stefan':      self._model.stefan_frost_number_Geo}

        # Surface and Stefan numbers are not necessarily calculated
        if not self._model._calc_surface_fn and \
                'frostnumber__surface' in self._values.keys():
            del self._var_name_map['frostnumber__surface']
            del self._var_units_map['frostnumber__surface']
            del self._values['frostnumber__surface']
            # _output_var_names is an (immutable)
            self._output_var_names = tuple(v for v in self._output_var_names
                                           if v != 'frostnumber__surface')

        if not self._model._calc_stefan_fn and \
                'frostnumber__stefan' in self._values.keys():
            del self._var_name_map['frostnumber__stefan']
            del self._var_units_map['frostnumber__stefan']
            del self._values['frostnumber__stefan']
            self._output_var_names = tuple(v for v in self._output_var_names
                                           if v != 'frostnumber__stefan')

        # Verify that all input and output variable names are in the
        # variable name and the units map
        for varname in self._input_var_names:
            assert varname in self._var_name_map
            assert varname in self._var_units_map
        for varname in self._output_var_names:
            assert varname in self._var_name_map
            assert varname in self._var_units_map

        # Set the names and types of the grids
        # Note: A single value is a uniform rectilinear grid of shape (1)
        #       and size 1
        gridnumber = 0
        for varname in self._input_var_names:
            self._grids[gridnumber] = varname
            self._grid_type[gridnumber] = 'uniform_rectilinear'
            gridnumber += 1
        for varname in self._output_var_names:
            self._grids[gridnumber] = varname
            self._grid_type[gridnumber] = 'uniform_rectilinear'
            gridnumber += 1
        self.ngrids = gridnumber