Skip to content

Commit 24429bb

Browse files
committed
major: change file dir
1 parent 8d2f88e commit 24429bb

11 files changed

+78
-80
lines changed

Diff for: docs/src/index.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ cal_Ei_Dijk2021
77
photosynthesis
88
aerodynamic_conductance
99
10-
model_calib
10+
ModelCalib
1111
Param_PMLV2
1212
```

Diff for: examples/CalibOneSite.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ df.ET_obs = df.ETobs
1111
# ## 模型参数率定
1212

1313
#nb # %% A slide [markdown] {"slideshow": {"slide_type": "fragment"}}
14-
theta, goal, flag = model_calib(df, par0)
14+
theta, goal, flag = ModelCalib(df, par0)
1515
df_out = PMLV2_sites(df; par=theta2par(theta))
1616
df_out[1:10, :]
1717

Diff for: examples/ex2_NorthChina_C3C4_calib.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ df = data[data.site.=="固城", :]
1111
par = par0
1212
r = PMLV2(df; par)
1313

14-
theta, goal, flag = model_calib(df, par0)
14+
theta, goal, flag = ModelCalib(df, par0)
1515
df_out = PMLV2_sites(df; par=theta2par(theta))
1616
# df_out[1:10, :]
1717
sites = unique(df.site)

Diff for: examples/s1_calibrate_model_params.qmd

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ include("data_PML_2019.jl")
77
# data.LAI .= data.LAI_raw
88
# data.LAI .= data.LAI_whit
99
# data = @rename(data, LAI = LAI_whit) # LAI_raw, LAI_whit, LAI_sgfitw
10-
# @time r = calib_PMLV2(data; of_gof=:KGE, maxn=5000)
11-
@time r = calib_PMLV2(data; of_gof=:NSE, maxn=10000)
10+
# @time r = ModelCalib_IGBPs(data; of_gof=:KGE, maxn=5000)
11+
@time r = ModelCalib_IGBPs(data; of_gof=:NSE, maxn=10000)
1212
r.gof
1313
```
1414

Diff for: src/Utilize/DataType.jl renamed to src/Optim/DataType.jl

+17-20
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
1-
using Parameters
2-
31
@with_kw mutable struct interm_PML{T}
4-
ET::T = T(0)
5-
GPP::T = T(0)
6-
Ec::T = T(0)
7-
Ecr::T = T(0)
8-
Eca::T = T(0)
9-
10-
Ei::T = T(0)
11-
Pi::T = T(0)
12-
Es_eq::T = T(0)
13-
Eeq::T = T(0)
14-
ET_water::T = T(0)
15-
16-
Ga::T = T(0)
17-
Gc_w::T = T(0)
18-
19-
fval_soil::T = T(0)
20-
Es::T = T(0)
2+
ET::T = 0.0
3+
GPP::T = 0.0
4+
Ec::T = 0.0
5+
Ecr::T = 0.0
6+
Eca::T = 0.0
7+
8+
Ei::T = 0.0
9+
Pi::T = 0.0
10+
Es_eq::T = 0.0
11+
Eeq::T = 0.0
12+
ET_water::T = 0.0
13+
14+
Ga::T = 0.0
15+
Gc_w::T = 0.0
16+
17+
fval_soil::T = 0.0
18+
Es::T = 0.0
2119
end
2220

2321
@with_kw mutable struct output_PML{T}
@@ -79,4 +77,3 @@ end
7977

8078
export interm_PML, output_PML
8179
export to_mat;
82-

Diff for: src/Utilize/calib_PMLV2.jl renamed to src/Optim/ModelCalib.jl

+26-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
1+
export ModelCalib, ModelCalib_IGBPs
2+
export fread, fwrite, melt_list
3+
4+
using RTableTools
15
import Ipaper: par_map
6+
include("DataType.jl")
7+
include("ModelCalib.jl")
8+
include("model_gof.jl")
9+
# include("PMLV2_sites.jl")
10+
211

3-
# all sites
4-
function calib_PMLV2(data::AbstractDataFrame; of_gof=:KGE, maxn=2500)
12+
function ModelCalib_IGBPs(data::AbstractDataFrame; of_gof=:KGE, maxn=2500)
513
vars = ["IGBPname", "IGBPcode", "site", "date", "GPP_obs", "ET_obs",
614
"Prcp", "Tavg", "U2", "Rn", "Rs", "VPD", "LAI", "Pa", "Ca"]
715
IGBPs = unique(data.IGBPname) |> sort
816

