co2mge.gms : Carbon-related trade model (static)

Description

Carbon-Related Trade Model (static).


Large Model of Types : MPSGE mcp


Category : GAMS Model library


Main file : co2mge.gms

$title Carbon-Related Trade Model (static) (CO2MGE,SEQ=142)

$onText
Carbon-Related Trade Model (static).


Perroni, C, and Rutherford, T F, International Trade in Carbon Emission Rights
and Basic Materials: General Equilibrium Calculations for 2020.
Scandinavian Journal of Economics 95, 3 (1993), 257-278.

Keywords: mixed complementarity problem, general equilibrium model, Carbon dioxide emissions
          international trade, emission, forecasting, greenhouse gases
$offText

Set
   SCENARIOS     'scenarios used for graphs in paper'
                 / BENCH,  GLOBAL-B, GLOBAL-E, GLOBAL-T, GLOBAL
                   OECD-B, OECD-E,   OECD-L,   OECD-T,   OECD   /
   SC(SCENARIOS) 'single scenario to run here' / OECD-L /
   R             'regions' / USA 'USA'
                             OEC 'OECD countries'
                             SUE 'Soviet Union and Eastern Europe'
                             CHN 'China'
                             ROW 'Rest of the World'               /
   OECD(R) 'OECD regions'  / USA, OEC /
   ES      'ETA sectors'   / HYDR 'Global 2100 electric sector HYDRO'
                             COLR 'Global 2100 electric sector COAL-R'
                             NUCR 'Global 2100 electric sector NUC-R'
                             GASN 'Global 2100 electric sector GAS-N'
                             COLN 'Global 2100 electric sector COAL-N'
                             ADVL 'Global 2100 electric sector ADV-LC'
                             ADVH 'Global 2100 electric sector ADV-HC'
                             NEBK 'Global 2100 non-electric sector NE-BAK'
                             RNEW 'Global 2100 non-electric sector RNEW'
                             SYNF 'Global 2100 non-electric sector SYNF'
                             CLDU 'Global 2100 non-electric sector CLDU'
                             OILM 'Global 2100 non-electric sector OILMX'
                             OILX 'Global 2100 non-electric sector OILMX'
                             OILL 'Global 2100 non-electric sector OIL-LC'
                             OILH 'Global 2100 non-electric sector OIL-HC'
                             GASL 'Global 2100 non-electric sector GAS-LC'
                             GASH 'Global 2100 non-electric sector GAS-HC'
                             GNEL 'Global 2100 non-electric sector GNEL'   /
   ET(ES)  'electric technologies'
           / HYDR, COLR, NUCR, GASN, COLN, ADVL, ADVH /
   NT(ES)  'non-electric technologies'
           / NEBK, RNEW, SYNF, CLDU, OILM, OILX, OILL, OILH, GNEL /
   GS(ES)  'gas supply technologies'
           / GASL, GASH /
   G       'goods' / DOME 'non-basic production (Y)'
                     DOMI 'K-L-E-N-BSMA aggregate in non-basic production'
                     BSMA 'basic materials'
                     NELE 'non-electric energy'
                     ELEC 'electric energy'
                     RESR 'basic material resource'
                     SBVA 'basic material intermediate inputs'
                     GASS 'gas supply'
                     CRTS 'CO2 emission rights'
                     OILT 'internationally traded oil'
                     UBND 'upper bounds'
                     LBND 'lower bounds'
                     KSPC 'specific capital'
                     KLVA 'capital-labor value added'                      /
   MS      'macro sectors' / CONS 'Regional consumer'
                             SDOM 'DOME production'
                             SDMI 'DOMI production'
                             SBSM 'BSMA production'
                             SBVA 'BSMA intermediate production'
                             DOMX 'DOME exports'
                             DOMM 'DOME imports'
                             BSMX 'BSMA exports'
                             BSMM 'BSMA imports'
                             CO2X 'Carbon rights export'
                             CO2M 'Carbon rights import'
                             IMEX 'Current account balance'
                             ETAG 'Aggregated ETA sector'        /
   TP          'time periods' / BASE, FUTURE /
   EG(G)       'ETA input goods'
   BE(G)       'basic energy goods'
   OILM(ES)    'oil import sector'
   OILX(ES)    'oil export sector'
   UPPER(ES,R) 'ETA activities with active upper bounds'
   LOWER(ES,R) 'ETA activities with active lower bounds'
   FIXED(ES,R) 'ETA activities fixed'
   BASIC(ES,R) 'ETA activities operated between bounds';

Alias (R,RR);

EG(G)        =  no;
EG("NELE")   = yes;
EG("ELEC")   = yes;
EG("GASS")   = yes;
OILM(ES)     =  no;
OILM("OILM") = yes;
OILX(ES)     =  no;
OILX("OILX") = yes;
BE(G)        =  no;
BE("NELE")   = yes;
BE("ELEC")   = yes;

Scalar
   BYR 'base year'   / 1990 /
   FYR 'future year' / 2020 /;

Table BYD(R,*) 'base year macro data (1990).'
* GDP   Gross Domestic product (US$ billions)
* PN    Reference non-electric price ($ per MBTU).
* QN    Total non-electric energy (MBTU)
* QE    Total electric energy (TKWH)
* BMAM  Basic materials imports (US$ millions)
           GDP  ELVS   PN      QN     QE  BMAM
   USA    5.60  0.33  3.5  51.335  2.661    10
   OEC   10.20  0.33  4.0  50.858  3.288   -66
   SUE    2.68  0.33  2.0  47.207  1.406     4
   CHN    1.10  0.33  2.0  22.610  0.541     4
   ROW    3.34  0.33  2.0  49.870  2.111    49;

Table FYD(R,*) 'future year data'
* GDP  Gross Domestic product (US$ billions)
* PN   Reference non-electric price ($ per MBTU).
* PE   Reference electric price ($ per TKWH).
* PG   Reference price natural gas ($ per MBTU).
* PO   Reference price of oil ($ per MBTU).
            GDP    PN    PE   PG   PO
   USA   10.431  11.0  51.0  6.1  9.0
   OEC   19.788  11.0  51.0  6.1  9.0
   SUE    4.950   9.0  51.0  5.0  9.0
   CHN    3.698   9.0  51.0  4.8  9.0
   ROW    8.615   9.0  51.0  4.8  9.0;

Table ELTECH(ET,R,*) 'electric technology data.'
* COST    US $ per TKWH
* CARBON  CO2 emission rate (tons per TKWH).
* GAS     Gas inputs (MBTU per TKWH).
              COST  CARBON    GAS
   HYDR.USA    2.6
   HYDR.OEC    2.6
   HYDR.SUE    2.6
   HYDR.CHN    2.1
   HYDR.ROW    3.6

   COLR.USA   20.1  0.2779
   COLR.OEC   23.2  0.2844
   COLR.SUE   20.1  0.2680
   COLR.CHN   26.1  0.2776
   COLR.ROW   27.9  0.3600

   NUCR.USA   20.6
   NUCR.OEC   20.6
   NUCR.SUE   20.6
   NUCR.CHN   18.2
   NUCR.ROW   25.4

