def main(Ca=None):

    par = 1500.0
    Ci = Ca * 0.7
    Rd = None
    Tleaf = 25.
    deg2kelvin = 273.15
    Tleaf += deg2kelvin
    Eaj = 27900.0
    Eav = 69900.0
    deltaSj = 619.0
    deltaSv = 634.0
    Hdv = 200000.0
    Hdj = 200000.0
    r25 = 2.0
    Q10 = 2.0
    N_c = 0.015
    N_e = 0.015
    N_p = 0.10
    #===== Medlyn paper ====#
    alpha = 0.425  # (-)
    g_m = 0.4  # mol m-2 s-1 bar-1 ie mol m-2 s-1 at 1 atm
    K_cat = 24.0  # mmol CO2 mol-1 Rubisco-1
    K_s = 1.25E-04  # mol N s umol-1
    #=======================#

    P = PhotosynthesisModel(peaked_Jmax=True,
                            peaked_Vcmax=True,
                            alpha=alpha,
                            g_m=g_m,
                            K_cat=K_cat,
                            K_s=K_s)
    O = OptimiseNitrogenAllocation(model=P)

    Jm_store = np.zeros(0)
    Vm_store = np.zeros(0)
    leaf_temp = np.linspace(5, 30, 10)
    Npools_store = np.zeros((len(leaf_temp), 4))
    for i, Tleaf in enumerate(leaf_temp):

        initial_guess = np.array([N_c, N_e])
        # ===== OPTIMIZE parameter set ===== #
        result = O.main(fit_params=initial_guess,
                        par=par,
                        Rd=Rd,
                        Ci=Ci,
                        N_p=N_p,
                        Tleaf=Tleaf + deg2kelvin,
                        Tref=25.0,
                        Eaj=Eaj,
                        Eav=Eav,
                        deltaSj=deltaSj,
                        deltaSv=deltaSv,
                        r25=r25,
                        Q10=Q10,
                        Hdv=Hdv,
                        Hdj=Hdj)

        # retrieve all fitted N pools
        (N_c, N_e, N_r, N_s) = P.N_pool_store
        Npools_store[i] = N_c, N_e, N_r, N_s

        fitted_x0 = np.array([N_c, N_e])

        (An, Anc, Anj, Jmax25,
         Vcmax25) = P.calc_photosynthesis(N_pools=fitted_x0,
                                          par=par,
                                          Ci=Ci,
                                          Rd=Rd,
                                          N_p=N_p,
                                          Tleaf=Tleaf + deg2kelvin,
                                          Tref=25.0,
                                          Eaj=Eaj,
                                          Eav=Eav,
                                          deltaSj=deltaSj,
                                          deltaSv=deltaSv,
                                          r25=r25,
                                          Q10=Q10,
                                          Hdv=Hdv,
                                          Hdj=Hdj)

        Jm_store = np.append(Jm_store, Jmax25)
        Vm_store = np.append(Vm_store, Vcmax25)
    jv_ratio = Jm_store / Vm_store

    return jv_ratio, leaf_temp, Npools_store
     # ===== OPTIMIZE parameter set ===== # 
     result = O.main(fit_params=x0, par=par, Rd=Rd, Ci=Ci, 
                        N_p=N_p, Tleaf=Tleaf, Tref=25.0, Eaj=Eaj, Eav=Eav, 
                        deltaSj=deltaSj, deltaSv=deltaSv, r25=r25, Q10=Q10, 
                        Hdv=Hdv, Hdj=Hdj)
 
 
     
     (N_c, N_e, N_r, N_s) = P.N_pool_store
     fitted_x0 = np.array([N_c, N_e])
     
     (An, Anc, Anj, 
      Jmax25, 
      Vcmax25) = P.calc_photosynthesis(N_pools=fitted_x0, par=par, Ci=Ci, 
                                            Rd=Rd, N_p=N_p, Tleaf=Tleaf, 
                                            Tref=25.0, Eaj=Eaj, Eav=Eav, 
                                            deltaSj=deltaSj, deltaSv=deltaSv, 
                                            r25=r25, Q10=Q10, Hdv=Hdv, 
                                            Hdj=Hdj)
     An_store.append(np.mean(An))
     N_c_store.append(N_c)
     N_e_store.append(N_e)
     N_r_store.append(N_r)
     N_s_store.append(N_s)
 
 
 N_p = np.linspace(0.05, 0.15, 10)
 #plt.plot(N_p, An_store, lw=2, ls="-", c="red", label="An")
 plt.plot(N_p, N_c_store, lw=2, ls="-", c="red", label="N_c")
 plt.plot(N_p, N_e_store, lw=2, ls="-", c="orange", label="N_e")
 plt.plot(N_p, N_r_store, lw=2, ls="-", c="blue", label="N_r")
 plt.plot(N_p, N_s_store, lw=2, ls="-", c="green", label="N_s")
                        Q10=Q10,
                        Hdv=Hdv,
                        Hdj=Hdj)

        (N_c, N_e, N_r, N_s) = P.N_pool_store
        fitted_x0 = np.array([N_c, N_e])

        (An, Anc, Anj, Jmax25,
         Vcmax25) = P.calc_photosynthesis(N_pools=fitted_x0,
                                          par=par,
                                          Ci=Ci,
                                          Rd=Rd,
                                          N_p=N_p,
                                          Tleaf=Tleaf,
                                          Tref=25.0,
                                          Eaj=Eaj,
                                          Eav=Eav,
                                          deltaSj=deltaSj,
                                          deltaSv=deltaSv,
                                          r25=r25,
                                          Q10=Q10,
                                          Hdv=Hdv,
                                          Hdj=Hdj)
        An_store.append(np.mean(An))
        N_c_store.append(N_c)
        N_e_store.append(N_e)
        N_r_store.append(N_r)
        N_s_store.append(N_s)

    N_p = np.linspace(0.05, 0.15, 10)
    #plt.plot(N_p, An_store, lw=2, ls="-", c="red", label="An")
