Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add coal and gas CC technologies #1200

Draft
wants to merge 8 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all 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.default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,7 @@ costs:
year: 2030
version: v0.6.2
discountrate: [0.071] #, 0.086, 0.111]
scenario: "Moderate" # "Advanced", "Moderate", or "Conservative"
Copy link
Member

Choose a reason for hiding this comment

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

Would be great to add a comment on what exactly is meant by scenario here, as we have quite many of them in the config 😄 Probably, adjustment of the naming can help, as well: like tech_scenario or costs_scenario?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Thanks for the review @ekatef. I will probably remove these changes. As it needs to be applied with @danielelerede-oet and @finozzifa PR on cost assumption integration. Being under costs section scenario is plan to mean cost scenario. But if it can lead to misunderstanding then I agree we can name it as cost_scenario.

# [EUR/USD] ECB: https://www.ecb.europa.eu/stats/exchange/eurofxref/html/eurofxref-graph-usd.en.html # noqa: E501
USD2013_to_EUR2013: 0.7532 # [EUR/USD] ECB: https://www.ecb.europa.eu/stats/exchange/eurofxref/html/eurofxref-graph-usd.en.html
rooftop_share: 0.14 # based on the potentials, assuming (0.1 kW/m2 and 10 m2/person)
Expand Down Expand Up @@ -508,6 +509,9 @@ sector:
network: false # ALWAYS FALSE for now (NOT USED)
network_data: GGIT # Global dataset -> 'GGIT' , European dataset -> 'IGGIELGN'
network_data_GGIT_status: ["Construction", "Operating", "Idle", "Shelved", "Mothballed", "Proposed"]
gas_NGCC: false # if true, Natural Gas 2-on-1 Combined Cycle (F-Frame) plant is added
CC: false # enable gas carbon capture technologies
Copy link
Member

Choose a reason for hiding this comment

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

My feeling is that it would be great to keep harmonise using upper and lowercase across the code: we have lower-cased cc for industry and co-generation here, while upper-case is used for steam methane reforming and thermal power plants in this PR. Can we align that somehow?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Actually, my thought was to change everywhere to uppercase CC. As it is strange that in SMR CC it is uppercase, while just cc is lowercase. I can make those changes within this PR if you agree.

Copy link
Member

Choose a reason for hiding this comment

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

Totally agree 🙂

gas_CC_techs: ["NG 2-on-1 Combined Cycle (F-Frame) 95% CCS", "NG 2-on-1 Combined Cycle (F-Frame) 97% CCS"] # Natural Gas 2-on-1 Combined Cycle (F-Frame) plants with 95% and 97% capture rate
hydrogen:
network: true
H2_retrofit_capacity_per_CH4: 0.6
Expand All @@ -522,6 +526,9 @@ sector:
coal:
spatial_coal: true
shift_to_elec: true # If true, residential and services demand of coal is shifted to electricity. If false, the final energy demand of coal is disregarded
coal_IGCC: false # If true, coal integrated gas combined-cycle (IGCC) plants are added
CC: false # enable coal carbon capture technologies
coal_CC_techs: ["Coal-95%-CCS", "Coal-99%-CCS", "Coal-IGCC-90%-CCS"] # coal plant with 95% capture rate, coal plant with 99% capture rate, coal integrated gas combined-cycle plant with 90% capture rate
lignite:
spatial_lignite: false