* NOTE: THESE COSTS ARE REDUCED TO AVOID BENCHMARK LOSS:
   GASN.USA   12.0          7.500
   GASN.OEC   12.0          7.500
   GASN.SUE   12.0          7.500
   GASN.CHN   12.0          7.500
   GASN.ROW   15.0          7.500

   COLN.USA   51.0  0.2533
   COLN.OEC   51.0  0.2533
   COLN.SUE   51.0  0.2533
   COLN.CHN   51.0  0.2533
   COLN.ROW   51.0  0.2533

   ADVH.USA   75.0
   ADVH.OEC   75.0
   ADVH.SUE   75.0
   ADVH.CHN   75.0
   ADVH.ROW   75.0

   ADVL.USA   50.0
   ADVL.OEC   50.0
   ADVL.SUE   50.0
   ADVL.CHN   50.0
   ADVL.ROW   50.0               ;

Table GASTECH(GS,R,*) 'gas supply data.'
* COST    US $ per MBTU
* CARBON  CO2 emission rate (tons per MBTU).
              COST   CARBON
   GASL.USA    1.5  0.01374
   GASL.OEC    1.5  0.01374
   GASL.SUE    1.5  0.01374
   GASL.CHN    1.5  0.01374
   GASL.ROW    0.5  0.01374

   GASH.USA    5.0  0.01374
   GASH.OEC    5.0  0.01374
   GASH.SUE    5.0  0.01374
   GASH.CHN    5.0  0.01374
   GASH.ROW    5.0  0.01374;

Table NETECH(NT,R,*) 'non-electric technology data.'
* COST    US $ per MBTU
* CARBON  CO2 emission rate (tons per MBTU).
* GAS     Natural gas inputs (MBTU per MBTU).
* OILT    Oil trade coefficient (MBTU export per unit activity)
                COST    CARBON    GAS    OILT
   NEBK.USA   16.667
   NEBK.OEC   16.667
   NEBK.SUE   16.667
   NEBK.CHN   16.667
   NEBK.ROW   16.667

   RNEW.USA    6.000
   RNEW.OEC    6.000
   RNEW.SUE    6.000
   RNEW.CHN    6.000
   RNEW.ROW    6.000

   SYNF.USA    8.333   0.04
   SYNF.OEC    8.333   0.04
   SYNF.SUE    8.333   0.04
   SYNF.CHN    8.333   0.04
   SYNF.ROW    8.333   0.04

   CLDU.USA    2.0     0.02412
   CLDU.OEC    3.0     0.02412
   CLDU.SUE    2.0     0.02412
   CLDU.CHN    2.0     0.02412
   CLDU.ROW    2.0     0.02412

   OILM.USA            0.01994         -1.000
   OILM.OEC            0.01994         -1.000
   OILM.SUE            0.01994         -1.000
   OILM.CHN            0.01994         -1.000
   OILM.ROW            0.01994         -1.000

   OILX.USA           -0.01994          1.000
   OILX.OEC           -0.01994          1.000
   OILX.SUE           -0.01994          1.000
   OILX.CHN           -0.01994          1.000
   OILX.ROW           -0.01994          1.000

   OILL.USA    2.5     0.01994
   OILL.OEC    2.5     0.01994
   OILL.SUE    2.5     0.01994
   OILL.CHN    2.5     0.01994
   OILL.ROW    1.0     0.01994

   OILH.USA    6.0     0.01994
   OILH.OEC    6.0     0.01994
   OILH.SUE    6.0     0.01994
   OILH.CHN    6.0     0.01994
   OILH.ROW    6.0     0.01994

* Note: these costs have been reduced relative to
* the Global 2100 numbers.
   GNEL.USA    1.0              1.000
   GNEL.OEC    1.0              1.000
   GNEL.SUE    1.0              1.000
   GNEL.CHN    1.0              1.000
   GNEL.ROW    1.0              1.000;

Table ELSUPPLY(ET,R,*) 'electric supplies bounds and elasticities.'
* UBND  Upper bound (TKWH).
* LBND  Lower bound (TKWH).
* LVL   Reference output level for 2020 (TKWH).
* ESUP  Elasticity of supply for activities operating in 2020.
               UBND   LBND    LVL   ESUP
   HYDR.USA   0.190  0.190  0.190
   HYDR.OEC   0.835  0.835  0.835
   HYDR.SUE   0.213  0.213  0.213
   HYDR.CHN   0.099  0.099  0.099
   HYDR.ROW   0.452  0.452  0.452

   COLR.USA   0.740         0.740  1.000
   COLR.OEC   0.458         0.458  1.000
   COLR.SUE   0.096         0.096  1.000
   COLR.CHN   0.191         0.191  1.000
   COLR.ROW   0.430         0.430  1.000

   NUCR.USA   0.280         0.280
   NUCR.OEC   0.424         0.424
   NUCR.SUE   0.157         0.105  1.000

   GASN.USA   3.200         0.072  1.000
   GASN.OEC   3.200         0.072  1.000
   GASN.SUE   3.200         0.289  1.000
   GASN.CHN   3.200         0.072  1.000
   GASN.ROW   3.200         0.072  1.000

   COLN.USA    +INF         2.985  1.000
   COLN.OEC    +INF         2.995  1.000
   COLN.SUE    +INF         2.102  1.000
   COLN.CHN    +INF         1.703  1.000
   COLN.ROW    +INF         4.238  1.000

   ADVL.USA     0.1         0.100  1.000
   ADVL.OEC     0.2         0.198  1.000
   ADVL.SUE     0.1         0.100  1.000
   ADVL.CHN     0.1         0.100  1.000
   ADVL.ROW     0.1         0.100  1.000

   ADVH.USA     0.8
   ADVH.OEC     1.5
   ADVH.SUE     0.8
   ADVH.CHN     0.8
   ADVH.ROW     0.8                     ;

