def region_model_repository(self): """ Returns ------- - RegionModelRepository - configured with 'Tistel-ptgsk' etc. """ id_list = [1225] # parameters can be loaded from yaml_config Model parameters.. pt_params = api.PriestleyTaylorParameter( ) # *params["priestley_taylor"]) gs_params = api.GammaSnowParameter() # *params["gamma_snow"]) ss_params = api.SkaugenParameter() ae_params = api.ActualEvapotranspirationParameter( ) # *params["act_evap"]) k_params = api.KirchnerParameter() # *params["kirchner"]) p_params = api.PrecipitationCorrectionParameter( ) # TODO; default 1.0, is it used ?? ptgsk_rm_params = pt_gs_k.PTGSKParameter(pt_params, gs_params, ae_params, k_params, p_params) ptssk_rm_params = pt_ss_k.PTSSKParameter(pt_params, ss_params, ae_params, k_params, p_params) # create the description for 2 models of tistel,ptgsk, ptssk tistel_grid_spec = self.grid_spec # cfg_list = [ RegionModelConfig("Tistel-ptgsk", pt_gs_k.PTGSKModel, ptgsk_rm_params, tistel_grid_spec, "unregulated", "FELTNR", id_list), RegionModelConfig("Tistel-ptssk", pt_ss_k.PTSSKModel, ptssk_rm_params, tistel_grid_spec, "unregulated", "FELTNR", id_list) ] rm_cfg_dict = {x.name: x for x in cfg_list} return GisRegionModelRepository(rm_cfg_dict)
def _create_std_ptgsk_param(self): ptp = api.PriestleyTaylorParameter(albedo=0.85, alpha=1.23) ptp.albedo = 0.9 ptp.alpha = 1.26 aep = api.ActualEvapotranspirationParameter(ae_scale_factor=1.5) aep.ae_scale_factor = 1.1 gsp = api.GammaSnowParameter( winter_end_day_of_year=99, initial_bare_ground_fraction=0.04, snow_cv=0.44, tx=-0.3, wind_scale=1.9, wind_const=0.9, max_water=0.11, surface_magnitude=33.0, max_albedo=0.88, min_albedo=0.55, fast_albedo_decay_rate=6.0, slow_albedo_decay_rate=4.0, snowfall_reset_depth=6.1, glacier_albedo=0.44 ) # TODO: This does not work due to boost.python template arity of 15, calculate_iso_pot_energy=False) gsp.calculate_iso_pot_energy = False gsp.snow_cv = 0.5 gsp.initial_bare_ground_fraction = 0.04 kp = api.KirchnerParameter(c1=-2.55, c2=0.8, c3=-0.01) kp.c1 = 2.5 kp.c2 = -0.9 kp.c3 = 0.01 spcp = api.PrecipitationCorrectionParameter(scale_factor=0.9) ptgsk_p = pt_gs_k.PTGSKParameter(ptp, gsp, aep, kp, spcp) ptgsk_p.ae.ae_scale_factor = 1.2 # sih: just to demo ae scale_factor can be set directly return ptgsk_p
def test_pt_gs_k_param(self): ptgsk_size = 21 valid_names = [ "kirchner.c1", "kirchner.c2", "kirchner.c3", "ae.ae_scale_factor", "gs.tx", "gs.wind_scale", "gs.max_water", "gs.wind_const", "gs.fast_albedo_decay_rate", "gs.slow_albedo_decay_rate", "gs.surface_magnitude", "gs.max_albedo", "gs.min_albedo", "gs.snowfall_reset_depth", "gs.snow_cv", "gs.glacier_albedo", "p_corr.scale_factor", "gs.snow_cv_forest_factor", "gs.snow_cv_altitude_factor", "pt.albedo", "pt.alpha" ] self.verify_parameter_for_calibration(pt_gs_k.PTGSKParameter(), ptgsk_size, valid_names)
def test_pt_gs_k_param(self): ptgsk_size = 30 valid_names = [ "kirchner.c1", "kirchner.c2", "kirchner.c3", "ae.ae_scale_factor", "gs.tx", "gs.wind_scale", "gs.max_water", "gs.wind_const", "gs.fast_albedo_decay_rate", "gs.slow_albedo_decay_rate", "gs.surface_magnitude", "gs.max_albedo", "gs.min_albedo", "gs.snowfall_reset_depth", "gs.snow_cv", "gs.glacier_albedo", "p_corr.scale_factor", "gs.snow_cv_forest_factor", "gs.snow_cv_altitude_factor", "pt.albedo", "pt.alpha", "gs.initial_bare_ground_fraction", "gs.winter_end_day_of_year", "gs.calculate_iso_pot_energy", "gm.dtf", "routing.velocity", "routing.alpha", "routing.beta", "gs.n_winter_days", "gm.direct_response" ] p = pt_gs_k.PTGSKParameter() special_values = {22: 130, 28: 221} self.verify_parameter_for_calibration(p, ptgsk_size, valid_names, special_values) # special verification of bool parameter p.gs.calculate_iso_pot_energy = True self.assertTrue(p.gs.calculate_iso_pot_energy) self.assertAlmostEqual(p.get(23), 1.0, 0.00001) p.gs.calculate_iso_pot_energy = False self.assertFalse(p.gs.calculate_iso_pot_energy) self.assertAlmostEqual(p.get(23), 0.0, 0.00001) pv = api.DoubleVector.from_numpy([p.get(i) for i in range(p.size())]) pv[23] = 1.0 p.set(pv) self.assertTrue(p.gs.calculate_iso_pot_energy) pv[23] = 0.0 p.set(pv) self.assertFalse(p.gs.calculate_iso_pot_energy) # checkout new parameters for routing p.routing.velocity = 1 / 3600.0 p.routing.alpha = 1.1 p.routing.beta = 0.8 self.assertAlmostEqual(p.routing.velocity, 1 / 3600.0) self.assertAlmostEqual(p.routing.alpha, 1.1) self.assertAlmostEqual(p.routing.beta, 0.8) utc = api.Calendar() self.assertTrue(p.gs.is_snow_season(utc.time(2017, 1, 1))) self.assertFalse(p.gs.is_snow_season(utc.time(2017, 8, 1))) p.gs.n_winter_days = 100 self.assertFalse(p.gs.is_snow_season(utc.time(2017, 11, 31))) self.assertTrue(p.gs.is_snow_season(utc.time(2017, 2, 1)))
def test_model_clone_with_catchment_parameters(self): """ Verify we can copy an opt-model from full model including catchment specific parameters""" m = self.build_model(pt_gs_k.PTGSKModel, pt_gs_k.PTGSKParameter, model_size=20, num_catchments=2) p2 = pt_gs_k.PTGSKParameter() p2.kirchner.c1 = 2.3 m.set_catchment_parameter(2, p2) self.assertTrue(m.has_catchment_parameter(2)) self.assertFalse(m.has_catchment_parameter(1)) o = pt_gs_k.create_opt_model_clone( m, True ) # this is how to create an opt-model, with catchm. spec params self.assertTrue(o.has_catchment_parameter(2)) self.assertFalse(o.has_catchment_parameter(1)) o = pt_gs_k.create_opt_model_clone( m, False) # default, only region param is copied(for opt-purposes) self.assertFalse(o.has_catchment_parameter(2)) self.assertFalse(o.has_catchment_parameter(1))
def test_create_ptgsk_param(self): ptgsk_p = self._create_std_ptgsk_param() copy_p = pt_gs_k.PTGSKParameter(ptgsk_p) self.assertTrue(ptgsk_p != None, "should be possible to create a std param") self.assertIsNotNone(copy_p)