Merge pull request #773 from p-glaum/implement-floating
Add floating wind technology
This commit is contained in:
commit
430b95dcb3
@ -107,7 +107,7 @@ electricity:
|
|||||||
H2: 168
|
H2: 168
|
||||||
|
|
||||||
extendable_carriers:
|
extendable_carriers:
|
||||||
Generator: [solar, onwind, offwind-ac, offwind-dc, OCGT]
|
Generator: [solar, onwind, offwind-ac, offwind-dc, offwind-float, OCGT]
|
||||||
StorageUnit: [] # battery, H2
|
StorageUnit: [] # battery, H2
|
||||||
Store: [battery, H2]
|
Store: [battery, H2]
|
||||||
Link: [] # H2 pipeline
|
Link: [] # H2 pipeline
|
||||||
@ -117,7 +117,7 @@ electricity:
|
|||||||
everywhere_powerplants: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass]
|
everywhere_powerplants: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass]
|
||||||
|
|
||||||
conventional_carriers: [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:
|
estimate_renewable_capacities:
|
||||||
enable: true
|
enable: true
|
||||||
@ -125,7 +125,7 @@ electricity:
|
|||||||
year: 2020
|
year: 2020
|
||||||
expansion_limit: false
|
expansion_limit: false
|
||||||
technology_mapping:
|
technology_mapping:
|
||||||
Offshore: [offwind-ac, offwind-dc]
|
Offshore: [offwind-ac, offwind-dc, offwind-float]
|
||||||
Onshore: [onwind]
|
Onshore: [onwind]
|
||||||
PV: [solar]
|
PV: [solar]
|
||||||
|
|
||||||
@ -193,7 +193,7 @@ renewable:
|
|||||||
luisa: false # [0, 5230]
|
luisa: false # [0, 5230]
|
||||||
natura: true
|
natura: true
|
||||||
ship_threshold: 400
|
ship_threshold: 400
|
||||||
max_depth: 50
|
max_depth: 60
|
||||||
max_shore_distance: 30000
|
max_shore_distance: 30000
|
||||||
excluder_resolution: 200
|
excluder_resolution: 200
|
||||||
clip_p_max_pu: 1.e-2
|
clip_p_max_pu: 1.e-2
|
||||||
@ -209,10 +209,28 @@ renewable:
|
|||||||
luisa: false # [0, 5230]
|
luisa: false # [0, 5230]
|
||||||
natura: true
|
natura: true
|
||||||
ship_threshold: 400
|
ship_threshold: 400
|
||||||
max_depth: 50
|
max_depth: 60
|
||||||
min_shore_distance: 30000
|
min_shore_distance: 30000
|
||||||
excluder_resolution: 200
|
excluder_resolution: 200
|
||||||
clip_p_max_pu: 1.e-2
|
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:
|
solar:
|
||||||
cutout: europe-2013-sarah
|
cutout: europe-2013-sarah
|
||||||
resource:
|
resource:
|
||||||
@ -306,6 +324,7 @@ pypsa_eur:
|
|||||||
- onwind
|
- onwind
|
||||||
- offwind-ac
|
- offwind-ac
|
||||||
- offwind-dc
|
- offwind-dc
|
||||||
|
- offwind-float
|
||||||
- solar
|
- solar
|
||||||
- ror
|
- ror
|
||||||
- nuclear
|
- nuclear
|
||||||
@ -851,6 +870,7 @@ plotting:
|
|||||||
CCGT: "Combined-Cycle Gas"
|
CCGT: "Combined-Cycle Gas"
|
||||||
offwind-ac: "Offshore Wind (AC)"
|
offwind-ac: "Offshore Wind (AC)"
|
||||||
offwind-dc: "Offshore Wind (DC)"
|
offwind-dc: "Offshore Wind (DC)"
|
||||||
|
offwind-float: "Offshore Wind (Floating)"
|
||||||
onwind: "Onshore Wind"
|
onwind: "Onshore Wind"
|
||||||
solar: "Solar"
|
solar: "Solar"
|
||||||
PHS: "Pumped Hydro Storage"
|
PHS: "Pumped Hydro Storage"
|
||||||
@ -875,6 +895,9 @@ plotting:
|
|||||||
offwind-dc: "#74c6f2"
|
offwind-dc: "#74c6f2"
|
||||||
offshore wind (DC): "#74c6f2"
|
offshore wind (DC): "#74c6f2"
|
||||||
offshore wind dc: "#74c6f2"
|
offshore wind dc: "#74c6f2"
|
||||||
|
offwind-float: "#b5e2fa"
|
||||||
|
offshore wind (Float): "#b5e2fa"
|
||||||
|
offshore wind float: "#b5e2fa"
|
||||||
# water
|
# water
|
||||||
hydro: '#298c81'
|
hydro: '#298c81'
|
||||||
hydro reservoir: '#298c81'
|
hydro reservoir: '#298c81'
|
||||||
|
@ -32,7 +32,7 @@ electricity:
|
|||||||
Store: [H2]
|
Store: [H2]
|
||||||
Link: [H2 pipeline]
|
Link: [H2 pipeline]
|
||||||
|
|
||||||
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc]
|
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, offwind-float]
|
||||||
|
|
||||||
|
|
||||||
atlite:
|
atlite:
|
||||||
@ -53,6 +53,10 @@ renewable:
|
|||||||
offwind-dc:
|
offwind-dc:
|
||||||
cutout: be-03-2013-era5
|
cutout: be-03-2013-era5
|
||||||
max_depth: false
|
max_depth: false
|
||||||
|
offwind-float:
|
||||||
|
cutout: be-03-2013-era5
|
||||||
|
max_depth: false
|
||||||
|
min_depth: false
|
||||||
solar:
|
solar:
|
||||||
cutout: be-03-2013-era5
|
cutout: be-03-2013-era5
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ electricity:
|
|||||||
Store: [H2]
|
Store: [H2]
|
||||||
Link: [H2 pipeline]
|
Link: [H2 pipeline]
|
||||||
|
|
||||||
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc]
|
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, offwind-float]
|
||||||
|
|
||||||
atlite:
|
atlite:
|
||||||
default_cutout: be-03-2013-era5
|
default_cutout: be-03-2013-era5
|
||||||
@ -62,6 +62,10 @@ renewable:
|
|||||||
offwind-dc:
|
offwind-dc:
|
||||||
cutout: be-03-2013-era5
|
cutout: be-03-2013-era5
|
||||||
max_depth: false
|
max_depth: false
|
||||||
|
offwind-float:
|
||||||
|
cutout: be-03-2013-era5
|
||||||
|
max_depth: false
|
||||||
|
min_depth: false
|
||||||
solar:
|
solar:
|
||||||
cutout: be-03-2013-era5
|
cutout: be-03-2013-era5
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ electricity:
|
|||||||
Store: [H2]
|
Store: [H2]
|
||||||
Link: [H2 pipeline]
|
Link: [H2 pipeline]
|
||||||
|
|
||||||
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc]
|
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, offwind-float]
|
||||||
|
|
||||||
atlite:
|
atlite:
|
||||||
default_cutout: be-03-2013-era5
|
default_cutout: be-03-2013-era5
|
||||||
@ -56,6 +56,10 @@ renewable:
|
|||||||
offwind-dc:
|
offwind-dc:
|
||||||
cutout: be-03-2013-era5
|
cutout: be-03-2013-era5
|
||||||
max_depth: false
|
max_depth: false
|
||||||
|
offwind-float:
|
||||||
|
cutout: be-03-2013-era5
|
||||||
|
max_depth: false
|
||||||
|
min_depth: false
|
||||||
solar:
|
solar:
|
||||||
cutout: be-03-2013-era5
|
cutout: be-03-2013-era5
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ electricity:
|
|||||||
Store: [H2]
|
Store: [H2]
|
||||||
Link: [H2 pipeline]
|
Link: [H2 pipeline]
|
||||||
|
|
||||||
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc]
|
renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, offwind-float]
|
||||||
|
|
||||||
sector:
|
sector:
|
||||||
min_part_load_fischer_tropsch: 0
|
min_part_load_fischer_tropsch: 0
|
||||||
@ -63,6 +63,10 @@ renewable:
|
|||||||
offwind-dc:
|
offwind-dc:
|
||||||
cutout: be-03-2013-era5
|
cutout: be-03-2013-era5
|
||||||
max_depth: false
|
max_depth: false
|
||||||
|
offwind-float:
|
||||||
|
cutout: be-03-2013-era5
|
||||||
|
max_depth: false
|
||||||
|
min_depth: false
|
||||||
solar:
|
solar:
|
||||||
cutout: be-03-2013-era5
|
cutout: be-03-2013-era5
|
||||||
|
|
||||||
|
@ -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."
|
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,,,
|
estimate_renewable_capacities,,,
|
||||||
-- enable,,bool,Activate routine to 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.
|
-- 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
|
-- 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."
|
-- 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
|
-- 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."
|
-- -- 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."
|
-- -- PV,--,{solar},"List of PyPSA-Eur carriers that is considered as (IRENA, OPSD) PV technology."
|
||||||
autarky,,,
|
autarky,,,
|
||||||
|
|
@ -31,7 +31,7 @@ Top-level configuration
|
|||||||
.. _run_cf:
|
.. _run_cf:
|
||||||
|
|
||||||
``run``
|
``run``
|
||||||
=======
|
=============
|
||||||
|
|
||||||
It is common conduct to analyse energy system optimisation models for **multiple scenarios** for a variety of reasons,
|
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
|
e.g. assessing their sensitivity towards changing the temporal and/or geographical resolution or investigating how
|
||||||
@ -265,7 +265,7 @@ Define and specify the ``atlite.Cutout`` used for calculating renewable potentia
|
|||||||
.. literalinclude:: ../config/config.default.yaml
|
.. literalinclude:: ../config/config.default.yaml
|
||||||
:language: yaml
|
:language: yaml
|
||||||
:start-at: offwind-dc:
|
:start-at: offwind-dc:
|
||||||
:end-before: solar:
|
:end-before: offwind-float:
|
||||||
|
|
||||||
.. csv-table::
|
.. csv-table::
|
||||||
:header-rows: 1
|
:header-rows: 1
|
||||||
@ -273,9 +273,25 @@ Define and specify the ``atlite.Cutout`` used for calculating renewable potentia
|
|||||||
:file: configtables/offwind-dc.csv
|
:file: configtables/offwind-dc.csv
|
||||||
|
|
||||||
.. note::
|
.. 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``.
|
``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``
|
``solar``
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
@ -9,6 +9,8 @@ Release Notes
|
|||||||
|
|
||||||
Upcoming Release
|
Upcoming Release
|
||||||
================
|
================
|
||||||
|
* Add floating wind technology for water depths below 60m
|
||||||
|
|
||||||
* Group existing capacities to the earlier grouping_year for consistency with optimized capacities.
|
* Group existing capacities to the earlier grouping_year for consistency with optimized capacities.
|
||||||
|
|
||||||
* Update data bundle:
|
* Update data bundle:
|
||||||
|
@ -35,8 +35,8 @@ The ``{technology}`` wildcard
|
|||||||
|
|
||||||
The ``{technology}`` wildcard specifies for which renewable energy technology to produce availability time
|
The ``{technology}`` wildcard specifies for which renewable energy technology to produce availability time
|
||||||
series and potentials using the rule :mod:`build_renewable_profiles`.
|
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``
|
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).
|
(since hydroelectric plant profiles are created by a different rule)``
|
||||||
|
|
||||||
.. _simpl:
|
.. _simpl:
|
||||||
|
|
||||||
|
@ -248,7 +248,10 @@ rule build_renewable_profiles:
|
|||||||
gebco=ancient(
|
gebco=ancient(
|
||||||
lambda w: (
|
lambda w: (
|
||||||
"data/bundle/gebco/GEBCO_2014_2D.nc"
|
"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 []
|
else []
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
@ -862,7 +862,7 @@ rule build_existing_heating_distribution:
|
|||||||
def input_profile_offwind(w):
|
def input_profile_offwind(w):
|
||||||
return {
|
return {
|
||||||
f"profile_{tech}": resources(f"profile_{tech}.nc")
|
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))
|
if (tech in config_provider("electricity", "renewable_carriers")(w))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ Relevant settings
|
|||||||
|
|
||||||
renewable:
|
renewable:
|
||||||
{technology}:
|
{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:
|
max_shore_distance: min_shore_distance: capacity_per_sqkm:
|
||||||
correction_factor: min_p_max_pu: clip_p_max_pu: resource:
|
correction_factor: min_p_max_pu: clip_p_max_pu: resource:
|
||||||
|
|
||||||
@ -284,6 +284,12 @@ if __name__ == "__main__":
|
|||||||
func = functools.partial(np.greater, -params["max_depth"])
|
func = functools.partial(np.greater, -params["max_depth"])
|
||||||
excluder.add_raster(snakemake.input.gebco, codes=func, crs=4326, nodata=-1000)
|
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:
|
if "min_shore_distance" in params:
|
||||||
buffer = params["min_shore_distance"]
|
buffer = params["min_shore_distance"]
|
||||||
excluder.add_geometry(snakemake.input.country_shapes, buffer=buffer)
|
excluder.add_geometry(snakemake.input.country_shapes, buffer=buffer)
|
||||||
|
@ -60,6 +60,7 @@ def rename_techs(label):
|
|||||||
"offwind": "offshore wind",
|
"offwind": "offshore wind",
|
||||||
"offwind-ac": "offshore wind (AC)",
|
"offwind-ac": "offshore wind (AC)",
|
||||||
"offwind-dc": "offshore wind (DC)",
|
"offwind-dc": "offshore wind (DC)",
|
||||||
|
"offwind-float": "offshore wind (Float)",
|
||||||
"onwind": "onshore wind",
|
"onwind": "onshore wind",
|
||||||
"ror": "hydroelectricity",
|
"ror": "hydroelectricity",
|
||||||
"hydro": "hydroelectricity",
|
"hydro": "hydroelectricity",
|
||||||
|
@ -123,7 +123,7 @@ def add_land_use_constraint_perfect(n):
|
|||||||
def _add_land_use_constraint(n):
|
def _add_land_use_constraint(n):
|
||||||
# warning: this will miss existing offwind which is not classed AC-DC and has carrier 'offwind'
|
# 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
|
extendable_i = (n.generators.carrier == carrier) & n.generators.p_nom_extendable
|
||||||
n.generators.loc[extendable_i, "p_nom_min"] = 0
|
n.generators.loc[extendable_i, "p_nom_min"] = 0
|
||||||
|
|
||||||
@ -158,7 +158,7 @@ def _add_land_use_constraint_m(n, planning_horizons, config):
|
|||||||
grouping_years = config["existing_capacities"]["grouping_years_power"]
|
grouping_years = config["existing_capacities"]["grouping_years_power"]
|
||||||
current_horizon = snakemake.wildcards.planning_horizons
|
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
|
extendable_i = (n.generators.carrier == carrier) & n.generators.p_nom_extendable
|
||||||
n.generators.loc[extendable_i, "p_nom_min"] = 0
|
n.generators.loc[extendable_i, "p_nom_min"] = 0
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user