Table NESUPPLY(NT,R,*) 'non-electric supplies bounds and elasticities.'
* UBND  Upper bound (MBTU).
* LBND  Lower bound (MBTU).
* LVL   Reference output level for 2020 (MBTU).
* ESUP  Elasticity of supply for activities operating in 2020.
                UBND  LBND     LVL   ESUP
   CLDU.USA    2.740         2.740
   CLDU.OEC    5.250         5.250
   CLDU.SUE   11.440        11.440
   CLDU.CHN   17.590        17.590
   CLDU.ROW   12.230        12.230

   NEBK.USA     +INF
   NEBK.OEC     +INF
   NEBK.SUE     +INF
   NEBK.CHN     +INF
   NEBK.ROW     +INF

   RNEW.USA     10.0        10.000
   RNEW.OEC     10.0        10.000
   RNEW.SUE     10.0         5.254  1.000
   RNEW.CHN     10.0         5.293  1.000
   RNEW.ROW     10.0         9.695  1.000

   SYNF.USA     +INF         2.926  1.000
   SYNF.OEC     +INF         2.617  1.000
   SYNF.CHN     +INF         0.851  1.000
   SYNF.ROW     +INF         0.426  1.000

   OILM.USA     +INF        27.909
   OILM.OEC     +INF        24.825

   OILX.SUE      3.0           3.0
   OILX.CHN      0.6           0.6
   OILX.ROW     +INF        49.134

   OILL.USA    8.223         8.223
   OILL.OEC    8.295         8.295
   OILL.SUE   15.369        15.369
   OILL.CHN    5.504         5.504
   OILL.ROW   59.465        59.465

   OILH.USA     +INF         3.027  1.000
   OILH.OEC     +INF         4.442  1.000
   OILH.SUE     +INF         1.041  1.000
   OILH.CHN     +INF         3.588  1.000
   OILH.ROW     +INF        19.947  1.000

* NB: GNEL NUMBERS ADJUSTED SLIGHTLY TO ACHIEVE GAS MARKET BALANCE:
   GNEL.USA     +INF        10.720  1.000
   GNEL.OEC     +INF        17.302  1.000
   GNEL.SUE     +INF        25.507  1.000
   GNEL.CHN     +INF         4.026  1.000
   GNEL.ROW     +INF        37.648  1.000;

Table GASSUPPLY(GS,R,*) 'natural gas supplies bounds and elasticities.'
* UBND  Upper bound (MBTU).
* LBND  Lower bound (MBTU).
* LVL   Reference output level for 2020 (MBTU).
* ESUP  Elasticity of supply for activities operating in 2020.
                UBND  LBND     LVL   ESUP
   GASL.USA    8.148         8.148
   GASL.OEC   12.546        12.546
   GASL.SUE   27.675        27.675
   GASL.CHN    2.441         2.441
   GASL.ROW   22.831        22.831

   GASH.USA     +INF         3.112  1.000
   GASH.OEC     +INF         5.296  1.000
   GASH.CHN     +INF         2.125  1.000
   GASH.ROW     +INF        15.357  1.000;

Set ETACOL / GASOUT, GASINP,  NELEOUT, NELEINP, ELECOUT, ELECINP, OILEXP
             OILIMP, CARBOUT, CARBINP, YOUT,    YINP,    KINP            /;

Parameter
   GDP(R,TP)        'domestic GDP'
   GDPGR(R)         'GDP growth factor'
   PN(R,TP)         'reference price of non-electric'
   PE(R,TP)         'reference price of electric'
   PG(R,TP)         'reference price of gas'
   PO(R,TP)         'reference price of oil'
   QN(R,TP)         'non-electric energy production'
   QE(R,TP)         'electric energy production'
   BMAM(R)          'basic materials imports (base year)'
   ELVS(R)          'electricity value share'
   BDRT(R)          'basic materials share of domestic product'
   NBSH(R)          'non-electric value share of basic materials'
   EBSH(R)          'electric value share of basic materials'
   RSHR(R)          'resource share of basic materials (calibrated)'
   BDEL(R)          'basic-GDP growth elasticity'
   ELEC(ES,R)       'electricity supply'
   NELE(ES,R)       'non-electric supply'
   GASS(ES,R)       'gas supply'
   OILT(ES,R)       'oil trade'
   UBND(ES,R)       'energy sector upper bound'
   LBND(ES,R)       'energy sector lower bound'
   LEVL(ES,R)       'reference activity level'
   COST(ES,R)       'domestic inputs to energy production'
   CARBON(ES,R)     'carbon coefficient'
   ESUP(ES,R)       'elasticity of supply'
   QB(R)            'BMAT benchmark quantity'
   QG(R)            'BMAT benchmark quantity'
   QD(R)            'BMAT benchmark quantity'
   PNI(R)           'future price index'
   PEI(R)           'future price index'
   PGI(R)           'future price index'
   PDI(R)           'future price index'
   PBI(R)           'future price index'
   BMESHR(R,G)      'basic materials share of domestic energy (%)'
   GDPSHR(R,G)      'cost shares of GDP (%)'
   DOMSHR(R,G)      'cost shares in gross output (%)'
   BMMSHR(R)        'basic material import share of consumption (%)'
   MX(R,MS,G)       'macro accounts for future year'
   ROWSUM(G,R)      'row sum check for macro accounts'
   COLSUM(MS,R)     'column sum check for macro accounts'
   EX(R,ES,G)       'ETA accounts for future year'
   GASBAL(R)        'check of gas market balance'
   BMCHK(G)         'check of world market balance'
   BMCRTS(R)        'benchmark CRTS'
   PCTPFT(ES,R)     'unit profit margin in benchmark'
   PROFIT(ES,R)     'adjusted ETA profits'
   UNITPROFIT(ES,R) 'adjusted ETA profits per unit activity'
   BMPROFIT(ES,R)   'benchmark ETA profits'
   NETLOSS(ES,R)    'benchmark loss'

* PARAMETERS USED IN MODEL PRESENTATION:
   ESUBB(R)         'energy-other input substitution in B'
   ESUBC(R)         'substitution elasticity in Y'
   Y0(R)            'non-energy output'
   W0(R)            'non-ernery demand'
   NY0(R)           'non-electric energy input to Y'
   EY0(R)           'electric energy input to Y'
   VY0(R)           'value-added input to Y'
   BY0(R)           'basic materials input to Y'
   B0(R)            'basic materials production'
   RB0(R)           'resource inputs to B'
   NB0(R)           'non-electric energy input to B'
   EB0(R)           'electric energy input to Y'
   VB0(R)           'value-added input to Y'
   ETA(R,ES,ETACOL) 'energy technology'
   CRTS_N(R)        'Carbon rights allocation (non-traded)'
   CRTS_T(R)        'Carbon rights allocation (traded)'
   VA0(R)           'regional value-added endowment'
   EMIT0(*)         'benchmark emissions'
   CO2EMIT(*)       'CO2 emissions'
   RESULTS          'results summary';

Scalar
   NYR     'number of years projected'
   OILBAL  'check of world oil market balance'
   BMATBAL 'check of basic materials trade balance'
   BMATFAC 'BMAT growth factor'
   BEPS    'epsilon for diagnosing bounds' / 1.E-5 /
   ALPHA   'calibrated DOME value share';

Set LVL 'emission levels' / L1*L6 /;

Parameter CO2LEVEL(LVL) 'CO2 abatement levels'
                        / L1 1.2, L2 1.1, L3 1.0, L4 0.9, L5 0.8, L6 0.7 /;

Table CARBLIM(R,*) 'Carbon emissions limits and CRTS trade flag.'
         LEVEL  TRADE
   USA   1.144      0
   OEC   1.100      0
   SUE   0.844      0
   CHN   0.962      0
   ROW   2.253      0;