Expand Down
96 changes: 96 additions & 0 deletions scripts/prepare_sector_network.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,102 @@ def add_generation(
# set the "co2_emissions" of the carrier to 0, as emissions are accounted by link efficiency separately (efficiency to 'co2 atmosphere' bus)
n.carriers.loc[carrier, "co2_emissions"] = 0

# add coal CC technologies
if options["coal"].get("CC", False):
coal_CC_techs = options["coal"].get("coal_CC_techs", list())

for cc_tech in coal_CC_techs:
n.madd(
"Link",
spatial.nodes + " " + cc_tech,
bus0=spatial.coal.nodes,
bus1=spatial.nodes,
bus2="co2 atmosphere",
bus3=spatial.co2.nodes,
marginal_cost=costs.at[cc_tech, "efficiency"]
* costs.at[cc_tech, "VOM"], # NB: VOM is per MWel
# NB: fixed cost is per MWel
capital_cost=costs.at[cc_tech, "efficiency"]
* costs.at[cc_tech, "fixed"],
p_nom_extendable=True,
carrier="coal",
efficiency=costs.at[cc_tech, "efficiency"],
efficiency2=costs.at["coal", "CO2 intensity"]
* (1 - costs.at[cc_tech, "capture_rate"]),
efficiency3=costs.at["coal", "CO2 intensity"]
* costs.at[cc_tech, "capture_rate"],
lifetime=costs.at[cc_tech, "lifetime"],
)

# add coal integrated gas combined-cycle (IGCC) plant if enabled
if options["coal"].get("coal_IGCC", False):
n.madd(
"Link",
spatial.nodes + " " + "coal IGCC",
bus0=spatial.coal.nodes,
bus1=spatial.nodes,
bus2="co2 atmosphere",
marginal_cost=costs.at["Coal-IGCC", "efficiency"]
* costs.at["Coal-IGCC", "VOM"], # NB: VOM is per MWel
# NB: fixed cost is per MWel
capital_cost=costs.at["Coal-IGCC", "efficiency"]
* costs.at["Coal-IGCC", "fixed"],
p_nom_extendable=True,
carrier="coal",
efficiency=costs.at["Coal-IGCC", "efficiency"],
efficiency2=costs.at["coal", "CO2 intensity"],
lifetime=costs.at["Coal-IGCC", "lifetime"],
)

# add natural gas CC technologies
if options["gas"].get("CC", False):
gas_CC_techs = options["gas"].get("gas_CC_techs", list())

for cc_tech in gas_CC_techs:
n.madd(
"Link",
spatial.nodes + " " + cc_tech,
bus0=spatial.gas.nodes,
bus1=spatial.nodes,
bus2="co2 atmosphere",
bus3=spatial.co2.nodes,
marginal_cost=costs.at[cc_tech, "efficiency"]
* costs.at[cc_tech, "VOM"], # NB: VOM is per MWel
# NB: fixed cost is per MWel
capital_cost=costs.at[cc_tech, "efficiency"]
* costs.at[cc_tech, "fixed"],
p_nom_extendable=True,
carrier="gas",
efficiency=costs.at[cc_tech, "efficiency"],
efficiency2=costs.at["gas", "CO2 intensity"]
* (1 - costs.at[cc_tech, "capture_rate"]),
efficiency3=costs.at["gas", "CO2 intensity"]
* costs.at[cc_tech, "capture_rate"],
lifetime=costs.at[cc_tech, "lifetime"],
)

# add Natural Gas 2-on-1 Combined Cycle (F-Frame) plants if enabled
if options["gas"].get("gas_NGCC", False):
n.madd(
"Link",
spatial.nodes + " " + "gas NGCC",
bus0=spatial.gas.nodes,
bus1=spatial.nodes,
bus2="co2 atmosphere",
marginal_cost=costs.at["NG 2-on-1 Combined Cycle (F-Frame)", "efficiency"]
ekatef marked this conversation as resolved.
Show resolved Hide resolved
* costs.at[
"NG 2-on-1 Combined Cycle (F-Frame)", "VOM"
], # NB: VOM is per MWel
# NB: fixed cost is per MWel
capital_cost=costs.at["NG 2-on-1 Combined Cycle (F-Frame)", "efficiency"]
* costs.at["NG 2-on-1 Combined Cycle (F-Frame)", "fixed"],
p_nom_extendable=True,
carrier="gas",
efficiency=costs.at["NG 2-on-1 Combined Cycle (F-Frame)", "efficiency"],
efficiency2=costs.at["gas", "CO2 intensity"],
lifetime=costs.at["NG 2-on-1 Combined Cycle (F-Frame)", "lifetime"],
)


def H2_liquid_fossil_conversions(n, costs):
"""
Expand Down
Loading