Skip to content
Open
Show file tree
Hide file tree
Changes from 17 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
7 changes: 7 additions & 0 deletions config/config.default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -873,7 +873,14 @@ sector:
co2_spatial: true
co2_network: true
co2_network_cost_factor: 1
co2_network_liquefaction: false
cc_fraction: 0.9
cc_capital_cost_factor:
gas: 2.0
biomass: 1.8
coal: 1.8
waste: 1.7
cement: 1.0
hydrogen_underground_storage: true
hydrogen_underground_storage_locations:
- onshore
Expand Down
3 changes: 3 additions & 0 deletions config/plotting.default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -693,6 +693,9 @@ plotting:
DAC: '#ff5270'
co2 stored: '#f2385a'
co2 sequestered: '#f2682f'
co2 dense: '#65334d'
co2 expansion: '#c6ebbe'
co2 compression: '#a9dbb8'
co2: '#f29dae'
co2 vent: '#ffd4dc'
CO2 pipeline: '#f5627f'
Expand Down
24 changes: 24 additions & 0 deletions config/schema.default.json
Original file line number Diff line number Diff line change
Expand Up @@ -4713,11 +4713,23 @@
"description": "The cost factor for the capital cost of the carbon dioxide transmission network.",
"type": "number"
},
"co2_network_liquefaction": {
"default": false,
"description": "Add option for including compressor stations with investment costs and electricity demand for liquefaction step for carbon dioxide before transport.",
"type": "boolean"
},
"cc_fraction": {
"default": 0.9,
"description": "The default fraction of CO2 captured with post-combustion capture.",
"type": "number"
},
"cc_capital_cost_factor": {
"additionalProperties": {
"type": "number"
},
"description": "Size of the carbon capture unit depending on the amount of carbon dioxide in the flue gas. The more CO2, the smaller the capture unit and thus the lower the capital cost factor. The default values are based on the DEA technology-data report.",
"type": "object"
},
"hydrogen_underground_storage": {
"default": true,
"description": "Add options for storing hydrogen underground. Storage potential depends regionally.",
Expand Down Expand Up @@ -11162,11 +11174,23 @@
"description": "The cost factor for the capital cost of the carbon dioxide transmission network.",
"type": "number"
},
"co2_network_liquefaction": {
"default": false,
"description": "Add option for including compressor stations with investment costs and electricity demand for liquefaction step for carbon dioxide before transport.",
"type": "boolean"
},
"cc_fraction": {
"default": 0.9,
"description": "The default fraction of CO2 captured with post-combustion capture.",
"type": "number"
},
"cc_capital_cost_factor": {
"additionalProperties": {
"type": "number"
},
"description": "Size of the carbon capture unit depending on the amount of carbon dioxide in the flue gas. The more CO2, the smaller the capture unit and thus the lower the capital cost factor. The default values are based on the DEA technology-data report.",
"type": "object"
},
"hydrogen_underground_storage": {
"default": true,
"description": "Add options for storing hydrogen underground. Storage potential depends regionally.",
Expand Down
2 changes: 1 addition & 1 deletion data/versions.csv
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ copernicus_land_cover,v3.0.1,archive,latest supported,2026-01-20,"The primary is
copernicus_land_cover,v2.0.2,archive,deprecated supported,2026-01-13,,https://data.pypsa.org/workflows/eur/copernicus_land_cover/v2.0.2/PROBAV_LC100_global_v3.0.1_2015-base_Discrete-Classification-map_EPSG-4326.tif
corine,v18_5,archive,latest supported,2026-01-13,,https://data.pypsa.org/workflows/eur/corine/v18_5/corine.zip
corine,unknown,primary,latest supported,2025-12-02,Need to register with CLMS API and create an access token. The download URL is dynamic,
costs,v0.14.0,primary,latest supported,2026-02-13,Part of the `technologydata` repository and versioned on GitHub.,https://raw.githubusercontent.com/PyPSA/technology-data/refs/tags/v0.14.0/outputs
costs,co2_management,primary,latest supported,2026-05-12,Part of the `technologydata` repository and versioned on GitHub.,https://github.com/PyPSA/technology-data/tree/co2_management/outputs
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be adjusted before merge following a technology-data release.

costs,v0.14.0,archive,latest supported,2026-02-13,Part of the `technologydata` repository and versioned on GitHub.,https://data.pypsa.org/workflows/eur/costs/v0.14.0
costs,v0.13.4,primary,supported,2025-12-02,Part of the `technologydata` repository and versioned on GitHub.,https://raw.githubusercontent.com/PyPSA/technology-data/refs/tags/v0.13.4/outputs
costs,v0.13.4,archive,supported,2026-01-21,Part of the `technologydata` repository and versioned on GitHub.,https://data.pypsa.org/workflows/eur/costs/v0.13.4
Expand Down
5 changes: 4 additions & 1 deletion doc/release_notes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@ Release Notes

.. Upcoming Release
.. =================

* Adding option to include the compression step in carbon dioxide transport before transporting in dense phase and including electricity demand for post combustion carbon capture. Adjusting the capital costs for post combustion capture that differs depending on the carbon dioxide percentage in the flue gas.

* Fix: Re-introduce capital costs for non-bicharging discharge links in ``add_electricity.py``, e.g. fuel cells.

* The lockfile update workflow now excludes packages published within the last 7 days to reduce the risk of pulling in broken or yanked releases (https://github.com/PyPSA/pypsa-eur/pull/2130).

* The industry reference year and the ammonia production data have been updated to 2023 (https://github.com/PyPSA/pypsa-eur/pull/2103)
* The industry reference year and the ammonia production data have been updated to 2023 (https://github.com/PyPSA/pypsa-eur/pull/2103)

* refactor: Use scripts path provider consistently (https://github.com/PyPSA/pypsa-eur/pull/2093).

Expand Down
15 changes: 14 additions & 1 deletion scripts/lib/validation/config/sector.py
Original file line number Diff line number Diff line change
Expand Up @@ -748,11 +748,24 @@ class SectorConfig(BaseModel):
1,
description="The cost factor for the capital cost of the carbon dioxide transmission network.",
)
co2_network_liquefaction: bool = Field(
False,
description="Add option for including compressor stations with investment costs and electricity demand for liquefaction step for carbon dioxide before transport.",
)
cc_fraction: float = Field(
0.9,
description="The default fraction of CO2 captured with post-combustion capture.",
)

cc_capital_cost_factor: dict[str, float] = Field(
default_factory=lambda: {
"gas": 2.0,
"biomass": 1.8,
"coal": 1.8,
"waste": 1.7,
"cement": 1.0,
Comment thread
toniseibold marked this conversation as resolved.
},
description="Size of the carbon capture unit depending on the amount of carbon dioxide in the flue gas. The more CO2, the smaller the capture unit and thus the lower the capital cost factor. The default values are based on the DEA technology-data report.",
Comment thread
toniseibold marked this conversation as resolved.
Outdated
)
hydrogen_underground_storage: bool = Field(
True,
description="Add options for storing hydrogen underground. Storage potential depends regionally.",
Expand Down
31 changes: 25 additions & 6 deletions scripts/plot_balance_map.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,32 @@
n.buses["x"] = n.buses.location.map(n.buses.x)
n.buses["y"] = n.buses.location.map(n.buses.y)

# bus_size according to energy balance of bus carrier
eb = n.statistics.energy_balance(bus_carrier=carrier, groupby=["bus", "carrier"])
if carrier == "co2 stored" and "co2 dense" in n.buses.carrier.unique():
co2_carriers = ["co2 stored", "co2 dense"]
# Aggregate energy balance of "co2 stored" and "co2 dense" to get the total CO2 balance for each bus
eb = n.statistics.energy_balance(
bus_carrier=co2_carriers, groupby=["bus", "carrier"]
)
eb = eb.rename(
index=lambda value: value.replace("co2 dense", carrier), level="bus"
)
eb = eb.groupby(level=["component", "bus", "carrier"]).sum()

# remove energy balance of transmission carriers which relate to losses
transmission_carriers = get_transmission_carriers(
n, bus_carrier=co2_carriers
).rename({"name": "carrier"})
else:
# bus_size according to energy balance of bus carrier
eb = n.statistics.energy_balance(
bus_carrier=carrier, groupby=["bus", "carrier"]
)

# remove energy balance of transmission carriers which relate to losses
transmission_carriers = get_transmission_carriers(
n, bus_carrier=carrier
).rename({"name": "carrier"})

# remove energy balance of transmission carriers which relate to losses
transmission_carriers = get_transmission_carriers(n, bus_carrier=carrier).rename(
{"name": "carrier"}
)
components = transmission_carriers.unique("component")
carriers = transmission_carriers.unique("carrier")

Expand Down
34 changes: 25 additions & 9 deletions scripts/plot_balance_map_interactive.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,18 +115,34 @@ def scalar_to_rgba(
b_missing = n.carriers.query("color == '' or color.isnull()").index
n.carriers.loc[b_missing, "color"] = missing_color

transmission_carriers = get_transmission_carriers(n, bus_carrier=carrier).rename(
{"name": "carrier"}
)
if carrier == "co2 stored" and "co2 dense" in n.buses.carrier.unique():
co2_carriers = ["co2 stored", "co2 dense"]
transmission_carriers = get_transmission_carriers(
n, bus_carrier=co2_carriers
).rename({"name": "carrier"})

eb = n.statistics.energy_balance(
bus_carrier=co2_carriers,
groupby=["bus", "carrier"],
)
eb = eb.rename(
index=lambda value: value.replace("co2 dense", carrier), level="bus"
)
eb = eb.groupby(level=["component", "bus", "carrier"]).sum()
else:
transmission_carriers = get_transmission_carriers(
n, bus_carrier=carrier
).rename({"name": "carrier"})

### Pie charts
eb = n.statistics.energy_balance(
bus_carrier=carrier,
groupby=["bus", "carrier"],
)

components = transmission_carriers.unique("component")
carriers = transmission_carriers.unique("carrier")

### Pie charts
eb = n.statistics.energy_balance(
bus_carrier=carrier,
groupby=["bus", "carrier"],
)

# Only carriers that are also in the energy balance
carriers_in_eb = carriers[carriers.isin(eb.index.get_level_values("carrier"))]

Expand Down
Loading
Loading