Skip to content

Commit

Permalink
Merge pull request #773 from p-glaum/implement-floating
Browse files Browse the repository at this point in the history
Add floating wind technology
  • Loading branch information
fneum authored May 13, 2024
2 parents fa7e1d0 + 84d6634 commit 430b95d
Show file tree
Hide file tree
Showing 14 changed files with 88 additions and 21 deletions.
33 changes: 28 additions & 5 deletions config/config.default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ electricity:
H2: 168

extendable_carriers:
Generator: [solar, onwind, offwind-ac, offwind-dc, OCGT]
Generator: [solar, onwind, offwind-ac, offwind-dc, offwind-float, OCGT]
StorageUnit: [] # battery, H2
Store: [battery, H2]
Link: [] # H2 pipeline
Expand All @@ -117,15 +117,15 @@ electricity:
everywhere_powerplants: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass]

conventional_carriers: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass]
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, hydro]
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, offwind-float, hydro]

estimate_renewable_capacities:
enable: true
from_opsd: true
year: 2020
expansion_limit: false
technology_mapping:
Offshore: [offwind-ac, offwind-dc]
Offshore: [offwind-ac, offwind-dc, offwind-float]
Onshore: [onwind]
PV: [solar]

Expand Down Expand Up @@ -193,7 +193,7 @@ renewable:
luisa: false # [0, 5230]
natura: true
ship_threshold: 400
max_depth: 50
max_depth: 60
max_shore_distance: 30000
excluder_resolution: 200
clip_p_max_pu: 1.e-2
Expand All @@ -209,10 +209,28 @@ renewable:
luisa: false # [0, 5230]
natura: true
ship_threshold: 400
max_depth: 50
max_depth: 60
min_shore_distance: 30000
excluder_resolution: 200
clip_p_max_pu: 1.e-2
offwind-float:
cutout: europe-2013-era5
resource:
method: wind
turbine: NREL_ReferenceTurbine_5MW_offshore
# ScholzPhd Tab 4.3.1: 10MW/km^2
capacity_per_sqkm: 2
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
ship_threshold: 400
excluder_resolution: 200
min_depth: 60
max_depth: 1000
clip_p_max_pu: 1.e-2
solar:
cutout: europe-2013-sarah
resource:
Expand Down Expand Up @@ -306,6 +324,7 @@ pypsa_eur:
- onwind
- offwind-ac
- offwind-dc
- offwind-float
- solar
- ror
- nuclear
Expand Down Expand Up @@ -851,6 +870,7 @@ plotting:
CCGT: "Combined-Cycle Gas"
offwind-ac: "Offshore Wind (AC)"
offwind-dc: "Offshore Wind (DC)"
offwind-float: "Offshore Wind (Floating)"
onwind: "Onshore Wind"
solar: "Solar"
PHS: "Pumped Hydro Storage"
Expand All @@ -875,6 +895,9 @@ plotting:
offwind-dc: "#74c6f2"
offshore wind (DC): "#74c6f2"
offshore wind dc: "#74c6f2"
offwind-float: "#b5e2fa"
offshore wind (Float): "#b5e2fa"
offshore wind float: "#b5e2fa"
# water
hydro: '#298c81'
hydro reservoir: '#298c81'
Expand Down
6 changes: 5 additions & 1 deletion config/test/config.electricity.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ electricity:
Store: [H2]
Link: [H2 pipeline]

renewable_carriers: [solar, onwind, offwind-ac, offwind-dc]
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, offwind-float]


atlite:
Expand All @@ -53,6 +53,10 @@ renewable:
offwind-dc:
cutout: be-03-2013-era5
max_depth: false
offwind-float:
cutout: be-03-2013-era5
max_depth: false
min_depth: false
solar:
cutout: be-03-2013-era5

Expand Down
6 changes: 5 additions & 1 deletion config/test/config.myopic.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ electricity:
Store: [H2]
Link: [H2 pipeline]

renewable_carriers: [solar, onwind, offwind-ac, offwind-dc]
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, offwind-float]

atlite:
default_cutout: be-03-2013-era5
Expand All @@ -62,6 +62,10 @@ renewable:
offwind-dc:
cutout: be-03-2013-era5
max_depth: false
offwind-float:
cutout: be-03-2013-era5
max_depth: false
min_depth: false
solar:
cutout: be-03-2013-era5

Expand Down
6 changes: 5 additions & 1 deletion config/test/config.overnight.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ electricity:
Store: [H2]
Link: [H2 pipeline]

renewable_carriers: [solar, onwind, offwind-ac, offwind-dc]
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, offwind-float]

