Skip to content

Commit

Permalink
RNR Hotfix: Workflow modified to save and reassign status rather than…
Browse files Browse the repository at this point in the history
… recalculate (#603)

The RFC 5-Day Max Downstream Streamflow service was completely
recalculating its status based on comparing the output RnR flows to
streamflow thresholds where available. Because streamflow thresholds are
not available for every site, certain sites were not able to be
categorized. This is silly since the flood status of every relevant
point is already pre-calculated as the starting point for the RnR
WRF-Hydro inputs. Thus, this fix writes those statuses to the db during
pre-processing and then joins to that table to re-assign the status at
post-processing.

These changes fix a number of issues reported by WPOD:
https://vlab.noaa.gov/redmine/issues/124216
https://vlab.noaa.gov/redmine/issues/124212
https://vlab.noaa.gov/redmine/issues/124202
https://vlab.noaa.gov/redmine/issues/124165

The changes herein were hotfixed in-place, manually, on Production.
  • Loading branch information
shawncrawley authored Jan 3, 2024
1 parent de4f3ac commit d5fac78
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 61 deletions.
75 changes: 45 additions & 30 deletions Core/LAMBDA/rnr_functions/rnr_domain_generator/sql/domain.sql
Original file line number Diff line number Diff line change
Expand Up @@ -105,13 +105,13 @@ SELECT
INTO rnr.temporal_domain_flow_forecasts
FROM all_flow_forecasts;

-------------------------------------------------------
-------------------------------------------------------
------------- CREATE RNR DOMAIN ROUTLINK -------------
-------------------------------------------------------
-------------------------------------------------------
-----------------------------------------------------------------
-----------------------------------------------------------------
------------- CREATE DOMAIN LIDS WITH STATUS TABLE -------------
-----------------------------------------------------------------
-----------------------------------------------------------------

DROP TABLE IF EXISTS rnr.domain_routelink;
DROP TABLE IF EXISTS rnr.domain_lids_with_status;

WITH RECURSIVE

Expand Down Expand Up @@ -215,10 +215,11 @@ max_status_flow AS (
THEN CASE
WHEN th.record_flow IS NOT NULL AND mf.max_flow_cfs >= th.record_flow
THEN 'record'
ELSE 'thresholds undefined'
ELSE 'all thresholds undefined'
END
ELSE 'no_flooding'
END as status
ELSE 'no flooding'
END as status,
rating_source
FROM max_flow AS mf
LEFT JOIN threshold AS th
ON th.nws_station_id = mf.lid
Expand All @@ -240,39 +241,53 @@ max_status_stage AS (
THEN CASE
WHEN th.record_stage IS NOT NULL AND mf.max_stage_ft >= th.record_stage
THEN 'record'
ELSE 'thresholds undefined'
ELSE 'all thresholds undefined'
END
ELSE 'no_flooding'
END as status
ELSE 'no flooding'
END as status,
rating_source
FROM max_stage AS mf
LEFT JOIN threshold AS th
ON th.nws_station_id = mf.lid
),

flood_flow_lid AS (
SELECT lid
FROM max_status_flow
WHERE status in ('action', 'minor', 'moderate', 'major', 'record')
),

flood_stage_lid AS (
SELECT lid
lid_status AS (
SELECT
lid,
status,
rating_source
FROM max_status_stage
WHERE status in ('action', 'minor', 'moderate', 'major', 'record')
),

flood_lid AS (

UNION

SELECT
lid
FROM flood_flow_lid
lid,
status,
rating_source
FROM max_status_flow
WHERE lid NOT IN (SELECT lid FROM max_status_stage)
)

UNION
SELECT *
INTO rnr.domain_lids_with_status
FROM lid_status
LEFT JOIN derived.ahps_restricted_sites restricted
ON restricted.nws_lid = lid_status.lid
WHERE restricted.nws_lid IS NULL;

-------------------------------------------------------
-------------------------------------------------------
------------- CREATE RNR DOMAIN ROUTLINK -------------
-------------------------------------------------------
-------------------------------------------------------

DROP TABLE IF EXISTS rnr.domain_routelink;

WITH RECURSIVE flood_lid AS (
SELECT
lid
FROM flood_stage_lid
WHERE lid NOT IN (SELECT lid FROM flood_flow_lid)
AND lid IN (SELECT lid FROM max_flow)
FROM rnr.domain_lids_with_status
WHERE status IN ('action', 'minor', 'moderate', 'major')
),

flood_xwalk AS (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,39 +118,13 @@ root_status_trace_reaches AS (
stream_length,
is_waterbody,
fcst_meta.issue_time,
rating_source,
CASE
WHEN rfc_defined_fcst_point AND fcst_meta.issue_time IS NULL
THEN 'No Forecast'
WHEN major_flow IS NOT NULL AND streamflow > major_flow
THEN 'Major'
WHEN major_stage IS NOT NULL AND stage_from_curve > major_stage
THEN 'Major'
WHEN moderate_flow IS NOT NULL AND streamflow > moderate_flow
THEN 'Moderate'
WHEN moderate_stage IS NOT NULL AND stage_from_curve > moderate_stage
THEN 'Moderate'
WHEN minor_flow IS NOT NULL AND streamflow > minor_flow
THEN 'Minor'
WHEN minor_stage IS NOT NULL AND stage_from_curve > minor_stage
THEN 'Minor'
WHEN action_flow IS NOT NULL AND streamflow > action_flow
THEN 'Action'
WHEN action_stage IS NOT NULL AND stage_from_curve > action_stage
THEN 'Action'
WHEN issue_time IS NOT NULL
AND action_flow IS NULL AND minor_flow IS NULL AND moderate_flow IS NULL AND major_flow IS NULL
AND action_stage IS NULL AND minor_stage IS NULL AND moderate_stage IS NULL AND major_stage IS NULL
THEN 'All Thresholds Undefined'
WHEN mf.nws_station_id IS NOT NULL
THEN 'No Flooding'
ELSE ''
END as max_status
status.rating_source,
INITCAP(status.status) as max_status
FROM max_flows_station_xwalk_with_rc_stage mf
LEFT JOIN fcst_meta
ON fcst_meta.lid = mf.nws_station_id
LEFT JOIN threshold
ON threshold.nws_station_id = mf.nws_station_id
LEFT JOIN rnr.domain_lids_with_status status
ON status.lid = mf.nws_station_id
WHERE rfc_defined_fcst_point IS TRUE OR issue_time IS NOT NULL
ORDER BY feature_id, issue_time, rfc_defined_fcst_point DESC
),
Expand Down Expand Up @@ -219,7 +193,7 @@ agg_trace AS (
WHEN max_status = 'All Thresholds Undefined'
THEN max_status || ' at ' || influential_forecast_point || ' (' || root_feature_id || ' [' || root_stream_order || ']) despite forecast issued ' || issue_time || ' ' || ROUND(CAST(distance_from_forecast_point * 0.000621 as numeric), 1) || ' miles upstream'
WHEN issue_time IS NOT NULL
THEN max_status || ' (' || rating_source || ') issued ' || issue_time || ' at ' || influential_forecast_point || ' (' || root_feature_id || ' [' || root_stream_order || ']) ' || ROUND(CAST(distance_from_forecast_point * 0.000621 as numeric), 1) || ' miles upstream'
THEN max_status || ' issued ' || issue_time || ' at ' || influential_forecast_point || ' (' || root_feature_id || ' [' || root_stream_order || ']) ' || ROUND(CAST(distance_from_forecast_point * 0.000621 as numeric), 1) || ' miles upstream'
ELSE max_status || ' at ' || influential_forecast_point || ' (' || root_feature_id || ' [' || root_stream_order || ']) ' || ROUND(CAST(distance_from_forecast_point * 0.000621 as numeric), 1) || ' miles upstream'
END,
'; '
Expand Down

0 comments on commit d5fac78

Please sign in to comment.