Merge pull request #245 from PyPSA/bus_units
Document units of bus carriers
This commit is contained in:
commit
5082c8761b
@ -24,7 +24,7 @@ incorporates retrofitting options to hydrogen.
|
|||||||
* New rule ``build_gas_input_locations`` compiles the LNG import capacities
|
* New rule ``build_gas_input_locations`` compiles the LNG import capacities
|
||||||
(including planned projects from gem.wiki), pipeline entry capacities and
|
(including planned projects from gem.wiki), pipeline entry capacities and
|
||||||
local production capacities for each region of the model. These are the
|
local production capacities for each region of the model. These are the
|
||||||
regions where fossil gas can eventually enter the model.
|
regions where fossil gas can eventually enter the model.
|
||||||
|
|
||||||
* New rule ``cluster_gas_network`` that clusters the gas transmission network
|
* New rule ``cluster_gas_network`` that clusters the gas transmission network
|
||||||
data to the model resolution. Cross-regional pipeline capacities are aggregated
|
data to the model resolution. Cross-regional pipeline capacities are aggregated
|
||||||
@ -47,8 +47,8 @@ incorporates retrofitting options to hydrogen.
|
|||||||
H2_retrofit_capacity_per_CH4`` units are made available as hydrogen pipeline
|
H2_retrofit_capacity_per_CH4`` units are made available as hydrogen pipeline
|
||||||
capacity in the corresponding corridor. These repurposed hydrogen pipelines
|
capacity in the corresponding corridor. These repurposed hydrogen pipelines
|
||||||
have lower costs than new hydrogen pipelines. Both new and repurposed pipelines
|
have lower costs than new hydrogen pipelines. Both new and repurposed pipelines
|
||||||
can be built simultaneously. The retrofitting option ``sector: H2_retrofit:`` also works
|
can be built simultaneously. The retrofitting option ``sector: H2_retrofit:`` also works
|
||||||
with a copperplated methane infrastructure, i.e. when ``sector: gas_network: false``.
|
with a copperplated methane infrastructure, i.e. when ``sector: gas_network: false``.
|
||||||
|
|
||||||
* New hydrogen pipelines can now be built where there are already power or gas
|
* New hydrogen pipelines can now be built where there are already power or gas
|
||||||
transmission routes. Previously, only the electricity transmission routes were
|
transmission routes. Previously, only the electricity transmission routes were
|
||||||
@ -56,6 +56,8 @@ incorporates retrofitting options to hydrogen.
|
|||||||
|
|
||||||
**New features and functionality**
|
**New features and functionality**
|
||||||
|
|
||||||
|
* Units are assigned to the buses. These only provide a better understanding. The specifications of the units are not taken into account in the optimisation, which means that no automatic conversion of units takes place.
|
||||||
|
|
||||||
* Option ``retrieve_sector_databundle`` to automatically retrieve and extract data bundle.
|
* Option ``retrieve_sector_databundle`` to automatically retrieve and extract data bundle.
|
||||||
|
|
||||||
* Add regionalised hydrogen salt cavern storage potentials from `Technical Potential of Salt Caverns for Hydrogen Storage in Europe <https://doi.org/10.20944/preprints201910.0187.v1>`_.
|
* Add regionalised hydrogen salt cavern storage potentials from `Technical Potential of Salt Caverns for Hydrogen Storage in Europe <https://doi.org/10.20944/preprints201910.0187.v1>`_.
|
||||||
@ -84,7 +86,7 @@ besides many performance improvements.
|
|||||||
|
|
||||||
This release is known to work with `PyPSA-Eur
|
This release is known to work with `PyPSA-Eur
|
||||||
<https://github.com/PyPSA/pypsa-eur>`_ Version 0.4.0, `Technology Data
|
<https://github.com/PyPSA/pypsa-eur>`_ Version 0.4.0, `Technology Data
|
||||||
<https://github.com/PyPSA/technology-data>`_ Version 0.3.0 and
|
<https://github.com/PyPSA/technology-data>`_ Version 0.3.0 and
|
||||||
`PyPSA <https://github.com/PyPSA/PyPSA>`_ Version 0.18.0.
|
`PyPSA <https://github.com/PyPSA/PyPSA>`_ Version 0.18.0.
|
||||||
|
|
||||||
Please note that the data bundle has also been updated.
|
Please note that the data bundle has also been updated.
|
||||||
@ -202,19 +204,19 @@ Please note that the data bundle has also been updated.
|
|||||||
A function ``helper.override_component_attrs`` was added that loads this data
|
A function ``helper.override_component_attrs`` was added that loads this data
|
||||||
and can pass the overridden component attributes into ``pypsa.Network()``.
|
and can pass the overridden component attributes into ``pypsa.Network()``.
|
||||||
|
|
||||||
* Add various parameters to ``config.default.yaml`` which were previously hardcoded inside the scripts
|
* Add various parameters to ``config.default.yaml`` which were previously hardcoded inside the scripts
|
||||||
(e.g. energy reference years, BEV settings, solar thermal collector models, geomap colours).
|
(e.g. energy reference years, BEV settings, solar thermal collector models, geomap colours).
|
||||||
|
|
||||||
* Removed stale industry demand rules ``build_industrial_energy_demand_per_country``
|
* Removed stale industry demand rules ``build_industrial_energy_demand_per_country``
|
||||||
and ``build_industrial_demand``. These are superseded with more regionally resolved rules.
|
and ``build_industrial_demand``. These are superseded with more regionally resolved rules.
|
||||||
|
|
||||||
* Use simpler and shorter ``gdf.sjoin()`` function to allocate industrial sites
|
* Use simpler and shorter ``gdf.sjoin()`` function to allocate industrial sites
|
||||||
from the Hotmaps database to onshore regions.
|
from the Hotmaps database to onshore regions.
|
||||||
This change also fixes a bug:
|
This change also fixes a bug:
|
||||||
The previous version allocated sites to the closest bus,
|
The previous version allocated sites to the closest bus,
|
||||||
but at country borders (where Voronoi cells are distorted by the borders),
|
but at country borders (where Voronoi cells are distorted by the borders),
|
||||||
this had resulted in e.g. a Spanish site close to the French border
|
this had resulted in e.g. a Spanish site close to the French border
|
||||||
being wrongly allocated to the French bus if the bus center was closer.
|
being wrongly allocated to the French bus if the bus center was closer.
|
||||||
|
|
||||||
* Retrofitting rule is now only triggered if endogeneously optimised.
|
* Retrofitting rule is now only triggered if endogeneously optimised.
|
||||||
|
|
||||||
@ -225,7 +227,7 @@ Please note that the data bundle has also been updated.
|
|||||||
* Improve legibility of ``config.default.yaml`` and remove unused options.
|
* Improve legibility of ``config.default.yaml`` and remove unused options.
|
||||||
|
|
||||||
* Use the country-specific time zone mappings from ``pytz`` rather than a manual mapping.
|
* Use the country-specific time zone mappings from ``pytz`` rather than a manual mapping.
|
||||||
|
|
||||||
* A function ``add_carrier_buses()`` was added to the ``prepare_network`` rule to reduce code duplication.
|
* A function ``add_carrier_buses()`` was added to the ``prepare_network`` rule to reduce code duplication.
|
||||||
|
|
||||||
* In the ``prepare_network`` rule the cost and potential adjustment was moved into an
|
* In the ``prepare_network`` rule the cost and potential adjustment was moved into an
|
||||||
|
@ -385,10 +385,13 @@ def add_carrier_buses(n, carrier, nodes=None):
|
|||||||
|
|
||||||
n.add("Carrier", carrier)
|
n.add("Carrier", carrier)
|
||||||
|
|
||||||
|
unit = "MWh_LHV" if carrier == "gas" else "MWh_th"
|
||||||
|
|
||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
nodes,
|
nodes,
|
||||||
location=location,
|
location=location,
|
||||||
carrier=carrier
|
carrier=carrier,
|
||||||
|
unit=unit
|
||||||
)
|
)
|
||||||
|
|
||||||
#capital cost could be corrected to e.g. 0.2 EUR/kWh * annuity and O&M
|
#capital cost could be corrected to e.g. 0.2 EUR/kWh * annuity and O&M
|
||||||
@ -439,6 +442,7 @@ def patch_electricity_network(n):
|
|||||||
update_wind_solar_costs(n, costs)
|
update_wind_solar_costs(n, costs)
|
||||||
n.loads["carrier"] = "electricity"
|
n.loads["carrier"] = "electricity"
|
||||||
n.buses["location"] = n.buses.index
|
n.buses["location"] = n.buses.index
|
||||||
|
n.buses["unit"] = "MWh_el"
|
||||||
# remove trailing white space of load index until new PyPSA version after v0.18.
|
# remove trailing white space of load index until new PyPSA version after v0.18.
|
||||||
n.loads.rename(lambda x: x.strip(), inplace=True)
|
n.loads.rename(lambda x: x.strip(), inplace=True)
|
||||||
n.loads_t.p_set.rename(lambda x: x.strip(), axis=1, inplace=True)
|
n.loads_t.p_set.rename(lambda x: x.strip(), axis=1, inplace=True)
|
||||||
@ -455,7 +459,8 @@ def add_co2_tracking(n, options):
|
|||||||
n.add("Bus",
|
n.add("Bus",
|
||||||
"co2 atmosphere",
|
"co2 atmosphere",
|
||||||
location="EU",
|
location="EU",
|
||||||
carrier="co2"
|
carrier="co2",
|
||||||
|
unit="t_co2"
|
||||||
)
|
)
|
||||||
|
|
||||||
# can also be negative
|
# can also be negative
|
||||||
@ -471,7 +476,8 @@ def add_co2_tracking(n, options):
|
|||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
spatial.co2.nodes,
|
spatial.co2.nodes,
|
||||||
location=spatial.co2.locations,
|
location=spatial.co2.locations,
|
||||||
carrier="co2 stored"
|
carrier="co2 stored",
|
||||||
|
unit="t_co2"
|
||||||
)
|
)
|
||||||
|
|
||||||
n.madd("Store",
|
n.madd("Store",
|
||||||
@ -703,7 +709,8 @@ def insert_electricity_distribution_grid(n, costs):
|
|||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
nodes + " low voltage",
|
nodes + " low voltage",
|
||||||
location=nodes,
|
location=nodes,
|
||||||
carrier="low voltage"
|
carrier="low voltage",
|
||||||
|
unit="MWh_el"
|
||||||
)
|
)
|
||||||
|
|
||||||
n.madd("Link",
|
n.madd("Link",
|
||||||
@ -770,7 +777,8 @@ def insert_electricity_distribution_grid(n, costs):
|
|||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
nodes + " home battery",
|
nodes + " home battery",
|
||||||
location=nodes,
|
location=nodes,
|
||||||
carrier="home battery"
|
carrier="home battery",
|
||||||
|
unit="MWh_el"
|
||||||
)
|
)
|
||||||
|
|
||||||
n.madd("Store",
|
n.madd("Store",
|
||||||
@ -845,7 +853,8 @@ def add_storage_and_grids(n, costs):
|
|||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
nodes + " H2",
|
nodes + " H2",
|
||||||
location=nodes,
|
location=nodes,
|
||||||
carrier="H2"
|
carrier="H2",
|
||||||
|
unit="MWh_LHV"
|
||||||
)
|
)
|
||||||
|
|
||||||
n.madd("Link",
|
n.madd("Link",
|
||||||
@ -1051,7 +1060,8 @@ def add_storage_and_grids(n, costs):
|
|||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
nodes + " battery",
|
nodes + " battery",
|
||||||
location=nodes,
|
location=nodes,
|
||||||
carrier="battery"
|
carrier="battery",
|
||||||
|
unit="MWh_el"
|
||||||
)
|
)
|
||||||
|
|
||||||
n.madd("Store",
|
n.madd("Store",
|
||||||
@ -1199,7 +1209,8 @@ def add_land_transport(n, costs):
|
|||||||
nodes,
|
nodes,
|
||||||
location=nodes,
|
location=nodes,
|
||||||
suffix=" EV battery",
|
suffix=" EV battery",
|
||||||
carrier="Li ion"
|
carrier="Li ion",
|
||||||
|
unit="MWh_el"
|
||||||
)
|
)
|
||||||
|
|
||||||
p_set = electric_share * (transport[nodes] + cycling_shift(transport[nodes], 1) + cycling_shift(transport[nodes], 2)) / 3
|
p_set = electric_share * (transport[nodes] + cycling_shift(transport[nodes], 1) + cycling_shift(transport[nodes], 2)) / 3
|
||||||
@ -1273,7 +1284,8 @@ def add_land_transport(n, costs):
|
|||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
spatial.oil.nodes,
|
spatial.oil.nodes,
|
||||||
location=spatial.oil.locations,
|
location=spatial.oil.locations,
|
||||||
carrier="oil"
|
carrier="oil",
|
||||||
|
unit="MWh_LHV"
|
||||||
)
|
)
|
||||||
|
|
||||||
ice_efficiency = options['transport_internal_combustion_efficiency']
|
ice_efficiency = options['transport_internal_combustion_efficiency']
|
||||||
@ -1381,7 +1393,8 @@ def add_heat(n, costs):
|
|||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
nodes[name] + f" {name} heat",
|
nodes[name] + f" {name} heat",
|
||||||
location=nodes[name],
|
location=nodes[name],
|
||||||
carrier=name + " heat"
|
carrier=name + " heat",
|
||||||
|
unit="MWh_th"
|
||||||
)
|
)
|
||||||
|
|
||||||
## Add heat load
|
## Add heat load
|
||||||
@ -1438,7 +1451,8 @@ def add_heat(n, costs):
|
|||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
nodes[name] + f" {name} water tanks",
|
nodes[name] + f" {name} water tanks",
|
||||||
location=nodes[name],
|
location=nodes[name],
|
||||||
carrier=name + " water tanks"
|
carrier=name + " water tanks",
|
||||||
|
unit="MWh_th"
|
||||||
)
|
)
|
||||||
|
|
||||||
n.madd("Link",
|
n.madd("Link",
|
||||||
@ -1743,13 +1757,15 @@ def add_biomass(n, costs):
|
|||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
spatial.gas.biogas,
|
spatial.gas.biogas,
|
||||||
location=spatial.gas.locations,
|
location=spatial.gas.locations,
|
||||||
carrier="biogas"
|
carrier="biogas",
|
||||||
|
unit="MWh_LHV"
|
||||||
)
|
)
|
||||||
|
|
||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
spatial.biomass.nodes,
|
spatial.biomass.nodes,
|
||||||
location=spatial.biomass.locations,
|
location=spatial.biomass.locations,
|
||||||
carrier="solid biomass"
|
carrier="solid biomass",
|
||||||
|
unit="MWh_LHV"
|
||||||
)
|
)
|
||||||
|
|
||||||
n.madd("Store",
|
n.madd("Store",
|
||||||
@ -1860,7 +1876,8 @@ def add_industry(n, costs):
|
|||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
spatial.biomass.industry,
|
spatial.biomass.industry,
|
||||||
location=spatial.biomass.locations,
|
location=spatial.biomass.locations,
|
||||||
carrier="solid biomass for industry"
|
carrier="solid biomass for industry",
|
||||||
|
unit="MWh_LHV"
|
||||||
)
|
)
|
||||||
|
|
||||||
if options["biomass_transport"]:
|
if options["biomass_transport"]:
|
||||||
@ -1902,7 +1919,8 @@ def add_industry(n, costs):
|
|||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
spatial.gas.industry,
|
spatial.gas.industry,
|
||||||
location=spatial.gas.locations,
|
location=spatial.gas.locations,
|
||||||
carrier="gas for industry")
|
carrier="gas for industry",
|
||||||
|
unit="MWh_LHV")
|
||||||
|
|
||||||
gas_demand = industrial_demand.loc[nodes, "methane"] / 8760.
|
gas_demand = industrial_demand.loc[nodes, "methane"] / 8760.
|
||||||
|
|
||||||
@ -1958,7 +1976,8 @@ def add_industry(n, costs):
|
|||||||
nodes,
|
nodes,
|
||||||
suffix=" H2 liquid",
|
suffix=" H2 liquid",
|
||||||
carrier="H2 liquid",
|
carrier="H2 liquid",
|
||||||
location=nodes
|
location=nodes,
|
||||||
|
unit="MWh_LHV"
|
||||||
)
|
)
|
||||||
|
|
||||||
n.madd("Link",
|
n.madd("Link",
|
||||||
@ -2016,7 +2035,8 @@ def add_industry(n, costs):
|
|||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
spatial.oil.nodes,
|
spatial.oil.nodes,
|
||||||
location=spatial.oil.locations,
|
location=spatial.oil.locations,
|
||||||
carrier="oil"
|
carrier="oil",
|
||||||
|
unit="MWh_LHV"
|
||||||
)
|
)
|
||||||
|
|
||||||
if "oil" not in n.stores.carrier.unique():
|
if "oil" not in n.stores.carrier.unique():
|
||||||
@ -2130,7 +2150,8 @@ def add_industry(n, costs):
|
|||||||
n.add("Bus",
|
n.add("Bus",
|
||||||
"process emissions",
|
"process emissions",
|
||||||
location="EU",
|
location="EU",
|
||||||
carrier="process emissions"
|
carrier="process emissions",
|
||||||
|
unit="t_co2"
|
||||||
)
|
)
|
||||||
|
|
||||||
# this should be process emissions fossil+feedstock
|
# this should be process emissions fossil+feedstock
|
||||||
@ -2314,7 +2335,7 @@ if __name__ == "__main__":
|
|||||||
simpl='',
|
simpl='',
|
||||||
opts="",
|
opts="",
|
||||||
clusters="37",
|
clusters="37",
|
||||||
lv=1.0,
|
lv=1.5,
|
||||||
sector_opts='Co2L0-168H-T-H-B-I-solar3-dist1',
|
sector_opts='Co2L0-168H-T-H-B-I-solar3-dist1',
|
||||||
planning_horizons="2020",
|
planning_horizons="2020",
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user