turkpow.gms : Turkey Power Planning Model

Description

This is an investment planning model for the Turkish power
sector to determine the least cost expansion pattern.


Large Model of Type : LP


Category : GAMS Model library


Main file : turkpow.gms

$title Turkey Power Planning Model (TURKPOW,SEQ=54)

$onText
This is an investment planning model for the Turkish power
sector to determine the least cost expansion pattern.


Turvey, R, and Anderson, D, Chapter 8: Electricity Development in Turkey:
A Case Study using Linear Programming. In Electricity Economics: Essays
and Case Studies. Johns Hopkins University Press, Baltimore and London,
1977.

Keywords: linear programming, investment planning, energy economics
$offText

$sTitle Set Definitions
Set
   time     'time periods'                     / 1975*2005 /
   te(time) 'extended time horizon'            / 1975, 1978, 1983, 1988, 1993, 1998, 2005 /
   t(te)    'time periods excluding base year' /       1978, 1983, 1988, 1993, 1998, 2005 /
   b        'load blocks' / peak, high, medium, low /
   m        'plant types' / hydro-1*hydro-13, gas-t, oil, lignite-1*lignite-3, nuclear /
   mh(m)    'hydro units' / hydro-1*hydro-13 /
   mt(m)    'thermal units - with vintage'
   mc(m)    'thermal units with limitations on total new capacity' / lignite-1*lignite-3 /;

Alias (t,v), (b,bp);
mt(m) = not mh(m);
display mt;

$sTitle Data:
Set labels 'for plant data'
           / initcap   'initial capacities                             (mw)'
             avail     'operational availability'
             e-fact    'energy factor for hydro plants'
             opcost    'operating costs               (mill tl per mw-year)'
             opcost-g  'annual rate of decrease in operating costs      (%)'
             capcost   'capital costs                      (mill tl per mw)'
             capcost-g 'annual rate of decrease in capital costs        (%)'
             life      'life of units                               (years)'
             maxcap    'maximum capacity - on total new capacity       (mw)' /;

Table mdatah(m,labels) 'data for hydro plants'
              initcap  avail  e-fact     opcost   capcost    life  maxcap
*                (mw)                  (mill tl  (mill tl (years)    (mw)
*                                    per mw-yr)   per mw)
   hydro-1                .9      .4        .09       1.4      50     684
   hydro-2                .9      .4        .09       4        50    1484
   hydro-3                .9      .4        .09       6.5      50     844
   hydro-4                .9      .4        .09       7        50     250
   hydro-5       1829     .9      .6        .09       3        50    2000
   hydro-6                .9      .6        .09       6.8      50     814
   hydro-7                .9      .8        .09       4.3      50     890
   hydro-8                .9      .4        .09       2.7      50    1366
   hydro-9                .9      .4        .09       4.6      50     656
   hydro-10               .9      .4        .09       6.1      50     192
   hydro-11               .9      .6        .09       3.9      50    1002
   hydro-12               .9      .6        .09       5.6      50     947
   hydro-13               .9      .8        .09       6.1      50      81;

Table mdatat(m,labels) 'data for thermal plants'
             initcap  avail      opcost  opcost-g   capcost  capcost-g     life  maxcap
*               (mw)           (mill tl       (%)  (mill tl        (%)  (years)    (mw)
*                            per mw-yr)             per mw)
   gas-t         120     .8         1.7     -.005       2.5                  30    +inf
   oil           847     .9         1.1     -.005       4.5       -.01       30    +inf
   lignite-1     960     .8          .6     -.005       5         -.01       30
   lignite-2             .8          .2     -.005       7         -.01       30    2500
   lignite-3             .8          .2     -.005       7         -.01       30    3500
   nuclear               .8          .3     -.005       9         -.02       30    +inf;

Parameter
   hlo(m,te) 'lower bound: hydro unit expansions         (mw)'
             /  hydro-4.1978   250 /
   hup(m,te) 'upper bound: hydro unit expansions         (mw)'
             / (hydro-1*hydro-3, hydro-5*hydro-7).(1978,1983)  inf
               (hydro-1*hydro-13).(1988,1993,1998,2005)        inf
                hydro-4.1978                                   250 /
   tlo(m,te) 'lower bound: thermal unit expansions       (mw)'
             / gas-t.1983  100, gas-t.1988  200, gas-t.1993  360
               gas-t.1998  600, gas-t.2005 1600                    /;