Table BMATPROD(R,*) 'basic materials production data.'
* NBSH  Non-electric share of basic materials cost.
* EBSH  Electric share of basic materials cost.
* BDRT  Basic-GDP ratio.
* BDEL  Basic materials : GDP growth elasticity.
          NBSH   EBSH   BDRT  BDEL
   USA   0.070  0.070  0.125   0.6
   OEC   0.070  0.070  0.125   0.6
   SUE   0.070  0.070  0.200   0.8
   CHN   0.070  0.070  0.200   0.8
   ROW   0.070  0.070  0.125   0.8;

Table ELAST(R,*) 'elasticities of substitution and supply'
* ESUBC  Elasticity of substitution in non-basic production.
* ESUBB  Elasticity of substitution in basic materials production.
* ELEC   Elasticity of supply for operating electric technologies.
* NELE   Elasticity of supply for operating non-electric technologies.
* GAS    Elasticity of supply for operating gas technologies.
* BMAT   Elasticity of supply for basic materials.
         ESUBC  ESUBB  ELEC  NELE  GAS  BMAT
   USA    0.5     0.3   1.0   1.0  1.0   1.0
   OEC    0.5     0.3   1.0   1.0  1.0   1.0
   SUE    0.25    0.3   1.0   1.0  1.0   1.0
   CHN    0.25    0.3   1.0   1.0  1.0   1.0
   ROW    0.25    0.3   1.0   1.0  1.0   1.0;

* VERIFY THAT EXACTLY ONE COUNTERFACTUAL SCENARIO HAS BEEN SELECTED:
abort$(sum(SCENARIOS$SC(SCENARIOS), 1) <> 1) " A SINGLE SCENARIO NOT SELECTED";

if(SC("BENCH"),
$sTitle: Carbon-related Trade Model - Benchmark Replication
   CARBLIM(R,"LEVEL")           = +inf;
   CO2LEVEL(LVL)$(ord(LVL) > 1) = 0;
);
if(SC("OECD-L"),
$sTitle: Carbon-related Trade Model - OECD Abatement with high Leakage
   CARBLIM(R,"LEVEL")$(not OECD(R)) = +inf;
   CARBLIM(OECD,"TRADE") = 1;
   ELAST(R,"BMAT")  = 4;
   ELAST(R,"ESUBC") = 2*ELAST(R,"ESUBC");
   ELAST(R,"ESUBB") = 2*ELAST(R,"ESUBB");
);
if(SC("GLOBAL-E"),
$sTitle: Carbon-related Trade Model - Global Abatement with low Elasticity
   CARBLIM(R,"TRADE") = 1;
   ELAST(R,"ESUBC")   = 0.5*ELAST(R,"ESUBC");
   ELAST(R,"ESUBB")   = 0.5*ELAST(R,"ESUBB");
);
if(SC("GLOBAL-T"),
$sTitle: Carbon-related Trade Model - Global Abatement with Trade in CRTS
   CARBLIM(R,"TRADE") = 1;
);
if(SC("GLOBAL"),
$sTitle: Carbon-related Trade Model - Global Abatement with no Trade in CRTS
);
if(SC("OECD-B"),
$sTitle: Carbon-related Trade Model - OECD Abatement with high BMAT Elasticity
   CARBLIM(R,"LEVEL")$(not OECD(R)) = +inf;
   CARBLIM(OECD,"TRADE") = 1;
   ELAST(R,"BMAT")       = 4;
);
if(SC("OECD-E"),
$sTitle: Carbon-related Trade Model - OECD Abatement with low Elasticities
   CARBLIM(R,"LEVEL")$(not OECD(R)) = +inf;
   CARBLIM(OECD,"TRADE") = 1;
   ELAST(R,"ESUBC")      = 0.5*ELAST(R,"ESUBC");
   ELAST(R,"ESUBB")      = 0.5*ELAST(R,"ESUBB");
);
if(SC("OECD-L"),
$sTitle: Carbon-related Trade Model - OECD Abatement with high Leakage
   CARBLIM(R,"LEVEL")$(not OECD(R)) = +inf;
   CARBLIM(OECD,"TRADE") = 1;
   ELAST(R,"BMAT")  = 4;
   ELAST(R,"ESUBC") = 2*ELAST(R,"ESUBC");
   ELAST(R,"ESUBB") = 2*ELAST(R,"ESUBB");
);
if(SC("OECD-T"),
$sTitle: Carbon-related Trade Model - OECD Abatement with Trade
   CARBLIM(R,"LEVEL")$(not OECD(R)) = +inf;
   CARBLIM(OECD,"TRADE") = 1;
);
if(SC("OECD"),
$sTitle: Carbon-related Trade Model - OECD Abatement with no Trade in CRTS
   CARBLIM(R,"LEVEL")$(not OECD(R)) = +inf;
);

* BENCHMARKING BEGINS HERE:
* ========================
NYR = FYR - BYR;

GDP(R,"BASE") = BYD(R,"GDP");
PN(R,"BASE")  = BYD(R,"PN");
QN(R,"BASE")  = BYD(R,"QN");
QE(R,"BASE")  = BYD(R,"QE");
ELVS(R)       = BYD(R,"ELVS");
BMAM(R)       = 0.001*BYD(R,"BMAM");

BDRT(R) = BMATPROD(R,"BDRT");
NBSH(R) = BMATPROD(R,"NBSH");
EBSH(R) = BMATPROD(R,"EBSH");
BDEL(R) = BMATPROD(R,"BDEL");

GDP(R,"FUTURE") = FYD(R,"GDP");
PN(R, "FUTURE") = FYD(R,"PN");
PE(R, "FUTURE") = FYD(R,"PE");
PG(R, "FUTURE") = FYD(R,"PG");
PO(R, "FUTURE") = FYD(R,"PO");

ELEC(ET,R)   =  1;
NELE(NT,R)   =  1;
NELE(OILX,R) = -1;
GASS(GS,R)   =  1;
GASS(ET,R)   = -ELTECH(ET,R,"GAS");
GASS(NT,R)   = -NETECH(NT,R,"GAS");
COST(ET,R)   =  ELTECH(ET,R,"COST");
COST(NT,R)   =  NETECH(NT,R,"COST");
COST(GS,R)   =  GASTECH(GS,R,"COST");
CARBON(ET,R) =  ELTECH(ET,R,"CARBON");
CARBON(NT,R) =  NETECH(NT,R,"CARBON");
CARBON(GS,R) =  GASTECH(GS,R,"CARBON");
OILT(NT,R)   =  NETECH(NT,R,"OILT");

UBND(ET,R)   = ELSUPPLY(ET,R,"UBND");
LBND(ET,R)   = ELSUPPLY(ET,R,"LBND");
LEVL(ET,R)   = ELSUPPLY(ET,R,"LVL");
ESUP(ET,R)   = ELSUPPLY(ET,R,"ESUP")*ELAST(R,"ELEC");

