Calibrate PMLV2 model using FLUXNET data

US Twt (CRO, 2009)

using PML, Ipaper

df_out, df, _par = deserialize(file_FLUXNET_CRO_USTwt)
par = Param_PMLV2(; _par..., hc=0.5)
df.GPP_obs = df.GPPobs
df.ET_obs = df.ETobs
275-element Vector{Float64}:
 NaN
 NaN
 NaN
 NaN
 NaN
 NaN
 NaN
 NaN
 NaN
 NaN
   ⋮
   1.60968225909663
   1.27912555152687
   1.06059787751179
   0.779535860816098
   0.578394230978662
   0.332647468807178
   0.50089104654852
   1.26067990507329
   1.35241601110533

模型参数率定

parNames = [
  :α, :η, :g1, :Am_25, :VPDmin, :VPDmax, :D0, :kQ, :kA, :S_sls, :fER0 # :hc
]

theta, goal, flag = ModelCalib(df, par0, parNames)
df_out = PMLV2_sites(df; par=theta2par(theta, parNames))
df_out[1:10, :]
10×14 DataFrame
RowETGPPEcEcrEcaEiPiEs_eqEeqET_waterGaGc_wfval_soilEs
Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64Float64
10.4146970.5457090.1650420.008837930.1562050.01530080.3136990.2343530.2902730.8585530.0144280.001363521.00.234353
20.7167721.090930.5418770.02334990.5185270.00.00.2659690.3684981.624440.01621970.002224340.6575760.174895
30.9024111.112980.4403930.06967860.3707140.08938130.8778690.3726370.5761041.314390.01064030.002503031.00.372637
41.253771.891760.806290.1095630.6967270.01681420.1309360.4306650.7411491.85320.01533460.004004551.00.430665
51.511552.045390.8134520.1623630.6510890.2567321.656020.4413690.843451.77510.01471790.004531561.00.441369
61.525381.782460.4854620.1038020.381660.684488.026020.3554370.7524081.411390.02681580.004645041.00.355437
71.926132.668260.8895830.2854370.6041460.5791482.991850.4573941.069931.785140.01642740.006377221.00.457394
82.037362.93640.9037950.3232170.5805770.7121394.230860.4214281.103981.752110.01812450.007277431.00.421428
92.390854.925441.738690.7959520.9427390.001806620.006693380.6503551.903042.802940.01315280.01086131.00.650355
102.557674.94141.787190.914940.8722520.1340920.4471580.6363832.06792.852480.01523810.01134441.00.636383

拟合优度

gof = [
  (; var="ET", GOF(df.ET_obs, df_out.ET)...),
  (; var="GPP", GOF(df.GPP_obs, df_out.GPP)...)] |> DataFrame
DataFrame(gof)
2×10 DataFrame
RowvarNSER2KGERRMSEMAEbiasbias_percn_valid
StringFloat64Float64Float64Float64Float64Float64Float64Float64Int64
1ET0.6151960.6171770.7135560.7856061.343660.993881-0.0778958-2.59433263
2GPP0.5441570.6208550.4689110.7879443.300452.622950.6370816.9614260

绘图

using Plots
gr(framestyle=:box, titlefontsize=12)
t = df.date
inds = 1:46*1

function plot_var(var; label=string(var), title=string(var),
  data=df_out, scale=1, kw...)
  plot(t[inds], data[inds, var] * scale; label, title, kw...)
end
function plot_var!(p, var; label=string(var),
  data=df_out, kw...)
  plot!(p, t[inds], data[inds, var]; label, kw...)
end

p_et = plot(title="ET components (mm/d)")
plot_var!(p_et, :Ec)
plot_var!(p_et, :Es)
plot_var!(p_et, :Ei)
plot_var!(p_et, :ETobs; data=df, label="ET_obs", color=:black)

p_gpp = plot_var(:GPP; title="GPP (gC m-2 d-1)", label="GPP")
plot_var!(p_gpp, :GPPobs; data=df, label="GPP_obs", color=:black)

plot(
  p_et, p_gpp,
  plot_var(:Eeq; title="Eeq (mm/d)", label="Eeq"),
  plot_var(:Gc_w; title="Conductance (m s-1)", label="Gc"),
  plot_var(:fval_soil; title="β_soil", label="β_soil"),
  plot_var(:VPD; data=df, scale=-1, title="-VPD (kPa)", label="-VPD"),
  plot_var(:Pi; title="P - Ei (mm/d)"),
  plot_var(:Es_eq; title="Es_eq (mm/d)"),
  size=(800, 700),
  layout=(4, 2),
)
Example block output

This page was generated using Literate.jl.