atlite:
default_cutout: be-03-2013-era5
Expand All @@ -56,6 +56,10 @@ renewable:
offwind-dc:
cutout: be-03-2013-era5
max_depth: false
offwind-float:
cutout: be-03-2013-era5
max_depth: false
min_depth: false
solar:
cutout: be-03-2013-era5

Expand Down
6 changes: 5 additions & 1 deletion config/test/config.perfect.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ electricity:
Store: [H2]
Link: [H2 pipeline]

renewable_carriers: [solar, onwind, offwind-ac, offwind-dc]
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, offwind-float]

sector:
min_part_load_fischer_tropsch: 0
Expand All @@ -63,6 +63,10 @@ renewable:
offwind-dc:
cutout: be-03-2013-era5
max_depth: false
offwind-float:
cutout: be-03-2013-era5
max_depth: false
min_depth: false
solar:
cutout: be-03-2013-era5

Expand Down
4 changes: 2 additions & 2 deletions doc/configtables/electricity.csv
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,14 @@ everywhere_powerplants,--,"Any subset of {nuclear, oil, OCGT, CCGT, coal, lignit
,,,
conventional_carriers,--,"Any subset of {nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass}","List of conventional power plants to include in the model from ``resources/powerplants.csv``. If an included carrier is also listed in ``extendable_carriers``, the capacity is taken as a lower bound."
,,,
renewable_carriers,--,"Any subset of {solar, onwind, offwind-ac, offwind-dc, hydro}",List of renewable generators to include in the model.
renewable_carriers,--,"Any subset of {solar, onwind, offwind-ac, offwind-dc, offwind-float, hydro}",List of renewable generators to include in the model.
estimate_renewable_capacities,,,
-- enable,,bool,Activate routine to estimate renewable capacities
-- from_opsd,--,bool,Add renewable capacities from `OPSD database <https://data.open-power-system-data.org/renewable_power_plants/2020-08-25>`_. The value is depreciated but still can be used.
-- year,--,bool,Renewable capacities are based on existing capacities reported by IRENA (IRENASTAT) for the specified year
-- expansion_limit,--,float or false,"Artificially limit maximum IRENA capacities to a factor. For example, an ``expansion_limit: 1.1`` means 110% of capacities . If false are chosen, the estimated renewable potentials determine by the workflow are used."
-- technology_mapping,,,Mapping between PyPSA-Eur and powerplantmatching technology names
-- -- Offshore,--,"Any subset of {offwind-ac, offwind-dc}","List of PyPSA-Eur carriers that is considered as (IRENA, OPSD) onshore technology."
-- -- Offshore,--,"Any subset of {offwind-ac, offwind-dc, offwind-float}","List of PyPSA-Eur carriers that is considered as (IRENA, OPSD) onshore technology."
-- -- Offshore,--,{onwind},"List of PyPSA-Eur carriers that is considered as (IRENA, OPSD) offshore technology."
-- -- PV,--,{solar},"List of PyPSA-Eur carriers that is considered as (IRENA, OPSD) PV technology."
autarky,,,
Expand Down
22 changes: 19 additions & 3 deletions doc/configuration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Top-level configuration
.. _run_cf:

``run``
=======
=============

It is common conduct to analyse energy system optimisation models for **multiple scenarios** for a variety of reasons,
e.g. assessing their sensitivity towards changing the temporal and/or geographical resolution or investigating how
Expand Down Expand Up @@ -265,17 +265,33 @@ Define and specify the ``atlite.Cutout`` used for calculating renewable potentia
.. literalinclude:: ../config/config.default.yaml
:language: yaml
:start-at: offwind-dc:
:end-before: solar:
:end-before: offwind-float:

.. csv-table::
:header-rows: 1
:widths: 22,7,22,33
:file: configtables/offwind-dc.csv

.. note::
both ``offwind-ac`` and ``offwind-dc`` have the same assumption on
Both ``offwind-ac`` and ``offwind-dc`` have the same assumption on
``capacity_per_sqkm`` and ``correction_factor``.

``offwind-float``
---------------

.. literalinclude:: ../config/config.default.yaml
:language: yaml
:start-at: offwind-float:
:end-before: solar:

.. csv-table::
:header-rows: 1
:widths: 22,7,22,33
:file: configtables/offwind-float.csv

.. note::
``offwind-ac``, ``offwind-dc`` , ``offwind-float`` have the same assumption on
``capacity_per_sqkm`` and ``correction_factor``.
``solar``
---------------

Expand Down
2 changes: 2 additions & 0 deletions doc/release_notes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ Release Notes

