Skip to content

Commit ddeb4a8

Browse files
committed
PMLV2.jl passed test
1 parent f673399 commit ddeb4a8

File tree

8 files changed

+86
-66
lines changed

8 files changed

+86
-66
lines changed

Diff for: data/CRO/FLUXNET_CRO

115 KB
Binary file not shown.

Diff for: scripts/calib_PML.jl

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
function calib_PML(data::AbstractDataFrame; of_gof=:KGE, maxn=2500)
32
vars = ["IGBPname", "IGBPcode", "site", "date", "GPP_obs", "ET_obs",
43
"Prcp", "Tavg", "U2", "Rn", "Rs", "VPD", "LAI", "Pa", "Ca"]
@@ -33,7 +32,7 @@ end
3332
# data.LAI .= data.LAI_whit
3433

3534
# data = @rename(data, LAI = LAI_whit) # LAI_raw, LAI_whit, LAI_sgfitw
36-
r = calib_PML(data; of_gof=:KGE, maxn=500)
35+
r = calib_PML(data; of_gof=:KGE, maxn=5000)
3736
r.gof
3837

3938
# out = fread("D:/GitHub/PML/PMLV2_Kong2019.m/OUTPUT/PMLv2_flux102_Cal_flux_v012.csv")

Diff for: src/ET_helper.jl

+25
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,28 @@ function aerodynamic_conductance(U2::T, hc::T; Zob=15.0) where {T<:Real}
1818
Ga
1919
end
2020

21+
cal_rho_a(Tair, Pa) = 3.486 * Pa / 1.01(Tair + 273.15) # kg/m3
22+
# cal_rho_a(Tair, Pa) = 3.846 * Pa / (Tair + 273.15) # [kg/m3], error v2019
23+
24+
# # rho_a: kg m-3
25+
# function cal_rho_a(Tair, q, Pa)
26+
# 3.486 * Pa / cal_TvK(Tair, q) # FAO56, Eq. 3-5
27+
# end
28+
29+
# cal_rho_a(Tair, Pa) = 3.486 * Pa / cal_TvK(Tair)
30+
# # cal_rho_a(Tair, Pa) = 3.486 * Pa / cal_TvK(Tair)
31+
32+
# # FAO56, Eq. 3-7
33+
# cal_TvK(Tair) = 1.01 * (Tair + 273)
34+
35+
# # https://github.com/CUG-hydro/class2022_CUG_HydroMet/blob/master/ch02_大气的基本特征.md
36+
# # q ≈ ϵ*ea/Pa
37+
# # q = ϵ*ea/(Pa - (1 - ϵ)*ea)
38+
# function cal_TvK(Tair, q)
39+
# # ea / Pa = q/(ϵ + (1 - ϵ) * q)
40+
# (Tair + K0) * (1 + (1 - epsilon) * q / (ϵ + (1 - ϵ) * q))
41+
# end
42+
43+
# # 这个是最精确的版本
44+
# # FAO56, Eq. 3-6
45+
# cal_TvK(Tair, ea, Pa) = (Tair + K0) * (1 + (1 - epsilon) * ea / Pa)

Diff for: src/PML.jl

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ module PML
22

33
export PMLV2_sites
44
export PMLV2, T_adjust_Vm25, f_VPD_Zhang2019
5+
export GOF
56

67
using DocStringExtensions
78
using Parameters, DataFrames
8-
import HydroTools: cal_rho_a, cal_Uz, ET0_eq,
9+
import HydroTools: cal_Uz, ET0_eq,
910
Cp, atm,
1011
GOF, sceua
1112

Diff for: src/main_Ipaper.jl

+6-7
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ using Statistics
22

33
round2(x::NamedTuple, digits=3; kw...) = map(val -> round(val; digits), x)
44

