Skip to content

Commit

Permalink
Fully implement release and spill bounds (#1211)
Browse files Browse the repository at this point in the history
  • Loading branch information
anamileva authored Jan 30, 2025
1 parent 2e978e3 commit ef90fd7
Show file tree
Hide file tree
Showing 13 changed files with 418 additions and 56 deletions.
191 changes: 191 additions & 0 deletions db/csvs_test_examples/csv_structure copy.csv

Large diffs are not rendered by default.

143 changes: 143 additions & 0 deletions db/csvs_test_examples/scenarios copy.csv

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
water_node,target_volume_scenario_id,target_release_scenario_id,minimum_volume_volumeunit,maximum_volume_volumeunit,max_spill,evaporation_coefficient,elevation_type,constant_elevation,exogenous_elevation_id,volume_to_elevation_curve_id
Water_Node_1,1,,22500,25000,0.1,0,endogenous,,,1
Water_Node_2,1,,1250,1750,0.1,0,endogenous,,,1
Water_Node_3,1,,50,75,0.1,0,endogenous,,,1
water_node,max_powerhouse_release_vol_unit_per_sec,max_spill_vol_unit_per_sec,target_volume_scenario_id,target_release_scenario_id,minimum_volume_volumeunit,maximum_volume_volumeunit,evaporation_coefficient,elevation_type,constant_elevation,exogenous_elevation_id,volume_to_elevation_curve_id
Water_Node_1,0.1,0.1,1,,22500,25000,0,endogenous,,,1
Water_Node_2,0.1,0.1,1,,1250,1750,0,endogenous,,,1
Water_Node_3,0.1,0.1,1,,50,75,0,endogenous,,,1
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
water_node,target_volume_scenario_id,target_release_scenario_id,minimum_volume_volumeunit,maximum_volume_volumeunit,max_spill,evaporation_coefficient,elevation_type,constant_elevation,exogenous_elevation_id,volume_to_elevation_curve_id
Water_Node_1,1,,22500,25000,0.1,0,exogenous,,1,
Water_Node_2,1,,1250,1750,0.1,0,exogenous,,1,
Water_Node_3,1,,50,75,0.1,0,constant,265,,
water_node,max_powerhouse_release_vol_unit_per_sec,max_spill_vol_unit_per_sec,target_volume_scenario_id,target_release_scenario_id,minimum_volume_volumeunit,maximum_volume_volumeunit,evaporation_coefficient,elevation_type,constant_elevation,exogenous_elevation_id,volume_to_elevation_curve_id
Water_Node_1,0.1,0.1,1,,22500,25000,0,exogenous,,1,
Water_Node_2,0.1,0.1,1,,1250,1750,0,exogenous,,1,
Water_Node_3,0.1,0.1,1,,50,75,0,constant,265,,
31 changes: 16 additions & 15 deletions db/db_schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -1097,18 +1097,19 @@ CREATE TABLE subscenarios_system_water_node_reservoirs
DROP TABLE IF EXISTS inputs_system_water_node_reservoirs;
CREATE TABLE inputs_system_water_node_reservoirs
(
water_node_reservoir_scenario_id INTEGER,
water_node TEXT,
target_volume_scenario_id INTEGER,
target_release_scenario_id INTEGER,
minimum_volume_volumeunit FLOAT,
maximum_volume_volumeunit FLOAT,
max_spill FLOAT,
evaporation_coefficient FLOAT,
elevation_type TEXT,
constant_elevation FLOAT,
exogenous_elevation_id INTEGER,
volume_to_elevation_curve_id INTEGER,
water_node_reservoir_scenario_id INTEGER,
water_node TEXT,
max_powerhouse_release_vol_unit_per_sec FLOAT,
max_spill_vol_unit_per_sec FLOAT,
target_volume_scenario_id INTEGER,
target_release_scenario_id INTEGER,
minimum_volume_volumeunit FLOAT,
maximum_volume_volumeunit FLOAT,
evaporation_coefficient FLOAT,
elevation_type TEXT,
constant_elevation FLOAT,
exogenous_elevation_id INTEGER,
volume_to_elevation_curve_id INTEGER,
PRIMARY KEY (water_node_reservoir_scenario_id, water_node),
FOREIGN KEY (water_node_reservoir_scenario_id) REFERENCES
subscenarios_system_water_node_reservoirs (water_node_reservoir_scenario_id),
Expand Down Expand Up @@ -6399,9 +6400,9 @@ CREATE TABLE results_system_frequency_response_partial
timepoint_weight FLOAT,
number_of_hours_in_timepoint FLOAT,
spinup_or_lookahead INTEGER,
reserve_requirement_mw FLOAT,
reserve_provision_mw FLOAT,
reserve_violation_mw FLOAT,
reserve_requirement_mw FLOAT,
reserve_provision_mw FLOAT,
reserve_violation_mw FLOAT,
dual FLOAT,
marginal_price_per_mw FLOAT,
PRIMARY KEY (scenario_id, frequency_response_partial_ba,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
water_node minimum_volume_volumeunit maximum_volume_volumeunit max_spill evaporation_coefficient elevation_type
Water_Node_1 22500.0 25000.0 0.1 0.0 exogenous
Water_Node_2 1250.0 1750.0 0.1 0.0 exogenous
Water_Node_3 50.0 75.0 0.1 0.0 constant
water_node max_powerhouse_release_vol_unit_per_sec max_spill_vol_unit_per_sec minimum_volume_volumeunit maximum_volume_volumeunit evaporation_coefficient elevation_type
Water_Node_1 0.1 0.1 22500.0 25000.0 0.0 exogenous
Water_Node_2 0.1 0.1 1250.0 1750.0 0.0 exogenous
Water_Node_3 0.1 0.1 50.0 75.0 0.0 constant
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
water_node minimum_volume_volumeunit maximum_volume_volumeunit max_spill evaporation_coefficient elevation_type
Water_Node_1 22500.0 25000.0 0.1 0.0 exogenous
Water_Node_2 1250.0 1750.0 0.1 0.0 exogenous
Water_Node_3 50.0 75.0 0.1 0.0 constant
water_node max_powerhouse_release_vol_unit_per_sec max_spill_vol_unit_per_sec minimum_volume_volumeunit maximum_volume_volumeunit evaporation_coefficient elevation_type
Water_Node_1 0.1 0.1 22500.0 25000.0 0.0 exogenous
Water_Node_2 0.1 0.1 1250.0 1750.0 0.0 exogenous
Water_Node_3 0.1 0.1 50.0 75.0 0.0 constant
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
water_node minimum_volume_volumeunit maximum_volume_volumeunit max_spill evaporation_coefficient elevation_type
Water_Node_1 22500.0 25000.0 0.1 0.0 exogenous
Water_Node_2 1250.0 1750.0 0.1 0.0 exogenous
Water_Node_3 50.0 75.0 0.1 0.0 constant
water_node max_powerhouse_release_vol_unit_per_sec max_spill_vol_unit_per_sec minimum_volume_volumeunit maximum_volume_volumeunit evaporation_coefficient elevation_type
Water_Node_1 0.1 0.1 22500.0 25000.0 0.0 exogenous
Water_Node_2 0.1 0.1 1250.0 1750.0 0.0 exogenous
Water_Node_3 0.1 0.1 50.0 75.0 0.0 constant
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
water_node minimum_volume_volumeunit maximum_volume_volumeunit max_spill evaporation_coefficient elevation_type
Water_Node_1 22500.0 25000.0 0.1 0.0 exogenous
Water_Node_2 1250.0 1750.0 0.1 0.0 exogenous
Water_Node_3 50.0 75.0 0.1 0.0 constant
water_node max_powerhouse_release_vol_unit_per_sec max_spill_vol_unit_per_sec minimum_volume_volumeunit maximum_volume_volumeunit evaporation_coefficient elevation_type
Water_Node_1 0.1 0.1 22500.0 25000.0 0.0 exogenous
Water_Node_2 0.1 0.1 1250.0 1750.0 0.0 exogenous
Water_Node_3 0.1 0.1 50.0 75.0 0.0 constant
28 changes: 21 additions & 7 deletions gridpath/system/water/reservoirs.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,13 @@ def add_model_components(
within=NonNegativeReals,
)

# Spill bound
m.max_spill = Param(m.WATER_NODES_W_RESERVOIRS, within=NonNegativeReals)
# Powerhouse release and spill bounds
m.max_powerhouse_release_vol_unit_per_sec = Param(
m.WATER_NODES_W_RESERVOIRS, within=NonNegativeReals
)
m.max_spill_vol_unit_per_sec = Param(
m.WATER_NODES_W_RESERVOIRS, within=NonNegativeReals
)

# Losses
# TODO: by month
Expand All @@ -140,11 +145,17 @@ def add_model_components(
)

m.Discharge_Water_to_Powerhouse_Rate_Vol_Per_Sec = Var(
m.WATER_NODES_W_RESERVOIRS, m.TMPS, within=NonNegativeReals
m.WATER_NODES_W_RESERVOIRS,
m.TMPS,
within=NonNegativeReals,
bounds=lambda mod, r, tmp: (0, mod.max_powerhouse_release_vol_unit_per_sec[r]),
)

m.Spill_Water_Rate_Vol_Per_Sec = Var(
m.WATER_NODES_W_RESERVOIRS, m.TMPS, within=NonNegativeReals
m.WATER_NODES_W_RESERVOIRS,
m.TMPS,
within=NonNegativeReals,
bounds=lambda mod, r, tmp: (0, mod.max_spill_vol_unit_per_sec[r]),
)

# TODO: implement the correct calculation; depends on area, which depends
Expand Down Expand Up @@ -295,9 +306,10 @@ def load_model_data(
),
index=m.WATER_NODES_W_RESERVOIRS,
param=(
m.max_powerhouse_release_vol_unit_per_sec,
m.max_spill_vol_unit_per_sec,
m.minimum_volume_volumeunit,
m.maximum_volume_volumeunit,
m.max_spill,
m.evaporation_coefficient,
m.elevation_type,
),
Expand Down Expand Up @@ -394,9 +406,10 @@ def get_inputs_from_database(
c = conn.cursor()
reservoirs = c.execute(
f"""SELECT water_node,
max_powerhouse_release_vol_unit_per_sec,
max_spill_vol_unit_per_sec,
minimum_volume_volumeunit,
maximum_volume_volumeunit,
max_spill,
evaporation_coefficient,
elevation_type
FROM inputs_system_water_node_reservoirs
Expand Down Expand Up @@ -550,9 +563,10 @@ def write_model_inputs(
writer.writerow(
[
"water_node",
"max_powerhouse_release_vol_unit_per_sec",
"max_spill_vol_unit_per_sec",
"minimum_volume_volumeunit",
"maximum_volume_volumeunit",
"max_spill",
"evaporation_coefficient",
"elevation_type",
]
Expand Down
17 changes: 15 additions & 2 deletions tests/system/water/test_water_reservoirs.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,14 +178,27 @@ def test_data_loaded_correctly(self):
}
self.assertDictEqual(expected_mine, actual_mine)

# Param: max_spill
# Param: max_powerhouse_release_vol_unit_per_sec
expected_maxrelease = {
"Water_Node_1": 5000,
"Water_Node_2": 5000,
"Water_Node_3": 5000,
}
actual_maxrelease = {
r: instance.max_powerhouse_release_vol_unit_per_sec[r]
for r in instance.WATER_NODES_W_RESERVOIRS
}
self.assertDictEqual(expected_maxrelease, actual_maxrelease)

# Param: max_spill_vol_unit_per_sec
expected_maxspill = {
"Water_Node_1": 100000,
"Water_Node_2": 100000,
"Water_Node_3": 100000,
}
actual_maxspill = {
r: instance.max_spill[r] for r in instance.WATER_NODES_W_RESERVOIRS
r: instance.max_spill_vol_unit_per_sec[r]
for r in instance.WATER_NODES_W_RESERVOIRS
}
self.assertDictEqual(expected_maxspill, actual_maxspill)

Expand Down
8 changes: 4 additions & 4 deletions tests/test_data/inputs/water_node_reservoirs.tab
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
water_node minimum_elevation_elevationunit maximum_elevation_elevationunit max_spill evaporation_coefficient elevation_type
Water_Node_1 1000 1200 100000 0.1 exogenous
Water_Node_2 700 800 100000 0.1 constant
Water_Node_3 500 600 100000 0.1 endogenous
water_node max_powerhouse_release_vol_unit_per_sec max_spill_vol_unit_per_sec minimum_elevation_elevationunit maximum_elevation_elevationunit evaporation_coefficient elevation_type
Water_Node_1 5000 100000 1000 1200 0.1 exogenous
Water_Node_2 5000 100000 700 800 0.1 constant
Water_Node_3 5000 100000 500 600 0.1 endogenous
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
water_node minimum_elevation_elevationunit maximum_elevation_elevationunit max_spill evaporation_coefficient elevation_type
Water_Node_1 1000 1200 100000 0.1 endogenous
Water_Node_2 700 800 100000 0.1 endogenous
Water_Node_3 500 600 100000 0.1 endogenous
water_node max_powerhouse_release_vol_unit_per_sec max_spill_vol_unit_per_sec minimum_elevation_elevationunit maximum_elevation_elevationunit evaporation_coefficient elevation_type
Water_Node_1 5000 100000 1000 1200 0.1 endogenous
Water_Node_2 5000 100000 700 800 0.1 endogenous
Water_Node_3 5000 100000 500 600 0.1 endogenous

0 comments on commit ef90fd7

Please sign in to comment.