REMIND - REgional Model of INvestments and Development

2.1.3

created with goxygen 1.1.0

Fossil (31_fossil)

Description

The Fossil Module calculates the costs of a specific amount of fossil resource extraction.

Interfaces

Interfaces to other modules
Interfaces to other modules

Input

module inputs (A: exogenous | B: grades2poly | C: MOFEX | D: timeDepGrades)
  Description Unit A B C D
cm_earlyreti_rate maximum portion of capital stock that can be retired in one year x x
cm_limit_peur_scen limit total uranium production x x
cm_nucscen nuclear option choice x x
cm_rentconvcoal [grades2poly] number of years required to converge to the 2100 coal rent x
cm_rentconvgas [grades2poly] number of years required to converge to the 2100 gas rent x
cm_rentconvoil [grades2poly] number of years required to converge to the 2100 oil rent x
cm_rentdisccoal [grades2poly] discount factor for the coal rent x
cm_rentdisccoal2 [grades2poly] discount factor for the coal rent achieved in 2100 x
cm_rentdiscgas [grades2poly] discount factor for the gas rent x
cm_rentdiscgas2 [grades2poly] discount factor for the gas rent achieved in 2100 x
cm_rentdiscoil [grades2poly] discount factor for the oil rent x
cm_rentdiscoil2 [grades2poly] discount factor for the oil rent achieved in 2100 x
cm_startyear first optimized modelling time step \(year\) x x x
cm_trdadj parameter scale the adjustment cost parameter for increasing gas trade export x x
pm_costsTradePeFinancial
(all_regi, char, all_enty)
PE tradecosts (financial costs on import, export and use) x x
pm_EN_demand_from_initialcap2
(all_regi, all_enty)
PE demand resulting from the initialcap routine. \(EJ, Uranium: MT U3O8\) x
pm_IO_trade
(tall, all_regi, all_enty, char)
Energy trade bounds based on IEA data. x
pm_prtp
(all_regi)
Pure rate of time preference x x
pm_ts
(tall)
(t_n+1 - t_n-1)/2 for a timestep t_n x x x
pm_ttot_val
(ttot)
value of ttot set element x x x
qm_fuel2pe
(ttot, all_regi, all_enty)
constraint on cumulative fuel use x x
sm_EJ_2_TWa multiplicative factor to convert from EJ to TWa x x
vm_costFuEx
(ttot, all_regi, all_enty)
fuel costs from exhaustible energy \(tril\$US\) x x x x
vm_fuExtr
(ttot, all_regi, all_enty, rlf)
fuel use \(TWa\) x x x x
vm_Mport
(tall, all_regi, all_enty)
Import of traded commodity. x x
vm_prodPe
(ttot, all_regi, all_enty)
pe production. \(TWa, Uranium: Mt Ur\) x x
vm_Xport
(tall, all_regi, all_enty)
Export of traded commodity. x x

Output

module outputs
  Description Unit
pm_ffPolyCumEx
(all_regi, all_enty, char)
Minimum / maximum cumulative extraction (condition to activate rent / upper bound on v31_fuExtrCum for Oil, Gas and Coal)
pm_fuelex_cum
(tall, all_regi, all_enty, rlf)
(Output) cumulated extraction. Unit:
pm_prodIni
(all_regi, all_enty)
(Preloop) regional amount of primary energy that has to be produced according to 1.1*initial demand. Unit:

Realizations

(A) exogenous

For this realization exogenous fossil extraction and costs are used. The data are from a baseline run.

Limitations Fossil fuel extraction and costs are fixed to exogenous values.

(B) grades2poly

This realization parametrizes fossil extraction cost curves into 3rd-order polynomials for each fuel (oil, gas and coal) in each region. Input data are taken from REMIND runs with the timeDepGrades fossil realization under various fossil fuel availability assumptions. This approximation of the original cost-grade-based extraction algorithm greatly reduces model runtime.

Uranium extraction costs parameterized as 3rd order polynomial with short-term calibrated adjustment costs which capture inertias, e.g. from infrastructure

\[\begin{multline*} vm\_costFuEx(ttot,regi,enty) = \left( p31\_costExPoly(regi,"xi1",enty) + p31\_costExPoly(regi,"xi2",enty) \cdot v31\_fuExtrCum(ttot,regi,enty,"1") + p31\_costExPoly(regi,"xi3",enty) \cdot v31\_fuExtrCum(ttot,regi,enty,"1")^{2 }+ p31\_costExPoly(regi,"xi4",enty) \cdot v31\_fuExtrCum(ttot,regi,enty,"1")^{3 }\right) \cdot \left(1\$\left(ttot.val eq 2005\right) + \left(\left(1-p31\_fosadjco\_xi5xi6(regi,"xi5",enty)\right) + p31\_fosadjco\_xi5xi6(regi,"xi5",enty) \cdot \left(\frac{\left(vm\_fuExtr(ttot,regi,enty,"1")+1.e-5\right)}{\left(vm\_fuExtr(ttot-1,regi,enty,"1")\$\left(ttot.val gt 2005\right)+1.e-5\right)}\right)^{p31\_fosadjco\_xi5xi6(regi,"xi6",enty) }\right)\$\left(ttot.val gt 2005\right) \right) \cdot vm\_fuExtr(ttot,regi,enty,"1") \end{multline*}\]

Oil, gas and coal extraction costs fitted to existing REMIND output as a 3rd-order polynomial with short-term calibrated adjustment costs which capture inertias, e.g. from infrastructure