917
@time params = par_map(IGBP -> begin
1018
df = data[data.IGBP.==IGBP, vars]
1119
IGBPcode = df.IGBPcode[1]
12-
theta, _, _ = model_calib(df, par0; IGBPcode, of_gof, maxn, verbose=false)
20+
theta, _, _ = ModelCalib(df, par0; IGBPcode, of_gof, maxn, verbose=false)
1321
theta
1422
end, IGBPs; progress=false)
1523

@@ -30,4 +38,18 @@ function calib_PMLV2(data::AbstractDataFrame; of_gof=:KGE, maxn=2500)
3038
(; param=theta2param(params, IGBPs), gof, output=df_out)
3139
end
3240

33-
export calib_PMLV2
41+
42+
## 一个站点的率定
43+
"""
44+
ModelCalib(df::AbstractDataFrame, par0::AbstractETParam;
45+
IGBPcode=nothing, maxn=2500, of_gof=:NSE, kw...)
46+
"""
47+
function ModelCalib(df::AbstractDataFrame, par0::AbstractETParam; IGBPcode=nothing, maxn=2500, of_gof=:NSE, kw...)
48+
parRanges = get_bounds(par0)
49+
lower = parRanges[:, 1]
50+
upper = parRanges[:, 2]
51+
theta0 = collect(par0) # must be vector
52+
53+
sceua(theta -> -model_goal(df, theta; IGBPcode, of_gof, kw...),
54+
theta0, lower, upper; maxn, kw...) # theta, goal, flag
55+
end

Diff for: src/Utilize/model_gof.jl renamed to src/Optim/model_gof.jl

+27
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ function map_df_tuple(fun::Function, lst::GroupedDataFrame{DataFrame}, args...;
99
end, 1:n)
1010
end
1111

12+
1213
## 统计每种植被类型的模拟效果
1314
function model_gof(df_out::DataFrame; all=true)
1415
fun_et(d) = GOF(d.ET_obs, d.ET)
@@ -26,4 +27,30 @@ function model_gof(df_out::DataFrame; all=true)
2627
(; ET=gof_et, GPP=gof_gpp)
2728
end
2829

30+
31+
function model_goal(df, theta; IGBPcode=nothing, of_gof=:NSE, verbose=false)
32+
# IGBPcode !== nothing && (par.hc = hc_raw[IGBPcode])
33+
IGBPcode !== nothing && (theta[end] = hc_raw[IGBPcode]) # the last one is hc
34+
par = Param_PMLV2(theta...)
35+
36+
dobs = df[!, [:GPP_obs, :ET_obs]]
37+
# dsim = PMLV2(df; par) # the exact MATLAB version
38+
dsim = PMLV2_sites(df; par)
39+
40+
## 8-day, yearly, yearly_anom
41+
info_GPP = GOF(dobs.GPP_obs, dsim.GPP)
42+
info_ET = GOF(dobs.ET_obs, dsim.ET)
43+
44+
if verbose
45+
indexes = [:KGE, :NSE, :R2, :RMSE, :bias, :bias_perc]
46+
info_GPP = info_GPP[indexes] |> round2
47+
info_ET = info_ET[indexes] |> round2
48+
end
49+
gof = [info_ET[of_gof], info_GPP[of_gof]]
50+
goal = weighted_mean(gof, [1, 0.5])
51+
goal
52+
end
53+
54+
55+
export model_goal
2956
export model_gof, map_df_tuple

Diff for: src/PML.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ file_FLUXNET_CRO_USTwt = "$dir_proj/data/CRO/FLUXNET_CRO_US-Twt" |> abspath
1818

1919
include("main_Ipaper.jl")
2020
include("Params.jl")
21-
include("Utilize/Utilize.jl")
21+
include("Optim/ModelCalib.jl")
2222
include("ET_helper.jl")
2323
# include("PET_equilibrium.jl")
2424
# include("Ei_EvapIntercepted.jl")

Diff for: src/Utilize/Utilize.jl

-8
This file was deleted.

Diff for: src/Utilize/model_calib.jl

-40
This file was deleted.

Diff for: test/test-PMLV2.jl

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ end
3030
end
3131

3232

33-
@testset "model_calib" begin
33+
@testset "ModelCalib" begin
3434
df.GPP_obs = df.GPPobs
3535
df.ET_obs = df.ETobs
36-
@time _theta, goal, flag = model_calib(df, par0; IGBPcode=df.IGBPcode[1], maxn=2500)
36+
@time _theta, goal, flag = ModelCalib(df, par0; IGBPcode=df.IGBPcode[1], maxn=2500)
3737
goal = model_goal(df, _theta; verbose=true)
3838
@test goal > 0.55 # mean(KGE_GPP, KGE_ET)
3939
end

0 commit comments

Comments
 (0)