Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

floating offshore wind turbines #284

Closed
wants to merge 9 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Snakefile
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ rule build_renewable_profiles:
corine="data/bundle/corine/g250_clc06_V18_5.tif",
natura="resources/natura.tiff",
gebco=lambda w: ("data/bundle/GEBCO_2014_2D.nc"
if "max_depth" in config["renewable"][w.technology].keys()
if any(key in ["max_depth", "min_depth"] for key in config["renewable"][w.technology].keys())
else []),
country_shapes='resources/country_shapes.geojson',
offshore_shapes='resources/offshore_shapes.geojson',
Expand Down Expand Up @@ -226,6 +226,7 @@ rule add_electricity:
geth_hydro_capacities='data/geth2015_hydro_capacities.csv',
load='resources/load.csv',
nuts3_shapes='resources/nuts3_shapes.geojson',
gebco='data/bundle/GEBCO_2014_2D.nc',
**{f"profile_{tech}": f"resources/profile_{tech}.nc"
for tech in config['renewable']}
output: "networks/elec.nc"
Expand Down
31 changes: 25 additions & 6 deletions config.default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ enable:
build_natura_raster: false
retrieve_natura_raster: true
custom_busmap: false
split_offshore_regions: True #splits big offshore regions into smaller regions

electricity:
voltages: [220., 300., 380.]
Expand Down Expand Up @@ -110,19 +111,37 @@ renewable:
cutout: europe-2013-era5
resource:
method: wind
turbine: NREL_ReferenceTurbine_5MW_offshore
capacity_per_sqkm: 2
turbine: NREL_ReferenceTurbine_2020ATB_12MW_offshore
capacity_per_sqkm: 2.5
correction_factor: 0.8855
# proxy for wake losses
# from 10.1016/j.energy.2018.08.153
# until done more rigorously in #153
corine: [44, 255]
natura: true
max_depth: 50
max_depth: 60
max_shore_distance: 30000
potential: simple # or conservative
clip_p_max_pu: 1.e-2
calculate_topology_cost: true
offwind-dc:
cutout: europe-2013-era5
resource:
method: wind
turbine: NREL_ReferenceTurbine_2020ATB_12MW_offshore
capacity_per_sqkm: 3.5 # from DEA
correction_factor: 0.8855
# proxy for wake losses
# from 10.1016/j.energy.2018.08.153
# until done more rigorously in #153
corine: [44, 255]
natura: true
max_depth: 60
min_shore_distance: 30000
potential: simple # or conservative
clip_p_max_pu: 1.e-2
calculate_topology_cost: true
offwind-float:
cutout: europe-2013-era5
resource:
method: wind
Expand All @@ -135,8 +154,7 @@ renewable:
# until done more rigorously in #153
corine: [44, 255]
natura: true
max_depth: 50
min_shore_distance: 30000
min_depth: 60
potential: simple # or conservative
clip_p_max_pu: 1.e-2
solar:
Expand Down Expand Up @@ -203,7 +221,8 @@ costs:
marginal_cost: # EUR/MWh
solar: 0.01
onwind: 0.015
offwind: 0.015
offwind-ac: 0.015
offwind-dc: 0.015
hydro: 0.
H2: 0.
electrolysis: 0.
Expand Down
21 changes: 16 additions & 5 deletions data/costs.csv
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
technology,year,parameter,value,unit,source
solar-rooftop,2030,discount rate,0.04,per unit,standard for decentral
onwind,2030,lifetime,30,years,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind,2030,lifetime,30,years,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-ac,2030,lifetime,30,years,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-dc,2030,lifetime,30,years,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-float,2030,lifetime,20,years,C. Maienza 2020 A life cycle cost model for floating offshore wind farms
solar,2030,lifetime,25,years,IEA2010
solar-rooftop,2030,lifetime,25,years,IEA2010
solar-utility,2030,lifetime,25,years,IEA2010
Expand All @@ -17,13 +19,18 @@ geothermal,2030,lifetime,40,years,IEA2010
biomass,2030,lifetime,30,years,ECF2010 in DIW DataDoc http://hdl.handle.net/10419/80348
oil,2030,lifetime,30,years,ECF2010 in DIW DataDoc http://hdl.handle.net/10419/80348
onwind,2030,investment,1040,EUR/kWel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind,2030,investment,1640,EUR/kWel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-ac,2030,investment,1640,EUR/kWel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-ac-station,2030,investment,250,EUR/kWel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-ac-connection-submarine,2030,investment,2685,EUR/MW/km,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-ac-connection-underground,2030,investment,1342,EUR/MW/km,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-dc,2030,investment,1640,EUR/kWel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-dc-station,2030,investment,400,EUR/kWel,Haertel 2017; assuming one onshore and one offshore node + 13% learning reduction
offwind-dc-connection-submarine,2030,investment,2000,EUR/MW/km,DTU report based on Fig 34 of https://ec.europa.eu/energy/sites/ener/files/documents/2014_nsog_report.pdf
offwind-dc-connection-underground,2030,investment,1000,EUR/MW/km,Haertel 2017; average + 13% learning reduction
offwind-float,2030,investment,2973,EUR/kWel,"C. Maienza 2020 A life cycle cost model for floating offshore wind farms;""Spar Buyo without cost for cabelin year not specified"""
offwind-float-station,2030,investment,400,EUR/kWel,Haertel 2017; assuming one onshore and one offshore node + 13% learning reduction
offwind-float-connection-submarine,2030,investment,2000,EUR/MW/km,DTU report based on Fig 34 of https://ec.europa.eu/energy/sites/ener/files/documents/2014_nsog_report.pdf
offwind-float-connection-underground,2030,investment,1000,EUR/MW/km,"Haertel 2017; average + 13% learning reduction"""
solar,2030,investment,600,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348
biomass,2030,investment,2209,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348
geothermal,2030,investment,3392,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348
Expand All @@ -39,7 +46,9 @@ nuclear,2030,investment,6000,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80
CCGT,2030,investment,800,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348
oil,2030,investment,400,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348
onwind,2030,FOM,2.450549,%/year,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind,2030,FOM,2.304878,%/year,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-ac,2030,FOM,2.304878,%/year,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-dc,2030,FOM,2.304878,%/year,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-float,2030,FOM,1.31,%/year,C. Maienza 2020 A life cycle cost model for floating offshore wind farms ;Assumend lifetime 20a
solar,2030,FOM,4.166667,%/year,DIW DataDoc http://hdl.handle.net/10419/80348
solar-rooftop,2030,FOM,2,%/year,ETIP PV
solar-utility,2030,FOM,3,%/year,ETIP PV
Expand All @@ -54,7 +63,9 @@ ror,2030,FOM,2,%/year,DIW DataDoc http://hdl.handle.net/10419/80348
CCGT,2030,FOM,2.5,%/year,DIW DataDoc http://hdl.handle.net/10419/80348
OCGT,2030,FOM,3.75,%/year,DIW DataDoc http://hdl.handle.net/10419/80348
onwind,2030,VOM,2.3,EUR/MWhel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind,2030,VOM,2.7,EUR/MWhel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-ac,2030,VOM,2.7,EUR/MWhel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-dc,2030,VOM,2.7,EUR/MWhel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data
offwind-float,2030,VOM,0,EUR/MWhel,no information; included in FOM
solar,2030,VOM,0.01,EUR/MWhel,RES costs made up to fix curtailment order
coal,2030,VOM,6,EUR/MWhel,DIW DataDoc http://hdl.handle.net/10419/80348 PC (Advanced/SuperC)
lignite,2030,VOM,7,EUR/MWhel,DIW DataDoc http://hdl.handle.net/10419/80348
Expand Down Expand Up @@ -192,4 +203,4 @@ HVDC submarine,2030,lifetime,40,years,Hagspiel
HVDC submarine,2030,FOM,2,%/year,Hagspiel
HVDC inverter pair,2030,investment,150000,EUR/MW,Hagspiel
HVDC inverter pair,2030,lifetime,40,years,Hagspiel
HVDC inverter pair,2030,FOM,2,%/year,Hagspiel
HVDC inverter pair,2030,FOM,2,%/year,Hagspiel
43 changes: 42 additions & 1 deletion scripts/_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
# SPDX-License-Identifier: MIT

