base_network: Add links from TYNDP

Manually collected from https://tyndp.entsoe.eu/. Deactivated by default.
This commit is contained in:
Jonas Hörsch 2018-09-24 20:19:47 +02:00
parent 9c629560db
commit 52e214a3b2
4 changed files with 98 additions and 22 deletions

View File

@ -43,6 +43,7 @@ rule base_network:
eg_transformers='data/entsoegridkit/transformers.csv', eg_transformers='data/entsoegridkit/transformers.csv',
parameter_corrections='data/parameter_corrections.yaml', parameter_corrections='data/parameter_corrections.yaml',
links_p_nom='data/links_p_nom.csv', links_p_nom='data/links_p_nom.csv',
links_tyndp='data/links_tyndp.csv',
country_shapes='resources/country_shapes.geojson', country_shapes='resources/country_shapes.geojson',
offshore_shapes='resources/offshore_shapes.geojson', offshore_shapes='resources/offshore_shapes.geojson',
europe_shape='resources/europe_shape.geojson' europe_shape='resources/europe_shape.geojson'

View File

@ -5,7 +5,7 @@ scenario:
sectors: [E] # ,E+EV,E+BEV,E+BEV+V2G] # [ E+EV, E+BEV, E+BEV+V2G ] sectors: [E] # ,E+EV,E+BEV,E+BEV+V2G] # [ E+EV, E+BEV, E+BEV+V2G ]
simpl: [''] simpl: ['']
lv: [1.0, 1.125, 1.25, 1.5, 2.0, 3.0] lv: [1.0, 1.125, 1.25, 1.5, 2.0, 3.0]
clusters: [45, 64, 90, 128, 181, 256] #, 362] # (2**np.r_[5.5:9:.5]).astype(int) clusters: [45, 64, 90, 128, 181] #, 256, 362] # (2**np.r_[5.5:9:.5]).astype(int)
opts: [Co2L-3H] #, LC-FL, LC-T, Ep-T, Co2L-T] opts: [Co2L-3H] #, LC-FL, LC-T, Ep-T, Co2L-T]
countries: ['AL', 'AT', 'BA', 'BE', 'BG', 'CH', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'ME', 'MK', 'NL', 'NO', 'PL', 'PT', 'RO', 'RS', 'SE', 'SI', 'SK'] countries: ['AL', 'AT', 'BA', 'BE', 'BG', 'CH', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'ME', 'MK', 'NL', 'NO', 'PL', 'PT', 'RO', 'RS', 'SE', 'SI', 'SK']
@ -32,7 +32,7 @@ electricity:
battery: 6 battery: 6
H2: 168 H2: 168
conventional_carriers: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass] conventional_carriers: [] # nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass]
atlite: atlite:
nprocesses: 4 nprocesses: 4
@ -114,6 +114,7 @@ lines:
links: links:
p_max_pu: 1.0 p_max_pu: 1.0
include_tyndp: false
under_construction: 'zero' # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity under_construction: 'zero' # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity
transformers: transformers:
@ -150,9 +151,9 @@ solving:
load_shedding: true load_shedding: true
noisy_costs: true noisy_costs: true
min_iterations: 4 min_iterations: 4
max_iterations: 6 # max_iterations: 6
# max_iterations: 1 max_iterations: 3
# nhours: 10 #nhours: 10
solver: solver:
name: gurobi name: gurobi
threads: 4 threads: 4

26
data/links_tyndp.csv Normal file
View File

