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

respect different FE emission factors in pm_IndstCO2Captured calculation #1354

Merged
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
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- **config** regex tests for many parameters
- **testthat** test and compile all config files

### fixed
- fixed weights of energy carriers in `pm_IndstCO2Captured`
[[#1354](https://github.com/remindmodel/remind/pull/1354)]

## [3.2.1] - 2023-07-13 (incomplete)

### changed
Expand Down
2 changes: 1 addition & 1 deletion core/sets.gms
Original file line number Diff line number Diff line change
Expand Up @@ -2315,7 +2315,7 @@ alias(te,te2,te3);
alias(all_enty,all_enty2);
alias(enty,enty2,enty3,enty4,enty5,enty6,enty7);
alias(entyPE,entyPE2);
alias(entySe,entySe2);
alias(entySE,entySE2);
alias(entyFe,entyFe2);
alias(teEs,teEs2);
alias(esty,esty2);
Expand Down
22 changes: 11 additions & 11 deletions modules/37_industry/subsectors/datainput.gms
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ PARAMETERS
p37_specMatsDem(mats,teMats,opModes) "Specific materials demand of a production technology and operation mode [t_input/t_output]"
/
ironore.idr.(ng,h2) 1.5 !! Iron ore demand of iron direct-reduction (independent of fuel source)

dri.eaf.pri 1.0 !! DRI demand of EAF
scrap.eaf.sec 1.0 !! Scrap demand of EAF
dri.eaf.sec 0.0
scrap.eaf.pri 0.0

ironore.bfbof.pri 1.5 !! Iron ore demand of BF-BOF
scrap.bfbof.sec 1.0 !! Scrap demand of BF-BOF
scrap.bfbof.pri 0.0
Expand All @@ -33,10 +33,10 @@ PARAMETERS
feels.idr.(ng,h2) 0.33 !! Specific electric demand for both H2 and NG operation.
fegas.idr.ng 2.94 !! Specific natural gas demand when operating with NG.
feh2s.idr.h2 1.91 !! Specific hydrogen demand when operating with H2.

feels.eaf.pri 0.91 !! Specific electricy demand of EAF when operating with DRI.
feels.eaf.sec 0.67 !! Specific electricy demand of EAF when operating with scrap.

fesos.bfbof.pri 2.0 !! Specific coal demand of BF-BOF when operating with DRI -- this number is just a guess
fesos.bfbof.sec 0.5 !! Specific coal demand of BF-BOF when operating with scrap -- this number is just a guess
/
Expand Down Expand Up @@ -175,7 +175,7 @@ loop (industry_ue_calibration_target_dyn37(out)$( pm_energy_limit(out) ),

*** Specific energy demand limits for other industry and chemicals in TWa/trUSD
*** exponential decrease of minimum specific energy demand per value added up to 90% by 2100
sm_tmp2 = 0.9; !! maximum "efficiency gain" relative to 2015 baseline value
sm_tmp2 = 0.9; !! maximum "efficiency gain" relative to 2015 baseline value
sm_tmp = 2100; !! period in which closing could be achieved

loop (industry_ue_calibration_target_dyn37(out)$( sameas(out,"ue_chemicals") OR sameas(out,"ue_otherInd")),
Expand Down Expand Up @@ -415,17 +415,17 @@ pm_ue_eff_target("ue_otherInd") = 0.008;
*` CES mark-up cost industry

*` The Mark-up cost on primary production factors (final energy) of the CES tree have two functions.
*` (1) They represent sectoral end-use cost not captured by the energy system.
*` (2) As they alter prices to of the CES function inputs, they affect the CES efficiency parameters during calibration
*` (1) They represent sectoral end-use cost not captured by the energy system.
*` (2) As they alter prices to of the CES function inputs, they affect the CES efficiency parameters during calibration
*` and therefore influence the efficiency of different FE CES inputs. The resulting economic subsitution rates
*` are given by the marginal rate of subsitution (MRS) in the parameter o01_CESmrs.
*` Mark-up cost were tuned as to obtain similar or slightly higher marginal rate of substitution (MRS) to gas/liquids than technical subsitution rates and
*` obtain similar specific energy consumption per value added in chemicals and other industry across high and low electrification scenarios.
*` Mark-up cost were tuned as to obtain similar or slightly higher marginal rate of substitution (MRS) to gas/liquids than technical subsitution rates and
*` obtain similar specific energy consumption per value added in chemicals and other industry across high and low electrification scenarios.


*` There are two ways in which mark-up cost can be set:
*` (a) Mark-up cost on inputs in ppfen_MkupCost37: Those are counted as expenses in the budget and set by the parameter p37_CESMkup.
*` (b) Mark-up cost on other inputs: Those are budget-neutral and implemented as a tax. They are set by the parameter pm_tau_ces_tax.
*` (a) Mark-up cost on inputs in ppfen_MkupCost37: Those are counted as expenses in the budget and set by the parameter p37_CESMkup.
*` (b) Mark-up cost on other inputs: Those are budget-neutral and implemented as a tax. They are set by the parameter pm_tau_ces_tax.

*` Mark-up cost in industry are modeled without budget-effect (b).

Expand Down
21 changes: 10 additions & 11 deletions modules/37_industry/subsectors/declarations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ Parameters
pm_abatparam_Ind(ttot,all_regi,all_enty,steps) "industry CCS MAC curves [ratio @ US$2005]"
pm_energy_limit(all_in) "thermodynamic/technical limits of subsector energy use [GJ/t product]"
p37_energy_limit_slope(tall,all_regi,all_in) "limit for subsector specific energy demand that converges towards the thermodynamic/technical limit [GJ/t product]"
p37_clinker_cement_ratio(ttot,all_regi) "clinker content per unit cement used"
pm_ue_eff_target(all_in) "energy efficiency target trajectories [% p.a.]"
pm_IndstCO2Captured(ttot,all_regi,all_enty,all_enty,secInd37,all_emiMkt) "Captured CO2 in industry by energy carrier, subsector and emissions market"
p37_CESMkup(ttot,all_regi,all_in) "parameter for those CES markup cost accounted as investment cost in the budget [trUSD/CES input]"
p37_cesIO_up_steel_secondary(tall,all_regi,all_GDPscen) "upper limit to secondary steel production based on scrap availability"
p37_clinker_cement_ratio(ttot,all_regi) "clinker content per unit cement used"
pm_ue_eff_target(all_in) "energy efficiency target trajectories [% p.a.]"
pm_IndstCO2Captured(ttot,all_regi,all_enty,all_enty,secInd37,all_emiMkt) "Captured CO2 in industry by energy carrier, subsector and emissions market [GtC/a]"
p37_CESMkup(ttot,all_regi,all_in) "parameter for those CES markup cost accounted as investment cost in the budget [trUSD/CES input]"
p37_cesIO_up_steel_secondary(tall,all_regi,all_GDPscen) "upper limit to secondary steel production based on scrap availability"
p37_steel_secondary_max_share(tall,all_regi) "maximum share of secondary steel production"
p37_BAU_industry_ETS_solids(tall,all_regi) "industry solids demand in baseline scenario"
p37_cesIO_baseline(tall,all_regi,all_in) "vm_cesIO from the baseline scenario"
Expand All @@ -28,12 +28,12 @@ $ifthen.process_based_steel "%cm_process_based_steel%" == "on" !
$endif.process_based_steel

*** output parameters only for reporting
o37_emiInd(ttot,all_regi,all_enty,secInd37,all_enty) "industry CCS emissions [GtC/a]"
o37_cementProcessEmissions(ttot,all_regi,all_enty) "cement process emissions [GtC/a]"
o37_emiInd(ttot,all_regi,all_enty,secInd37,all_enty) "industry CCS emissions [GtC/a]"
o37_cementProcessEmissions(ttot,all_regi,all_enty) "cement process emissions [GtC/a]"
o37_demFeIndTotEn(ttot,all_regi,all_enty,all_emiMkt) "total FE per energy carrier and emissions market in industry (sum over subsectors)"
o37_shIndFE(ttot,all_regi,all_enty,secInd37,all_emiMkt) "share of subsector in FE industry energy carriers and emissions markets"
o37_demFeIndSub(ttot,all_regi,all_enty,all_enty,secInd37,all_emiMkt) "FE demand per industry subsector"
o37_demFeIndSub_SecCC(ttot,all_regi,secInd37) "FE per subsector whose emissions can be captured, helper parameter for calculation of industry captured CO2"
o37_shIndFE(ttot,all_regi,all_enty,secInd37,all_emiMkt) "share of subsector in FE industry energy carriers and emissions markets"
o37_demFeIndSub(ttot,all_regi,all_enty,all_enty,secInd37,all_emiMkt) "FE demand per industry subsector"
o37_demFeIndSub_SecCC(ttot,all_regi,secInd37) "FE per subsector whose emissions can be captured, helper parameter for calculation of industry captured CO2"

$ifThen.CESMkup not "%cm_CESMkup_ind%" == "standard"
p37_CESMkup_input(all_in) "markup cost parameter read in from config for CES levels in industry to influence demand-side cost and efficiencies in CES tree [trUSD/CES input]" / %cm_CESMkup_ind% /
Expand Down Expand Up @@ -81,4 +81,3 @@ $endif.process_based_steel
;

*** EOF ./modules/37_industry/subsectors/declarations.gms

8 changes: 4 additions & 4 deletions modules/37_industry/subsectors/equations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
***-------------------------------------------------------------------------------
*** MATERIAL-FLOW IMPLEMENTATION
***-------------------------------------------------------------------------------
* Balance equation: Demand of materials equals to production of those materials,
* accounting for trade. Demand of materials arises either due to external demand
* Balance equation: Demand of materials equals to production of those materials,
* accounting for trade. Demand of materials arises either due to external demand
* from the economy (i.e. steel) or due to internal demand of the processes modelled
* in the materials-flow model (i.e. directly reduced iron).
*
Expand Down Expand Up @@ -106,10 +106,10 @@ $ifthen.fixed_production "%cm_import_EU%" == "bal" !! cm_import_EU
!! do not limit steel production shares for fixed production
AND p37_industry_quantity_targets(ttot,regi,"ue_steel_secondary") eq 0
$endif.fixed_production
$ifthen.exogDem_scen NOT "%cm_exogDem_scen%" == "off"
$ifthen.exogDem_scen NOT "%cm_exogDem_scen%" == "off"
!! do not limit steel production shares for fixed production
AND pm_exogDemScen(ttot,regi,"%cm_exogDem_scen%","ue_steel_secondary") eq 0
$endif.exogDem_scen
$endif.exogDem_scen

) ..
vm_cesIO(ttot,regi,"ue_steel_secondary")
Expand Down
48 changes: 30 additions & 18 deletions modules/37_industry/subsectors/postsolve.gms
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,21 @@ pm_FEPrice(ttot,regi,entyFE,"indst",emiMkt)$( abs(qm_budget.m(ttot,regi)) gt sm_

*** calculate reporting parameters for FE per subsector and SE origin to make R
*** reporting easier
*** total FE per energy carrier and emissions market in industry (sum over
*** total FE per energy carrier and emissions market in industry (sum over
*** subsectors)
o37_demFeIndTotEn(ttot,regi,entyFe,emiMkt)
= sum((fe2ppfEn37(entyFe,in),secInd37_2_pf(secInd37,in),
secInd37_emiMkt(secInd37,emiMkt)),
secInd37_emiMkt(secInd37,emiMkt)),
(vm_cesIO.l(ttot,regi,in)
+pm_cesdata(ttot,regi,in,"offset_quantity"))
);

*** share of subsector in FE industry energy carriers and emissions markets
o37_shIndFE(ttot,regi,entyFe,secInd37,emiMkt)$(
o37_shIndFE(ttot,regi,entyFe,secInd37,emiMkt)$(
o37_demFeIndTotEn(ttot,regi,entyFe,emiMkt) )
= sum(( fe2ppfEn37(entyFe,in),
secInd37_2_pf(secInd37,in),
secInd37_emiMkt(secInd37,emiMkt)),
secInd37_emiMkt(secInd37,emiMkt)),
(vm_cesIO.l(ttot,regi,in)
+pm_cesdata(ttot,regi,in,"offset_quantity"))
)
Expand All @@ -42,26 +42,38 @@ o37_demFeIndSub(ttot,regi,entySe,entyFe,secInd37,emiMkt)
* vm_demFeSector_afterTax.l(ttot,regi,entySe,entyFe,"indst",emiMkt)
);


*** FE per subsector whose emissions can be captured (helper parameter for
*** calculation of industry captured CO2 below)
o37_demFeIndSub_SecCC(ttot,regi,secInd37)
*** NOTE: not used for pm_IndstCO2Captured anymore since it did not take into
*** account the different emission factors of FE carriers. But used in remind2,
*** so kept for backwards compatibility.
o37_demFeIndSub_SecCC(ttot,regi,secInd37)
Copy link
Contributor

Choose a reason for hiding this comment

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

I don't find any occurence of o37_demFeIndSub_SecCC in the remind2 library.

= sum((se2fe(entySe,entyFe,te),macBaseInd37(entyFe,secInd37),
sector2emiMkt("indst",emiMkt)),
sector2emiMkt("indst",emiMkt)),
o37_demFeIndSub(ttot,regi,entySe,entyFe,secInd37,emiMkt)
);

*** industry captured CO2
pm_IndstCO2Captured(ttot,regi,entySe,entyFe,secInd37,emiMkt)$(
entyFeCC37(entyFe)
AND o37_demFeIndSub_SecCC(ttot,regi,secInd37)
AND macBaseInd37(entyFe,secInd37))
= sum( secInd37_2_emiInd37(secInd37,emiInd37)$(emiInd37_fuel(emiInd37)),
vm_emiIndCCS.l(ttot,regi,emiInd37)
)
* o37_demFeIndSub(ttot,regi,entySe,entyFe,secInd37,emiMkt)
/ o37_demFeIndSub_SecCC(ttot,regi,secInd37);
*** industry captured fuel CO2
pm_IndstCO2Captured(ttot,regi,entySE,entyFE(entyFEcc37),secInd37,emiMkt)$(
macBaseInd37(entyFE,secInd37)
AND sum(entyFE2, vm_macBaseInd.l(ttot,regi,entyFE2,secInd37)) )
= ( o37_demFEindsub(ttot,regi,entySE,entyFE,secInd37,emiMkt)
* sum(se2fe(entySE2,entyFE,te),
!! collapse entySE dimension, so emission factors apply to all entyFE
!! regardless or origin, and therefore entySEbio and entySEsyn have
!! non-zero emission factors
pm_emifac(ttot,regi,entySE2,entyFE,te,"co2")
)
) !! subsector emissions (smokestack, i.e. including biomass & synfuels)

* ( sum(secInd37_2_emiInd37(secInd37,emiInd37(emiInd37_fuel)),
vm_emiIndCCS.l(ttot,regi,emiInd37)
) !! subsector captured energy emissions

*** EOF ./modules/37_industry/subsectors/postsolve.gms
/ sum(entyFE2,
vm_macBaseInd.l(ttot,regi,entyFE2,secInd37)
) !! subsector total energy emissions
) !! subsector capture share
;

*** EOF ./modules/37_industry/subsectors/postsolve.gms
1 change: 0 additions & 1 deletion modules/37_industry/subsectors/preloop.gms
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,3 @@
pm_IndstCO2Captured(t,regi,entySe,entyFe,secInd37,emiMkt) = 0;

*** EOF ./modules/37_industry/subsectors/preloop.gms

7 changes: 3 additions & 4 deletions modules/37_industry/subsectors/presolve.gms
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
*** SOF ./modules/37_industry/subsectors/presolve.gms

*' The process emissions from cement production are calculated using a fixed
*' CO2-to-clinker ratio (0.5262 kg CO2/kg clinker), region-specific
*' clinker-to-cement ratios, and the cement production from the production
*' CO2-to-clinker ratio (0.5262 kg CO2/kg clinker), region-specific
*' clinker-to-cement ratios, and the cement production from the production
*' function.
*' Last iteration's cement production value is used, since the MAC mechanism is
*' outside of the optimisation loop.
vm_macBaseInd.fx(ttot,regi,"co2cement_process","cement")$( ttot.val ge 2005 )
vm_macBaseInd.fx(ttot,regi,"co2cement_process","cement")$( ttot.val ge 2005 )
= s37_clinker_process_CO2
* p37_clinker_cement_ratio(ttot,regi)
* vm_cesIO.l(ttot,regi,"ue_cement")
Expand All @@ -22,4 +22,3 @@ vm_macBaseInd.fx(ttot,regi,"co2cement_process","cement")$( ttot.val ge 2005 )
***p37_emiFac(ttot,regi,entyFe) = sum((entySe,te)$(se2fe(entySe,entyFe,te) and entySeFos(entySe)), pm_emifac(ttot,regi,entySe,entyFe,te,"co2"));

*** EOF ./modules/37_industry/subsectors/presolve.gms

1 change: 0 additions & 1 deletion modules/37_industry/subsectors/realization.gms
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,3 @@ $Ifi "%phase%" == "presolve" $include "./modules/37_industry/subsectors/presolve
$Ifi "%phase%" == "postsolve" $include "./modules/37_industry/subsectors/postsolve.gms"
*######################## R SECTION END (PHASES) ###############################
*** EOF ./modules/37_industry/subsectors/realization.gms

10 changes: 5 additions & 5 deletions modules/37_industry/subsectors/sets.gms
Original file line number Diff line number Diff line change
Expand Up @@ -15,36 +15,36 @@ $ifthen.process_based_steel "%cm_process_based_steel%" == "on" !
scrap "Steel scrap"
ironore "Iron ore"
/

teMats(all_te) "Technologies used in material-flow model"
/
idr "Iron direct reduction"
eaf "Electric-arc furnace"
bfbof "Blast furnace/basic-oxygen furnace"
/

opModes "Operation modes for technologies in material-flow model"
/
ng "Direct reduction using natural gas"
h2 "Direct reduction using hydrogen"
pri "Primary production of steel (based on iron ore or DRI)"
sec "Secondary production of steel (based on scrap)"
/

teMats2matsIn(teMats,mats) "Mapping of technologies onto input materials"
/
idr . ironore
eaf . (dri,scrap)
bfbof . (ironore,scrap)
/

teMats2opModes(teMats,opModes) "Mapping of technologies onto available operation modes"
/
idr . (ng,h2)
eaf . (pri,sec)
bfbof . (pri,sec)
/

matsOut2teMats(mats,teMats) "Mapping of output materials onto technologies producing these"
/
dri . idr
Expand Down
Loading