{"id":272,"date":"2021-03-15T12:46:05","date_gmt":"2021-03-15T16:46:05","guid":{"rendered":"https:\/\/people.clas.ufl.edu\/hager\/?page_id=272"},"modified":"2026-03-19T08:18:25","modified_gmt":"2026-03-19T12:18:25","slug":"optpack","status":"publish","type":"page","link":"https:\/\/people.clas.ufl.edu\/hager\/optpack\/","title":{"rendered":"OPTPACK"},"content":{"rendered":"\r\n<section class=\"fullwidth-text-block\">\r\n\t<div class=\"container px-0 pt-5\">\r\n\t\t<div class=\"row align-items-start\">\r\n\t\t\t<div class=\"col-12\">\r\n\t\t\t\t\n<h1 class=\"wp-block-heading\">OPTPACK<\/h1>\n\n\n\n<p>c  OPTPACK was developed to test an algorithm presented in the paper<br>\nc  &#8220;Analysis and implementation of a dual algorithm for constrained<br>\nc  optimization,&#8221; Journal of Optimization Theory and Applications, 79 (1993),<br>\nc  pp. 427-462.  I have tested the software using the test problems<br>\nc  described in that paper as well other other research type problems, however,<br>\nc  I make no guarantees concerning the code.<br>\nc<br>\nc  There are comment statements at the start of the 3 main routines<br>\nc  (bmin for bound constraints, lmin for bound + linear inequality constraints,<br>\nc  and min for bound + linear inequality + nonlinear constraints).<br>\nc  I can provide pointers, but the user is pretty much on his own.<br>\nc<br>\nc                    Bill Hager<br>\nc<br>\nc  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br>\nc           \/  \/  \/   ____\/     William W. Hager<br>\nc          \/  \/  \/   \/          358 Little Hall<br>\nc         \/  \/  \/   ____\/       Department of Mathematics<br>\nc        \/__\/  \/   \/            UNIVERSITY OF FLORIDA<br>\nc      _______\/ __\/             Gainesville FL 32611-8105<br>\nc<br>\nc    Phone :  (352) 392-0281 x 244 E-mail :  hager@math.ufl.edu<br>\nc    FAX   :  (352) 392-6254<br>\nc    http:\/\/www.math.ufl.edu\/~hager<br>\nc  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<\/p>\n\n\n\n\n\n<p>C      ________________________________________________________<br>\nC     |                                                        |<br>\nC     |SOLVE AN OPTIMIZATION PROBLEM WITH NONLINEAR CONSTRAINTS|<br>\nC     |         (ALL REAL VARIABLE ARE DOUBLE PRECISION)       |<br>\nC     |                                                        |<br>\nC     | INPUT:                                                 |<br>\nC     |                                                        |<br>\nC     |      X     &#8211;STARTING GUESS (LENGTH AT LEAST N)        |<br>\nC     |                                                        |<br>\nC     |      ST    &#8211;INITIAL STEP SIZE (WHEN ST = 0., PROGRAM  |<br>\nC     |              SELECTS INITIAL STEP                      |<br>\nC     |                                                        |<br>\nC     |      IN    &#8211;DESCRIBES THE STARTING POINT              |<br>\nC     |              =0, INFEASIBLE STARTING POINT, ALL        |<br>\nC     |                  CONSTRAINTS NONBINDING INITIALLY      |<br>\nC     |              =1, INFEASIBLE STARTING POINT, BINDING    |<br>\nC     |                  CONSTRAINTS ARE GIVEN BY VALUES OF IA |<br>\nC     |              =2, INFEASIBLE STARTING POINT, BINDING    |<br>\nC     |                  CONSTRAINTS DETERMINED BY X           |<br>\nC     |              =3, INFEASIBLE STARTING POINT, USE K, IA, |<br>\nC     |                  AND U AS GIVEN                        |<br>\nC     |              =4, FEASIBLE STARTING POINT, ALL          |<br>\nC     |                  CONSTRAINTS NONBINDING INITIALLY      |<br>\nC     |              =5, FEASIBLE STARTING POINT, BINDING      |<br>\nC     |                  CONSTRAINTS ARE GIVEN BY VALUES OF IA |<br>\nC     |              =6, FEASIBLE STARTING POINT, BINDING      |<br>\nC     |                  CONSTRAINTS DETERMINED BY X           |<br>\nC     |              =7, FEASIBLE STARTING POINT, USE K, IA,   |<br>\nC     |                  AND U AS GIVEN                        |<br>\nC     |                                                        |<br>\nC     |      TL    &#8211;ERROR TOLERANCE (INFINITY NORM OF KUHN-   |<br>\nC     |              TUCKER ERROR + CONSTRAINT VIOLATION)      |<br>\nC     |                                                        |<br>\nC     |      LM    &#8211;MAXIMUM NUMBER OF ITERATIONS              |<br>\nC     |                                                        |<br>\nC     |      PNI   &#8211;INPUT PENALTY PARAMETER (TRY PNI= 0 FIRST,|<br>\nC     |              IF A POSITIVE PENALTY IS REQUIRED, PROGRAM|<br>\nC     |              STOPS, CALL ERR(IO) TO GET ERROR MESSAGE) |<br>\nC     |                                                        |<br>\nC     |      A     &#8211;COEFFICIENT MATRIX FOR LINEAR CONSTRAINTS |<br>\nC     |              (AT LEAST L+NL ROWS)                      |<br>\nC     |                                                        |<br>\nC     |      LA    &#8211;LEADING DIMENSION OF A ARRAY              |<br>\nC     |                                                        |<br>\nC     |      LG    &#8211;LEADING DIMENSION OF DG ARRAY             |<br>\nC     |                                                        |<br>\nC     |      L     &#8211;NUMBER OF LINEAR EQUALITY CONSTRAINTS     |<br>\nC     |                                                        |<br>\nC     |      NL    &#8211;NUMBER OF NONLINEAR EQUALITY CONSTRAINTS  |<br>\nC     |                                                        |<br>\nC     |      N     &#8211;NUMBER OF UNKNOWNS                        |<br>\nC     |                                                        |<br>\nC     |      B     &#8211;RIGHT SIDE VECTOR FOR LINEAR CONSTRAINTS  |<br>\nC     |                                                        |<br>\nC     |      BL    &#8211;LOWER BOUNDS FOR COMPONENTS OF X          |<br>\nC     |                                                        |<br>\nC     |      BU    &#8211;UPPER BOUNDS FOR COMPONENTS OF X          |<br>\nC     |                                                        |<br>\nC     |      CT    &#8211;CUTOFF FOR DECIDING IF A CONSTRAINT IS    |<br>\nC     |              BINDING (FOR EXAMPLE, .0001 TIMES ESTIMATE|<br>\nC     |              OF NORM OF TRUE SOLUTION)                 |<br>\nC     |                                                        |<br>\nC     |      VLF   &#8211;NAME OF ROUTINE TO EVALUATE COST FUNTION  |<br>\nC     |                                                        |<br>\nC     |      VLG   &#8211;NAME OF ROUTINE TO EVALUATE CONSTRAINTS   |<br>\nC     |                                                        |<br>\nC     |      GRF   &#8211;NAME OF ROUTINE TO EVALUATE COST GRADIENT |<br>\nC     |                                                        |<br>\nC     |      GRG   &#8211;NAME OF ROUTINE TO EVALUATE CONSTRAINT    |<br>\nC     |              GRADIENT                                  |<br>\nC     |                                                        |<br>\nC     |      W     &#8211;WORK ARRAY (LENGTH AT LEAST 5M+3N IF      |<br>\nC     |              PENALTY NOT INCREASED, LENGTH AT LEAST    |<br>\nC     |              .5NL(NL+5)+L+3N OTHERWISE                 |<br>\nC     |                                                        |<br>\nC     |                                                        |<br>\nC     | OUTPUT:                                                |<br>\nC     |                                                        |<br>\nC     |      X     &#8211;SOLUTION                                  |<br>\nC     |                                                        |<br>\nC     |      LE    &#8211;MULTIPLIERS FOR EQUALITY CONSTRAINTS      |<br>\nC     |              (LENGTH AT LEAST L+NL)                    |<br>\nC     |                                                        |<br>\nC     |      LI    &#8211;MULTIPLIERS FOR INEQUALITY CONSTRAINTS    |<br>\nC     |              (LENGTH AT LEAST N)                       |<br>\nC     |                                                        |<br>\nC     |      U     &#8211;CHOLESKY FACTORIZATION ASSOCIATED WITH    |<br>\nC     |              CONSTRAINT PROJECTION (LENGTH AT LEAST    |<br>\nC     |              .5M(M+1) WHERE M = L + NL)                |<br>\nC     |                                                        |<br>\nC     |      IA    &#8211;= 0 IF CONSTRAINT IS NONBINDING           |<br>\nC     |              = 1 IF CONSTRAINT IS AT UPPER BOUND       |<br>\nC     |              =-1 IF CONSTRAINT IS AT LOWER BOUND       |<br>\nC     |               (INTEGER ARRAY WITH AT LEAST N ELEMENTS) |<br>\nC     |                                                        |<br>\nC     |      K     &#8211;NUMBER OF FREE VARIABLES                  |<br>\nC     |                                                        |<br>\nC     |      F     &#8211;VALUE OF COST AT OPTIMAL POINT            |<br>\nC     |                                                        |<br>\nC     |      G     &#8211;VALUE OF CONSTRAINTS AT OPTIMAL POINT     |<br>\nC     |              (LENGTH AT LEAST NL)                      |<br>\nC     |                                                        |<br>\nC     |      DF   &#8211;DERIVATIVE OF COST AT OPTIMAL POINT        |<br>\nC     |             (LENGTH AT LEAST N)                        |<br>\nC     |                                                        |<br>\nC     |      DG   &#8211;DERIVATIVE OF CONSTRAINTS AT OPTIMAL POINT |<br>\nC     |                                                        |<br>\nC     |      E     &#8211;ERROR TOLERANCE (INFINITY NORM OF KUHN-   |<br>\nC     |              TUCKER ERROR + CONSTRAINT VIOLATION)      |<br>\nC     |                                                        |<br>\nC     |      IT    &#8211;NUMBER OF ITERATIONS                      |<br>\nC     |                                                        |<br>\nC     |      ST    &#8211;FINAL STEP SIZE                           |<br>\nC     |                                                        |<br>\nC     |      PN    &#8211;FINAL VALUE OF PENALTY                    |<br>\nC     |                                                        |<br>\nC     |      IO    &#8211;ERROR FLAG (CALL ERR(IO) TO SEE IF AN     |<br>\nC     |              ERROR WAS DETECTED)                       |<br>\nC     |________________________________________________________|<br>\nC<br>\n      subroutine min(x,le,li,u,ia,k,f,g,df,dg,e,it,st,pn,io,<br>\n     1        in,tl,lm,pni,a,la,lg,l,nl,n,b,bl,bu,ct,vlf,vlg,grf,grg,w)<br>\n      integer ia(1),i,in,io,ip,is,it,j,k,l,la,lg,lm<br>\n      integer m,m1,m2,m3,m4,m5,m6,m7,n,nl,n1,n2,n3,n4<br>\n      real*8 a(la,1),b(1),bl(1),bu(1),df(1),dg(lg,1),g(1),le(1),li(1)<br>\n      real*8 u(1),w(1),x(1),big,ct,e,f,kt,pn,pni,r,s,st,t,tl,vlf<br>\n      external grf,grg,vlf,vlg<br>\n      m = l + nl<br>\n      if ( m .le. n ) goto 10<br>\n      io = 8<br>\n      return<br>\n10    if ( m .gt. 0 ) goto 20<br>\n      call bmin(x,ia,k,f,df,e,it,st,io,in,tl,lm,n,bl,bu,ct,vlf,grf,w)<br>\n      return<br>\n20    if ( nl .gt. 0 ) goto 25<br>\n      call lmin(x,le,li,u,ia,k,f,df,e,it,st,io,<br>\n     &amp;           in,tl,lm,a,la,l,n,b,bl,bu,ct,vlf,grf,w)<br>\n      return<br>\n25    m1 = m + 1<br>\n      m2 = m + m1<br>\n      m3 = m + m2<br>\n      m4 = m + m3<br>\n      m5 = n + m4<br>\n      m6 = m + m5 + n<br>\n      m7 = m6 &#8211; 1<br>\n      n1 = .5*(nl*nl+nl) + 1<br>\n      n2 = n1 + nl<br>\n      n3 = n2 + l<br>\n      n4 = n3 + nl<br>\n      pn = pni<br>\nc<br>\nc     largest floating point number<br>\nc<br>\n      big = 1.d50<br>\n      if ( in .lt. 4 ) goto 110<br>\n      if ( in .eq. 7 ) goto 130<br>\n      k = n &#8211; l<br>\n      if ( in .eq. 6 ) goto 60<br>\n      if ( in .eq. 5 ) goto 40<br>\n      do 30 i = 1,n<br>\n30         ia(i) = 0<br>\n      goto 90<br>\n40    do 50 i = 1,n<br>\n           if ( ia(i) .eq. 0 ) goto 50<br>\n           k = k &#8211; 1<br>\n           if ( ia(i) .gt. 0 ) x(i) = bu(i)<br>\n           if ( ia(i) .lt. 0 ) x(i) = bl(i)<br>\n50    continue<br>\n      goto 90<br>\n60    do 80 i = 1,n<br>\n           ia(i) = 0<br>\n           if ( x(i) .le. bl(i) ) goto 70<br>\n           if ( x(i) .lt. bu(i) ) goto 80<br>\n           k = k &#8211; 1<br>\n           x(i) = bu(i)<br>\n           ia(i) = 1<br>\n           goto 80<br>\n70         k = k &#8211; 1<br>\n           x(i) = bl(i)<br>\n           ia(i) = -1<br>\n80    continue<br>\n90    if ( k .ge. 0 ) goto 100<br>\n      io = 1<br>\n      return<br>\n100   call mat(u,ia,a,la,l,n,0)<br>\n      call fac(u,0,l,io)<br>\n      if ( io .eq. 0 ) goto 130<br>\n      io = 1<br>\n      return<br>\n110   call feas(li,u,ia,k,io,in,x,a,la,l,n,b,bl,bu,w)<br>\n      do 120 i = 1,n<br>\n120        x(i) = li(i)<br>\n      if ( io .gt. 0 ) return<br>\n130   f = vlf(x)<br>\n      call vlg(g,x)<br>\n      call grf(df,x)<br>\n      call grg(dg,x)<br>\n      it = 0<br>\n      io = 0<br>\n      call erg(t,g,nl)<br>\n140   is = 0<br>\n      ip = 0<br>\n      if ( k .lt. nl ) ip = 1<br>\n      if ( k .ge. nl ) k = k &#8211; nl<br>\n      call xpn(u,l,m)<br>\n      call fat(u,io,ip,ia,a,la,l,n,g,w(l+1),w(m2),dg,lg,nl,m)<br>\n      call err(io)<br>\n      if ( io .gt. 0 ) goto 420<br>\n      call mul(le,li,s,u,ia,a,la,m,n,df,l,nl,w(m2))<br>\n      e = s + t<br>\n      if ( e .le. tl ) return<br>\n      kt = .95*e<br>\n      goto 190<br>\n150   call fat(u,io,ip,ia,a,la,l,n,g,w(l+1),w(m2),dg,lg,nl,m)<br>\n      call err(io)<br>\n      if ( io .gt. 0 ) goto 420<br>\n      call mul(w(m1),li,s,u,ia,a,la,m,n,df,l,nl,w(m2))<br>\n      e = s + t<br>\n      if ( e .gt. tl ) goto 180<br>\n160   do 170 i = 1,m<br>\n170        le(i) = w(i+m)<br>\n      return<br>\n180   if ( t .le. s ) goto 320<br>\n190   is = is + 1<br>\n      if ( is .lt. 40 ) goto 200<br>\n      io = 6<br>\n      return<br>\n200   if ( l .eq. 0 ) goto 230<br>\n      do 210 i = 1,l<br>\n210        w(i) = b(i)<br>\n      do 220 j = 1,n<br>\n           s = x(j)<br>\n           do 220 i = 1,l<br>\n220             w(i) = w(i) &#8211; s*a(i,j)<br>\n230   do 240 i = 1,n<br>\n240        w(i+m7) = ia(i)<br>\n      if ( ip .eq. 1 ) goto 250<br>\n      call nf1(li,u,ia,k,io,x,a,la,m,n,w,bl,bu,w(m1),w(m2),w(m2+n))<br>\n      call err(io)<br>\n      if ( io .gt. 0 ) goto 420<br>\n      if ( io .eq. 0 ) goto 290<br>\n      io = 0<br>\n      goto 300<br>\n250   do 260 i = 1,m<br>\n           w(i+m) = 0.<br>\n260        if ( i .gt. l ) w(i+m) = 1.<br>\n      call nf2(li,u,ia,k,io,x,a,la,m,n,w,w(m1),bl,bu,w(m2),w(m3),w(m5))<br>\n      if ( io .eq. 0 ) goto 280<br>\n      do 270 i = 1,n<br>\n           j = w(i+m7)<br>\n           call mod(u,ia,k,io,a,la,m,i,j,w)<br>\n           if ( io .gt. 0 ) return<br>\n270   continue<br>\n      goto 420<br>\n280   ip = 0<br>\n290   call lsq(li,u,ia,k,io,x,a,la,m,n,bl,bu,w,w(m1),w(m2))<br>\n      call err(io)<br>\n      if ( io .gt. 0 ) goto 420<br>\n300   do 310 i = 1,n<br>\n310        w(i) = x(i)<br>\n      call arm(x,li,w,u,ia,k,io,t,w(m6),a,la,m,n,vlg,g,nl,tl)<br>\n      f = vlf(x)<br>\n      call grf(df,x)<br>\n      call grg(dg,x)<br>\n      if ( io .eq. 0 ) goto 150<br>\n      return<br>\n320   r = .95*s<br>\n      is = -1<br>\n      do 330 i = 1,m<br>\n330        le(i) = w(i+m)<br>\n340   is = is + 1<br>\n      if ( is .le. 3 ) goto 350<br>\n      if ( e .le. kt ) goto 390<br>\n      goto 420<br>\n350   j = k<br>\n      call cgn(x,e,i,st,io,.1*tl,j,lm-it,n,is,vlf,vlg,grf,grg,<br>\n     1 nl,pn,a,la,m,bl,bu,ct,u,ia,k,le(l+1),f,g,df,dg,lg,<br>\n     2 w,w(m1),w(m2),w(m3),w(m4))<br>\n      call err(io)<br>\n      it = it + i<br>\n      if ( io .gt. 0 ) return<br>\n      call erg(t,g,nl)<br>\n      call fat(u,io,ip,ia,a,la,l,n,g,w(l+1),w(m2),dg,lg,nl,m)<br>\n      call err(io)<br>\n      if ( io .gt. 0 ) return<br>\n      call mul(w(m1),li,s,u,ia,a,la,m,n,df,l,nl,w(m2))<br>\n      e = s + t<br>\n      if ( e .le. tl ) goto 160<br>\n      if ( it .lt. lm ) goto 360<br>\n      io = 9<br>\n      goto 160<br>\n360   if ( s .gt. r ) goto 380<br>\n      r = .95*s<br>\n      is = 0<br>\n      do 370 i = 1,m<br>\n370        le(i) = w(i+m)<br>\n      if ( 4.*t .lt. s ) goto 340<br>\n      if ( e .gt. kt ) goto 410<br>\n      kt = .95*e<br>\n      goto 190<br>\n380   if ( t .gt. .5*kt ) goto 420<br>\n      if ( 4.*t .lt. s ) goto 340<br>\n      if ( e .gt. kt ) goto 410<br>\n390   kt = .95*e<br>\n      is = 0<br>\n      do 400 i = 1,m<br>\n400        le(i) = w(i+m)<br>\n      goto 190<br>\n410   if ( t .le. .25*kt ) goto 340<br>\n420   call shk(u,l,m)<br>\n      is = 0<br>\n      if ( ip .eq. 0 ) k = k + nl<br>\n      if ( it .gt. 0 ) pn = 5.*pn<br>\n      if ( pn .gt. 0. ) goto 430<br>\n      io = 7<br>\n      return<br>\n430   j = k<br>\n      call cgp(x,e,i,st,io,.1*tl,j,lm-it,n,vlf,vlg,grf,grg,<br>\n     1 l,nl,pn,a,la,bl,bu,ct,u,ia,k,le(l+1),f,g,df,dg,lg,<br>\n     2 w,w(n1),w(n2),w(n3),w(n4))<br>\n      call err(io)<br>\n      it = it + i<br>\n      if ( io .gt. 0 ) return<br>\n      if ( it .lt. lm ) goto 440<br>\n      io = 9<br>\n      return<br>\n440   call erg(t,g,nl)<br>\n      call xpn(u,l,m)<br>\n      ip = 0<br>\n      if ( k .lt. nl ) ip = 1<br>\n      if ( k .ge. nl ) k = k &#8211; nl<br>\n      call fat(u,io,ip,ia,a,la,l,n,g,w(l+1),w(m2),dg,lg,nl,m)<br>\n      call err(io)<br>\n      if ( io .gt. 0 ) return<br>\n      call mul(w(m1),li,s,u,ia,a,la,m,n,df,l,nl,w(m2))<br>\n      r = e<br>\n      e = s + t<br>\n      if ( e .le. tl ) goto 160<br>\n      if ( e .le. .6*kt ) goto 450<br>\n      if ( r .le. t ) goto 460<br>\n      call shk(u,l,m)<br>\n      if ( ip .eq. 0 ) k = k + nl<br>\n      goto 430<br>\n450   pn = pn*.4<br>\n460   do 470 i = 1,m<br>\n470        le(i) = w(i+m)<br>\n      kt = e<br>\n      goto 190<br>\n      end<br>\nC      ________________________________________________________<br>\nC     |                                                        |<br>\nC     | SOLVE AN OPTIMIZATION PROBLEM WITH UPPER AND LOWER     |<br>\nC     |                    BOUND CONSTRAINTS                   |<br>\nC     |        (ALL REAL VARIABLE ARE DOUBLE PRECISION)        |<br>\nC     |                                                        |<br>\nC     | INPUT:                                                 |<br>\nC     |                                                        |<br>\nC     |      X     &#8211;STARTING GUESS (LENGTH AT LEAST N)        |<br>\nC     |                                                        |<br>\nC     |      ST    &#8211;INITIAL STEP SIZE (WHEN ST = 0., PROGRAM  |<br>\nC     |              SELECTS INITIAL STEP                      |<br>\nC     |                                                        |<br>\nC     |      IN    &#8211;DESCRIBES THE STARTING POINT              |<br>\nC     |              =0, ALL CONSTRAINTS NONBINDING INITIALLY  |<br>\nC     |              =1, BINDING CONSTRAINTS GIVEN BY IA       |<br>\nC     |              =2, BINDING CONSTRAINTS DETERMINED BY X   |<br>\nC     |              =3, USE K, IA, AND W AS GIVEN             |<br>\nC     |                                                        |<br>\nC     |      TL    &#8211;ERROR TOLERANCE (INFINITY NORM OF KUHN-   |<br>\nC     |              TUCKER ERROR + CONSTRAINT VIOLATION)      |<br>\nC     |                                                        |<br>\nC     |      LM    &#8211;MAXIMUM NUMBER OF ITERATIONS              |<br>\nC     |                                                        |<br>\nC     |      N     &#8211;NUMBER OF UNKNOWNS                        |<br>\nC     |                                                        |<br>\nC     |      BL    &#8211;LOWER BOUNDS FOR COMPONENTS OF X          |<br>\nC     |                                                        |<br>\nC     |      BU    &#8211;UPPER BOUNDS FOR COMPONENTS OF X          |<br>\nC     |                                                        |<br>\nC     |      CT    &#8211;CUTOFF FOR DECIDING IF A CONSTRAINT IS    |<br>\nC     |              BINDING (FOR EXAMPLE, .0001 TIMES ESTIMATE|<br>\nC     |              OF NORM OF TRUE SOLUTION)                 |<br>\nC     |                                                        |<br>\nC     |      VL    &#8211;NAME OF ROUTINE TO EVALUATE COST FUNTION  |<br>\nC     |                                                        |<br>\nC     |      GR    &#8211;NAME OF ROUTINE TO EVALUATE COST GRADIENT |<br>\nC     |                                                        |<br>\nC     |      W     &#8211;WORK ARRAY (LENGTH AT LEAST 3N)           |<br>\nC     |                                                        |<br>\nC     | OUTPUT:                                                |<br>\nC     |                                                        |<br>\nC     |      X     &#8211;SOLUTION                                  |<br>\nC     |                                                        |<br>\nC     |      IA    &#8211;= 0 IF CONSTRAINT IS NONBINDING           |<br>\nC     |              = 1 IF CONSTRAINT IS AT UPPER BOUND       |<br>\nC     |              =-1 IF CONSTRAINT IS AT LOWER BOUND       |<br>\nC     |               (INTEGER ARRAY WITH AT LEAST N ELEMENTS) |<br>\nC     |                                                        |<br>\nC     |      K     &#8211;NUMBER OF FREE VARIABLES                  |<br>\nC     |                                                        |<br>\nC     |      VF    &#8211;VALUE OF COST AT OPTIMAL POINT            |<br>\nC     |                                                        |<br>\nC     |      DF    &#8211;DERIVATIVE OF COST AT OPTIMAL POINT       |<br>\nC     |              (LENGTH AT LEAST N)                       |<br>\nC     |                                                        |<br>\nC     |      E     &#8211;ERROR TOLERANCE (INFINITY NORM OF KUHN-   |<br>\nC     |              TUCKER ERROR + CONSTRAINT VIOLATION)      |<br>\nC     |                                                        |<br>\nC     |      IT    &#8211;NUMBER OF ITERATIONS                      |<br>\nC     |                                                        |<br>\nC     |      ST    &#8211;FINAL STEP SIZE                           |<br>\nC     |                                                        |<br>\nC     |      IO    &#8211;ERROR FLAG (CALL ERR(IO) TO SEE IF AN     |<br>\nC     |              ERROR WAS DETECTED)                       |<br>\nC     |________________________________________________________|<br>\nC<br>\n      subroutine bmin<br>\n     1      (x,ia,k,vf,df,e,it,st,io,in,tl,lm,n,bl,bu,ct,vl,gr,w)<br>\n      real*8 a(1),b(1),bl(1),bu(1),c(1),df(1),x(1),u(1),w(1)<br>\n      real*8 ct,e,st,t,tl,vf,vl<br>\n      integer ia(1),i,in,io,it,j,k,lm,n<br>\n      external gr,vl<br>\n      it = 0<br>\n      io = 0<br>\n      if ( in .eq. 3 ) goto 80<br>\n      k = n<br>\n      do 10 i = 1,n<br>\n           if ( bl(i) .lt. bu(i) ) goto 10<br>\n           t = bl(i)<br>\n           bl(i) = bu(i)<br>\n           bu(i) = t<br>\n10    continue<br>\n      if ( in .eq. 2 ) goto 50<br>\n      if ( in .eq. 1 ) goto 30<br>\n      do 20 i = 1,n<br>\n20         ia(i) = 0<br>\n      goto 80<br>\n30    do 40 i = 1,n<br>\n           if ( ia(i) .eq. 0 ) goto 40<br>\n           k = k &#8211; 1<br>\n           if ( ia(i) .gt. 0 ) x(i) = bu(i)<br>\n           if ( ia(i) .lt. 0 ) x(i) = bl(i)<br>\n40    continue<br>\n      goto 80<br>\n50    do 70 i = 1,n<br>\n           ia(i) = 0<br>\n           if ( x(i) .lt. bu(i) ) goto 60<br>\n           x(i) = bu(i)<br>\n           ia(i) = 1<br>\n           k = k &#8211; 1<br>\n           goto 70<br>\n60         if ( x(i) .gt. bl(i) ) goto 70<br>\n           x(i) = bl(i)<br>\n           ia(i) = -1<br>\n           k = k &#8211; 1<br>\n70    continue<br>\n80    call gr(df,x)<br>\n      vf = vl(x)<br>\n90    j = k<br>\n      call cgl(x,e,i,st,io,tl,j,lm-it,n,vl,gr,<br>\n     1         a,1,0,bl,bu,ct,u,ia,k,vf,df,b,c,w)<br>\n      it = it + i<br>\n      if ( io .gt. 0 ) return<br>\n      if ( e .le. tl ) return<br>\n      if ( it .lt. lm ) goto 90<br>\n      io = 9<br>\n      return<br>\n      end<br>\nC      ________________________________________________________<br>\nC     |                                                        |<br>\nC     | SOLVE AN OPTIMIZATION PROBLEM WITH LINEAR CONSTRAINTS  |<br>\nC     |         (ALL REAL VARIABLE ARE DOUBLE PRECISION)       |<br>\nC     |                                                        |<br>\nC     | INPUT:                                                 |<br>\nC     |                                                        |<br>\nC     |      X     &#8211;STARTING GUESS (LENGTH AT LEAST N)        |<br>\nC     |                                                        |<br>\nC     |      ST    &#8211;INITIAL STEP SIZE (WHEN ST = 0., PROGRAM  |<br>\nC     |              SELECTS INITIAL STEP                      |<br>\nC     |                                                        |<br>\nC     |      IN    &#8211;DESCRIBES THE STARTING POINT              |<br>\nC     |              =0, INFEASIBLE STARTING POINT, ALL        |<br>\nC     |                  CONSTRAINTS NONBINDING INITIALLY      |<br>\nC     |              =1, INFEASIBLE STARTING POINT, BINDING    |<br>\nC     |                  CONSTRAINTS ARE GIVEN BY VALUES OF IA |<br>\nC     |              =2, INFEASIBLE STARTING POINT, BINDING    |<br>\nC     |                  CONSTRAINTS DETERMINED BY X           |<br>\nC     |              =3, INFEASIBLE STARTING POINT, USE K, IA, |<br>\nC     |                  AND W AS GIVEN                        |<br>\nC     |              =4, FEASIBLE STARTING POINT, ALL          |<br>\nC     |                  CONSTRAINTS NONBINDING INITIALLY      |<br>\nC     |              =5, FEASIBLE STARTING POINT, BINDING      |<br>\nC     |                  CONSTRAINTS ARE GIVEN BY VALUES OF IA |<br>\nC     |              =6, FEASIBLE STARTING POINT, BINDING      |<br>\nC     |                  CONSTRAINTS DETERMINED BY X           |<br>\nC     |              =7, FEASIBLE STARTING POINT, USE K, IA,   |<br>\nC     |                  AND U AS GIVEN                        |<br>\nC     |                                                        |<br>\nC     |      TL    &#8211;ERROR TOLERANCE (INFINITY NORM OF KUHN-   |<br>\nC     |              TUCKER ERROR + CONSTRAINT VIOLATION)      |<br>\nC     |                                                        |<br>\nC     |      LM    &#8211;MAXIMUM NUMBER OF ITERATIONS              |<br>\nC     |                                                        |<br>\nC     |      A     &#8211;COEFFICIENT MATRIX FOR LINEAR CONSTRAINTS |<br>\nC     |              (AT LEAST M ROWS)                         |<br>\nC     |                                                        |<br>\nC     |      LA    &#8211;LEADING DIMENSION OF A ARRAY              |<br>\nC     |                                                        |<br>\nC     |      M     &#8211;NUMBER OF EQUALITY CONSTRAINTS            |<br>\nC     |                                                        |<br>\nC     |      N     &#8211;NUMBER OF UNKNOWNS                        |<br>\nC     |                                                        |<br>\nC     |      B     &#8211;RIGHT SIDE VECTOR FOR LINEAR CONSTRAINTS  |<br>\nC     |              (LENGTH AT LEAST M)                       |<br>\nC     |                                                        |<br>\nC     |      BL    &#8211;LOWER BOUNDS FOR COMPONENTS OF X          |<br>\nC     |                                                        |<br>\nC     |      BU    &#8211;UPPER BOUNDS FOR COMPONENTS OF X          |<br>\nC     |                                                        |<br>\nC     |      CT    &#8211;CUTOFF FOR DECIDING IF A CONSTRAINT IS    |<br>\nC     |              BINDING (FOR EXAMPLE, .0001 TIMES ESTIMATE|<br>\nC     |              OF NORM OF TRUE SOLUTION)                 |<br>\nC     |                                                        |<br>\nC     |      VL    &#8211;NAME OF ROUTINE TO EVALUATE COST FUNTION  |<br>\nC     |                                                        |<br>\nC     |      GR    &#8211;NAME OF ROUTINE TO EVALUATE COST GRADIENT |<br>\nC     |                                                        |<br>\nC     |      W     &#8211;WORK ARRAY(LENGTH AT LEAST MAX(4M+2N,M+3N)|<br>\nC     |                                                        |<br>\nC     | OUTPUT:                                                |<br>\nC     |                                                        |<br>\nC     |      X     &#8211;SOLUTION                                  |<br>\nC     |                                                        |<br>\nC     |      LE    &#8211;MULTIPLIERS FOR EQUALITY CONSTRAINTS      |<br>\nC     |                                                        |<br>\nC     |      LI    &#8211;MULTIPLIERS FOR INEQUALITY CONSTRAINTS    |<br>\nC     |                                                        |<br>\nC     |      U     &#8211;CHOLESKY FACTORIZATION ASSOCIATED WITH    |<br>\nC     |              CONSTRAINT PROJECTION                     |<br>\nC     |              (LENGTH AT LEAST .5M(M+1))                |<br>\nC     |                                                        |<br>\nC     |      IA    &#8211;= 0 IF CONSTRAINT IS NONBINDING           |<br>\nC     |              = 1 IF CONSTRAINT IS AT UPPER BOUND       |<br>\nC     |              =-1 IF CONSTRAINT IS AT LOWER BOUND       |<br>\nC     |               (INTEGER ARRAY WITH AT LEAST N ELEMENTS) |<br>\nC     |                                                        |<br>\nC     |      K     &#8211;NUMBER OF FREE VARIABLES                  |<br>\nC     |                                                        |<br>\nC     |      VF    &#8211;VALUE OF COST AT OPTIMAL POINT            |<br>\nC     |                                                        |<br>\nC     |      DF    &#8211;DERIVATIVE OF COST AT OPTIMAL POINT       |<br>\nC     |              (LENGTH AT LEAST N)                       |<br>\nC     |                                                        |<br>\nC     |      E     &#8211;ERROR TOLERANCE (INFINITY NORM OF KUHN-   |<br>\nC     |              TUCKER ERROR + CONSTRAINT VIOLATION)      |<br>\nC     |                                                        |<br>\nC     |      IT    &#8211;NUMBER OF ITERATIONS                      |<br>\nC     |                                                        |<br>\nC     |      ST    &#8211;FINAL STEP SIZE                           |<br>\nC     |                                                        |<br>\nC     |      IO    &#8211;ERROR FLAG (CALL ERR(IO) TO SEE IF AN     |<br>\nC     |              ERROR WAS DETECTED)                       |<br>\nC     |________________________________________________________|<br>\nC<br>\n      subroutine lmin(x,le,li,u,ia,k,vf,df,e,it,st,io,<br>\n     1                in,tl,lm,a,la,m,n,b,bl,bu,ct,vl,gr,w)<br>\n      real*8 a(1),b(1),bl(1),bu(1),df(1),le(1),li(1),u(1),w(1),x(1),z(1)<br>\n      real*8 ct,e,tl,st,vf,vl<br>\n      integer ia(1),i,in,io,it,k,la,lm,m,m1,n<br>\n      external gr,vl<br>\n      m1 = m + 1<br>\n      if ( m .le. n ) goto 10<br>\n      io = 8<br>\n      return<br>\n10    if ( m .gt. 0 ) goto 20<br>\n      call bmin(x,ia,k,vf,df,e,it,st,io,in,tl,lm,n,bl,bu,ct,vl,gr,w)<br>\n      io = 0<br>\n      return<br>\n20    if ( in .lt. 4 ) goto 100<br>\n      if ( in .eq. 7 ) goto 120<br>\n      k = n &#8211; m<br>\n      if ( in .eq. 6 ) goto 60<br>\n      if ( in .eq. 5 ) goto 40<br>\n      do 30 i = 1,n<br>\n30         ia(i) = 0<br>\n      goto 90<br>\n40    do 50 i = 1,n<br>\n           if ( ia(i) .eq. 0 ) goto 50<br>\n           k = k &#8211; 1<br>\n           if ( ia(i) .gt. 0 ) x(i) = bu(i)<br>\n           if ( ia(i) .lt. 0 ) x(i) = bl(i)<br>\n50    continue<br>\n      if ( k .ge. 0 ) goto 90<br>\n      io = 8<br>\n      return<br>\n60    do 80 i = 1,n<br>\n           ia(i) = 0<br>\n           if ( x(i) .le. bl(i) ) goto 70<br>\n           if ( x(i) .lt. bu(i) ) goto 80<br>\n           k = k &#8211; 1<br>\n           x(i) = bu(i)<br>\n           ia(i) = 1<br>\n           goto 80<br>\n70         k = k &#8211; 1<br>\n           x(i) = bl(i)<br>\n           ia(i) = -1<br>\n80    continue<br>\n      if ( k .ge. 0 ) goto 90<br>\n      io = 8<br>\n      return<br>\n90    call mat(u,ia,a,la,m,n,0)<br>\n      call fac(u,0,m,io)<br>\n      if ( io .gt. 0 ) return<br>\n      goto 120<br>\n100   do 110 i = 1,n<br>\n110        li(i) = x(i)<br>\n      call feas(x,u,ia,k,io,in,li,a,la,m,n,b,bl,bu,w)<br>\n      if ( io .gt. 0 ) return<br>\n120   call gr(df,x)<br>\n      vf = vl(x)<br>\n      it = 0<br>\n      io = 0<br>\n130   j = k<br>\nc<br>\nc     Projected cg step<br>\nc<br>\n      call cgl(x,e,i,st,io,tl,j,lm-it,n,vl,gr,<br>\n     1         a,la,m,bl,bu,ct,u,ia,k,vf,df,w,le,w(m1))<br>\n      it = it + i<br>\n      if ( io .eq. 1 ) return<br>\n      if ( io .gt. 1 ) goto 140<br>\n      if ( it .ge. lm ) goto 140<br>\n      if ( e .gt. tl ) goto 130<br>\n140   call mul(le,li,e,u,ia,a,la,m,n,df,m,0,z)<br>\n      return<br>\n      end<br>\n      subroutine arm(x,y,z,u,iy,k,io,t,iz,a,la,m,n,vlg,g,nl,tl)<br>\n      real*8 a(1),g(1),iz(1),u(1),x(1),y(1),z(1),r,s,t,tl<br>\n      integer iy(1),i,io,j,k,m,n,nl<br>\n      io = 0<br>\n      call vlg(g,y)<br>\n      call erg(s,g,nl)<br>\n      if ( s .le. tl ) goto 10<br>\n      if ( s .gt. .5*t ) goto 30<br>\n10    t = s<br>\n      do 20 i = 1,n<br>\n20         x(i) = y(i)<br>\n      return<br>\n30    do 40 i = 1,n<br>\n           if ( iy(i) .eq. 0 ) goto 40<br>\n           if ( iy(i) .eq. iz(i) ) goto 40<br>\n           call mod(u,iy,k,io,a,la,m,i,0,x)<br>\n           if ( io .eq. 1 ) return<br>\n40    continue<br>\n      r = .5<br>\n      j = 0<br>\n50    j = j + 1<br>\n      if ( j .gt. 20 ) goto 70<br>\n      do 60 i = 1,n<br>\n60         x(i) = r*y(i) + (1-r)*z(i)<br>\n      call vlg(g,x)<br>\n      call erg(s,g,nl)<br>\n      r = .5*r<br>\n      if ( s .gt. t*(1-r) ) goto 50<br>\n      t = s<br>\n      return<br>\n70    io = 6<br>\n      t = s<br>\n      return<br>\n      end<br>\n      subroutine cgl(x,e,it,st,io,tl,lm1,lm2,n,vl,gr,<br>\n     1               aa,la,m,bl,bu,ct,u,ia,k,vf,df,bb,cc,h)<br>\n      integer ia(1),i,ib,io,it,j,k,lm1,lm2,m,n,na,nb,nc,nd<br>\n      real*8 h(n,1),x(1),y(50),z(50)<br>\n      real*8 aa(1),bb(1),bl(1),bu(1),cc(1),df(1),u(1),vf<br>\n      real*8 a1,a2,a3,a4,a5,a6,a7,a8,a,b,big,c,c0,c1,ct,d,d0<br>\n      real*8 da,db,e,f,f0,f1,fa,fb,fc,g,l3,p,q,r,s,st,tl,v,w<br>\n      real*8 fv,fd<br>\n      external gr,vl<br>\n      data a1\/.1d0\/,a2\/.9d0\/,a3\/5.d0\/,a4\/.2d0\/,a5\/10.d0\/,a6\/.9d0\/<br>\n      data a7\/.3d0\/<br>\nc<br>\nc     set big = largest floating point number<br>\nc<br>\n      big = 1.d50<br>\n      a8 = a3 + .01d0<br>\n      it = 0<br>\n      io = 0<br>\n      f = vf<br>\n      do 10 i = 1,n<br>\n10         h(i,3) = df(i)<br>\n      l3 = 1.\/dlog(a3)<br>\n      call pre(h(1,2),e,u,ia,k,i,lm1,io,h(1,3),aa,la,m,n,bb,cc)<br>\n      if ( e .le. tl ) goto 690<br>\n      if ( io .gt. 0 ) goto 690<br>\n      if ( lm1 .eq. 0 ) return<br>\n      a = st<br>\n      if ( a .gt. 0. ) goto 30<br>\n      do 20 i = 1,n<br>\n20         if ( dabs(x(i)) .gt. a ) a = dabs(x(i))<br>\n      a = .01*a\/e<br>\n      if ( a .eq. 0. ) a = 1.<br>\n30    g = 0.<br>\n      do 40 i = 1,n<br>\n           h(i,1) = -h(i,2)<br>\n40         g = g + h(i,2)*h(i,3)<br>\n      if ( g .lt. 0. ) goto 650<br>\n      d = -g<br>\n50    call cut(s,ib,x,h,ia,bl,bu,ct,n,big)<br>\n      na = 0<br>\n      nb = 0<br>\n      nc = 0<br>\n      nd = 0<br>\n      if ( s .le. 0. ) goto 760<br>\n      if ( a .gt. s ) a = s<br>\n      fa = fv(a,x,h,n,vl)<br>\n      c0 = a<br>\n      f0 = fa<br>\n      ny = 2<br>\n      y(1) = 0.<br>\n      z(1) = f<br>\n      y(2) = a<br>\n      z(2) = fa<br>\n      v = a1*d<br>\n      w = a2*d<br>\n      iq = 0<br>\n      if ( fa .le. f ) goto 60<br>\n      c = a<br>\n      b = 0.<br>\n      a = 0.<br>\n      fc = fa<br>\n      fb = f<br>\n      fa = f<br>\n      goto 70<br>\n60    c = 0.<br>\n      b = 0.<br>\n      fc = f<br>\n      fb = f<br>\n      iq = 1<br>\n70    q = (d+(f-f0)\/c0)\/c0<br>\n      if ( q .lt. 0. ) goto 90<br>\n      q = a<br>\n      p = fa<br>\n80    nd = nd + 1<br>\n      if ( nd .gt. 25 ) goto 640<br>\n      if ( s .eq. q ) goto 710<br>\n      q = a3*q<br>\n      if ( q .gt. s ) q = s<br>\n      p = fv(q,x,h,n,vl)<br>\n      call ins(q,p,a,b,c,fa,fb,fc,ny,y,z)<br>\n      if ( p-f .lt. w*q ) goto 80<br>\n      goto 270<br>\n90    q = .5*d\/q<br>\n      if ( q .lt. s ) goto 110<br>\n      if ( c0 .lt. s ) goto 100<br>\n      f1 = f0<br>\n      c1 = c0<br>\n      q = s<br>\n      goto 140<br>\n100   q = s<br>\n110   if ( q .lt. .01*c0 ) q = .01*c0<br>\n      p = fv(q,x,h,n,vl)<br>\n      if ( p .le. f0 ) goto 120<br>\n      f1 = f0<br>\n      c1 = c0<br>\n      f0 = p<br>\n      c0 = q<br>\n      goto 130<br>\n120   f1 = p<br>\n      c1 = q<br>\n130   call ins(q,p,a,b,c,fa,fb,fc,ny,y,z)<br>\n140   if ( a .eq. 0. ) goto 150<br>\n      if ( fa-f .ge. v*a ) goto 170<br>\n      if ( fa-f .lt. w*a ) goto 220<br>\n      goto 290<br>\n150   q = c0<br>\n      if ( c1 .lt. q ) q = c1<br>\n160   na = na + 1<br>\n      if ( na .gt. 25 ) goto 660<br>\n      q = a4*q<br>\n      p = fv(q,x,h,n,vl)<br>\n      call ins(q,p,a,b,c,fa,fb,fc,ny,y,z)<br>\n      if ( p-f .ge. v*q ) goto 160<br>\n      goto 260<br>\n170   if ( c0 .gt. c1 ) goto 210<br>\n      if ( f0-f .gt. v*c0 ) goto 190<br>\n      if ( f0-f .ge. w*c0 ) goto 350<br>\n      if ( c1 .le. a5*c0 ) goto 350<br>\n      r = dlog(c1\/c0)<br>\n      r = .999*dexp(-r\/idint(r*l3+.999))<br>\n      q = c1<br>\n180   q = q*r<br>\n      if ( q .lt. c0 ) goto 350<br>\n      p = fv(q,x,h,n,vl)<br>\n      call ins(q,p,a,b,c,fa,fb,fc,ny,y,z)<br>\n      na = na + 1<br>\n      if ( p-f .gt. v*q ) goto 180<br>\n      goto 350<br>\n190   q = c0<br>\n200   na = na + 1<br>\n      if ( na .gt. 25 ) goto 660<br>\n      q = a4*q<br>\n      p = fv(q,x,h,n,vl)<br>\n      call ins(q,p,a,b,c,fa,fb,fc,ny,y,z)<br>\n      if ( p-f .ge. v*q ) goto 200<br>\n      goto 260<br>\n210   q = a<br>\n      goto 200<br>\n220   if ( c0 .lt. c1 ) goto 320<br>\n      if ( f0-f .ge. v*c0 ) goto 240<br>\n      if ( f0-f .ge. w*c0 ) goto 260<br>\n      q = c0<br>\n      p = f0<br>\n230   nd = nd  + 1<br>\n      if ( nd .gt. 25 ) goto 640<br>\n      if ( s .eq. q ) goto 710<br>\n      q = a3*q<br>\n      if ( q .gt. s ) q = s<br>\n      p = fv(q,x,h,n,vl)<br>\n      call ins(q,p,a,b,c,fa,fb,fc,ny,y,z)<br>\n      if ( p-f .lt. w*q ) goto 230<br>\n      goto 260<br>\n240   if ( c0 .le. a5*c1 ) goto 260<br>\n      r = dlog(c0\/c1)<br>\n      r = 1.001*dexp(r\/idint(r*l3+.999))<br>\n      q = a<br>\n250   q = q*r<br>\n      if ( q .gt. c0 ) goto 260<br>\n      nd = nd + 1<br>\n      p = fv(q,x,h,n,vl)<br>\n      call ins(q,p,a,b,c,fa,fb,fc,ny,y,z)<br>\n      if ( p-f .lt. w*q ) goto 250<br>\n260   if ( iq .eq. 1 ) goto 350<br>\n270   if ( b .eq. 0. ) goto 290<br>\n      if ( c .eq. 0. ) goto 280<br>\n      v = c &#8211; a<br>\n      w = a &#8211; b<br>\n      r = 1.\/v<br>\n      f0 = 1.\/w<br>\n      p = fc &#8211; fa<br>\n      q = fb &#8211; fa<br>\n      e = p*r + q*f0<br>\n      if ( dsign(e,c-b) .ne. e ) goto 350<br>\n      if ( e .eq. 0. ) goto 350<br>\n      q = (p*r)*w &#8211; (q*f0)*v<br>\n      q = a &#8211; .5*q\/e<br>\n      goto 300<br>\n280   r = 1.\/a<br>\n      f0 = 1.\/b<br>\n      p = r*(fa-f) &#8211; d<br>\n      q = f0*(fb-f) &#8211; d<br>\n      e = a &#8211; b<br>\n      v = (r*p-f0*q)\/e<br>\n      w = (a*q*f0-b*p*r)\/e<br>\n      v = w*w-3.*v*d<br>\n      if ( v .lt. 0. ) v = 0.<br>\n      v = dsqrt(v)<br>\n      if ( w+v .eq. 0. ) goto 350<br>\n      q = -d\/(w+v)<br>\n      if ( q .le. 0. ) goto 350<br>\n      goto 300<br>\n290   if ( iq .eq. 1 ) goto 350<br>\n      q = (d+(f-fa)\/a)\/a<br>\n      if ( q .ge. 0. ) goto 350<br>\n      q = .5*d\/q<br>\n300   if ( q .gt. s ) q = s<br>\n      do 310 i = 1,ny<br>\n310        if ( y(i) .eq. q ) goto 350<br>\n      p = fv(q,x,h,n,vl)<br>\n      call ins(q,p,a,b,c,fa,fb,fc,ny,y,z)<br>\n      goto 350<br>\n320   continue<br>\n      if ( f0-f .gt. v*c0 ) goto 330<br>\n      if ( f0-f .gt. w*c0 ) goto 350<br>\n330   q = a<br>\n      p = fa<br>\n340   nd = nd + 1<br>\n      if ( nd .gt. 25 ) goto 640<br>\n      if ( s .eq. q ) goto 710<br>\n      q = a3*q<br>\n      if ( q .gt. s ) q = s<br>\n      p = fv(q,x,h,n,vl)<br>\n      call ins(q,p,a,b,c,fa,fb,fc,ny,y,z)<br>\n      if ( p-f .lt. w*q ) goto 340<br>\n      goto 260<br>\n350   da = fd(a,x,h,n,gr)<br>\n      if ( da .gt. a6*g ) goto 440<br>\n      if ( s .eq. a ) goto 780<br>\n      if ( da .ge. 0. ) goto 590<br>\n      r = a<br>\n      q = 0.<br>\n      do 360 i = 1,ny<br>\n           if ( y(i) .gt. a ) goto 400<br>\n           if ( y(i) .le. q ) goto 360<br>\n           if ( y(i) .eq. a ) goto 360<br>\n           q = y(i)<br>\n360   continue<br>\n      if ( a .le. a8*q ) goto 590<br>\n      q = a<br>\n      p = fa<br>\n370   nd = nd + 1<br>\n      if ( nd .gt. 25 ) goto 640<br>\n      if ( s .eq. q ) goto 710<br>\n      q = a3*q<br>\n      if ( q .gt. s ) q = s<br>\n      p = fv(q,x,h,n,vl)<br>\n      f1 = fa<br>\n      call ins(q,p,a,b,c,fa,fb,fc,ny,y,z)<br>\n      if ( p .lt. f1 ) goto 370<br>\n      if ( a .gt. r ) goto 390<br>\n      do 380 i = 1,n<br>\n380        h(i,2) = x(i) + a*h(i,1)<br>\n      goto 590<br>\n390   da = fd(a,x,h,n,gr)<br>\n      if ( da .gt. a6*g ) goto 440<br>\n      goto 590<br>\n400   q = y(i)<br>\n      do 410 j = i,ny<br>\n           if ( y(j) .le. a ) goto 410<br>\n           if ( y(j) .lt. q ) q = y(j)<br>\n410   continue<br>\n      if ( q .le. a5*a ) goto 590<br>\n      f0 = dlog(q\/a)<br>\n      f0 = 1.001*dexp(f0\/idint(f0*l3+.999))<br>\n      v = a<br>\n420   v = v*f0<br>\n      if ( v .ge. q ) goto 350<br>\n      p = fv(v,x,h,n,vl)<br>\n      f1 = fa<br>\n      call ins(v,p,a,b,c,fa,fb,fc,ny,y,z)<br>\n      if ( p .lt. f1 ) goto 420<br>\n      if ( a .gt. r ) goto 350<br>\n      do 430 i = 1,n<br>\n430        h(i,2) = x(i) + a*h(i,1)<br>\n      goto 590<br>\n440   b = 0.<br>\n      j = 1<br>\n      i = j<br>\n450   i = i + 1<br>\n      if ( i .gt. ny ) goto 460<br>\n      if ( y(i) .ge. a ) goto 450<br>\n      if ( y(i) .lt. b ) goto 450<br>\n      b = y(i)<br>\n      j = i<br>\n      goto 450<br>\n460   fb = z(j)<br>\n      db = d<br>\n      if ( b .ne. 0. ) db = fd(b,x,h,n,gr)<br>\n470   w = 2.*dabs(b-a)<br>\n      call cub(c,a,b,fa,fb,da,db)<br>\n      nc = 1<br>\n      goto 510<br>\n480   w = .5*w<br>\n      if ( w .lt. dabs(c0-c) ) goto 580<br>\n      if ( c0 .lt. c ) goto 490<br>\n      if ( d0 .ge. d ) goto 500<br>\n      goto 580<br>\n490   if ( d0 .gt. d ) goto 580<br>\n500   call cub(c,c,c0,f,f0,d,d0)<br>\n      nc = nc + 1<br>\n      if ( nc .gt. 30 ) goto 630<br>\n510   r = dmax1(a,b)<br>\n      s = dmin1(a,b)<br>\n      if ( c .gt. r ) goto 520<br>\n      if ( c .gt. s ) goto 530<br>\n      c = s + (s-c)<br>\n      s = .5*(a+b)<br>\n      if ( c .gt. s ) c = s<br>\n      goto 530<br>\n520   c = r &#8211; (c-r)<br>\n      s = .5*(a+b)<br>\n      if ( c .lt. s ) c = s<br>\n530   c0 = a<br>\n      f0 = fa<br>\n      d0 = da<br>\n      d = fd(c,x,h,n,gr)<br>\n      f = fv(c,x,h,n,vl)<br>\n      if ( f .lt. fa ) goto 540<br>\n      b = c<br>\n      fb = f<br>\n      db = d<br>\n      goto 480<br>\n540   if ( c .lt. a ) goto 570<br>\n      if ( d .lt. 0. ) goto 560<br>\n550   b = a<br>\n      fb = fa<br>\n      db = da<br>\n560   a = c<br>\n      fa = f<br>\n      da = d<br>\n      if ( d .gt. a6*g ) goto 480<br>\n      goto 590<br>\n570   if ( d .lt. 0. ) goto 550<br>\n      goto 560<br>\n580   c = .5*(a+b)<br>\n      nb = nb + 1<br>\n      w = dabs(b-a)<br>\n      goto 530<br>\n590   do 600 i = 1,n<br>\n600        x(i) = h(i,2)<br>\n      i = lm1<br>\n      call pre(h(1,2),e,u,ia,k,j,lm1,io,h(1,3),aa,la,m,n,bb,cc)<br>\n      it = it + 1<br>\n      f = fa<br>\n      d = da<br>\n      a = a7*a<br>\n      if ( io .gt. 0 ) goto 690<br>\n      if ( e .le. tl ) goto 690<br>\n      if ( it .ge. lm2 ) goto 690<br>\n      if ( it .ge. lm1 ) goto 690<br>\n      if ( i .lt. lm1 ) goto 30<br>\n      r = 0.<br>\n      do 610 i = 1,n<br>\n610        r = r + h(i,2)*h(i,3)<br>\n      if ( r .lt. 0. ) goto 650<br>\n      s = r\/g<br>\n      g = r<br>\n      d = 0.<br>\n      do 620 i = 1,n<br>\n           h(i,1) = -h(i,2) + s*h(i,1)<br>\n620        d = d + h(i,1)*h(i,3)<br>\n      goto 50<br>\n630   if ( d .lt. g ) goto 590<br>\n      io = 4<br>\n      return<br>\n640   io = 3<br>\n      return<br>\n650   io = 4<br>\n      return<br>\n660   q = q*a3**25<br>\n      nd = 0<br>\n670   nd = nd + 1<br>\n      if ( nd .gt. 25 ) goto 680<br>\n      q = a3*q<br>\n      if ( q .ge. s ) goto 680<br>\n      p = fv(q,x,h,n,vl)<br>\n      call ins(q,p,a,b,c,fa,fb,fc,ny,y,z)<br>\n      if ( p-f .gt. v*q ) goto 670<br>\n      goto 140<br>\n680   io = 5<br>\n      return<br>\n690   st = a<br>\n      vf = f<br>\n      do 700 i = 1,n<br>\n700        df(i) = h(i,3)<br>\n      return<br>\n710   call mod(u,ia,k,io,aa,la,m,ib,1,bb)<br>\n      do 720 i = 1,n<br>\n720        x(i) = h(i,2)<br>\n      x(ib) = bl(ib)<br>\n      if ( ia(ib) .gt. 0 ) x(ib) = bu(ib)<br>\n      a = q*a7<br>\n730   call gr(h(1,3),x)<br>\n740   f = p<br>\n750   call pre(h(1,2),e,u,ia,k,j,lm1,io,h(1,3),aa,la,m,n,bb,cc)<br>\n      it = it + 1<br>\n      if ( it .ge. lm2 ) goto 690<br>\n      if ( it .ge. lm1 ) goto 690<br>\n      if ( io .gt. 0 ) goto 690<br>\n      if ( e .le. tl ) goto 690<br>\n      goto 30<br>\n760   call mod(u,ia,k,io,aa,la,m,ib,1,bb)<br>\n      q = -s<br>\n      p = fv(q,x,h,n,vl)<br>\n      do 770 i = 1,n<br>\n770        x(i) = h(i,2)<br>\n      x(ib) = bl(ib)<br>\n      if ( ia(ib) .gt. 0 ) x(ib) = bu(ib)<br>\n      goto 730<br>\n780   call mod(u,ia,k,io,aa,la,m,ib,1,bb)<br>\n      do 790 i = 1,n<br>\n790        x(i) = h(i,2)<br>\n      x(ib) = bl(ib)<br>\n      if ( ia(ib) .gt. 0 ) x(ib) = bu(ib)<br>\n      p = fa<br>\n      goto 740<br>\n      end<br>\n      subroutine cgn(x,e,it,st,io,tl,lm1,lm2,n,is,vlf,vlg,grf,grg,nl,pn,<br>\n     1        aa,la,m,bl,bu,ct,u,ia,k,le,vf,vg,df,dg,lg,gg,bb,cc,dd,h)<br>\n      integer ia(1),i,ib,io,is,it,j,k,la,lg,lm1,lm2,m,n,nl,na,nb,nc,nd<br>\n      real*8 df(1),dg(lg,1),gg(1),h(n,1),le(1),vg(1),x(1),y(50),z(50)<br>\n      real*8 aa(1),bb(1),bl(1),bu(1),cc(1),dd(1),u(1)<br>\n      real*8 a1,a2,a3,a4,a5,a6,a7,a8,a,b,big,c,c0,c1,ct,d,d0,da,db<br>\n      real*8 e,f,f0,f1,fa,fb,fc,g,l3,p,p2,pn,q,r,s,st,tl,v,vf,vv,w<br>\n      real*8 pv,pd,pd2<br>\n      external grf,grg,vlf,vlg<br>\n      data a1\/.1d0\/,a2\/.9d0\/,a3\/5.d0\/,a4\/.2d0\/,a5\/10.d0\/,a6\/.9d0\/<br>\n      data a7\/.3d0\/<br>\nc<br>\nc     set big = largest floating point number<br>\nc<br>\n      big = 1.d50<br>\n      a8 = a3 + .01d0<br>\n      p2 = .5*pn<br>\n      it = 0<br>\n      io = 0<br>\n      f = vf<br>\n      if ( is .eq. 0 ) goto 40<br>\n      do 10 i = 1,nl<br>\n           dd(i) = vg(i)<br>\n10         f = f + vg(i)*le(i)<br>\n      do 30 j = 1,n<br>\n           s = df(j)<br>\n           do 20 i = 1,nl<br>\n20              s = s + le(i)*dg(i,j)<br>\n           h(j,3) = s<br>\n30    continue<br>\n      goto 80<br>\n40    do 50 i = 1,nl<br>\n           dd(i) = 0.<br>\n           bb(i) = le(i) + pn*vg(i)<br>\n50         f = f + vg(i)*le(i) + p2*vg(i)**2<br>\n      do 70 j = 1,n<br>\n           s = df(j)<br>\n           do 60 i = 1,nl<br>\n60              s = s + bb(i)*dg(i,j)<br>\n           h(j,3) = s<br>\n70    continue<br>\n80    l3 = 1.\/dlog(a3)<br>\n      call pre(h(1,2),e,u,ia,k,i,lm1,io,h(1,3),aa,la,m,n,bb,cc)<br>\n      if ( e .le. tl ) goto 770<br>\n      if ( io .gt. 0 ) goto 770<br>\n      if ( lm1 .eq. 0 ) return<br>\n      a = st<br>\n      if ( a .gt. 0. ) goto 100<br>\n      do 90 i = 1,n<br>\n90         if ( dabs(x(i)) .gt. a ) a = dabs(x(i))<br>\n      a = .01*a\/e<br>\n      if ( a .eq. 0. ) a = 1.<br>\n100   g = 0.<br>\n      do 110 i = 1,n<br>\n           h(i,1) = -h(i,2)<br>\n110        g = g + h(i,2)*h(i,3)<br>\n      if ( g .lt. 0. ) goto 730<br>\n      d = -g<br>\n120   call cut(s,ib,x,h,ia,bl,bu,ct,n,big)<br>\n      na = 0<br>\n      nb = 0<br>\n      nc = 0<br>\n      nd = 0<br>\n      if ( s .le. 0. ) goto 860<br>\n      if ( a .gt. s ) a = s<br>\n      p = pv(a,x,h,vv,gg,dd,nl,le,vlf,vlg,p2,n)<br>\n      fa = p<br>\n      c0 = a<br>\n      f0 = fa<br>\n      ny = 2<br>\n      y(1) = 0.<br>\n      z(1) = f<br>\n      y(2) = a<br>\n      z(2) = fa<br>\n      v = a1*d<br>\n      w = a2*d<br>\n      iq = 0<br>\n      if ( fa .le. f ) goto 130<br>\n      c = a<br>\n      b = 0.<br>\n      a = 0.<br>\n      fc = fa<br>\n      fb = f<br>\n      fa = f<br>\n      goto 150<br>\n130   c = 0.<br>\n      b = 0.<br>\n      fc = f<br>\n      fb = f<br>\n      iq = 1<br>\n      vf = vv<br>\n      do 140 i = 1,nl<br>\n140        vg(i) = gg(i)<br>\n150   q = (d+(f-f0)\/c0)\/c0<br>\n      if ( q .lt. 0. ) goto 170<br>\n      q = a<br>\n160   nd = nd + 1<br>\n      if ( nd .gt. 25 ) goto 720<br>\n      if ( s .eq. q ) goto 780<br>\n      q = a3*q<br>\n      if ( q .gt. s ) q = s<br>\n      p = pv(q,x,h,vv,gg,dd,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .lt. w*q ) goto 160<br>\n      goto 350<br>\n170   q = .5*d\/q<br>\n      if ( q .lt. s ) goto 190<br>\n      if ( c0 .lt. s ) goto 180<br>\n      f1 = f0<br>\n      c1 = c0<br>\n      q = s<br>\n      goto 220<br>\n180   q = s<br>\n190   if ( q .lt. .01*c0 ) q = .01*c0<br>\n      p = pv(q,x,h,vv,gg,dd,nl,le,vlf,vlg,p2,n)<br>\n      if ( p .le. f0 ) goto 200<br>\n      f1 = f0<br>\n      c1 = c0<br>\n      f0 = p<br>\n      c0 = q<br>\n      goto 210<br>\n200   f1 = p<br>\n      c1 = q<br>\n210   call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n220   if ( a .eq. 0. ) goto 230<br>\n      if ( fa-f .ge. v*a ) goto 250<br>\n      if ( fa-f .lt. w*a ) goto 300<br>\n      goto 370<br>\n230   q = c0<br>\n      if ( c1 .lt. q ) q = c1<br>\n240   na = na + 1<br>\n      if ( na .gt. 25 ) goto 740<br>\n      q = a4*q<br>\n      p = pv(q,x,h,vv,gg,dd,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .ge. v*q ) goto 240<br>\n      goto 340<br>\n250   if ( c0 .gt. c1 ) goto 290<br>\n      if ( f0-f .gt. v*c0 ) goto 270<br>\n      if ( f0-f .ge. w*c0 ) goto 430<br>\n      if ( c1 .le. a5*c0 ) goto 430<br>\n      r = dlog(c1\/c0)<br>\n      r = .999*dexp(-r\/idint(r*l3+.999))<br>\n      q = c1<br>\n260   q = q*r<br>\n      if ( q .lt. c0 ) goto 430<br>\n      p = pv(q,x,h,vv,gg,dd,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      na = na + 1<br>\n      if ( p-f .gt. v*q ) goto 260<br>\n      goto 430<br>\n270   q = c0<br>\n280   na = na + 1<br>\n      if ( na .gt. 25 ) goto 740<br>\n      q = a4*q<br>\n      p = pv(q,x,h,vv,gg,dd,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .ge. v*q ) goto 280<br>\n      goto 340<br>\n290   q = a<br>\n      goto 280<br>\n300   if ( c0 .lt. c1 ) goto 400<br>\n      if ( f0-f .ge. v*c0 ) goto 320<br>\n      if ( f0-f .ge. w*c0 ) goto 340<br>\n      q = c0<br>\n      p = f0<br>\n310   nd = nd  + 1<br>\n      if ( nd .gt. 25 ) goto 720<br>\n      if ( s .eq. q ) goto 780<br>\n      q = a3*q<br>\n      if ( q .gt. s ) q = s<br>\n      p = pv(q,x,h,vv,gg,dd,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .lt. w*q ) goto 310<br>\n      goto 340<br>\n320   if ( c0 .le. a5*c1 ) goto 340<br>\n      r = dlog(c0\/c1)<br>\n      r = 1.001*dexp(r\/idint(r*l3+.999))<br>\n      q = a<br>\n330   q = q*r<br>\n      if ( q .gt. c0 ) goto 340<br>\n      nd = nd + 1<br>\n      p = pv(q,x,h,vv,gg,dd,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .lt. w*q ) goto 330<br>\n340   if ( iq .eq. 1 ) goto 430<br>\n350   if ( b .eq. 0. ) goto 370<br>\n      if ( c .eq. 0. ) goto 360<br>\n      v = c &#8211; a<br>\n      w = a &#8211; b<br>\n      r = 1.\/v<br>\n      f0 = 1.\/w<br>\n      p = fc &#8211; fa<br>\n      q = fb &#8211; fa<br>\n      e = p*r + q*f0<br>\n      if ( dsign(e,c-b) .ne. e ) goto 430<br>\n      if ( e .eq. 0. ) goto 430<br>\n      q = (p*r)*w &#8211; (q*f0)*v<br>\n      q = a &#8211; .5*q\/e<br>\n      goto 380<br>\n360   r = 1.\/a<br>\n      f0 = 1.\/b<br>\n      p = r*(fa-f) &#8211; d<br>\n      q = f0*(fb-f) &#8211; d<br>\n      e = a &#8211; b<br>\n      v = (r*p-f0*q)\/e<br>\n      w = (a*q*f0-b*p*r)\/e<br>\n      v = w*w-3.*v*d<br>\n      if ( v .lt. 0. ) v = 0.<br>\n      v = dsqrt(v)<br>\n      if ( w+v .eq. 0. ) goto 430<br>\n      q = -d\/(w+v)<br>\n      if ( q .le. 0. ) goto 430<br>\n      goto 380<br>\n370   if ( iq .eq. 1 ) goto 430<br>\n      q = (d+(f-fa)\/a)\/a<br>\n      if ( q .ge. 0. ) goto 430<br>\n      q = .5*d\/q<br>\n380   if ( q .gt. s ) q = s<br>\n      do 390 i = 1,ny<br>\n390        if ( y(i) .eq. q ) goto 430<br>\n      p = pv(q,x,h,vv,gg,dd,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      goto 430<br>\n400   continue<br>\n      if ( f0-f .gt. v*c0 ) goto 410<br>\n      if ( f0-f .gt. w*c0 ) goto 430<br>\n410   q = a<br>\n      p = fa<br>\n420   nd = nd + 1<br>\n      if ( nd .gt. 25 ) goto 720<br>\n      if ( s .eq. q ) goto 780<br>\n      q = a3*q<br>\n      if ( q .gt. s ) q = s<br>\n      p = pv(q,x,h,vv,gg,dd,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .lt. w*q ) goto 420<br>\n      goto 340<br>\n430   da = pd(a,x,h,df,dg,vg,dd,nl,le,grf,grg,pn,n,lg,bb)<br>\n      if ( da .gt. a6*g ) goto 520<br>\n      if ( s .eq. a ) goto 880<br>\n      if ( da .ge. 0. ) goto 670<br>\n      r = a<br>\n      q = 0.<br>\n      do 440 i = 1,ny<br>\n           if ( y(i) .gt. a ) goto 480<br>\n           if ( y(i) .le. q ) goto 440<br>\n           if ( y(i) .eq. a ) goto 440<br>\n           q = y(i)<br>\n440   continue<br>\n      if ( a .le. a8*q ) goto 670<br>\n      q = a<br>\n      p = fa<br>\n450   nd = nd + 1<br>\n      if ( nd .gt. 25 ) goto 720<br>\n      if ( s .eq. q ) goto 780<br>\n      q = a3*q<br>\n      if ( q .gt. s ) q = s<br>\n      p = pv(q,x,h,vv,gg,dd,nl,le,vlf,vlg,p2,n)<br>\n      f1 = fa<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p .lt. f1 ) goto 450<br>\n      if ( a .gt. r ) goto 470<br>\n      do 460 i = 1,n<br>\n460        h(i,2) = x(i) + a*h(i,1)<br>\n      goto 670<br>\n470   da = pd(a,x,h,df,dg,vg,dd,nl,le,grf,grg,pn,n,lg,bb)<br>\n      if ( da .gt. a6*g ) goto 520<br>\n      goto 670<br>\n480   q = y(i)<br>\n      do 490 j = i,ny<br>\n           if ( y(j) .le. a ) goto 490<br>\n           if ( y(j) .lt. q ) q = y(j)<br>\n490   continue<br>\n      if ( q .le. a5*a ) goto 670<br>\n      f0 = dlog(q\/a)<br>\n      f0 = 1.001*dexp(f0\/idint(f0*l3+.999))<br>\n      v = a<br>\n500   v = v*f0<br>\n      if ( v .ge. q ) goto 430<br>\n      p = pv(v,x,h,vv,gg,dd,nl,le,vlf,vlg,p2,n)<br>\n      f1 = fa<br>\n      call igs(v,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p .lt. f1 ) goto 500<br>\n      if ( a .gt. r ) goto 430<br>\n      do 510 i = 1,n<br>\n510        h(i,2) = x(i) + a*h(i,1)<br>\n      goto 670<br>\n520   b = 0.<br>\n      j = 1<br>\n      i = j<br>\n530   i = i + 1<br>\n      if ( i .gt. ny ) goto 540<br>\n      if ( y(i) .ge. a ) goto 530<br>\n      if ( y(i) .lt. b ) goto 530<br>\n      b = y(i)<br>\n      j = i<br>\n      goto 530<br>\n540   fb = z(j)<br>\n      db = d<br>\n      if ( b .ne. 0. )<br>\n     1     db = pd2(b,x,h,df,dg,gg,dd,nl,le,vlg,grf,grg,pn,n,lg,bb)<br>\n550   w = 2.*dabs(b-a)<br>\n      call cub(c,a,b,fa,fb,da,db)<br>\n      nc = 1<br>\n      goto 590<br>\n560   w = .5*w<br>\n      if ( w .lt. dabs(c0-c) ) goto 660<br>\n      if ( c0 .lt. c ) goto 570<br>\n      if ( d0 .ge. d ) goto 580<br>\n      goto 660<br>\n570   if ( d0 .gt. d ) goto 660<br>\n580   call cub(c,c,c0,f,f0,d,d0)<br>\n      nc = nc + 1<br>\n      if ( nc .gt. 30 ) goto 710<br>\n590   r = dmax1(a,b)<br>\n      s = dmin1(a,b)<br>\n      if ( c .gt. r ) goto 600<br>\n      if ( c .gt. s ) goto 610<br>\n      c = s + (s-c)<br>\n      s = .5*(a+b)<br>\n      if ( c .gt. s ) c = s<br>\n      goto 610<br>\n600   c = r &#8211; (c-r)<br>\n      s = .5*(a+b)<br>\n      if ( c .lt. s ) c = s<br>\n610   c0 = a<br>\n      f0 = fa<br>\n      d0 = da<br>\n      f = pv(c,x,h,vf,vg,dd,nl,le,vlf,vlg,p2,n)<br>\n      d = pd(c,x,h,df,dg,vg,dd,nl,le,grf,grg,pn,n,lg,bb)<br>\n      if ( f .lt. fa ) goto 620<br>\n      b = c<br>\n      fb = f<br>\n      db = d<br>\n      goto 560<br>\n620   if ( c .lt. a ) goto 650<br>\n      if ( d .lt. 0. ) goto 640<br>\n630   b = a<br>\n      fb = fa<br>\n      db = da<br>\n640   a = c<br>\n      fa = f<br>\n      da = d<br>\n      if ( d .gt. a6*g ) goto 560<br>\n      goto 670<br>\n650   if ( d .lt. 0. ) goto 630<br>\n      goto 640<br>\n660   c = .5*(a+b)<br>\n      nb = nb + 1<br>\n      w = dabs(b-a)<br>\n      goto 610<br>\n670   do 680 i = 1,n<br>\n680        x(i) = h(i,2)<br>\n      i = lm1<br>\n      call pre(h(1,2),e,u,ia,k,j,lm1,io,h(1,3),aa,la,m,n,bb,cc)<br>\n      it = it + 1<br>\n      f = fa<br>\n      d = da<br>\n      a = a7*a<br>\n      if ( io .gt. 0 ) goto 770<br>\n      if ( e .le. tl ) goto 770<br>\n      if ( it .ge. lm2 ) goto 770<br>\n      if ( it .ge. lm1 ) goto 770<br>\n      if ( i .lt. lm1 ) goto 100<br>\n      r = 0.<br>\n      do 690 i = 1,n<br>\n690        r = r + h(i,2)*h(i,3)<br>\n      if ( r .lt. 0. ) goto 730<br>\n      s = r\/g<br>\n      g = r<br>\n      d = 0.<br>\n      do 700 i = 1,n<br>\n           h(i,1) = -h(i,2) + s*h(i,1)<br>\n700        d = d + h(i,1)*h(i,3)<br>\n      goto 120<br>\n710   if ( d .lt. g ) goto 670<br>\n      io = 4<br>\n      return<br>\n720   io = 3<br>\n      return<br>\n730   io = 4<br>\n      return<br>\n740   q = q*a3**25<br>\n      nd = 0<br>\n750   nd = nd + 1<br>\n      if ( nd .gt. 25 ) goto 760<br>\n      q = a3*q<br>\n      if ( q .ge. s ) goto 760<br>\n      p = pv(q,x,h,vv,gg,dd,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .gt. v*q ) goto 750<br>\n      goto 220<br>\n760   io = 5<br>\n      return<br>\n770   st = a<br>\n      return<br>\n780   call mod(u,ia,k,io,aa,la,m,ib,1,bb)<br>\n      do 790 i = 1,n<br>\n790        x(i) = h(i,2)<br>\n      x(ib) = bl(ib)<br>\n      if ( ia(ib) .gt. 0 ) x(ib) = bu(ib)<br>\n      a = q*a7<br>\n800   call grf(df,x)<br>\n      call grg(dg,x)<br>\n810   do 820 i = 1,nl<br>\n820        bb(i) = le(i) + pn*(vg(i)-dd(i))<br>\n      do 840 j = 1,n<br>\n           s = df(j)<br>\n           do 830 i = 1,nl<br>\n830             s = s + bb(i)*dg(i,j)<br>\n           h(j,3) = s<br>\n840   continue<br>\n      f = p<br>\n850   call pre(h(1,2),e,u,ia,k,j,lm1,io,h(1,3),aa,la,m,n,bb,cc)<br>\n      it = it + 1<br>\n      if ( it .ge. lm2 ) goto 770<br>\n      if ( it .ge. lm1 ) goto 770<br>\n      if ( io .gt. 0 ) goto 770<br>\n      if ( e .le. tl ) goto 770<br>\n      goto 100<br>\n860   call mod(u,ia,k,io,aa,la,m,ib,1,bb)<br>\n      q = -s<br>\n      p = pv(q,x,h,vf,vg,dd,nl,le,vlf,vlg,p2,n)<br>\n      do 870 i = 1,n<br>\n870        x(i) = h(i,2)<br>\n      x(ib) = bl(ib)<br>\n      if ( ia(ib) .gt. 0 ) x(ib) = bu(ib)<br>\n      goto 800<br>\n880   call mod(u,ia,k,io,aa,la,m,ib,1,bb)<br>\n      do 890 i = 1,n<br>\n890        x(i) = h(i,2)<br>\n      x(ib) = bl(ib)<br>\n      if ( ia(ib) .gt. 0 ) x(ib) = bu(ib)<br>\n      p = fa<br>\n      goto 810<br>\n      end<br>\n      subroutine cgp(x,e,it,st,io,tl,lm1,lm2,n,vlf,vlg,grf,grg,l,nl,pn,<br>\n     1      aa,la,bl,bu,ct,u,ia,k,le,vf,vg,df,dg,lg,uu,gg,bb,cc,h)<br>\n      integer ia(1),i,ib,io,it,j,k,l,la,lg,lm1,lm2,n,nl,na,nb,nc,nd<br>\n      real*8 df(1),dg(lg,1),gg(1),h(n,1),le(1),vg(1),x(1),y(50),z(50)<br>\n      real*8 aa(1),bb(1),bl(1),bu(1),cc(1),u(1),uu(1)<br>\n      real*8 a1,a2,a3,a4,a5,a6,a7,a8,a,b,big,c,c0,c1,ct,d,d0,da,db<br>\n      real*8 e,f,f0,f1,fa,fb,fc,g,l3,p,p2,pn,q,r,s,st,tl,v,vf,vv,w<br>\n      real*8 qv,qd,qd2<br>\n      external grf,grg,vlf,vlg<br>\n      data a1\/.1d0\/,a2\/.9d0\/,a3\/5.d0\/,a4\/.2d0\/,a5\/10.d0\/,a6\/.9d0\/<br>\n      data a7\/.3d0\/<br>\nc<br>\nc     set big = largest floating point number<br>\nc<br>\n      i = l<br>\n      if ( l .eq. 0 ) i = 1<br>\n      call fab(uu,u,ia,io,aa,la,dg,lg,pn,n,i,l,nl,bb,cc)<br>\n      if ( io .gt. 0 ) return<br>\n      big = 1.d50<br>\n      a8 = a3 + .01d0<br>\n      p2 = .5*pn<br>\n      it = 0<br>\n      io = 0<br>\n      f = vf<br>\n      do 10 i = 1,nl<br>\n           cc(i) = le(i) + pn*vg(i)<br>\n10         f = f + (le(i)+p2*vg(i))*vg(i)<br>\n      do 30 j = 1,n<br>\n           s = df(j)<br>\n           do 20 i = 1,nl<br>\n20              s = s + cc(i)*dg(i,j)<br>\n           h(j,3) = s<br>\n30    continue<br>\n      l3 = 1.\/dlog(a3)<br>\n      call prp(h(1,2),e,u,uu,ia,k,lm1,io,h(1,3),aa,la,l,nl,n,bb,cc)<br>\n      if ( e .le. tl ) goto 720<br>\n      if ( io .gt. 0 ) goto 720<br>\n      if ( lm1 .eq. 0 ) return<br>\n      a = st<br>\n      if ( a .gt. 0. ) goto 50<br>\n      do 40 i = 1,n<br>\n40         if ( dabs(x(i)) .gt. a ) a = dabs(x(i))<br>\n      a = .01*a\/e<br>\n      if ( a .eq. 0. ) a = 1.<br>\n50    g = 0.<br>\n      do 60 i = 1,n<br>\n           h(i,1) = -h(i,2)<br>\n60         g = g + h(i,2)*h(i,3)<br>\n      if ( g .lt. 0. ) goto 680<br>\n      d = -g<br>\n70    call cut(s,ib,x,h,ia,bl,bu,ct,n,big)<br>\n      na = 0<br>\n      nb = 0<br>\n      nc = 0<br>\n      nd = 0<br>\n      if ( s .le. 0. ) goto 790<br>\n      if ( a .gt. s ) a = s<br>\n      p = qv(a,x,h,vv,gg,nl,le,vlf,vlg,p2,n)<br>\n      fa = p<br>\n      c0 = a<br>\n      f0 = fa<br>\n      ny = 2<br>\n      y(1) = 0.<br>\n      z(1) = f<br>\n      y(2) = a<br>\n      z(2) = fa<br>\n      v = a1*d<br>\n      w = a2*d<br>\n      iq = 0<br>\n      if ( fa .le. f ) goto 80<br>\n      c = a<br>\n      b = 0.<br>\n      a = 0.<br>\n      fc = fa<br>\n      fb = f<br>\n      fa = f<br>\n      goto 100<br>\n80    c = 0.<br>\n      b = 0.<br>\n      fc = f<br>\n      fb = f<br>\n      iq = 1<br>\n      vf = vv<br>\n      do 90 i = 1,nl<br>\n90         vg(i) = gg(i)<br>\n100   q = (d+(f-f0)\/c0)\/c0<br>\n      if ( q .lt. 0. ) goto 120<br>\n      q = a<br>\n110   nd = nd + 1<br>\n      if ( nd .gt. 25 ) goto 670<br>\n      if ( s .eq. q ) goto 730<br>\n      q = a3*q<br>\n      if ( q .gt. s ) q = s<br>\n      p = qv(q,x,h,vv,gg,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .lt. w*q ) goto 110<br>\n      goto 300<br>\n120   q = .5*d\/q<br>\n      if ( q .lt. s ) goto 140<br>\n      if ( c0 .lt. s ) goto 130<br>\n      f1 = f0<br>\n      c1 = c0<br>\n      q = s<br>\n      goto 170<br>\n130   q = s<br>\n140   if ( q .lt. .01*c0 ) q = .01*c0<br>\n      p = qv(q,x,h,vv,gg,nl,le,vlf,vlg,p2,n)<br>\n      if ( p .le. f0 ) goto 150<br>\n      f1 = f0<br>\n      c1 = c0<br>\n      f0 = p<br>\n      c0 = q<br>\n      goto 160<br>\n150   f1 = p<br>\n      c1 = q<br>\n160   call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n170   if ( a .eq. 0. ) goto 180<br>\n      if ( fa-f .ge. v*a ) goto 200<br>\n      if ( fa-f .lt. w*a ) goto 250<br>\n      goto 320<br>\n180   q = c0<br>\n      if ( c1 .lt. q ) q = c1<br>\n190   na = na + 1<br>\n      if ( na .gt. 25 ) goto 690<br>\n      q = a4*q<br>\n      p = qv(q,x,h,vv,gg,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .ge. v*q ) goto 190<br>\n      goto 290<br>\n200   if ( c0 .gt. c1 ) goto 240<br>\n      if ( f0-f .gt. v*c0 ) goto 220<br>\n      if ( f0-f .ge. w*c0 ) goto 380<br>\n      if ( c1 .le. a5*c0 ) goto 380<br>\n      r = dlog(c1\/c0)<br>\n      r = .999*dexp(-r\/idint(r*l3+.999))<br>\n      q = c1<br>\n210   q = q*r<br>\n      if ( q .lt. c0 ) goto 380<br>\n      p = qv(q,x,h,vv,gg,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      na = na + 1<br>\n      if ( p-f .gt. v*q ) goto 210<br>\n      goto 380<br>\n220   q = c0<br>\n230   na = na + 1<br>\n      if ( na .gt. 25 ) goto 690<br>\n      q = a4*q<br>\n      p = qv(q,x,h,vv,gg,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .ge. v*q ) goto 230<br>\n      goto 290<br>\n240   q = a<br>\n      goto 230<br>\n250   if ( c0 .lt. c1 ) goto 350<br>\n      if ( f0-f .ge. v*c0 ) goto 270<br>\n      if ( f0-f .ge. w*c0 ) goto 290<br>\n      q = c0<br>\n      p = f0<br>\n260   nd = nd  + 1<br>\n      if ( nd .gt. 25 ) goto 670<br>\n      if ( s .eq. q ) goto 730<br>\n      q = a3*q<br>\n      if ( q .gt. s ) q = s<br>\n      p = qv(q,x,h,vv,gg,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .lt. w*q ) goto 260<br>\n      goto 290<br>\n270   if ( c0 .le. a5*c1 ) goto 290<br>\n      r = dlog(c0\/c1)<br>\n      r = 1.001*dexp(r\/idint(r*l3+.999))<br>\n      q = a<br>\n280   q = q*r<br>\n      if ( q .gt. c0 ) goto 290<br>\n      nd = nd + 1<br>\n      p = qv(q,x,h,vv,gg,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .lt. w*q ) goto 280<br>\n290   if ( iq .eq. 1 ) goto 380<br>\n300   if ( b .eq. 0. ) goto 320<br>\n      if ( c .eq. 0. ) goto 310<br>\n      v = c &#8211; a<br>\n      w = a &#8211; b<br>\n      r = 1.\/v<br>\n      f0 = 1.\/w<br>\n      p = fc &#8211; fa<br>\n      q = fb &#8211; fa<br>\n      e = p*r + q*f0<br>\n      if ( dsign(e,c-b) .ne. e ) goto 380<br>\n      if ( e .eq. 0. ) goto 380<br>\n      q = (p*r)*w &#8211; (q*f0)*v<br>\n      q = a &#8211; .5*q\/e<br>\n      goto 330<br>\n310   r = 1.\/a<br>\n      f0 = 1.\/b<br>\n      p = r*(fa-f) &#8211; d<br>\n      q = f0*(fb-f) &#8211; d<br>\n      e = a &#8211; b<br>\n      v = (r*p-f0*q)\/e<br>\n      w = (a*q*f0-b*p*r)\/e<br>\n      v = w*w-3.*v*d<br>\n      if ( v .lt. 0. ) v = 0.<br>\n      v = dsqrt(v)<br>\n      if ( w+v .eq. 0. ) goto 380<br>\n      q = -d\/(w+v)<br>\n      if ( q .le. 0. ) goto 380<br>\n      goto 330<br>\n320   if ( iq .eq. 1 ) goto 380<br>\n      q = (d+(f-fa)\/a)\/a<br>\n      if ( q .ge. 0. ) goto 380<br>\n      q = .5*d\/q<br>\n330   if ( q .gt. s ) q = s<br>\n      do 340 i = 1,ny<br>\n340        if ( y(i) .eq. q ) goto 380<br>\n      p = qv(q,x,h,vv,gg,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      goto 380<br>\n350   continue<br>\n      if ( f0-f .gt. v*c0 ) goto 360<br>\n      if ( f0-f .gt. w*c0 ) goto 380<br>\n360   q = a<br>\n      p = fa<br>\n370   nd = nd + 1<br>\n      if ( nd .gt. 25 ) goto 670<br>\n      if ( s .eq. q ) goto 730<br>\n      q = a3*q<br>\n      if ( q .gt. s ) q = s<br>\n      p = qv(q,x,h,vv,gg,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .lt. w*q ) goto 370<br>\n      goto 290<br>\n380   da = qd(a,x,h,df,dg,vg,nl,le,grf,grg,pn,n,lg,cc)<br>\n      if ( da .gt. a6*g ) goto 470<br>\n      if ( s .eq. a ) goto 800<br>\n      if ( da .ge. 0. ) goto 620<br>\n      r = a<br>\n      q = 0.<br>\n      do 390 i = 1,ny<br>\n           if ( y(i) .gt. a ) goto 430<br>\n           if ( y(i) .le. q ) goto 390<br>\n           if ( y(i) .eq. a ) goto 390<br>\n           q = y(i)<br>\n390   continue<br>\n      if ( a .le. a8*q ) goto 620<br>\n      q = a<br>\n      p = fa<br>\n400   nd = nd + 1<br>\n      if ( nd .gt. 25 ) goto 670<br>\n      if ( s .eq. q ) goto 730<br>\n      q = a3*q<br>\n      if ( q .gt. s ) q = s<br>\n      p = qv(q,x,h,vv,gg,nl,le,vlf,vlg,p2,n)<br>\n      f1 = fa<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p .lt. f1 ) goto 400<br>\n      if ( a .gt. r ) goto 420<br>\n      do 410 i = 1,n<br>\n410        h(i,2) = x(i) + a*h(i,1)<br>\n      goto 620<br>\n420   da = qd(a,x,h,df,dg,vg,nl,le,grf,grg,pn,n,lg,cc)<br>\n      if ( da .gt. a6*g ) goto 470<br>\n      goto 620<br>\n430   q = y(i)<br>\n      do 440 j = i,ny<br>\n           if ( y(j) .le. a ) goto 440<br>\n           if ( y(j) .lt. q ) q = y(j)<br>\n440   continue<br>\n      if ( q .le. a5*a ) goto 620<br>\n      f0 = dlog(q\/a)<br>\n      f0 = 1.001*dexp(f0\/idint(f0*l3+.999))<br>\n      v = a<br>\n450   v = v*f0<br>\n      if ( v .ge. q ) goto 380<br>\n      p = qv(v,x,h,vv,gg,nl,le,vlf,vlg,p2,n)<br>\n      f1 = fa<br>\n      call igs(v,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p .lt. f1 ) goto 450<br>\n      if ( a .gt. r ) goto 380<br>\n      do 460 i = 1,n<br>\n460        h(i,2) = x(i) + a*h(i,1)<br>\n      goto 620<br>\n470   b = 0.<br>\n      j = 1<br>\n      i = j<br>\n480   i = i + 1<br>\n      if ( i .gt. ny ) goto 490<br>\n      if ( y(i) .ge. a ) goto 480<br>\n      if ( y(i) .lt. b ) goto 480<br>\n      b = y(i)<br>\n      j = i<br>\n      goto 480<br>\n490   fb = z(j)<br>\n      db = d<br>\n      if ( b .ne. 0. )<br>\n     1     db = qd2(b,x,h,df,dg,gg,nl,le,vlg,grf,grg,pn,n,lg,cc)<br>\n500   w = 2.*dabs(b-a)<br>\n      call cub(c,a,b,fa,fb,da,db)<br>\n      nc = 1<br>\n      goto 540<br>\n510   w = .5*w<br>\n      if ( w .lt. dabs(c0-c) ) goto 610<br>\n      if ( c0 .lt. c ) goto 520<br>\n      if ( d0 .ge. d ) goto 530<br>\n      goto 610<br>\n520   if ( d0 .gt. d ) goto 610<br>\n530   call cub(c,c,c0,f,f0,d,d0)<br>\n      nc = nc + 1<br>\n      if ( nc .gt. 30 ) goto 660<br>\n540   r = dmax1(a,b)<br>\n      s = dmin1(a,b)<br>\n      if ( c .gt. r ) goto 550<br>\n      if ( c .gt. s ) goto 560<br>\n      c = s + (s-c)<br>\n      s = .5*(a+b)<br>\n      if ( c .gt. s ) c = s<br>\n      goto 560<br>\n550   c = r &#8211; (c-r)<br>\n      s = .5*(a+b)<br>\n      if ( c .lt. s ) c = s<br>\n560   c0 = a<br>\n      f0 = fa<br>\n      d0 = da<br>\n      f = qv(c,x,h,vf,vg,nl,le,vlf,vlg,p2,n)<br>\n      d = qd(c,x,h,df,dg,vg,nl,le,grf,grg,pn,n,lg,cc)<br>\n      if ( f .lt. fa ) goto 570<br>\n      b = c<br>\n      fb = f<br>\n      db = d<br>\n      goto 510<br>\n570   if ( c .lt. a ) goto 600<br>\n      if ( d .lt. 0. ) goto 590<br>\n580   b = a<br>\n      fb = fa<br>\n      db = da<br>\n590   a = c<br>\n      fa = f<br>\n      da = d<br>\n      if ( d .gt. a6*g ) goto 510<br>\n      goto 620<br>\n600   if ( d .lt. 0. ) goto 580<br>\n      goto 590<br>\n610   c = .5*(a+b)<br>\n      nb = nb + 1<br>\n      w = dabs(b-a)<br>\n      goto 560<br>\n620   do 630 i = 1,n<br>\n630        x(i) = h(i,2)<br>\n      i = lm1<br>\n      call prp(h(1,2),e,u,uu,ia,k,lm1,io,h(1,3),aa,la,l,nl,n,bb,cc)<br>\n      it = it + 1<br>\n      f = fa<br>\n      d = da<br>\n      a = a7*a<br>\n      if ( io .gt. 0 ) goto 720<br>\n      if ( e .le. tl ) goto 720<br>\n      if ( it .ge. lm2 ) goto 720<br>\n      if ( it .ge. lm1 ) goto 720<br>\n      if ( i .lt. lm1 ) goto 50<br>\n      r = 0.<br>\n      do 640 i = 1,n<br>\n640        r = r + h(i,2)*h(i,3)<br>\n      if ( r .lt. 0. ) goto 680<br>\n      s = r\/g<br>\n      g = r<br>\n      d = 0.<br>\n      do 650 i = 1,n<br>\n           h(i,1) = -h(i,2) + s*h(i,1)<br>\n650        d = d + h(i,1)*h(i,3)<br>\n      goto 70<br>\n660   if ( d .lt. g ) goto 620<br>\n      io = 4<br>\n      return<br>\n670   io = 3<br>\n      return<br>\n680   io = 4<br>\n      return<br>\n690   q = q*a3**25<br>\n      nd = 0<br>\n700   nd = nd + 1<br>\n      if ( nd .gt. 25 ) goto 710<br>\n      q = a3*q<br>\n      if ( q .ge. s ) goto 710<br>\n      p = qv(q,x,h,vv,gg,nl,le,vlf,vlg,p2,n)<br>\n      call igs(q,p,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,ny,y,z)<br>\n      if ( p-f .gt. v*q ) goto 700<br>\n      goto 170<br>\n710   io = 5<br>\n      return<br>\n720   st = a<br>\n      return<br>\n730   call mob(uu,io,u,ia,k,aa,la,n,l,nl,ib,4,bb,cc)<br>\n      if ( io .gt. 0 ) goto 720<br>\n      call mod(u,ia,k,io,aa,la,l,ib,1,bb)<br>\n      do 740 i = 1,n<br>\n740        x(i) = h(i,2)<br>\n      x(ib) = bl(ib)<br>\n      if ( ia(ib) .gt. 0 ) x(ib) = bu(ib)<br>\n      a = q*a7<br>\n745   call grf(df,x)<br>\n      call grg(dg,x)<br>\n746   do 750 i = 1,nl<br>\n750        cc(i) = le(i) + pn*vg(i)<br>\n      do 770 j = 1,n<br>\n           s = df(j)<br>\n           do 760 i = 1,nl<br>\n760             s = s + cc(i)*dg(i,j)<br>\n           h(j,3) = s<br>\n770   continue<br>\n      f = p<br>\n780   call prp(h(1,2),e,u,uu,ia,k,lm1,io,h(1,3),aa,la,l,nl,n,bb,cc)<br>\n      it = it + 1<br>\n      if ( it .ge. lm2 ) goto 720<br>\n      if ( it .ge. lm1 ) goto 720<br>\n      if ( io .gt. 0 ) goto 720<br>\n      if ( e .le. tl ) goto 720<br>\n      goto 50<br>\n790   call mob(uu,io,u,ia,k,aa,la,n,l,nl,ib,4,bb,cc)<br>\n      if ( io .gt. 0 ) goto 720<br>\n      call mod(u,ia,k,io,aa,la,l,ib,1,bb)<br>\n      q = -s<br>\n      p = qv(q,x,h,vf,vg,nl,le,vlf,vlg,p2,n)<br>\n      do 795 i = 1,n<br>\n795        x(i) = h(i,2)<br>\n      x(ib) = bl(ib)<br>\n      if ( ia(ib) .gt. 0 ) x(ib) = bu(ib)<br>\n      goto 745<br>\n800   call mob(uu,io,u,ia,k,aa,la,n,l,nl,ib,4,bb,cc)<br>\n      if ( io .gt. 0 ) goto 720<br>\n      call mod(u,ia,k,io,aa,la,l,ib,1,bb)<br>\n      do 810 i = 1,n<br>\n810        x(i) = h(i,2)<br>\n      x(ib) = bl(ib)<br>\n      if ( ia(ib) .gt. 0 ) x(ib) = bu(ib)<br>\n      goto 746<br>\n      end<br>\n      subroutine cub(x,a,b,c,d,e,f)<br>\n      real*8 a,b,c,d,e,f,g,v,w,x,y,z<br>\n      g = b &#8211; a<br>\n      v = e + f &#8211; 3*(d-c)\/g<br>\n      w = v*v-e*f<br>\n      if ( w .lt. 0. ) w = 0.<br>\n      w = dsign(dsqrt(w),g)<br>\n      y = e + v<br>\n      z = f + v<br>\n      if ( dsign(y,g) .ne. y ) goto 30<br>\n      if ( dsign(z,g) .ne. z ) goto 20<br>\n      if ( z .eq. 0. ) goto 20<br>\n10    x = b &#8211; g*f\/(z+w)<br>\n      return<br>\n20    if ( c .lt. d ) x = a<br>\n      if ( c .ge. d ) x = b<br>\n      return<br>\n30    if ( dsign(z,g) .ne. z ) goto 40<br>\n      if ( dabs(e) .gt. dabs(f) ) goto 10<br>\n40    x = a + g*e\/(y-w)<br>\n      return<br>\n      end<br>\n      subroutine cut(s,ib,x,d,ia,bl,bu,ct,n,big)<br>\n      real*8 bl(1),bu(1),d(1),x(1),big,ct,s,t<br>\n      integer ia(1),i,ib,k<br>\n      s = big<br>\n      k = 0<br>\n      do 20 i = 1,n<br>\n           if ( ia(i) .ne. 0 ) goto 20<br>\n           if ( d(i) .eq. 0. ) goto 20<br>\n           if ( d(i) .gt. 0. ) goto 10<br>\n           t = x(i) &#8211; bl(i)<br>\n           if ( t .le. ct ) k = 1<br>\n           t = -t\/d(i)<br>\n           if ( t .gt. s ) goto 20<br>\n           s = t<br>\n           ib = -i<br>\n           goto 20<br>\n10         t = bu(i) &#8211; x(i)<br>\n           if ( t .le. ct ) k = 1<br>\n           t = t\/d(i)<br>\n           if ( t .gt. s ) goto 20<br>\n           s = t<br>\n           ib = i<br>\n20    continue<br>\n      if ( s .lt. 0. ) return<br>\n      if ( k .eq. 1 ) goto 30<br>\n      s = dabs(s)<br>\n      return<br>\n30    s = -s<br>\n      return<br>\n      end<br>\n      subroutine erg(t,g,nl)<br>\n      real*8 g(1),t<br>\n      integer i,nl<br>\n      t = 0.<br>\n      do 10 i = 1,nl<br>\n10         t = dmax1(dabs(g(i)),t)<br>\n      return<br>\n      end<br>\n      subroutine err(io)<br>\n      integer io<br>\n      goto (10,20,30,40,50,60,70,80,90), io<br>\n      write(6,*) &#8216;no detected errors&#8217;<br>\n      return<br>\n10    write(6,*) &#8216;dependent constraint gradients&#8217;<br>\n      return<br>\n20    write(6,*) &#8216;problem is infeasible&#8217;<br>\n      return<br>\n30    write(6,*) &#8216;function decreases with no minimum&#8217;<br>\n      return<br>\n40    write(6,*) &#8216;inconsistent gradient values&#8217;<br>\n      return<br>\n50    write(6,*) &#8216;unable to satisfy Armijo condition&#8217;<br>\n      return<br>\n60    write(6,*) &#8216;cannot reduce constraint error below gradient error&#8217;<br>\n      return<br>\n70    write(6,*) &#8216;input penalty is zero but a positive value is needed&#8217;<br>\n      write(6,*) &#8216;for convergence in this problem&#8217;<br>\n      return<br>\n80    write(6,*) &#8216;more constraints imposed than there are unknowns&#8217;<br>\n      return<br>\n90    write(6,*) &#8216;iterations at limit&#8217;<br>\n      return<br>\n      end<br>\n      subroutine fab(v,u,ia,io,a,la,dg,lg,pn,n,ll,l,nl,b,w)<br>\n      integer ia(1),i,io,j,k,l,ll,la,lg,nl,n,o<br>\n      real*8 a(la,1),dg(lg,1),b(1),u(1),v(1),w(ll,1),pn,t<br>\n      do 10 j = 1,n<br>\n           do 10 i = 1,nl<br>\n10              a(l+i,j) = dg(i,j)<br>\n      j = (nl*nl+nl)\/2<br>\n      do 20 i = 1,j<br>\n20         v(i) = 0.<br>\n      o = 1<br>\n      do 30 i = 1,nl<br>\n           v(o) = 1.\/pn<br>\n           o = o + nl &#8211; i + 1<br>\n30    continue<br>\n      do 60 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 60<br>\n           o = 0<br>\n           do 50 i = 1,nl<br>\n                t = dg(i,j)<br>\n                do 40 k = i,nl<br>\n                     o = o + 1<br>\n                     v(o) = v(o) + t*dg(k,j)<br>\n40              continue<br>\n50         continue<br>\n60    continue<br>\n      if ( l .eq. 0 ) goto 140<br>\n      do 70 j = 1,nl<br>\n           do 70 i = 1,l<br>\n70              w(i,j) = 0.<br>\n      do 100 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 100<br>\n           do 90 i = 1,nl<br>\n                t = dg(i,j)<br>\n                do 80 k = 1,l<br>\n                     w(k,i) = w(k,i) + t*a(k,j)<br>\n80              continue<br>\n90         continue<br>\n100   continue<br>\n      o = 0<br>\n      do 130 j = 1,nl<br>\n           do 110 i = 1,l<br>\n110             b(i) = w(i,j)<br>\n           call sol(b,u,l,b)<br>\n           do 130 i = j,nl<br>\n                t = 0.<br>\n                do 120 k = 1,l<br>\n120                  t = t + b(k)*w(k,i)<br>\n                o = o + 1<br>\n                v(o) = v(o) &#8211; t<br>\n130   continue<br>\n140   call fac(v,0,nl,io)<br>\n      return<br>\n      end<br>\n      subroutine fac(a,p,n,io)<br>\n      real*8 a(1),s,t<br>\n      integer e,f,g,h,i,io,j,k,l,m,n,o,p,q<br>\n      io = 0<br>\n      if ( n .eq. 0 ) return<br>\n      q = ((n+n+1-p)*p)\/2<br>\n      l = p<br>\n      if ( l .lt. 1 ) l = 1<br>\n      h = n<br>\n      k = 1<br>\n10    s = a(k)<br>\n      if ( s .le. 0. ) goto 50<br>\n      if ( k .gt. q ) s = dsqrt(s)<br>\n      a(k) = s<br>\n      if ( h .eq. 1 ) return<br>\nc     &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br>\nc     |*** save pivot entry ***|<br>\nc     &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br>\n      e = k + l<br>\n      f = k + h &#8211; 1<br>\n      do 20 i = e,f<br>\n20         a(i) = a(i)\/s<br>\n      o = l<br>\n      if ( l .gt. 1 ) l = l &#8211; 1<br>\n      k = k + h<br>\n      g = k<br>\n      h = h &#8211; 1<br>\n      m = h<br>\n      j = 0<br>\n30    if ( o .gt. 0 ) o = o &#8211; 1<br>\n      e = g + o<br>\n      j = j &#8211; m<br>\n      m = m &#8211; 1<br>\n      f = g + m<br>\n      t = a(g+j)<br>\nc     &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br>\nc     |*** eliminate by rows ***|<br>\nc     &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br>\n      do 40 i = e,f<br>\n40         a(i) = a(i) &#8211; t*a(i+j)<br>\n      g = f + 1<br>\n      if ( m .gt. 0 ) goto 30<br>\n      goto 10<br>\n50    io = 1<br>\n      return<br>\n      end<br>\n      subroutine fat(u,io,in,ia,a,la,l,n,g,h,z,dg,lg,nl,m)<br>\n      integer ia(1),i,in,io,j,k,l,lg,m,n,nl,o,p<br>\n      real*8 a(la,1),dg(lg,1),g(1),h(1),u(1),z(1),t<br>\nc<br>\nc     normalize rows of g<br>\nc<br>\n      do 10 i = 1,nl<br>\n10         h(i) = 0.<br>\n      do 20 j = 1,n<br>\n           do 20 i = 1,nl<br>\n20              if ( dabs(dg(i,j)) .gt. h(i) ) h(i) = dabs(dg(i,j))<br>\n      do 30 i = 1,nl<br>\n           if ( h(i) .eq. 0. ) goto 120<br>\n           h(i) = 1.\/h(i)<br>\n30         z(i) = h(i)<br>\n      do 40 j = 1,n<br>\n           do 40 i = 1,nl<br>\n40              a(i+l,j) = h(i)*dg(i,j)<br>\n      do 50 i = 1,nl<br>\n50         h(i) = -h(i)*g(i)<br>\n      o = l<br>\n      if ( l .eq. 0 ) goto 110<br>\n      p = o<br>\n      do 70 k = 1,l<br>\n           do 60 i = 1,nl<br>\n                o = o + 1<br>\n60              u(o) = 0.<br>\n           p = p &#8211; 1<br>\n           o = o + p<br>\n70    continue<br>\n      do 100 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 100<br>\n           o = l<br>\n           p = o<br>\n           do 90 k = 1,l<br>\n                t = a(k,j)<br>\n                do 80 i = 1,nl<br>\n                     o = o + 1<br>\n80                   u(o) = u(o) + t*a(i+l,j)<br>\n                p = p &#8211; 1<br>\n                o = o + p<br>\n90         continue<br>\n100   continue<br>\n110   call mat(u(o+1),ia,a(l+1,1),la,nl,n,in)<br>\n      call fac(u,l,m,io)<br>\n      return<br>\n120   io = 1<br>\n      return<br>\n      end<br>\n      subroutine fea(x,u,ia,k,io,y,a,la,m,n,b,bl,bu,c,d,g)<br>\n      integer ia(1),h,i,io,it,j,k,l,la,m,n<br>\n      double precision a(la,1),b(1),bl(1),bu(1),c(1),d(1),g(1),u(1)<br>\n      double precision x(1),y(1),b1,b2,big,e,f,q,r,s,t,v,w<br>\nc<br>\nc     set big = largest floating point number<br>\nc<br>\n      big = 1.d50<br>\n      io = 0<br>\n      e = 1.d-3<br>\n      f = .999d0<br>\n      if ( m .gt. 0 ) goto 30<br>\n      do 20 i = 1,n<br>\n           ia(i) = 0<br>\n           x(i) = y(i)<br>\n           if ( x(i) .lt. bu(i) ) goto 10<br>\n           x(i) = bu(i)<br>\n           ia(i) = 1<br>\n           goto 20<br>\n10         if ( x(i) .gt. bl(i) ) goto 20<br>\n           x(i) = bl(i)<br>\n           ia(i) = -1<br>\n20    continue<br>\n      return<br>\n30    call sol(b,u,m,b)<br>\n      do 50 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 50<br>\n           t = y(j)<br>\n           do 40 i = 1,m<br>\n40              t = t + b(i)*a(i,j)<br>\n           x(j) = t<br>\n50    continue<br>\n      l = 0<br>\n      it = -1<br>\n      do 70 i = 1,n<br>\n           d(i) = 0.<br>\n           if ( iabs(ia(i)) .eq. 1 ) goto 70<br>\n           if ( x(i) .lt. bl(i) ) goto 60<br>\n           if ( x(i) .le. bu(i) ) goto 70<br>\n           ia(i) = 2<br>\n           l = l + 1<br>\n           goto 70<br>\n60         ia(i) = -2<br>\n           l = l + 1<br>\n70    continue<br>\n      b2 = 0.<br>\n      if ( l .gt. 0 ) goto 190<br>\n      do 80 i = 1,n<br>\n           if ( ia(i) .gt. 0 ) x(i) = bu(i)<br>\n           if ( ia(i) .lt. 0 ) x(i) = bl(i)<br>\n80    continue<br>\n      return<br>\n90    r = 0.<br>\n      s = 0.<br>\n      t = big<br>\n      h = 0<br>\n      if ( it .eq. 0 ) q = 0.<br>\n      if ( it .gt. 0 ) q = b2\/b1<br>\n      do 120 i = 1,n<br>\n           if ( iabs(ia(i)) .eq. 1 ) goto 120<br>\n           d(i) = q*d(i) &#8211; g(i)<br>\n           s = s + d(i)*g(i)<br>\n           w = bu(i)<br>\n           if ( d(i) .gt. 0. ) goto 100<br>\n           if ( d(i) .eq. 0. ) goto 120<br>\n           if ( ia(i) .lt. 0 ) goto 120<br>\n           if ( ia(i) .eq. 0 ) w = bl(i)<br>\n           if ( ia(i) .gt. 0 ) r = r + d(i)**2<br>\n           goto 110<br>\n100        if ( ia(i) .gt. 0 ) goto 120<br>\n           if ( ia(i) .eq. 0 ) goto 110<br>\n           r = r + d(i)**2<br>\n           w = bl(i)<br>\n110        v = (w-x(i))\/d(i)<br>\n           if ( v .ge. t ) goto 120<br>\n           t = v<br>\n           h = i<br>\n120   continue<br>\n      s = -s\/r<br>\n      if ( t .le. s ) goto 130<br>\n      if ( h .eq. 0 ) goto 170<br>\n      if ( ia(h) .eq. 0 ) goto 170<br>\n130   s = t<br>\n      if ( d(h) .gt. 0. ) goto 140<br>\n      if ( ia(h) .gt. 0 ) goto 150<br>\n      h = -h<br>\n      goto 160<br>\n140   if ( ia(h) .eq. 0 ) goto 160<br>\n      h = -h<br>\n150   l = l &#8211; 1<br>\n160   call mod(u,ia,k,io,a,la,m,h,1,b)<br>\n      if ( io .gt. 0 ) return<br>\n      it = -1<br>\n170   do 180 i = 1,n<br>\n           if ( iabs(ia(i)) .eq. 1 ) goto 180<br>\n           x(i) = x(i) + s*d(i)<br>\n180   continue<br>\n      if ( l .eq. 0 ) goto 390<br>\nc<br>\nc     *** compute the projected gradient ***<br>\nc<br>\n190   do 200 i = 1,m<br>\n200        c(i) = 0.<br>\n      do 220 j = 1,n<br>\n           if ( iabs(ia(j)) .lt. 2 ) goto 220<br>\n           if ( ia(j) .gt. 0 ) t = e*bl(j) + f*bu(j) &#8211; x(j)<br>\n           if ( ia(j) .lt. 0 ) t = e*bu(j) + f*bl(j) &#8211; x(j)<br>\n           do 210 i = 1,m<br>\n210             c(i) = c(i) + t*a(i,j)<br>\n220   continue<br>\n      call sol(b,u,m,c)<br>\n      it = it + 1<br>\n      b1 = b2<br>\n      b2 = 0.<br>\n      r = 0.<br>\n      s = 0.<br>\n      do 250 j = 1,n<br>\n           t = 0.<br>\n           if ( ia(j) .eq. 2 ) t = x(j) &#8211; e*bl(j) &#8211; f*bu(j)<br>\n           if ( ia(j) .eq.-2 ) t = x(j) &#8211; e*bu(j) &#8211; f*bl(j)<br>\n           do 230 i = 1,m<br>\n230             t = t + b(i)*a(i,j)<br>\n           if ( iabs(ia(j)) .eq. 1 ) goto 240<br>\n           b2 = b2 + t*t<br>\n           g(j) = t<br>\n           r = dmax1(dabs(t),r)<br>\n           goto 250<br>\n240        t = t*ia(j)<br>\n           if ( t .le. s ) goto 250<br>\n           s = t<br>\n           h = j<br>\n250   continue<br>\n      if ( s .gt. 10.*r ) goto 260<br>\n      if ( b2 .eq. 0. ) goto 290<br>\n      if ( it .ge. l ) goto 290<br>\n      if ( it .ge. k ) goto 290<br>\n      goto 90<br>\n260   x(h) = bl(h)<br>\n      if ( ia(h) .gt. 0 ) x(h) = bu(h)<br>\n      call mod(u,ia,k,io,a,la,m,h,0,b)<br>\n      if ( io .gt. 0 ) return<br>\n      call sol(b,u,m,c)<br>\n      it = 0<br>\n      b2 = 0.<br>\n      do 280 j = 1,n<br>\n           if ( iabs(ia(j)) .eq. 1 ) goto 280<br>\n           t = 0.<br>\n           if ( ia(j) .eq. 2 ) t = x(j) &#8211; e*bl(j) &#8211; f*bu(j)<br>\n           if ( ia(j) .eq.-2 ) t = x(j) &#8211; e*bu(j) &#8211; f*bl(j)<br>\n           do 270 i = 1,m<br>\n270             t = t + b(i)*a(i,j)<br>\n           b2 = b2 + t*t<br>\n           g(j) = t<br>\n280   continue<br>\n      if ( b2 .eq. 0. ) goto 190<br>\n      goto 90<br>\n290   if ( k .ge. l ) goto 300<br>\n      io = 2<br>\n      return<br>\n300   do 310 i = 1,m<br>\n310        b(i) = 0.<br>\n      do 320 i = 1,n<br>\n           if ( ia(i) .eq. 0 ) g(i) = x(i)<br>\n           if ( ia(i) .eq. 1 ) g(i) = bu(i)<br>\n           if ( ia(i) .eq.-1 ) g(i) = bl(i)<br>\n           if ( iabs(ia(i)) .eq. 2 ) g(i) = x(i)<br>\n320   continue<br>\n      do 340 j = 1,n<br>\n           if ( iabs(ia(j)) .lt. 2 ) goto 340<br>\n           call mod(u,ia,k,io,a,la,m,j,ia(j),b)<br>\n           if ( io .gt. 0 ) return<br>\n           if ( ia(j) .lt. 0 ) t = x(j) &#8211; bl(j)<br>\n           if ( ia(j) .gt. 0 ) t = x(j) &#8211; bu(j)<br>\n           do 330 i = 1,m<br>\n330             b(i) = b(i) + t*a(i,j)<br>\n340   continue<br>\n      call sol(b,u,m,b)<br>\n      do 380 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 380<br>\n           t = x(j)<br>\n           do 350 i = 1,m<br>\n350             t = t + b(i)*a(i,j)<br>\n           x(j) = t<br>\n           if ( ia(j) .ne. 0 ) goto 380<br>\n           if ( t .lt. bl(j) ) goto 360<br>\n           if ( t .le. bu(j) ) goto 380<br>\n360        io = 2<br>\n           do 370 i = 1,n<br>\n370             x(i) = g(i)<br>\n           return<br>\n380   continue<br>\n390   do 400 i = 1,m<br>\n400        c(i) = 0.<br>\n      do 420 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 420<br>\n           x(j) = x(j) &#8211; y(j)<br>\n           t = x(j)<br>\n           do 410 i = 1,m<br>\n410             c(i) = c(i) + t*a(i,j)<br>\n420   continue<br>\n430   call sol(b,u,m,c)<br>\n440   s = 1.<br>\n      h = 0<br>\n      do 480 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 480<br>\n           t = 0.<br>\n           do 450 i = 1,m<br>\n450             t = t + b(i)*a(i,j)<br>\n           g(j) = t<br>\n           r = t + y(j)<br>\n           if ( r .lt. bu(j) ) goto 460<br>\n           r = (bu(j)-x(j)-y(j))\/(t-x(j))<br>\n           if ( r .ge. s ) goto 470<br>\n           s = r<br>\n           h = j<br>\n           goto 470<br>\n460        if ( r .gt. bl(j) ) goto 470<br>\n           r = (bl(j)-x(j)-y(j))\/(t-x(j))<br>\n           if ( r .ge. s ) goto 470<br>\n           s = r<br>\n           h = -j<br>\n470        g(j) = t<br>\n480   continue<br>\n      if ( h .eq. 0 ) goto 510<br>\n      call mod(u,ia,k,io,a,la,m,h,1,b)<br>\n      if ( io .gt. 0 ) return<br>\n      if ( ia(h) .gt. 0 ) t = bu(h) &#8211; y(h)<br>\n      if ( ia(h) .lt. 0 ) t = bl(h) &#8211; y(h)<br>\n      do 490 i = 1,m<br>\n490        c(i) = c(i) &#8211; t*a(i,h)<br>\n      call sol(b,u,m,c)<br>\n      do 500 i = 1,n<br>\n500        if ( ia(i) .eq. 0 ) x(i) = x(i) + s*(g(i)-x(i))<br>\n      goto 530<br>\n510   do 520 i = 1,n<br>\n520        if ( ia(i) .eq. 0 ) x(i) = g(i)<br>\n530   s = 0.<br>\n      do 550 j = 1,n<br>\n           if ( ia(j) .eq. 0 ) goto 550<br>\n           if ( ia(j) .eq. 1 ) t = bu(j) &#8211; y(j)<br>\n           if ( ia(j) .eq.-1 ) t = bl(j) &#8211; y(j)<br>\n           do 540 i = 1,m<br>\n540             t = t &#8211; b(i)*a(i,j)<br>\n           t = t*ia(j)<br>\n           if ( t .le. s ) goto 550<br>\n           s = t<br>\n           l = j<br>\n550   continue<br>\n      if ( s .eq. 0 ) goto 570<br>\n      if ( ia(l) .eq. 1 ) t = bu(l) &#8211; y(l)<br>\n      if ( ia(l) .eq.-1 ) t = bl(l) &#8211; y(l)<br>\n      x(l) = t<br>\n      call mod(u,ia,k,io,a,la,m,l,0,b)<br>\n      if ( io .gt. 0 ) return<br>\n      do 560 i = 1,m<br>\n560        c(i) = c(i) + t*a(i,l)<br>\n      goto 430<br>\n570   if ( h .gt. 0 ) goto 440<br>\n      do 580 i = 1,n<br>\n           if ( ia(i) .eq. 0 ) x(i) = x(i) + y(i)<br>\n           if ( ia(i) .eq. 1 ) x(i) = bu(i)<br>\n580        if ( ia(i) .eq.-1 ) x(i) = bl(i)<br>\n      return<br>\n      end<br>\nc<br>\nc     in = 0 &#8212; all constraints are nonbinding initially<br>\nc     in = 1 &#8212; binding constraints are given by values of ia<br>\nc     in = 2 &#8212; binding constraints determined by x, bl, and bu<br>\nc     in = 3 &#8212; use k,ia, and u as given<br>\nc<br>\nc     LENGTH OF W AT LEAST 2M+2N IF NF1 INVOKED<br>\nC                          4M+2N IF NF2 INVOKED<br>\nc<br>\n      subroutine feas(x,u,ia,k,io,in,y,a,la,m,n,b,bl,bu,w)<br>\n      integer ia(1),i,in,io,ip,j,k,l,la,m,n<br>\n      real*8 a(la,1),b(1),bl(1),bu(1),u(1),x(1),y(1),w(1),t<br>\n      ip = 0<br>\n      if ( in .eq. 3 ) goto 100<br>\n      k = n &#8211; m<br>\n      do 10 i = 1,n<br>\n           if ( bl(i) .lt. bu(i) ) goto 10<br>\n           t = bl(i)<br>\n           bl(i) = bu(i)<br>\n           bu(i) = t<br>\n10    continue<br>\n      if ( in .eq. 2 ) goto 50<br>\n      if ( in .eq. 1 ) goto 30<br>\n      do 20 i = 1,n<br>\n20         ia(i) = 0<br>\n      goto 90<br>\n30    do 40 i = 1,n<br>\n40         if ( ia(i) .ne. 0 ) k = k &#8211; 1<br>\n      if ( k .ge. 0 ) goto 90<br>\n      goto 80<br>\n50    do 70 i = 1,n<br>\n           ia(i) = 0<br>\n           if ( y(i) .ne. bu(i) ) goto 60<br>\n           ia(i) = 1<br>\n           k = k &#8211; 1<br>\n           goto 70<br>\n60         if ( y(i) .ne. bl(i) ) goto 70<br>\n           ia(i) = -1<br>\n           k = k &#8211; 1<br>\n70    continue<br>\n      if ( k .ge. 0 ) goto 90<br>\n80    k = k + m<br>\n      ip = 1<br>\n90    call mat(u,ia,a,la,m,n,ip)<br>\n      call fac(u,0,m,io)<br>\n      if ( io .gt. 0 ) return<br>\n100   if ( m .eq. 0 ) goto 130<br>\n      do 110 i = 1,m<br>\n110        w(i) = b(i)<br>\n      do 120 j = 1,n<br>\n           t = y(j)<br>\n           do 120 i = 1,m<br>\n120             w(i) = w(i) &#8211; t*a(i,j)<br>\n130   i = m + 1<br>\n      j = i + m<br>\n      if ( ip .eq. 1 ) goto 140<br>\n      l = j + n<br>\n      call nf1(x,u,ia,k,io,y,a,la,m,n,w,bl,bu,w(i),w(j),w(l))<br>\n      if ( m .gt. 0 ) goto 160<br>\n      return<br>\n140   do 150 l = 1,m<br>\n150        w(l+m) = 1.<br>\n      l = j + m<br>\n      call nf2(x,u,ia,k,io,y,a,la,m,n,w,w(i),bl,bu,w(j),w(l),w(l+m+n))<br>\n160   if ( io .gt. 0 ) return<br>\n      call lsq(x,u,ia,k,io,y,a,la,m,n,bl,bu,w,w(i),w(j))<br>\n      return<br>\n      end<br>\n      double precision function fv(a,x,h,n,vl)<br>\n      integer i,n<br>\n      real*8 h(n,1),x(1),a,vl<br>\n      do 10 i = 1,n<br>\n10         h(i,2) = x(i) + a*h(i,1)<br>\n      fv = vl(h(1,2))<br>\n      return<br>\n      end<br>\nc<br>\n      double precision function pv(a,x,h,f,g,d,nl,le,vlf,vlg,p2,n)<br>\n      integer i,nl,n<br>\n      real*8 d(1),g(1),h(n,1),le(1),x(1),a,f,p2,t,vlf<br>\n      do 10 i = 1,n<br>\n10         h(i,2) = x(i) + a*h(i,1)<br>\n      f = vlf(h(1,2))<br>\n      call vlg(g,h(1,2))<br>\n      t = f<br>\n      do 20 i = 1,nl<br>\n20         t = t + le(i)*g(i) + p2*(g(i)-d(i))**2<br>\n      pv = t<br>\n      return<br>\n      end<br>\nc<br>\n      double precision function qv(a,x,h,f,g,nl,le,vlf,vlg,p2,n)<br>\n      integer i,nl,n<br>\n      real*8 g(1),h(n,1),le(1),x(1),a,f,p2,t,vlf<br>\n      do 10 i = 1,n<br>\n10         h(i,2) = x(i) + a*h(i,1)<br>\n      f = vlf(h(1,2))<br>\n      call vlg(g,h(1,2))<br>\n      t = f<br>\n      do 20 i = 1,nl<br>\n20         t = t + (le(i)+p2*g(i))*g(i)<br>\n      qv = t<br>\n      return<br>\n      end<br>\nc<br>\n      double precision function fd(a,x,h,n,gr)<br>\n      real*8 h(n,1),x(1),a,d<br>\n      do 10 i = 1,n<br>\n10         h(i,2) = x(i) + a*h(i,1)<br>\n      call gr(h(1,3),h(1,2))<br>\n      d = 0.<br>\n      do 20 i = 1,n<br>\n20         d = d + h(i,1)*h(i,3)<br>\n      fd = d<br>\n      return<br>\n      end<br>\nc<br>\n      double precision function pd(a,x,h,df,dg,g,d,nl,le,<br>\n     1                             grf,grg,pn,n,lg,b)<br>\n      integer i,nl,lg,n<br>\n      real*8 b(1),d(1),df(1),dg(lg,1),g(1),h(n,1),le(1),x(1),a,pn,s,t<br>\n      do 10 i = 1,n<br>\n10         h(i,2) = x(i) + a*h(i,1)<br>\n      call grf(df,h(1,2))<br>\n      call grg(dg,h(1,2))<br>\n      do 20 i = 1,nl<br>\n20         b(i) = le(i) + pn*(g(i)-d(i))<br>\n      s = 0.<br>\n      do 40 j = 1,n<br>\n           t = df(j)<br>\n           do 30 i = 1,nl<br>\n30              t = t + b(i)*dg(i,j)<br>\n           h(j,3) = t<br>\n           s = s + t*h(j,1)<br>\n40    continue<br>\n      pd = s<br>\n      return<br>\n      end<br>\nc<br>\n      double precision function qd(a,x,h,df,dg,g,nl,le,<br>\n     1                             grf,grg,pn,n,lg,b)<br>\n      integer i,nl,lg,n<br>\n      real*8 b(1),df(1),dg(lg,1),g(1),h(n,1),le(1),x(1),a,pn,s,t<br>\n      do 10 i = 1,n<br>\n10         h(i,2) = x(i) + a*h(i,1)<br>\n      call grf(df,h(1,2))<br>\n      call grg(dg,h(1,2))<br>\n      do 20 i = 1,nl<br>\n20         b(i) = le(i) + pn*g(i)<br>\n      s = 0.<br>\n      do 40 j = 1,n<br>\n           t = df(j)<br>\n           do 30 i = 1,nl<br>\n30              t = t + b(i)*dg(i,j)<br>\n           h(j,3) = t<br>\n           s = s + t*h(j,1)<br>\n40    continue<br>\n      qd = s<br>\n      return<br>\n      end<br>\nc<br>\n      double precision function pd2(a,x,h,df,dg,g,d,nl,le,<br>\n     1                              vlg,grf,grg,pn,n,lg,b)<br>\n      integer i,nl,lg,n<br>\n      real*8 b(1),d(1),df(1),dg(lg,1),g(1),h(n,1),le(1),x(1),a,pn,s,t<br>\n      do 10 i = 1,n<br>\n10         h(i,2) = x(i) + a*h(i,1)<br>\n      call grf(df,h(1,2))<br>\n      call grg(dg,h(1,2))<br>\n      call vlg(g,h(1,2))<br>\n      do 20 i = 1,nl<br>\n20         b(i) = le(i) + pn*(g(i)-d(i))<br>\n      s = 0.<br>\n      do 40 j = 1,n<br>\n           t = df(j)<br>\n           do 30 i = 1,nl<br>\n30              t = t + b(i)*dg(i,j)<br>\n           h(j,3) = t<br>\n           s = s + t*h(j,1)<br>\n40    continue<br>\n      pd2 = s<br>\n      return<br>\n      end<br>\nc<br>\n      double precision function qd2(a,x,h,df,dg,g,nl,le,<br>\n     1                              vlg,grf,grg,pn,n,lg,b)<br>\n      integer i,nl,lg,n<br>\n      real*8 b(1),df(1),dg(lg,1),g(1),h(n,1),le(1),x(1),a,pn,s,t<br>\n      do 10 i = 1,n<br>\n10         h(i,2) = x(i) + a*h(i,1)<br>\n      call grf(df,h(1,2))<br>\n      call grg(dg,h(1,2))<br>\n      call vlg(g,h(1,2))<br>\n      do 20 i = 1,nl<br>\n20         b(i) = le(i) + pn*g(i)<br>\n      s = 0.<br>\n      do 40 j = 1,n<br>\n           t = df(j)<br>\n           do 30 i = 1,nl<br>\n30              t = t + b(i)*dg(i,j)<br>\n           h(j,3) = t<br>\n           s = s + t*h(j,1)<br>\n40    continue<br>\n      qd2 = s<br>\n      return<br>\n      end<br>\n      subroutine igs(s,f,a,b,c,fa,fb,fc,vf,vv,vg,gg,nl,j,y,z)<br>\n      real*8 gg(1),vg(1),y(1),z(1),a,b,c,f,fa,fb,fc,s,vf,vv<br>\n      integer j<br>\n      j = j + 1<br>\n      y(j) = s<br>\n      z(j) = f<br>\n      if ( f .le. fa ) goto 20<br>\n      if ( f .le. fb ) goto 10<br>\n      if ( f .gt. fc ) return<br>\n      c = s<br>\n      fc = f<br>\n      return<br>\n10    c = b<br>\n      b = s<br>\n      fc = fb<br>\n      fb = f<br>\n      return<br>\n20    c = b<br>\n      b = a<br>\n      a = s<br>\n      fc = fb<br>\n      fb = fa<br>\n      fa = f<br>\n      vf = vv<br>\n      do 30 i = 1,nl<br>\n30         vg(i) = gg(i)<br>\n      return<br>\n      end<br>\n      subroutine ins(s,f,a,b,c,fa,fb,fc,j,y,z)<br>\n      real*8 a,b,c,f,fa,fb,fc,s,y(1),z(1)<br>\n      integer j<br>\n      j = j + 1<br>\n      y(j) = s<br>\n      z(j) = f<br>\n      if ( f .le. fa ) goto 20<br>\n      if ( f .le. fb ) goto 10<br>\n      if ( f .gt. fc ) return<br>\n      c = s<br>\n      fc = f<br>\n      return<br>\n10    c = b<br>\n      b = s<br>\n      fc = fb<br>\n      fb = f<br>\n      return<br>\n20    c = b<br>\n      b = a<br>\n      a = s<br>\n      fc = fb<br>\n      fb = fa<br>\n      fa = f<br>\n      return<br>\n      end<br>\n      subroutine lsq(x,u,ia,k,io,y,a,la,m,n,bl,bu,b,c,g)<br>\n      integer ia(1),h,i,io,j,k,la,m,n<br>\n      double precision a(la,1),b(1),bl(1),bu(1),c(1),g(1),u(1)<br>\n      double precision x(1),y(1),r,s,t<br>\n      io = 0<br>\n      if ( m .gt. 0 ) goto 30<br>\n      do 20 i = 1,n<br>\n           x(i) = y(i)<br>\n           if ( x(i) .lt. bl(i) ) goto 10<br>\n           if ( x(i) .le. bu(i) ) goto 20<br>\n           x(i) = bu(i)<br>\n           if ( ia(i) .eq. 0 ) k = k &#8211; 1<br>\n           ia(i) = 1<br>\n           goto 20<br>\n10         x(i) = bl(i)<br>\n           if ( ia(i) .eq. 0 ) k = k &#8211; 1<br>\n           ia(i) = -1<br>\n20    continue<br>\n      return<br>\n30    do 40 i = 1,m<br>\n40         c(i) = 0.<br>\n      do 60 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 60<br>\n           x(j) = x(j) &#8211; y(j)<br>\n           t = x(j)<br>\n           do 50 i = 1,m<br>\n50              c(i) = c(i) + t*a(i,j)<br>\n60    continue<br>\n70    call sol(b,u,m,c)<br>\n80    s = 1.<br>\n      h = 0<br>\n      do 120 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 120<br>\n           t = 0.<br>\n           do 90 i = 1,m<br>\n90              t = t + b(i)*a(i,j)<br>\n           g(j) = t<br>\n           r = t + y(j)<br>\n           if ( r .lt. bu(j) ) goto 100<br>\n           r = (bu(j)-x(j)-y(j))\/(t-x(j))<br>\n           if ( r .ge. s ) goto 110<br>\n           s = r<br>\n           h = j<br>\n           goto 110<br>\n100        if ( r .gt. bl(j) ) goto 110<br>\n           r = (bl(j)-x(j)-y(j))\/(t-x(j))<br>\n           if ( r .ge. s ) goto 110<br>\n           s = r<br>\n           h = -j<br>\n110        g(j) = t<br>\n120   continue<br>\n      if ( h .eq. 0 ) goto 150<br>\n      call mod(u,ia,k,io,a,la,m,h,1,b)<br>\n      if ( io .gt. 0 ) return<br>\n      if ( ia(h) .gt. 0 ) t = bu(h) &#8211; y(h)<br>\n      if ( ia(h) .lt. 0 ) t = bl(h) &#8211; y(h)<br>\n      do 130 i = 1,m<br>\n130        c(i) = c(i) &#8211; t*a(i,h)<br>\n      call sol(b,u,m,c)<br>\n      do 140 i = 1,n<br>\n140        if ( ia(i) .eq. 0 ) x(i) = x(i) + s*(g(i)-x(i))<br>\n      goto 80<br>\n150   do 160 i = 1,n<br>\n160        if ( ia(i) .eq. 0 ) x(i) = g(i)<br>\n170   s = 0.<br>\n      do 190 j = 1,n<br>\n           if ( ia(j) .eq. 0 ) goto 190<br>\n           if ( ia(j) .eq. 1 ) t = bu(j) &#8211; y(j)<br>\n           if ( ia(j) .eq.-1 ) t = bl(j) &#8211; y(j)<br>\n           do 180 i = 1,m<br>\n180             t = t &#8211; b(i)*a(i,j)<br>\n           t = t*ia(j)<br>\n           if ( t .le. s ) goto 190<br>\n           s = t<br>\n           l = j<br>\n190   continue<br>\n      if ( s .eq. 0 ) goto 210<br>\n      if ( ia(l) .eq. 1 ) t = bu(l) &#8211; y(l)<br>\n      if ( ia(l) .eq.-1 ) t = bl(l) &#8211; y(l)<br>\n      x(l) = t<br>\n      call mod(u,ia,k,io,a,la,m,l,0,b)<br>\n      if ( io .gt. 0 ) return<br>\n      do 200 i = 1,m<br>\n200        c(i) = c(i) + t*a(i,l)<br>\n      goto 70<br>\n210   if ( h .gt. 0 ) goto 80<br>\n      do 220 i = 1,n<br>\n           if ( ia(i) .eq. 0 ) x(i) = x(i) + y(i)<br>\n           if ( ia(i) .eq. 1 ) x(i) = bu(i)<br>\n220        if ( ia(i) .eq.-1 ) x(i) = bl(i)<br>\n      return<br>\n      end<br>\n      subroutine mat(u,ia,a,la,m,n,in)<br>\n      integer ia(1),i,in,j,k,l,la,m,n<br>\n      real*8 a(la,1),u(1),t<br>\n      if ( m .eq. 0 ) return<br>\n      j = (m*m+m)\/2<br>\n      do 10 i = 1,j<br>\n10         u(i) = 0.<br>\n      if ( in .eq. 0 ) goto 30<br>\n      l = 1<br>\n      do 20 i = 1,m<br>\n           u(l) = 1.<br>\n           l = l + m &#8211; i + 1<br>\n20    continue<br>\n30    do 60 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 60<br>\n           l = 0<br>\n           do 50 i = 1,m<br>\n                t = a(i,j)<br>\n                do 40 k = i,m<br>\n                     l = l + 1<br>\n                     u(l) = u(l) + t*a(k,j)<br>\n40              continue<br>\n50         continue<br>\n60    continue<br>\n      return<br>\n      end<br>\n      subroutine mob(v,io,u,ia,k,a,la,n,l,nl,ib,g,b,c)<br>\n      integer ia(1),g,h,i,ib,io,j,k,l,la,n,nl<br>\n      real*8 a(la,1),b(1),c(1),u(1),v(1),s,t<br>\n      h = iabs(ib)<br>\n      if ( l .gt. 0 ) goto 20<br>\n      do 10 i = 1,nl<br>\n10         c(i) = a(i+l,h)<br>\n      goto 110<br>\n20    do 30 i = 1,l<br>\n30         b(i) = a(i,h)<br>\n      call sol(b,u,l,b)<br>\n      t = 0.<br>\n      do 40 i = 1,l<br>\n40         t = t &#8211; a(i,h)*b(i)<br>\n      s = t + 1.<br>\n      if ( s .gt. 0. ) goto 50<br>\n      io = 1<br>\n      return<br>\n50    do 60 i = 1,nl<br>\n60         c(i) = a(i+l,h)<br>\n      do 90 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 90<br>\n           t = 0.<br>\n           do 70 i = 1,l<br>\n70              t = t &#8211; a(i,j)*b(i)<br>\n           do 80 i = 1,nl<br>\n80              c(i) = c(i) + t*a(i+l,j)<br>\n90    continue<br>\n      s = 1.\/dsqrt(s)<br>\n      do 100 i = 1,nl<br>\n100        c(i) = s*c(i)<br>\n110   h = ib<br>\n      call mod(v,ia,k,io,a,la,nl,h,g,c)<br>\n      return<br>\n      end<br>\n      subroutine mod(u,ia,o,io,a,la,n,q,h,v)<br>\n      integer ia(1),h,i,j,k,l,la,m,n,nm1,o,p,q<br>\n      real*8 a(la,1),v(1),u(1),c,r,s,t<br>\n      io = 0<br>\n      p = h<br>\n      if ( p .ne. 0 ) goto 10<br>\n      if ( ia(q) .eq. 0 ) return<br>\n      ia(q) = 0<br>\n      o = o + 1<br>\n      goto 60<br>\n10    if ( p .lt. 3 ) goto 40<br>\n      if ( p .gt. 3 ) goto 30<br>\n      do 20 i = 1,n<br>\n20         v(i) = 0.<br>\n      v(q) = 1.<br>\n      o = o &#8211; 1<br>\n      goto 80<br>\n30    if ( p .eq. 5 ) p = 0<br>\n      goto 80<br>\n40    if ( q .gt. 0 ) goto 50<br>\n      p = -p<br>\n      q = -q<br>\n50    i = ia(q)<br>\n      if ( p .lt. 0 ) ia(q) = -1<br>\n      if ( p .gt. 0 ) ia(q) = 1<br>\n      if ( iabs(i) .eq. 1 ) return<br>\n      o = o &#8211; 1<br>\n      if ( o .ge. 0 ) goto 60<br>\n      io = 1<br>\n      return<br>\n60    if ( n .eq. 0 ) return<br>\n      do 70 i = 1,n<br>\n70         v(i) = a(i,q)<br>\n80    k = 0<br>\n      m = n<br>\n      j = 1<br>\n90    t = v(j)\/u(j+k)<br>\n      v(j) = t<br>\n      if ( j .eq. n ) goto 110<br>\n      j  = j + 1<br>\n      do 100 i = j,n<br>\n100        v(i) = v(i) &#8211; t*u(i+k)<br>\n      m = m &#8211; 1<br>\n      k = k + m<br>\n      goto 90<br>\n110   r = v(n)<br>\n      l = (n*n+n)\/2 + 1<br>\n      nm1 = n &#8211; 1<br>\n      do 170 k = 1,nm1<br>\n           m = l &#8211; 2<br>\n           l = m &#8211; k<br>\n           s = r<br>\n           j = n &#8211; k<br>\n           c = v(j)<br>\n           if ( dabs(c) .gt. dabs(s) ) goto 130<br>\n           if ( s .eq. 0. ) goto 120<br>\n           r = dabs(s)*dsqrt(1.+(c\/s)**2)<br>\n           goto 140<br>\n120        c = 1.<br>\n           s = 0.<br>\n           goto 150<br>\n130        r = dabs(c)*dsqrt(1.+(s\/c)**2)<br>\n140        c = c\/r<br>\n           s = s\/r<br>\nc<br>\nc     process rows j and j+1 of U<br>\nc<br>\n150        v(j+1) = -s*u(l)<br>\n           u(l) = c*u(l)<br>\n           l = l + 1<br>\n           do 160 i = l,m<br>\n                t = u(i+k)<br>\n                u(i+k) = c*t &#8211; s*u(i)<br>\n                u(i)   = s*t + c*u(i)<br>\n160        continue<br>\n170   continue<br>\n      if ( p .ne. 0 ) r = 1 &#8211; r*r<br>\n      if ( p .eq. 0 ) r = 1 + r*r<br>\n      if ( r .gt. 0. ) goto 180<br>\n      io = 1<br>\n      return<br>\n180   r = dsqrt(r)<br>\n      do 190 i = 1,n<br>\n190        u(i) = r*u(i)<br>\nc<br>\nc     restore upper triangular form<br>\nc<br>\n      m = 0<br>\n      k = n<br>\n      do 250 j = 2,n<br>\n           l = m + 1<br>\n           m = m + k<br>\n           k = k &#8211; 1<br>\n           c = u(l)<br>\n           s = v(j)<br>\n           if ( dabs(c) .gt. dabs(s) ) goto 210<br>\n           if ( s .eq. 0. ) goto 200<br>\n           r = dabs(s)*dsqrt(1.+(c\/s)**2)<br>\n           goto 220<br>\n200        c = 1.<br>\n           s = 0.<br>\n           r = 0.<br>\n           goto 230<br>\n210        r = dabs(c)*dsqrt(1.+(s\/c)**2)<br>\n220        c = c\/r<br>\n           s = s\/r<br>\n230        u(l) = r<br>\n           l = l + 1<br>\n           do 240 i = l,m<br>\n                t = u(i+k)<br>\n                u(i+k) = c*t &#8211; s*u(i)<br>\n                u(i)   = s*t + c*u(i)<br>\n240        continue<br>\n250   continue<br>\n      return<br>\n      end<br>\n      subroutine mul(le,li,e,u,ia,a,la,m,n,df,l,nl,z)<br>\n      integer ia(1),i,j,l,la,m,n,nl<br>\n      real*8 a(la,1),df(1),le(1),li(1),u(1),z(1),e,t<br>\n      do 10 i = 1,m<br>\n10         le(i) = 0.<br>\n      do 30 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 30<br>\n           t = df(j)<br>\n           do 20 i = 1,m<br>\n20              le(i) = le(i) &#8211; t*a(i,j)<br>\n30    continue<br>\n      call sol(le,u,m,le)<br>\n      e = 0.<br>\n      do 60 j = 1,n<br>\n           li(j) = 0.<br>\n           t = df(j)<br>\n           do 40 i = 1,m<br>\n40              t = t + le(i)*a(i,j)<br>\n           if ( ia(j) .eq. 0 ) goto 50<br>\n           if ( ia(j) .gt. 0 ) t = -t<br>\n           li(j) = t<br>\n           if ( t .ge. 0. ) goto 60<br>\n           li(j) = 0.<br>\n50         e = dmax1(e,dabs(t))<br>\n60    continue<br>\n      if ( nl .eq. 0 ) return<br>\n      do 70 i = 1,nl<br>\n70         le(i+l) = le(i+l)*z(i)<br>\n      return<br>\n      end<br>\n      subroutine mup(p,e,u,ia,le,a,la,n,dg,lg,pn,g,df,l,nl,y,z)<br>\n      integer ia(1),i,j,l,la,lg,n,nl<br>\n      real*8 a(la,1),dg(lg,1),df(1),g(1),le(1),p(1),u(1),y(1),z(1)<br>\n      real*8 e,pn,t<br>\n      do 10 i = 1,nl<br>\n10         z(i) = le(i) + pn*g(i)<br>\n      if ( l .eq. 0 ) goto 90<br>\n      do 20 i = 1,l<br>\n20         p(i) = 0.<br>\n      do 50 j = 1,n<br>\n           t = df(j)<br>\n           do 30 i = 1,nl<br>\n30              t = t + z(i)*dg(i,j)<br>\n           y(j) = t<br>\n           if ( ia(j) .ne. 0 ) goto 50<br>\n           do 40 i = 1,l<br>\n40              p(i) = p(i) &#8211; t*a(i,j)<br>\n50    continue<br>\n      call sol(p,u,l,p)<br>\n      e = 0.<br>\n      do 80 j = 1,n<br>\n           t = y(j)<br>\n           do 60 i = 1,l<br>\n60              t = t + p(i)*a(i,j)<br>\n           if ( ia(j) .eq. 0 ) goto 70<br>\n           if ( ia(j) .gt. 0 ) t = -t<br>\n           if ( t .ge. 0. ) goto 80<br>\n70         e = dmax1(e,dabs(t))<br>\n80    continue<br>\n      return<br>\n90    e = 0.<br>\n      do 120 j = 1,n<br>\n           t = df(j)<br>\n           do 100 i = 1,nl<br>\n100             t = t + z(i)*dg(i,j)<br>\n           if ( ia(j) .eq. 0 ) goto 110<br>\n           if ( ia(j) .gt. 0 ) t = -t<br>\n           if ( t .ge. 0. ) goto 120<br>\n110        e = dmax1(e,dabs(t))<br>\n120   continue<br>\n      return<br>\n      end<br>\n      subroutine nf1(x,u,ia,k,io,y,a,la,m,n,b,bl,bu,c,d,g)<br>\n      integer ia(1),h,i,io,it,j,k,l,la,m,n<br>\n      double precision a(la,1),b(1),bl(1),bu(1),c(1),d(1),g(1),u(1)<br>\n      double precision x(1),y(1),big,e,f,p,q,r,s,t<br>\nc<br>\nc     set big = largest floating point number<br>\nc<br>\n      big = 1.d50<br>\n      io = 0<br>\n      if ( m .gt. 0 ) goto 30<br>\n      do 20 i = 1,n<br>\n           x(i) = y(i)<br>\n           if ( x(i) .lt. bl(i) ) goto 10<br>\n           if ( x(i) .le. bu(i) ) goto 20<br>\n           x(i) = bu(i)<br>\n           if ( ia(i) .eq. 0 ) k = k &#8211; 1<br>\n           ia(i) = 1<br>\n           goto 20<br>\n10         x(i) = bl(i)<br>\n           if ( ia(i) .eq. 0 ) k = k &#8211; 1<br>\n           ia(i) = -1<br>\n20    continue<br>\n      return<br>\n30    call sol(b,u,m,b)<br>\n      do 50 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 50<br>\n           t = y(j)<br>\n           do 40 i = 1,m<br>\n40              t = t + b(i)*a(i,j)<br>\n           x(j) = t<br>\n50    continue<br>\n      l = 0<br>\n      do 70 i = 1,n<br>\n           d(i) = 0.<br>\n           if ( iabs(ia(i)) .eq. 1 ) goto 70<br>\n           if ( x(i) .lt. bl(i) ) goto 60<br>\n           if ( x(i) .le. bu(i) ) goto 70<br>\n           ia(i) = 2<br>\n           l = l + 1<br>\n           goto 70<br>\n60         ia(i) = -2<br>\n           l = l + 1<br>\n70    continue<br>\n      f = 0.<br>\n      it = 0<br>\n      if ( l .gt. 0 ) goto 230<br>\n      io = -1<br>\n80    do 90 i = 1,n<br>\n           if ( ia(i) .gt. 0 ) x(i) = bu(i)<br>\n           if ( ia(i) .lt. 0 ) x(i) = bl(i)<br>\n90    continue<br>\n      return<br>\n100   r = 0.<br>\n      s = 0.<br>\n      t = big<br>\n      h = 0<br>\n      it = it + 1<br>\n      if ( it .eq. 1 ) q = 0.<br>\n      if ( it .gt. 1 ) q = f\/e<br>\n      do 190 i = 1,n<br>\n           if ( iabs(ia(i)) .eq. 1 ) goto 190<br>\n           d(i) = q*d(i) &#8211; g(i)<br>\n           s = s + d(i)*g(i)<br>\n           if ( ia(i) .ne. 0 ) goto 110<br>\n           if ( d(i) .eq. 0. ) goto 190<br>\n           if ( d(i) .lt. 0. ) goto 120<br>\n           goto 170<br>\n110        r = r + d(i)**2<br>\n           if ( ia(i) .gt. 0 ) goto 150<br>\n           if ( x(i) .ge. bl(i) ) goto 140<br>\n           if ( d(i) .le. 0. ) goto 190<br>\n120        p = (bl(i)-x(i))\/d(i)<br>\n130        if ( p .ge. t ) goto 190<br>\n           t = p<br>\n           h = -i<br>\n           goto 190<br>\n140        p = 0.<br>\n           goto 130<br>\n150        if ( x(i) .gt. bu(i) ) goto 160<br>\n           p = 0.<br>\n           goto 180<br>\n160        if ( d(i) .ge. 0. ) goto 190<br>\n170        p = (bu(i)-x(i))\/d(i)<br>\n180        if ( p .ge. t ) goto 190<br>\n           t = p<br>\n           h = i<br>\n190   continue<br>\n      if ( r .ne. 0. ) s = -s\/r<br>\n      j = iabs(h)<br>\n      if ( t .le. s ) goto 200<br>\n      if ( ia(j) .eq. 0 ) goto 210<br>\n200   s = t<br>\n      if ( ia(j) .ne. 0 ) l = l &#8211; 1<br>\n      call mod(u,ia,k,io,a,la,m,h,1,b)<br>\n      if ( io .gt. 0 ) return<br>\n      it = 0<br>\n210   do 220 i = 1,n<br>\n           if ( iabs(ia(i)) .eq. 1 ) goto 220<br>\n           x(i) = x(i) + s*d(i)<br>\n220   continue<br>\n      if ( l .eq. 0 ) goto 80<br>\nc<br>\nc     *** compute the projected gradient ***<br>\nc<br>\n230   do 240 i = 1,m<br>\n240        c(i) = 0.<br>\n      do 260 j = 1,n<br>\n           if ( iabs(ia(j)) .lt. 2 ) goto 260<br>\n           if ( ia(j) .gt. 0 ) t = bu(j) &#8211; x(j)<br>\n           if ( ia(j) .lt. 0 ) t = bl(j) &#8211; x(j)<br>\n           do 250 i = 1,m<br>\n250             c(i) = c(i) + t*a(i,j)<br>\n260   continue<br>\n      call sol(b,u,m,c)<br>\n      e = f<br>\n      f = 0.<br>\n      r = 0.<br>\n      s = 0.<br>\n      do 290 j = 1,n<br>\n           t = 0.<br>\n           if ( ia(j) .eq. 2 ) t = x(j) &#8211; bu(j)<br>\n           if ( ia(j) .eq.-2 ) t = x(j) &#8211; bl(j)<br>\n           do 270 i = 1,m<br>\n270             t = t + b(i)*a(i,j)<br>\n           if ( iabs(ia(j)) .eq. 1 ) goto 280<br>\n           f = f + t*t<br>\n           g(j) = t<br>\n           r = dmax1(dabs(t),r)<br>\n           goto 290<br>\n280        t = t*ia(j)<br>\n           if ( t .le. s ) goto 290<br>\n           s = t<br>\n           h = j<br>\n290   continue<br>\n300   if ( s .gt. 10.*r ) goto 310<br>\n      if ( r .eq. 0. ) goto 360<br>\n      if ( it .ge. l ) goto 360<br>\n      if ( it .ge. k ) goto 360<br>\n      goto 100<br>\n310   x(h) = bl(h)<br>\n      if ( ia(h) .gt. 0 ) x(h) = bu(h)<br>\n      call mod(u,ia,k,io,a,la,m,h,0,b)<br>\n      if ( io .gt. 0 ) return<br>\n      call sol(b,u,m,c)<br>\n      it = 0<br>\n      f = 0.<br>\n      r = 0.<br>\n      do 330 j = 1,n<br>\n           if ( iabs(ia(j)) .eq. 1 ) goto 330<br>\n           t = 0.<br>\n           if ( ia(j) .eq. 2 ) t = x(j) &#8211; bu(j)<br>\n           if ( ia(j) .eq.-2 ) t = x(j) &#8211; bl(j)<br>\n           do 320 i = 1,m<br>\n320             t = t + b(i)*a(i,j)<br>\n           f = f + t*t<br>\n           g(j) = t<br>\n           r = dmax1(dabs(t),r)<br>\n330   continue<br>\n      if ( r .gt. 0. ) goto 100<br>\n      do 350 j = 1,n<br>\n           if ( iabs(ia(j)) .ne. 1 ) goto 350<br>\n           t = 0.<br>\n           do 340 i = 1,m<br>\n340             t = t + b(i)*a(i,j)<br>\n           t = t*ia(j)<br>\n           if ( t .le. s ) goto 350<br>\n           s = t<br>\n           h = j<br>\n350   continue<br>\n      goto 300<br>\n360   io = 2<br>\n      return<br>\n      end<br>\n      subroutine nf2(x,u,ia,k,io,y,a,la,m,n,b,ib,bl,bu,c,d,g)<br>\n      integer ia(1),h,i,io,it,j,k,l,la,m,n<br>\n      double precision a(la,1),b(1),bl(1),bu(1),c(1),d(1),g(1),ib(1)<br>\n      double precision u(1),x(1),y(1),big,e,f,p,q,r,s,t<br>\nc<br>\nc     set big = largest floating point number<br>\nc<br>\n      big = 1.d50<br>\n      io = 0<br>\n      do 10 i = 1,n<br>\n10         x(i) = y(i)<br>\n      if ( m .eq. 0 ) goto 360<br>\n      l = 0<br>\n      do 20 i = 1,m<br>\n20         if ( ib(i) .ne. 0 ) l = l + 1<br>\n      if ( l .eq. 0 ) goto 360<br>\n      do 30 i = 1,m<br>\n           if ( ib(i) .ne. 0. ) ib(i) = dsign(1.d0,b(i))<br>\n30         if ( ib(i) .eq. 0. ) b(i) = 0.<br>\n      f = 0.<br>\n      it = 0<br>\n      goto 220<br>\n40    t = big<br>\n      it = it + 1<br>\n      if ( it .eq. 1 ) q = 0.<br>\n      if ( it .gt. 1 ) q = f\/e<br>\n      do 60 i = 1,n<br>\n           d(i) = 0.<br>\n           if ( ia(i) .ne. 0 ) goto 60<br>\n           d(i) = q*d(i) &#8211; g(i)<br>\n           if ( d(i) .gt. 0. ) goto 50<br>\n           if ( d(i) .eq. 0. ) goto 60<br>\n           p = (bl(i)-x(i))\/d(i)<br>\n           if ( p .ge. t ) goto 60<br>\n           t = p<br>\n           h = -i<br>\n           goto 60<br>\n50         p = (bu(i)-x(i))\/d(i)<br>\n           if ( p .ge. t ) goto 60<br>\n           t = p<br>\n           h = i<br>\n60    continue<br>\n      r = 0.<br>\n      s = 0.<br>\n      do 70 i = 1,m<br>\n           c(i) = 0.<br>\n           if ( ib(i) .eq. 0 ) goto 70<br>\n           j = i + n<br>\n           d(j) = q*d(j) &#8211; g(j)<br>\n           r = r + d(j)**2<br>\n           s = s + d(j)*b(i)<br>\n70    continue<br>\n      if ( r .ne. 0. ) s = -s\/r<br>\n      do 90 j = 1,n<br>\n           r = d(j)<br>\n           if ( r .eq. 0. ) goto 90<br>\n           do 80 i = 1,m<br>\n80              c(i) = c(i) + r*a(i,j)<br>\n90    continue<br>\n      r = big<br>\n      do 130 i = 1,m<br>\n           if ( ib(i) .eq. 0. ) goto 130<br>\n           if ( ib(i) .gt. 0. ) goto 100<br>\n           if ( b(i) .lt. 0. ) goto 110<br>\n           p = 0.<br>\n           goto 120<br>\n100        if ( b(i) .gt. 0. ) goto 110<br>\n           p = 0.<br>\n           goto 120<br>\n110        if ( c(i) .eq. 0. ) goto 130<br>\n           p = b(i)\/c(i)<br>\n           if ( p .le. 0. ) goto 130<br>\n120        if ( p .ge. r ) goto 130<br>\n           r = p<br>\n           j = i<br>\n130   continue<br>\n      if ( t .lt. r ) goto 160<br>\n      do 140 i = 1,n<br>\n140        x(i) = x(i) + r*d(i)<br>\n      do 150 i = 1,m<br>\n150        if ( ib(i) .ne. 0. ) b(i) = b(i) &#8211; r*c(i)<br>\n      ib(j) = 0.<br>\n      b(j) = 0.<br>\n      call mod(u,ia,k,io,a,la,m,j,3,c)<br>\n      if ( io .gt. 0 ) return<br>\n      l = l &#8211; 1<br>\n      if ( l .eq. 0 ) goto 360<br>\n      it = 0<br>\n      goto 220<br>\n160   if ( t .le. s ) goto 190<br>\n      do 170 i = 1,n<br>\n170        x(i) = x(i) + s*d(i)<br>\n      do 180 i = 1,m<br>\n180        if ( ib(i) .ne. 0. ) b(i) = b(i) &#8211; s*c(i)<br>\n      goto 220<br>\n190   do 200 i = 1,n<br>\n200        x(i) = x(i) + t*d(i)<br>\n      do 210 i = 1,m<br>\n210        if ( ib(i) .ne. 0. ) b(i) = b(i) &#8211; t*c(i)<br>\n      call mod(u,ia,k,io,a,la,m,h,1,c)<br>\n      it = 0<br>\nc<br>\nc     *** compute the projected gradient ***<br>\nc<br>\n220   call sol(c,u,m,b)<br>\n230   e = f<br>\n      f = 0.<br>\n      r = 0.<br>\n      s = 0.<br>\n      do 260 j = 1,n<br>\n           t = 0.<br>\n           do 240 i = 1,m<br>\n240             t = t &#8211; c(i)*a(i,j)<br>\n           if ( iabs(ia(j)) .eq. 1 ) goto 250<br>\n           f = f + t*t<br>\n           g(j) = t<br>\n           r = dmax1(dabs(t),r)<br>\n           goto 260<br>\n250        t = t*ia(j)<br>\n           if ( t .le. s ) goto 260<br>\n           s = t<br>\n           h = j<br>\n260   continue<br>\n270   if ( s .gt. 10.*r ) goto 300<br>\n      if ( r .eq. 0. ) goto 350<br>\n      if ( it .ge. l ) goto 350<br>\n      if ( it .ge. k ) goto 350<br>\n280   do 290 i = 1,m<br>\n           if ( ib(i) .eq. 0. ) goto 290<br>\n           t = b(i) &#8211; c(i)<br>\n           f = f + t*t<br>\n           g(i+n) = t<br>\n290   continue<br>\n      goto 40<br>\n300   x(h) = bl(h)<br>\n      if ( ia(h) .gt. 0 ) x(h) = bu(h)<br>\n      call mod(u,ia,k,io,a,la,m,h,0,c)<br>\n      if ( io .gt. 0 ) return<br>\n      call sol(c,u,m,b)<br>\n      it = 0<br>\n      f = 0.<br>\n      r = 0.<br>\n      do 320 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 320<br>\n           t = 0.<br>\n           do 310 i = 1,m<br>\n310             t = t &#8211; c(i)*a(i,j)<br>\n           f = f + t*t<br>\n           g(j) = t<br>\n           r = dmax1(dabs(t),r)<br>\n320   continue<br>\n      if ( r .gt. 0. ) goto 280<br>\n      s = 0.<br>\n      do 340 j = 1,n<br>\n           if ( ia(j) .eq. 0 ) goto 340<br>\n           t = 0.<br>\n           do 330 i = 1,m<br>\n330             t = t &#8211; c(i)*a(i,j)<br>\n           t = t*ia(j)<br>\n           if ( t .le. s ) goto 340<br>\n           s = t<br>\n           h = j<br>\n340   continue<br>\n      goto 270<br>\n350   io = 2<br>\n      return<br>\n360   do 370 i = 1,n<br>\n           if ( ia(i) .gt. 0 ) x(i) = bu(i)<br>\n           if ( ia(i) .lt. 0 ) x(i) = bl(i)<br>\n370   continue<br>\n      return<br>\n      end<br>\n      subroutine pre(p,e,u,ia,k,l,lm,io,g,a,la,m,n,b,c)<br>\n      integer ia(1),i,io,j,k,l,la,lm,m,n<br>\n      real*8 a(la,1),b(1),c(1),g(1),p(1),u(1),e,s,t<br>\n      if ( m .gt. 0 ) goto 60<br>\n      s = 0.<br>\n      e = s<br>\n      do 20 j = 1,n<br>\n           t = g(j)<br>\n           if ( ia(j) .eq. 0 ) goto 10<br>\n           if ( ia(j) .lt. 0 ) t = -t<br>\n           if ( t .le. s ) goto 20<br>\n           s = t<br>\n           l = j<br>\n           goto 20<br>\n10         e = dmax1(e,dabs(t))<br>\n20    continue<br>\n      if ( s .gt. 10.*e ) goto 30<br>\n      l = 0<br>\n      goto 40<br>\n30    i = ia(l)<br>\n      call mod(u,ia,k,io,a,la,m,l,0,b)<br>\n      if ( i .lt. 0 ) l = -l<br>\n      lm = lm + 1<br>\n40    do 50 j = 1,n<br>\n           p(j) = 0.<br>\n           if ( ia(j) .eq. 0 ) p(j) = g(j)<br>\n50    continue<br>\n      e = dmax1(e,s)<br>\n      return<br>\n60    do 70 i = 1,m<br>\n70         c(i) = 0.<br>\n      do 90 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 90<br>\n           t = g(j)<br>\n           do 80 i = 1,m<br>\n80              c(i) = c(i) &#8211; t*a(i,j)<br>\n90    continue<br>\n      call sol(b,u,m,c)<br>\n      s = 0.<br>\n      e = s<br>\n      do 120 j = 1,n<br>\n           t = g(j)<br>\n           do 100 i = 1,m<br>\n100             t = t + b(i)*a(i,j)<br>\n           if ( ia(j) .eq. 0 ) goto 110<br>\n           p(j) = 0.<br>\n           if ( ia(j) .lt. 0 ) t = -t<br>\n           if ( t .le. s ) goto 120<br>\n           l = j<br>\n           s = t<br>\n           goto 120<br>\n110        p(j) = t<br>\n           e = dmax1(e,dabs(t))<br>\n120   continue<br>\n      if ( s .gt. 10.*e ) goto 130<br>\n      l = 0<br>\n      goto 190<br>\n130   t = g(l)<br>\n      do 140 i = 1,m<br>\n140        c(i) = c(i) &#8211; t*a(i,l)<br>\n      i = ia(l)<br>\n      call mod(u,ia,k,io,a,la,m,l,0,b)<br>\n      if ( i .lt. 0 ) l = -l<br>\n      if ( io .gt. 0 ) return<br>\n      lm = lm + 1<br>\n      call sol(b,u,m,c)<br>\n150   do 180 j = 1,n<br>\n           if ( ia(j) .eq. 0 ) goto 160<br>\n           p(j) = 0.<br>\n           goto 180<br>\n160        t = g(j)<br>\n           do 170 i = 1,m<br>\n170             t = t + b(i)*a(i,j)<br>\n           p(j) = t<br>\n180   continue<br>\n190   e = dmax1(e,s)<br>\n      return<br>\n      end<br>\n      subroutine pro(p,u,ia,a,la,m,n,b)<br>\n      integer ia(1),i,j,la,m,n<br>\n      real*8 a(la,1),b(1),p(1),u(1),t<br>\n      if ( m .gt. 0 ) goto 20<br>\n      do 10 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) p(j) = 0.<br>\n10    continue<br>\n      return<br>\n20    do 30 i = 1,m<br>\n30         b(i) = 0.<br>\n      do 50 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 50<br>\n           t = p(j)<br>\n           do 40 i = 1,m<br>\n40              b(i) = b(i) &#8211; t*a(i,j)<br>\n50    continue<br>\n      call sol(b,u,m,b)<br>\n      do 80 j = 1,n<br>\n           t = 0.<br>\n           if ( ia(j) .ne. 0 ) goto 70<br>\n           t = p(j)<br>\n           do 60 i = 1,m<br>\n60              t = t + b(i)*a(i,j)<br>\n70         p(j) = t<br>\n80    continue<br>\n      return<br>\n      end<br>\n      subroutine prp(p,e,u,v,ia,k,lm,io,g,a,la,l,nl,n,b,c)<br>\n      integer ia(1),h,i,ib,io,j,k,l,la,lm,nl,n<br>\n      real*8 a(la,1),b(1),c(1),g(1),p(1),u(1),v(1),e,t<br>\n      call pre(p,e,u,ia,k,ib,lm,io,g,a,la,l,n,b,c)<br>\n      h = iabs(ib)<br>\n      if ( ib .eq. 0 ) goto 10<br>\n      call mob(v,io,u,ia,k,a,la,n,l,nl,ib,5,b,c)<br>\n      if ( io .gt. 0 ) return<br>\n10    do 20 i = 1,nl<br>\n20         c(i) = 0.<br>\n      do 40 j = 1,n<br>\n           t = p(j)<br>\n           if ( t .eq. 0. ) goto 40<br>\n           do 30 i = 1,nl<br>\n30              c(i) = c(i) + t*a(i+l,j)<br>\n40    continue<br>\n      call sol(c,v,nl,c)<br>\n      if ( l .eq. 0 ) goto 60<br>\n      do 50 i = 1,l<br>\n50         b(i) = 0.<br>\n60    do 90 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 90<br>\n           t = 0.<br>\n           do 70 i = 1,nl<br>\n70              t = t + a(i+l,j)*c(i)<br>\n           p(j) = p(j) &#8211; t<br>\n           if ( l .eq. 0 ) goto 90<br>\n           do 80 i = 1,l<br>\n80              b(i) = b(i) + t*a(i,j)<br>\n90    continue<br>\n      if ( l .eq. 0 ) goto 120<br>\n      call sol(b,u,l,b)<br>\n      do 110 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 110<br>\n           t = 0.<br>\n           do 100 i = 1,l<br>\n100             t = t + b(i)*a(i,j)<br>\n           p(j) = p(j) + t<br>\n110   continue<br>\n120   if ( h .eq. 0 ) return<br>\n      if ( ib .lt. 0 ) goto 130<br>\n      if ( p(h) .ge. 0. ) return<br>\n      goto 140<br>\n130   if ( p(h) .le. 0. ) return<br>\n140   lm = lm &#8211; 1<br>\n      call mob(v,io,u,ia,k,a,la,n,l,nl,ib,4,b,c)<br>\n      if ( io .gt. 0 ) return<br>\n      call mod(u,ia,k,io,a,la,l,ib,1,b)<br>\n      h = 0<br>\n      if ( l .gt. 0 ) goto 160<br>\n      do 150 j = 1,n<br>\n           p(j) = 0.<br>\n150        if ( ia(j) .eq. 0 ) p(j) = g(j)<br>\n      goto 10<br>\n160   do 170 i = 1,l<br>\n170        b(i) = 0.<br>\n      do 190 j = 1,n<br>\n           if ( ia(j) .ne. 0 ) goto 190<br>\n           t = g(j)<br>\n           do 180 i = 1,l<br>\n180             b(i) = b(i) &#8211; t*a(i,j)<br>\n190   continue<br>\n      call sol(b,u,l,b)<br>\n      do 220 j = 1,n<br>\n           t = 0.<br>\n           if ( ia(j) .ne. 0 ) goto 210<br>\n           t = g(j)<br>\n           do 200 i = 1,l<br>\n200             t = t + b(i)*a(i,j)<br>\n210        p(j) = t<br>\n220   continue<br>\n      goto 10<br>\n      end<br>\n      subroutine shk(a,m,n)<br>\n      real*8 a(1)<br>\n      integer g,h,i,j,k,l,m,n<br>\n      if ( m .eq. 0 ) return<br>\n      g = n &#8211; m<br>\n      j = 0<br>\n      l = 0<br>\n      h = m<br>\n10    k = l + 1<br>\n      l = l + h<br>\n      h = h &#8211; 1<br>\n      do 20 i = k,l<br>\n20         a(i) = a(i+j)<br>\n      j = j + g<br>\n      if ( k .lt. l ) goto 10<br>\n      return<br>\n      end<br>\n      subroutine sol(x,a,n,b)<br>\n      real*8 a(1),b(1),x(1),t<br>\n      integer i,j,k,l,n<br>\n      do 10 i = 1,n<br>\n10         x(i) = b(i)<br>\n      l = 0<br>\n      k = 1<br>\nc     &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br>\nc     |*** forward elimination ***|<br>\nc     &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br>\n20    if ( k .eq. n ) goto 40<br>\n      t = x(k)\/a(k+l)<br>\n      x(k) = t<br>\n      j = l<br>\n      l = l + n &#8211; k<br>\n      k = k + 1<br>\n      if ( t .eq. 0. ) goto 20<br>\n      do 30 i = k,n<br>\n30         x(i) = x(i) &#8211; t*a(i+j)<br>\n      goto 20<br>\nc     &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br>\nc     |*** back substitution by rows ***|<br>\nc     &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br>\n40    x(n) = x(n)\/a(k+l)**2<br>\n50    if ( k .eq. 1 ) return<br>\n      j = k<br>\n      k = k &#8211; 1<br>\n      l = l + k &#8211; n<br>\n      t = x(k)<br>\n      do 60 i = j,n<br>\n60         t = t &#8211; x(i)*a(i+l)<br>\n      x(k) = t\/a(k+l)<br>\n      goto 50<br>\n      end<br>\n      subroutine xpn(a,m,n)<br>\n      real*8 a(1)<br>\n      integer g,h,i,j,k,l,m,n<br>\n      if ( m .eq. 0 ) return<br>\n      g = (m*m+m)\/2<br>\n      h = g<br>\n      l = n &#8211; m<br>\n      j = l*m<br>\n      k = 0<br>\n20    if ( g .le. 1 ) return<br>\n      j = j &#8211; l<br>\n      do 30 i = g,h<br>\n30         a(i+j) = a(i)<br>\n      h = g &#8211; 1<br>\n      k = k + 1<br>\n      g = h &#8211; k<br>\n      goto 20<br>\n      end<\/p>\n\n\n\r\n\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t<\/div>\r\n<\/section>\r\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1075,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"featured_post":"","footnotes":"","_links_to":"","_links_to_target":""},"class_list":["post-272","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/people.clas.ufl.edu\/hager\/wp-json\/wp\/v2\/pages\/272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/people.clas.ufl.edu\/hager\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/people.clas.ufl.edu\/hager\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/people.clas.ufl.edu\/hager\/wp-json\/wp\/v2\/users\/1075"}],"replies":[{"embeddable":true,"href":"https:\/\/people.clas.ufl.edu\/hager\/wp-json\/wp\/v2\/comments?post=272"}],"version-history":[{"count":2,"href":"https:\/\/people.clas.ufl.edu\/hager\/wp-json\/wp\/v2\/pages\/272\/revisions"}],"predecessor-version":[{"id":802,"href":"https:\/\/people.clas.ufl.edu\/hager\/wp-json\/wp\/v2\/pages\/272\/revisions\/802"}],"wp:attachment":[{"href":"https:\/\/people.clas.ufl.edu\/hager\/wp-json\/wp\/v2\/media?parent=272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}