Hydraulic Couplings¶
Hydraulic couplings are used to model multiple reservoirs connected to the same hydraulic system.
There are 5 different hydraulic couplings, 3 who are connected to a plant, and 2 who are not connected to a plant.
Overview¶
Station joined couplings¶
100¶
Each reservoir is connected to their own “virtual” power plant.
Station controlled discharge
No flow between reservoirs
Power plants connected to coupling
Each power plant can have their own PQ-curves local discharge energy equivalents.
Only 1 “virtual” power plant is allowed to be active at each time step.
Example:
{
"hydraulic_couplings": [
{
"name": "coupling_100"
}
]
}
JSON model
{
"$schema": "https://gitlab.sintef.no/energy/ltm/pyltmapi/-/raw/main/model.schema.json",
"model": {
"global_settings": {
"name": "global_settings",
"output_path": "testout_couplings_100/",
"delete_output_dir": false,
"generate_output_dir": true,
"allow_validation_failures": false,
"simulation_period": {
"timestamps": [
"2023-01-02T00:00:00Z",
"2025-12-29T00:00:00Z"
]
},
"historical_period": {
"timestamps": [
"2000-01-01T00:00:00Z",
"2008-01-01T00:00:00Z"
]
},
"timesteps_per_week": 168,
"default_spill_cost": 0.01,
"default_load_penalty": 900.0,
"currency_unit": "EUR",
"energy_unit": "MWh"
},
"dclines": [
{
"#comment": "",
"name": "DC",
"forward_capacity": {
"scenarios": [
[
1000
]
]
},
"backward_capacity": {
"scenarios": [
[
1000
]
]
},
"loss_percentage": 2.0,
"forward_cost": 2.0,
"backward_cost": 1.0
}
],
"market_steps": [
{
"name": "market_step",
"price": {
"timestamps": [
"2023-01-01T00:00:00Z",
"2024-01-01T00:00:00Z",
"2024-W20"
],
"scenarios": [
[
150,
100,
150
]
]
},
"capacity": {
"timestamps": [
"2023-01-01T00:00:00Z",
"2023-07-01T00:00:00Z",
"2024-W05",
"2024-W15",
"2024-W25",
"2024-W35"
],
"scenarios": [
[
150,
250,
350,
450,
550,
1000
]
]
}
}
],
"loads": [
{
"#comment": "Gruppe 16",
"name": "FLAT",
"capacity": {
"timestamps": [
"2023-01-01T00:00:00Z",
"2023-W20"
],
"scenarios": [
[
150,
500
]
]
}
},
{
"#comment": "Gruppe 16",
"name": "FLAT2",
"capacity": {
"timestamps": [
"2023-01-01T00:00:00Z",
"2024-W40"
],
"scenarios": [
[
150,
200
]
]
}
}
],
"busbars": [
{
"name": "couplings"
},
{
"name": "tev"
}
],
"inflow_series": [
{
"name": "constant",
"series": {
"timestamps": [
"1900-01-01T00:00:00Z"
],
"scenarios": [
[
1.0
]
]
}
}
],
"reservoirs": [
{
"name": "upper1",
"average_spill_energy_equivalent": 2.0,
"degree_of_regulation": 1,
"regulated_inflow_name": "constant",
"average_regulated_inflow": 5,
"max_discharge": 80,
"reference_curve": {
"timestamps": [
"2023-01-15T00:00:00Z",
"2024-02-01T00:00:00Z",
"2024-03-08T00:00:00Z"
],
"scenarios": [
[
450,
450,
450
]
]
},
"initial_volume": 400,
"volume_curve": {
"x": [
1500,
1550
],
"y": [
0,
500
]
}
},
{
"name": "upper2",
"average_spill_energy_equivalent": 2.0,
"degree_of_regulation": 1,
"regulated_inflow_name": "constant",
"average_regulated_inflow": 10,
"max_discharge": 100,
"reference_curve": {
"timestamps": [
"2023-01-15T00:00:00Z",
"2024-02-01T00:00:00Z",
"2024-03-08T00:00:00Z"
],
"scenarios": [
[
450,
450,
450
]
]
},
"initial_volume": 200,
"volume_curve": {
"x": [
1000,
1050
],
"y": [
0,
500
]
}
},
{
"name": "upper3",
"average_spill_energy_equivalent": 1.0,
"degree_of_regulation": 1,
"regulated_inflow_name": "constant",
"average_regulated_inflow": 15,
"max_discharge": 150,
"reference_curve": {
"timestamps": [
"2023-01-15T00:00:00Z",
"2024-02-01T00:00:00Z",
"2024-03-08T00:00:00Z"
],
"scenarios": [
[
450,
450,
450
]
]
},
"initial_volume": 400,
"volume_curve": {
"x": [
500,
550
],
"y": [
0,
500
]
}
},
{
"name": "buffer1",
"average_spill_energy_equivalent": 0.0,
"degree_of_regulation": 0,
"regulated_inflow_name": "constant",
"average_regulated_inflow": 0,
"max_discharge": 150,
"reservoir_type": "buffer",
"reference_curve": {
"timestamps": [
"2023-01-15T00:00:00Z",
"2024-02-01T00:00:00Z",
"2024-03-08T00:00:00Z"
],
"scenarios": [
[
1,
1,
1
]
]
},
"initial_volume": 400,
"volume_curve": {
"x": [
40,
45
],
"y": [
0,
1
]
}
}
],
"hydraulic_couplings": [
{
"name": "coupling_100"
}
],
"plants": [
{
"name": "plant_upper1",
"ownership": 100,
"discharge_energy_equivalent": {
"timestamps": [
"2023-01-02T00:00:00Z"
],
"scenarios": [
[
2.0
]
]
},
"pq_curves": {
"2023-01-02T00:00:00Z": {
"x": [
0.0,
30.00
],
"y": [
0.0,
300.0
]
}
},
"unregulated_inflow_name": "constant",
"average_unregulated_inflow": 1.0,
"tailrace_elevation": 50.0,
"gross_head": 1300.0
},
{
"name": "plant_upper2",
"ownership": 100,
"discharge_energy_equivalent": {
"timestamps": [
"2023-01-02T00:00:00Z"
],
"scenarios": [
[
2
]
]
},
"pq_curves": {
"2023-01-02T00:00:00Z": {
"x": [
0.0,
70.00
],
"y": [
0.0,
300.0
]
}
},
"unregulated_inflow_name": "constant",
"average_unregulated_inflow": 3.0,
"tailrace_elevation": 50.0,
"gross_head": 800.0
},
{
"name": "plant_upper3",
"ownership": 100,
"discharge_energy_equivalent": {
"timestamps": [
"2023-01-02T00:00:00Z"
],
"scenarios": [
[
1
]
]
},
"pq_curves": {
"2023-01-02T00:00:00Z": {
"x": [
0.0,
100.00
],
"y": [
0.0,
300.0
]
}
},
"unregulated_inflow_name": "constant",
"average_unregulated_inflow": 1.0,
"tailrace_elevation": 50.0,
"gross_head": 300.0
},
{
"name": "plant_buffer1",
"ownership": 100,
"discharge_energy_equivalent": {
"timestamps": [
"2023-01-02T00:00:00Z"
],
"scenarios": [
[
0
]
]
},
"pq_curves": {
"2023-01-02T00:00:00Z": {
"x": [
0.0,
150.00
],
"y": [
0.0,
150.0
]
}
},
"unregulated_inflow_name": "constant",
"average_unregulated_inflow": 1.0,
"tailrace_elevation": 1.0,
"gross_head": 40.0
}
],
"connections": [
{
"from": "couplings",
"to": "DC"
},
{
"from": "DC",
"to": "tev"
},
{
"from": "market_step",
"to": "couplings"
},
{
"from": "FLAT",
"to": "couplings"
},
{
"from": "FLAT2",
"to": "tev"
},
{
"from": "upper1",
"to": "couplings"
},
{
"from": "upper2",
"to": "couplings"
},
{
"from": "upper3",
"to": "couplings"
},
{
"from": "upper1",
"to": "plant_upper1"
},
{
"from": "upper2",
"to": "plant_upper2"
},
{
"from": "upper3",
"to": "plant_upper3"
},
{
"from": "plant_upper1",
"to": "coupling_100"
},
{
"from": "plant_upper2",
"to": "coupling_100"
},
{
"from": "plant_upper3",
"to": "coupling_100"
},
{
"from": "coupling_100",
"to": "buffer1"
},
{
"from": "buffer1",
"to": "plant_buffer1"
}
]
}
}
120¶
Free flow between reservoirs
Limited by tunnel/canal max flow rate
Power plant connected to coupling
Example:
{
"hydraulic_couplings": [
{
"name": "coupling_120",
"max_flow": 70
}
]
}
130¶
Discharge limited by gates
Limited by max flow rate in tunnel/canal
Flow between reservoirs limited by gates
Power plant connected to coupling
Example:
{
"hydraulic_couplings": [
{
"name": "coupling_130",
"max_flow": 70,
"gate_switch_frequency": 50
}
]
}
Reservoir joined couplings¶
200¶
Free flow between reservoirs
Limited by max flow rate in tunnel/penstock.
Power plants connected to 0 or more reservoirs
{
"hydraulic_couplings": [
{
"name": "coupling_200",
"max_flow": 70
}
]
}
300¶
Discharge limited by gates
Flow between reservoirs limited by max flow rate in tunnel/canal
Power plants connected to 1 or more reservoirs
{
"hydraulic_couplings": [
{
"name": "coupling_300",
"max_flow": 70,
"gate_switch_frequency": 50
}
]
}
200+300 example¶
An example combining couplings 200 and 300 in 1 model.
JSON model with type 200 and type 300 couplings.
{
"$schema": "https://gitlab.sintef.no/energy/ltm/pyltmapi/-/raw/main/model.schema.json",
"model": {
"global_settings": {
"name": "eops_test",
"output_path": "testout_couplings_200_300/",
"delete_output_dir": false,
"generate_output_dir": true,
"model_type": "EOPS",
"simulation_period": {
"timestamps": [
"2024-01-01T00:00:00Z",
"2024-12-30T00:00:00Z"
]
},
"historical_period": {
"timestamps": [
"1979-01-01T00:00:00Z",
"1989-01-01T00:00:00Z"
]
},
"max_iterations": 40,
"precision": 0.001,
"timesteps_per_week": 7
},
"loads": [
{
"#comment": "Gruppe 16",
"name": "FLAT",
"capacity": {
"timestamps": [
"2024-01-01T00:00:00Z"
],
"scenarios": [
[
7.0
]
]
},
"price": {
"timestamps": [
"2024-01-01T00:00:00Z"
],
"scenarios": [
[
40.0
]
]
}
},
{
"#comment": "Gruppe 16",
"name": "FLAT2",
"capacity": {
"timestamps": [
"2024-01-01T00:00:00Z"
],
"scenarios": [
[
0.0007
]
]
},
"price": {
"timestamps": [
"2024-01-01T00:00:00Z"
],
"scenarios": [
[
11.0
]
]
}
}
],
"market_steps": [
{
"name": "ts_spot_purchase",
"capacity": {
"timestamps": [
"2023-01-02T00:00:00Z"
],
"scenarios": [
[
150.0
]
]
}
},
{
"name": "ts_spot_sale",
"capacity": {
"timestamps": [
"2023-01-02T00:00:00Z"
],
"scenarios": [
[
-120.0
]
]
}
}
],
"inflow_series": [
{
"name": "zero",
"series": {
"scenarios": [
[
0.1
]
]
}
},
{
"name": "constant",
"series": {
"scenarios": [
[
1.0
]
]
}
}
],
"reservoirs": [
{
"name": "LABRO",
"average_spill_energy_equivalent": 0.12,
"average_regulated_inflow": 6.359381359381359,
"degree_of_regulation": 4,
"initial_volume": 50,
"max_discharge": 30,
"reference_curve": {
"timestamps": [
"2024-04-22T00:00:00Z",
"2024-06-03T00:00:00Z",
"2024-12-30T00:00:00Z"
],
"scenarios": [
[
95.01,
0.0,
95.0
]
]
},
"regulated_inflow": {
"#comment": "Refers to unregulated inflow label",
"timestamps": [
"0001-01-01T00:00:00Z"
],
"scenarios": [
[
37.5954019
]
]
},
"volume_curve": {
"x": [
1050,
1100
],
"y": [
0,
100
]
}
},
{
"name": "upper1",
"average_spill_energy_equivalent": 1.0,
"degree_of_regulation": 3,
"regulated_inflow": {
"scenarios": [
[
3.75954019
]
]
},
"average_regulated_inflow": 1,
"max_discharge": 100,
"reference_curve": {
"timestamps": [
"1900-W01"
],
"scenarios": [
[
450
]
]
},
"initial_volume": 5,
"volume_curve": {
"x": [
1100.0,
1130.0
],
"y": [
0,
500
]
}
},
{
"name": "upper2",
"average_spill_energy_equivalent": 1.0,
"degree_of_regulation": 3,
"regulated_inflow": {
"scenarios": [
[
3.75954019
]
]
},
"average_regulated_inflow": 1,
"max_discharge": 100,
"reference_curve": {
"timestamps": [
"1900-W01"
],
"scenarios": [
[
450
]
]
},
"initial_volume": 5,
"volume_curve": {
"x": [
1115.00,
1130.00
],
"y": [
0,
500
]
},
"gross_head": 150
},
{
"name": "upper3",
"average_spill_energy_equivalent": 1.0,
"degree_of_regulation": 3,
"regulated_inflow": {
"scenarios": [
[
3.75954019
]
]
},
"average_regulated_inflow": 15,
"max_discharge": 100,
"reference_curve": {
"timestamps": [
"1900-W01"
],
"scenarios": [
[
450
]
]
},
"initial_volume": 350,
"volume_curve": {
"x": [
1120.0,
1130.0
],
"y": [
0,
500
]
},
"hc_max_flow": 20,
"gross_head": 720
},
{
"name": "lower1",
"average_spill_energy_equivalent": 3.0,
"degree_of_regulation": 0.5,
"regulated_inflow_name": "constant",
"average_regulated_inflow": 1,
"max_discharge": 200,
"reference_curve": {
"timestamps": [
"2023-01-01T00:00:00Z"
],
"scenarios": [
[
1500
]
]
},
"initial_volume": 0,
"volume_curve": {
"x": [
100.0,
110.0
],
"y": [
0,
1500
]
},
"gross_head": 720
},
{
"name": "lower2",
"average_spill_energy_equivalent": 3.0,
"degree_of_regulation": 0.5,
"regulated_inflow_name": "constant",
"average_regulated_inflow": 1,
"max_discharge": 200,
"reference_curve": {
"timestamps": [
"2023-01-01T00:00:00Z"
],
"scenarios": [
[
1500
]
]
},
"initial_volume": 0,
"volume_curve": {
"x": [
90.0,
100.0
],
"y": [
0,
1500
]
},
"gross_head": 720
},
{
"name": "lower3",
"average_spill_energy_equivalent": 1.0,
"degree_of_regulation": 0.5,
"regulated_inflow_name": "constant",
"average_regulated_inflow": 1,
"max_discharge": 200,
"reference_curve": {
"timestamps": [
"2023-01-01T00:00:00Z"
],
"scenarios": [
[
500
]
]
},
"initial_volume": 150,
"volume_curve": {
"x": [
80.0,
90.0
],
"y": [
0,
1500
]
}
}
],
"hydraulic_couplings": [
{
"name": "coupling_200",
"max_flow": 100
},
{
"name": "coupling_300",
"max_flow": 200,
"gate_switch_frequency": 25
}
],
"plants": [
{
"name": "LABRO_plant",
"discharge_energy_equivalent": {
"timestamps": [
"2023-01-02T00:00:00Z"
],
"scenarios": [
[
0.12
]
]
},
"pq_curves": {
"2024-01-01T00:00:00Z": {
"y": [
0.0,
9.89
],
"x": [
0.0,
24.6
]
}
},
"average_unregulated_inflow": 0.6359381359,
"gross_head": 40.0,
"tailrace_elevation": 1030,
"unregulated_inflow": {
"#comment": "Refers to unregulated inflow label",
"timestamps": [
"0001-01-01T00:00:00Z"
],
"scenarios": [
[
37.5954019
]
]
}
},
{
"name": "plant",
"ownership": 100,
"discharge_energy_equivalent": {
"scenarios": [
[
1.0
]
]
},
"pq_curves": {
"2023-01-01T00:00:00Z": {
"x": [
0.0,
30.00
],
"y": [
0.0,
300.0
]
}
},
"unregulated_inflow_name": "zero",
"average_unregulated_inflow": 0.0,
"tailrace_elevation": 150.0,
"gross_head": 800.0
},
{
"name": "plant2",
"ownership": 100,
"discharge_energy_equivalent": {
"scenarios": [
[
1
]
]
},
"pq_curves": {
"2023-01-01T00:00:00Z": {
"x": [
0.0,
100.00
],
"y": [
0.0,
250.0
]
}
},
"unregulated_inflow_name": "zero",
"average_unregulated_inflow": 0.0,
"tailrace_elevation": 0.0,
"gross_head": 70.0
}
],
"busbars": [
{
"name": "couplings"
}
],
"price_series_main": [
{
"name": "HOVEDPRISREKKE.csv",
"series": {
"timestamps": [
"2024-01-01T00:00:00Z",
"2024-01-08T00:00:00Z",
"2024-01-15T00:00:00Z",
"2024-01-22T00:00:00Z",
"2024-01-29T00:00:00Z",
"2024-02-05T00:00:00Z",
"2024-02-12T00:00:00Z",
"2024-02-19T00:00:00Z",
"2024-02-26T00:00:00Z",
"2024-03-04T00:00:00Z"
],
"scenarios": [
[
0.0,
10.0,
20.0,
30.0,
40.0,
50.0,
60.0,
70.0,
80.0,
90.0
],
[
1.0,
11.0,
21.0,
31.0,
41.0,
51.0,
61.0,
71.0,
81.0,
91.0
],
[
2.0,
12.0,
22.0,
32.0,
42.0,
52.0,
62.0,
72.0,
82.0,
92.0
],
[
3.0,
13.0,
23.0,
33.0,
43.0,
53.0,
63.0,
73.0,
83.0,
93.0
],
[
4.0,
14.0,
24.0,
34.0,
44.0,
54.0,
64.0,
74.0,
84.0,
94.0
],
[
5.0,
15.0,
25.0,
35.0,
45.0,
55.0,
65.0,
75.0,
85.0,
95.0
],
[
6.0,
16.0,
26.0,
36.0,
46.0,
56.0,
66.0,
76.0,
86.0,
96.0
],
[
7.0,
17.0,
27.0,
37.0,
47.0,
57.0,
67.0,
77.0,
87.0,
97.0
],
[
8.0,
18.0,
28.0,
38.0,
48.0,
58.0,
68.0,
78.0,
88.0,
98.0
],
[
9.0,
19.0,
29.0,
39.0,
49.0,
59.0,
69.0,
79.0,
89.0,
99.0
]
]
}
}
],
"connections": [
{
"from": "FLAT",
"to": "couplings"
},
{
"from": "FLAT2",
"to": "couplings"
},
{
"from": "LABRO",
"to": "couplings"
},
{
"from": "LABRO",
"to": "LABRO_plant"
},
{
"from": "upper1",
"to": "couplings"
},
{
"from": "upper1",
"to": "coupling_200"
},
{
"from": "upper2",
"to": "coupling_200"
},
{
"from": "upper3",
"to": "coupling_200"
},
{
"from": "upper1",
"to": "plant"
},
{
"from": "plant",
"to": "lower1"
},
{
"from": "lower1",
"to": "coupling_300"
},
{
"from": "lower2",
"to": "coupling_300"
},
{
"from": "lower3",
"to": "coupling_300"
},
{
"from": "lower3",
"to": "plant2"
},
{
"from": "ts_spot_purchase",
"to": "couplings"
},
{
"from": "ts_spot_sale",
"to": "couplings"
}
]
}
}