|
1 | 1 | ## Two chained reservoirs with inflow in one supply two electric loads
|
2 | 2 | #
|
3 |
| -#Two disconnected electrical loads are fed from two reservoirs linked by a river; the first reservoir has inflow from a water basin. |
| 3 | +#Two disconnected electrical loads are fed from two reservoirs linked by a river; the first reservoir has inflow from rain onto a water basin. |
4 | 4 | #
|
5 | 5 | #Note that the two reservoirs are tightly coupled, meaning there is no time delay between the first one emptying and the second one filling, as there would be if there were a long stretch of river between the reservoirs. The reservoirs are essentially assumed to be close to each other. A time delay would require a "Link" element between different snapshots, which is not yet supported by PyPSA (but could be enabled by passing network.lopf() an extra_functionality function).
|
6 | 6 |
|
7 | 7 | import pypsa
|
8 | 8 | import pandas as pd
|
| 9 | +import numpy as np |
9 | 10 |
|
10 | 11 | from pyomo.environ import Constraint
|
11 | 12 |
|
| 13 | +#First tell PyPSA that links will have a 2nd bus by |
| 14 | +#overriding the component_attrs. This is needed so that |
| 15 | +#water can both go through a turbine AND feed the next reservoir |
12 | 16 |
|
13 |
| -network = pypsa.Network() |
| 17 | +override_component_attrs = pypsa.descriptors.Dict({k : v.copy() for k,v in pypsa.components.component_attrs.items()}) |
| 18 | +override_component_attrs["Link"].loc["bus2"] = ["string",np.nan,np.nan,"2nd bus","Input (optional)"] |
| 19 | +override_component_attrs["Link"].loc["efficiency2"] = ["static or series","per unit",1.,"2nd bus efficiency","Input (optional)"] |
| 20 | +override_component_attrs["Link"].loc["p2"] = ["series","MW",0.,"2nd bus output","Output"] |
| 21 | + |
| 22 | + |
| 23 | +network = pypsa.Network(override_component_attrs=override_component_attrs) |
14 | 24 |
|
15 | 25 | network.set_snapshots(pd.date_range("2016-01-01 00:00","2016-01-01 03:00",freq="H"))
|
16 | 26 |
|
| 27 | +network.add("Carrier", |
| 28 | + "reservoir") |
| 29 | + |
| 30 | +network.add("Carrier", |
| 31 | + "rain") |
| 32 | + |
| 33 | + |
17 | 34 | network.add("Bus",
|
18 | 35 | "0",
|
19 | 36 | carrier="AC")
|
|
22 | 39 | "1",
|
23 | 40 | carrier="AC")
|
24 | 41 |
|
| 42 | + |
25 | 43 | network.add("Bus",
|
26 | 44 | "0 reservoir",
|
27 | 45 | carrier="reservoir")
|
28 | 46 |
|
29 |
| - |
30 | 47 | network.add("Bus",
|
31 | 48 | "1 reservoir",
|
32 | 49 | carrier="reservoir")
|
33 | 50 |
|
34 |
| -network.add("Carrier", |
35 |
| - "reservoir") |
36 |
| - |
37 |
| -network.add("Carrier", |
38 |
| - "rain") |
39 | 51 |
|
40 | 52 | network.add("Generator",
|
41 | 53 | "rain",
|
|
44 | 56 | p_nom=1000,
|
45 | 57 | p_max_pu=[0.,0.2,0.7,0.4])
|
46 | 58 |
|
| 59 | + |
47 | 60 | network.add("Load",
|
48 | 61 | "0 load",
|
49 | 62 | bus="0",
|
50 | 63 | p_set=20.)
|
51 | 64 |
|
52 |
| - |
53 | 65 | network.add("Load",
|
54 | 66 | "1 load",
|
55 | 67 | bus="1",
|
56 | 68 | p_set=30.)
|
57 | 69 |
|
| 70 | + |
| 71 | +#The efficiency of a river is the relation between the gravitational potential |
| 72 | +#energy of 1 m^3 of water in reservoir 0 relative to its turbine versus the |
| 73 | +#potential energy of 1 m^3 of water in reservoir 1 relative to its turbine |
| 74 | + |
| 75 | +network.add("Link", |
| 76 | + "spillage", |
| 77 | + bus0="0 reservoir", |
| 78 | + bus1="1 reservoir", |
| 79 | + efficiency=0.5, |
| 80 | + p_nom_extendable=True) |
| 81 | + |
| 82 | + |
| 83 | +#water from turbine also goes into next reservoir |
58 | 84 | network.add("Link",
|
59 | 85 | "0 turbine",
|
60 | 86 | bus0="0 reservoir",
|
61 | 87 | bus1="0",
|
| 88 | + bus2="1 reservoir", |
62 | 89 | efficiency=0.9,
|
| 90 | + efficiency2=0.5, |
63 | 91 | capital_cost=1000,
|
64 | 92 | p_nom_extendable=True)
|
65 | 93 |
|
|
70 | 98 | efficiency=0.9,
|
71 | 99 | capital_cost=1000,
|
72 | 100 | p_nom_extendable=True)
|
73 |
| - |
74 |
| - |
75 |
| - |
76 |
| - |
77 |
| -#The efficiency of a river is the relation between the gravitational potential |
78 |
| -#energy of 1 m^3 of water in reservoir 0 relative to its turbine versus the |
79 |
| -#potential energy of 1 m^3 of water in reservoir 1 relative to its turbine |
80 |
| - |
81 |
| -network.add("Link", |
82 |
| - "river", |
83 |
| - bus0="0 reservoir", |
84 |
| - bus1="1 reservoir", |
85 |
| - efficiency=0.5, |
86 |
| - p_nom_extendable=True) |
87 |
| - |
| 101 | + |
88 | 102 |
|
89 | 103 | network.add("Store",
|
90 | 104 | "0 reservoir",
|
91 | 105 | bus="0 reservoir",
|
92 | 106 | e_cyclic=True,
|
93 | 107 | e_nom_extendable=True)
|
94 | 108 |
|
95 |
| - |
96 | 109 | network.add("Store",
|
97 | 110 | "1 reservoir",
|
98 | 111 | bus="1 reservoir",
|
|
102 | 115 | network.lopf(network.snapshots)
|
103 | 116 | print("Objective:",network.objective)
|
104 | 117 |
|
105 |
| -print(pd.DataFrame({attr: network.stores_t[attr]["0 reservoir"] for attr in ["p","e"]})) |
106 |
| - |
107 |
| -print(pd.DataFrame({attr: network.stores_t[attr]["1 reservoir"] for attr in ["p","e"]})) |
| 118 | +print(network.generators_t.p) |
108 | 119 |
|
109 | 120 | print(network.links_t.p0)
|
110 | 121 |
|
111 |
| -print(network.generators_t.p) |
| 122 | +print(network.links_t.p1) |
| 123 | + |
| 124 | +print(network.links_t.p2) |
| 125 | + |
| 126 | +print(pd.DataFrame({attr: network.stores_t[attr]["0 reservoir"] for attr in ["p","e"]})) |
| 127 | + |
| 128 | +print(pd.DataFrame({attr: network.stores_t[attr]["1 reservoir"] for attr in ["p","e"]})) |
112 | 129 |
|
0 commit comments