UBND(NT,R)   = NESUPPLY(NT,R,"UBND");
LBND(NT,R)   = NESUPPLY(NT,R,"LBND");
LEVL(NT,R)   = NESUPPLY(NT,R,"LVL");
ESUP(NT,R)   = NESUPPLY(NT,R,"ESUP")*ELAST(R,"NELE");

UBND(GS,R)   = GASSUPPLY(GS,R,"UBND");
LBND(GS,R)   = GASSUPPLY(GS,R,"LBND");
LEVL(GS,R)   = GASSUPPLY(GS,R,"LVL");
ESUP(GS,R)   = GASSUPPLY(GS,R,"ESUP")*ELAST(R,"GAS");

* Benchmark calculations for the Carbon Trade model.
* Check ETA data consistency:
abort$(smax((ES,R), LBND(ES,R) - UBND(ES,R)) > 0)
   " *** ERROR: ETA SUPPLY LOWER BOUND EXCEEDS UPPER BOUND";
abort$(smax((ES,R), LEVL(ES,R) - UBND(ES,R)) > 0)
   " *** ERROR: ETA BENCHMARK SUPPLY EXCEEDS UPPER BOUND";
abort$(smax((ES,R), LBND(ES,R)-  LEVL(ES,R)) > 0)
   " *** ERROR: ETA BENCHMARK SUPPLY VIOLATES LOWER BOUND";

BMATBAL = sum(R, BMAM(R));
abort$(abs(BMATBAL) > 0.01) " Imbalance in BMAT trade data.", BMAM, BMATBAL;

GASBAL(R) = sum(ES, GASS(ES,R)*LEVL(ES,R));
abort$(smax(R, abs(GASBAL(R))) > 0.01) " Gas supply - demand imbalance.", GASBAL;

OILBAL = sum((R,ES), OILT(ES,R)*LEVL(ES,R));
abort$(OILBAL > 0.01) " International oil market imbalance.", OILBAL;

* DATA ADJUSTMENTS:

* Impose balance in basic materials trade:
loop(R$(ord(R) = 1), BMAM(R) = BMAM(R) - BMATBAL;);

* Check gas supply-demand balances and adjust GNEL accordingly:
LEVL("GNEL",R) = LEVL("GNEL",R) - GASBAL(R)/LEVL("GNEL",R);

* Assign oil trade discrepency to first region:
loop(R$(ord(R) = card(R)),
   LEVL("OILX",R) = LEVL("OILX",R) - OILBAL/LEVL("OILX",R);
   UBND("OILX",R) = min( UBND("OILX",R), LEVL("OILX",R));
);

* ETA CALIBRATION AND BENCHMARK:
* Initialize the ETA SAM:
EX(R,ES,G) = 0;

* Pull out coefficients (value):
EX(R,ES,"NELE") =  PN(R,"FUTURE")*NELE(ES,R)/1000;
EX(R,ES,"ELEC") =  PE(R,"FUTURE")*ELEC(ES,R)/1000;
EX(R,ES,"GASS") =  PG(R,"FUTURE")*GASS(ES,R)/1000;
EX(R,ES,"OILT") =  PO(R,"FUTURE")*OILT(ES,R)/1000;
EX(R,ES,"DOME") = -COST(ES,R)/1000;

* Compute benchmark profit (per unit activity):
BMPROFIT(ES,R) = sum(G, EX(R,ES,G));

NETLOSS(ES,R) = min(LEVL(ES,R)*(BMPROFIT(ES,R) - EX(R,ES,"DOME")), 0);
abort$(smin((ES,R), NETLOSS(ES,R)) < 0)
   " --- BENCHMARK PROFIT INCONSISTENCY", BMPROFIT, NETLOSS, COST, EX;

* Define arrays which indicate the benchmark state of ETA activities:
FIXED(ES,R) = yes$(UBND(ES,R) < LBND(ES,R) + BEPS);
LEVL(ES,R)$FIXED(ES,R) = LBND(ES,R);
UBND(ES,R)$FIXED(ES,R) = LBND(ES,R);

UPPER(ES,R)$(not FIXED(ES,R)) = yes$(LEVL(ES,R) > UBND(ES,R) - BEPS);
LOWER(ES,R)$(not FIXED(ES,R)) = yes$(LEVL(ES,R) < LBND(ES,R) + BEPS);
BASIC(ES,R) = yes$(not (FIXED(ES,R) + UPPER(ES,R) + LOWER(ES,R)));

* Check that activities at bounds have appropriate profits:
abort$(smin((ES,R)$UPPER(ES,R), BMPROFIT(ES,R)) < 0)
   " Upper bounded activity makes negative profit:", BMPROFIT, UPPER;

abort$(smax((ES,R)$LOWER(ES,R), BMPROFIT(ES,R)) > 0)
   " Lower bounded activity makes positive profit:", BMPROFIT, LOWER;

* Calibrate the supply functions:
loop((ES,R)$FIXED(ES,R),
   EX(R,ES,"KSPC") = 0;
   EX(R,ES,"UBND") = -BMPROFIT(ES,R);
   EX(R,ES,"LBND") = 0;
);

loop((ES,R)$(not FIXED(ES,R)),
   if(BASIC(ES,R),
      ALPHA = ESUP(ES,R)/(1 + ESUP(ES,R));
      EX(R,ES,"KSPC") = (-BMPROFIT(ES,R) + EX(R,ES,"DOME"))*(1 - ALPHA);
      EX(R,ES,"DOME") = ALPHA*EX(R,ES,"KSPC")/(1 - ALPHA);
      EX(R,ES,"UBND") = 0;
      EX(R,ES,"LBND") = 0;
   else
      if(ESUP(ES,R)*LEVL(ES,R) > 0,
         ALPHA = ESUP(ES,R)/(1 + ESUP(ES,R));
         EX(R,ES,"KSPC") = (-BMPROFIT(ES,R) + EX(R,ES,"DOME"))*(1 - ALPHA);
         EX(R,ES,"DOME") = ALPHA*EX(R,ES,"KSPC")/(1 - ALPHA);
         EX(R,ES,"UBND") = 0;
         EX(R,ES,"LBND") = 0;
      else
         EX(R,ES,"KSPC") = 0;
         EX(R,ES,"UBND")$UPPER(ES,R) = -BMPROFIT(ES,R);
         EX(R,ES,"LBND")$LOWER(ES,R) =  BMPROFIT(ES,R);
      );
   );
);

UNITPROFIT(ES,R)$(not FIXED(ES,R)) = sum(G, EX(R,ES,G));
PROFIT(ES,R)    $(not FIXED(ES,R)) = LEVL(ES,R)*sum(G, EX(R,ES,G));

display BMPROFIT, PROFIT, UNITPROFIT, EX, FIXED, BASIC, UPPER, LOWER;

