Commit 7ea79b01 authored by Turner, Sean's avatar Turner, Sean
Browse files

lagged flow

parent a9cec244
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -44,13 +44,16 @@ OldHickory:
WolfCreek_CordellHull:
  object_type: river
  downstream_object: CordellHull
  lag: 30

# Cordell Hull to Old Hickory
CordellHull_OldHickory:
  object_type: river
  downstream_object: OldHickory
  lag: 6

# Center Hill to Old Hickory
CenterHill_OldHickory:
  object_type: river
  downstream_object: CenterHill
  lag: 15
 No newline at end of file
+4 −2
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ class RiverData:
    object_type: str
    simulation_order: int
    downstream_object: str
    lag: int

@dataclass
class CascadeData:
@@ -103,7 +104,8 @@ reservoirs_ordered |> map_dfr(function(reservoir){

    tibble(
        reservoir = !!reservoir,
        flow = reservoir_results$flow,
        flow = reservoir_results$inflow,
        outflow = reservoir_results$outflow,
        inflow = reservoir_results$total_inflow,
        target_release = reservoir_results$target_release,
        storage = reservoir_results$storage,
@@ -126,7 +128,7 @@ powersheds_plot_theme <- function(){
plot_cols <- length(reservoirs_ordered)

ts_data_for_plot |>
    select(reservoir, hr_index, flow, inflow, target_release, release_implemented, spill) |>
    select(reservoir, hr_index, flow, inflow, outflow, target_release, release_implemented, spill) |>
    tidyr::pivot_longer(-c(hr_index, reservoir), names_to = "variable") |>
    ggplot(aes(hr_index, value, col = variable)) +
    geom_line() +
+19 −4
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ struct RiverData {
    object_type: String,
    simulation_order: i32,
    downstream_object: String,
    lag: usize,
}

#[derive(FromPyObject)]
@@ -48,7 +49,8 @@ struct ReservoirResults {

#[derive(FromPyObject, IntoPyObject)]
struct RiverResults {
    flow: Vec<f64>,
    inflow: Vec<f64>,
    outflow: Vec<f64>,
}

#[derive(IntoPyObject)]
@@ -122,7 +124,8 @@ fn simulate_cascade(
            },
            "river" => {
                results.insert((*name).to_string(), CascadeResults::River(RiverResults {
                    flow: vec![0.0; n],
                    inflow: vec![0.0; n],
                    outflow: vec![0.0; n],
                }));
            },
            _ => {
@@ -157,7 +160,7 @@ fn simulate_cascade(
                    .map(|upstream_name| {
                        match &results[upstream_name] {
                            CascadeResults::Reservoir(res) => res.release[t] + res.spill[t],
                            CascadeResults::River(riv) => riv.flow[t],
                            CascadeResults::River(riv) => riv.outflow[t],
                        }
                    })
                    .sum::<f64>()
@@ -191,7 +194,19 @@ fn simulate_cascade(
                },
                "river" => {
                    if let CascadeResults::River(current_results) = results.get_mut(*name).unwrap() {
                        current_results.flow[t] = upstream_inflow;
                        current_results.inflow[t] = upstream_inflow;
                        
                        // *** NEW: Apply lag to determine outflow.
                        // The river's lag is obtained from its RiverData.
                        let river = &cascade_data.rivers[*name];
                        let lag = river.lag;
                        if t < lag {
                            // Not enough time has passed for water to exit.
                            current_results.outflow[t] = 0.0;
                        } else {
                            // Outflow at time t equals the inflow from t - lag.
                            current_results.outflow[t] = current_results.inflow[t - lag];
                        }
                    }
                },
                _ => {