Passed
Pull Request — dev (#875)
by
unknown
01:36
created

data.datasets.fix_ehv_subnetworks.drop_trafo()   A

Complexity

Conditions 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 7
rs 10
c 0
b 0
f 0
cc 1
nop 5
1
"""The central module containing all code dealing with fixing ehv subnetworks
2
"""
3
import geopandas as gpd
4
import numpy as np
5
import pandas as pd
6
7
from egon.data import db
8
from egon.data.config import settings
9
from egon.data.datasets import Dataset
10
from egon.data.datasets.etrago_setup import link_geom_from_buses
11
12
13
class FixEhvSubnetworks(Dataset):
14
    def __init__(self, dependencies):
15
        super().__init__(
16
            name="FixEhvSubnetworks",
17
            version="0.0.1",
18
            dependencies=dependencies,
19
            tasks=run,
20
        )
21
22
23
def select_bus_id(x, y, v_nom, scn_name, carrier):
24
25
    return db.select_dataframe(
26
        f"""
27
        SELECT bus_id
28
        FROM grid.egon_etrago_bus
29
        WHERE x = {x}
30
        AND y = {y}
31
        AND v_nom = {v_nom}
32
        AND scn_name = '{scn_name}'
33
        AND carrier = '{carrier}'
34
        """
35
    ).bus_id[0]
36
37
38
def add_bus(x, y, v_nom, scn_name):
39
    df = pd.DataFrame(
40
        index=[db.next_etrago_id("bus")],
41
        data={
42
            "scn_name": scn_name,
43
            "v_nom": v_nom,
44
            "x": x,
45
            "y": y,
46
            "carrier": "AC",
47
        },
48
    )
49
    gdf = gpd.GeoDataFrame(
50
        df, geometry=gpd.points_from_xy(df.x, df.y, crs=4326)
51
    ).rename_geometry("geom")
52
53
    gdf.index.name = "bus_id"
54
55
    gdf.reset_index().to_postgis(
56
        "egon_etrago_bus", schema="grid", con=db.engine(), if_exists="append"
57
    )
58
59
60
def drop_bus(x, y, v_nom, scn_name):
61
    bus = select_bus_id(x, y, v_nom, scn_name, carrier="AC")
62
63
    db.execute_sql(
64
        f"""
65
        DELETE FROM grid.egon_etrago_bus
66
        WHERE
67
        scn_name = '{scn_name}'
68
        AND bus_id = {bus}
69
        AND v_nom = {v_nom}
70
        AND carrier = 'AC'
71
        """
72
    )
73
74
75
def add_line(x0, y0, x1, y1, v_nom, scn_name, cables):
76
    bus0 = select_bus_id(x0, y0, v_nom, scn_name, carrier="AC")
77
    bus1 = select_bus_id(x1, y1, v_nom, scn_name, carrier="AC")
78
79
    df = pd.DataFrame(
80
        index=[db.next_etrago_id("line")],
81
        data={
82
            "bus0": bus0,
83
            "bus1": bus1,
84
            "scn_name": scn_name,
85
            "v_nom": v_nom,
86
            "cables": cables,
87
            "carrier": "AC",
88
        },
89
    )
90
91
    gdf = link_geom_from_buses(df, scn_name)
92
93
    gdf["length"] = gdf.to_crs(3035).topo.length.mul(1e-3)
94
95
    if v_nom == 220:
96
        s_nom = 520
97
        x_per_km = 0.001 * 2 * np.pi * 50
98
99
    elif v_nom == 380:
100
        s_nom = 1790
101
        x_per_km = 0.0008 * 2 * np.pi * 50
102
103
    gdf["s_nom"] = s_nom * gdf["cables"] / 3
0 ignored issues
show
introduced by
The variable s_nom does not seem to be defined for all execution paths.
Loading history...
104
105
    gdf["x"] = (x_per_km * gdf["length"]) / (gdf["cables"] / 3)
0 ignored issues
show
introduced by
The variable x_per_km does not seem to be defined for all execution paths.
Loading history...
106
107
    gdf.index.name = "line_id"
108
109
    gdf.reset_index().to_postgis(
110
        "egon_etrago_line", schema="grid", con=db.engine(), if_exists="append"
111
    )
112
113
114
def drop_line(x0, y0, x1, y1, v_nom, scn_name):
115
    bus0 = select_bus_id(x0, y0, v_nom, scn_name, carrier="AC")
116
    bus1 = select_bus_id(x1, y1, v_nom, scn_name, carrier="AC")
117
118
    db.execute_sql(
119
        f"""
120
        DELETE FROM grid.egon_etrago_line
121
        WHERE
122
        scn_name = '{scn_name}'
123
        AND bus0 = {bus0}
124
        AND bus1 = {bus1}
125
        AND v_nom = {v_nom}
126
        """
127
    )
128
129
130
def add_trafo(x, y, v_nom0, v_nom1, scn_name, n=1):
131
132
    bus0 = select_bus_id(x, y, v_nom0, scn_name, carrier="AC")
133
    bus1 = select_bus_id(x, y, v_nom1, scn_name, carrier="AC")
134
135
    df = pd.DataFrame(
136
        index=[db.next_etrago_id("line")],
137
        data={
138
            "bus0": bus0,
139
            "bus1": bus1,
140
            "scn_name": scn_name,
141
        },
142
    )
143
144
    gdf = link_geom_from_buses(df, scn_name)
145
146
    if (v_nom0 == 220) & (v_nom1 == 380):
147
        s_nom = 600
148
        x = 0.0002
149
150
    gdf["s_nom"] = s_nom * n
0 ignored issues
show
introduced by
The variable s_nom does not seem to be defined in case v_nom0 == 220 & v_nom1 == 380 on line 146 is False. Are you sure this can never be the case?
Loading history...
151
152
    gdf["x"] = x / n
153
154
    gdf.index.name = "trafo_id"
155
156
    gdf.reset_index().to_postgis(
157
        "egon_etrago_transformer",
158
        schema="grid",
159
        con=db.engine(),
160
        if_exists="append",
161
    )
162
163
164
def drop_trafo(x, y, v_nom0, v_nom1, scn_name):
165
166
    bus0 = select_bus_id(x, y, v_nom0, scn_name, carrier="AC")
167
    bus1 = select_bus_id(x, y, v_nom1, scn_name, carrier="AC")
168
169
    db.execute_sql(
170
        f"""
171
        DELETE FROM grid.egon_etrago_transformer
172
        WHERE
173
        scn_name = '{scn_name}'
174
        AND bus0 = {bus0}
175
        AND bus1 = {bus1}
176
        """
177
    )
178
179
180
def fix_subnetworks(scn_name):
181
182
    # Missing 220kV line to Lübeck Siems
183
    # add 220kV bus at substation Lübeck Siems
184
    add_bus(10.760835327266625, 53.90974536547805, 220, scn_name)
185
    # add 220/380kV transformer at substation Lübeck Siems
186
    add_trafo(10.760835327266625, 53.90974536547805, 220, 380, scn_name)
187
188
    # add 220kV line from Umspannwerk Lübeck to Lübeck Siems
189
    add_line(
190
        10.760835327266625,  # Lübeck Siems
191
        53.90974536547805,
192
        10.640952461335745,  # Umspannwerk Lübeck
193
        53.91944427801032,
194
        220,
195
        scn_name,
196
        3,
197
    )
198
199
    # Missing 220kV line from Audorf to Kiel
200
    add_line(
201
        # Audorf
202
        9.726992766257577,
203
        54.291420962253234,
204
        # Kiel
205
        9.9572075,
206
        54.321589,
207
        220,
208
        scn_name,
209
        6,
210
    )
211
212
    if settings()["egon-data"]["--dataset-boundary"] == "Everything":
213
214
        # Missing line from USW Uchtelfangen to 'Kraftwerk Weiher'
215
        add_line(
216
            7.032657738999395,  # Kraftwerk Weiher
217
            49.33473737285781,
218
            6.996454674906,  # Umspannwerk Uchtelfangen
219
            49.3754149606116,
220
            220,
221
            scn_name,
222
            6,
223
        )
224
225
        # Missing 380kV line near Elsfleth
226
        add_line(
227
            # Line
228
            8.419326700000001,
229
            53.229867000000006,
230
            # Schaltanlage Elsfleth/West
231
            8.402976949446648,
232
            53.2371468322213,
233
            380,
234
            scn_name,
235
            6,
236
        )
237
238
        # Missing 380kV line near Magdala
239
        add_line(
240
            # Line north south
241
            11.4298432,
242
            50.9117467,
243
            # Line east
244
            11.4295305,
245
            50.9115176,
246
            380,
247
            scn_name,
248
            3,
249
        )
250
251
        # Missing 220kV line near Frimmersdorf
252
        add_line(
253
            # Line west
254
            6.585418000000001,
255
            51.0495723,
256
            # Line east
257
            6.5867616,
258
            51.0520915,
259
            220,
260
            scn_name,
261
            6,
262
        )
263
264
        # Missing 220kV line from Wolmirstedt to Stendal
265
        add_line(
266
            # Wolmirstedt
267
            11.637225336209951,
268
            52.26707328151311,
269
            # Stendal
270
            11.7689,
271
            52.505533,
272
            220,
273
            scn_name,
274
            6,
275
        )
276
277
        # Plattling
278
        # Update way for osmTGmod in
279
        # 'LINESTRING (12.85328076018362 48.76616932172957,
280
        # 12.85221826521118 48.76597882857125,
281
        # 12.85092755963579 48.76451816626182,
282
        # 12.85081583430311 48.76336597271223,
283
        # 12.85089191559093 48.76309793961921,
284
        # 12.85171674549663 48.76313124988151,
285
        # 12.85233496021983 48.76290980724934,
286
        # 12.85257485139349 48.76326650768988,
287
        # 12.85238077788078 48.76354965879587,
288
        # 12.85335698387775 48.76399030383004,
289
        # 12.85444925633996 48.76422235417385,
290
        # 12.853289544662 48.76616304929393)'
291
292
        # Lamspringe 380kV lines
293
        drop_line(
294
            9.988215035677026,
295
            51.954230057487926,
296
            9.991477300000001,
297
            51.939711,
298
            380,
299
            scn_name,
300
        )
301
302
        drop_line(
303
            9.995589,
304
            51.969716000000005,
305
            9.988215035677026,
306
            51.954230057487926,
307
            380,
308
            scn_name,
309
        )
310
311
        drop_line(
312
            9.982829,
313
            51.985980000000005,
314
            9.995589,
315
            51.969716000000005,
316
            380,
317
            scn_name,
318
        )
319
320
        drop_line(
321
            10.004865,
322
            51.999120000000005,
323
            9.982829,
324
            51.985980000000005,
325
            380,
326
            scn_name,
327
        )
328
329
        drop_line(
330
            10.174395,
331
            52.036448,
332
            9.988215035677026,
333
            51.954230057487926,
334
            380,
335
            scn_name,
336
        )
337
338
        drop_line(
339
            10.195144702845797,
340
            52.079851837273964,
341
            10.174395,
342
            52.036448,
343
            380,
344
            scn_name,
345
        )
346
347
        drop_trafo(9.988215035677026, 51.954230057487926, 110, 380, scn_name)
348
349
        drop_bus(9.988215035677026, 51.954230057487926, 380, scn_name)
350
        drop_bus(9.991477300000001, 51.939711, 380, scn_name)
351
        drop_bus(9.995589, 51.969716000000005, 380, scn_name)
352
        drop_bus(9.982829, 51.985980000000005, 380, scn_name)
353
        drop_bus(10.174395, 52.036448, 380, scn_name)
354
        drop_bus(10.195144702845797, 52.079851837273964, 380, scn_name)
355
356
        drop_bus(10.004865, 51.999120000000005, 380, scn_name)
357
358
        # Umspannwerk Vieselbach
359
        # delete isolated bus and trafo
360
        drop_bus(11.121774798935334, 51.00038603925895, 380, scn_name)
361
        drop_trafo(11.121774798935334, 51.00038603925895, 220, 380, scn_name)
362
363
        # Umspannwerk Waldlaubersheim
364
        # delete isolated bus and trafo
365
        drop_bus(7.815993836091339, 49.92211102637183, 380, scn_name)
366
        drop_trafo(7.815993836091339, 49.92211102637183, 110, 380, scn_name)
367
368
369
def run():
370
    fix_subnetworks("eGon2035")
371
    fix_subnetworks("eGon100RE")
372