water.gms : Design of a Water Distribution Network

Description

This example illustrates the use of nonlinear programming in the design of
water distribution systems. The model captures the main features of an
actual application for a city in Indonesia.


References

  • Brooke, A, Drud, A S, and Meeraus, A, Modeling Systems and Nonlinear Programming in a Research Environment. In Ragavan, R, and Rohde, S M, Eds, Computers in Engineering, Vol. III. ACME, 1985.
  • Drud, A S, and Rosenborg, A, Dimensioning Water Distribution Networks. Masters thesis, Institute of Mathematical Statistics and Operations Research, Technical University of Denmark, 1973. In Danish

Small Model of Type : DNLP


Category : GAMS Model library


Main file : water.gms

$title Design of a Water Distribution Network (WATER,SEQ=68)

$onText
This example illustrates the use of nonlinear programming in the design of
water distribution systems. The model captures the main features of an
actual application for a city in Indonesia.


Brooke, A, Drud, A S, and Meeraus, A, Modeling Systems and Nonlinear
Programming in a Research Environment. In Ragavan, R, and Rohde, S M,
Eds, Computers in Engineering, Vol. III. ACME, 1985.

Drud, A S, and Rosenborg, A, Dimensioning Water Distribution Networks.
Masters thesis, Institute of Mathematical Statistics and Operations
Research, Technical University of Denmark, 1973. (in Danish)

Keywords: nonlinear programming, discontinuous derivatives, water distribution,
          network optimization, engineering
$offText

Set
   n      'nodes' / nw 'north west reservoir', e 'east reservoir'
                    cc 'central city',         w 'west'
                    sw 'south west',           s 'south'
                    se 'south east',           n 'north'           /
   a(n,n) 'arcs (arbitrarily directed)'  / nw.(w,cc,n)  , e.(n,cc,s,se)
                                           cc.(w,sw,s,n), s.se, s.sw,   sw.w /
   rn(n)  'reservoirs'  / nw, e /
   dn(n)  'demand nodes';

dn(n)  = yes;
dn(rn) =  no;
display dn;

Alias (n,np);

Table node(n,*) 'node data'
          demand       height     x     y    supply   wcost   pcost
*       m**3/sec  m over base     m     m  m**3/sec rp/m**3 rp/m**4
   nw                    6.50  1200  3600     2.500    0.20    1.02
   e                     3.25  4000  2200     6.000    0.17    1.02
   cc     1.212          3.02  2000  2300
   w      0.452          5.16   750  2400
   sw     0.245          4.20   900  1200
   s      0.652          1.50  2000  1000
   se     0.252          0.00  4000   900
   n      0.456          6.30  3700  3500                          ;

Parameter dist(n,n) 'distance between nodes (m)';

dist(a(n,np)) = sqrt(sqr(node(n,"x") - node(np,"x")) + sqr(node(n,"y") - node(np,"y")));
display dist;

Scalar
   dpow  'power on diameter in pressure loss equation'  / 5.33    /
   qpow  'power on flow in pressure loss equation'      / 2.00    /
   dmin  'minimum diameter of pipe'                     / 0.15    /
   dmax  'maximum diameter of pipe'                     / 2.00    /
   hloss 'constant in the pressure loss equation'       / 1.03e-3 /
   dprc  'scale factor in the investment cost equation' / 6.90e-2 /
   cpow  'power on diameter in the cost equation'       / 1.29    /
   r     'interest rate'                                / 0.10    /
   davg  'average diameter (geometric mean)'
   rr    'ratio of demand to supply';

davg = sqrt(dmin*dmax);
rr   = sum(dn, node(dn,"demand"))/sum(rn, node(rn,"supply"));

Variable
   q(n,n)    'flow on each arc - signed   (m**3 per sec)'
   d(n,n)    'pipe diameter for each arc             (m)'
   h(n)      'pressure at each node                  (m)'
   s(n)      'supply at reservoir nodes   (m**3 per sec)'
   pcost     'annual recurrent pump costs      (mill rp)'
   dcost     'investment costs for pipes       (mill rp)'
   wcost     'annual recurrent water costs     (mill rp)'
   cost      'total discounted costs           (mill rp)';

Equation
   cont(n)   'flow conservation equation at each node'
   loss(n,n) 'pressure loss on each arc'
   peq       'pump cost equation'
   deq       'investment cost equation'
   weq       'water cost equation'
   obj       'objective function';

cont(n)..       sum(a(np,n), q(a)) - sum(a(n,np), q(a)) + s(n)$rn(n) =e= node(n,"demand");

loss(a(n,np)).. h(n) - h(np) =e= (hloss*dist(a)*abs(q(a))**(qpow-1)*q(a)/d(a)**dpow)$(qpow <> 2)
                              +   (hloss*dist(a)*abs(q(a))         *q(a)/d(a)**dpow)$(qpow  = 2);

peq..  pcost =e= sum(rn, s(rn)*node(rn,"pcost")*(h(rn) - node(rn,"height")));

deq..  dcost =e= dprc*sum(a, dist(a)*d(a)**cpow);

weq..  wcost =e= sum(rn, s(rn)*node(rn,"wcost"));

obj..  cost  =e= (pcost + wcost)/r + dcost;

d.lo(a)  = dmin;
d.up(a)  = dmax;
h.lo(rn) = node(rn,"height");
h.lo(dn) = node(dn,"height") + 7.5 + 5.0*node(dn,"demand");
s.lo(rn) = 0;
s.up(rn) = node(rn,"supply");
d.l(a)   = davg;
h.l(n)   = h.lo(n) + 1.0;
s.l(rn)  = node(rn,"supply")*rr;

Model network / all /;

solve network using dnlp minimizing cost;

display q.l;