* Redefine the UPPER and LOWER indicator arrays to include
* bounds which are inactive in the benchmark:
loop((ES,R)$LBND(ES,R), LOWER(ES,R)$(BASIC(ES,R) + UPPER(ES,R)) = yes;);
loop((ES,R)$(UBND(ES,R) < inf), UPPER(ES,R)$(BASIC(ES,R) + LOWER(ES,R)) = yes;);

UPPER(ES,R)$FIXED(ES,R) = no;
LOWER(ES,R)$FIXED(ES,R) = no;
LOWER(ES,R)$(LBND(ES,R) = 0) = no;

* MACRO CALIBRATION AND BENCHMARK:

* Initialize the MACRO SAM:
MX(R,MS,G) = 0;

* Incorporate row representing ETA commodity inputs:
MX(R,"ETAG",G) = sum(ES, EX(R,ES,G)*LEVL(ES,R));

* Trade balance

* Oil trade:
MX(R,"IMEX","OILT") = -MX(R,"ETAG","OILT");

* Compute BMAT 1990=2020 trade index:
GDPGR(R) = (GDP(R,"FUTURE")/GDP(R,"BASE"))**(1.0/NYR) - 1;

* BMAT growth factor based on geometric mean:
BMATFAC = prod(R, (1 + GDPGR(R)*BDEL(R))**NYR)**(1/card(R));

* BMAT trade extrapolated using growth factor:
MX(R,"IMEX","BSMA") = BMAM(R)*BMATFAC;

* Non-basic trade:
MX(R,"IMEX","DOME") = -sum(G, MX(R,"IMEX",G));

* Infer RSHR(R) from the supply elasticity:
RSHR(R) = 1/(1 + ELAST(R,"BMAT"));

* 2020 B quantity:
QB(R) = BDRT(R)*GDP(R,"BASE")*(1 + BDEL(R)*GDPGR(R))**NYR;
QD(R) = QB(R)*(1 - RSHR(R) - EBSH(R) - NBSH(R));

* B production: conditional demands and output (values at 2020 prices)
MX(R,"SBSM","RESR") = - QB(R)*RSHR(R);
MX(R,"SBSM","NELE") = - QB(R)*NBSH(R);
MX(R,"SBSM","ELEC") = - QB(R)*EBSH(R);
MX(R,"SBSM","KLVA") = - QD(R);

* Total B production:
MX(R,"SBSM","BSMA") = - sum(G, MX(R,"SBSM",G));

* Energy inputs to macro production: values are computed as
* residual, the difference between supply and B sector inputs.
MX(R,"SDMI",BE) = - MX(R,"ETAG",BE) - MX(R,"SBSM",BE);

* NB: GDP defined as consumption plus investment, which is then
* equal to K-L value added plus net value of capacity constraints,
* KLVA = GDP - net value of capacity constraints.
MX(R,"SDMI","KLVA") = - (GDP(R,"FUTURE") + QD(R) + MX(R,"ETAG","UBND") - MX(R,"ETAG","LBND"));
MX(R,"SDMI","BSMA") = - (MX(R,"SBSM","BSMA") + MX(R,"IMEX","BSMA"));

abort$(smax(R, MX(R,"SDMI","BSMA")) > 0) " NEGATIVE INPUTS OF BMAT.", MX;

* Total DOMI production:
MX(R,"SDMI","DOMI") = -sum(G, MX(R,"SDMI",G));

* DOME:
MX(R,"SDOM","DOMI") = -MX(R,"SDMI","DOMI");

* Domestic non-basic production:
MX(R,"SDOM","DOME") = -sum(G, MX(R,"SDOM",G));

* Consumer:
MX(R,"CONS","RESR") = -MX(R,"SBSM","RESR");
MX(R,"CONS","KLVA") = -MX(R,"SDMI","KLVA") - MX(R,"SBSM","KLVA");
MX(R,"CONS","UBND") = -MX(R,"ETAG","UBND");
MX(R,"CONS","LBND") = -MX(R,"ETAG","LBND");
MX(R,"CONS","KSPC") = -MX(R,"ETAG","KSPC");
MX(R,"CONS","DOME") = -sum(MS, MX(R,MS,"DOME"));

* Install carbon emissions coefficient (price=0 in benchmark)
* and define carbon rights for the benchmark:
EX(R,ES,"CRTS") = -CARBON(ES,R);
BMCRTS(R) = -sum(ES, EX(R,ES,"CRTS")*LEVL(ES,R));
BMCHK(G)  =  sum(R, MX(R,"IMEX", G));

* Basic materials share of energy inputs:
BMESHR(R,BE) = -100*MX(R,"SBSM",BE)/MX(R,"ETAG",BE);
GDPSHR(R,BE) =  100*MX(R,"ETAG",BE)/GDP(R,"FUTURE");
DOMSHR(R,G)  = -100*MX(R,"SDMI",G)/MX(R,"SDOM","DOME");
DOMSHR(R,"DOMI") = 0;
BMMSHR(R) = -MX(R,"IMEX","BSMA")/MX(R,"SDMI","BSMA");

* Trap benchmark errors:
abort$(smax((R,BE), MX(R,"SDMI",BE)) > 0) "*** Negative ELEC or NELE inputs to SDMI.";

ROWSUM(G, R) = sum(MS, MX(R,MS,G));
COLSUM(MS,R) = sum(G,  MX(R,MS,G));

display BMCRTS, BMCHK, BMESHR, GDPSHR, DOMSHR, BMMSHR, ROWSUM, COLSUM;

* Extract elasticities:
ESUBC(R) = ELAST(R,"ESUBC");
ESUBB(R) = ELAST(R,"ESUBB");

* EXTRACT DATA FROM THE BENCHMARK
W0(R)  = -MX(R,"CONS","DOME");
Y0(R)  =  MX(R,"SDOM","DOME");
NY0(R) = -MX(R,"SDMI","NELE");
EY0(R) = -MX(R,"SDMI","ELEC");
VY0(R) = -MX(R,"SDMI","KLVA");
BY0(R) = -MX(R,"SDMI","BSMA");
B0(R)  =  MX(R,"SBSM","BSMA");
RB0(R) = -MX(R,"SBSM","RESR");
NB0(R) = -MX(R,"SBSM","NELE");
EB0(R) = -MX(R,"SBSM","ELEC");
VB0(R) = -MX(R,"SBSM","KLVA");
VA0(R) =  VY0(R) + VB0(R);
EMIT0(R)       = -sum(ES, LEVL(ES,R)*EX(R,ES,"CRTS"));
EMIT0("TOTAL") =  sum(R, EMIT0(R));

