*     F08KCF Example Program Text
*     Mark 21 Release. NAG Copyright 2004.
*     .. Parameters ..
      INTEGER          NIN, NOUT
      PARAMETER        (NIN=5,NOUT=6)
      INTEGER          MMAX, NB, NLVL, NMAX
      PARAMETER        (MMAX=8,NB=64,NLVL=10,NMAX=16)
      INTEGER          LDA, LIWORK, LWORK
      PARAMETER        (LDA=MMAX,LIWORK=3*MMAX*NLVL+11*MMAX,
     +                 LWORK=NB*(2*MMAX+NMAX))
*     .. Local Scalars ..
      DOUBLE PRECISION RCOND
      INTEGER          I, INFO, J, LWRK, M, N, RANK
*     .. Local Arrays ..
      DOUBLE PRECISION A(LDA,NMAX), B(NMAX), S(MMAX), WORK(LWORK)
      INTEGER          IWORK(LIWORK)
*     .. External Subroutines ..
      EXTERNAL         DGELSD
*     .. Executable Statements ..
      WRITE (NOUT,*) 'F08KCF Example Program Results'
      WRITE (NOUT,*)
*     Skip heading in data file
      READ (NIN,*)
      READ (NIN,*) M, N
      IF (M.LE.MMAX .AND. N.LE.NMAX .AND. M.LE.N) THEN
*
*        Read A and B from data file
*
         READ (NIN,*) ((A(I,J),J=1,N),I=1,M)
         READ (NIN,*) (B(I),I=1,M)
*
*        Choose RCOND to reflect the relative accuracy of the input
*        data
*
         RCOND = 0.01D0
*
*        Solve the least squares problem min( norm2(b - Ax) ) for the
*        x of minimum norm.
*
         CALL DGELSD(M,N,1,A,LDA,B,N,S,RCOND,RANK,WORK,LWORK,IWORK,
     +               INFO)
*
         IF (INFO.EQ.0) THEN
*
*           Print solution
*
            WRITE (NOUT,*) 'Least squares solution'
            WRITE (NOUT,99999) (B(I),I=1,N)
*
*           Print the effective rank of A
*
            WRITE (NOUT,*)
            WRITE (NOUT,*) 'Tolerance used to estimate the rank of A'
            WRITE (NOUT,99998) RCOND
            WRITE (NOUT,*) 'Estimated rank of A'
            WRITE (NOUT,99997) RANK
*
*           Print singular values of A
*
            WRITE (NOUT,*)
            WRITE (NOUT,*) 'Singular values of A'
            WRITE (NOUT,99999) (S(I),I=1,M)
         ELSE
            WRITE (NOUT,*) 'The SVD algorithm failed to converge'
         END IF
      ELSE
         WRITE (NOUT,*) 'MMAX and/or NMAX too small, and/or M.GT.N'
      END IF
      STOP
*
99999 FORMAT (1X,7F11.4)
99998 FORMAT (3X,1P,E11.2)
99997 FORMAT (1X,I6)
      END