Table tup(m,te) 'upper bound on thermal unit expansions (mw)'
                              1978  1983  1988  1993  1998  2005
   gas-t                       230   390   650  1110  1580  3580
   nuclear                           600  2500  5000 10000   inf
   lignite-3                               inf   inf   inf   inf
   (oil,lignite-1,lignite-2)   inf   inf   inf   inf   inf   inf;

Table dd(b,*) 'demand data for 1975'
* In the reference the data presented in the tables actually use two sets of growth
* rates for determining future demand, and not one as stated in the text. Here the
* single growth rate (11% annually) is used.
            duration  demand
*         hrs per yr)    (mw)
   peak          526    3365
   high         2540    2550
   medium       3066    2050
   low          2628    1520;

Scalar
   rho 'interest rate'                       / .11 /
   prr 'peak reserve requirement        (%)' / .05 /
   r   'maximum aggregate hydro capacity'    / .5  /
   g   'demand growth rate       (annual %)' / .11 /;

Parameter
   length(time)    'distance from base year'
   d(b,te)         'power demand by block                              (mw)'
   dur(b)          'load duration of block               (fraction of year)'
   opcostt(m,v,t)  'operating cost for thermal units (million tl per mw-yr)'
   capcostt(m,v,t) 'capital cost for thermal units      (million tl per mw)'
   sigma(m)        'capital recovery factor'
   delta(t)        'discount factor'
   bs(b,b)         'load order matrix'
   vs(t,v)         'vintage time matrix'
   kit(m,v)        'initial capacity for thermal units                 (mw)';

length(time) =  ord(time) - 1;
bs(b,bp)     = (ord(b) >= ord(bp));
vs(t,v)      = (ord(t) >= ord(v));
opcostt(m,v,t)$vs(t,v)  = mdatat(m,"opcost")* (1 + mdatat(m,"opcost-g"))**length(v);
capcostt(m,v,t)$vs(t,v) = mdatat(m,"capcost")*(1 + mdatat(m,"capcost-g"))**length(v);

d(b,te)        = round(dd(b,"demand")*(1 + g)**length(te),0);
dur(b)         = sum(bp$bs(b,bp), dd(bp,"duration"))/sum(bp, dd(bp,"duration"));
delta(t)       = (1 + rho)**(-length(t));
sigma(mt)      = rho/(1 - (1 + rho)**(-mdatat(mt,"life")));
sigma(mh)      = rho/(1 - (1 + rho)**(-mdatah(mh,"life")));
kit(mt,"1978") = mdatat(mt,"initcap");

display length, bs, vs, opcostt, capcostt, dd, d, dur, delta, sigma;

$sTitle Model Definition
Variable
   phi         'total discounted cost                           (million tl)'
   phic(te)    'capital charges                                 (million tl)'
   phio(te)    'operating costs                                 (million tl)'
   hh(m,te)    'capacity additions: hydro units                         (mw)'
   ht(m,v)     'capacity additions: thermal units                       (mw)'
   htt(m)      'capacity additions: total thermal unit over time        (mw)'
   zh(m,b,t)   'power output: hydro                                     (mw)'
   zt(m,v,b,t) 'power output: thermal                                   (mw)';

Positive Variable zh, zt, hh, ht;

Equation
   db(b,te)    'demand balance                                          (mw)'
   pr(te)      'peak and reserve requirements                           (mw)'
   cch(m,te)   'capacity constraint: hydro                              (mw)'
   cct(m,v,te) 'capacity constraint: thermal                            (mw)'
   ech(m,te)   'hydro energy constraint                              (mw-yr)'
   hcc(te)     'hydro capacity constraint                               (mw)'
   rch(m)      'resource constraint: maximum new capacity on hydros     (mw)'
   cat(m)      'capacity accounting: total new capacity for unit        (mw)'
   ak(te)      'accounting: capital charges                     (million tl)'
   ao(te)      'accounting: operating costs                     (million tl)'
   obj         'total discounted cost                           (million tl)';

