etamge.gms : ETA-MACRO Energy Model for the USA - MPSGE Format
This is an energy-macro economic interaction model for the united
states developed by prof A Manne, Stanford University.
(This is a modified version of gams library model ETAMAC.)
Reference:
- Manne, A S, ETA-MACRO: A Model of Energy-Economy Interactions. In Hitch, C J, Ed, Modeling Energy-Economy Interactions: Five Approaches. Resources for the Future, Washington, DC, 1977.
Large Model of Types: MPSGE mcp
$title Eta-Macro Energy Model for the USA - MPSGE Format (ETAMGE,SEQ=144)
$Ontext
This is an energy-macro economic interaction model for the united
states developed by prof A Manne, Stanford University.
(This is a modified version of gams library model ETAMAC.)
Manne, A S, ETA-MACRO: A Model of Energy-Economy Interactions.
In Hitch, C J, Ed, Modeling Energy-Economy Interactions, Resources
for the Future. ?, Washington, DC, 1977.
$Offtext
*------------------------------------------------------------------------
* these are notes on changing the time horizon and number of years per period.
* you must first enter the set t which is the time periods that will be
* used. the number of years between entries in t must be the value nyper.
* you must choose the number of years per period, nyper, and this must
* correspond to the set t. you must change the number of years per period,
* nyper, in two places. nyper must be greater than or equal to 2.
*
* you must also enter the set inityrs which contains the years from the base
* year to the year before the first year.
*
* units used:
*
* electric energy 10**12 kwh
* non-electric energy 10**15 btu
* price of electric energy $/(10**3 kwh)
* price of non-electric energy $/(10**6 btu)
* gnp 10**12 $
*------------------------------------------------------------------------
scalars nyper number of years per period / 5 /;
sets inityrs years before first year / 1985*1989 /
bsyr base year
t actual time periods / 1990, 1995, 2000, 2005, 2010,
2015, 2020, 2025, 2030 /
tfirst(t) first period
tsecond(t) second period
tlast(t) last period
nypset set from 1 to nyper / 1*5 /;
bsyr(inityrs) = yes$(ord(inityrs) eq 1);
tfirst(t) = yes$(ord(t) eq 1);
tsecond(t) = yes$(ord(t) eq 2);
tlast(t) = yes$(ord(t) eq card(t));
*------------------------------------------------------------------------
scalars spda speed of adjustment / 0.96 /
kpvs capital share parameter / 0.28 /
elvs electric share parameter / 0.35 /
esub elasticity between k-l and e-n / 0.45 /
k0 initial capital / 10.90 /
e0 initial electric energy / 2.50 /
n0 initial non-electric energy / 50 /
i0 initial investment / 0.7 /
c0 initial consumption / 3.2 /
pe0 initial price of electric energy / 50 /
pn0 initial price of non-electric energy / 4.5 /
pnref reference price of non-electric energy / 3.0 /
y0 initial output
htrt0 initial heat rate
thsnd one thousand / 1000.0 /
rho esub minus one divided by esub
aconst constant for capital-labor index
bconst constant for electric-non-electric energy index
ninit number of years before the first year
tol tolerance factor for lower bounds / 0.3 /;
*------------------------------------------------------------------------
parameters dfactcurr(t) current annual utility discount factor
dfact(t) utility discount factor
grow(t) potential annual gnp growth rate
pegrow(t) current growth of electricity price
pelec(t) growth of electricity price
pngrow(t) current growth of non-electricity price
pnelec(t) growth of non-electricity price
l(t) current labor force (efficiency units)
ln(t) new labor force
ipm(t) investment period multiplier
htrt(t) heat rate
knew new capital stock in first period;
*------------------------------------------------------------------------
* the following input factors refer, respectively, to utility discounting
* (dfactcurr), growth of electric and nonelectric energy costs (pelec and
* pnelec), and of potential gnp (grow).
dfactcurr(t) = 0.96;
pegrow(t) = 0.01;
pngrow(t) = 0.02;
grow(t) = 0.03;
htrt0 = 10.809;
htrt(t) = 10.809;
*------------------------------------------------------------------------
ninit = card(inityrs);
rho = (esub - 1)/esub;
y0 = i0 + c0 + (e0*pe0 + n0*pn0)/thsnd;
bconst = (pnref/thsnd)*y0**(rho - 1) /
((1 - elvs)*(e0**(rho*elvs))*(n0**(rho*(1 - elvs) - 1)));
aconst = (y0**rho - bconst*(e0**(rho*elvs))*(n0**(rho*(1 - elvs)))) /
(k0**(rho*kpvs));
*the following calculations allow for the growth of investment within each
*period, and also for its geometric decay.
knew = sum(tfirst, i0*(sum(inityrs, spda**(ord(inityrs) - 1)*
(1 + grow(tfirst))**(ninit - ord(inityrs)))));
ipm(t) = sum(nypset, spda**(ord(nypset) - 1)*
(1 + grow(t))**(nyper - ord(nypset)));
dfact(tfirst) = dfactcurr(tfirst)**ninit;
l(tfirst) = (1 + grow(tfirst))**ninit;
ln(tfirst) = l(tfirst) - (spda**ninit);
pelec(tfirst) = pe0*((1 + pegrow(tfirst))**ninit);
pnelec(tfirst) = pn0*((1 + pngrow(tfirst))**ninit);
loop(t, dfact(t+1) = dfact(t)*dfactcurr(t+1)**nyper ;
l(t+1) = l(t)*(1 + grow(t+1))**nyper ;
ln(t+1) = l(t+1) - l(t)*(spda**nyper) ;
pelec(t+1) = pelec(t) *(1 + pegrow(t))**nyper ;
pnelec(t+1) = pnelec(t)*(1 + pngrow(t))**nyper );
dfact(tlast) = dfact(tlast)/(1-dfactcurr(tlast));
display ipm, kpvs, elvs, l, ln, rho, aconst, bconst, pelec, pnelec, knew;
set tn(t,t);
alias (t,tp);
tn(t,t+1) = yes;
scalar peref reference price of electricity,
va0 benchmark value-added,
pk0 gross return to capital,
l0 benchmark labor earnings;
peref = elvs * pnref * n0 / (e0 * (1-elvs));
display peref;
va0 = y0 - (e0*peref + n0*pnref)/thsnd;
pk0 = kpvs * va0 / k0;
l0 = (1-kpvs)*va0;
$ontext
$model:etamac
$sectors:
yn(t) ! new vintage production
y(t) ! total output
e(t) ! total electric
n(t) ! total nonelectric
i(t)$(not tlast(t)) ! investment
k(t)$(not tfirst(t)) ! total capital
$commodities:
pc(t) ! price of current consumption
py(t) ! price total output
pln(t) ! price new vintage labor
pkn(t) ! price new vintage capital
pne(t) ! price new vintage electric
pnn(t) ! price new vintage non-electric
pk(t)$(not tfirst(t)) ! price total capital
$consumers:
ra ! representative agent
$report:
v:c(t) d:pc(t) demand:ra
v:en(t) i:pne(t) prod:yn(t)
v:nn(t) i:pnn(t) prod:yn(t)
$prod:yn(t) s:esub a:1 b:1
o:py(t) q:1
i:pln(t) q:(l0/y0) a:
i:pkn(t) q:(k0/y0) p:pk0 a:
i:pne(t) q:(e0/y0) p:(peref/thsnd) b:
i:pnn(t) q:(n0/y0) p:(pnref/thsnd) b:
$prod:y(t)
o:pc(t) q:1
o:py(tp)$tn(t,tp) q:(spda**nyper)
i:py(t) q:1
$prod:k(t)$(not tfirst(t))
o:pk(t) q: 1
i:pk(tp)$tn(t,tp) q:(spda**nyper)
i:pc(t)$tlast(t) q:(grow(t)+ 1-spda)
$prod:e(t)
o:pne(t) q:1
i:pc(t) q:(pelec(t)/thsnd)
i:pne(tp)$tn(t,tp) q:(spda**nyper)
$prod:n(t)
o:pnn(t) q:1
i:pc(t) q:(pnelec(t)/thsnd)
i:pnn(tp)$tn(t,tp) q:(spda**nyper)
$prod:i(t)$(not tlast(t))
o:pkn(tp)$tn(t,tp) q:ipm(t)
i:pk(tp)$tn(t,tp) q:ipm(t)
i:pc(t)
$demand:ra s:1
e:pk(tsecond) q:(-(spda**nyper)*(k0*(spda**ninit)+knew))
e:pkn(tfirst) q:knew
e:pne(tfirst) q:(-e0*(spda**nyper)) ! error - should be ninit.
e:pnn(tfirst) q:(-n0*(spda**nyper)) ! error - should be ninit.
e:py(tfirst) q:( y0*spda**ninit)
e:pln(t) q:(l0*ln(t))
d:pc(t) q:c0 p:dfact(t)
$offtext
$sysinclude mpsgeset ETAMAC
ra.fx = card(t) * c0;
$include ETAMAC.GEN
solve etamac using mcp;
* install omitted activity levels for reporting purposes:
i.l(tlast) = k.l(tlast) * (grow(tlast)+(1-spda));
k.l(tfirst) =k0*(spda**ninit) + knew;
$stitle report definitions
parameter valuerep report for c-i-gdp-e-en-tpe
growthrep report of growth rates;
valuerep("con", bsyr) = c0;
valuerep("inv", bsyr) = i0;
valuerep("gdp", bsyr) = c0 + i0;
valuerep("elec", bsyr) = e0;
valuerep("nelec", bsyr) = n0;
valuerep("tpe", bsyr) = htrt0*e0 + n0;
valuerep("con", t) = c.l(t);
valuerep("inv", t) = i.l(t);
valuerep("gdp", t) = c.l(t) + i.l(t);
valuerep("elec", t) = e.l(t);
valuerep("nelec", t) = n.l(t);
valuerep("tpe", t) = htrt(t)*e.l(t) + n.l(t);
growthrep("con", "'85-00") = 100*((c.l("2000")/c0)**(1/15) - 1);
growthrep("inv", "'85-00") = 100*((i.l("2000")/i0)**(1/15) - 1);
growthrep("gdp", "'85-00") = 100*(((c.l("2000") + i.l("2000"))/
(c0 + i0))**(1/15) - 1);
growthrep("elec", "'85-00") = 100*((e.l("2000")/e0)**(1/15) - 1);
growthrep("nelec","'85-00") = 100*((n.l("2000")/n0)**(1/15) - 1);
growthrep("tpe", "'85-00") = 100*(((htrt("2000")*e.l("2000") + n.l("2000"))/
(htrt0*e0 + n0))**(1/15) - 1);
growthrep("con", "'00-20") = 100*((c.l("2020")/c.l("2000"))**(1/20) - 1);
growthrep("inv", "'00-20") = 100*((i.l("2020")/i.l("2000"))**(1/20) - 1);
growthrep("gdp", "'00-20") = 100*(((c.l("2020") + i.l("2020"))/
(c.l("2000") + i.l("2000")))**(1/20) - 1);
growthrep("elec", "'00-20") = 100*((e.l("2020")/e.l("2000"))**(1/20) - 1);
growthrep("nelec","'00-20") = 100*((n.l("2020")/n.l("2000"))**(1/20) - 1);
growthrep("tpe", "'00-20") = 100*(((htrt("2020")*e.l("2020") + n.l("2020"))/
(htrt("2000")*e.l("2000") + n.l("2000")))
**(1/20) - 1);
display valuerep, growthrep;