def east_west_joint_run(xb, f_name): de = dc.DalecData( 2015, 2016, 'nee_day_east, c_roo_east, c_woo_east, clma, lai_east', nc_file='../../alice_holt_data/ah_data_daily_test_nee.nc') de.ob_err_dict['clma'] = (1. / 3.) * de.ob_err_dict['clma'] de.ob_err_dict['lai'] = (1. / 3.) * de.ob_err_dict['lai'] B = pickle.load(open('b_edc.p', 'r')) B = np.delete(B, 10, axis=0) B = 0.8 * np.delete(B, 10, axis=1) de.B = B #de.B = np.concatenate((de.edinburgh_std[:10], de.edinburgh_std[11:]))**2*np.eye(22) #A = pickle.load(open('A_D.p', 'r')) #A = np.delete(A, (10), axis=0) #A = np.delete(A, (10), axis=1) #de.B = 1.2*A dw = dc.DalecData( 2015, 2016, 'nee_day_west, c_roo_west, c_woo_west, clma, lai_west', nc_file='../../alice_holt_data/ah_data_daily_test_nee.nc') dw.ob_err_dict['clma'] = (1. / 3.) * dw.ob_err_dict['clma'] dw.ob_err_dict['lai'] = (1. / 3.) * dw.ob_err_dict['lai'] dw.B = B #dw.B = np.concatenate((de.edinburgh_std[:10], de.edinburgh_std[11:]))**2*np.eye(22) #dw.B = A me = mc_p.DalecModel(de) mw = mc_p.DalecModel(dw) xa_e = me.find_min_tnc_cvt(xb, f_name + 'east_assim') xa_w = mw.find_min_tnc_cvt(xb, f_name + 'west_assim') xbb = np.array( me.create_ordered_lst(np.array(xb.tolist()[0], dtype=np.float))) save_plots(f_name, xbb, xa_e[2], xa_w[2], de, dw) return 'done'
def east_west_joint_run_nee_err_no_r(xb, f_name, nee_scale=0, clma_er=1., lai_er=1., need_er=1., neen_er=1., cr_er=1., cw_er=1.): f_name += 'clmaer%r_laier%r_needer%r_neener%r_crer%r_cwer%r' % ( clma_er, lai_er, need_er, neen_er, cr_er, cw_er) # Construct B b_cor = pickle.load(open('b_edc_cor.p', 'r')) b_std = np.sqrt(np.diag(pickle.load(open('b_edc.p', 'r')))) b_std[10] = 0.25 * b_std[10] b_std[1] = 0.25 * b_std[1] b_std[0:17] = 0.5 * b_std[0:17] D = np.zeros_like(b_cor) np.fill_diagonal(D, b_std) b = 0.6 * np.dot(np.dot(D, b_cor), D) # east data de = dc.DalecData( 2015, 2016, 'nee_day_east, nee_night_east, c_roo_east, c_woo_east, clma, lai_east', nc_file='../../alice_holt_data/ah_data_daily_test_nee.nc', scale_nee=nee_scale) de.B = b # obs err scaling de.ob_err_dict['clma'] = clma_er * de.ob_err_dict['clma'] de.ob_err_dict['lai'] = lai_er * de.ob_err_dict['lai'] de.ob_err_dict['nee_day'] = need_er * de.ob_err_dict['nee_day'] de.ob_err_dict['nee_night'] = neen_er * de.ob_err_dict['nee_night'] de.ob_err_dict['c_roo'] = cr_er * de.ob_err_dict['c_roo'] de.ob_err_dict['c_woo'] = cw_er * de.ob_err_dict['c_woo'] # west data dw = dc.DalecData( 2015, 2016, 'nee_day_west, nee_night_west, c_roo_west, c_woo_west, clma, lai_west', nc_file='../../alice_holt_data/ah_data_daily_test_nee.nc', scale_nee=nee_scale) dw.B = b # obs err scaling dw.ob_err_dict['clma'] = clma_er * dw.ob_err_dict['clma'] dw.ob_err_dict['lai'] = lai_er * dw.ob_err_dict['lai'] dw.ob_err_dict['nee_day'] = need_er * dw.ob_err_dict['nee_day'] dw.ob_err_dict['nee_night'] = neen_er * dw.ob_err_dict['nee_night'] dw.ob_err_dict['c_roo'] = cr_er * dw.ob_err_dict['c_roo'] dw.ob_err_dict['c_woo'] = cw_er * dw.ob_err_dict['c_woo'] # setup model me = mc.DalecModel(de) mw = mc.DalecModel(dw) # run DA scheme xa_e = me.find_min_tnc_cvt(xb, f_name + 'east_assim') xa_w = mw.find_min_tnc_cvt(xb, f_name + 'west_assim') # save plots save_plots(f_name, xb, xa_e[1], xa_w[1], de, dw, me, mw) return 'done'
def east_west_joint_run_prior(xb, f_name, obs_str, b_mat, rm='None', end_yr=2014, start_yr=2012): if not os.path.exists(f_name): os.makedirs(f_name) # east data obs_east = ob_str_east_west(obs_str, 'east', rm_obs=rm) de = dc.DalecData( start_yr, end_yr, obs_east, nc_file='../../alice_holt_data/ah_data_daily_test_nee3.nc', scale_nee=0) de.B = b_mat # obs err scaling # west data obs_west = ob_str_east_west(obs_str, 'west', rm_obs=rm) dw = dc.DalecData( start_yr, end_yr, obs_west, nc_file='../../alice_holt_data/ah_data_daily_test_nee3.nc', scale_nee=0) dw.B = b_mat # obs err scaling # setup model me = mc.DalecModel(de) me.rmatrix = r_mat_corr(me.yerroblist, me.ytimestep, me.y_strlst, me.rmatrix, corr=0.3, tau=2.)[1] mw = mc.DalecModel(dw) mw.rmatrix = r_mat_corr(mw.yerroblist, mw.ytimestep, mw.y_strlst, mw.rmatrix, corr=0.3, tau=2.)[1] # run DA scheme xa_e = me.find_min_tnc_cvt(xb, f_name + 'east_assim') xa_w = mw.find_min_tnc_cvt(xb, f_name + 'west_assim') # save plots save_plots(f_name, xb, xa_e[1], xa_w[1], de, dw, me, mw) return 'done'
def calc_exp_vals(exp_name): east = pickle.load(open(exp_name + 'east_assim', 'r')) west = pickle.load(open(exp_name + 'west_assim', 'r')) b = 1.5 * east['b_mat'] # east data de = dc.DalecData( 2015, 2016, 'clma', nc_file='../../alice_holt_data/ah_data_daily_test_nee2.nc', scale_nee=1) de.B = b de.ob_dict = east['obs'] de.ob_err_dict = east['obs_err'] # obs err scaling # west data dw = dc.DalecData( 2015, 2016, 'clma', nc_file='../../alice_holt_data/ah_data_daily_test_nee2.nc', scale_nee=1) dw.B = b dw.ob_dict = west['obs'] dw.ob_err_dict = west['obs_err'] # obs err scaling # setup model me = mc.DalecModel(de) me.rmatrix = r_mat_corr(me.yerroblist, me.ytimestep, me.y_strlst, me.rmatrix, corr=0.3, tau=2.)[1] mw = mc.DalecModel(dw) mw.rmatrix = r_mat_corr(mw.yerroblist, mw.ytimestep, mw.y_strlst, mw.rmatrix, corr=0.3, tau=2.)[1] # a_east = pickle.load(open('a_east.p', 'r')) # a_west = pickle.load(open('a_west.p', 'r')) a_east = me.acovmat(east['xa']) a_west = mw.acovmat(west['xa']) e_ens = p.create_ensemble(de, a_east, east['xa']) w_ens = p.create_ensemble(de, a_west, west['xa']) p_e_ens = p.plist_ens(de, e_ens) p_w_ens = p.plist_ens(dw, w_ens) return east, west, de, dw, p_e_ens, p_w_ens
def east_west_joint_run_nee_err_r_errs(xb, f_name): # Construct B b_cor = pickle.load(open('b_edc_cor.p', 'r')) b_std = np.sqrt(np.diag(pickle.load(open('b_edc.p', 'r')))) b_std[10] = 0.25 * b_std[10] b_std[1] = 0.25 * b_std[1] #b_std[2] = 0.1*b_std[2] b_std[0:17] = b_std[0:17] * 0.5 D = np.zeros_like(b_cor) np.fill_diagonal(D, b_std) b = 0.6 * np.dot(np.dot(D, b_cor), D) #*0.6 # east data de = dc.DalecData( 2015, 2016, 'nee_east, nee_night_east, c_roo_east, c_woo_east, clma, lai_east', nc_file='../../alice_holt_data/ah_data_daily_test_nee2.nc', scale_nee=1) de.B = b # obs err scaling # west data dw = dc.DalecData( 2015, 2016, 'nee_west, nee_night_west, c_roo_west, c_woo_west, clma, lai_west', nc_file='../../alice_holt_data/ah_data_daily_test_nee2.nc', scale_nee=1) dw.B = b # obs err scaling # setup model me = mc.DalecModel(de) me.rmatrix = r_mat_corr(me.yerroblist, me.ytimestep, me.y_strlst, me.rmatrix, corr=0.3, tau=2.)[1] mw = mc.DalecModel(dw) mw.rmatrix = r_mat_corr(mw.yerroblist, mw.ytimestep, mw.y_strlst, mw.rmatrix, corr=0.3, tau=2.)[1] # run DA scheme xa_e = me.find_min_tnc_cvt(xb, f_name + 'east_assim') xa_w = mw.find_min_tnc_cvt(xb, f_name + 'west_assim') # save plots save_plots(f_name, xb, xa_e[1], xa_w[1], de, dw, me, mw) return 'done'
def east_west_joint_run_ceff_a(xb, f_name): de = dc.DalecData( 2015, 2016, 'nee_day_east, nee_night_east, c_roo_east, c_woo_east, clma, lai_east', nc_file='../../alice_holt_data/ah_data_daily_test_nee.nc', scale_nee=1) de.ob_err_dict['clma'] = 0.33 * de.ob_err_dict['clma'] de.ob_err_dict['lai'] = 0.33 * de.ob_err_dict['lai'] B = pickle.load(open('a_cov.p', 'r')) B = np.delete(B, 10, axis=0) B = np.delete(B, 10, axis=1) #de.B = np.concatenate((de.edinburgh_std[:10], de.edinburgh_std[11:]))**2*np.eye(22) #A = pickle.load(open('A_D.p', 'r')) #A = np.delete(A, (10), axis=0) #A = np.delete(A, (10), axis=1) de.B = B dw = dc.DalecData( 2015, 2016, 'nee_day_west, nee_night_west, c_roo_west, c_woo_west, clma, lai_west', nc_file='../../alice_holt_data/ah_data_daily_test_nee.nc', scale_nee=1) dw.ob_err_dict['clma'] = 0.33 * dw.ob_err_dict['clma'] dw.ob_err_dict['lai'] = 0.33 * dw.ob_err_dict['lai'] dw.B = B #dw.B = np.concatenate((de.edinburgh_std[:10], de.edinburgh_std[11:]))**2*np.eye(22) #dw.B = A me = mc_p.DalecModel(de) me.rmatrix = r_mat_corr(me.yerroblist, me.ytimestep, me.y_strlst, me.rmatrix, corr=0.3, tau=2.)[1] mw = mc_p.DalecModel(dw) mw.rmatrix = r_mat_corr(mw.yerroblist, mw.ytimestep, mw.y_strlst, mw.rmatrix, corr=0.3, tau=2.)[1] xa_e = me.find_min_tnc_cvt(xb, f_name + 'east_assim') xa_w = mw.find_min_tnc_cvt(xb, f_name + 'west_assim') xbb = np.array( me.create_ordered_lst(np.array(xb.tolist()[0], dtype=np.float))) save_plots(f_name, xbb, xa_e[2], xa_w[2], de, dw, me, mw) return 'done'
def test_costfn(alph=1e-9): """Test for cost and gradcost functions. """ d = dC.DalecData(50, 'nee') m = mc.DalecModel(d) gradj = m.gradcost(d.pvals) h = gradj * (np.linalg.norm(gradj))**(-1) j = m.cost(d.pvals) jalph = m.cost(d.pvals + alph * h) print(jalph - j) / (np.dot(alph * h, gradj)) assert (jalph - j) / (np.dot(alph * h, gradj)) < 1.0001
def run_4dvar_desroziers(pvals, east_west): d = dc.DalecData(2015, 2016, 'nee_day_'+east_west+', nee_night_'+east_west+', c_roo_'+east_west+',' ' c_woo_'+east_west+', clma, lai_'+east_west, nc_file='../../alice_holt_data/ah_data_daily_test_nee.nc') d.B = b d.ob_err_dict['clma'] = 0.33 * d.ob_err_dict['clma'] d.ob_err_dict['lai'] = 0.33 * d.ob_err_dict['lai'] m = mc.DalecModel(d) m.yoblist = perturb_obs(m.yoblist, m.yerroblist) out = m.find_min_tnc_cvt(pvals, dispp=0) return m.yoblist, pvals, out
def r_estimate(yoblist, pvals, out, east_west): d = dc.DalecData(2015, 2016, 'nee_day_'+east_west+', nee_night_'+east_west+', c_roo_'+east_west+',' ' c_woo_'+east_west+', clma, lai_'+east_west, nc_file='../../alice_holt_data/ah_data_daily_test_nee.nc') d.B = b m = mc.DalecModel(d) m.yoblist = yoblist pvallistxb = m.mod_list(pvals) pvallistxa = m.mod_list(out) yhxb = m.yoblist - m.hxcost(pvallistxb) yhxa = m.yoblist - m.hxcost(pvallistxa) r_estimate = np.dot(np.matrix(yhxa).T, np.matrix(yhxb)) return r_estimate
def test_linmod(gamma=1e1): """ Test from TLM to check it converges. """ d = dC.DalecData(731, 'nee') pvals = d.pvals m = mc.DalecModel(d) cx, matlist = m.linmod_list(pvals) pvals2 = pvals * (1 + 0.3 * gamma) cxdx = m.mod_list(pvals2)[-1] pvals3 = pvals * (0.3 * gamma) dxl = np.linalg.norm(np.dot(m.mfac(matlist, 730), pvals3.T)) dxn = np.linalg.norm(cxdx - cx - dxl) return dxl / dxn
def east_west_run_b(f_name, east_west, net_file="None"): if east_west == 'east': obs = 'nee_day_east, nee_night_east, clma, lai_east, c_woo_east, c_roo_east' elif east_west == 'west': obs = 'nee_day_west, nee_night_west, clma, lai_west, c_woo_west, c_roo_west' if net_file != "None": d = dc.DalecData(2015, 2016, obs, nc_file=net_file) else: d = dc.DalecData(2015, 2016, obs) m = mc.DalecModel(d) assim_results, xa = m.find_min_tnc_cvt(d.edinburgh_mean, f_name + '_assim_res') # Plot 4dvar time series ax, fig = p.plot_4dvar('nee', d, xb=d.edinburgh_mean, xa=xa) fig.savefig(f_name + '_nee.png', bbox_inches='tight') ax, fig = p.plot_4dvar('nee_day', d, xb=d.edinburgh_mean, xa=xa) fig.savefig(f_name + '_need.png', bbox_inches='tight') ax, fig = p.plot_4dvar('nee_night', d, xb=d.edinburgh_mean, xa=xa) fig.savefig(f_name + '_neen.png', bbox_inches='tight') ax, fig = p.plot_4dvar('lai', d, xb=d.edinburgh_mean, xa=xa) fig.savefig(f_name + '_lai.png', bbox_inches='tight') ax, fig = p.plot_4dvar('c_woo', d, xb=d.edinburgh_mean, xa=xa) fig.savefig(f_name + '_cwoo.png', bbox_inches='tight') ax, fig = p.plot_4dvar('c_roo', d, xb=d.edinburgh_mean, xa=xa) fig.savefig(f_name + '_croo.png', bbox_inches='tight') # Plot scatter plots of obs ax, fig = p.plot_scatter('nee_day', xa, d, len(d.I), 'a') fig.savefig(f_name + '_need_scat.png', bbox_inches='tight') ax, fig = p.plot_scatter('nee_night', xa, d, len(d.I), 'a') fig.savefig(f_name + '_neen_scat.png', bbox_inches='tight') # Plot error in analysis and background ax, fig = p.plot_a_inc(d.edinburgh_mean, xa, east_west) fig.savefig(f_name + '_xa_inc.png', bbox_inches='tight') return 'all experimented'
def test_cost(alph=1e-8, vect=0): """Test for cost and gradcost functions. """ d = dC.DalecData(365, 'nee') m = mc.DalecModel(d) pvals = d.edinburghmean gradj = m.gradcost2(pvals) if vect == True: h = pvals * (np.linalg.norm(pvals))**(-1) else: h = gradj * (np.linalg.norm(gradj))**(-1) j = m.cost(pvals) jalph = m.cost(pvals + alph * h) print jalph - j print np.dot(alph * h, gradj) return (jalph - j) / (np.dot(alph * h, gradj))
def run_assimilation(yr): d = ahd.DalecData( yr, yr + 1, 'nee, nee_day, nee_night', nc_file='../../alice_holt_data/ah_data_daily_test_nee3.nc') m = mc.DalecModel(d) find_min, xa = m.find_min_tnc_cvt(d.xb_ew_lai_hi) result_dic = {} result_dic['time'] = [t.strftime('%m/%d/%Y') for t in d.dates] result_dic['incident_radiation'] = d.I.tolist() result_dic['t_mean'] = d.t_mean.tolist() result_dic['doy'] = d.D.tolist() mod_lst_xb = m.mod_list(d.xb_ew_lai_hi) result_dic['nee_day_xb'] = m.oblist('nee_day', mod_lst_xb).tolist() result_dic['nee_xb'] = m.oblist('nee', mod_lst_xb).tolist() mod_lst_xa = m.mod_list(xa) result_dic['nee_day_xa'] = m.oblist('nee_day', mod_lst_xa).tolist() result_dic['nee_xa'] = m.oblist('nee', mod_lst_xa).tolist() return result_dic
def return_a_mat(pick_dict): b = pick_dict['b_mat'] #1.5*pick_dict['b_mat'] # east data d = dc.DalecData( 2015, 2016, 'clma', nc_file='../../alice_holt_data/ah_data_daily_test_nee2.nc', scale_nee=1) d.B = b d.ob_dict = pick_dict['obs'] d.ob_err_dict = pick_dict['obs_err'] # obs err scaling # west data # obs err scaling # setup model m = mc.DalecModel(d) m.rmatrix = pick_dict['rmat'] a_cov = m.acovmat(pick_dict['xa']) return a_cov
def east_west_run(f_name, ob_list, east_west): ob_str = '' for ob in ob_list: if ob == 'clma': ob_str += ob + ',' else: ob_str += ob + '_' + east_west + ',' d = dc.DalecData(2015, 2016, ob_str) d.B = d.make_b(d.edinburgh_std) m = mc.DalecModel(d) assim_results, xa = m.find_min_tnc_cvt(d.edinburgh_mean, f_name + '_assim_res') # Plot 4dvar time series ax, fig = p.plot_4dvar('nee', d, xb=d.edinburgh_mean, xa=xa) fig.savefig(f_name + '_nee.png', bbox_inches='tight') ax, fig = p.plot_4dvar('nee_day', d, xb=d.edinburgh_mean, xa=xa) fig.savefig(f_name + '_need.png', bbox_inches='tight') ax, fig = p.plot_4dvar('nee_night', d, xb=d.edinburgh_mean, xa=xa) fig.savefig(f_name + '_neen.png', bbox_inches='tight') ax, fig = p.plot_4dvar('lai', d, xb=d.edinburgh_mean, xa=xa) fig.savefig(f_name + '_lai.png', bbox_inches='tight') ax, fig = p.plot_4dvar('c_woo', d, xb=d.edinburgh_mean, xa=xa) fig.savefig(f_name + '_cwoo.png', bbox_inches='tight') ax, fig = p.plot_4dvar('c_roo', d, xb=d.edinburgh_mean, xa=xa) fig.savefig(f_name + '_croo.png', bbox_inches='tight') # Plot scatter plots of obs ax, fig = p.plot_scatter('nee_day', xa, d, len(d.I), 'a') fig.savefig(f_name + '_need_scat.png', bbox_inches='tight') ax, fig = p.plot_scatter('nee_night', xa, d, len(d.I), 'a') fig.savefig(f_name + '_neen_scat.png', bbox_inches='tight') # Plot error in analysis and background ax, fig = p.plot_a_inc(d.edinburgh_mean, xa, east_west) fig.savefig(f_name + '_xa_inc.png', bbox_inches='tight') return 'all experimented'
def plot_cum_nee(f_name, exp_name, f_typ='pdf', exp='a'): sns.set_context('poster', font_scale=1., rc={ 'lines.linewidth': 1.5, 'lines.markersize': 1. }) sns.set_style('whitegrid') if not os.path.exists(f_name): os.makedirs(f_name) east = pickle.load(open(exp_name + 'east_assim', 'r')) west = pickle.load(open(exp_name + 'west_assim', 'r')) b = 1.5 * east['b_mat'] # east data de = dc.DalecData( 2015, 2016, 'clma', nc_file='../../alice_holt_data/ah_data_daily_test_nee2.nc', scale_nee=1) de.B = b de.ob_dict = east['obs'] de.ob_err_dict = east['obs_err'] # obs err scaling # west data dw = dc.DalecData( 2015, 2016, 'clma', nc_file='../../alice_holt_data/ah_data_daily_test_nee2.nc', scale_nee=1) dw.B = b dw.ob_dict = west['obs'] dw.ob_err_dict = west['obs_err'] # obs err scaling # setup model me = mc.DalecModel(de) me.rmatrix = r_mat_corr(me.yerroblist, me.ytimestep, me.y_strlst, me.rmatrix, corr=0.3, tau=2.)[1] mw = mc.DalecModel(dw) mw.rmatrix = r_mat_corr(mw.yerroblist, mw.ytimestep, mw.y_strlst, mw.rmatrix, corr=0.3, tau=2.)[1] # a_east = pickle.load(open('a_east.p', 'r')) # a_west = pickle.load(open('a_west.p', 'r')) a_east = me.acovmat(east['xa']) a_west = mw.acovmat(west['xa']) e_ens = p.create_ensemble(de, a_east, east['xa']) w_ens = p.create_ensemble(de, a_west, west['xa']) p_e_ens = p.plist_ens(de, e_ens) p_w_ens = p.plist_ens(dw, w_ens) plot, ob_std_e, ob_std_w = p.plot_east_west_paper_cum2( 'nee', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label='Cumulative NEE (g C m$^{-2}$)') plot[1].savefig(f_name + 'nee_cum.' + f_typ, bbox_inches='tight') return east['xa'], west['xa'], de, dw, ob_std_e, ob_std_w
def save_paper_plots(f_name, exp_name): east = pickle.load(open(exp_name + 'east_assim', 'r')) west = pickle.load(open(exp_name + 'west_assim', 'r')) #b_cor = pickle.load(open('b_edc_cor.p', 'r')) #b_std = np.sqrt(np.diag(pickle.load(open('b_edc.p', 'r')))) #b_std[10] = 0.2*b_std[10] #b_std[1] = 0.2*b_std[1] #b_std[2] = 0.1*b_std[2] #b_std[0:17] = b_std[0:17]*0.5 #D = np.zeros_like(b_cor) #np.fill_diagonal(D, b_std) #b = 0.6*np.dot(np.dot(D, b_cor), D) #*0.6 b = east['b_mat'] # east data de = dc.DalecData( 2015, 2016, 'clma', nc_file='../../alice_holt_data/ah_data_daily_test_nee2.nc', scale_nee=1) de.B = b de.ob_dict = east['obs'] de.ob_err_dict = east['obs_err'] # obs err scaling # west data dw = dc.DalecData( 2015, 2016, 'clma', nc_file='../../alice_holt_data/ah_data_daily_test_nee2.nc', scale_nee=1) dw.B = b dw.ob_dict = west['obs'] dw.ob_err_dict = west['obs_err'] # obs err scaling # setup model me = mc.DalecModel(de) me.rmatrix = r_mat_corr(me.yerroblist, me.ytimestep, me.y_strlst, me.rmatrix, corr=0.3, tau=2.)[1] mw = mc.DalecModel(dw) mw.rmatrix = r_mat_corr(mw.yerroblist, mw.ytimestep, mw.y_strlst, mw.rmatrix, corr=0.3, tau=2.)[1] # a_east = pickle.load(open('a_east.p', 'r')) # a_west = pickle.load(open('a_west.p', 'r')) a_east = me.acovmat(east['xa']) a_west = mw.acovmat(west['xa']) ax, fig = p.plot_east_west_paper( 'rh', east['xa'], west['xa'], de, dw, a_east, a_west, y_label=r'Heterotrophic respiration (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'rh.pdf', bbox_inches='tight') ax, fig = p.plot_east_west_paper( 'nee_day', east['xa'], west['xa'], de, dw, a_east, a_west, y_label=r'NEE$_{day}$ (g C m$^{-2}$ day$^{-1}$)', y_lim=[-15, 5]) fig.savefig(f_name + 'nee_day.pdf', bbox_inches='tight') ax, fig = p.plot_east_west_paper_cum( 'nee_day', east['xa'], west['xa'], de, dw, a_east, a_west, y_label='Cumulative NEE (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'nee_day_cum.pdf', bbox_inches='tight') ax, fig = p.plot_east_west_paper_cum( 'nee', east['xa'], west['xa'], de, dw, a_east, a_west, y_label='Cumulative NEE (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'nee_cum.pdf', bbox_inches='tight') ax, fig = p.plot_east_west_paper( 'nee_night', east['xa'], west['xa'], de, dw, a_east, a_west, y_label=r'NEE$_{night}$ (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'nee_night.pdf', bbox_inches='tight') ax, fig = p.plot_east_west_paper( 'gpp', east['xa'], west['xa'], de, dw, a_east, a_west, y_label=r'Gross primary production (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'gpp.pdf', bbox_inches='tight') ax, fig = p.plot_east_west_paper_cum( 'gpp', east['xa'], west['xa'], de, dw, a_east, a_west, y_label='Cumulative GPP (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'gpp_cum.pdf', bbox_inches='tight') ax, fig = p.plot_east_west_paper('lai', east['xa'], west['xa'], de, dw, a_east, a_west, y_label=r'Leaf area index') fig.savefig(f_name + 'lai.pdf', bbox_inches='tight') ax, fig = p.plot_east_west_paper( 'c_woo', east['xa'], west['xa'], de, dw, a_east, a_west, y_label=r'Woody biomass and coarse root carbon (g C m$^{-2}$)', y_lim=[9000, 14500]) fig.savefig(f_name + 'c_woo.pdf', bbox_inches='tight') ax, fig = p.plot_east_west_paper( 'ra', east['xa'], west['xa'], de, dw, a_east, a_west, y_label=r'Autotrophic respiration (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'ra.pdf', bbox_inches='tight') ax, fig = p.plot_east_west_paper( 'rt', east['xa'], west['xa'], de, dw, a_east, a_west, y_label=r'Total ecosystem respiration (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'rt.pdf', bbox_inches='tight') ax, fig = p.plot_east_west_paper_cum( 'rt', east['xa'], west['xa'], de, dw, a_east, a_west, y_label='Cumulative ecosystem respiration (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'rt_cum.pdf', bbox_inches='tight') ax, fig = p.plot_inc_east_west(east['xb'], east['xa'], west['xa']) fig.savefig(f_name + 'xa_inc.pdf', bbox_inches='tight') return 'done!'
import data_class as dc import mod_class as mc import numpy as np import sympy as smp import plot as p import re import os import pickle import matplotlib.pyplot as plt import seaborn as sns d = dc.DalecData(2015, 2016, 'clma', nc_file='../../alice_holt_data/ah_data_daily_test_nee2.nc', scale_nee=0) def experiment_bmat(f_name): # Construct B b_cor = pickle.load(open('b_edc_cor.p', 'r')) b_std = np.sqrt(np.diag(pickle.load(open('b_edc.p', 'r')))) b_std[0:17] = b_std[0:17] * 0.5 D = np.zeros_like(b_cor) np.fill_diagonal(D, b_std) b = 0.8 * np.dot(np.dot(D, b_cor), D) #*0.6 experiment(f_name, b) return 'done!' def experiment_bmat_ceff(f_name):
def east_west_joint_run_nee_err_a(xb, f_name, nee_scale=0, clma_er=1., lai_er=1., need_er=1., neen_er=1., cr_er=1., cw_er=1.): f_name += 'clmaer%r_laier%r_needer%r_neener%r_crer%r_cwer%r' % ( clma_er, lai_er, need_er, neen_er, cr_er, cw_er) # Construct B b = 0.6 * pickle.load(open('a_cov.p', 'r')) # b = pickle.load(open('b_edc.p', 'r')) # east data de = dc.DalecData( 2015, 2016, 'nee_day_east, nee_night_east, c_woo_east, clma, lai_east', nc_file='../../alice_holt_data/ah_data_daily_test_nee.nc', scale_nee=nee_scale) de.B = b # obs err scaling de.ob_err_dict['clma'] = clma_er * de.ob_err_dict['clma'] de.ob_err_dict['lai'] = lai_er * de.ob_err_dict['lai'] de.ob_err_dict['nee_day'] = need_er * de.ob_err_dict['nee_day'] de.ob_err_dict['nee_night'] = neen_er * de.ob_err_dict['nee_night'] # de.ob_err_dict['c_roo'] = cr_er * de.ob_err_dict['c_roo'] de.ob_err_dict['c_woo'] = cw_er * de.ob_err_dict['c_woo'] # west data dw = dc.DalecData( 2015, 2016, 'nee_day_west, nee_night_west, c_woo_west, clma, lai_west', nc_file='../../alice_holt_data/ah_data_daily_test_nee.nc', scale_nee=nee_scale) dw.B = b # obs err scaling dw.ob_err_dict['clma'] = clma_er * dw.ob_err_dict['clma'] dw.ob_err_dict['lai'] = lai_er * dw.ob_err_dict['lai'] dw.ob_err_dict['nee_day'] = need_er * dw.ob_err_dict['nee_day'] dw.ob_err_dict['nee_night'] = neen_er * dw.ob_err_dict['nee_night'] # dw.ob_err_dict['c_roo'] = cr_er * dw.ob_err_dict['c_roo'] dw.ob_err_dict['c_woo'] = cw_er * dw.ob_err_dict['c_woo'] # setup model me = mc.DalecModel(de) me.rmatrix = r_mat_corr(me.yerroblist, me.ytimestep, me.y_strlst, me.rmatrix, corr=0.3, tau=2.)[1] mw = mc.DalecModel(dw) mw.rmatrix = r_mat_corr(mw.yerroblist, mw.ytimestep, mw.y_strlst, mw.rmatrix, corr=0.3, tau=2.)[1] # run DA scheme xa_e = me.find_min_tnc_cvt(xb, f_name + 'east_assim') xa_w = mw.find_min_tnc_cvt(xb, f_name + 'west_assim') # save plots save_plots(f_name, xb, xa_e[1], xa_w[1], de, dw, me, mw) return 'done'
def save_paper_plots(f_name, exp_name, f_typ='pdf', exp='a'): if not os.path.exists(f_name): os.makedirs(f_name) east = pickle.load(open(exp_name + 'east_assim', 'r')) west = pickle.load(open(exp_name + 'west_assim', 'r')) b = 1.5 * east['b_mat'] # east data de = dc.DalecData( 2015, 2016, 'clma', nc_file='../../alice_holt_data/ah_data_daily_test_nee2.nc', scale_nee=1) de.B = b de.ob_dict = east['obs'] de.ob_err_dict = east['obs_err'] # obs err scaling # west data dw = dc.DalecData( 2015, 2016, 'clma', nc_file='../../alice_holt_data/ah_data_daily_test_nee2.nc', scale_nee=1) dw.B = b dw.ob_dict = west['obs'] dw.ob_err_dict = west['obs_err'] # obs err scaling # setup model me = mc.DalecModel(de) me.rmatrix = r_mat_corr(me.yerroblist, me.ytimestep, me.y_strlst, me.rmatrix, corr=0.3, tau=2.)[1] mw = mc.DalecModel(dw) mw.rmatrix = r_mat_corr(mw.yerroblist, mw.ytimestep, mw.y_strlst, mw.rmatrix, corr=0.3, tau=2.)[1] # a_east = pickle.load(open('a_east.p', 'r')) # a_west = pickle.load(open('a_west.p', 'r')) a_east = me.acovmat(east['xa']) a_west = mw.acovmat(west['xa']) e_ens = p.create_ensemble(de, a_east, east['xa']) w_ens = p.create_ensemble(de, a_west, west['xa']) p_e_ens = p.plist_ens(de, e_ens) p_w_ens = p.plist_ens(dw, w_ens) annual_flux_lst = [] if exp == 'a': cwoo_ylim = [0, 16000] else: cwoo_ylim = [9000, 14500] # set context sns.set_context('poster', font_scale=1., rc={ 'lines.linewidth': .8, 'lines.markersize': 1. }) sns.set_style('whitegrid') # joint plots ax, fig = p.plot_east_west_paper_part( east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'Cumulative fluxes (g C m$^{-2}$)') fig.savefig(f_name + 'cum_flux.' + f_typ, bbox_inches='tight') #ax, fig = p.plot_obs_east_west_part(east['xa'], de) #fig.savefig(f_name+'resp_part_e.'+f_typ, bbox_inches='tight') #ax, fig = p.plot_obs_east_west_part(west['xa'], de) #fig.savefig(f_name+'resp_part_w.'+f_typ, bbox_inches='tight') fig = p.part_plot(east['xa'], west['xa'], de, dw) fig.savefig(f_name + 'resp_part.' + f_typ, bbox_inches='tight') f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2) # Observed values p.plot_east_west_paper('nee_day', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'NEE$_{day}$ (g C m$^{-2}$ day$^{-1}$)', y_lim=[-15, 5], axes=ax1) ax1.set_title(r'a) Daytime NEE') #, y=1.06) p.plot_east_west_paper('nee_night', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'NEE$_{night}$ (g C m$^{-2}$ day$^{-1}$)', axes=ax2) ax2.set_title(r'b) Nighttime NEE') #, y=1.06) p.plot_east_west_paper('lai', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'Leaf area index', axes=ax3) ax3.set_title(r'c) Leaf area index') #, y=1.06) p.plot_east_west_paper('c_woo', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'C$_{woo}$ (g C m$^{-2}$)', y_lim=cwoo_ylim, axes=ax4) # [9000, 14500][3000, 14500] ax4.set_title(r'd) Woody and coarse root carbon') #, y=1.06) f.tight_layout() #f.subplots_adjust(hspace=.5) f.savefig(f_name + 'obs_comp.' + f_typ) #, bbox_inches='tight') f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2) # Fluxes p.plot_east_west_paper('gpp', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'GPP (g C m$^{-2}$ day$^{-1}$)', axes=ax1) ax1.set_title(r'a) Gross primary productivity') #, y=1.06) p.plot_east_west_paper('rt', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'R$_{eco}$ (g C m$^{-2}$ day$^{-1}$)', axes=ax2) ax2.set_title(r'b) Total ecosystem respiration') #, y=1.06) p.plot_east_west_paper('ra', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'R$_{a}$ (g C m$^{-2}$ day$^{-1}$)', axes=ax3) ax3.set_title(r'c) Autotrophic respiration') #, y=1.06) p.plot_east_west_paper('rh', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'R$_{h}$ (g C m$^{-2}$ day$^{-1}$)', axes=ax4) ax4.set_title(r'd) Heterotrophic respiration') #, y=1.06) f.tight_layout() #f.subplots_adjust(hspace=.5) f.savefig(f_name + 'flux_comp.' + f_typ) # std dev reduction ax, fig = p.plot_var_red_east_west(b, a_east, a_west) fig.savefig(f_name + 'var_red.' + f_typ, bbox_inches='tight') sns.set_style('whitegrid') ax, fig = p.plot_east_west_paper_part( east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label='Cumulative NEE partitioning (g C m$^{-2}$)') fig.savefig(f_name + 'nee_cum_part.' + f_typ, bbox_inches='tight') ax, fig = p.plot_east_west_paper( 'rh', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'Heterotrophic respiration (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'rh.' + f_typ, bbox_inches='tight') ax, fig = p.plot_east_west_paper( 'nee_day', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'NEE$_{day}$ (g C m$^{-2}$ day$^{-1}$)', y_lim=[-15, 5]) fig.savefig(f_name + 'nee_day.' + f_typ, bbox_inches='tight') # ax, fig, cum_east, cum_west = p.plot_east_west_paper_cum('nee_day', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, # y_label='Cumulative NEE (g C m$^{-2}$ day$^{-1}$)') # fig.savefig(f_name+'nee_day_cum.png', bbox_inches='tight') ax, fig, cum_east, cum_west = p.plot_east_west_paper_cum( 'nee', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label='Cumulative NEE (g C m$^{-2}$)') fig.savefig(f_name + 'nee_cum.' + f_typ, bbox_inches='tight') annual_flux_lst.append(cum_east) annual_flux_lst.append(cum_west) ax, fig = p.plot_east_west_paper( 'nee_night', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'NEE$_{night}$ (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'nee_night.' + f_typ, bbox_inches='tight') ax, fig = p.plot_east_west_paper( 'gpp', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'Gross primary production (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'gpp.' + f_typ, bbox_inches='tight') ax, fig, cum_east, cum_west = p.plot_east_west_paper_cum( 'gpp', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label='Cumulative GPP (g C m$^{-2}$)') fig.savefig(f_name + 'gpp_cum.' + f_typ, bbox_inches='tight') annual_flux_lst.append(cum_east) annual_flux_lst.append(cum_west) ax, fig = p.plot_east_west_paper('lai', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'Leaf area index') fig.savefig(f_name + 'lai.' + f_typ, bbox_inches='tight') ax, fig = p.plot_east_west_paper( 'c_woo', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'Woody biomass and coarse root carbon (g C m$^{-2}$)', y_lim=cwoo_ylim) fig.savefig(f_name + 'c_woo.' + f_typ, bbox_inches='tight') ax, fig = p.plot_east_west_paper( 'ra', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'Autotrophic respiration (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'ra.' + f_typ, bbox_inches='tight') ax, fig = p.plot_east_west_paper( 'rt', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label=r'Total ecosystem respiration (g C m$^{-2}$ day$^{-1}$)') fig.savefig(f_name + 'rt.' + f_typ, bbox_inches='tight') ax, fig, cum_east, cum_west = p.plot_east_west_paper_cum( 'rt', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, y_label='Cumulative ecosystem respiration (g C m$^{-2}$)') fig.savefig(f_name + 'rt_cum.' + f_typ, bbox_inches='tight') annual_flux_lst.append(cum_east) annual_flux_lst.append(cum_west) ax, fig = p.plot_inc_east_west(east['xb'], east['xa'], west['xa']) fig.savefig(f_name + 'xa_inc.' + f_typ, bbox_inches='tight') ax, fig = p.plot_rmat(p.cov2cor(east['rmat'])) fig.savefig(f_name + 'rmat_east.pdf', bbox_inches='tight') ax, fig = p.plot_rmat(p.cov2cor(west['rmat'])) fig.savefig(f_name + 'rmat_west.pdf', bbox_inches='tight') f = open(f_name + 'annual_fluxes.txt', 'w') for item in annual_flux_lst: f.write("%s\n" % item) f.close() return 'done!'
def save_paper_plots_test(f_name, exp_name): if not os.path.exists(f_name): os.makedirs(f_name) east = pickle.load(open(exp_name + 'east_assim', 'r')) west = pickle.load(open(exp_name + 'west_assim', 'r')) b = east['b_mat'] # east data de = dc.DalecData( 2015, 2016, 'clma', nc_file='../../alice_holt_data/ah_data_daily_test_nee3.nc', scale_nee=1) de_all = dc.DalecData( 2015, 2016, 'clma, nee_day_east, nee_night_east, lai_east, c_woo_east', nc_file='../../alice_holt_data/ah_data_daily_test_nee3.nc', scale_nee=1) de.B = b de.ob_dict = east['obs'] de.ob_err_dict = east['obs_err'] # obs err scaling # west data dw = dc.DalecData( 2015, 2016, 'clma', nc_file='../../alice_holt_data/ah_data_daily_test_nee3.nc', scale_nee=1) dw_all = dc.DalecData( 2015, 2016, 'clma, nee_day_west, nee_night_west, lai_west, c_woo_west', nc_file='../../alice_holt_data/ah_data_daily_test_nee3.nc', scale_nee=1) dw.B = b dw.ob_dict = west['obs'] dw.ob_err_dict = west['obs_err'] # obs err scaling # setup model me = mc.DalecModel(de) me.rmatrix = r_mat_corr(me.yerroblist, me.ytimestep, me.y_strlst, me.rmatrix, corr=0.3, tau=2.)[1] mw = mc.DalecModel(dw) mw.rmatrix = r_mat_corr(mw.yerroblist, mw.ytimestep, mw.y_strlst, mw.rmatrix, corr=0.3, tau=2.)[1] # a_east = pickle.load(open('a_east.p', 'r')) # a_west = pickle.load(open('a_west.p', 'r')) a_east = me.acovmat(east['xa']) a_west = mw.acovmat(west['xa']) e_ens = p.create_ensemble(de, a_east, east['xa']) w_ens = p.create_ensemble(de, a_west, west['xa']) p_e_ens = p.plist_ens(de, e_ens) p_w_ens = p.plist_ens(dw, w_ens) ax, fig = p.plot_var_red_east_west(b, a_east, a_west) ax.set_ylim([0, 100]) fig.savefig(f_name + 'var_red.png', bbox_inches='tight') sns.set_context('poster', font_scale=1., rc={ 'lines.linewidth': .8, 'lines.markersize': 1. }) sns.set_style('whitegrid') #de.ob_err_dict['lai']=np.sqrt(de.ob_err_dict['lai']) #dw.ob_err_dict['lai']=np.sqrt(dw.ob_err_dict['lai']) #ax, fig = p.plot_east_west_paper_part(east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, # y_label='Cumulative NEE partitioning (g C m$^{-2}$)') #fig.savefig(f_name+'nee_cum_part.png', bbox_inches='tight') #f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2) # Observed values #p.plot_east_west_paper('nee_day', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, # y_label=r'NEE$_{day}$ (g C m$^{-2}$ day$^{-1}$)', y_lim=[-14, 6], axes=ax1, # de_obdic=de_all,dw_obdic=dw_all) #ax1.set_ylim([-14, 6]) #ax1.set_title(r'a) Daytime NEE')#, y=1.06) #p.plot_east_west_paper('nee_night', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, # y_label=r'NEE$_{night}$ (g C m$^{-2}$ day$^{-1}$)', y_lim=[-14, 6], # axes=ax2, de_obdic=de_all, # dw_obdic=dw_all) #ax2.set_ylim([-14, 6]) #ax2.set_title(r'b) Nighttime NEE')#, y=1.06) #p.plot_east_west_paper('lai', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, # y_label=r'Leaf area index', y_lim=[0, 5], axes=ax3, de_obdic=de_all, # dw_obdic=dw_all) #ax3.set_ylim([0, 5]) #ax3.set_title(r'c) Leaf area index')#, y=1.06) #p.plot_east_west_paper('c_woo', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, # y_label=r'C$_{woo}$ (g C m$^{-2}$)', # y_lim=[9000, 14500], axes=ax4, de_obdic=de_all, # dw_obdic=dw_all) #ax4.set_ylim([0, 18000]) #ax4.set_title(r'd) Woody and coarse root carbon')#, y=1.06) #f.tight_layout() #f.subplots_adjust(hspace=.5) #f.savefig(f_name+'obs_comp.pdf') #, bbox_inches='tight') #f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2) # Fluxes #p.plot_east_west_paper('gpp', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, # y_label=r'GPP (g C m$^{-2}$ day$^{-1}$)', axes=ax1) #ax1.set_title(r'a) Gross primary productivity')#, y=1.06) #p.plot_east_west_paper('rt', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, # y_label=r'R$_{eco}$ (g C m$^{-2}$ day$^{-1}$)', axes=ax2) #ax2.set_title(r'b) Total ecosystem respiration')#, y=1.06) #p.plot_east_west_paper('ra', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, # y_label=r'R$_{a}$ (g C m$^{-2}$ day$^{-1}$)', axes=ax3) #ax3.set_title(r'c) Autotrophic respiration')#, y=1.06) #p.plot_east_west_paper('rh', east['xa'], west['xa'], de, dw, p_e_ens, p_w_ens, # y_label=r'R$_{h}$ (g C m$^{-2}$ day$^{-1}$)', axes=ax4) #ax4.set_title(r'd) Heterotrophic respiration')#, y=1.06) #f.tight_layout() #f.subplots_adjust(hspace=.5) #f.savefig(f_name+'flux_comp.pdf') #, bbox_inches='tight') return 'done!'