def setup_cache(self): utils.mkdir(self.testdir, reset=True) self.cfg_init() hef_file = get_demo_file('Hintereisferner_RGI5.shp') entity = gpd.read_file(hef_file).iloc[0] gdir = oggm.GlacierDirectory(entity, base_dir=self.testdir) tasks.define_glacier_region(gdir, entity=entity) tasks.glacier_masks(gdir) tasks.compute_centerlines(gdir) tasks.initialize_flowlines(gdir) tasks.compute_downstream_line(gdir) tasks.compute_downstream_bedshape(gdir) tasks.catchment_area(gdir) tasks.catchment_intersections(gdir) tasks.catchment_width_geom(gdir) tasks.catchment_width_correction(gdir) tasks.process_custom_climate_data(gdir) tasks.glacier_mu_candidates(gdir) mbdf = gdir.get_ref_mb_data()['ANNUAL_BALANCE'] res = climate.t_star_from_refmb(gdir, mbdf=mbdf) tasks.local_t_star(gdir, tstar=res['t_star'], bias=res['bias']) tasks.mu_star_calibration(gdir) tasks.prepare_for_inversion(gdir) tasks.mass_conservation_inversion(gdir) return gdir
def test_run(self): entity = gpd.read_file(self.rgi_file).iloc[0] gdir = oggm.GlacierDirectory(entity, base_dir=self.testdir) gis.define_glacier_region(gdir) gis.glacier_masks(gdir) centerlines.compute_centerlines(gdir) centerlines.initialize_flowlines(gdir) centerlines.compute_downstream_line(gdir) centerlines.compute_downstream_bedshape(gdir) centerlines.catchment_area(gdir) centerlines.catchment_intersections(gdir) centerlines.catchment_width_geom(gdir) centerlines.catchment_width_correction(gdir) # Climate tasks -- only data IO and tstar interpolation! tasks.process_dummy_cru_file(gdir, seed=0) tasks.local_t_star(gdir) tasks.mu_star_calibration(gdir) # Inversion tasks tasks.find_inversion_calving(gdir) # Final preparation for the run tasks.init_present_time_glacier(gdir) # check that calving happens in the real context as well tasks.run_constant_climate(gdir, bias=0, nyears=200, temperature_bias=-0.5) with xr.open_dataset(gdir.get_filepath('model_diagnostics')) as ds: assert ds.calving_m3[-1] > 10
index_col=0, squeeze=True) # Go - initialize glacier directories gdirs = workflow.init_glacier_directories(rids) # Cross-validation file = os.path.join(cfg.PATHS['working_dir'], 'ref_tstars.csv') ref_df = pd.read_csv(file, index_col=0) for i, gdir in enumerate(gdirs): print('Cross-validation iteration {} of {}'.format(i + 1, len(ref_df))) # Now recalibrate the model blindly tmp_ref_df = ref_df.loc[ref_df.index != gdir.rgi_id] tasks.local_t_star(gdir, ref_df=tmp_ref_df) tasks.mu_star_calibration(gdir) # Mass-balance model with cross-validated parameters instead mb_mod = MultipleFlowlineMassBalance(gdir, mb_model_class=PastMassBalance, use_inversion_flowlines=True) # Mass-balance timeseries, observed and simulated refmb = gdir.get_ref_mb_data().copy() refmb['OGGM'] = mb_mod.get_specific_mb(year=refmb.index) # Compare their standard deviation std_ref = refmb.ANNUAL_BALANCE.std() rcor = np.corrcoef(refmb.OGGM, refmb.ANNUAL_BALANCE)[0, 1] if std_ref == 0: # I think that such a thing happens with some geodetic values std_ref = refmb.OGGM.std()
def quick_crossval_entity(gdir, full_ref_df=None): tmpdf = pd.DataFrame( [], columns=['std_oggm', 'std_ref', 'rmse', 'core', 'bias']) # the reference glaciers tmp_ref_df = full_ref_df.loc[full_ref_df.index != gdir.rgi_id] # before the cross-val store the info about "real" mustar ref_rdf = gdir.read_json('local_mustar') tasks.local_t_star(gdir, ref_df=tmp_ref_df) tasks.mu_star_calibration(gdir) # read crossvalidated values cv_rdf = gdir.read_json('local_mustar') # ---- # --- MASS-BALANCE MODEL mb_mod = MultipleFlowlineMassBalance(gdir, use_inversion_flowlines=True) # Mass-balance timeseries, observed and simulated refmb = gdir.get_ref_mb_data().copy() refmb['OGGM'] = mb_mod.get_specific_mb(year=refmb.index) # store single glacier results bias = refmb.OGGM.mean() - refmb.ANNUAL_BALANCE.mean() rmse = np.sqrt(np.mean(refmb.OGGM - refmb.ANNUAL_BALANCE)**2) rcor = np.corrcoef(refmb.OGGM, refmb.ANNUAL_BALANCE)[0, 1] ref_std = refmb.ANNUAL_BALANCE.std() # unclear how to treat this best if ref_std == 0: ref_std = refmb.OGGM.std() rcor = 1 tmpdf.loc[len(tmpdf.index)] = { 'std_oggm': refmb.OGGM.std(), 'std_ref': ref_std, 'bias': bias, 'rmse': rmse, 'core': rcor } # and store mean values out = { 'prcpsf': cfg.PARAMS['prcp_scaling_factor'], 'tliq': cfg.PARAMS['temp_all_liq'], 'tmelt': cfg.PARAMS['temp_melt'], 'tgrad': cfg.PARAMS['temp_default_gradient'], 'std_oggm': tmpdf.std_oggm.values[0], 'std_ref': tmpdf.std_ref.values[0], 'std_quot': np.nan, 'bias': tmpdf['bias'].mean(), 'rmse': tmpdf['rmse'].mean(), 'core': tmpdf['core'].mean() } # combine "real" mustar and crossvalidated mu_star # get rid of mu_star_per_flowline as list of flowlines is ugly to deal with for i, fl in enumerate(cv_rdf['mu_star_per_flowline']): cv_rdf['mustar_flowline_{:03d}'.format(i + 1)] = fl for i, fl in enumerate(ref_rdf['mu_star_per_flowline']): ref_rdf['mustar_flowline_{:03d}'.format(i + 1)] = fl del cv_rdf['mu_star_per_flowline'] del ref_rdf['mu_star_per_flowline'] for col in cv_rdf.keys(): if 'rgi_id' in col: continue ref_rdf['cv_' + col] = cv_rdf[col] return [out, ref_rdf]