Пример #1
0
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()
Пример #2
0
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
Пример #3
0
        # 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$' +
Пример #4
0
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