\[\begin{multline*} vm\_costFuEx(ttot,regi,enty) = \left( \left( p31\_ffPolyCoeffs(regi,enty,"0") + p31\_ffPolyCoeffs(regi,enty,"1") \cdot v31\_fuExtrCum(ttot,regi,enty,"1") + p31\_ffPolyCoeffs(regi,enty,"2") \cdot v31\_fuExtrCum(ttot,regi,enty,"1")^{2 }+ p31\_ffPolyCoeffs(regi,enty,"3") \cdot v31\_fuExtrCum(ttot,regi,enty,"1")^{3 }\right) \cdot \left(1\$\left(ttot.val eq 2005\right) +\left(\left(\left(1-p31\_fosadjco\_xi5xi6(regi,"xi5",enty)\right) + p31\_fosadjco\_xi5xi6(regi,"xi5",enty) \cdot \left(\frac{\left(vm\_fuExtr(ttot,regi,enty,"1")+1.e-5\right)}{\left(vm\_fuExtr(ttot-1,regi,enty,"1")\$\left(ttot.val gt 2005\right)+1.e-5\right)}\right)^{p31\_fosadjco\_xi5xi6(regi,"xi6",enty) }\right)\$\left(ttot.val gt 2005\right)\right) \right) + \left( p31\_rentdisctot(ttot,enty) \cdot \left( p31\_ffPolyRent(regi,enty,"0") + p31\_ffPolyRent(regi,enty,"1") \cdot v31\_fuExtrCum(ttot,regi,enty,"1") \right)\$\left(v31\_fuExtrCum.l(ttot,regi,enty,"1")\$\left(ttot.val ge 2010 and ttot.val le 2150\right) gt pm\_ffPolyCumEx(regi,enty,"min")\right) \right) \right) \cdot vm\_fuExtr(ttot,regi,enty,"1") \end{multline*}\]

Cumulated fuel extraction (oil, gas and coal) is the sum of extraction in each time step multiplied by the time step length.

\[\begin{multline*} v31\_fuExtrCum(ttot,regi,enty,"1") = v31\_fuExtrCum(ttot-1,regi,enty,"1")\$\left(ttot.val gt 2005\right) + pm\_ts(ttot) \cdot \left(vm\_fuExtr(ttot,regi,enty,"1") \right) \end{multline*}\]

\[\begin{multline*} v31\_fuExtrMC(enty,"1") = p31\_costExPoly(regi,"xi1",enty) + p31\_costExPoly(regi,"xi2",enty) \cdot v31\_fuExtrCumMax\left(regi,enty, "1"\right) + p31\_costExPoly(regi,"xi3",enty) \cdot v31\_fuExtrCumMax\left(regi,enty, "1"\right)^{2 }+ p31\_costExPoly(regi,"xi4",enty) \cdot v31\_fuExtrCumMax\left(regi,enty, "1"\right)^{3 } \end{multline*}\]

\[\begin{multline*} v31\_squaredDiff = \left(s31\_max\_disp\_peur - \sum_{regi}\left( v31\_fuExtrCumMax\left(regi, "peur", "1"\right)\right)\right) \cdot \left(s31\_max\_disp\_peur - \sum_{regi}\left( v31\_fuExtrCumMax\left(regi, "peur", "1"\right)\right)\right) \end{multline*}\]

Limitations There are no known limitations.

(C) MOFEX

This realization is dedicated to the running the standalone version of MOFEX (Model Of Fossil EXtraction), which minimizes the discounted extraction and trade costs of fossils while balancing trade for each time step. This is not to be run within a REMIND run but instead through the standalone architecture or in a soft-linked iteration with REMIND (not yet implemented)

MOFEX (Model of Fossil Extraction) takes fossil demand, imports and exports from a prior REMIND run as inputs, and it calculates fossil extraction and trade as outputs.

\[\begin{multline*} \sum_{regi}\left( vm\_Xport(t,regi,trade) - vm\_Mport(t,regi,trade)\right) = 0 \end{multline*}\]

\[\begin{multline*} v31\_MOFEX\_costMinFuelEx = \sum_{ttot\$\left(ttot.val ge cm\_startyear\right)}\left( \sum_{regi}\left(\frac{ pm\_ts(ttot) }{ \left(\left(1 + pm\_prtp(regi)\right)^{\left(pm\_ttot\_val(ttot)-cm\_startyear\right)}\right) } \cdot \left(\sum_{peFos(enty)} vm\_costFuEx(ttot,regi,enty) + \sum_{peFos(enty)}\left( pm\_costsTradePeFinancial(regi,"Mport",enty) \cdot vm\_Mport(ttot,regi,enty)\right) + \sum_{peFos(enty)}\left( \left(pm\_costsTradePeFinancial(regi,"Xport",enty) \cdot vm\_Xport(ttot,regi,enty)\right) \cdot \left(1 +\frac{ pm\_costsTradePeFinancial(regi,"XportElasticity",enty) }{ sqr\left(pm\_ttot\_val(ttot)-pm\_ttot\_val(ttot-1)\right) } \cdot \left(\frac{ vm\_Xport(ttot,regi,enty) }{ \left(vm\_Xport(ttot-1,regi,enty) + pm\_costsTradePeFinancial\left(regi, "tradeFloor",enty\right)\right) }- 1\right) \right) \right) \right) \right) \right) \end{multline*}\]

Fossil fuels are represented by discrete grades based on ranges of marginal extraction costs. The total extraction cost for each time step is calculated based on long-term marginal extraction costs and short-term calibrated adjustment costs which capture inertias, e.g. from infrastructure

\[\begin{multline*} vm\_costFuEx(ttot,regi,enty) = \sum_{pe2rlf(enty,rlf)}\left( \left(\left(p31\_grades\left(ttot,regi,"xi1",enty, rlf\right) + pm\_costsTradePeFinancial(regi,"use",enty) + \left(p31\_grades(ttot,regi,"xi2",enty,rlf)-p31\_grades\left(ttot,regi,"xi1",enty, rlf\right)\right) \cdot \frac{ v31\_fuExtrCum\left(ttot-1,regi,enty, rlf\right)\$\left(ttot.val gt 2005\right) }{ p31\_grades\left(ttot,regi,"xi3",enty, rlf\right) }+ \left(p31\_grades(ttot,regi,"xi2",enty,rlf)-p31\_grades\left(ttot,regi,"xi1",enty, rlf\right)\right) \cdot \frac{ \left(v31\_fuExtrCum(ttot,regi,enty,rlf)-v31\_fuExtrCum(ttot-1,regi,enty,rlf)\$\left(ttot.val gt 2005\right)\right) }{ \left(2 \cdot p31\_grades\left(ttot,regi,"xi3",enty, rlf\right)\right) }\right) \cdot \left( \left(1 + \left(p31\_datafosdyn(regi,enty,rlf,"alph") \cdot \frac{ 1}{\left(sqr\left(pm\_ttot\_val(ttot)-pm\_ttot\_val(ttot-1)\right)\right) } \cdot sqr\left(\frac{\left(vm\_fuExtr(ttot,regi,enty,rlf)-vm\_fuExtr(ttot-1,regi,enty,rlf)\right)}{\left(vm\_fuExtr(ttot-1,regi,enty,rlf)+ 0.001 \cdot p31\_grades(ttot,regi,"xi3",enty,rlf) + p31\_extraseed(ttot,regi,enty,rlf) + 1.e-9\right)}\right) \right)\$\left(ttot.val gt 2005\right) \right) \right) \cdot vm\_fuExtr(ttot,regi,enty,rlf) \right)\$\left(p31\_grades(ttot,regi,"xi3",enty,rlf) gt 0\right) \right) \end{multline*}\]

