Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e79d9a3
improving carbon manangement modeling
toniseibold May 7, 2026
a3a770a
include co2_network_liquefaction in default config
toniseibold May 7, 2026
019db10
documentation
toniseibold May 7, 2026
6a16ff8
[pypsa-bot] run `generate-config`
pypsa[bot] May 7, 2026
14ba6e7
Merge branch 'master' into carbon_capture
toniseibold May 7, 2026
6058df3
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 7, 2026
9664f71
bug fixing
toniseibold May 7, 2026
11628b8
adjusting capital costs for post combustion capture depending on flue…
toniseibold May 7, 2026
fc2aa92
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 7, 2026
68e02de
Fix unit
toniseibold May 7, 2026
b425f45
bug fix
toniseibold May 7, 2026
d17a13b
bug fix
toniseibold May 7, 2026
2bfaa20
cleaning up and minor fixes
toniseibold May 12, 2026
df9e105
Updated plot_balance_map* scripts to include co2 dense carrier in co2…
bobbyxng May 12, 2026
b89dc7f
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 12, 2026
a14b458
change technology data name in line with technology-data PR
toniseibold May 12, 2026
103366c
making technology-data pr prequisite for this pr
toniseibold May 12, 2026
5041899
addressing change requests of documentation, bugfixing and spatially …
toniseibold May 26, 2026
e80f130
merge master
fneum Jun 9, 2026
577e525
pre-commit fixes
fneum Jun 9, 2026
a8fa479
update data/versions.csv
fneum Jun 9, 2026
dd0e476
Merge branch 'master' into carbon_capture
fneum Jun 28, 2026
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 @@ -874,7 +874,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.1
coal: 1.1
waste: 1.2
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 @@ -694,6 +694,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 @@ -4730,11 +4730,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. Factors are given relative to cement capture. The default values are based on the DEA technology-data report on carbon capture, transport and storage Table 8 / Figure 12 (https://ens.dk/en/analyses-and-statistics/technology-data-carbon-capture-transport-and-storage).",
"type": "object"
},
"hydrogen_underground_storage": {
"default": true,
"description": "Add options for storing hydrogen underground. Storage potential depends regionally.",
Expand Down Expand Up @@ -11210,11 +11222,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. Factors are given relative to cement capture. The default values are based on the DEA technology-data report on carbon capture, transport and storage Table 8 / Figure 12 (https://ens.dk/en/analyses-and-statistics/technology-data-carbon-capture-transport-and-storage).",
"type": "object"
},
"hydrogen_underground_storage": {
"default": true,
"description": "Add options for storing hydrogen underground. Storage potential depends regionally.",
Expand Down
2 changes: 2 additions & 0 deletions data/versions.csv
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ 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.15.0,primary,latest supported,2026-06-09,Part of the `technologydata` repository and versioned on GitHub.,https://raw.githubusercontent.com/PyPSA/technology-data/refs/tags/v0.15.0/outputs
costs,v0.15.0,archive,latest supported,2026-06-09,Part of the `technologydata` repository and versioned on GitHub.,https://data.pypsa.org/workflows/eur/costs/v0.15.0
Comment on lines +21 to +22

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.

@lkstrp could you upload to data.pypsa.org? technology-data release is fixed now.

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,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
Expand Down
2 changes: 2 additions & 0 deletions doc/release_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

<!-- 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: Resolve plotting crashes from missing `tech_colors` entries by adding `heat dsm` color and implementing upfront validation for missing keys in `plot_summary.py` ([#2108](https://github.com/PyPSA/pypsa-eur/issues/2108)).
* feat: Make the default target rule configurable (defaults to "all" for backwards compatibility)

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 @@ -757,11 +757,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.1,
"coal": 1.1,
"waste": 1.2,
"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. Factors are given relative to cement capture. The default values are based on the DEA technology-data report on carbon capture, transport and storage Table 8 / Figure 12 (https://ens.dk/en/analyses-and-statistics/technology-data-carbon-capture-transport-and-storage).",
)
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