5-
# main script of moving average
5+
66
function movmean2(y::AbstractVector{T}, win_left::Integer, win_right::Integer=win_right) where {T<:Real}
77
n = length(y)
88
z = zeros(Float64, n)
@@ -11,15 +11,14 @@ function movmean2(y::AbstractVector{T}, win_left::Integer, win_right::Integer=wi
1111
i_beg = max(i - win_left, 1)
1212
i_end = min(i + win_right, n)
1313

14-
n_i = 0 # number
15-
sum = T(0.0) # sum of values in window
16-
14+
count = 0 # number
15+
= T(0.0) # sum of values in window
1716
for j in i_beg:i_end
1817
isnan(y[j]) && continue # skip missing values
19-
n_i += 1
20-
sum += y[j]
18+
count += 1
19+
+= y[j]
2120
end
22-
z[i] = n_i > 0 ? sum / n_i : T(NaN)
21+
z[i] = count > 0 ? / count : T(NaN)
2322
end
2423
z
2524
end

Diff for: src/model_PMLV2.jl

+13-12
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ function PMLV2(Prcp::T, Tavg::T, Rs::T, Rn::T, VPD::T, U2::T, LAI::T,
5555
ρa = cal_rho_a(Tavg, Pa)
5656
# ρa = cal_rho_a(Tavg, q, Pa)
5757
LEca = (ρa * Cp * 1e6 * r.Ga * VPD / γ) /+ 1 + r.Ga / r.Gc_w) # W m-2, `Cp*1e6`: [J kg-1 °C-1]
58+
# [kg m-3] [J kg-1 K-1] [m s-1] [kPa] / [kPa K-1] = [W m-2]
5859

5960
r.Ecr = W2mm(LEcr; λ) # [W m-2] change to [mm d-1]
6061
r.Eca = W2mm(LEca; λ) # [W m-2] change to [mm d-1]
@@ -70,18 +71,6 @@ function PMLV2(Prcp::T, Tavg::T, Rs::T, Rn::T, VPD::T, U2::T, LAI::T,
7071
end
7172

7273

73-
"""
74-
# Arguments
75-
- `kw`: named keyword arguments
76-
+ `r`: `interm_PML`
77-
"""
78-
function PMLV2(d::AbstractDataFrame; par::Param_PMLV2=Param_PMLV2(), kw...)
79-
PMLV2(d.Prcp, d.Tavg, d.Rs, d.Rn,
80-
d.VPD, d.U2, d.LAI,
81-
d.Pa, d.Ca; par, kw...) |> to_df
82-
end
83-
84-
8574
"""
8675
PMLV2(Prcp, Tavg, Rs, Rn, VPD, U2, LAI, Pa, Ca; par=param0, frame=3)
8776
@@ -119,3 +108,15 @@ function PMLV2(Prcp::V, Tavg::V, Rs::V, Rn::V,
119108
res.ET .= res.Ec .+ res.Ei .+ res.Es
120109
res
121110
end
111+
112+
113+
"""
114+
# Arguments
115+
- `kw`: named keyword arguments
116+
+ `r`: `interm_PML`
117+
"""
118+
function PMLV2(d::AbstractDataFrame; par::Param_PMLV2=Param_PMLV2(), kw...)
119+
PMLV2(d.Prcp, d.Tavg, d.Rs, d.Rn,
120+
d.VPD, d.U2, d.LAI,
121+
d.Pa, d.Ca; par, kw...) |> to_df
122+
end

Diff for: test/test-PMLV2.jl

+39-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,49 @@
1-
using PML, Test
1+
using PML, Test, Ipaper
22

3-
@testset "ET PMLV2" begin
3+
function build_data()
4+
param = fread("data/CRO/PARAM.csv")
5+
df_out = fread("data/CRO/OUTPUT.csv")
6+
df_out.Ec = df_out.Ecr + df_out.Eca
7+
8+
df = fread("data/CRO/INPUT.csv")
9+
df.Ca = df.CO2
10+
11+
inds = [1:4; 10:11; 5:9]
12+
_names = names(param)[inds]
13+
_values = Matrix(param)[inds]
14+
par = Param_PMLV2(_values..., 0.5)
15+
16+
l = (; df_out, df, par)
17+
serialize("data/CRO/FLUXNET_CRO", l)
18+
end
19+
20+
dir_proj = "$(@__DIR__)/.."
21+
df_out, df, par = deserialize("$dir_proj/data/CRO/FLUXNET_CRO")
22+
r = PMLV2_sites(df; par)
23+
24+
25+
@testset "PMLV2 scalar" begin
426
Prcp = 2.0 # mm
527
Tavg = 20.0
628
Rs = 200.0
729
Rn = 50.0
830
VPD = 2.0
931
U2 = 2.0
1032
LAI = 2.0
11-
12-
# par = param0
13-
# par = add(par, list(hc=2.0))
1433
@test_nowarn PMLV2(Prcp, Tavg, Rs, Rn, VPD, U2, LAI;)
1534
end
35+
36+
@testset "CHECK PMLV2 RESULT" begin
37+
@test GOF(df.Eeq, r.Eeq).MAE <= 0.01
38+
@test GOF(df_out.Es_eq, r.Es_eq).MAE <= 0.002
39+
@test GOF(df_out.Ga, r.Ga).MAE <= 1e-10
40+
@test GOF(df_out.Gc, r.Gc_w).MAE <= 1e-3
41+
@test GOF(df_out.Ei, r.Ei).MAE <= 1e-8 # Ei passed Test
42+
@test GOF(df_out.Ec, r.Ec).MAE <= 0.002
43+
@test GOF(df_out.Es, r.Es).MAE <= 0.01
44+
@test GOF(df_out.Ecr, r.Ecr).MAE <= 0.002
45+
@test GOF(df_out.Eca, r.Eca).MAE <= 0.002
46+
47+
@test GOF(df_out.ET_sim, r.ET).MAE <= 0.015
48+
@test GOF(df_out.GPP_sim, r.GPP).MAE <= 1E-8
49+
end

Diff for: test/test-result.jl

-39
This file was deleted.

0 commit comments

Comments
 (0)