Cumulated fuel extraction (oil, gas and coal) is the sum of extraction in each time step multiplied by the time step length. If early retirement of oil wells is switched on, any slack capacity from those fields is also added.


q31_fuExtrCum(ttot,regi,pe2rlf(peEx(enty),rlf))$(ttot.val ge cm_startyear)..
        v31_fuExtrCum(ttot,regi,enty,rlf) 
        =e= 
        v31_fuExtrCum(ttot-1,regi,enty,rlf)$(ttot.val gt 2005) + pm_ts(ttot)*(vm_fuExtr(ttot,regi,enty,rlf)
$if %cm_OILRETIRE% == "on"    + v31_fuSlack(ttot,regi,enty,rlf)
        );

These dynamic constraints on the decline and increase rates of production reflect physical and technical inertias of oil, gas and coal Dynamic constraint on decline rate


q31_fuExtrDec(ttot+1,regi,enty2rlf_dec(enty,rlf))$(pm_ttot_val(ttot+1) ge max(2010,cm_startyear))..
         vm_fuExtr(ttot+1,regi,enty,rlf)
$if %cm_OILRETIRE% == "on"    + v31_fuSlack(ttot+1,regi,enty,rlf)
         =g=
          p31_datafosdyn(regi,enty,rlf,"decoffset") * p31_grades(ttot,regi,"xi3",enty,rlf) * 0.5 * ( pm_ts(ttot+1) + pm_ts(ttot) )
$if not setglobal test_TS   + (1-p31_datafosdyn(regi,enty,rlf,"dec"))**(pm_ttot_val(ttot+1)-pm_ttot_val(ttot)) * vm_fuExtr(ttot,regi,enty,rlf);

\[\begin{multline*} v31\_fuSlack(ttot+1,regi,enty,rlf) \leq v31\_fuSlack(ttot,regi,enty,rlf) + \left(pm\_ttot\_val(ttot+1)-pm\_ttot\_val(ttot)\right) \cdot cm\_earlyreti\_rate \cdot 0.3 \cdot p31\_max\_oil\_extraction(regi,enty,rlf) \end{multline*}\]

Dynamic constraint on increase rate


q31_fuExtrInc(ttot+1,regi,enty2rlf_inc(enty,rlf))$((p31_grades(ttot,regi,"xi3",enty,rlf) gt 0) AND (pm_ttot_val(ttot+1) ge max(2010,cm_startyear)))..
         vm_fuExtr(ttot+1,regi,enty,rlf)
         =l=
         (1 + p31_datafosdyn(regi,enty,rlf,"inc"))**(pm_ttot_val(ttot+1)-pm_ttot_val(ttot)) * (vm_fuExtr(ttot,regi,enty,rlf) + p31_datafosdyn(regi,enty,rlf,"incoffset"))
$ifthen.cm_oil_scen %cm_oil_scen% == "highOil"    +(10)$(cm_startyear eq 2015 AND pm_ttot_val(ttot+1) eq 2015 AND ((sameas(enty,"peoil") AND sameas(rlf,"7")) OR (sameas(enty,"pegas") AND sameas(rlf,"6"))))
$elseif.cm_oil_scen %cm_oil_scen% == "6"          +(10)$(cm_startyear eq 2015 AND pm_ttot_val(ttot+1) eq 2015 AND (sameas(enty,"peoil") AND sameas(rlf,"1") AND sameas(regi,"REF")));
option nlp = conopt4;  !! Greatly speed up convergence process (x3~x4)

Lower bounds on fossil fuel extraction for all time steps To make the model “see” all grades

loop(regi,
  loop(peFos(enty),
    loop(rlf,
      loop(t,
        if (p31_grades(t,regi,"xi3",enty,rlf) gt 0,
          vm_fuExtr.lo(t,regi,pe2rlf(enty,rlf)) = 1e-9;
        );
      );
    );
  );
);

Special case for grades declining to a zero value Set lower and upper bounds to 0.0 to make the model converge. p31_grades declines linearly whereas vm_fuExtr declines exponentially This particular situation prevent the model from finding a solution [TODO] In the future a small amount should be added to p31_grades to allow for extraction from these grades

loop(regi,
  loop(peFos(enty),
    loop(rlf,
      if (p31_grades("2005",regi,"xi3",enty,rlf) gt 0.0 and p31_grades("2035",regi,"xi3",enty,rlf) eq 0.0,
        vm_fuExtr.up(t,regi,pe2rlf(enty,rlf))$(rlf.val ge 6) = 0.0;
        vm_fuExtr.lo(t,regi,pe2rlf(enty,rlf))$(rlf.val ge 6) = 0.0;
        vm_fuExtr.up(t,regi,pe2rlf(enty,rlf))$(rlf.val lt 6) = 0.0;
        vm_fuExtr.lo(t,regi,pe2rlf(enty,rlf))$(rlf.val lt 6) = 0.0;
      );
    );
  );
);
if (s31_debug eq 1,
  display vm_fuExtr.lo, vm_fuExtr.up;
);
v31_fuExtrCum.up(t,regi,peExGrade(enty),rlf) = p31_grades(t,regi,"xi3",enty,rlf);

Upper bound on fossil fuel costs

vm_costFuEx.up(t,regi,peExGrade(enty)) = 10.0;
option nlp = conopt4;  !! Greatly speed up convergence process (x3~x4)
o_modelstat = 100;
option solprint=on
if(o_modelstat ne 2,
   solve m31_MOFEX using nlp minimizing v31_MOFEX_costMinFuelEx;
   o_modelstat = m31_MOFEX.modelstat;
);
p31_MOFEX_fuelex_costMin(ttot,regi,enty,rlf)  = vm_fuExtr.l(ttot,regi,enty,rlf);
p31_MOFEX_cumfex_costMin(ttot,regi,enty,rlf)  = v31_fuExtrCum.l(ttot,regi,enty,rlf);
p31_MOFEX_Mport_costMin(ttot,regi,trade)      = vm_Mport.l(ttot,regi,trade);
p31_MOFEX_Xport_costMin(ttot,regi,trade)      = vm_Xport.l(ttot,regi,trade);
if(m31_MOFEX.modelstat ne 2,
  Execute_Unload 'mofex';
  abort "MOFEX did not find an optimal solution. Stopping job...";
);
vm_prodPe.lo(ttot,regi,peExGrade(enty)) = 1.e-9;
vm_prodPe.up(ttot,regi,peExGrade(enty)) = 1.e+2;
display p31_MOFEX_fuelex_costMin;
option nlp = %cm_conoptv%;

