waterld.gms : Design of a Water Distribution Network with Limited Domain of Variables

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.

This is a variant of the model WATER from this library. In this version
the domain of two of the variables is limited in the model statement.


References

  • Kendrick, D, Meeraus, A, and Suh, J S, Oil Refinery Modeling with the GAMS language. Tech. rep., Center of Energy Studies, University of Texas, 1981.
  • Aronofsky, J S, Dutton, J M, and Tayyabkhan, M T, Managerial Planning with Linear Programming. John Wiley and Sons, New York, 1978.

Small Model of Type : DNLP


Category : GAMS Model library


Main file : waterld.gms

$title Design of a Water Distribution Network with Limited Domain of Variables (WATERLD,SEQ=426)

$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.

This is a variant of the model WATER from this library. In this version
the domain of two of the variables is limited in the model statement.


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(np, q(np,n)) - sum(np, q(n,np)) + s(n)$rn(n) =e= node(n,"demand");

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

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

deq..  dcost =e= dprc*sum((n,np), dist(n,np)*d(n,np)**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, q(a), d(a) /;

solve network using dnlp minimizing cost;

display q.l;