@ -0,0 +1,26 @@
Name,Converterstation 1,Converterstation 2,Length (given) (km),Length (distance*1.2) (km),Power (MW),status,in links_p_nom.csv ?,Ref,x1,y1,x2,y2
Biscay Gulf,Gatica (ES),Cubnezais (FR),370,,2200,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/16,-2.867,43.367,-0.408943,45.074191
Italy-France,Piossasco (IT),Grand Ile (FR),190,,1000,under construction,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/21,7.468,44.9898,6.045,45.472
IFA2,Tourbe (FR),Chilling (GB),,247.2,1000,under construction,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/25,-0.172042,49.083593,-1.277269,50.839338
Italy-Montenegro,Villanova (IT),Latsva (MT),445,,1200,under construction,HVDC MON.ITA Project?,https://tyndp.entsoe.eu/tyndp2018/projects/projects/28,14.125,42.3947222222222,18.7947222222222,42.3175
NordLink,Tonstad (NO),Wilster (DE),514,,1400,under construction,NORD.LINK,https://tyndp.entsoe.eu/tyndp2018/projects/projects/37,6.716948,58.662631,9.373979,53.922479
COBRA cable,Endrup (DK),Eemshaven (NL),325,,700,under construction,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/71,8.718392,55.523115,6.835494,53.438589
Thames Estuary Cluster (NEMO-Link),Richborough (GB),Gezelle (BE),140,,1000,under construction,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/74,1.324854,51.295891,3.23043,51.24902
Anglo-Scottish -1,Hunterston (UK),Deeside (UK),422,,2400,under construction,Yes (Western HVDC Link ),https://tyndp.entsoe.eu/tyndp2018/projects/projects/77,-4.898329,55.723331,-3.032972,53.199735
ALEGrO,Lixhe (BE),Oberzier (DE),100,,1000,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/92,5.67933,50.7567965,6.474704,50.867532
North Sea Link,Kvilldal (NO),Blythe (GB),720,,1400,under construction,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/110,6.637527,59.515096,-1.510277,55.126957
HVDC SuedOstLink,Wolmirstedt (DE),Isar (DE),,557,2000,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/130,11.629014,52.252137,12.091596,48.080837
HVDC Line A-North,Emden East (DE),Osterath (DE),,284,2000,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/132,7.206009,53.359403,6.619451,51.272935
France-Alderney-Britain,Exeter (UK),Menuel (FR),220,,1400,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/153,-3.533899,50.718412,-1.469216,49.509594
Viking DKW-GB,Bicker Fen (GB),Revsing (DK),,807,1400,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/167,-0.203587,52.93979,9.178363,55.509166
ElecLink,Sellindge (UK),Mandarins (FR),,72,1000,under construction,Yes (Interconnexion France Angleterre (new)),https://tyndp.entsoe.eu/tyndp2018/projects/projects/172,0.975555555555556,51.1058333333333,1.78472222222222,50.9030555555556
Greenconnector,Verderio (IT),Sils i.D. (CH),150,,1000,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/174,9.439781,45.668539,9.76569,46.432156
Hansa PowerBridge I,Hurva (SE),Guestrow (DE),,283,700,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/176,13.6022222222222,55.8330555555556,12.189538,53.803155
NorthConnect,Simadalen (NO),Peterhead (UK),650,,1400,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/190,7.16027,60.500527,-1.784066,57.508123
HVDC SuedLink,Wilster (DE),Großgartach (DE),,637,4000,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/235,9.373979,53.922479,9.117193,49.145157
AQUIND Interconnector,Lovedean (GB),Barnabos (FR),254,,2000,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/247,-1.020512,50.908244,0.991736,49.656631
HVDC Ultranet,Osterath (DE),Philippsburg (DE),,314,600,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/254,6.619451,51.272935,8.458036,49.235253
Gridlink,Kingsnorth (UK),Warande (FR),160,,1400,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/285,0.596111111111111,51.41972,2.376776,51.034368
SACOI 3 -1,Codrongianos (IT),Lucciana (FR),,268,400,in permitting,replace SACOI 2,https://tyndp.entsoe.eu/tyndp2018/projects/projects/299,8.679351,40.65765,9.417275,42.547134
SACOI 3 -2,Lucciana (FR),Suvereto (IT),,139,400,in permitting,replace SACOI 2,https://tyndp.entsoe.eu/tyndp2018/projects/projects/299,9.417275,42.547134,10.678444,43.076683
NeuConnect,Grain (UK),Fedderwarden (DE),680,,1400,in permitting,,https://tyndp.entsoe.eu/tyndp2018/projects/projects/309,0.716666666666667,51.44,8.046524,53.562763
1 Name Converterstation 1 Converterstation 2 Length (given) (km) Length (distance*1.2) (km) Power (MW) status in links_p_nom.csv ? Ref x1 y1 x2 y2
2 Biscay Gulf Gatica (ES) Cubnezais (FR) 370 2200 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/16 -2.867 43.367 -0.408943 45.074191
3 Italy-France Piossasco (IT) Grand Ile (FR) 190 1000 under construction https://tyndp.entsoe.eu/tyndp2018/projects/projects/21 7.468 44.9898 6.045 45.472
4 IFA2 Tourbe (FR) Chilling (GB) 247.2 1000 under construction https://tyndp.entsoe.eu/tyndp2018/projects/projects/25 -0.172042 49.083593 -1.277269 50.839338
5 Italy-Montenegro Villanova (IT) Latsva (MT) 445 1200 under construction HVDC MON.ITA Project? https://tyndp.entsoe.eu/tyndp2018/projects/projects/28 14.125 42.3947222222222 18.7947222222222 42.3175
6 NordLink Tonstad (NO) Wilster (DE) 514 1400 under construction NORD.LINK https://tyndp.entsoe.eu/tyndp2018/projects/projects/37 6.716948 58.662631 9.373979 53.922479
7 COBRA cable Endrup (DK) Eemshaven (NL) 325 700 under construction https://tyndp.entsoe.eu/tyndp2018/projects/projects/71 8.718392 55.523115 6.835494 53.438589
8 Thames Estuary Cluster (NEMO-Link) Richborough (GB) Gezelle (BE) 140 1000 under construction https://tyndp.entsoe.eu/tyndp2018/projects/projects/74 1.324854 51.295891 3.23043 51.24902
9 Anglo-Scottish -1 Hunterston (UK) Deeside (UK) 422 2400 under construction Yes (Western HVDC Link ) https://tyndp.entsoe.eu/tyndp2018/projects/projects/77 -4.898329 55.723331 -3.032972 53.199735
10 ALEGrO Lixhe (BE) Oberzier (DE) 100 1000 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/92 5.67933 50.7567965 6.474704 50.867532
11 North Sea Link Kvilldal (NO) Blythe (GB) 720 1400 under construction https://tyndp.entsoe.eu/tyndp2018/projects/projects/110 6.637527 59.515096 -1.510277 55.126957
12 HVDC SuedOstLink Wolmirstedt (DE) Isar (DE) 557 2000 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/130 11.629014 52.252137 12.091596 48.080837
13 HVDC Line A-North Emden East (DE) Osterath (DE) 284 2000 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/132 7.206009 53.359403 6.619451 51.272935
14 France-Alderney-Britain Exeter (UK) Menuel (FR) 220 1400 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/153 -3.533899 50.718412 -1.469216 49.509594
15 Viking DKW-GB Bicker Fen (GB) Revsing (DK) 807 1400 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/167 -0.203587 52.93979 9.178363 55.509166
16 ElecLink Sellindge (UK) Mandarins (FR) 72 1000 under construction Yes (Interconnexion France Angleterre (new)) https://tyndp.entsoe.eu/tyndp2018/projects/projects/172 0.975555555555556 51.1058333333333 1.78472222222222 50.9030555555556
17 Greenconnector Verderio (IT) Sils i.D. (CH) 150 1000 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/174 9.439781 45.668539 9.76569 46.432156
18 Hansa PowerBridge I Hurva (SE) Guestrow (DE) 283 700 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/176 13.6022222222222 55.8330555555556 12.189538 53.803155
19 NorthConnect Simadalen (NO) Peterhead (UK) 650 1400 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/190 7.16027 60.500527 -1.784066 57.508123
20 HVDC SuedLink Wilster (DE) Großgartach (DE) 637 4000 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/235 9.373979 53.922479 9.117193 49.145157
21 AQUIND Interconnector Lovedean (GB) Barnabos (FR) 254 2000 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/247 -1.020512 50.908244 0.991736 49.656631
22 HVDC Ultranet Osterath (DE) Philippsburg (DE) 314 600 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/254 6.619451 51.272935 8.458036 49.235253
23 Gridlink Kingsnorth (UK) Warande (FR) 160 1400 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/285 0.596111111111111 51.41972 2.376776 51.034368
24 SACOI 3 -1 Codrongianos (IT) Lucciana (FR) 268 400 in permitting replace SACOI 2 https://tyndp.entsoe.eu/tyndp2018/projects/projects/299 8.679351 40.65765 9.417275 42.547134
25 SACOI 3 -2 Lucciana (FR) Suvereto (IT) 139 400 in permitting replace SACOI 2 https://tyndp.entsoe.eu/tyndp2018/projects/projects/299 9.417275 42.547134 10.678444 43.076683
26 NeuConnect Grain (UK) Fedderwarden (DE) 680 1400 in permitting https://tyndp.entsoe.eu/tyndp2018/projects/projects/309 0.716666666666667 51.44 8.046524 53.562763

