def test_plot_model(): gdir = init_hef() flowline.init_present_time_glacier(gdir) model = flowline.FlowlineModel(gdir.read_pickle('model_flowlines')) graphics.plot_modeloutput_section(gdir, model=model) graphics.plot_modeloutput_map(gdir, model=model)
def test_find_t0(self): gdir = init_hef(border=DOM_BORDER, invert_with_sliding=False) flowline.init_present_time_glacier(gdir) glacier = gdir.read_pickle('model_flowlines') df = pd.read_csv(utils.get_demo_file('hef_lengths.csv'), index_col=0) df.columns = ['Leclercq'] df = df.loc[1950:] vol_ref = flowline.FlowlineModel(glacier).volume_km3 init_bias = 100. # 100 so that "went too far" comes once on travis rtol = 0.005 flowline.find_inital_glacier(gdir, y0=df.index[0], init_bias=init_bias, rtol=rtol, write_steps=False) past_model = gdir.read_pickle('past_model') vol_start = past_model.volume_km3 bef_fls = copy.deepcopy(past_model.fls) mylen = [] for y in df.index: past_model.run_until(y) mylen.append(past_model.fls[-1].length_m) df['oggm'] = mylen df = df - df.iloc[-1] vol_end = past_model.volume_km3 np.testing.assert_allclose(vol_ref, vol_end, rtol=0.05) rmsd = utils.rmsd(df.Leclercq, df.oggm) self.assertTrue(rmsd < 1000.) if do_plot: # pragma: no cover df.plot() plt.ylabel('Glacier length (relative to 2003)') plt.show() fig = plt.figure() lab = 'ref (vol={:.2f}km3)'.format(vol_ref) plt.plot(glacier[-1].surface_h, 'k', label=lab) lab = 'oggm start (vol={:.2f}km3)'.format(vol_start) plt.plot(bef_fls[-1].surface_h, 'b', label=lab) lab = 'oggm end (vol={:.2f}km3)'.format(vol_end) plt.plot(past_model.fls[-1].surface_h, 'r', label=lab) plt.plot(glacier[-1].bed_h, 'gray', linewidth=2) plt.legend(loc='best') plt.show()
def test_modelmap(): gdir = init_hef() flowline.init_present_time_glacier(gdir) fls = gdir.read_pickle('model_flowlines') model = flowline.FlowlineModel(fls) fig, ax = plt.subplots() graphics.plot_modeloutput_map(gdir, ax=ax, model=model) fig.tight_layout() return fig
def test_modelsection(): gdir = init_hef() flowline.init_present_time_glacier(gdir) fls = gdir.read_pickle('model_flowlines') model = flowline.FlowlineModel(fls) fig = plt.figure(figsize=(12, 6)) ax = fig.add_axes([0.07, 0.08, 0.7, 0.84]) graphics.plot_modeloutput_section(gdir, ax=ax, model=model) return fig
def test_chhota_shigri(): testdir = os.path.join(cfg.PATHS['test_dir'], 'tmp_chhota') utils.mkdir(testdir) # Init cfg.initialize() cfg.PATHS['dem_file'] = get_demo_file('dem_chhota_shigri.tif') cfg.PARAMS['border'] = 60 cfg.set_divides_db(get_demo_file('divides_RGI50-14.15990.shp')) hef_file = get_demo_file('RGI50-14.15990.shp') entity = gpd.GeoDataFrame.from_file(hef_file).iloc[0] gdir = oggm.GlacierDirectory(entity, base_dir=testdir) gis.define_glacier_region(gdir, entity=entity) gis.glacier_masks(gdir) centerlines.compute_centerlines(gdir) centerlines.compute_downstream_lines(gdir) geometry.initialize_flowlines(gdir) # We should have two groups lines = gdir.read_pickle('downstream_lines', div_id=0) assert len(np.unique(lines.group)) == 2 # Just check if the rest runs centerlines.compute_downstream_bedshape(gdir) geometry.catchment_area(gdir) geometry.catchment_intersections(gdir) geometry.catchment_width_geom(gdir) geometry.catchment_width_correction(gdir) climate.apparent_mb_from_linear_mb(gdir) inversion.prepare_for_inversion(gdir) inversion.volume_inversion(gdir, use_cfg_params={'glen_a': cfg.A, 'fs': 0}) inversion.filter_inversion_output(gdir) flowline.init_present_time_glacier(gdir) fls = gdir.read_pickle('model_flowlines') for fl in fls: fl.thick = np.clip(fl.thick, 100, 1000) model = flowline.FlowlineModel(fls) fig, ax = plt.subplots() graphics.plot_modeloutput_map(gdir, ax=ax, model=model) fig.tight_layout() return fig
def test_present_time_glacier_massbalance(self): gdir = init_hef(border=DOM_BORDER) flowline.init_present_time_glacier(gdir) mb_mod = massbalance.HistalpMassBalanceModel(gdir) fls = gdir.read_pickle('model_flowlines') glacier = flowline.FlowlineModel(fls) hef_file = utils.get_demo_file('mbdata_RGI40-11.00897.csv') mbdf = pd.read_csv(hef_file).set_index('YEAR') hgts = np.array([]) widths = np.array([]) for fl in glacier.fls: hgts = np.concatenate((hgts, fl.surface_h)) widths = np.concatenate((widths, fl.widths_m)) tot_mb = [] refmb = [] grads = hgts * 0 for yr, mb in mbdf.iterrows(): refmb.append(mb['ANNUAL_BALANCE']) mbh = mb_mod.get_mb(hgts, yr) * SEC_IN_YEAR * cfg.RHO grads += mbh tot_mb.append(np.average(mbh, weights=widths)) grads /= len(tot_mb) # Bias self.assertTrue(np.abs(utils.md(tot_mb, refmb)) < 50) # Gradient dfg = pd.read_csv(utils.get_demo_file('mbgrads_RGI40-11.00897.csv'), index_col='ALTITUDE').mean(axis=1) # Take the altitudes below 3100 and fit a line dfg = dfg[dfg.index < 3100] pok = np.where(hgts < 3100) from scipy.stats import linregress slope_obs, _, _, _, _ = linregress(dfg.index, dfg.values) slope_our, _, _, _, _ = linregress(hgts[pok], grads[pok]) np.testing.assert_allclose(slope_obs, slope_our, rtol=0.1)
if not os.path.exists(fn): graphics.plot_centerlines(gd, title_comment=demsource) plt.savefig(fn) plt.close() fn = bname + '3_fls.png' if not os.path.exists(fn): graphics.plot_centerlines(gd, title_comment=demsource, use_flowlines=True, add_downstream=True) plt.savefig(fn) plt.close() fn = bname + '4_widths.png' if not os.path.exists(fn): graphics.plot_catchment_width(gd, corrected=True, add_intersects=True, add_touches=True) plt.savefig(fn) plt.close() fn = bname + '5_thick.png' if not os.path.exists(fn): fls = gd.read_pickle('model_flowlines') model = flowline.FlowlineModel(fls) graphics.plot_modeloutput_map(gd, model=model) plt.savefig(fn) plt.close()