Loading examples/dev/reservoirs/reservoir_config.yaml +4 −1 Original line number Diff line number Diff line Loading @@ -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 examples/dev/script.qmd +4 −2 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ class RiverData: object_type: str simulation_order: int downstream_object: str lag: int @dataclass class CascadeData: Loading Loading @@ -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, Loading @@ -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() + Loading src/lib.rs +19 −4 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ struct RiverData { object_type: String, simulation_order: i32, downstream_object: String, lag: usize, } #[derive(FromPyObject)] Loading Loading @@ -48,7 +49,8 @@ struct ReservoirResults { #[derive(FromPyObject, IntoPyObject)] struct RiverResults { flow: Vec<f64>, inflow: Vec<f64>, outflow: Vec<f64>, } #[derive(IntoPyObject)] Loading Loading @@ -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], })); }, _ => { Loading Loading @@ -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>() Loading Loading @@ -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]; } } }, _ => { Loading Loading
examples/dev/reservoirs/reservoir_config.yaml +4 −1 Original line number Diff line number Diff line Loading @@ -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
examples/dev/script.qmd +4 −2 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ class RiverData: object_type: str simulation_order: int downstream_object: str lag: int @dataclass class CascadeData: Loading Loading @@ -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, Loading @@ -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() + Loading
src/lib.rs +19 −4 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ struct RiverData { object_type: String, simulation_order: i32, downstream_object: String, lag: usize, } #[derive(FromPyObject)] Loading Loading @@ -48,7 +49,8 @@ struct ReservoirResults { #[derive(FromPyObject, IntoPyObject)] struct RiverResults { flow: Vec<f64>, inflow: Vec<f64>, outflow: Vec<f64>, } #[derive(IntoPyObject)] Loading Loading @@ -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], })); }, _ => { Loading Loading @@ -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>() Loading Loading @@ -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]; } } }, _ => { Loading