Skip to content

Commit 07c25f1

Browse files
authored
Make sure a skill array with the right dimensions is returned when multiple models are used (#279)
* Make sure a skill array with the right dimensions is returned when multiple nwp models are used * Add missing test * add clim_kwargs test for blending/steps.py
1 parent 9c252b5 commit 07c25f1

File tree

4 files changed

+56
-6
lines changed

4 files changed

+56
-6
lines changed

pysteps/blending/skill_scores.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ def clim_regr_values(n_cascade_levels, outdir_path, n_model=0, skill_kwargs=None
232232
"""
233233

234234
if skill_kwargs is None:
235-
skill_kwargs = dict()
235+
skill_kwargs = {"n_models": 1}
236236

237237
# First, obtain climatological skill values
238238
try:
@@ -242,8 +242,8 @@ def clim_regr_values(n_cascade_levels, outdir_path, n_model=0, skill_kwargs=None
242242
except FileNotFoundError:
243243
# The climatological skill values file does not exist yet, so we'll
244244
# use the default values from BPS2004.
245-
clim_cor_values = np.array(
246-
[[0.848, 0.537, 0.237, 0.065, 0.020, 0.0044, 0.0052, 0.0040]]
245+
clim_cor_values = clim.get_default_skill(
246+
n_cascade_levels=n_cascade_levels, n_models=skill_kwargs["n_models"]
247247
)
248248

249249
clim_cor_values = clim_cor_values[n_model, :]

pysteps/blending/steps.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,8 @@ def forecast(
368368
vel_pert_kwargs = dict()
369369

370370
if clim_kwargs is None:
371-
clim_kwargs = dict()
371+
# Make sure clim_kwargs at least contains the number of models
372+
clim_kwargs = dict({"n_models": precip_models.shape[0]})
372373

373374
if mask_kwargs is None:
374375
mask_kwargs = dict()

pysteps/tests/test_blending_skill_scores.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@
6969
"expected_cor_t0",
7070
"expected_cor_nwp_lt",
7171
"expected_cor_nowcast_lt",
72+
"n_model",
73+
"number_of_models",
7274
)
7375

7476
# Test function values
@@ -107,6 +109,8 @@
107109
0.996475,
108110
]
109111
),
112+
0,
113+
None,
110114
),
111115
(
112116
obs_6lev,
@@ -122,6 +126,8 @@
122126
[0.97455941, 0.9356775, 0.81972779, 0.55202975, 0.31534738, 0.02264599]
123127
),
124128
np.array([0.996475, 0.996475, 0.996475, 0.996475, 0.996475, 0.996475]),
129+
0,
130+
1,
125131
),
126132
(
127133
obs_9lev,
@@ -159,6 +165,34 @@
159165
0.996475,
160166
]
161167
),
168+
0,
169+
1,
170+
),
171+
(
172+
obs_8lev,
173+
mod_8lev,
174+
0,
175+
PHI_8lev,
176+
None,
177+
clim_cor_values_8lev,
178+
regr_pars_8lev,
179+
8,
180+
np.repeat(1.0, 8),
181+
np.repeat(1.0, 8),
182+
np.array(
183+
[
184+
0.996475,
185+
0.996475,
186+
0.996475,
187+
0.996475,
188+
0.996475,
189+
0.996475,
190+
0.996475,
191+
0.996475,
192+
]
193+
),
194+
0,
195+
1,
162196
),
163197
(
164198
obs_8lev,
@@ -183,6 +217,8 @@
183217
0.996475,
184218
]
185219
),
220+
1,
221+
2,
186222
),
187223
]
188224

@@ -203,6 +239,8 @@ def test_blending_skill_scores(
203239
expected_cor_t0,
204240
expected_cor_nwp_lt,
205241
expected_cor_nowcast_lt,
242+
n_model,
243+
number_of_models,
206244
):
207245
"""Tests if the skill_score functions behave correctly. A dummy gridded
208246
model and observation field should be given for n_cascade_levels, which
@@ -212,6 +250,11 @@ def test_blending_skill_scores(
212250
extrapolation field.
213251
214252
"""
253+
if number_of_models != None:
254+
skill_kwargs = {"n_models": number_of_models}
255+
else:
256+
skill_kwargs = None
257+
215258
domain_mask = np.full(obs[0, :, :].shape, False, dtype=bool)
216259

217260
# Calculate the spatial correlation of the given model field
@@ -238,7 +281,10 @@ def test_blending_skill_scores(
238281
# a lead time in minutes
239282
# First, check if the climatological values are returned correctly
240283
correlations_clim, regr_clim = clim_regr_values(
241-
n_cascade_levels=n_cascade_levels, outdir_path="./tmp/"
284+
n_cascade_levels=n_cascade_levels,
285+
outdir_path="./tmp/",
286+
n_model=n_model,
287+
skill_kwargs=skill_kwargs,
242288
)
243289
assert (
244290
correlations_clim.shape[0] == n_cascade_levels

pysteps/tests/test_blending_steps.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,10 @@ def test_steps_blending(
114114

115115
# Also set the outdir_path and clim_kwargs
116116
outdir_path_skill = "./tmp/"
117-
clim_kwargs = dict({"n_models": n_models, "window_length": 30})
117+
if n_models == 1:
118+
clim_kwargs = None
119+
else:
120+
clim_kwargs = dict({"n_models": n_models, "window_length": 30})
118121

119122
###
120123
# First threshold the data and convert it to dBR

0 commit comments

Comments
 (0)