1
1
import ClimaAnalysis
2
+ import ClimaLand
2
3
3
4
"""
4
5
get_sim_var_dict(diagnostics_folder_path)
@@ -66,14 +67,48 @@ function get_sim_var_dict(diagnostics_folder_path)
66
67
)
67
68
return sim_var
68
69
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
69
103
return sim_var_dict
70
104
end
71
105
72
106
"""
73
- get_obs_var_dict()
107
+ get_obs_var_dict(data_source )
74
108
75
109
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".
77
112
78
113
To add a variable for the leaderboard, add a key-value pair to the dictionary
79
114
`obs_var_dict` whose key is the short name of the variable and the value is an
@@ -86,7 +121,23 @@ dates.
86
121
87
122
The variable should have only three dimensions: latitude, longitude, and time.
88
123
"""
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 ()
90
141
# Dict for loading in observational data
91
142
obs_var_dict = Dict {String, Any} ()
92
143
obs_var_dict[" et" ] =
@@ -143,12 +194,93 @@ function get_obs_var_dict()
143
194
return obs_var_dict
144
195
end
145
196
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
+
146
277
"""
147
278
get_mask_dict()
148
279
149
280
Return a dictionary mapping short names to a function which takes in `sim_var`,
150
281
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`.
152
284
153
285
To add a variable to the leaderboard, add a key-value pair to the dictionary
154
286
`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
157
289
`nothing` if a masking function is not needed. The masking function is used to
158
290
correctly normalize the global bias and global RMSE.
159
291
"""
160
- function get_mask_dict ()
292
+ function get_mask_dict (data_source )
161
293
# Dict for loading in masks
162
294
mask_dict = Dict {String, Any} ()
163
295
164
- mask_dict[" et" ] =
296
+ # LWU is found in both ERA5 and ILAMB
297
+ mask_dict[" lwu" ] =
165
298
(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
173
300
end
174
301
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
185
334
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" )
188
341
end
189
342
return mask_dict
190
343
end
@@ -201,7 +354,13 @@ the value is a tuple, where the first element is the lower bound and the last
201
354
element is the upper bound for the bias plots.
202
355
"""
203
356
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
+ )
206
365
return compare_vars_biases_plot_extrema
207
366
end
0 commit comments