ETA(R,ES,"GASOUT")  = max( EX(R,ES,"GASS"), 0);
ETA(R,ES,"GASINP")  = max(-EX(R,ES,"GASS"), 0);
ETA(R,ES,"NELEOUT") = max( EX(R,ES,"NELE"), 0);
ETA(R,ES,"NELEINP") = max(-EX(R,ES,"NELE"), 0);
ETA(R,ES,"ELECOUT") = max( EX(R,ES,"ELEC"), 0);
ETA(R,ES,"ELECINP") = max(-EX(R,ES,"ELEC"), 0);
ETA(R,ES,"OILEXP")  = max( EX(R,ES,"OILT"), 0);
ETA(R,ES,"OILIMP")  = max(-EX(R,ES,"OILT"), 0);
ETA(R,ES,"CARBOUT") = max( EX(R,ES,"CRTS"), 0);
ETA(R,ES,"CARBINP") = max(-EX(R,ES,"CRTS"), 0);
ETA(R,ES,"YOUT")    = max( EX(R,ES,"DOME"), 0);
ETA(R,ES,"YINP")    = max(-EX(R,ES,"DOME"), 0);
ETA(R,ES,"KINP")    = max(-EX(R,ES,"KSPC"), 0);

$onText
$MODEL:CRTM_S

$SECTORS:
   Y(R)                            ! OTHER OUTPUT
   B(R)                            ! BASIC MATERIALS OUTPUT
   E(ES,R)$(not FIXED(ES,R))       ! ENERGY SECTOR OUTPUT

$COMMODITIES:
   PWY             ! OTHER OUTPUT PRICE
   PWB             ! WORLD PRICE OF BASIC MATERIALS
   PWOIL           ! WORLD PRICE OF OIL
   PGAS(R)         ! REGIONAL PRICE OF GAS
   PELEC(R)        ! REGIONAL ELECTRIC PRICE
   PNELE(R)        ! REGIONAL NON-ELECTRIC PRICE
   PVA(R)          ! REGIONAL PRICE OF VALUE-ADDED
   PBR(R)          ! REGIONAL PRICE OF BASIC MATERIALS RESOURCE

   PU(ES,R)$UPPER(ES,R)      ! ENERGY SUPPLY UPPER BOUND
   PL(ES,R)$LOWER(ES,R)      ! ENERGY SUPPLY LOWER BOUND
   PK(ES,R)$ETA(R,ES,"KINP") ! ENERGY SUPPLY SPECIFIC FACTOR
   PWC$(smax(R,CRTS_T(R)))   ! WORLD PRICE OF CARBON RIGHTS
   PC(R)$CRTS_N(R)           ! REGIONAL CARBON EMISSION PRICE

$CONSUMERS:
   RA(R)   ! REPRESENTATIVE AGENT

* Generate report variables for inputs and demands:
$REPORT:
   V:W(R)    D:PWY        DEMAND:RA(R)
   V:BC(R)   I:PWB        PROD:Y(R)
   V:EY(R)   I:PELEC(R)   PROD:Y(R)
   V:NY(R)   I:PNELE(R)   PROD:Y(R)
   V:EB(R)   I:PELEC(R)   PROD:B(R)
   V:NB(R)   I:PNELE(R)   PROD:B(R)

* Non-basic production:
$PROD:Y(R) s:ESUBC(R) a:1
   O:PWY        Q:Y0(R)
   I:PNELE(R)   Q:NY0(R)  a:
   I:PELEC(R)   Q:EY0(R)  a:
   I:PVA(R)     Q:VY0(R)
   I:PWB        Q:BY0(R)

* Basic materials production:
$PROD:B(R) s:1 a:ESUBB(R) b(a):1
   O:PWB        Q:B0(R)
   I:PBR(R)     Q:RB0(R)
   I:PNELE(R)   Q:NB0(R)  b:
   I:PELEC(R)   Q:EB0(R)  b:
   I:PVA(R)     Q:VB0(R)  a:

* Energy activities:
$PROD:E(ES,R)$(not FIXED(ES,R)) s:0 a:1

* Energy inputs and outputs:
   O:PGAS(R)    Q:ETA(R,ES,"GASOUT")
   O:PNELE(R)   Q:ETA(R,ES,"NELEOUT")
   O:PELEC(R)   Q:ETA(R,ES,"ELECOUT")

   I:PGAS(R)    Q:ETA(R,ES,"GASINP")
   I:PNELE(R)   Q:ETA(R,ES,"NELEINP")
   I:PELEC(R)   Q:ETA(R,ES,"ELECINP")

   O:PWOIL      Q:ETA(R,ES,"OILEXP")
   I:PWOIL      Q:ETA(R,ES,"OILIMP")

* Carbon requirements (international and domestic):
   O:PC(R)$CRTS_N(R)   Q:ETA(R,ES,"CARBOUT")
   I:PC(R)$CRTS_N(R)   Q:ETA(R,ES,"CARBINP")
   O:PWC$CRTS_T(R)     Q:ETA(R,ES,"CARBOUT")
   I:PWC$CRTS_T(R)     Q:ETA(R,ES,"CARBINP")

* Upper and lower bounds:
   I:PU(ES,R)$UPPER(ES,R)  Q:1
   O:PL(ES,R)$LOWER(ES,R)  Q:1

* Other inputs:
   O:PWY        Q:ETA(R,ES,"YOUT")
   I:PWY        Q:ETA(R,ES,"YINP")   a:$ETA(R,ES,"KINP")
   I:PK(ES,R)   Q:ETA(R,ES,"KINP")   a:$ETA(R,ES,"YINP")

$DEMAND:RA(R)
* All regions consume the non-energy good:
   D:PWY      Q:W0(R)

* Value-added endowment:
   E:PVA(R)   Q:VA0(R)

* Basic materials resource endowment:
   E:PBR(R)   Q:RB0(R)

* Upper and lower bounds on energy sector activities:
   E:PU(ES,R)$UPPER(ES,R)   Q:UBND(ES,R)
   E:PL(ES,R)$LOWER(ES,R)   Q:(-LBND(ES,R))

* Specific capital:
   E:PK(ES,R)   Q:(ETA(R,ES,"KINP")*LEVL(ES,R))

* Carbon emission rights:
   E:PWC     Q:CRTS_T(R)
   E:PC(R)   Q:CRTS_N(R)

