def setUp(self): # test directory self.testdir = os.path.join(current_dir, 'tmp') if not os.path.exists(self.testdir): os.makedirs(self.testdir) self.clean_dir() # Init cfg.initialize() cfg.set_divides_db(get_demo_file('HEF_divided.shp')) cfg.paths['srtm_file'] = get_demo_file('hef_srtm.tif')
def init_hef(reset=False): # test directory if not os.path.exists(testdir): os.makedirs(testdir) reset = True if not os.path.exists(os.path.join(testdir, 'RGI40-11.00897')): reset = True if not os.path.exists(os.path.join(testdir, 'RGI40-11.00897', 'flowline_params.p')): reset = True # Init cfg.initialize() cfg.set_divides_db(get_demo_file('HEF_divided.shp')) cfg.paths['srtm_file'] = get_demo_file('hef_srtm.tif') cfg.paths['histalp_file'] = get_demo_file('histalp_merged_hef.nc') cfg.params['border'] = 40 # loop because for some reason indexing wont work hef_file = get_demo_file('Hintereisferner.shp') rgidf = gpd.GeoDataFrame.from_file(hef_file) for index, entity in rgidf.iterrows(): gdir = cfg.GlacierDir(entity, base_dir=testdir, reset=reset) if not reset: return gdir gis.define_glacier_region(gdir, entity) gis.glacier_masks(gdir) centerlines.compute_centerlines(gdir) centerlines.compute_downstream_lines(gdir) geometry.initialize_flowlines(gdir) geometry.catchment_area(gdir) geometry.catchment_width_geom(gdir) geometry.catchment_width_correction(gdir) climate.distribute_climate_data([gdir]) climate.mu_candidates(gdir, div_id=0) hef_file = get_demo_file('mbdata_RGI40-11.00897.csv') mbdf = pd.read_csv(hef_file).set_index('YEAR') t_star, bias = climate.t_star_from_refmb(gdir, mbdf['ANNUAL_BALANCE']) climate.local_mustar_apparent_mb(gdir, t_star[-1], bias[-1]) inversion.prepare_for_inversion(gdir) ref_v = 0.573 * 1e9 def to_optimize(x): fd = 1.9e-24 * x[0] fs = 5.7e-20 * x[1] v, _ = inversion.inversion_parabolic_point_slope(gdir, fs=fs, fd=fd) return (v - ref_v)**2 import scipy.optimize as optimization out = optimization.minimize(to_optimize, [1,1], bounds=((0.01, 1), (0.01, 1)), tol=1e-3)['x'] fd = 1.9e-24 * out[0] fs = 5.7e-20 * out[1] v, _ = inversion.inversion_parabolic_point_slope(gdir, fs=fs, fd=fd, write=True) d = dict(fs=fs, fd=fd) gdir.write_pickle(d, 'flowline_params') return gdir
def up_to_inversion(): """Run the tasks you want.""" # test directory testdir = os.path.join(current_dir, 'tmp') if not os.path.exists(testdir): os.makedirs(testdir) clean_dir(testdir) # Init cfg.initialize() # Prevent multiprocessing cfg.use_mp = False # Working dir cfg.paths['working_dir'] = testdir cfg.set_divides_db(get_demo_file('HEF_divided.shp')) cfg.paths['srtm_file'] = get_demo_file('srtm_oeztal.tif') # Set up the paths and other stuffs cfg.set_divides_db(get_demo_file('HEF_divided.shp')) cfg.paths['histalp_file'] = get_demo_file('HISTALP_oeztal.nc') # Get test glaciers (all glaciers with MB or Thickness data) cfg.paths['wgms_rgi_links'] = get_demo_file('RGI_WGMS_oeztal.csv') cfg.paths['glathida_rgi_links'] = get_demo_file('RGI_GLATHIDA_oeztal.csv') # Read in the RGI file rgi_file = get_demo_file('rgi_oeztal.shp') rgidf = gpd.GeoDataFrame.from_file(rgi_file) # Go gdirs = workflow.init_glacier_regions(rgidf) # First preprocessing tasks workflow.gis_prepro_tasks(gdirs) # Climate related tasks workflow.climate_tasks(gdirs) # Merge climate and catchments workflow.execute_task(inversion.prepare_for_inversion, gdirs) fs, fd = inversion.optimize_inversion_params(gdirs) # Tests dfids = cfg.paths['glathida_rgi_links'] gtd_df = pd.read_csv(dfids).sort_values(by=['RGI_ID']) dfids = gtd_df['RGI_ID'].values ref_gdirs = [gdir for gdir in gdirs if gdir.rgi_id in dfids] # Account for area differences between glathida and rgi ref_area_km2 = gtd_df.RGI_AREA.values ref_cs = gtd_df.VOLUME.values / (gtd_df.GTD_AREA.values**1.375) ref_volume_km3 = ref_cs * ref_area_km2**1.375 vol = [] area = [] rgi = [] for gdir in ref_gdirs: v, a = inversion.inversion_parabolic_point_slope(gdir, fs=fs, fd=fd, write=True) vol.append(v) area.append(a) rgi.append(gdir.rgi_id) df = pd.DataFrame() df['rgi'] = rgi df['area'] = area df['ref_vol'] = ref_volume_km3 df['oggm_vol'] = np.array(vol) * 1e-9 df['vas_vol'] = 0.034*(ref_area_km2**1.375) df = df.set_index('rgi') shutil.rmtree(testdir) return df