gasnet.gms : Optimal Design of a Gas Transmission Network

Description

A gas pipeline is to be designed to transport a fixed amount of gas from
one point to two others. Both, the initial and final stages of the gas
are known. We need to determine:

  Number of compressor stations
  Length of the pipeline segments
  Diameter of pipeline segments
  Suction and discharge pressures at each stations


Reference

  • Edgar, T F, Himmelblau, D M, and Lasdon, L S, Optimization of Chemical Processes. McGraw Hill, Boston, 2001.

Small Model of Type : MINLP


Category : GAMS Model library


Main file : gasnet.gms

$Title Optimal Design of a Gas Transmission Network (GASNET, SEQ=223)
$ontext
A gas pipeline is to be designed to transport a fixed amount of gas from
one point to two others. Both, the initial and final stages of the gas
are known. We need to determine:

  Number of compressor stations
  Length of the pipeline segments
  Diameter of pipeline segments
  Suction and discharge pressures at each stations


Edgar, T F, Himmelblau, D M, and Lasdon, L S, Optimization of
Chemical Processes. McGraw Hill, Boston, 2001.

$offtext


$eolcom !

Sets
   ii    all pipe segments / s0 * s11 /
   i(ii) pipe segments     / s1 * s11 /
         i1(i) segments one   / s1 * s3  /
         i2(i) segments two   / s4 * s7  /
         i3(i) segments three / s8 * s11 /
   j     compressors  / c1 * c10 /
   jii(j,ii,i) connections / c1.s0.s1, c2.s1.s2,  c3.s2.s3,   c4.s3.(s4,s8)
                             c5.s4.s5, c6.s5.s6,  c7.s6.s7
                             c8.s8.s9, c9.s9.s10, c10.s10.s11 /
   qi(ii,i) pipeline flow mapping
   cj(j,ii) compressor inflow mapping
   ji(j,ii) compressor pipeline flow mapping
   is(ii)   all segments less terminal segments;

cj(j,ii) = sum(i,  jii(j,ii,i));
qi(ii,i) = sum(j,  jii(j,ii,i));
ji(j,i)  = sum(ii, jii(j,ii,i));
is(ii)   = sum(j,  cj (j,ii));

Parameters

   k     suction condition      /  1.26 /
   z     compressibility factor /  0.88 /
   t     suction temperature    /   520 /

   cvar  compressor annual capital variable cost ( $ per hp) /  70 /
   cfix  compressor annual fixed cost ( $ )                  / 1e4 /
   pcost pipe capital cost ( $ per inch per mile )           / 870 /
   ocost operating cost ( $ per hp)                          /   8 /


Variables

   l(i)    pipe length
   Pd(i)   discharge pressure (psi)
   Ps(ii)  suction pressure (psi)
   D(i)    diameter (inches)
   Q(ii)   flow (MMCFD)
   CR(j)   compression ratio
   W(j)    work (hp)
   b(j)    compressor decision

   cl      pipe capital cost
   cc      compressor capital cost
   oc      operating cost
   cost
binary variable b; positive variables w;

Equations

   pdrop(i)  pressure drop in lines
   ltwo      line length two
   lthree    line length three
   qdef(i)   flow definitions
   qbal(ii)  flow balances and gas consumption
   wdef(j,i)   work definition
   crdef(j,ii,i)  compression definition
   cdef(j)

   cldef     cost of pipes
   ccdef     cost of compressors
   ocdef     operating cost
   obj       total cost;

pdrop(i).. pd(i) =g= ps(i);

ltwo..   sum(i1, l(i1)) + sum(i2, l(i2)) =e= 175;

lthree.. sum(i1, l(i1)) + sum(i3, l(i3)) =e= 200;

qdef(i).. l(i)  =e=
                sqr(871*1e-6)*d(i)**(16/3)*(sqr(pd(i))-sqr(ps(i)))/sqr(q(i));

crdef(jii(j,ii,i))..  cr(j)*ps(ii) =e= pd(i);

cdef(j).. cr(j) =l= 1 + (cr.up(j)-1)*b(j);

qbal(is)..   q(is) =e= sum(qi(is,i), q(i)) + sum(cj(j,is), 0.005*q(is)*b(j));

wdef(ji(j,i))..  w(j) =e= 0.08531*q(i)*k/(k-1)*t*(cr(j)**(z*(k-1)/k)-1);

cldef.. cl =e= sum(i, pcost*l(i)*d(i));

ccdef.. cc =e= Sum(j, cvar*w(j) + cfix*b(j));

ocdef.. oc =e= sum(j, ocost*w(j));

obj..   cost =e= cl + cc + oc;

model gasnet / all /;

* simple bounds
pd.lo(i) = 200; pd.up(i) = 1000;
ps.lo(i) = 200; ps.up(i) = 1000;
L.lo(i) = 2; L.up(i) = 200;
D.lo(i) = 4; D.up(i1) = 36; D.up(i2) = 18; D.up(i3) = 18;
cr.lo(j) = 1; cr.up(j) = 2;
q.lo(i) = 200; q.up(i) = 600;

ps.fx('s0')  = 500;  ! fix starting pressure at line one
ps.fx('s7')  = 600;  ! fix end pressure at line two
ps.fx('s11') = 300;  ! fix end pressure at line three

q.fx('s0')   = 600;  ! fix inflow at line one

l.l(i) = 20;
d.l(i) = 18;

solve gasnet minimizing cost using minlp;

parameter prep Pipe report
          crep Compressor report;

prep(i,'Discharge') = pd.l(i);
prep(i,'Suction')   = ps.l(i);
prep(i,'Diameter')   = d.l(i);
prep(i,'Length')    = l.l(i);
prep(i,'Flow')      = q.l(i);

crep(j,'Ratio')$b.l(j) = cr.l(j);
crep(j,'Work' )$b.l(j) = w.l(j);

display prep,crep;