Skip to content

Commit d677e1e

Browse files
authored
Merge pull request #1073 from CliMA/kp/ten-yr-leaderboard
Update leaderboard for longer run of snowy land
2 parents 424eb44 + ce89da3 commit d677e1e

File tree

7 files changed

+841
-93
lines changed

7 files changed

+841
-93
lines changed

.buildkite/Manifest-v1.11.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
julia_version = "1.11.4"
44
manifest_format = "2.0"
5-
project_hash = "4fe4935d5d45f04880ac419a664997320feb94e4"
5+
project_hash = "556cc366c0974a7c1af7cf9d7cb51d21d3254f47"
66

77
[[deps.ADTypes]]
88
git-tree-sha1 = "e2478490447631aedba0823d4d7a80b2cc8cdb32"
@@ -365,9 +365,9 @@ weakdeps = ["SparseArrays"]
365365

366366
[[deps.ClimaAnalysis]]
367367
deps = ["Artifacts", "Dates", "Interpolations", "NCDatasets", "NaNStatistics", "OrderedCollections", "Reexport", "Statistics", "Unitful"]
368-
git-tree-sha1 = "1cae1cd626bd636bba0e1a4a681e0296372848bc"
368+
git-tree-sha1 = "0a9f4a6de147d0a9dc09f2e8f702f76dd6777e07"
369369
uuid = "29b5916a-a76c-4e73-9657-3c8fd22e65e6"
370-
version = "0.5.15"
370+
version = "0.5.16"
371371
weakdeps = ["GeoMakie", "Makie"]
372372

373373
[deps.ClimaAnalysis.extensions]

.buildkite/Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
4141
Thermodynamics = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c"
4242

4343
[compat]
44-
ClimaAnalysis = "0.5.15"
44+
ClimaAnalysis = "0.5.16"
4545
ClimaTimeSteppers = "0.7, 0.8"
4646
Statistics = "1"
4747
Flux = "0.15"

Artifacts.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,13 @@ git-tree-sha1 = "4cc329093b0dbc3443db36e7c01133267ac94d37"
165165
[forty_yrs_era5_land_forcing_data]
166166
git-tree-sha1 = "f269a0b057b9f438b4caafdef17da73746310787"
167167

168+
[era5_monthly_averages_surface_single_level_1979_2024]
169+
git-tree-sha1 = "6cddb07eeee2dd46dc5a19e9b2f706302ddba2c9"
170+
171+
[[era5_monthly_averages_surface_single_level_1979_2024.download]]
172+
sha256 = "46b422722d98c89c6bc0b8641bff259db1caee253f45389ddf9eb9c2d31ed605"
173+
url = "https://caltech.box.com/shared/static/jbgtyt6oq9lxvk8il5zzck6k581q7f3k.gz"
174+
168175
[huang_van_genuchten_data]
169176
git-tree-sha1 = "39a344685d74346f89c4858c183565554494fc01"
170177

experiments/long_runs/leaderboard/data_sources.jl

Lines changed: 186 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import ClimaAnalysis
2+
import ClimaLand
23