Upcoming Release
================
* Add floating wind technology for water depths below 60m

* Group existing capacities to the earlier grouping_year for consistency with optimized capacities.

* Update data bundle:
Expand Down
4 changes: 2 additions & 2 deletions doc/wildcards.rst
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ The ``{technology}`` wildcard

The ``{technology}`` wildcard specifies for which renewable energy technology to produce availability time
series and potentials using the rule :mod:`build_renewable_profiles`.
It can take the values ``onwind``, ``offwind-ac``, ``offwind-dc``, and ``solar`` but **not** ``hydro``
(since hydroelectric plant profiles are created by a different rule).
It can take the values ``onwind``, ``offwind-ac``, ``offwind-dc``, ``offwind-float``, and ``solar`` but **not** ``hydro``
(since hydroelectric plant profiles are created by a different rule)``

.. _simpl:

Expand Down
5 changes: 4 additions & 1 deletion rules/build_electricity.smk
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,10 @@ rule build_renewable_profiles:
gebco=ancient(
lambda w: (
"data/bundle/gebco/GEBCO_2014_2D.nc"
if config_provider("renewable", w.technology)(w).get("max_depth")
if (
config_provider("renewable", w.technology)(w).get("max_depth")
or config_provider("renewable", w.technology)(w).get("min_depth")
)
else []
)
),
Expand Down
2 changes: 1 addition & 1 deletion rules/build_sector.smk
Original file line number Diff line number Diff line change
Expand Up @@ -862,7 +862,7 @@ rule build_existing_heating_distribution:
def input_profile_offwind(w):
return {
f"profile_{tech}": resources(f"profile_{tech}.nc")
for tech in ["offwind-ac", "offwind-dc"]
for tech in ["offwind-ac", "offwind-dc", "offwind-float"]
if (tech in config_provider("electricity", "renewable_carriers")(w))
}

Expand Down
8 changes: 7 additions & 1 deletion scripts/build_renewable_profiles.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
renewable:
{technology}:
cutout: corine: luisa: grid_codes: distance: natura: max_depth:
cutout: corine: luisa: grid_codes: distance: natura: max_depth: min_depth:
max_shore_distance: min_shore_distance: capacity_per_sqkm:
correction_factor: min_p_max_pu: clip_p_max_pu: resource:
Expand Down Expand Up @@ -284,6 +284,12 @@
func = functools.partial(np.greater, -params["max_depth"])
excluder.add_raster(snakemake.input.gebco, codes=func, crs=4326, nodata=-1000)

if params.get("min_depth"):
func = functools.partial(np.greater, -params["min_depth"])
excluder.add_raster(
snakemake.input.gebco, codes=func, crs=4326, nodata=-1000, invert=True
)

if "min_shore_distance" in params:
buffer = params["min_shore_distance"]
excluder.add_geometry(snakemake.input.country_shapes, buffer=buffer)
Expand Down
1 change: 1 addition & 0 deletions scripts/plot_summary.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ def rename_techs(label):
"offwind": "offshore wind",
"offwind-ac": "offshore wind (AC)",
"offwind-dc": "offshore wind (DC)",
"offwind-float": "offshore wind (Float)",
"onwind": "onshore wind",
"ror": "hydroelectricity",
"hydro": "hydroelectricity",
Expand Down
4 changes: 2 additions & 2 deletions scripts/solve_network.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ def check_p_min_p_max(p_nom_max):
def _add_land_use_constraint(n):
# warning: this will miss existing offwind which is not classed AC-DC and has carrier 'offwind'

for carrier in ["solar", "onwind", "offwind-ac", "offwind-dc"]:
for carrier in ["solar", "onwind", "offwind-ac", "offwind-dc", "offwind-float"]:
extendable_i = (n.generators.carrier == carrier) & n.generators.p_nom_extendable
n.generators.loc[extendable_i, "p_nom_min"] = 0

Expand Down Expand Up @@ -158,7 +158,7 @@ def _add_land_use_constraint_m(n, planning_horizons, config):
grouping_years = config["existing_capacities"]["grouping_years_power"]
current_horizon = snakemake.wildcards.planning_horizons

for carrier in ["solar", "onwind", "offwind-ac", "offwind-dc"]:
for carrier in ["solar", "onwind", "offwind-ac", "offwind-dc", "offwind-float"]:
extendable_i = (n.generators.carrier == carrier) & n.generators.p_nom_extendable
n.generators.loc[extendable_i, "p_nom_min"] = 0

Expand Down

0 comments on commit 430b95d

Please sign in to comment.