*     E04NDA Example Program Text
*     Mark 20 Release. NAG Copyright 2001.
*     .. Parameters ..
      INTEGER          NIN, NOUT
      PARAMETER        (NIN=5,NOUT=6)
      INTEGER          MMAX, NMAX, NCMAX
      PARAMETER        (MMAX=10,NMAX=10,NCMAX=10)
      INTEGER          LDC, LDA
      PARAMETER        (LDC=NCMAX,LDA=MMAX)
      INTEGER          LIWORK, LWORK
      PARAMETER        (LIWORK=100,LWORK=1000)
      INTEGER          LCWSAV, LIWSAV, LLWSAV, LRWSAV
      PARAMETER        (LCWSAV=1,LIWSAV=610,LLWSAV=120,LRWSAV=475)
*     .. Local Scalars ..
      DOUBLE PRECISION OBJ
      INTEGER          I, IFAIL, INFORM, ITER, J, M, N, NCLIN, OUTCHN
*     .. Local Arrays ..
      DOUBLE PRECISION A(LDA,NMAX), B(MMAX), BL(NMAX+NCMAX),
     +                 BU(NMAX+NCMAX), C(LDC,NMAX), CLAMDA(NMAX+NCMAX),
     +                 CVEC(NMAX), RWSAV(LRWSAV), WORK(LWORK), X(NMAX)
      INTEGER          ISTATE(NMAX+NCMAX), IWORK(LIWORK), IWSAV(LIWSAV),
     +                 KX(NMAX)
      LOGICAL          LWSAV(LLWSAV)
      CHARACTER*80     CWSAV(LCWSAV)
*     .. External Subroutines ..
      EXTERNAL         DGEMV, E04NCA, E04NDA, E04NEA, E04WBF, X04ABF
*     .. Executable Statements ..
      WRITE (NOUT,*) 'E04NDA Example Program Results'
      OUTCHN = NOUT
*     Skip heading in data file
      READ (NIN,*)
      READ (NIN,*) M, N, NCLIN
      IF (M.LE.MMAX .AND. N.LE.NMAX .AND. NCLIN.LE.NCMAX) THEN
*
*        Read CVEC, A, C, BL, BU and X from data file
*
         READ (NIN,*) (CVEC(I),I=1,N)
         READ (NIN,*) ((A(I,J),J=1,N),I=1,M)
         READ (NIN,*) ((C(I,J),J=1,N),I=1,NCLIN)
         READ (NIN,*) (BL(I),I=1,N+NCLIN)
         READ (NIN,*)
         READ (NIN,*) (BU(I),I=1,N+NCLIN)
         READ (NIN,*)
         READ (NIN,*) (X(I),I=1,N)
*
*        Set the unit number for advisory messages to OUTCHN
*
         CALL X04ABF(1,OUTCHN)
*
*        Initialise using E04WBF and check for error exits
*
         IFAIL = 1
         CALL E04WBF('E04NCA',CWSAV,LCWSAV,LWSAV,LLWSAV,IWSAV,LIWSAV,
     +               RWSAV,LRWSAV,IFAIL)
         IF (IFAIL.NE.0) THEN
            WRITE (NOUT,*)
            WRITE (NOUT,99999) ' ** E04WBF terminated with IFAIL = ',
     +        IFAIL
            GO TO 60
         END IF
*
*        Set one option using E04NEA
*
         CALL E04NEA(' Problem Type = QP2 ',LWSAV,IWSAV,RWSAV,INFORM)
         IF (INFORM.NE.0) THEN
            WRITE (NOUT,99999) ' ** E04NEA terminated with INFORM = ',
     +        INFORM
            GO TO 60
         ELSE
*
*           Read the options file for the remaining options
*
            CALL E04NDA(NIN,LWSAV,IWSAV,RWSAV,INFORM)
*
            IF (INFORM.NE.0) THEN
               WRITE (NOUT,99999) ' ** E04NDA terminated with INFORM =',
     +           INFORM
               GO TO 60
            END IF
         END IF
*
*        Solve the problem
*
         IFAIL = 1
*
         CALL E04NCA(M,N,NCLIN,LDC,LDA,C,BL,BU,CVEC,ISTATE,KX,X,A,B,
     +               ITER,OBJ,CLAMDA,IWORK,LIWORK,WORK,LWORK,LWSAV,
     +               IWSAV,RWSAV,IFAIL)
*
         WRITE (NOUT,*)
         IF (IFAIL.EQ.6) THEN
            WRITE (NOUT,99998)
         ELSE IF (IFAIL.GE.0) THEN
            WRITE (NOUT,99997) IFAIL
            WRITE (NOUT,*)
            WRITE (NOUT,99996)
            WRITE (NOUT,*)
            DO 20 I = 1, N
               WRITE (NOUT,99995) I, ISTATE(I), X(I), CLAMDA(I)
   20       CONTINUE
            IF (NCLIN.GT.0) THEN
*
*              Below is a call to the level 2 BLAS routine DGEMV.
*              This performs the matrix vector multiplication C*X
*              (linear constraint values) and puts the result in
*              the first NCLIN locations of WORK.
*
               CALL DGEMV('N',NCLIN,N,1.0D0,C,LDC,X,1,0.0D0,WORK,1)
               WRITE (NOUT,*)
               WRITE (NOUT,*)
               WRITE (NOUT,99994)
               WRITE (NOUT,*)
               DO 40 I = N + 1, N + NCLIN
                  J = I - N
                  WRITE (NOUT,99993) J, ISTATE(I), WORK(J), CLAMDA(I)
   40          CONTINUE
            END IF
            WRITE (NOUT,*)
            WRITE (NOUT,*)
            WRITE (NOUT,99992) OBJ
         ELSE
            WRITE (NOUT,99999) ' ** E04NCA terminated with IFAIL = ',
     +        IFAIL
         END IF
      END IF
   60 CONTINUE
*
99999 FORMAT (1X,A,I5)
99998 FORMAT (1X,' ** An input parameter is invalid')
99997 FORMAT (1X,'E04NCA returned with IFAIL = ',I4)
99996 FORMAT (1X,'Varbl',2X,'Istate',3X,'Value',9X,'Lagr Mult')
99995 FORMAT (1X,'V',2(1X,I3),4X,1P,G14.6,2X,1P,G12.4)
99994 FORMAT (1X,'L Con',2X,'Istate',3X,'Value',9X,'Lagr Mult')
99993 FORMAT (1X,'L',2(1X,I3),4X,1P,G14.6,2X,1P,G12.4)
99992 FORMAT (1X,'Final objective value = ',G15.7)
      END