View File

@ -9,7 +9,7 @@ from scipy.sparse import csgraph
from six import iteritems from six import iteritems
from six.moves import filter from six.moves import filter
from shapely.geometry import Point from shapely.geometry import Point, LineString
import shapely, shapely.prepared, shapely.wkt import shapely, shapely.prepared, shapely.wkt
from vresutils.graph import BreadthFirstLevels from vresutils.graph import BreadthFirstLevels
@ -19,6 +19,23 @@ logger = logging.getLogger(__name__)
import pypsa import pypsa
def _find_closest_links(links, new_links, distance_upper_bound=1.5):
tree = sp.spatial.KDTree(np.vstack([
new_links[['x1', 'y1', 'x2', 'y2']],
new_links[['x2', 'y2', 'x1', 'y1']]
]))
dist, ind = tree.query(
np.asarray([np.asarray(shapely.wkt.loads(s))[[0, -1]].flatten()
for s in links.geometry]),
distance_upper_bound=distance_upper_bound
)
return (
pd.DataFrame(dict(D=dist, i=new_links.index[ind % len(new_links)]), index=links.index)
.groupby('i').D.idxmin()
)
def _load_buses_from_eg(): def _load_buses_from_eg():
buses = (pd.read_csv(snakemake.input.eg_buses, quotechar="'", buses = (pd.read_csv(snakemake.input.eg_buses, quotechar="'",
true_values='t', false_values='f', true_values='t', false_values='f',
@ -77,6 +94,49 @@ def _load_links_from_eg(buses):
return links return links
def _add_links_from_tyndp(buses, links):
links_tyndp = pd.read_csv(snakemake.input.links_tyndp)
links_tyndp["j"] = _find_closest_links(links, links_tyndp, distance_upper_bound=0.8)
# Corresponds approximately to 60km tolerances
if links_tyndp["j"].notnull().any():
logger.info("The following TYNDP links were already in the dataset (skipping): " + ", ".join(links_tyndp.loc[links_tyndp["j"].notnull(), "Name"]))
links_tyndp = links_tyndp.loc[links_tyndp["j"].isnull()]
tree = sp.spatial.KDTree(buses[['x', 'y']])
_, ind0 = tree.query(links_tyndp[["x1", "y1"]])
ind0_b = ind0 < len(buses)
links_tyndp.loc[ind0_b, "bus0"] = buses.index[ind0[ind0_b]]
_, ind1 = tree.query(links_tyndp[["x2", "y2"]])
ind1_b = ind1 < len(buses)
links_tyndp.loc[ind1_b, "bus1"] = buses.index[ind1[ind1_b]]
links_tyndp_located_b = links_tyndp["bus0"].notnull() & links_tyndp["bus1"].notnull()
if not links_tyndp_located_b.all():
logger.warn("Did not find connected buses for TYNDP links (skipping): " + ", ".join(links_tyndp.loc[~links_tyndp_located_b, "Name"]))
links_tyndp = links_tyndp.loc[links_tyndp_located_b]
logger.info("Adding the following TYNDP links: " + ", ".join(links_tyndp["Name"]))
links_tyndp = links_tyndp[["bus0", "bus1"]].assign(
carrier='DC',
p_nom=links_tyndp["Power (MW)"],
length=links_tyndp["Length (given) (km)"].fillna(links_tyndp["Length (distance*1.2) (km)"]),
under_construction=True,
underground=False,
geometry=(links_tyndp[["x1", "y1", "x2", "y2"]]
.apply(lambda s: str(LineString([[s.x1, s.y1], [s.x2, s.y2]])), axis=1)),
tags=('"name"=>"' + links_tyndp["Name"] + '", ' +
'"ref"=>"' + links_tyndp["Ref"] + '", ' +
'"status"=>"' + links_tyndp["status"] + '"')
)
links_tyndp.index = "T" + links_tyndp.index.astype(str)
return links.append(links_tyndp)
def _load_lines_from_eg(buses): def _load_lines_from_eg(buses):
lines = (pd.read_csv(snakemake.input.eg_lines, quotechar="'", true_values='t', false_values='f', lines = (pd.read_csv(snakemake.input.eg_lines, quotechar="'", true_values='t', false_values='f',
dtype=dict(line_id='str', bus0='str', bus1='str', dtype=dict(line_id='str', bus0='str', bus1='str',
@ -134,22 +194,7 @@ def _set_electrical_parameters_links(links):
links['p_min_pu'] = -p_max_pu links['p_min_pu'] = -p_max_pu
links_p_nom = pd.read_csv(snakemake.input.links_p_nom) links_p_nom = pd.read_csv(snakemake.input.links_p_nom)
links_p_nom["j"] = _find_closest_links(links, links_p_nom)
tree = sp.spatial.KDTree(np.vstack([
links_p_nom[['x1', 'y1', 'x2', 'y2']],
links_p_nom[['x2', 'y2', 'x1', 'y1']]
]))
dist, ind = tree.query(
np.asarray([np.asarray(shapely.wkt.loads(s))[[0, -1]].flatten()
for s in links.geometry]),
distance_upper_bound=1.5
)
links_p_nom["j"] =(
pd.DataFrame(dict(D=dist, i=links_p_nom.index[ind % len(links_p_nom)]), index=links.index)
.groupby('i').D.idxmin()
)
p_nom = links_p_nom.dropna(subset=["j"]).set_index("j")["Power (MW)"] p_nom = links_p_nom.dropna(subset=["j"]).set_index("j")["Power (MW)"]
links.loc[p_nom.index, "p_nom"] = p_nom links.loc[p_nom.index, "p_nom"] = p_nom
@ -321,6 +366,9 @@ def base_network():
buses = _load_buses_from_eg() buses = _load_buses_from_eg()
links = _load_links_from_eg(buses) links = _load_links_from_eg(buses)
if snakemake.config['links'].get('include_tyndp'):
links = _add_links_from_tyndp(buses, links)
converters = _load_converters_from_eg(buses) converters = _load_converters_from_eg(buses)
lines = _load_lines_from_eg(buses) lines = _load_lines_from_eg(buses)