-
Notifications
You must be signed in to change notification settings - Fork 478
/
test_TNEP.py
182 lines (141 loc) · 6.6 KB
/
test_TNEP.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
import pytest
import pandapower.networks as nw
from pandapower.converter.powermodels.to_pm import init_ne_line
import pandas as pd
import numpy as np
import pandapower as pp
from pandapower.converter import convert_pp_to_pm
try:
from julia.core import UnsupportedPythonError
except ImportError:
UnsupportedPythonError = Exception
try:
from julia import Main
julia_installed = True
except (ImportError, RuntimeError, UnsupportedPythonError) as e:
julia_installed = False
#print(e)
def cigre_grid():
net = nw.create_cigre_network_mv()
net["bus"].loc[:, "min_vm_pu"] = 0.95
net["bus"].loc[:, "max_vm_pu"] = 1.05
net["line"].loc[:, "max_loading_percent"] = 60.
return net
def define_possible_new_lines(net):
# Here the possible new lines are a copy of all the lines which are already in the grid
max_idx = max(net["line"].index)
net["line"] = pd.concat([net["line"]] * 2, ignore_index=True) # duplicate
# they must be set out of service in the line DataFrame (otherwise they are already "built")
net["line"].loc[max_idx + 1:, "in_service"] = False
# get the index of the new lines
new_lines = net["line"].loc[max_idx + 1:].index
# creates the new line DataFrame net["ne_line"] which defines the measures to choose from. The costs are defined
# exemplary as 1. for every line.
init_ne_line(net, new_lines, construction_costs=np.ones(len(new_lines)))
return net
@pytest.mark.slow
@pytest.mark.skipif(not julia_installed, reason="requires julia installation")
def test_pm_tnep_cigre_dc():
# get the grid
net = cigre_grid()
# add the possible new lines
define_possible_new_lines(net)
# check if max line loading percent is violated (should be)
pp.runpp(net)
#print("Max line loading prior to optimization:")
#print(net.res_line.loading_percent.max())
assert np.any(net["res_line"].loc[:, "loading_percent"] > net["line"].loc[:, "max_loading_percent"])
# run power models tnep optimization
pp.runpm_tnep(net, pm_solver= "juniper", pm_model="DCMPPowerModel") # gurobi is a better option, but not for travis
# print the information about the newly built lines
#print("These lines are to be built:")
#print(net["res_ne_line"])
# set lines to be built in service
lines_to_built = net["res_ne_line"].loc[net["res_ne_line"].loc[:, "built"], "built"].index
net["line"].loc[lines_to_built, "in_service"] = True
# run a power flow calculation again and check if max_loading percent is still violated
pp.runpp(net)
# check max line loading results
assert not np.any(net["res_line"].loc[:, "loading_percent"] > net["line"].loc[:, "max_loading_percent"])
#print("Max line loading after the optimization:")
#print(net.res_line.loading_percent.max())
def define_ext_grid_limits(net):
# define limits
net["ext_grid"].loc[:, "min_p_mw"] = -9999.
net["ext_grid"].loc[:, "max_p_mw"] = 9999.
net["ext_grid"].loc[:, "min_q_mvar"] = -9999.
net["ext_grid"].loc[:, "max_q_mvar"] = 9999.
# define costs
for i in net.ext_grid.index:
pp.create_poly_cost(net, i, 'ext_grid', cp1_eur_per_mw=1)
def test_pm_tnep_cigre_only_conversion():
# get the grid
net = cigre_grid()
# add the possible new lines
define_possible_new_lines(net)
# check if max line loading percent is violated (should be)
pp.runpp(net)
#print("Max line loading prior to optimization:")
#print(net.res_line.loading_percent.max())
assert np.any(net["res_line"].loc[:, "loading_percent"] > net["line"].loc[:, "max_loading_percent"])
# run power models tnep optimization
convert_pp_to_pm(net)
@pytest.mark.slow
@pytest.mark.skipif(not julia_installed, reason="requires julia installation")
def test_pm_tnep_cigre_ac_S():
# get the grid
net = cigre_grid()
# add the possible new lines
define_possible_new_lines(net)
# check if max line loading percent is violated (should be)
pp.runpp(net)
#print("Max line loading prior to optimization:")
#print(net.res_line.loading_percent.max())
assert np.any(net["res_line"].loc[:, "loading_percent"] > net["line"].loc[:, "max_loading_percent"])
# run power models tnep optimization
pp.runpm_tnep(net, pm_solver= "juniper", pm_model="ACPPowerModel", opf_flow_lim="S") # gurobi is a better option, but not for travis
# print the information about the newly built lines
#print("These lines are to be built:")
#print(net["res_ne_line"])
# set lines to be built in service
lines_to_built = net["res_ne_line"].loc[net["res_ne_line"].loc[:, "built"], "built"].index
net["line"].loc[lines_to_built, "in_service"] = True
# run a power flow calculation again and check if max_loading percent is still violated
pp.runpp(net)
# check max line loading results
assert not np.any(net["res_line"].loc[:, "loading_percent"] > net["line"].loc[:, "max_loading_percent"])
#print("Max line loading after the optimization:")
#print(net.res_line.loading_percent.max())
@pytest.mark.slow
@pytest.mark.skipif(not julia_installed, reason="requires julia installation")
@pytest.mark.xfail(reason="Not yet implemented in the pm pp interface for TNEP")
def test_pm_tnep_cigre_ac_I():
# get the grid
net = cigre_grid()
# add the possible new lines
define_possible_new_lines(net)
# check if max line loading percent is violated (should be)
pp.runpp(net)
#print("Max line loading prior to optimization:")
#print(net.res_line.loading_percent.max())
assert np.any(net["res_line"].loc[:, "loading_percent"] > net["line"].loc[:, "max_loading_percent"])
# run power models tnep optimization
pp.runpm_tnep(net, pm_solver= "juniper", pm_model="ACPPowerModel", opf_flow_lim="I") # gurobi is a better option, but not for travis
# print the information about the newly built lines
#print("These lines are to be built:")
#print(net["res_ne_line"])
# set lines to be built in service
lines_to_built = net["res_ne_line"].loc[net["res_ne_line"].loc[:, "built"], "built"].index
net["line"].loc[lines_to_built, "in_service"] = True
# run a power flow calculation again and check if max_loading percent is still violated
pp.runpp(net)
# check max line loading results
assert not np.any(net["res_line"].loc[:, "loading_percent"] > net["line"].loc[:, "max_loading_percent"])
#print("Max line loading after the optimization:")
#print(net.res_line.loading_percent.max())
if __name__ == '__main__':
# pytest.main([__file__])
# test_pm_tnep_cigre_ac_I()
# test_pm_tnep_cigre()
# test_pm_tnep_cigre_only_conversion()
test_pm_tnep_cigre_dc()