* Fixed ETA activities:
   E:PGAS(R)         Q:(sum(ES$FIXED(ES,R),  LEVL(ES,R)*ETA(R,ES,"GASOUT")))
   E:PNELE(R)        Q:(sum(ES$FIXED(ES,R),  LEVL(ES,R)*ETA(R,ES,"NELEOUT")))
   E:PELEC(R)        Q:(sum(ES$FIXED(ES,R),  LEVL(ES,R)*ETA(R,ES,"ELECOUT")))
   E:PGAS(R)         Q:(sum(ES$FIXED(ES,R), -LEVL(ES,R)*ETA(R,ES,"GASINP")))
   E:PNELE(R)        Q:(sum(ES$FIXED(ES,R), -LEVL(ES,R)*ETA(R,ES,"NELEINP")))
   E:PELEC(R)        Q:(sum(ES$FIXED(ES,R), -LEVL(ES,R)*ETA(R,ES,"ELECINP")))
   E:PWOIL           Q:(sum(ES$FIXED(ES,R),  LEVL(ES,R)*ETA(R,ES,"OILEXP")))
   E:PWOIL           Q:(sum(ES$FIXED(ES,R), -LEVL(ES,R)*ETA(R,ES,"OILIMP")))
   E:PC(R)$CRTS_N(R) Q:(sum(ES$FIXED(ES,R),  LEVL(ES,R)*ETA(R,ES,"CARBOUT")))
   E:PC(R)$CRTS_N(R) Q:(sum(ES$FIXED(ES,R), -LEVL(ES,R)*ETA(R,ES,"CARBINP")))
   E:PWC$CRTS_T(R)   Q:(sum(ES$FIXED(ES,R),  LEVL(ES,R)*ETA(R,ES,"CARBOUT")))
   E:PWC$CRTS_T(R)   Q:(sum(ES$FIXED(ES,R), -LEVL(ES,R)*ETA(R,ES,"CARBINP")))
   E:PWY             Q:(sum(ES$FIXED(ES,R),  LEVL(ES,R)*ETA(R,ES,"YOUT")))
   E:PWY             Q:(sum(ES$FIXED(ES,R), -LEVL(ES,R)*ETA(R,ES,"YINP")))
$offText
$sysInclude mpsgeset CRTM_S

E.l(ES,R)  =  LEVL(ES,R);
PU.l(ES,R) = -EX(R,ES,"UBND");
PL.l(ES,R) = -EX(R,ES,"LBND");

* CHECK BENCHMARK WITH NO CARBON RESTRICTIONS:
CRTS_N(R) = 0;
CRTS_T(R) = 0;

CRTM_S.iterLim = 0;
$include CRTM_S.GEN
solve CRTM_S using mcp;

* LOOP OVER CO2 LEVELS:
loop(LVL$CO2LEVEL(LVL),
*  SET THE LEVEL OF EMISSIONS:
   CRTS_N(R) = 0;
   CRTS_T(R) = 0;

   loop(R$(CARBLIM(R,"LEVEL") < inf),
      if(CARBLIM(R,"TRADE"), CRTS_T(R) = CARBLIM(R,"LEVEL")*CO2LEVEL(LVL);
      else                   CRTS_N(R) = CARBLIM(R,"LEVEL")*CO2LEVEL(LVL););
   );

*  DEFINE A NUMERAIRE:
   PWY.fx = 1;

*  GENERATE AND SOLVE:
   CRTM_S.iterLim = 2000;
$  include CRTM_S.GEN
   solve CRTM_S using mcp;

*  EXTRACT THE SOLUTION VALUES:
   RESULTS("CPU","--",LVL)    = CRTM_S.resUsd;
   RESULTS("CONTOL","--",LVL) = CRTM_S.objVal;
   RESULTS("NITER","--",LVL)  = CRTM_S.iterUsd;

   CO2EMIT(R)       = -sum(ES, EX(R,ES,"CRTS")*E.l(ES,R));
   CO2EMIT("TOTAL") =  sum(R, CO2EMIT(R));

   RESULTS("CO2EXP",R,LVL) = ((CO2EMIT(R) - CRTS_T(R))*PWC.l*1000)$CRTS_T(R);
   RESULTS("CO2PCT",R,LVL) = 100*(CO2EMIT(R) - EMIT0(R))/EMIT0(R);
   RESULTS("CO2PCT","TOTAL",LVL) =  100*(CO2EMIT("TOTAL") - EMIT0("TOTAL"))/EMIT0("TOTAL");
   RESULTS("CO2TAX",R,LVL)       = 1000*(PC.l(R)$CRTS_N(R) + PWC.l$CRTS_T(R));
   RESULTS("LEAKAGE","--",LVL)   = 0;
   RESULTS("LEAKAGE","--",LVL)$sum(R$(CARBLIM(R,"LEVEL") < inf), EMIT0(R) - CO2EMIT(R))
      = 100*(1 - (EMIT0("TOTAL") - CO2EMIT("TOTAL"))
      / sum(R$(CARBLIM(R,"LEVEL") < inf), EMIT0(R) - CO2EMIT(R)));
   RESULTS("BMATOUTP",R,LVL)     = 100*(B.l(R) - 1);
   RESULTS("POIL",R,LVL)         = PNELE.l(R)*PO(R,"FUTURE");
   RESULTS("POIL","WORLD",LVL)   = PWOIL.l*PO("USA","FUTURE");
   RESULTS("EV",R,LVL)           = 100*(W.l(R) - W0(R))/W0(R);
);

option  RESULTS:1:2:1;
display RESULTS;

$onText
* THE FOLLOWING CODE IS NOT USED FOR THE GAMS LIBRARY VERSION

* APPEND THE SOLUTION TO THE REPORT FILE:
File REP / crtm-s.rep /;

* APPEND TO THIS FILE:
REP.AP = 1;

* SCIENTIFIC FORMAT WITH 17 COLUMN NUMBERS, 8 DECIMALS
REP.NR =  2;
REP.NW = 17;
REP.ND =  8;

* NO PADDING ON LABELS:
REP.LW = 0;
put REP;

* DUMP RESULTS FOR AGGREGATION IN THE REPORT PROGRAM:
loop((SC,LVL)$CO2LEVEL(LVL),
   put SC.TL'.CONTOL.TOTAL.',  LVL.TL, @32, RESULTS("CONTOL","--",LVL)/;
   put SC.TL '.NITER.TOTAL.',  LVL.TL, @32, RESULTS("NITER","--",LVL)/;
   put SC.TL,'.CPU.TOTAL.'  ,  LVL.TL, @32, RESULTS("CPU","--",LVL)  /;
   put SC.TL,'.CO2PCT.TOTAL.', LVL.TL, @32, RESULTS("CO2PCT","TOTAL",LVL)/;
   put SC.TL,'.LEAKAGE.TOTAL.',LVL.TL, @32, RESULTS("LEAKAGE","--",LVL)/;
   put SC.TL,'.POIL.WORLD.',   LVL.TL, @32, RESULTS("POIL","WORLD",LVL)/;
   loop(R,
      put SC.TL,'.CO2EXP.',R.TL,'.', LVL.TL, @32, RESULTS("CO2EXP",R,LVL)/;
      put SC.TL,'.CO2PCT.',R.TL,'.', LVL.TL, @32, RESULTS("CO2PCT",R,LVL)/;
      put SC.TL,'.CO2TAX.',R.TL,'.', LVL.TL, @32, RESULTS("CO2TAX",R,LVL)/;
      put SC.TL,'.BMATOUTP.'R.TL,'.',LVL.TL, @32, RESULTS("BMATOUTP",R,LVL)/;
      put SC.TL,'.POIL.',R.TL,'.',   LVL.TL, @32, RESULTS("POIL",R,LVL)/;
   );
);
$offText