import pandas as pd
import numpy as np
from pathlib import Path


Expand Down Expand Up @@ -199,6 +200,46 @@ def aggregate_costs(n, flatten=False, opts=None, existing_only=False):

return costs

def calculate_offwind_cost(WD, MW=12, no=54, D=236, HH=138, SP=343, DT=8):
"""
Helper calculating offshore wind capex considering the average water depth of the region.

Parameters
----------
WD : xarray
Average water depth of the different regions
MW : float
Power of the wind turbine in MW
no: int
Average number of wind turbines in farm
D: int
Rotor diameter of wind turbine in meters
HH: int
Hub height of wind turbine in meters
SP: int
Specific power of wind turbine in W/m2
DT: int
Distance between the wind turbine in number of rotor diameters

Returns
-------
capex: xarray
Capex of the wind turbine in the different regions
"""
RA=(D/2)**2*np.pi
IA=DT*D
wind_turbine_invest=(-0.6*SP+750+(0.53*HH*RA+5500)/(1000*MW))*1.1
wind_turbine_install= 300*MW**(-0.6)
foundation_invest=(8*np.abs(WD)+30)*(1+(0.003*(350-np.min([400,SP]))))
foundation_install=2.5*np.abs(WD)+600*MW**(-0.6)
array_cable=IA*500/MW/1000
turbine_transport=50
insurance=100
finance_cost=100
continences=50
capex=np.sum([wind_turbine_invest,wind_turbine_install, foundation_invest, foundation_install, array_cable, turbine_transport, insurance, finance_cost, continences])*1000 # in €/MW
return capex