db(b,t)..     sum(bp$bs(bp,b), sum(mh, zh(mh,bp,t))
           +  sum((mt,v)$vs(t,v), zt(mt,v,bp,t)))   =g= d(b,t);

pr(t)..       sum(mh, mdatah(mh,"avail")*(mdatah(mh,"initcap") + sum(v$vs(t,v), hh(mh,v))))
           +  sum(mt, mdatat(mt,"avail")*sum(v$vs(t,v), kit(mt,v) + ht(mt,v)))
          =g= (1 + prr)*d("peak",t);

cch(mh,t)..   sum(b, zh(mh,b,t)) =l= mdatah(mh,"avail")*(mdatah(mh,"initcap")
                                  +  sum(v$vs(t,v), hh(mh,v)));

cct(mt,v,t)$vs(t,v)..
              sum(b, zt(mt,v,b,t)) =l= mdatat(mt,"avail")*(kit(mt,v) + ht(mt,v));

ech(mh,t)..   sum(b, dur(b)*zh(mh,b,t)) =l= mdatah(mh,"e-fact")*( mdatah(mh,"initcap")
                                         +  sum(v$vs(t,v), hh(mh,v)));

hcc(t)..      sum(mh, mdatah(mh,"initcap") + sum(v$vs(t,v), hh(mh,v))) =l= r*d("peak",t);

rch(mh)..     sum(t, hh(mh,t)) =l= mdatah(mh,"maxcap");

cat(mt)..     htt(mt) =e= sum(v, ht(mt,v));

ak(t).. phic(t) =e= sum(mh, sigma(mh)*mdatah(mh,"capcost")*sum(v$vs(t,v), hh(mh,v)))
                 +  sum(mt, sigma(mt)*sum(v, capcostt(mt,v,t)*ht(mt,v)));

ao(t).. phio(t) =e= sum(mh, mdatah(mh,"opcost")*sum(b, dur(b)*zh(mh,b,t)))
                 +  sum((mt,v)$vs(t,v), opcostt(mt,v,t)*sum(b, dur(b)*zt(mt,v,b,t)));

obj..       phi =e= sum(t, delta(t)*(phic(t) + phio(t)));

hh.lo(mh,t) = hlo(mh,t);
hh.up(mh,t) = hup(mh,t);
ht.lo(mt,t) = tlo(mt,t);
ht.up(mt,t) = tup(mt,t);
htt.up(mt)  = mdatat(mt,"maxcap");

Model turkey / all /;

solve turkey minimizing phi using lp;

$sTitle Report
Parameter report 'summary report';

Set reporder / power, capacity, duration, energy, e-limit, op-cost /;

report(mt,b,t)                = sum(v, zt.l(mt,v,b,t));
report(mh,b,t)                = zh.l(mh,b,t);
report("power",b,t)           = d(b,t);
report("duration",b,t)        = dur(b);
report("power","power",t)     = sum(b, report("power",b,t));
report(m,"power",t)           = sum(b, report(m,b,t));
report(mt,"capacity",t)       = sum(v$vs(t,v), kit(mt,v) + ht.l(mt,v));
report(mh,"capacity",t)       = mdatah(mh,"initcap") + sum(v$vs(t,v), hh.l(mh,v));
report("energy",b,t)          = report("power",b,t)*report("duration",b,t);
report("energy","energy",t)   = sum(b, report("energy",b,t));
report(m,"energy",t)          = sum(b, dur(b)*report(m,b,t));
report(mh,"e-limit",t)        = report(mh,"capacity",t)*mdatah(mh,"e-fact");
report(mh,"op-cost",t)        = report(mh,"energy",t)*mdatah(mh,"opcost");
report(mt,"op-cost",t)        = sum(v$vs(t,v), opcostt(mt,v,t)*sum(b, dur(b)*zt.l(mt,v,b,t)));
report("op-cost","op-cost",t) = sum(m, report(m,"op-cost",t));
report("op-cost",b,t)         = sum(mh, dur(b)*mdatah(mh,"opcost")*zh.l(mh,b,t))
                              + sum((mt,v)$vs(t,v), dur(b)*opcostt(mt,v,t)*zt.l(mt,v,b,t));

display hh.l, ht.l, report;