Skip to content

Commit d2f07d4

Browse files
committed
more informative surge interpolation errors, and catch failed interpolation
1 parent 7241da8 commit d2f07d4

File tree

1 file changed

+36
-9
lines changed

1 file changed

+36
-9
lines changed

pyCIAM/run.py

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,24 @@ def calc_costs(
332332
# interpolation with 0's
333333
surge_noadapt = []
334334
surge = []
335+
336+
def _check_vals(rh_diff_arr, lslr_arr, seg):
337+
error_str = (
338+
"{0} value is {1} than {2} in storm damage lookup "
339+
f"table for segment {seg}. Please investigate why this is. You may "
340+
"need to re-generate the surge lookup table (or perhaps the `refA` "
341+
"(initial adaptation) table if it was generated for a different "
342+
"set of SLR scenarios or years."
343+
)
344+
if rh_diff_arr.max() > this_surge_lookup.rh_diff.max():
345+
raise ValueError(error_str.format("rh_diff", "higher", "maximum"))
346+
if rh_diff_arr.min() < this_surge_lookup.rh_diff.min():
347+
raise ValueError(error_str.format("rh_diff", "lower", "minimum"))
348+
if lslr_arr.max() > this_surge_lookup.lslr.max():
349+
raise ValueError(error_str.format("lslr", "higher", "maximum"))
350+
if lslr_arr.min() < this_surge_lookup.lslr.min():
351+
raise ValueError(error_str.format("lslr", "lower", "minimum"))
352+
335353
for seg in inputs.seg.values:
336354
this_surge_lookup = (
337355
surge_lookup.sel(seg=seg)
@@ -342,38 +360,47 @@ def calc_costs(
342360
lslr_too_low = lslr.sel(seg=seg) < this_surge_lookup.lslr.min()
343361
if this_surge_lookup.sum() == 0:
344362
continue
363+
364+
this_rh_diff_noadapt = rh_diff_noadapt.sel(seg=seg, drop=True)
365+
this_lslr = lslr.sel(seg=seg, drop=True)
366+
_check_vals(this_rh_diff_noadapt, this_lslr, seg)
367+
345368
this_surge_noadapt = (
346369
this_surge_lookup.sel(adapttype="retreat", drop=True)
347370
.interp(
348-
lslr=lslr.sel(seg=seg),
349-
rh_diff=rh_diff_noadapt.sel(seg=seg),
371+
lslr=this_lslr,
372+
rh_diff=this_rh_diff_noadapt,
350373
assume_sorted=True,
351374
)
352375
.reset_coords(drop=True)
353376
.expand_dims(seg=[seg])
354377
)
355378

356379
# ensure nans are only at the beginning
357-
assert (this_surge_noadapt.notnull() | lslr_too_low).all()
380+
assert (this_surge_noadapt.notnull() | lslr_too_low).all(), seg
358381

359382
surge_noadapt.append(this_surge_noadapt.fillna(0))
360383

361384
surge_adapt = []
385+
386+
this_rh_diff_adapt = rh_diff.sel(seg=seg, drop=True)
387+
_check_vals(this_rh_diff_noadapt, this_lslr, seg)
388+
362389
for adapttype in this_surge_lookup.adapttype.values:
363390
this_surge_adapt = (
364391
this_surge_lookup.sel(adapttype=adapttype)
365392
.interp(
366-
lslr=lslr.sel(seg=seg),
367-
rh_diff=rh_diff.sel(
368-
adapttype=adapttype, seg=seg, drop=True
393+
lslr=this_lslr,
394+
rh_diff=this_rh_diff_adapt.sel(
395+
adapttype=adapttype, drop=True
369396
),
370397
assume_sorted=True,
371398
)
372399
.reset_coords(drop=True)
373400
)
374401

375402
# ensure nans are only at the beginning
376-
assert (this_surge_adapt.notnull() | lslr_too_low).all()
403+
assert (this_surge_adapt.notnull() | lslr_too_low).all(), seg
377404

378405
surge_adapt.append(this_surge_adapt.fillna(0))
379406
surge.append(
@@ -1157,7 +1184,7 @@ def execute_pyciam(
11571184
storage_options=storage_options,
11581185
)
11591186
# block on this calculation
1160-
wait(surge_futs)
1187+
client.gather(surge_futs)
11611188

11621189
###############################
11631190
# define temporary output store
@@ -1380,7 +1407,7 @@ def execute_pyciam(
13801407
###############################
13811408
# Rechunk and save final
13821409
###############################
1383-
wait(ciam_futs_2.tolist())
1410+
client.gather(ciam_futs_2.tolist())
13841411
assert [f.status == "finished" for f in ciam_futs_2.tolist()]
13851412
client.cancel(ciam_futs_2)
13861413
del ciam_futs_2

0 commit comments

Comments
 (0)