34
"""
45
get_sim_var_dict(diagnostics_folder_path)
@@ -66,14 +67,48 @@ function get_sim_var_dict(diagnostics_folder_path)
6667
)
6768
return sim_var
6869
end
70+
71+
sim_var_dict["lhf"] =
72+
() -> begin
73+
sim_var = get(
74+
ClimaAnalysis.SimDir(diagnostics_folder_path),
75+
short_name = "lhf",
76+
)
77+
sim_var =
78+
ClimaAnalysis.shift_to_start_of_previous_month(sim_var)
79+
return sim_var
80+
end
81+
82+
sim_var_dict["shf"] =
83+
() -> begin
84+
sim_var = get(
85+
ClimaAnalysis.SimDir(diagnostics_folder_path),
86+
short_name = "shf",
87+
)
88+
sim_var =
89+
ClimaAnalysis.shift_to_start_of_previous_month(sim_var)
90+
return sim_var
91+
end
92+
93+
sim_var_dict["swu"] =
94+
() -> begin
95+
sim_var = get(
96+
ClimaAnalysis.SimDir(diagnostics_folder_path),
97+
short_name = "swu",
98+
)
99+
sim_var =
100+
ClimaAnalysis.shift_to_start_of_previous_month(sim_var)
101+
return sim_var
102+
end
69103
return sim_var_dict
70104
end
71105

72106
"""
73-
get_obs_var_dict()
107+
get_obs_var_dict(data_source)
74108
75109
Return a dictionary mapping short names to `OutputVar` containing preprocessed
76-
observational data. This is used by the function `compute_leaderboard`.
110+
observational data. This is used by the function `compute_leaderboard`.The
111+
argument `data_source` can either be "ERA5" or "ILAMB".
77112
78113
To add a variable for the leaderboard, add a key-value pair to the dictionary
79114
`obs_var_dict` whose key is the short name of the variable and the value is an
@@ -86,7 +121,23 @@ dates.
86121
87122
The variable should have only three dimensions: latitude, longitude, and time.
88123
"""
89-
function get_obs_var_dict()
124+
function get_obs_var_dict(data_source)
125+
if uppercase(data_source) == "ILAMB"
126+
return get_ilamb_obs_var_dict()
127+
elseif uppercase(data_source) == "ERA5"
128+
return get_era5_obs_var_dict()
129+
else
130+
error("Did not expect $data_source for the data source")
131+
end
132+
end
133+
134+
"""
135+
get_ilamb_obs_var_dict()
136+
137+
Get ILAMB observational data. See `get_obs_var_dict` for more information for
138+
how to add new variables.
139+
"""
140+
function get_ilamb_obs_var_dict()
90141
# Dict for loading in observational data
91142
obs_var_dict = Dict{String, Any}()
92143
obs_var_dict["et"] =
@@ -143,12 +194,93 @@ function get_obs_var_dict()
143194
return obs_var_dict
144195
end
145196

197+
"""
198+
get_era5_obs_var_dict()
199+
200+
Get ERA5 observational data. See `get_obs_var_dict` for more information for
201+
how to add new variables.
202+
"""
203+
function get_era5_obs_var_dict()
204+
obs_var_dict = Dict{String, Any}()
205+
era5_data_path = joinpath(
206+
ClimaLand.Artifacts.era5_monthly_averages_single_level_path(),
207+
"era5_monthly_averages_surface_single_level_197901-202410.nc",
208+
)
209+
210+
obs_var_dict["lhf"] =
211+
(start_date) -> begin
212+
obs_var = ClimaAnalysis.OutputVar(
213+
era5_data_path,
214+
"mslhf",
215+
new_start_date = start_date,
216+
shift_by = Dates.firstdayofmonth,
217+
)
218+
(ClimaAnalysis.units(obs_var) == "W m**-2") && (
219+
obs_var = ClimaAnalysis.convert_units(
220+
obs_var,
221+
"W m^-2",
222+
conversion_function = units -> units * -1.0,
223+
)
224+
)
225+
return obs_var
226+
end
227+
228+
obs_var_dict["shf"] =
229+
(start_date) -> begin
230+
obs_var = ClimaAnalysis.OutputVar(
231+
era5_data_path,
232+
"msshf",
233+
new_start_date = start_date,
234+
shift_by = Dates.firstdayofmonth,
235+
)
236+
237+
(ClimaAnalysis.units(obs_var) == "W m**-2") && (
238+
obs_var = ClimaAnalysis.convert_units(
239+
obs_var,
240+
"W m^-2",
241+
conversion_function = units -> units * -1.0,
242+
)
243+
)
244+
245+
return obs_var
246+
end
247+
248+
obs_var_dict["lwu"] =
249+
(start_date) -> begin
250+
obs_var = ClimaAnalysis.OutputVar(
251+
era5_data_path,
252+
"msuwlwrf",
253+
new_start_date = start_date,
254+
shift_by = Dates.firstdayofmonth,
255+
)
256+
(ClimaAnalysis.units(obs_var) == "W m**-2") &&
257+
(obs_var = ClimaAnalysis.set_units(obs_var, "W m^-2"))
258+
return obs_var
259+
end
260+
261+
obs_var_dict["swu"] =
262+
(start_date) -> begin
263+
obs_var = ClimaAnalysis.OutputVar(
264+
era5_data_path,
265+
"msuwswrf",
266+
new_start_date = start_date,
267+
shift_by = Dates.firstdayofmonth,
268+
)
269+
270+
(ClimaAnalysis.units(obs_var) == "W m**-2") &&
271+
(obs_var = ClimaAnalysis.set_units(obs_var, "W m^-2"))
272+
return obs_var
273+
end
274+
return obs_var_dict
275+
end
276+
146277
"""
147278
get_mask_dict()
148279
149280
Return a dictionary mapping short names to a function which takes in `sim_var`,
150281
a `OutputVar` containing simulation data, and `obs_var`, a `OutputVar`
151-
containing observational data, and return a masking function.
282+
containing observational data, and return a masking function. The argument
283+
`data_source` is either `ILAMB` or `ERA5`.
152284
153285
To add a variable to the leaderboard, add a key-value pair to the dictionary
154286
`mask_dict` whose key is the same short name in `sim_var_dict` and the value is
@@ -157,34 +289,55 @@ a function that takes in a `OutputVar` representing simulation data and a
157289
`nothing` if a masking function is not needed. The masking function is used to
158290
correctly normalize the global bias and global RMSE.
159291
"""
160-
function get_mask_dict()
292+
function get_mask_dict(data_source)
161293
# Dict for loading in masks
162294
mask_dict = Dict{String, Any}()
163295

164-
mask_dict["et"] =
296+
# LWU is found in both ERA5 and ILAMB
297+
mask_dict["lwu"] =
165298
(sim_var, obs_var) -> begin
166-
return ClimaAnalysis.make_lonlat_mask(
167-
ClimaAnalysis.slice(
168-
obs_var,
169-
time = ClimaAnalysis.times(obs_var) |> first,
170-
);
171-
set_to_val = isnan,
172-
)
299+
return ClimaAnalysis.apply_oceanmask
173300
end
174301

175-
mask_dict["gpp"] =
176-
(sim_var, obs_var) -> begin
177-
return ClimaAnalysis.make_lonlat_mask(
178-
ClimaAnalysis.slice(
179-
obs_var,
180-
time = ClimaAnalysis.times(obs_var) |> first,
181-
);
182-
set_to_val = isnan,
183-
)
184-
end
302+
if uppercase(data_source) == "ILAMB"
303+
mask_dict["et"] =
304+
(sim_var, obs_var) -> begin
305+
return ClimaAnalysis.make_lonlat_mask(
306+
ClimaAnalysis.slice(
307+
obs_var,
308+
time = ClimaAnalysis.times(obs_var) |> first,
309+
);
310+
set_to_val = isnan,
311+
)
312+
end
313+
314+
mask_dict["gpp"] =
315+
(sim_var, obs_var) -> begin
316+
return ClimaAnalysis.make_lonlat_mask(
317+
ClimaAnalysis.slice(
318+
obs_var,
319+
time = ClimaAnalysis.times(obs_var) |> first,
320+
);
321+
set_to_val = isnan,
322+
)
323+
end
324+
elseif uppercase(data_source) == "ERA5"
325+
mask_dict["shf"] =
326+
(sim_var, obs_var) -> begin
327+
return ClimaAnalysis.apply_oceanmask
328+
end
329+
330+
mask_dict["lhf"] =
331+
(sim_var, obs_var) -> begin
332+
return ClimaAnalysis.apply_oceanmask
333+
end
185334

186-
mask_dict["lwu"] = (sim_var, obs_var) -> begin
187-
return nothing
335+
mask_dict["swu"] =
336+
(sim_var, obs_var) -> begin
337+
return ClimaAnalysis.apply_oceanmask
338+
end
339+
else
340+
error("Did not expect $data_source for the data source")
188341
end
189342
return mask_dict
190343
end
@@ -201,7 +354,13 @@ the value is a tuple, where the first element is the lower bound and the last
201354
element is the upper bound for the bias plots.
202355
"""
203356
function get_compare_vars_biases_plot_extrema()
204-
compare_vars_biases_plot_extrema =
205-
Dict("et" => (-2.0, 2.0), "gpp" => (-6.0, 6.0), "lwu" => (-40.0, 40.0))
357+
compare_vars_biases_plot_extrema = Dict(
358+
"et" => (-2.0, 2.0),
359+
"gpp" => (-6.0, 6.0),
360+
"lwu" => (-40.0, 40.0),
361+
"shf" => (-50.0, 50.0),
362+
"lhf" => (-40.0, 40.0),
363+
"swu" => (-50.0, 50.0),
364+
)
206365
return compare_vars_biases_plot_extrema
207366
end

0 commit comments

Comments
 (0)