def plot_Es_phaseplots(sp, params, VPD, newfig=True): # Returns parameters derived from plant traits: sw, sst, Emax, s_P90, s_Pg12, L_root # the argument sp accepts species name as a string, or as a plant class if type(sp) is str: plant = initialize_plant(sp, params) else: plant = sp Flux, P_soil = get_fluxes(plant, VPD, s) E = Flux[:,0]; P_stem = Flux[:,1] # deriving indices to calculate sigma diffP = P_soil - P_stem diffmax = np.max(diffP) diffmin = 0.01*diffmax imax = np.argmax(diffP) imin = np.where(diffP<diffmin)[0] ilastmin = np.argmax(imin[:-1] - imin[1:] != -1) if newfig: plt.figure(figsize=(6,4.5)) else:plt.figure(1,figsize=(6,4.5)) plt.plot(s, E); plt.ylabel('m/s') plt.title('ET vs. soil moisture') if newfig: plt.figure(figsize=(6,4.5)) else:plt.figure(2,figsize=(6,4.5)) plt.plot(s, P_soil-P_stem); plt.ylabel('MPa') plt.plot(s[imax], diffP[imax], 'ro') plt.plot(s[ilastmin], diffP[ilastmin], 'bo') plt.title('Predawn - midday vs. soil moisture')
def plot_sigma_trait_dependence(trait_name, part_name, trait_arr, plot_arr): par_modified = copy.deepcopy(params) sigma_arr = np.zeros(len(shift_range)) for i, trait_val in enumerate(trait_arr): print i, trait_val, par_modified[sp][part_name][trait_name] = trait_val plant = initialize_plant(sp, par_modified) Flux, P_soil = get_fluxes(plant, VPD,s); P_stem = Flux[:,1] # find curvature and slope diffP = np.ma.masked_greater(P_soil - P_stem, 10) # differential should not be greater than this -- cavitation limits # to make diffP even spaced dP_p1 = diffP[:-1] - diffP[1:] dP_p2 = dP_p1[:-1] - dP_p1[1:] kappa = dP_p2/(1+dP_p1[:-1]**2)**(3.0/2.0) imax = signal.argrelmax(diffP)[0][-1] try: imin = signal.argrelmax(kappa[:-1]-kappa[1:])[0][-4] # going from high moisture, the first minimum curvature print imin sigma_arr[i] = math.atan(np.pi/4.0 - np.tan(diffP[imax]/(P_soil[imax]-P_soil[imin]))) # plt.plot(P_soil, diffP); plt.plot([P_soil[imin], P_soil[imax]], [diffP[imin], diffP[imax]], 'o') except IndexError: sigma_arr[i] = np.nan # plt.show() # plt.figure(figsize=(6,4.5)) plt.plot(plot_arr, sigma_arr) plt.ylim(0.5,0.7)
def plot_Es_trait_dependence(trait_name, part_name, trait_arr, plot_arr): par_modified = copy.deepcopy(params) EsParams_arr = np.zeros((len(shift_range), 3)) for i, trait_val in enumerate(trait_arr): print i, trait_val par_modified[sp][part_name][trait_name] = trait_val plant = initialize_plant(sp, par_modified) EsParams_arr[i,:] = get_Es_params(plant,VPD,s)
def get_iso_aniso_performance(sp, VPD, tmax_arr, iso_xf, aniso_xf, plc=0.8): plant = initialize_plant(sp, traits, soil_type) # defining what it means to be iso or aniso Pg12_ref = plant.get_Pg12() Pg12_iso = iso_xf * Pg12_ref Pg12_aniso = aniso_xf * Pg12_ref plant_iso = initialize_modified_plant(sp, soil_type, 'canopy_dict', 'c_leaf', np.log(0.12) / (Pg12_iso)) plant_aniso = initialize_modified_plant(sp, soil_type, 'canopy_dict', 'c_leaf', np.log(0.12) / (Pg12_aniso)) Aref_iso = plant_iso.canopy.gmax_canopy(0.5) Avpd_iso = plant_iso.canopy.gmax_canopy(VPD) Aref_aniso = plant_aniso.canopy.gmax_canopy(0.5) Avpd_aniso = plant_aniso.canopy.gmax_canopy(VPD) metrics_iso = np.zeros((len(tmax_arr), 2)) metrics_aniso = np.zeros_like(metrics_iso) print 'start iso_aniso_performance, loop length:', len(tmax_arr) for i, tmax in enumerate(tmax_arr): print i, tRun = np.arange(0, tmax + dt, dt) ## isohydric performance gam, eta, k, sw, sst, sCrit = plant_iso.get_derived_params( VPD, s, alpha, n, Ks, sfc, plc) Amax = plant.canopy.Amax R = 0.1 * Amax ps, assm = simulate_ps_t(n_trajectories, tRun, dt, s0, lam, gam, eta, k, sw, sst, s1, Amax, R) metrics_iso[i, 0] = get_psCrit(ps, sCrit) metrics_iso[i, 1] = get_relGnet(assm, Amax, R) * (Avpd_iso / Aref_iso) # for k in range(len(ps[:,0])): # plt.plot(tRun, ps[k], lw=0.5, color='gray') # plt.hlines(sw, 0, tmax); plt.hlines(sst, 0, tmax); plt.hlines(sCrit, 0, tmax, 'red') # plt.show() ## anisohydric performance gam, eta, k, sw, sst, sCrit = plant_aniso.get_derived_params( VPD, s, alpha, n, Ks, sfc, plc) Amax = plant.canopy.Amax R = 0.1 * Amax ps, assm = simulate_ps_t(n_trajectories, tRun, dt, s0, lam, gam, eta, k, sw, sst, s1, Amax, R) metrics_aniso[i, 0] = get_psCrit(ps, sCrit) metrics_aniso[i, 1] = get_relGnet(assm, Amax, R) * (Avpd_aniso / Aref_aniso) # for k in range(len(ps[:,0])): # plt.plot(tRun, ps[k], lw=0.5, color='gray') # plt.hlines(sw, 0, tmax); plt.hlines(sst, 0, tmax); plt.hlines(sCrit, 0, tmax, 'red') # plt.show() return metrics_iso, metrics_aniso
def plot_supply_demand(sp, params, s0, VPD, newfig=True): if type(sp) is str: plant = initialize_plant(sp, params) else: plant = sp P_soil = plant.soil.P_soil_solver(s0) g_soil, g_stem, g_canopy = plant.soil_root.g_soil, plant.stem.g_stem, plant.canopy.g_canopy Px_arr = np.linspace(-10.0, -0.01, 100) P_baro = params_constants.P_baro ETsupply = g_soil(P_soil)*g_stem(Px_arr)/(g_soil(P_soil)+g_stem(Px_arr)) * (P_soil - Px_arr) Pl_arr = Px_arr - ETsupply/g_stem(Px_arr) ETdemand = g_canopy(Pl_arr, VPD)*(VPD/P_baro) if newfig: plt.figure(figsize=(6,4.5)) else: plt.figure(3,figsize=(6,4.5)) plt.plot(Px_arr, ETsupply) plt.plot(Px_arr, ETdemand) plt.hlines(0, -10.0, 0, linestyle='--')
plt.plot(s, P_soil-P_stem); plt.ylabel('MPa') plt.plot(s[imax], diffP[imax], 'ro') plt.plot(s[ilastmin], diffP[ilastmin], 'bo') plt.title('Predawn - midday vs. soil moisture') if __name__ =='__main__': # import trait parameters traits_path = '../traits_data.xls' params = import_traits_data() # import chaparral species params # designate soil type soil_type = 'sandy_loam'; smin = soil_dict[soil_type]['sh'] s = np.arange(smin,1.00,0.001) sp = 'JUNI'; s0=0.156; VPD=1.0; P_baro = params_constants.P_baro plant = initialize_plant(sp, params) P50 = plant.stem.P50_stem c_leaf = plant.canopy.c_leaf; Pg12 = 1.0/c_leaf * np.log(0.12) shift_range = np.linspace(0.5, 1.5, 20) P50_arr = shift_range*P50 Pg12_arr = shift_range*Pg12 sigma_grid = np.zeros((len(P50_arr), len(Pg12_arr))) for i, pg12 in enumerate(Pg12_arr): for j, p50 in enumerate(P50_arr): print i, j, pg12, p50 par_modified = params.copy() par_modified[sp]['stem_dict']['P50_stem'] = p50 par_modified[sp]['canopy_dict']['c_leaf'] = c_leaf/(pg12/Pg12) plant = initialize_plant(sp, par_modified) Flux = np.zeros((len(s), 3))
from utility_functions import import_traits_data, initialize_plant, simulate_ps_t_nonlinearized from params_soil import soil_dict import matplotlib.pyplot as plt import numpy as np # set soil conditions soil_type = 'loamy_sand' smin = soil_dict[soil_type]['sh'] sfc = soil_dict[soil_type]['sfc'] sst = soil_dict[soil_type]['sst'] n = soil_dict[soil_type]['n'] Ks = soil_dict[soil_type]['Ksat'] # set species traits traits = import_traits_data() juni_plant = initialize_plant('JUNI', traits, soil_type) pine_plant = initialize_plant('PINE', traits, soil_type) def plot_trajectories(plant, tmax, VPD, newfig=False, lam=0.1, alpha=0.01, s0=sst, dt=0.1, n_trajectories=100): if newfig: plt.figure(figsize=(6, 7)) tRun = np.arange(0, tmax + dt, dt) Amax = plant.canopy.Amax
with open( '/Users/xuefeng/Dropbox/Projects/Crossing/Datasets/California_desert/Es_params_VPD' + str(vpd_dry) + '.pickle', 'rb') as handle: Es_dict = pickle.load(handle) sst_arr = np.zeros((len(Es_dict.keys()), 2)) for i, sp in enumerate(Es_dict.keys()): sst_arr[i, 0] = Es_dict[sp][1] sst_arr[i, 1] = Ps * sst_arr[i, 0]**(-b) print 'pause' # sw_sp, sst_sp, Emax_sp, s_P90, s_Pg12, Zr_sp = Es_dict[sp] # set species traits traits = import_traits_data() sp = 'JUNI' plant = initialize_plant(sp, traits, soil_type) gX = plant.stem.gmax_stem() psi_T50 = plant.stem.P50_stem gS = plant.soil_root.gmax_root() psi_ssat = Ps gC = plant.canopy.gmax_canopy(VPD) psi_L90 = plant.get_Pg12() gX, psi_T50, gS, psi_ssat, gC, psi_L90 = get_traits(plant) beta, d, f, k = get_params(gX, psi_T50, gS, psi_ssat, gC, psi_L90) shift_range = np.linspace(0.5, 2.0, 10) psi_L90_arr = shift_range * psi_L90 psi_T50_arr = shift_range * psi_T50 beta_arr = np.zeros(len(shift_range)) d_arr = np.zeros_like(beta_arr)
def initialize_modified_plant(sp, soil_type, part_name, trait_name, trait_val): traits_modified = copy.deepcopy(traits) traits_modified[sp][part_name][trait_name] = trait_val plant_modified = initialize_plant(sp, traits_modified, soil_type) return plant_modified
# plt.figure(figsize=(6,4.5)) plt.plot(plot_arr, sigma_arr) plt.ylim(0.5,0.7) if __name__ =='__main__': # import trait parameters traits_path = '../traits_data.xls' params = import_traits_data() # import chaparral species params # designate soil type soil_type = 'sandy_loam'; smin = soil_dict[soil_type]['sh'] sfc = soil_dict[soil_type]['sfc']; sst = soil_dict[soil_type]['sst'] # s = np.linspace(smin, 1.0, 1000) s = np.hstack((np.linspace(smin,sst,1000), np.linspace(sst+0.001,1.0,100))) sp = 'PINE'; s0=0.156; VPD=2.0; P_baro = params_constants.P_baro print get_Es_params(initialize_plant(sp, params), VPD,s) # setting up parameter ranges plant = initialize_plant(sp, params); shift_range = np.linspace(0.1, 2.0, 30) P50 = plant.stem.P50_stem c_leaf = plant.canopy.c_leaf; Pg12 = 1.0/c_leaf * np.log(0.12) A_canopy = plant.canopy.A_canopy Zr = plant.soil_root.L_root P50_arr = shift_range*P50 Pg12_arr = shift_range*Pg12 Acan_arr = shift_range*A_canopy Zr_arr = shift_range*Zr