def progress_retrieve(url, file):
import urllib
from progressbar import ProgressBar
Expand Down Expand Up @@ -240,7 +281,7 @@ def mock_snakemake(rulename, **wildcards):
if os.path.exists(p):
snakefile = p
break
workflow = sm.Workflow(snakefile, overwrite_configfiles=[])
workflow = sm.Workflow(snakefile, overwrite_configfiles=[], rerun_triggers=[])
workflow.include(snakefile)
workflow.global_resources = {}
rule = workflow.get_rule(rulename)
Expand Down
41 changes: 29 additions & 12 deletions scripts/add_electricity.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,7 @@ def update_transmission_costs(n, costs, length_factor=1.0):


def attach_wind_and_solar(n, costs, input_profiles, technologies, line_length_factor=1):
from _helpers import calculate_offwind_cost
# TODO: rename tech -> carrier, technologies -> carriers

for tech in technologies:
Expand All @@ -275,29 +276,45 @@ def attach_wind_and_solar(n, costs, input_profiles, technologies, line_length_fa
suptech = tech.split('-', 2)[0]
if suptech == 'offwind':
underwater_fraction = ds['underwater_fraction'].to_pandas()
connection_cost = (line_length_factor *
ds['average_distance'].to_pandas() *
(underwater_fraction *
cable_cost = (line_length_factor *
ds['average_distance'].to_pandas() *
(underwater_fraction *
costs.at[tech + '-connection-submarine', 'capital_cost'] +
(1. - underwater_fraction) *
costs.at[tech + '-connection-underground', 'capital_cost']))
capital_cost = (costs.at['offwind', 'capital_cost'] +
costs.at[tech + '-station', 'capital_cost'] +
connection_cost)
grid_connection_cost=costs.at[tech + '-station', 'capital_cost'] + cable_cost
calculate_topology_cost=technologies[tech].get("calculate_topology_cost", False)
if calculate_topology_cost:
turbine_cost=calculate_offwind_cost(ds["water_depth"].to_pandas())*(calculate_annuity(costs.at[tech, 'lifetime'], costs.at[tech, "discount rate"]) + costs.at[tech, "FOM"]/100.) * Nyears
else:
turbine_cost=costs.at[tech, 'capital_cost']
capital_cost = (turbine_cost + grid_connection_cost)

logger.info("Added connection cost of {:0.0f}-{:0.0f} Eur/MW/a to {}"
.format(connection_cost.min(), connection_cost.max(), tech))
.format(cable_cost.min(), cable_cost.max(), tech))
n.madd("Generator", ds.indexes['bus'], ' ' + tech,
bus=ds.indexes['bus'].str.split("_").str[0],
carrier=tech,
p_nom_extendable=True,
p_nom_max=ds['p_nom_max'].to_pandas(),
weight=ds['weight'].to_pandas(),
marginal_cost=costs.at[tech, 'marginal_cost'],
capital_cost=capital_cost,
grid_connection_cost=grid_connection_cost,
turbine_cost=turbine_cost,
efficiency=costs.at[tech, 'efficiency'],
p_max_pu=ds['profile'].transpose('time', 'bus').to_pandas())
else:
capital_cost = costs.at[tech, 'capital_cost']

n.madd("Generator", ds.indexes['bus'], ' ' + tech,
bus=ds.indexes['bus'],
n.madd("Generator", ds.indexes['bus'], ' ' + tech,
bus=ds.indexes['bus'].str.split("_").str[0],
carrier=tech,
p_nom_extendable=True,
p_nom_max=ds['p_nom_max'].to_pandas(),
weight=ds['weight'].to_pandas(),
marginal_cost=costs.at[suptech, 'marginal_cost'],
marginal_cost=costs.at[tech, 'marginal_cost'],
capital_cost=capital_cost,
efficiency=costs.at[suptech, 'efficiency'],
efficiency=costs.at[tech, 'efficiency'],
p_max_pu=ds['profile'].transpose('time', 'bus').to_pandas())


Expand Down
Loading