def main(Ca=None):
    
    par = 1500.0
    Ci = Ca * 0.7
    Rd = None
    Tleaf = 25.
    deg2kelvin = 273.15
    Tleaf += deg2kelvin
    Eaj = 27900.0
    Eav = 69900.0
    deltaSj = 619.0
    deltaSv = 634.0
    Hdv = 200000.0
    Hdj = 200000.0
    r25 = 2.0
    Q10 = 2.0
    N_c = 0.015
    N_e = 0.015
    N_p = 0.10
    #===== Medlyn paper ====#
    alpha = 0.425   # (-)
    g_m = 0.4       # mol m-2 s-1 bar-1 ie mol m-2 s-1 at 1 atm
    K_cat = 24.0    # mmol CO2 mol-1 Rubisco-1
    K_s = 1.25E-04  # mol N s umol-1
    #=======================#
   
    
    P = PhotosynthesisModel(peaked_Jmax=True, peaked_Vcmax=True, 
                                 alpha=alpha, g_m=g_m, K_cat=K_cat, K_s=K_s)
    O = OptimiseNitrogenAllocation(model=P)
    
    
    
    Jm_store = np.zeros(0)
    Vm_store = np.zeros(0)
    leaf_temp = np.linspace(5, 30, 10)
    Npools_store = np.zeros((len(leaf_temp),4))
    for i, Tleaf in enumerate(leaf_temp):
        
        initial_guess = np.array([N_c, N_e])
        # ===== OPTIMIZE parameter set ===== # 
        result = O.main(fit_params=initial_guess, par=par, Rd=Rd, Ci=Ci, 
                        N_p=N_p, Tleaf=Tleaf+deg2kelvin, Tref=25.0, Eaj=Eaj, 
                        Eav=Eav, deltaSj=deltaSj, deltaSv=deltaSv, r25=r25, 
                        Q10=Q10, Hdv=Hdv, Hdj=Hdj)
    
    
        # retrieve all fitted N pools
        (N_c, N_e, N_r, N_s) = P.N_pool_store
        Npools_store[i] = N_c, N_e, N_r, N_s
        
        fitted_x0 = np.array([N_c, N_e])
        
        (An, Anc, Anj, 
         Jmax25, 
         Vcmax25) = P.calc_photosynthesis(N_pools=fitted_x0, par=par, Ci=Ci, 
                                               Rd=Rd, N_p=N_p, 
                                               Tleaf=Tleaf+deg2kelvin, 
                                               Tref=25.0, Eaj=Eaj, Eav=Eav, 
                                               deltaSj=deltaSj, deltaSv=deltaSv, 
                                               r25=r25, Q10=Q10, Hdv=Hdv, 
                                               Hdj=Hdj)
        
        Jm_store = np.append(Jm_store, Jmax25)
        Vm_store = np.append(Vm_store, Vcmax25)
    jv_ratio = Jm_store / Vm_store

    return jv_ratio, leaf_temp, Npools_store