Limitations There are no known limitations.

(D) timeDepGrades

This realization represents fossil fuel resources as a time-dependent cost grade structure. The grades are each defined
by a minimum and a maximum price, and these cost brackets change over time based on the rate of technological change as prescribed exogenously by the socioeconomic scenario. Each model region contains different volumes of each cost grade of each fuel (oil, gas and coal) based on data compiled from IIASA’s 2012 Global Energy Assessment and the German Federal Institute for Geosciences and
Natural Resources (BGR) The model extracts resources in a Hotelling fashion, such that lower cost grades are depleted in each region
before shifting production to higher-cost grades.

Uranium extraction is represented as a 3rd order polynomial parametrized by long-term marginal extraction costs.

\[\begin{multline*} vm\_costFuEx(ttot,regi,enty) = \left( p31\_costExPoly(regi,"xi1",enty) + p31\_costExPoly(regi,"xi2",enty) \cdot v31\_fuExtrCum\left(ttot,regi,enty, "1"\right) + p31\_costExPoly(regi,"xi3",enty) \cdot v31\_fuExtrCum\left(ttot,regi,enty, "1"\right)^{2 }+ p31\_costExPoly(regi,"xi4",enty) \cdot v31\_fuExtrCum\left(ttot,regi,enty, "1"\right)^{3 }\right) \cdot \cdot ' Short term decline and increase rates are determined by adjustment costs. \left(1\$\left(ttot.val eq 2005\right) +\left( \left(1-p31\_fosadjco\_xi5xi6(regi,"xi5",enty)\right) + p31\_fosadjco\_xi5xi6(regi,"xi5",enty) \cdot \left(\frac{\left(vm\_fuExtr(ttot,regi,enty,"1")+1.e-5\right)}{\left(vm\_fuExtr(ttot-1,regi,enty,"1")\$\left(ttot.val gt 2005\right)+1.e-5\right)}\right)^{p31\_fosadjco\_xi5xi6(regi,"xi6",enty) }\right)\$\left(ttot.val gt 2005\right) \right) \cdot vm\_fuExtr(ttot,regi,enty,"1") \end{multline*}\]

Two dummy equations further determine regional uranium extraction bounds.

\[\begin{multline*} v31\_fuExtrMC(enty,"1") = p31\_costExPoly(regi,"xi1",enty) + p31\_costExPoly(regi,"xi2",enty) \cdot v31\_fuExtrCumMax\left(regi,enty, "1"\right) + p31\_costExPoly(regi,"xi3",enty) \cdot v31\_fuExtrCumMax\left(regi,enty, "1"\right)^{2 }+ p31\_costExPoly(regi,"xi4",enty) \cdot v31\_fuExtrCumMax\left(regi,enty, "1"\right)^{3 } \end{multline*}\]

\[\begin{multline*} s31\_max\_disp\_peur = \sum_{regi}\left( v31\_fuExtrCumMax\left(regi,enty, "1"\right)\right) \end{multline*}\]

MOFEX (Model of Fossil Extraction) minimizes the discounted extraction and trade costs of fossils while balancing trade for each time step. The model takes fossil demand, imports and exports from a prior REMIND run as inputs, and it calculates fossil extraction and trade as outputs. In this realization, the output variables are returned to the current REMIND run as starting points for the hybrid optimization.

\[\begin{multline*} \sum_{regi}\left( vm\_Xport(t,regi,trade) - vm\_Mport(t,regi,trade)\right) = 0 \end{multline*}\]

\[\begin{multline*} v31\_MOFEX\_costMinFuelEx = \sum_{ttot\$\left(ttot.val ge cm\_startyear\right)}\left( \sum_{regi}\left(\frac{ pm\_ts(ttot) }{ \left(\left(1 + pm\_prtp(regi)\right)^{\left(pm\_ttot\_val(ttot)-cm\_startyear\right)}\right) } \cdot \left(\sum_{peFos(enty)} vm\_costFuEx(ttot,regi,enty) + \sum_{peFos(enty)}\left( pm\_costsTradePeFinancial(regi,"Mport",enty) \cdot vm\_Mport(ttot,regi,enty)\right) + \sum_{peFos(enty)}\left( \left(pm\_costsTradePeFinancial(regi,"Xport",enty) \cdot vm\_Xport(ttot,regi,enty)\right) \cdot \left(1 +\frac{ pm\_costsTradePeFinancial(regi,"XportElasticity",enty) }{ sqr\left(pm\_ttot\_val(ttot)-pm\_ttot\_val(ttot-1)\right) } \cdot \left(\frac{ vm\_Xport(ttot,regi,enty) }{ \left(vm\_Xport(ttot-1,regi,enty) + pm\_costsTradePeFinancial\left(regi, "tradeFloor",enty\right)\right) }- 1\right) \right) \right) \right) \right) \right) \end{multline*}\]

Fossil fuels are represented by discrete grades based on ranges of marginal extraction costs. The total extraction cost for each time step is calculated based on long-term marginal extraction costs and short-term calibrated adjustment costs which capture inertias, e.g. from infrastructure

\[\begin{multline*} vm\_costFuEx(ttot,regi,enty) = \sum_{pe2rlf(enty,rlf)}\left( \left(\left(p31\_grades\left(ttot,regi,"xi1",enty, rlf\right) + pm\_costsTradePeFinancial(regi,"use",enty) + \left(p31\_grades(ttot,regi,"xi2",enty,rlf)-p31\_grades\left(ttot,regi,"xi1",enty, rlf\right)\right) \cdot \frac{ v31\_fuExtrCum\left(ttot-1,regi,enty, rlf\right)\$\left(ttot.val gt 2005\right) }{ p31\_grades\left(ttot,regi,"xi3",enty, rlf\right) }+ \left(p31\_grades(ttot,regi,"xi2",enty,rlf)-p31\_grades\left(ttot,regi,"xi1",enty, rlf\right)\right) \cdot \frac{ \left(v31\_fuExtrCum(ttot,regi,enty,rlf)-v31\_fuExtrCum(ttot-1,regi,enty,rlf)\$\left(ttot.val gt 2005\right)\right) }{ \left(2 \cdot p31\_grades\left(ttot,regi,"xi3",enty, rlf\right)\right) }\right) \cdot \left( \left(1 + \left(p31\_datafosdyn(regi,enty,rlf,"alph") \cdot \frac{ 1}{\left(sqr\left(pm\_ttot\_val(ttot)-pm\_ttot\_val(ttot-1)\right)\right) } \cdot sqr\left(\frac{\left(vm\_fuExtr(ttot,regi,enty,rlf)-vm\_fuExtr(ttot-1,regi,enty,rlf)\right)}{\left(vm\_fuExtr(ttot-1,regi,enty,rlf)+ 0.001 \cdot p31\_grades(ttot,regi,"xi3",enty,rlf) + p31\_extraseed(ttot,regi,enty,rlf) + 1.e-9\right)}\right) \right)\$\left(ttot.val gt 2005\right) \right) \right) \cdot vm\_fuExtr(ttot,regi,enty,rlf) \right)\$\left(p31\_grades(ttot,regi,"xi3",enty,rlf) gt 0\right) \right) \end{multline*}\]

Cumulated fuel extraction (oil, gas and coal) is the sum of extraction in each time step multiplied by the time step length. If early retirement of oil wells is switched on, any slack capacity from those fields is also added.


q31_fuExtrCum(ttot,regi,pe2rlf(peEx(enty),rlf))$(ttot.val ge cm_startyear)..
        v31_fuExtrCum(ttot,regi,enty,rlf) 
        =e= 
        v31_fuExtrCum(ttot-1,regi,enty,rlf)$(ttot.val gt 2005) + pm_ts(ttot)*(vm_fuExtr(ttot,regi,enty,rlf)
$if %cm_OILRETIRE% == "on"    + v31_fuSlack(ttot,regi,enty,rlf)
        );

These dynamic constraints on the decline and increase rates of production reflect physical and technical inertias of oil, gas and coal Dynamic constraint on decline rate


q31_fuExtrDec(ttot+1,regi,enty2rlf_dec(enty,rlf))$(pm_ttot_val(ttot+1) ge max(2010,cm_startyear))..
         vm_fuExtr(ttot+1,regi,enty,rlf)
$if %cm_OILRETIRE% == "on"    + v31_fuSlack(ttot+1,regi,enty,rlf)
         =g=
          p31_datafosdyn(regi,enty,rlf,"decoffset") * p31_grades(ttot,regi,"xi3",enty,rlf) * 0.5 * ( pm_ts(ttot+1) + pm_ts(ttot) )
$if not setglobal test_TS   + (1-p31_datafosdyn(regi,enty,rlf,"dec"))**(pm_ttot_val(ttot+1)-pm_ttot_val(ttot)) * vm_fuExtr(ttot,regi,enty,rlf);

\[\begin{multline*} v31\_fuSlack(ttot+1,regi,enty,rlf) \leq v31\_fuSlack(ttot,regi,enty,rlf) + \left(pm\_ttot\_val(ttot+1)-pm\_ttot\_val(ttot)\right) \cdot cm\_earlyreti\_rate \cdot 0.3 \cdot p31\_max\_oil\_extraction(regi,enty,rlf) \end{multline*}\]

Dynamic constraint on increase rate


q31_fuExtrInc(ttot+1,regi,enty2rlf_inc(enty,rlf))$((p31_grades(ttot,regi,"xi3",enty,rlf) gt 0) AND (pm_ttot_val(ttot+1) ge max(2010,cm_startyear)))..
         vm_fuExtr(ttot+1,regi,enty,rlf)
         =l=
         (1 + p31_datafosdyn(regi,enty,rlf,"inc"))**(pm_ttot_val(ttot+1)-pm_ttot_val(ttot)) * (vm_fuExtr(ttot,regi,enty,rlf) + p31_datafosdyn(regi,enty,rlf,"incoffset"))
$ifthen.cm_oil_scen %cm_oil_scen% == "highOil"    +(10)$(cm_startyear eq 2015 AND pm_ttot_val(ttot+1) eq 2015 AND ((sameas(enty,"peoil") AND sameas(rlf,"7")) OR (sameas(enty,"pegas") AND sameas(rlf,"6"))))
                                                  +(10)$(cm_startyear eq 2015 AND cm_oil_scen eq 6 AND pm_ttot_val(ttot+1) eq 2015 AND (sameas(enty,"peoil") AND sameas(rlf,"1") AND sameas(regi,"REF")));

  abort "MOFEX did not find an optimal solution. Stopping job...";

Uranium extraction is represented as a 3rd order polynomial parametrized by long-term marginal extraction costs.

\[\begin{multline*} vm\_costFuEx(ttot,regi,enty) = \left( p31\_costExPoly(regi,"xi1",enty) + p31\_costExPoly(regi,"xi2",enty) \cdot v31\_fuExtrCum\left(ttot,regi,enty, "1"\right) + p31\_costExPoly(regi,"xi3",enty) \cdot v31\_fuExtrCum\left(ttot,regi,enty, "1"\right)^{2 }+ p31\_costExPoly(regi,"xi4",enty) \cdot v31\_fuExtrCum\left(ttot,regi,enty, "1"\right)^{3 }\right) \cdot \cdot ' Short term decline and increase rates are determined by adjustment costs. \left(1\$\left(ttot.val eq 2005\right) +\left( \left(1-p31\_fosadjco\_xi5xi6(regi,"xi5",enty)\right) + p31\_fosadjco\_xi5xi6(regi,"xi5",enty) \cdot \left(\frac{\left(vm\_fuExtr(ttot,regi,enty,"1")+1.e-5\right)}{\left(vm\_fuExtr(ttot-1,regi,enty,"1")\$\left(ttot.val gt 2005\right)+1.e-5\right)}\right)^{p31\_fosadjco\_xi5xi6(regi,"xi6",enty) }\right)\$\left(ttot.val gt 2005\right) \right) \cdot vm\_fuExtr(ttot,regi,enty,"1") \end{multline*}\]

Two dummy equations further determine regional uranium extraction bounds.

\[\begin{multline*} v31\_fuExtrMC(enty,"1") = p31\_costExPoly(regi,"xi1",enty) + p31\_costExPoly(regi,"xi2",enty) \cdot v31\_fuExtrCumMax\left(regi,enty, "1"\right) + p31\_costExPoly(regi,"xi3",enty) \cdot v31\_fuExtrCumMax\left(regi,enty, "1"\right)^{2 }+ p31\_costExPoly(regi,"xi4",enty) \cdot v31\_fuExtrCumMax\left(regi,enty, "1"\right)^{3 } \end{multline*}\]

\[\begin{multline*} s31\_max\_disp\_peur = \sum_{regi}\left( v31\_fuExtrCumMax\left(regi,enty, "1"\right)\right) \end{multline*}\]

MOFEX (Model of Fossil Extraction) minimizes the discounted extraction and trade costs of fossils while balancing trade for each time step. The model takes fossil demand, imports and exports from a prior REMIND run as inputs, and it calculates fossil extraction and trade as outputs. In this realization, the output variables are returned to the current REMIND run as starting points for the hybrid optimization.

\[\begin{multline*} \sum_{regi}\left( vm\_Xport(t,regi,trade) - vm\_Mport(t,regi,trade)\right) = 0 \end{multline*}\]

\[\begin{multline*} v31\_MOFEX\_costMinFuelEx = \sum_{ttot\$\left(ttot.val ge cm\_startyear\right)}\left( \sum_{regi}\left(\frac{ pm\_ts(ttot) }{ \left(\left(1 + pm\_prtp(regi)\right)^{\left(pm\_ttot\_val(ttot)-cm\_startyear\right)}\right) } \cdot \left(\sum_{peFos(enty)} vm\_costFuEx(ttot,regi,enty) + \sum_{peFos(enty)}\left( pm\_costsTradePeFinancial(regi,"Mport",enty) \cdot vm\_Mport(ttot,regi,enty)\right) + \sum_{peFos(enty)}\left( \left(pm\_costsTradePeFinancial(regi,"Xport",enty) \cdot vm\_Xport(ttot,regi,enty)\right) \cdot \left(1 +\frac{ pm\_costsTradePeFinancial(regi,"XportElasticity",enty) }{ sqr\left(pm\_ttot\_val(ttot)-pm\_ttot\_val(ttot-1)\right) } \cdot \left(\frac{ vm\_Xport(ttot,regi,enty) }{ \left(vm\_Xport(ttot-1,regi,enty) + pm\_costsTradePeFinancial\left(regi, "tradeFloor",enty\right)\right) }- 1\right) \right) \right) \right) \right) \right) \end{multline*}\]

Fossil fuels are represented by discrete grades based on ranges of marginal extraction costs. The total extraction cost for each time step is calculated based on long-term marginal extraction costs and short-term calibrated adjustment costs which capture inertias, e.g. from infrastructure

\[\begin{multline*} vm\_costFuEx(ttot,regi,enty) = \sum_{pe2rlf(enty,rlf)}\left( \left(\left(p31\_grades\left(ttot,regi,"xi1",enty, rlf\right) + pm\_costsTradePeFinancial(regi,"use",enty) + \left(p31\_grades(ttot,regi,"xi2",enty,rlf)-p31\_grades\left(ttot,regi,"xi1",enty, rlf\right)\right) \cdot \frac{ v31\_fuExtrCum\left(ttot-1,regi,enty, rlf\right)\$\left(ttot.val gt 2005\right) }{ p31\_grades\left(ttot,regi,"xi3",enty, rlf\right) }+ \left(p31\_grades(ttot,regi,"xi2",enty,rlf)-p31\_grades\left(ttot,regi,"xi1",enty, rlf\right)\right) \cdot \frac{ \left(v31\_fuExtrCum(ttot,regi,enty,rlf)-v31\_fuExtrCum(ttot-1,regi,enty,rlf)\$\left(ttot.val gt 2005\right)\right) }{ \left(2 \cdot p31\_grades\left(ttot,regi,"xi3",enty, rlf\right)\right) }\right) \cdot \left( \left(1 + \left(p31\_datafosdyn(regi,enty,rlf,"alph") \cdot \frac{ 1}{\left(sqr\left(pm\_ttot\_val(ttot)-pm\_ttot\_val(ttot-1)\right)\right) } \cdot sqr\left(\frac{\left(vm\_fuExtr(ttot,regi,enty,rlf)-vm\_fuExtr(ttot-1,regi,enty,rlf)\right)}{\left(vm\_fuExtr(ttot-1,regi,enty,rlf)+ 0.001 \cdot p31\_grades(ttot,regi,"xi3",enty,rlf) + p31\_extraseed(ttot,regi,enty,rlf) + 1.e-9\right)}\right) \right)\$\left(ttot.val gt 2005\right) \right) \right) \cdot vm\_fuExtr(ttot,regi,enty,rlf) \right)\$\left(p31\_grades(ttot,regi,"xi3",enty,rlf) gt 0\right) \right) \end{multline*}\]

Cumulated fuel extraction (oil, gas and coal) is the sum of extraction in each time step multiplied by the time step length. If early retirement of oil wells is switched on, any slack capacity from those fields is also added.


q31_fuExtrCum(ttot,regi,pe2rlf(peEx(enty),rlf))$(ttot.val ge cm_startyear)..
        v31_fuExtrCum(ttot,regi,enty,rlf) 
        =e= 
        v31_fuExtrCum(ttot-1,regi,enty,rlf)$(ttot.val gt 2005) + pm_ts(ttot)*(vm_fuExtr(ttot,regi,enty,rlf)
$if %cm_OILRETIRE% == "on"    + v31_fuSlack(ttot,regi,enty,rlf)
        );

These dynamic constraints on the decline and increase rates of production reflect physical and technical inertias of oil, gas and coal Dynamic constraint on decline rate


q31_fuExtrDec(ttot+1,regi,enty2rlf_dec(enty,rlf))$(pm_ttot_val(ttot+1) ge max(2010,cm_startyear))..
         vm_fuExtr(ttot+1,regi,enty,rlf)
$if %cm_OILRETIRE% == "on"    + v31_fuSlack(ttot+1,regi,enty,rlf)
         =g=
          p31_datafosdyn(regi,enty,rlf,"decoffset") * p31_grades(ttot,regi,"xi3",enty,rlf) * 0.5 * ( pm_ts(ttot+1) + pm_ts(ttot) )
$if not setglobal test_TS   + (1-p31_datafosdyn(regi,enty,rlf,"dec"))**(pm_ttot_val(ttot+1)-pm_ttot_val(ttot)) * vm_fuExtr(ttot,regi,enty,rlf);

\[\begin{multline*} v31\_fuSlack(ttot+1,regi,enty,rlf) \leq v31\_fuSlack(ttot,regi,enty,rlf) + \left(pm\_ttot\_val(ttot+1)-pm\_ttot\_val(ttot)\right) \cdot cm\_earlyreti\_rate \cdot 0.3 \cdot p31\_max\_oil\_extraction(regi,enty,rlf) \end{multline*}\]

Dynamic constraint on increase rate


q31_fuExtrInc(ttot+1,regi,enty2rlf_inc(enty,rlf))$((p31_grades(ttot,regi,"xi3",enty,rlf) gt 0) AND (pm_ttot_val(ttot+1) ge max(2010,cm_startyear)))..
         vm_fuExtr(ttot+1,regi,enty,rlf)
         =l=
         (1 + p31_datafosdyn(regi,enty,rlf,"inc"))**(pm_ttot_val(ttot+1)-pm_ttot_val(ttot)) * (vm_fuExtr(ttot,regi,enty,rlf) + p31_datafosdyn(regi,enty,rlf,"incoffset"))
$ifthen.cm_oil_scen %cm_oil_scen% == "highOil"    +(10)$(cm_startyear eq 2015 AND pm_ttot_val(ttot+1) eq 2015 AND ((sameas(enty,"peoil") AND sameas(rlf,"7")) OR (sameas(enty,"pegas") AND sameas(rlf,"6"))))
                                                  +(10)$(cm_startyear eq 2015 AND cm_oil_scen eq 6 AND pm_ttot_val(ttot+1) eq 2015 AND (sameas(enty,"peoil") AND sameas(rlf,"1") AND sameas(regi,"REF")));

  abort "MOFEX did not find an optimal solution. Stopping job...";

Lower bounds on fossil fuel extraction for all time steps To make the model “see” all grades

if(ord(iteration) eq 1,
  loop(regi,
    loop(peFos(enty),
      loop(rlf,
        loop(t,
          if (p31_grades(t,regi,"xi3",enty,rlf) gt 0,
            vm_fuExtr.lo(t,regi,pe2rlf(enty,rlf)) = 1e-9;
          );
        );
      );
    );
  );
);

Special case for grades declining to a zero value Set lower and upper bounds to 0.0 to make the model converge. p31_grades declines linearly whereas vm_fuExtr declines exponentially This particular situation prevent the model from finding a solution [TODO] In the future a small amount should be added to p31_grades to allow for extraction from these grades

if(ord(iteration) eq 1,
  loop(regi,
    loop(peFos(enty),
      loop(rlf,
        if (p31_grades("2005",regi,"xi3",enty,rlf) gt 0.0 and p31_grades("2035",regi,"xi3",enty,rlf) eq 0.0,
          vm_fuExtr.up(t,regi,pe2rlf(enty,rlf))$(rlf.val ge 6) = 0.0;
          vm_fuExtr.lo(t,regi,pe2rlf(enty,rlf))$(rlf.val ge 6) = 0.0;
          vm_fuExtr.up(t,regi,pe2rlf(enty,rlf))$(rlf.val lt 6) = 0.0;
          vm_fuExtr.lo(t,regi,pe2rlf(enty,rlf))$(rlf.val lt 6) = 0.0;
        );
      );
    );
  );
);
if (s31_debug eq 1,
  display vm_fuExtr.lo, vm_fuExtr.up;
);
v31_fuExtrCum.up(t,regi,peExGrade(enty),rlf) = p31_grades(t,regi,"xi3",enty,rlf);

Upper bound on fossil fuel costs

vm_costFuEx.up(t,regi,peExGrade(enty)) = 10.0;

Limitations p31_grades used in equation emissengregi in core/equations.gms, calculation of p31_prod_ini, p31_prod_share in grades/preloop.gms uses additional interfaces (pm_fosadjco_xi7xi8 and vm_edemini) not used

Definitions

Objects

module-internal objects (A: exogenous | B: grades2poly | C: MOFEX | D: timeDepGrades)
  Description Unit A B C D
f31_costExPoly
(all_regi, all_enty, xirog)
3rd-order polynomial coefficients (Uranium) x x
f31_ffPolyCoeffs
(all_regi, all_fossilScen, polyCoeffCost)
3rd-order polynomial coefficients (oil|gas|coal) x
f31_ffPolyCumEx
(all_regi, all_enty, char, all_fossilScen)
Linear rent approx (e.g. Price - average extraction cost) (Oil, Gas and Coal) x
f31_ffPolyRent
(all_regi, all_enty, polyCoeffRent, all_fossilScen)
Linear rent approx (e.g. Price - average extraction cost) (Oil, Gas and Coal) x
p31_costExPoly
(all_regi, xirog, all_enty)
3rd-order polynomial coefficients (Uranium) x x
p31_costfu_detail
(tall, all_regi, all_enty)
(Output) absolute fuel costs for each element of peExPol. Unit: x x
p31_datafosdyn
(all_regi, all_enty, rlf, gradePar31)
(Input) information about exhaustibles according to the grade structure concept. Unit: x x
p31_extraseed
(tall, all_regi, all_enty, rlf)
extra seed value that scales up the ramp-up potential x x
p31_ffPolyCoeffs
(all_regi, all_enty, polyCoeffCost)
3rd-order polynomial coefficents (Oil, Gas and Coal) x
p31_ffPolyRent
(all_regi, all_enty, polyCoeffRent)
Linear rent approx (e.g. Price - average extraction cost) (Oil, Gas and Coal) x
p31_fix_costfu_ex
(tall, all_regi, all_enty)
exogenous data for vm_costFuEx x x
p31_fix_fuelex
(tall, all_regi, all_enty, rlf)
exogenous data for vm_fuExtr x x
p31_fosadjco_xi5xi6
(all_regi, xirog, all_enty)
data and parameters that describe the adjustment cost function of the fossil fuel extraction x x x
p31_fuel_cost
(tall, all_regi, all_enty)
Pure extraction costs x x
p31_fuel_cost_marg
(tall, all_regi, all_enty)
(Output) marginal pure extraction costs, calculated by hand from Nico’s elasticity equation. Unit: x x
p31_fuel_cost_noadj
(tall, all_regi, all_enty)
(Output) fuel cost without adjustment costs. Unit: x x
p31_fuelexIni
(all_regi, all_enty, rlf)
(Bounds) user-defined fossil fuel extraction values in 2005. Unit: TWa x
p31_fuExtrCumMaxBound
(all_regi, all_enty, rlf)
value of regional uranium extraction bound x x
p31_grades
(all_regi, xirog, all_enty, rlf)
dummy x x x
p31_max_oil_extraction
(all_regi, all_enty, rlf)
maximum oil extraction, calculated from the total grade size and the decline constraint. Unit: TWyr x x
p31_MOFEX_cumfex_costMin
(tall, all_regi, all_enty, rlf)
Result of MOFEX calculation: cumulative fuelex x x
p31_MOFEX_fuelex_costMin
(tall, all_regi, all_enty, rlf)
Result of MOFEX calculation: fuelex x x
p31_MOFEX_Mport_costMin
(tall, all_regi, all_enty)
Result of MOFEX calculation: imports x x
p31_MOFEX_Mport_ref
(tall, all_regi, all_enty)
Load imports values from reference GDX x x
p31_MOFEX_peprod_ref
(tall, all_regi, all_enty)
Load PE production level values from reference GDX x x
p31_MOFEX_Xport_costMin
(tall, all_regi, all_enty)
Result of MOFEX calculation: exports x x
p31_MOFEX_Xport_ref
(tall, all_regi, all_enty)
Load exports values from reference GDX x x
p31_prodShare
(all_regi, all_enty, rlf)
(Preloop) minimum amount of primary energy that can be produced given the decline rate. Unit: x x
p31_rentconv
(all_enty)
number of year that the convergence to rentdisc2 takes x
p31_rentdisc
(all_enty)
discount factor for the rent, used for the sensitivity analysis x
p31_rentdisc2
(all_enty)
discount factor for the rent achieved in 2100, used for the sensitivity analysis x
p31_rentdisctot
(ttot, all_enty)
rent discount factor applied to the model x
p31_sol_itr_max parameter for maximum solves for MOFEX x x
q31_costfu_ex2
(ttot, all_regi, all_enty)
costs of fuels estimated by 3rd-order polynomial; Oil, Gas and Coal x
q31_costFuExGrade
(ttot, all_regi, all_enty)
costs of fuels estimated step-wise by grades; exchaustible fuels (oil, gas and coal) x x
q31_costFuExPol
(ttot, all_regi, all_enty)
costs of fuels estimated by 3rd-order polynomial; Uranium only x x
q31_fuExtrCum
(ttot, all_regi, all_enty)
cumulated extraction of exhaustible resources x x x
q31_fuExtrDec
(ttot, all_regi, all_enty, rlf)
lower bound on decline rate of fuel extraction (vm_fuExtr) x x
q31_fuExtrInc
(ttot, all_regi, all_enty, rlf)
upper bound on growth rate of fuel extraction (vm_fuExtr) x x
q31_mc_dummy
(all_regi, all_enty)
marginal costs of fuels estimated by polynomial; exhaustible fuels (uranium) x x
q31_MOFEX_costMinFuelEx Minimization of discounted fossil fuel extraction and trade costs x x
q31_MOFEX_tradebal
(ttot, all_enty)
New trade equation for MOFEX purposes x x
q31_smoothoilphaseout
(ttot, all_regi, all_enty, rlf)
limits the increase of v_fuelslack, leading to a smoother phase-out of oil x x
q31_totfuex_dummy dummy for total global extraction; exhaustible fuels (uranium) x x
s31_debug debugging option to display more output x x x
s31_max_disp_peur maximum amount of cumulative uranium production in Megatonnes of metal uranium ( U3O8, the stuff that is traded at 40-60US$/lb). x x
v31_fuExtrCum
(ttot, all_regi, all_enty, rlf)
cumulated extraction of exhaustible resources x x x
v31_fuExtrCumMax
(all_regi, all_enty, rlf)
maximum of cumulated extraction of exhaustible resources x x
v31_fuExtrMC
(all_enty, rlf)
MC exhaustible resources x x
v31_fuSlack
(ttot, all_regi, all_enty, rlf)
Amount of oil that is not extracted but put aside never to be used again. Unit: TWa/a x x
v31_MOFEX_costMinFuelEx Minimization of discounted fossil fuel extraction and trade costs x x
v31_squaredDiff objective for dummy model to determine uranium bound x

Sets

sets in use
  description
all_enty all types of quantities
all_fossilScen all possible scenarios for fossils
all_regi all regions
char characteristics of technologies
enty(all_enty) all types of quantities
enty2rlf_dec(all_enty, rlf) mapping for applying constraint on decline rate of vm_fuExtr
enty2rlf_inc(all_enty, rlf) mapping for applying constraint on growth rate of vm_fuExtr (see module 31_fossil)
gradePar31 parameters of the equations for fossil grades
in(all_in) All inputs and outputs of the CES function
iteration iterator for main (Negishi/Nash) iterations
modules all the available modules
pe2rlf(all_enty, rlf) map exhaustible energy to grades for qm_fuel2pe
peEx(all_enty) exhaustible primary energy carriers
peExGrade(all_enty) exhaustible pe with step as entyPe ex-peExPol - s.b.
peExPol(all_enty) primary energy fuels with polynomial
peFos(all_enty) primary energy fossil fuels
polyCoeffCost Coefficients of 3rd-order polynomial used to represent extraction cost functions (Oil, Gas and Coal)
polyCoeffRent Coefficients of 1st-order polynomial used to represent extraction cost functions (Oil, Gas and Coal)
regi(all_regi) all regions used in the solution process
rlf cost levels of fossil fuels
sol_itr iterator for inner solution process within one Negishi iteration
t(ttot) modeling time, usually starting in 2005, but later for fixed delay runs
t0(tall) start of modelling time, not optimization
tall time index
trade(all_enty) All traded commodities
ttot(tall) time index with spin up
xirog parameters decribing exhaustible extraction coss including long-run marginal costs and short term adjustment costs

Authors

Nico Bauer, Jerome Hilaire, Robert Pietzcker, Lavinia Baumstark

See Also

02_welfare, 24_trade, core

References