* DICE-UNC.GMS * This is the GAMS code that was used to generate the * results in Woodward and Bishop. 1997. Land Economics * vol 73(4). * The program is based on the program provided by * William Nordhaus in his book, Managing the Global * Commons: The Economics of Climate Change. The MIT * Press. * * The optimization problem is solved using Minos. The * results in the paper were obtained using the default * minos options with the exception of the following: * Iterations limit=100000 and Major Iterations Limit=200 * * The program will create an output file entitled DICE-UNC.DAT * in which the substantive output is solved. It will also * create the standard gams .LST file. options limrow=0, limcol=0, iterlim=9000, decimals=5; $offsymxref offsymlist offuellist offuelxref Sets T Time periods /1*40/ TFIRST(T) First period TLAST(T) Last period I Number of parameters considered /1*2/; SCALARS * parameters of the economic model BET elasticity of marginal utility /0/ R Rate of time preference /0.03/ GL0 growth rate of population /.223/ DLAB decline of pop growth rate /.195/ DELTAM removal rate of carbon /.0833/ GA0 growth rate of tech /.15/ DELA decline in rate of tech progress /.11/ SIG0 c02 equiv gwp ratio /.519/ GSIGMA growth of sigma per decade /-.1168/ DK depreciation /.10/ GAMA Capital elasticity /.25/ PHIK transversality coeff /140/ PHIM transversality coeff carbon $ per ton /-9/ PHITE transversal coeff temp (billion $ per ton) /-7000/ * parameters of the global warming model M0 co2-equiv concentrations 1965 /677/ TL0 lower stratum temp in 1965 /.10/ T0 atmos temp in 1965 /.2/ ATRET marginal atmos retention rate /.64/ C1 coeff for upper level /.226/ LAM climate feedback factor /1.41/ C3 coeff trans upper to lower stratum /.440/ C4 coeff of transfer for lower level /.02/ A1 damage coeff for co2 doubling GWP /.0133/ * parameters of the cost function B1 intercept on the control cost function /.0686/ B2 exponent of control cost function /2.887/ * Data A0 initial level of total factor prod /.00963/ K0 value of capital /16.03/ Q0 1965 GWP in trillions of 1989 dollars /8.519/ LL0 1965 pop /3369/ * parameters of the damage function (Base case) A1B damage associate with a tbar change in temp /.0133/ A2B exponent on the damage function /2.000/ TbarB denominator of the damage function /3.000/ * parameters of the damage function (Catastrophic case) A1C damage associate with a tbar change in temp /.0270/ A2C exponent on the damage function /12.00/ TbarC denominator of the damage function /2.500/ ; PARAMETERS * exogenous variables - economic L(T) pop AL(T) tfp RR(T) discount GA(T) growth rate of tfp GL(T) growth rate of labor YEAR(T) Year * exogenous variables - climatic SIGMA(T) emission-output ration FORCOTH(T) exogenous forcings GSIG(T) cumulative improvement in energy eff DUM(T) dummy var one in last period * streams that will need to be stored (Base case) DAMAGEB(T) INVESTB(T) MIUB(T) TEB(T) * streams that will need to be stored (Catastrophic case) DAMAGEC(T) INVESTC(T) MIUC(T) TEB(T) TEC(T) ; TFIRST(T) = YES$(ORD(T) EQ 1); TLAST(T) = YES$(ORD(T) EQ CARD(T)); DISPLAY TFIRST, TLAST; * Exogenous relationships - economic YEAR(T) = 1955 + ORD(T)*10; GL(T) = (GL0/DLAB)*(1-EXP(-DLAB*(ORD(T)-1))); L(T) = LL0*exp(GL(T)); GA(T) =(GA0/DELA)*(1-EXP(-DELA*(ORD(T)-1))); AL(T) = A0*EXP(GA(T)); GSIG(T) = (GSIGMA/DELA)*(1-EXP(-DELA*(ORD(T)-1))); SIGMA(T) = SIG0*EXP(GSIG(T)); RR(T) = (1+R)**(10*(1-ORD(T))); DUM(T) = 1$(ORD(T)EQ CARD(T)); * Exogenous relationships - climatic FORCOTH(T) = 1.42; FORCOTH(T)$(ORD(T)LT 13 ) = .2604 +.125*ORD(T) - .0034*ORD(T)**2; VARIABLES * economic variables (determined by policy) MIU(T) Emission control rate GHGs K(T) capital stock INVEST(T) investment TRANS(T) transversality variable * climatic variables FORC(T) radiative forcing TE(T) temp TL(T) temp, lower ocean M(T) co2 concentration E(T) co2 emissions * economic variables (base case) PCYB(T) per cap income CB(T) consumption CPCB(T) per cap cons YB(T) output RIB(T) interest SB(T) savings rate as fraction of GWP UB discounted PV of utility * economic variables (catastrophic case) PCYC(T) per cap income CC(T) consumption CPCC(T) per cap cons YC(T) output RIC(T) interest SC(T) savings rate as fraction of GWP UC discounted PV of utility * alternative objective UMIN ; POSITIVE VARIABLES MIU,E,TE,M,K,INVEST; POSITIVE VARIABLES YB,CB; POSITIVE VARIABLES YC,CC,CPCC; EQUATIONS * Economic equations, universal KK(T) KK0(T) KC(T) TRANSE(T) * Climatic equations EE(T) FORCE(T) MM(T) MM0(T) TTE(T) TTE0(T) TLE(T) TLE0(T) * Economic equations, Scenario specific (Base case) YYB(T) CCB(T) CPCEB(T) PCYEB(T) RIEQB(T) SEQB(T) UTILB * Economic equations, Scenario specific (Cata case) YYC(T) CCC(T) CPCEC(T) PCYEC(T) RIEQC(T) SEQC(T) UTILC * Alternative objective functions MINUTIL ; * Economic equations, universal KK(T).. K(T+1) =L= (1-DK)**10*K(T) + 10*INVEST(T); KK0(TFIRST).. K(TFIRST) =E= K0; KC(TLAST).. R*K(TLAST) =L= INVEST(TLAST); TRANSE(TLAST).. TRANS(TLAST) =E= RR(TLAST) * (PHIK*K(TLAST) + PHIM*M(TLAST)+ PHITE*TE(TLAST)); * Climatic equations EE(T).. E(T) =G= 10*SIGMA(T)*(1-MIU(T))*AL(T)*L(T)**(1-GAMA)*K(T)**GAMA; FORCE(T).. FORC(T) =E= 4.1*(LOG(M(T)/590)/ LOG(2)) + FORCOTH(T); MM(T+1).. M(T+1) =E= 590 + ATRET*E(T) + (1-DELTAM)* (M(T)-590); MM0(TFIRST).. M(TFIRST) =E= M0; TTE(T+1).. TE(T+1) =E= TE(T) + C1*(FORC(T) - LAM*TE(T) - C3*(TE(T) -TL(T))); TTE0(TFIRST).. TE(TFIRST) =E= T0; TLE(T+1).. TL(T+1) =E= TL(T) + C4*(TE(T) - TL(T)); TLE0(TFIRST).. TL(TFIRST) =E= TL0; * Economic equations, Scenario specific (Base case) YYB(T).. YB(T) =E= AL(T)*L(T)**(1-GAMA)*K(T)**GAMA*(1-B1*(MIU(T)**B2))/(1 + (A1B)*(TE(T)/TbarB)**A2B); CCB(T).. CB(T) =E= YB(T)-INVEST(T); CPCEB(T).. CPCB(T) =E= CB(T)*1000/L(T); PCYEB(T).. PCYB(T) =E= YB(T)*1000/L(T); RIEQB(T).. RIB(T) =E= GAMA*YB(T)/K(T)-(1-(1-DK)**10)/10; SEQB(T).. SB(T) =E= INVEST(T)/(.001 +YB(T)); * note ub & uc are expressed in '000's of $'s not millions * as it is in Nordhaus's specification UTILB.. UB =E= SUM(T,10*RR(T)*L(T)*LOG(1000*CB(T)/L(T))/.55 + TRANS(T)*DUM(T)); * Economic equations, Scenario specific (Cata case) YYC(T).. YC(T) =E= AL(T)*L(T)**(1-GAMA)*K(T)**GAMA*(1-B1*(MIU(T)**B2))/(1 + (A1C)*(TE(T)/TbarC)**A2C); CCC(T).. CC(T) =E= YC(T)-INVEST(T); CPCEC(T).. CPCC(T) =E= CC(T)*1000/L(T); PCYEC(T).. PCYC(T) =E= YC(T)*1000/L(T); RIEQC(T).. RIC(T) =E= GAMA*YC(T)/K(T)-(1-(1-DK)**10)/10; SEQC(T).. SC(T) =E= INVEST(T)/(.001 +YC(T)); UTILC.. UC =E= SUM(T,10*RR(T)*L(T)*LOG(1000*CC(T)/L(T))/.55 + TRANS(T)*DUM(T)); * Alternative objective functions MINUTIL.. UMIN =E= MIN(UB,UC); MIU.UP(T) = .99; MIU.LO(T) = .01; K.LO(T) = 1; TE.UP(T) = 20; M.LO(T) = 600; CB.LO(T) = 2; CC.LO(T) = 1; MIU.FX("1") = 0.; MIU.FX("2") = 0.; MIU.FX("3") = 0.; OPTION ITERLIM = 99900; OPTION RESLIM = 99999; OPTION SOLPRINT = OFF; OPTION LIMROW = 0; OPTION LIMCOL = 0; MODEL BASECASE / KK, KK0, KC, TRANSE, EE, FORCE, MM, MM0, TTE, TTE0, TLE, TLE0, YYB, CCB, CPCEB, PCYEB, RIEQB, SEQB, UTILB /; MODEL CATACASE / KK, KK0, KC, TRANSE, EE, FORCE, MM, MM0, TTE, TTE0, TLE, TLE0, YYC, CCC, CPCEC, PCYEC, RIEQC, SEQC, UTILC /; MODEL MAXIMIN / KK, KK0, KC, TRANSE, EE, FORCE, MM, MM0, TTE, TTE0, TLE, TLE0, YYB, CCB, CPCEB, PCYEB, RIEQB, SEQB, UTILB, YYC, CCC, CPCEC, PCYEC, RIEQC, SEQC, UTILC, MINUTIL /; maximin.optfile=1; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * B A S E C A S E * First we solve to maximize the PV of the stream of * utility assuming that the base-case parameters hold. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * SOLVE BASECASE MAXIMIZING UB USING NLP; * store some of the variables INVESTB(T) = INVEST.L(T); DAMAGEB(T) = (1 - 1/(1 + (A1B)*(TE.L(T)/tbarB)**A2B) ) *100; MIUB(T) = MIU.L(T); TEB(T) = TE.L(T); * Set mu at base-case optimum and resolv for cata-case for x periods * Bound the GHG policy at the level for the Base-Case LOOP(T $(ORD(T) LT 41), MIU.FX(T) = MIU.L(T); ); SOLVE CATACASE MAXIMIZING UC USING NLP; * store some variables INVESTC(T) = INVEST.L(T); DAMAGEC(T) = (1 - 1/(1 + (A1C)*(TE.L(T)/tbarC)**A2C) ) *100; MIUC(T) = MIU.L(T); TEC(T) = TE.L(T); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PRINT OUT OF BASE CASE * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * file DICE /dice-unc.dat/; PUT DICE; PUT "BASE_CASE - mu chosen assuming base case for entire period" /; put " A1B A2B TBarB A1C A2C TbarC " /; put A1B:9:3 A2B:9:3 TBarB:9:3 A1C:9:3 A2C:9:3 TbarC:9:3 ; put //; PUT "UB UC" / UB.L:12:5 " " UC.L:12:5; put / / " R DLAB DELA GSIGMA B1 ATRET "/ R DLAB DELA GSIGMA B1 ATRET / /; PUT "PRIMARY_VARIABLES " /; PUT " YEAR MIUB(T) MIUC(T) CPCB.L CPCC.L " " TE.L DAMAGEB DAMAGEC INVESTB INVESTC" /; loop(t, PUT YEAR(T):7:0 MIUB(T):9:3 MIUC(T):9:3 CPCB.L(t):9:3 CPCC.L(t):9:3 TE.L(t):9:3 DAMAGEB(T):9:3 DAMAGEC(T):9:3 INVESTB(t):9:3 INVESTC(t):9:3 ; put /; ); PUT //; PUT "SECONDARY_VARIABLES " /; PUT " YEAR CB.L CC.L E.L M.L FORC.L PCYB.L PCYC.L " /; loop(t, PUT YEAR(T) CB.L(t):9:3 CC.L(t):9:3 E.L(t):9:3 M.L(t):9:3 FORC.L(t):9:3 PCYB.L(t):9:3 PCYC.L(t):9:3 /; ); PUT //; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * BASE CASE mu FOR FIRST 120 YEARS * This is the wait-and-see policy in which the base case is * assumed to hold for the first 120 years * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Set mu at base-case optimum and resolv for cata-case for x periods * Bound the GHG policy at the level for the Base-Case LOOP(T $(ORD(T) LT 12.5), MIU.FX(T) = MIU.L(T); ); LOOP(T $(ORD(T) GT 12.5), MIU.UP(T) = .99; MIU.LO(T) = .01; ); SOLVE CATACASE MAXIMIZING UC USING NLP; * store some variables INVESTC(T) = INVEST.L(T); DAMAGEC(T) = (1 - 1/(1 + (A1C)*(TE.L(T)/tbarC)**A2C) ) *100; MIUC(T) = MIU.L(T); TEC(T) = TE.L(T); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PRINT OUT OF BASE CASE 13 period lock * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PUT "BASE_CASE - mu chosen assuming base case for first 12 periods" /; put " A1B A2B TBarB A1C A2C TbarC " /; put A1B:9:3 A2B:9:3 TBarB:9:3 A1C:9:3 A2C:9:3 TbarC:9:3 ; put //; PUT "UB UC" / UB.L:12:5 " " UC.L:12:5; put / / " R DLAB DELA GSIGMA B1 ATRET "/ R DLAB DELA GSIGMA B1 ATRET / /; PUT "PRIMARY_VARIABLES " /; PUT " YEAR MIUB(T) MIUC(T) CPCB.L CPCC.L " " TEB TEC DAMAGEB DAMAGEC INVESTB INVESTC" /; loop(t, PUT YEAR(T):7:0 MIUB(T):9:3 MIUC(T):9:3 CPCB.L(t):9:3 CPCC.L(t):9:3 TEB(t):9:3 TEC(t):9:3 DAMAGEB(T):9:3 DAMAGEC(T):9:3 INVESTB(t):9:3 INVESTC(t):9:3 ; put /; ); PUT //; PUT "SECONDARY_VARIABLES " /; PUT " YEAR CB.L CC.L E.L M.L FORC.L PCYB.L PCYC.L " /; loop(t, PUT YEAR(T) CB.L(t):9:3 CC.L(t):9:3 E.L(t):9:3 M.L(t):9:3 FORC.L(t):9:3 PCYB.L(t):9:3 PCYC.L(t):9:3 /; ); PUT //; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * C A T A S T R O P H I C C A S E * Next we solve for the optimal policy assuming that the * catastrophic parameters hold * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * miu.up(t) = .99; miu.lo(t) = .01; MIU.FX("1") = 0.; MIU.FX("2") = 0.; MIU.FX("3") = 0.; SOLVE CATACASE MAXIMIZING UC USING NLP; * store some of the variables INVESTC(T) = INVEST.L(T); DAMAGEC(T) = (1 - 1/(1 + (A1C)*(TE.L(T)/tbarC)**A2C) ) *100; MIUC(T) = MIU.L(T); TEC(T) = TE.L(T); * Set mu at base-case optimum and resolv for cata-case for x periods * Bound the GHG policy at the level for the Base-Case LOOP(T $(ORD(T) LT 41), MIU.FX(T) = MIU.L(T); ); SOLVE BASECASE MAXIMIZING UB USING NLP; * store some variables INVESTB(T) = INVEST.L(T); DAMAGEB(T) = (1 - 1/(1 + (A1B)*(TE.L(T)/tbarB)**A2B) ) *100; MIUB(T) = MIU.L(T); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PRINT OUT OF CATASTROPHIC CASE * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PUT "CATASTROPHIC CASE - mu chosen assuming catastrophic case" /; put " A1B A2B TBarB A1C A2C TbarC " /; put A1B:9:3 A2B:9:3 TBarB:9:3 A1C:9:3 A2C:9:3 TbarC:9:3 ; put //; PUT "UB UC" / UB.L:12:5 " " UC.L:12:5; put / / " R DLAB DELA GSIGMA B1 ATRET "/ R DLAB DELA GSIGMA B1 ATRET / /; PUT "PRIMARY_VARIABLES " /; PUT " YEAR MIUB(T) MIUC(T) CPCB.L CPCC.L " " TE.L DAMAGEB DAMAGEC INVESTB INVESTC" /; loop(t, PUT YEAR(T):7:0 MIUB(T):9:3 MIUC(T):9:3 CPCB.L(t):9:3 CPCC.L(t):9:3 TE.L(t):9:3 DAMAGEB(T):9:3 DAMAGEC(T):9:3 INVESTB(t):9:3 INVESTC(t):9:3 ; put /; ); PUT //; PUT "SECONDARY_VARIABLES " /; PUT " YEAR CB.L CC.L E.L M.L FORC.L PCYB.L PCYC.L " /; loop(t, PUT YEAR(T) CB.L(t):9:3 CC.L(t):9:3 E.L(t):9:3 M.L(t):9:3 FORC.L(t):9:3 PCYB.L(t):9:3 PCYC.L(t):9:3 /; ); PUT //; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * CATASTROPHIC CASE mu FOR FIRST 160 YEARS * This is the wait-and-see policy in which the catastrophic case is * assumed to hold for the first 160 years * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Set mu at base-case optimum and resolv for cata-case for x periods * Bound the GHG policy at the level for the Base-Case LOOP(T $(ORD(T) LT 13.5), MIU.FX(T) = MIU.L(T); ); LOOP(T $(ORD(T) GT 13.5), MIU.UP(T) = .99; MIU.LO(T) = .01; ); SOLVE BASECASE MAXIMIZING UB USING NLP; * store some variables INVESTB(T) = INVEST.L(T); DAMAGEB(T) = (1 - 1/(1 + (A1B)*(TE.L(T)/tbarB)**A2B) ) *100; MIUB(T) = MIU.L(T); TEB(T) = TE.L(T); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PRINT OUT OF CATASTROPHIC CASE * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PUT "CATASTROPHIC CASE - mu set at muC for first 16 periods" /; put " A1B A2B TBarB A1C A2C TbarC " /; put A1B:9:3 A2B:9:3 TBarB:9:3 A1C:9:3 A2C:9:3 TbarC:9:3 ; put //; PUT "UB UC" / UB.L:12:5 " " UC.L:12:5; put / / " R DLAB DELA GSIGMA B1 ATRET "/ R DLAB DELA GSIGMA B1 ATRET / /; PUT "PRIMARY_VARIABLES " /; PUT " YEAR MIUB(T) MIUC(T) CPCB.L CPCC.L " " TEB TEC DAMAGEB DAMAGEC INVESTB INVESTC" /; loop(t, PUT YEAR(T):7:0 MIUB(T):9:3 MIUC(T):9:3 CPCB.L(t):9:3 CPCC.L(t):9:3 TEB(t):9:3 TEC(t):9:3 DAMAGEB(T):9:3 DAMAGEC(T):9:3 INVESTB(t):9:3 INVESTC(t):9:3 ; put /; ); PUT //; PUT "SECONDARY_VARIABLES " /; PUT " YEAR CB.L CC.L E.L M.L FORC.L PCYB.L PCYC.L " /; loop(t, PUT YEAR(T) CB.L(t):9:3 CC.L(t):9:3 E.L(t):9:3 M.L(t):9:3 FORC.L(t):9:3 PCYB.L(t):9:3 PCYC.L(t):9:3 /; ); PUT //; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * M A X I M I N C A S E * This case solves for the policy that maximizes the minimum * PV of utility. This case is not reported in the paper as it * yields results that are not significantly different from the * catastrophic case and because some of the results are intuitively * implausible, likely due to the difficulty in solving the non-smooth * maximin objective * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * miu.up(t) = .99; miu.lo(t) = .01; MIU.FX("1") = 0.; MIU.FX("2") = 0.; MIU.FX("3") = 0.; * First solve catacase to get better starting values SOLVE CATACASE MAXIMIZING UC USING NLP; * then solve the maximin problem SOLVE MAXIMIN MAXIMIZING UMIN USING DNLP; DAMAGEB(T) = (1 - 1/(1 + (A1B)*(TE.L(T)/tbarB)**A2B) ) *100; DAMAGEC(T) = (1 - 1/(1 + (A1C)*(TE.L(T)/tbarC)**A2C) ) *100; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PRINT OUT OF MAXIMIN CASE * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PUT "MAXIMIN CASE - mu and Invest chosen to maximize the minimum utility" /; put " A1B A2B TBarB A1C A2C TbarC " /; put A1B:9:3 A2B:9:3 TBarB:9:3 A1C:9:3 A2C:9:3 TbarC:9:3 ; put //; PUT "UB UC" / UB.L:12:5 " " UC.L:12:5; put / / " R DLAB DELA GSIGMA B1 ATRET "/ R DLAB DELA GSIGMA B1 ATRET / /; PUT "PRIMARY_VARIABLES " /; PUT " YEAR MIU.L(T) CPCB.L CPCC.L " " TE.L DAMAGEB DAMAGEC INVEST " /; loop(t, PUT YEAR(T):7:0 MIU.L(T):9:3 CPCB.L(t):9:3 CPCC.L(t):9:3 TE.L(t):9:3 DAMAGEB(T):9:3 DAMAGEC(T):9:3 INVEST.L(t):9:3 ; put /; ); PUT //; PUT "SECONDARY_VARIABLES " /; PUT " YEAR CB.L CC.L E.L M.L FORC.L PCYB.L PCYC.L " /; loop(t, PUT YEAR(T) CB.L(t):9:3 CC.L(t):9:3 E.L(t):9:3 M.L(t):9:3 FORC.L(t):9:3 PCYB.L(t):9:3 PCYC.L(t):9:3 /; ); PUT //;