コード例 #1
0
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')
コード例 #2
0
ファイル: execute_Esplots.py プロジェクト: xue-feng/Isohydry
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)
コード例 #3
0
ファイル: execute_Esplots.py プロジェクト: xue-feng/Isohydry
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)  
コード例 #4
0
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
コード例 #5
0
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='--')
コード例 #6
0
    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))
コード例 #7
0
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
コード例 #8
0
ファイル: nondimensional.py プロジェクト: xue-feng/Isohydry
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)
コード例 #9
0
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
コード例 #10
0
ファイル: execute_Esplots.py プロジェクト: xue-feng/Isohydry
#     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