def test_crossval(self): gdirs = up_to_distrib() # before crossval refmustars = [] for gdir in gdirs: tdf = pd.read_csv(gdir.get_filepath('local_mustar')) refmustars.append(tdf['mu_star'].values[0]) tasks.crossval_t_stars(gdirs) file = os.path.join(cfg.PATHS['working_dir'], 'crossval_tstars.csv') df = pd.read_csv(file, index_col=0) # after crossval we need to rerun tasks.compute_ref_t_stars(gdirs) tasks.distribute_t_stars(gdirs) # see if the process didn't brake anything mustars = [] for gdir in gdirs: tdf = pd.read_csv(gdir.get_filepath('local_mustar')) mustars.append(tdf['mu_star'].values[0]) np.testing.assert_allclose(refmustars, mustars) # make some mb tests from oggm.core.models.massbalance import PastMassBalanceModel for rid in df.index: gdir = [g for g in gdirs if g.rgi_id == rid][0] h, w = gdir.get_inversion_flowline_hw() cfg.PARAMS['use_bias_for_run'] = False mbmod = PastMassBalanceModel(gdir) mbdf = gdir.get_ref_mb_data()['ANNUAL_BALANCE'].to_frame( name='ref') for yr in mbdf.index: mbdf.loc[yr, 'mine'] = mbmod.get_specific_mb(h, w, year=yr) mm = mbdf.mean() np.testing.assert_allclose(df.loc[rid].bias, mm['mine'] - mm['ref'], atol=1e-3) cfg.PARAMS['use_bias_for_run'] = True mbmod = PastMassBalanceModel(gdir) mbdf = gdir.get_ref_mb_data()['ANNUAL_BALANCE'].to_frame( name='ref') for yr in mbdf.index: mbdf.loc[yr, 'mine'] = mbmod.get_specific_mb(h, w, year=yr) mm = mbdf.mean() np.testing.assert_allclose(mm['mine'], mm['ref'], atol=1e-3)
def test_crossval(self): gdirs = up_to_distrib() # in case we ran crossval we need to rerun tasks.compute_ref_t_stars(gdirs) tasks.distribute_t_stars(gdirs) workflow.execute_entity_task(tasks.apparent_mb, gdirs) # before crossval refmustars = [] for gdir in gdirs: tdf = pd.read_csv(gdir.get_filepath('local_mustar')) refmustars.append(tdf['mu_star'].values[0]) tasks.crossval_t_stars(gdirs) file = os.path.join(cfg.PATHS['working_dir'], 'crossval_tstars.csv') df = pd.read_csv(file, index_col=0) # after crossval we need to rerun tasks.compute_ref_t_stars(gdirs) tasks.distribute_t_stars(gdirs) workflow.execute_entity_task(tasks.apparent_mb, gdirs) # Test if quicker crossval is also OK tasks.quick_crossval_t_stars(gdirs) file = os.path.join(cfg.PATHS['working_dir'], 'crossval_tstars.csv') dfq = pd.read_csv(file, index_col=0) # after crossval we need to rerun tasks.compute_ref_t_stars(gdirs) tasks.distribute_t_stars(gdirs) workflow.execute_entity_task(tasks.apparent_mb, gdirs) assert np.all(np.abs(df.cv_bias) < 50) assert np.all(np.abs(dfq.cv_bias) < 50) # The biases aren't entirely equivalent and its ok np.testing.assert_allclose(df.cv_prcp_fac, dfq.cv_prcp_fac) # see if the process didn't brake anything mustars = [] for gdir in gdirs: tdf = pd.read_csv(gdir.get_filepath('local_mustar')) mustars.append(tdf['mu_star'].values[0]) np.testing.assert_allclose(refmustars, mustars) # make some mb tests from oggm.core.massbalance import PastMassBalance for rid in df.index: gdir = [g for g in gdirs if g.rgi_id == rid][0] h, w = gdir.get_inversion_flowline_hw() cfg.PARAMS['use_bias_for_run'] = False mbmod = PastMassBalance(gdir) mbdf = gdir.get_ref_mb_data()['ANNUAL_BALANCE'].to_frame(name='ref') for yr in mbdf.index: mbdf.loc[yr, 'mine'] = mbmod.get_specific_mb(h, w, year=yr) mm = mbdf.mean() np.testing.assert_allclose(df.loc[rid].bias, mm['mine'] - mm['ref'], atol=1e-3) cfg.PARAMS['use_bias_for_run'] = True mbmod = PastMassBalance(gdir) mbdf = gdir.get_ref_mb_data()['ANNUAL_BALANCE'].to_frame(name='ref') for yr in mbdf.index: mbdf.loc[yr, 'mine'] = mbmod.get_specific_mb(h, w, year=yr) mm = mbdf.mean() np.testing.assert_allclose(mm['mine'], mm['ref'], atol=1e-3)
tasks.catchment_width_correction, ] for task in task_list: execute_entity_task(task, gdirs) # Climate tasks tasks.compute_ref_t_stars(gdirs) execute_entity_task(tasks.local_mustar, gdirs) # We store the associated params mb_calib = gdirs[0].read_pickle('climate_info')['mb_calib_params'] with open(path.join(WORKING_DIR, 'mb_calib_params.json'), 'w') as fp: json.dump(mb_calib, fp) # Model validation tasks.crossval_t_stars(gdirs) # for later # Tests: for all glaciers, the mass-balance around tstar and the # bias with observation should be approx 0 for gd in gdirs: heights, widths = gd.get_inversion_flowline_hw() mb_mod = ConstantMassBalance(gd, bias=0) # bias=0 because of calib! mb = mb_mod.get_specific_mb(heights, widths) np.testing.assert_allclose(mb, 0, atol=10) # numerical errors mb_mod = PastMassBalance(gd) # Here we need the computed bias refmb = gd.get_ref_mb_data().copy() refmb['OGGM'] = mb_mod.get_specific_mb(heights, widths, year=refmb.index) np.testing.assert_allclose(refmb.OGGM.mean(), refmb.ANNUAL_BALANCE.mean(), atol=10)