Skip to content

Commit

Permalink
Add a constraint to limit DAC (#42)
Browse files Browse the repository at this point in the history
* Add a constraint to limit DAC

* added doc and release note

* Set dac_limit as a pathway

* updated default DAC limit pathway based on EC Industral carbon management

* Update documentation

---------

Co-authored-by: daniel-rdt <daniel.ruedt@openenergytransition.org>
Co-authored-by: Daniel Rüdt <117752024+daniel-rdt@users.noreply.github.com>
  • Loading branch information
3 people authored Dec 20, 2024
1 parent eb1cf0e commit d79e258
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 1 deletion.
7 changes: 7 additions & 0 deletions config/config.default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,13 @@ sector:
methanation: true
coal_cc: false
dac: true
dac_limit: # limit in MtCO2, default pathway is based on EC Industrial Carbon Management (COM/2024/62) https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:52024DC0062
enable: false
2030: 0
2035: 20 # interpolated value for DAC share and total captured carbon
2040: 70
2045: 137 # interpolated value for DAC share and total captured carbon
2050: 180
co2_vent: false
central_heat_vent: false
allam_cycle_gas: false
Expand Down
6 changes: 5 additions & 1 deletion config/config.form.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ logging:
# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#run
run:
prefix: "updated_initial_main_scenarios"
name: "main-mds-vanilla-no-methanation"
name: "main-mds-vanilla-dac-limit-ev40"
scenarios:
enable: true
file: config/scenarios.form.yaml
Expand Down Expand Up @@ -183,6 +183,10 @@ sector:
reduce_space_heat_exogenously_factor:
2035: 0.21
tes: false
dac: true
dac_limit:
enable: false
2035: 20 # limit in MtCO2
marginal_cost_storage: 0. #1e-4
stores: ["H2"]
storage_units: ["li-ion battery", "vanadium", "lair", "pair", "iron-air battery"]
Expand Down
87 changes: 87 additions & 0 deletions config/scenarios.form.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,93 @@ main-mds-vanilla:
stores: ["H2"]
storage_units: ["li-ion battery", "iron-air battery"]

main-mds-vanilla-dac-limit-ev35:
electricity:
max_hours:
li-ion battery: [1, 2, 4, 8]
vanadium: [10]
lair: [12]
pair: [24]
H2: [168]
iron-air battery: [100]
sector:
land_transport_electric_share:
2035: 0.35 # default assumptions
land_transport_ice_share:
2035: 0.65
stores: ["H2"]
storage_units: ["li-ion battery", "iron-air battery"]
dac: true
dac_limit:
enable: true
2035: 20 # limit in MtCO2

main-mds-vanilla-dac-limit-ev40:
electricity:
max_hours:
li-ion battery: [1, 2, 4, 8]
vanadium: [10]
lair: [12]
pair: [24]
H2: [168]
iron-air battery: [100]
sector:
land_transport_electric_share:
2035: 0.40 # default assumptions
land_transport_ice_share:
2035: 0.60
stores: ["H2"]
storage_units: ["li-ion battery", "iron-air battery"]
dac: true
dac_limit:
enable: true
2035: 20 # limit in MtCO2

main-mds-vanilla-dac-limit-ev45:
electricity:
max_hours:
li-ion battery: [1, 2, 4, 8]
vanadium: [10]
lair: [12]
pair: [24]
H2: [168]
iron-air battery: [100]
sector:
land_transport_electric_share:
2035: 0.45 # default assumptions
land_transport_ice_share:
2035: 0.55
stores: ["H2"]
storage_units: ["li-ion battery", "iron-air battery"]
dac: true
dac_limit:
enable: true
2035: 20 # limit in MtCO2

main-mds-vanilla-dac-limit-ev45-nuc80:
electricity:
max_hours:
li-ion battery: [1, 2, 4, 8]
vanadium: [10]
lair: [12]
pair: [24]
H2: [168]
iron-air battery: [100]
sector:
land_transport_electric_share:
2035: 0.45 # default assumptions
land_transport_ice_share:
2035: 0.55
stores: ["H2"]
storage_units: ["li-ion battery", "iron-air battery"]
dac: true
dac_limit:
enable: true
2035: 20 # limit in MtCO2
conventional:
nuclear:
p_min_pu: 0.8

main-no-mds-vanilla:
electricity:
max_hours:
Expand Down
2 changes: 2 additions & 0 deletions doc/configtables/sector.csv
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ storage_units,--,List of storage technologies to include as StorageUnit componen
methanation,--,"{true, false}",Add option for transforming hydrogen and CO2 into methane using methanation.
coal_cc,--,"{true, false}",Add option for coal CHPs with carbon capture
dac,--,"{true, false}",Add option for Direct Air Capture (DAC)
dac_limit,MtCO2,Dictionary with planning horizons as keys.,Limit on Direct Air Capture (DAC) in MtCO2.
-- enable,--,"{true, false}",Add limit on Direct Air Capture (DAC).
co2_vent,--,"{true, false}",Add option for vent out CO2 from storages to the atmosphere.
allam_cycle_gas,--,"{true, false}",Add option to include `Allam cycle gas power plants <https://en.wikipedia.org/wiki/Allam_power_cycle>`_
hydrogen_fuel_cell,--,"{true, false}",Add option to include hydrogen fuel cell for re-electrification. Assuming OCGT technology costs
Expand Down
2 changes: 2 additions & 0 deletions doc/release_notes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ Release Notes
Upcoming Release
================

* Added option to include an exogenous DAC yearly limit specified via the configuration file (in MtCO2)

* Added Iron-Air battery storage technology and changed nomenclature for lithium-ion battery storages from ``battery`` to ``li-ion battery``.

* Feature: Allow CHPs to use different fuel sources such as gas, oil, coal, and methanol. Note that the cost assumptions are based on a gas CHP.
Expand Down
13 changes: 13 additions & 0 deletions scripts/solve_network.py
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,17 @@ def add_co2_atmosphere_constraint(n, snapshots):
n.model.add_constraints(lhs <= rhs, name=f"GlobalConstraint-{name}")


def add_dac_limit(n):
"""
Limit the amount of CO2 captured using DAC. The constraint is formulated in tCO2.
"""
dac = n.links.query("Link.str.contains('DAC')")
lhs = (n.model["Link-p"].loc[:, dac.index] * n.snapshot_weightings.generators * dac.efficiency2 * -1).sum()
optimization_year = int(snakemake.wildcards.planning_horizons)
rhs = n.config["sector"]["dac_limit"][optimization_year] * 1e6 # DAC limit specified in config in MtCO2
n.model.add_constraints(lhs <= rhs, name="DAC limit")


def extra_functionality(n, snapshots):
"""
Collects supplementary constraints which will be passed to
Expand Down Expand Up @@ -966,6 +977,8 @@ def extra_functionality(n, snapshots):
add_battery_constraints(n)
add_lossy_bidirectional_link_constraints(n)
add_pipe_retrofit_constraint(n)
if config["sector"]["dac"] and config["sector"]["dac_limit"]["enable"]:
add_dac_limit(n)
if n._multi_invest:
add_carbon_constraint(n, snapshots)
add_carbon_budget_constraint(n, snapshots)
Expand Down

0 comments on commit d79e258

Please sign in to comment.