def plot_advanced_experiment(gdir): fig = plt.figure(figsize=(15, 14)) grid = plt.GridSpec(1, 2, hspace=0.2, wspace=0.2) ax1 = plt.subplot(grid[0]) ax2 = plt.subplot(grid[1], sharey=ax1) ax2.plot(gdir.rgi_date,gdir.rgi_area_km2,'o', label='RGI area '+ str(gdir.rgi_date)) mod = FluxBasedModel(flowlines=gdir.read_pickle('model_flowlines')) ax2.plot(gdir.rgi_date, mod.area_km2, 'o', label='RGI area ' + str(gdir.rgi_date)) for f in os.listdir(gdir.dir): if f.startswith('model_run_'): rp = os.path.join(gdir.dir,f) model = FileModel(rp) model.area_km2_ts().plot(ax=ax2, label=f) #ax2.set_xlim((1915,2005)) #ax2.legend() plt.show()
def find_residual(gdir, temp_bias_list, ys,a=-2000,b=2000): best_df = pd.DataFrame() fls = gdir.read_pickle('model_flowlines') mod = FluxBasedModel(flowlines=fls) for temp_bias in temp_bias_list: try: ye = gdir.rgi_date max_it = 15 i = 0 bounds = [a,b] df = pd.DataFrame() while i < max_it: bias = round((bounds[0] + bounds[1]) / 2,1) ex_mod2 = _run_experiment(gdir, temp_bias, bias, ys, ye) diff = mod.area_km2 - ex_mod2.area_km2_ts()[ye] df = df.append(pd.Series({'bias':bias,'area_diff':diff}),ignore_index=True) if (abs(diff)<1e-4) or bounds[1]-bounds[0]<=1: break elif ex_mod2.area_km2_ts()[ye] > mod.area_km2: bounds[0] = bias else: bounds[1] = bias i +=1 # best bias found bias = df.iloc[df.area_diff.abs().idxmin()].bias rp = gdir.get_filepath('model_run', filesuffix='_advanced_experiment_'+str(temp_bias)+'_'+str(bias)) model = FileModel(rp) diff = gdir.rgi_area_km2 - model.area_km2_ts()[gdir.rgi_date] series = pd.Series({'rgi_id':gdir.rgi_id,'bias':bias,'iterations':i, 'area_diff':diff, 'model':model, 'temp_bias':temp_bias}) except: series = pd.Series({'rgi_id':gdir.rgi_id, 'temp_bias':temp_bias}) best_df = best_df.append(series, ignore_index=True) return best_df
# plot_random climate if exp_df.loc[i, 'temp_bias'] == -1.0: temp_bias = '-1' if exp_df.loc[i, 'temp_bias'] == 0.0: temp_bias = '0' if exp_df.loc[i, 'temp_bias'] == -0.5: temp_bias = '-0.5' name = 'model_run_random_experiment_' + str( exp_df.loc[i, 'temp_bias']) + '_' + str(exp_df.loc[i, 'bias']) + '.nc' file = os.path.join(cfg.PATHS['working_dir'], 'temp_' + temp_bias, 'per_glacier', 'RGI60-11', 'RGI60-11.00', 'RGI60-11.00897', name) model = FileModel(file) model.area_km2_ts().plot(ax=ax1, color=color) add_at(ax1, 'a') add_at(ax2, 'b') ax1.grid() ax2.grid() ax1.set_xticks([0, 100, 200, 300, 400, 500]) ax1.set_xlabel('Time(years)') ax2.set_xlabel('Time(years)') ax1.set_ylabel(r'Area (km$^2$)') ax1.set_title('Random climate forcing') ax2.set_title(r'CRU 1917-2003 (no $\widetilde{\beta}$)') plt.suptitle('RGI60-11.00897: Hintereisferner') plt.legend(title='\t' + r'temp.bias $\widetilde{\beta}$' + r'$\qquad$' +
def find_residual(gdir, temp_bias_list, ys, a=-2000, b=2000): best_df = pd.DataFrame() fls = gdir.read_pickle('model_flowlines') mod = FluxBasedModel(flowlines=fls) for temp_bias in temp_bias_list: print(temp_bias) try: ye = gdir.rgi_date max_it = 15 i = 0 bounds = [a, b] df = pd.DataFrame() while i < max_it: bias = round((bounds[0] + bounds[1]) / 2, 1) ex_mod2 = _run_experiment(gdir, temp_bias, bias, ys, ye) fit = fitness_function(ye, ex_mod2, mod) df = df.append(pd.Series({ 'bias': bias, 'fitness': fit }), ignore_index=True) if (abs(mod.area_km2 - ex_mod2.area_km2) < 1e-4 and fit < 125) or bounds[1] - bounds[0] <= 1: break elif ex_mod2.area_km2 > mod.area_km2: bounds[0] = bias else: bounds[1] = bias i += 1 # best bias found bias = df.iloc[df.fitness.idxmin()].bias rp = gdir.get_filepath('model_run', filesuffix='_advanced_experiment_' + str(temp_bias) + '_' + str(bias)) model = FileModel(rp) model.run_until(ye) rp = gdir.get_filepath('model_run', filesuffix='_advanced_experiment_' + str(temp_bias) + '_' + str(0.0)) ex_mod = FileModel(rp) ex_mod.run_until(ye) ''' plt.figure(figsize=(15,10)) plt.plot(model.fls[-1].surface_h,'r',label='best') plt.plot(mod.fls[-1].surface_h, 'orange', label='original') plt.plot(ex_mod.fls[-1].surface_h, 'r:', label='old experiment') plt.plot(model.fls[-1].bed_h,'k', label='bed') plt.legend() utils.mkdir(os.path.join(cfg.PATHS['plot_dir'],'bias_test')) plt.savefig(os.path.join(cfg.PATHS['plot_dir'],'bias_test',gdir.rgi_id+'.png'),dpi=200) ''' diff = mod.area_km2 - model.area_km2_ts()[gdir.rgi_date] model.reset_y0(ys) series = pd.Series({ 'rgi_id': gdir.rgi_id, 'bias': bias, 'iterations': i, 'fitness': df.fitness.min(), 'area_diff': diff, 'model': model, 'temp_bias': temp_bias }) except: series = pd.Series({'rgi_id': gdir.rgi_id, 'temp_bias': temp_bias}) best_df = best_df.append(series, ignore_index=True) plt.figure() x = np.arange(mod.fls[-1].nx) * mod.fls[-1].dx * mod.fls[-1].map_dx for temp_bias, model in zip(best_df.temp_bias, best_df.model): model.run_until(model.length_m_ts().index[-1]) plt.plot(x, model.fls[-1].surface_h, label=str(temp_bias)) #model.volume_km3_ts().plot() plt.plot(x, mod.fls[-1].surface_h, 'r:') plt.plot(x, mod.fls[-1].bed_h, 'k') plt.legend(title='temp_bias') plt.xlabel('Distance along the main flowline (m)') plt.ylabel('Altitude (m)') plt.title(gdir.rgi_id) utils.mkdir(os.path.join(cfg.PATHS['plot_dir'], 'bias_test')) plt.savefig(os.path.join(cfg.PATHS['plot_dir'], 'bias_test', gdir.rgi_id + '.png'), dpi=200) plt.show() return best_df