Skip to content

Remove capacity factor flexibility in steel sector#2323

Open
clarabachorz wants to merge 8 commits into
remindmodel:developfrom
clarabachorz:steelEarlyRetiFix
Open

Remove capacity factor flexibility in steel sector#2323
clarabachorz wants to merge 8 commits into
remindmodel:developfrom
clarabachorz:steelEarlyRetiFix

Conversation

@clarabachorz
Copy link
Copy Markdown
Contributor

@clarabachorz clarabachorz commented Mar 27, 2026

Purpose of this PR

Up to now, steel production could be ramped up or down by the model freely by implicitely changing the capacity factor (production was set to be less than vm_capFac * vm_cap). This means e.g. coal-based steel production can be scaled down (unrealistically) fast with rising carbon prices. Typically, steel plants always operate at high capacity factor as they are capital-intensive, so this parametrization is not ideal.

Production is now fixed to be equal to vm_capFac * vm_cap after 2020. Now, for more control over the phase-out of coal-based steel, we should use earlyReti switches. The default parameters work fine, but in a very ambitious scenario, we could consider allowing some early retirement in the steel sector, especially in Global North countries + China.

We also change the default lifetime of bf and bof to 35 years (from 20 previously). This corresponds to a BF-BOF plant undergoing one BF relining before retiring. While steel plants could technically be retired after 20yr already, this is not financially attractive in most cases. Combined with the other changes made to the steel module, this change means a bit more coal remains locked in, even in ambitious scenarios (see below). Very ambitious scenarios could switch on some measure of earlyReti for bf and bof.

Type of change

Indicate the items relevant for your PR by replacing ◻️ with ☑️.
Do not delete any lines. This makes it easier to understand which areas are affected by your changes and which are not.

Parts concerned

  • ☑️ GAMS Code
  • ◻️ R-scripts
  • ◻️ Documentation (GAMS incode documentation, comments, tutorials)
  • ◻️ Input data / CES parameters
  • ◻️ Tests, CI/CD (continuous integration/deployment)
  • ◻️ Configuration (switches in main.gms, default.cfg, and scenario_config*.csv files)
  • ◻️ Other (please give a description)

Impact

  • ◻️ Bug fix
  • ◻️ Refactoring
  • ◻️ New feature
  • ◻️ Change of parameter values or input data (including CES parameters)
  • ☑️ Minor change (default scenarios show only small differences)
  • ◻️ Fundamental change of results of default scenarios

Checklist

Do not delete any line. Leave unfinished elements unchecked so others know how far along you are.
In the end all checkboxes must be ticked before you can merge
.

  • I executed the automated model tests (make test) after my final commit and all tests pass (FAIL 0)
  • I adjusted the reporting in remind2 if and where it was needed
  • I adjusted the madrat packages (mrremind and other packages involved) for input data generation if and where it was needed
  • My code follows the coding etiquette
  • I explained my changes within the PR, particularly in hard-to-understand areas
  • I checked that the in-code documentation is up-to-date
  • I adjusted forbiddenColumnNames in readCheckScenarioConfig.R in case the PR leads to deprecated switches
  • I updated the CHANGELOG.md correctly (added, changed, fixed, removed, input data/calibration)

@clarabachorz clarabachorz changed the title Remove implicit early retirement in steel Remove capacity factor flexibility in steel sector Mar 27, 2026
@clarabachorz clarabachorz force-pushed the steelEarlyRetiFix branch 2 times, most recently from 68d5948 to d7c7026 Compare April 28, 2026 14:15
@clarabachorz clarabachorz marked this pull request as ready for review April 29, 2026 16:58
@clarabachorz clarabachorz requested a review from fschreyer April 29, 2026 16:59
Copy link
Copy Markdown
Contributor

@fschreyer fschreyer left a comment

Choose a reason for hiding this comment

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

Thanks for this change!

Do you have some before/after plots for H12 Npi and PkBug to see what changes?

Comment thread modules/29_CES_parameters/calibrate/bounds.gms
Comment thread modules/37_industry/subsectors/equations.gms
@clarabachorz
Copy link
Copy Markdown
Contributor Author

clarabachorz commented May 11, 2026

Adding here a quick overview of how this changes H12 NPi and PkBudget runs.

Steel production

  • Expected: coal-based production (black and grey with CCS) is much higher in PkBudget runs between 2040-2050. The transition to H2-based steel in Europe is slower, which fixes this issue.
  • Expected but may need additional adjustments: Chinese steel production is much higher between 2040-2050 (from 600Mt to close to 900Mt). This is likely too high. Maybe we need to introduce some default early retirement in some regions for bf-bofs? @JakobBD please let me know what you think.
  • Will likely change: there is a lot of BF-BOF-CCS now. This will likely change again with this PR limiting biosolids to 30% in industry: Add biosolids share limit to industry #2335

Short-term

image

Long-term

image

PE|Coal

Slight increase across all regions and scenarios (only in the short term to 2050)
image

@clarabachorz clarabachorz requested a review from fschreyer May 11, 2026 11:55
@clarabachorz
Copy link
Copy Markdown
Contributor Author

I've now added the bf / bof lifetime change to this PR.

Comment on lines +61 to +76

