@@ -74,42 +74,46 @@ function get_sim_var_dict(simdir)
74
74
return sim_var_swd
75
75
end
76
76
77
- # # Compute LWN = LWD - LWU
78
- # sim_var_dict["lwn"] =
79
- # () -> begin
80
- # lwd = sim_var_dict["lwd"]()
81
- # lwu = sim_var_dict["lwu"]()
82
- # lwn = lwd - lwu
83
- # lwn.attributes["long_name"] = "Net longwave radiation"
84
- # lwn.attributes["units"] = "W m⁻²"
85
- # return lwn
86
- # end
87
-
88
- # # Compute SWN = SWD - SWU
89
- # sim_var_dict["swn"] =
90
- # () -> begin
91
- # swd = sim_var_dict["swd"]()
92
- # swu = sim_var_dict["swu"]()
93
- # swn = swd - swu
94
- # swn.attributes["long_name"] = "Net shortwave radiation"
95
- # swn.attributes["units"] = "W m⁻²"
96
- # return swn
97
- # end
77
+ # Compute LWN = LWD - LWU
78
+ sim_var_dict[" lwn" ] =
79
+ () -> begin
80
+ lwd = sim_var_dict[" lwd" ]()
81
+ lwu = sim_var_dict[" lwu" ]()
82
+ lwn = lwd - lwu
83
+ lwn. attributes[" long_name" ] = " Net longwave radiation"
84
+ lwn. attributes[" units" ] = " W m⁻²"
85
+ lwn. attributes[" start_date" ] = lwu. attributes[" start_date" ]
86
+ return lwn
87
+ end
88
+
89
+ # Compute SWN = SWD - SWU
90
+ sim_var_dict[" swn" ] =
91
+ () -> begin
92
+ swd = sim_var_dict[" swd" ]()
93
+ swu = sim_var_dict[" swu" ]()
94
+ swn = swd - swu
95
+ swn. attributes[" long_name" ] = " Net shortwave radiation"
96
+ swn. attributes[" units" ] = " W m⁻²"
97
+ swn. attributes[" start_date" ] = swu. attributes[" start_date" ]
98
+ return swn
99
+ end
98
100
99
101
return sim_var_dict
100
102
end
101
103
102
104
function get_obs_var_dict ()
105
+ # contains monthly mslhf, msshf, msuwlwrf, msuwswrf
103
106
era5_data_path = joinpath (
104
107
ClimaLand. Artifacts. era5_monthly_averages_2008_folder_path (),
105
108
" era5_monthly_surface_fluxes_200801-200812.nc" ,
106
109
)
107
- # era5_land_forcing_data_path = joinpath(
108
- # ClimaLand.Artifacts.era5_land_forcing_data2008_folder_path(
109
- # lowres = false,
110
- # ),
111
- # "era5_2008_0.9x1.25.nc",
112
- # )
110
+ # contains hourly msdwlwrf, msdwswrf
111
+ era5_land_forcing_data_path = joinpath (
112
+ ClimaLand. Artifacts. era5_land_forcing_data2008_folder_path (
113
+ lowres = false ,
114
+ ),
115
+ " era5_2008_1.0x1.0.nc" ,
116
+ )
113
117
114
118
# Dict for loading in observational data
115
119
obs_var_dict = Dict {String, Any} ()
@@ -132,11 +136,11 @@ function get_obs_var_dict()
132
136
)
133
137
134
138
# Copy data at lon = 0 to lon = 360 to avoid white lines
135
- push! (obs_var. dims[" longitude " ], 360 )
139
+ push! (obs_var. dims[ClimaAnalysis . longitude_name (obs_var) ], 360 )
136
140
new_data =
137
141
- 1 * cat (obs_var. data, obs_var. data[[1 ], :, :], dims = 1 )
138
142
# # relabel longitude values from [0, 359] to [-180, 179]
139
- # obs_var.dims["longitude" ] = obs_var.dims["longitude" ] .- 180
143
+ # obs_var.dims[ClimaAnalysis.longitude_name(obs_var) ] = obs_var.dims[ClimaAnalysis.longitude_name(obs_var) ] .- 180
140
144
obs_var_pos = ClimaAnalysis. OutputVar (
141
145
attribs,
142
146
obs_var. dims,
@@ -165,7 +169,7 @@ function get_obs_var_dict()
165
169
" start_date" => start_date,
166
170
)
167
171
# Copy data at lon = 0 to lon = 360 to avoid white lines
168
- push! (obs_var. dims[" longitude " ], 360 )
172
+ push! (obs_var. dims[ClimaAnalysis . longitude_name (obs_var) ], 360 )
169
173
new_data =
170
174
- 1 * cat (obs_var. data, obs_var. data[[1 ], :, :], dims = 1 )
171
175
obs_var_pos = ClimaAnalysis. OutputVar (
@@ -190,7 +194,7 @@ function get_obs_var_dict()
190
194
obs_var = ClimaAnalysis. replace (obs_var, missing => NaN )
191
195
192
196
# Copy data at lon = 0 to lon = 360 to avoid white lines
193
- push! (obs_var. dims[" longitude " ], 360 )
197
+ push! (obs_var. dims[ClimaAnalysis . longitude_name (obs_var) ], 360 )
194
198
new_data = cat (obs_var. data, obs_var. data[[1 ], :, :], dims = 1 )
195
199
196
200
# Manually set attributes
@@ -222,7 +226,7 @@ function get_obs_var_dict()
222
226
obs_var = ClimaAnalysis. replace (obs_var, missing => NaN )
223
227
224
228
# Copy data at lon = 0 to lon = 360 to avoid white lines
225
- push! (obs_var. dims[" longitude " ], 360 )
229
+ push! (obs_var. dims[ClimaAnalysis . longitude_name (obs_var) ], 360 )
226
230
new_data = cat (obs_var. data, obs_var. data[[1 ], :, :], dims = 1 )
227
231
# Manually set attributes
228
232
attribs = Dict (
@@ -245,15 +249,15 @@ function get_obs_var_dict()
245
249
obs_var_dict[" lwd" ] =
246
250
(start_date) -> begin
247
251
obs_var = ClimaAnalysis. OutputVar (
248
- era5_data_path ,
252
+ era5_land_forcing_data_path ,
249
253
" msdwlwrf" ,
250
254
new_start_date = start_date,
251
255
shift_by = Dates. firstdayofmonth,
252
256
) # units (W/m²)
253
257
obs_var = ClimaAnalysis. replace (obs_var, missing => NaN )
254
258
255
259
# Copy data at lon = 0 to lon = 360 to avoid white lines
256
- push! (obs_var. dims[" longitude " ], 360 )
260
+ push! (obs_var. dims[ClimaAnalysis . longitude_name (obs_var) ], 360 )
257
261
new_data = cat (obs_var. data, obs_var. data[[1 ], :, :], dims = 1 )
258
262
# Manually set attributes
259
263
attribs = Dict (
@@ -276,15 +280,15 @@ function get_obs_var_dict()
276
280
obs_var_dict[" swd" ] =
277
281
(start_date) -> begin
278
282
obs_var = ClimaAnalysis. OutputVar (
279
- era5_data_path ,
283
+ era5_land_forcing_data_path ,
280
284
" msdwswrf" ,
281
285
new_start_date = start_date,
282
286
shift_by = Dates. firstdayofmonth,
283
287
) # units (W/m²)
284
288
obs_var = ClimaAnalysis. replace (obs_var, missing => NaN )
285
289
286
290
# Copy data at lon = 0 to lon = 360 to avoid white lines
287
- push! (obs_var. dims[" longitude " ], 360 )
291
+ push! (obs_var. dims[ClimaAnalysis . longitude_name (obs_var) ], 360 )
288
292
new_data = cat (obs_var. data, obs_var. data[[1 ], :, :], dims = 1 )
289
293
# Manually set attributes
290
294
attribs = Dict (
@@ -304,27 +308,81 @@ function get_obs_var_dict()
304
308
end
305
309
306
310
307
- # # Compute LWN = LWD - LWU
308
- # obs_var_dict["lwn"] =
309
- # (start_date) -> begin
310
- # lwd = obs_var_dict["lwd"](start_date)
311
- # lwu = obs_var_dict["lwu"](start_date)
312
- # lwn = lwd - lwu
313
- # lwn.attributes["long_name"] = "Net longwave radiation"
314
- # lwn.attributes["units"] = "W m⁻²"
315
- # return lwu
316
- # end
317
-
318
- # # Compute SWN = SWD - SWU
319
- # obs_var_dict["swn"] =
320
- # (start_date) -> begin
321
- # swd = obs_var_dict["swd"](start_date)
322
- # swu = obs_var_dict["swu"](start_date)
323
- # swn = swd - swu
324
- # swn.attributes["long_name"] = "Net shortwave radiation"
325
- # swn.attributes["units"] = "W m⁻²"
326
- # return swn
327
- # end
311
+ # Compute LWN = LWD - LWU
312
+ obs_var_dict[" lwn" ] =
313
+ (start_date) -> begin
314
+ # LWD is very large because it's hourly, so it takes a while to load
315
+ lwd = obs_var_dict[" lwd" ](start_date)
316
+ lwu = obs_var_dict[" lwu" ](start_date)
317
+
318
+ monthly_times = lwu. dims[" time" ]
319
+ lwd_monthly_data = similar (lwu. data)
320
+ # average hourly LWD data to monthly so we can compare with monthly LWU
321
+ for (idx, time) in enumerate (monthly_times)
322
+ # collect all hourly time indices in this month
323
+ time_idxs = findall (x -> (x == time), lwd. dims[" time" ])
324
+
325
+ # average hourly data to monthly
326
+ lwd_monthly_data[:, :, idx] =
327
+ mean (lwd. data[:, :, time_idxs], dims = 3 )
328
+ end
329
+
330
+ # Compute LWN = LWD - LWU
331
+ lwn_data = lwd_monthly_data - lwu. data
332
+
333
+ attribs = Dict (
334
+ " short_name" => " lwn" ,
335
+ " long_name" => " Net longwave radiation" ,
336
+ " units" => " W m⁻²" ,
337
+ " start_date" => start_date,
338
+ )
339
+
340
+ lwn = ClimaAnalysis. OutputVar (
341
+ attribs,
342
+ lwu. dims,
343
+ lwu. dim_attributes,
344
+ lwn_data,
345
+ )
346
+ return lwn
347
+ end
348
+
349
+ # Compute SWN = SWD - SWU
350
+ obs_var_dict[" swn" ] =
351
+ (start_date) -> begin
352
+ # SWD is very large because it's hourly, so it takes a while to load
353
+ swd = obs_var_dict[" swd" ](start_date)
354
+ swu = obs_var_dict[" swu" ](start_date)
355
+
356
+ monthly_times = swu. dims[" time" ]
357
+ swd_monthly_data = similar (swu. data)
358
+ # average hourly SWD data to monthly so we can compare with monthly SWU
359
+ for (idx, time) in enumerate (monthly_times)
360
+ # collect all hourly time indices in this month
361
+ time_idxs = findall (x -> (x == time), swd. dims[" time" ])
362
+
363
+ # average hourly data to monthly
364
+ swd_monthly_data[:, :, idx] =
365
+ mean (swd. data[:, :, time_idxs], dims = 3 )
366
+ end
367
+
368
+ # Compute SWN = SWD - SWU
369
+ swn_data = swd_monthly_data - swu. data
370
+
371
+ attribs = Dict (
372
+ " short_name" => " swn" ,
373
+ " long_name" => " Net shortwave radiation" ,
374
+ " units" => " W m⁻²" ,
375
+ " start_date" => start_date,
376
+ )
377
+
378
+ swn = ClimaAnalysis. OutputVar (
379
+ attribs,
380
+ swu. dims,
381
+ swu. dim_attributes,
382
+ swn_data,
383
+ )
384
+ return swn
385
+ end
328
386
329
387
return obs_var_dict
330
388
end
0 commit comments