*' for primary steel, the iterative bounds used above are too restrictive
*' due to small inconsistencies in steel production input data.
*' we add the option to use the previous time step's pm_cesdata value instead.
$offOrder
vm_cesIO.up(t,regi,"ue_steel_primary")$(t.val gt 2005)
= max(
pm_cesdata(t-1,regi,"ue_steel_primary","quantity"),
!! more flexible upper bound, can be set by the previous time step's data
(pm_cesdata(t,regi,"ue_steel_primary","quantity")
*(2.5 + max(0, (sm_CES_calibration_iteration - 1) / sm_tmp))
))$( sm_CES_calibration_iteration le sm_tmp )
+ INF$( sm_CES_calibration_iteration gt sm_tmp
);
$onOrder

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Woah, nice! Looks like that took a while to find/fix.

Does this fix the calibration issue that @whitenightZhang also encountered for process-based chemicals?
If so, it would be good to FYI @leonieschweiger about this.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Thank you! It did :)
I am not sure (I sent this fix to @whitenightZhang when he was having issues and can't remember the outcome). But it will be a step in the right direction. Happy to check with @leonieschweiger if it's enough, or if we should adjust it further for chemicals.

@JakobBD JakobBD self-requested a review May 11, 2026 13:42
Copy link
Copy Markdown
Contributor

@JakobBD JakobBD left a comment

Choose a reason for hiding this comment

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

Awesome! Will definitely be an improvement. Thanks for this!

@JakobBD JakobBD self-requested a review May 11, 2026 14:37
@JakobBD
Copy link
Copy Markdown
Contributor

JakobBD commented May 11, 2026

My apologies, but having a closer look, I am having second thoughts:

The PR changes our messaging around steel drastically, as BF-BOF-CCS now is the dominant technology until 2050.
Is that what we want? I am having doubts.

I see further refinement capabilities:

  • We could soften the early retirement constraint by adding BF/BOF to earlyReti tech and setting some rates
  • We could introduce adjustment costs both for CCS, but also for DRI.
  • We could experiment with extending the CCS tech lifetime as well, which would remove some of the CCS.

I am sorry if this causes further work, but I'm really not sure if the current results are better than the previous.
What do you think?

@clarabachorz
Copy link
Copy Markdown
Contributor Author

clarabachorz commented May 11, 2026

Maybe you missed this:

Will likely change: there is a lot of BF-BOF-CCS now. This will likely change again with this PR limiting biosolids to 30% in industry: #2335

I don't know to what extent this will make a difference, but it will reduce the amount of BF-BOF-CCS.
Each of your three options would also make sense - I reckon either using earlyReti tech or adding adjustment cost is best. Using earlyReti tech is easier.

What I suggest: I will check how big a difference it makes to add the biomass fix. If we still think it's a lot of CCS, we can introduce some earlyReti.

My two cents on CCS in PkBudg750: I actually don't think it's unrealistic to have quite a bit of CCS in an ambitious scenario with high carbon prices. I know CCS in steel is difficult to scale up, but so is reaching a PkBudg750 .. that's a more philosophical question though!

@clarabachorz
Copy link
Copy Markdown
Contributor Author

Overview of changes

@JakobBD , here are the runs with two changes:

  1. Biomass limit to solids in indst (Add biosolids share limit to industry #2335) - this doesn't affect the amount of BF-BOF-CCS.
  2. bf and bof added to earlyReti technologies. I tried with a 25% and 50% lower early Reti rate than the default (the default allowed an even faster transition than before).

Overall, I would imagine you'd be happier with these results. Worth noting: in both cases, the transition to H2-DRI in EUR is even faster than before, so we probably need to add some adjustment costs to H2-DRI and CCS on top of my changes.

Next steps

What I would need from you:

CS2 results

With 25% lower earlyReti rate

image

With 50% lower earlyReti rate

image

@JakobBD
Copy link
Copy Markdown
Contributor

JakobBD commented May 21, 2026

I don't understand what's going on:

In the first plot you're comparing 75% defaultER (no suffix) to 0% dER (.1 suffix), and in the second plot 75 % dER (no suffix) to 50 % dER (.1 suffix)?

Which also means that in PkBudg750, EUR has more DRI in 2040 if less BF/BOF can be retired??

If you give your scenarios a custom suffix (first column in scenario_config), they are easier to distinguish. It's easiest to only do it for PkBudg (if you do it to NPi, you also have to change some later columns).

Important: For a fair model, I think the bfcc tech should also be added there. Apologies if I didn't spell this out. This might change the results quite a bit.

We probably need to add some adjustment costs to H2-DRI and CCS on top of my changes.

Yes, I think so. Unfortunately, that requires quite some parameter fiddling. Especially the seed, since it has different units than the energy tech. let's talk.

And just to double check: The bio limit has no effect, right?

#2335 [...] will reduce the amount of BF-BOF-CCS.

#2335 [...] doesn't affect the amount of BF-BOF-CCS.

I don't have a preference on joint or separate PR's, but I'll comment my bio questions on the bio one as long as it's open.

@JakobBD
Copy link
Copy Markdown
Contributor

JakobBD commented May 21, 2026

Guideline of what could be next steps from my point of view:

  • Sort out bio questions (other PR)
  • Add bfcc to earlyReti
  • Add idr, bfcc, idrcc to teAdj
  • Fiddle parameters for adjustment costs (coeff and seed) until you're in the right ballpark (see an effect of changing either, but no complete choking of scale-up)
  • Do six runs with roughly 2 earlyReti and 3 adjustment cost settings - and suffixes on PkBudg names (I trust your judgement on which ones make sense, based on the previous parameter fiddling)
  • Post results here

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants