*     F11DXF Example Program Text
*     Mark 20 Release. NAG Copyright 2001.
*     .. Parameters ..
      INTEGER          NIN, NOUT
      PARAMETER        (NIN=5,NOUT=6)
      INTEGER          NMAX, LA, LWORK
      PARAMETER        (NMAX=1000,LA=10000,LWORK=10*NMAX)
*     .. Local Scalars ..
      DOUBLE PRECISION ANORM, SIGMAX, STPLHS, STPRHS, TOL
      INTEGER          I, IFAIL, IFAIL1, IREVCM, ITERM, ITN, LWREQ, M,
     +                 MAXITN, MONIT, N, NITER, NNZ
      CHARACTER        INIT, NORM, PRECON, WEIGHT
      CHARACTER*8      METHOD
*     .. Local Arrays ..
      COMPLEX *16      A(LA), B(NMAX), DIAG(NMAX), WORK(LWORK), X(NMAX)
      DOUBLE PRECISION WGT(NMAX)
      INTEGER          ICOL(LA), IROW(LA)
*     .. External Subroutines ..
      EXTERNAL         F11BRF, F11BSF, F11BTF, F11DXF, F11XNF
*     .. Executable Statements ..
      WRITE (NOUT,*) 'F11DXF Example Program Results'
*
*     Skip heading in data file
*
      READ (NIN,*)
      READ (NIN,*) N
      IF (N.LE.NMAX) THEN
*
*        Read or initialize the parameters for the iterative solver
*
         READ (NIN,*) METHOD
         READ (NIN,*) PRECON, NORM, WEIGHT, ITERM
         READ (NIN,*) M, TOL, MAXITN
         READ (NIN,*) MONIT
         ANORM = 0.0D0
         SIGMAX = 0.0D0
*
*        Read the parameters for the preconditioner
*
         READ (NIN,*) NITER
*
*        Read the number of non-zero elements of the matrix A, then read
*        the non-zero elements
*
         READ (NIN,*) NNZ
         DO 20 I = 1, NNZ
            READ (NIN,*) A(I), IROW(I), ICOL(I)
   20    CONTINUE
*
*        Read right-hand side vector b and initial approximate solution
*
         READ (NIN,*) (B(I),I=1,N)
         READ (NIN,*) (X(I),I=1,N)
*
*        Call F11BDF to initialize the solver
*
         IFAIL = 1
         CALL F11BRF(METHOD,PRECON,NORM,WEIGHT,ITERM,N,M,TOL,MAXITN,
     +               ANORM,SIGMAX,MONIT,LWREQ,WORK,LWORK,IFAIL)
         IF (IFAIL.NE.0) THEN
            WRITE (NOUT,99992) IFAIL
            GO TO 60
         END IF
*
*        Call repeatedly F11BSF to solve the equations
*        Note that the arrays B and X are overwritten
*
*        On final exit, X will contain the solution and B the residual
*        vector
*
         IFAIL = 0
         IREVCM = 0
         INIT = 'I'
*
   40    CONTINUE
         CALL F11BSF(IREVCM,X,B,WGT,WORK,LWREQ,IFAIL)
         IF (IREVCM.NE.4) THEN
            IFAIL1 = -1
            IF (IREVCM.EQ.-1) THEN
               CALL F11XNF('Transpose',N,NNZ,A,IROW,ICOL,'No checking',
     +                     X,B,IFAIL1)
            ELSE IF (IREVCM.EQ.1) THEN
               CALL F11XNF('No transpose',N,NNZ,A,IROW,ICOL,
     +                     'No checking',X,B,IFAIL1)
            ELSE IF (IREVCM.EQ.2) THEN
               CALL F11DXF('Non Hermitian','N',INIT,NITER,N,NNZ,A,IROW,
     +                     ICOL,'Check',X,B,DIAG,WORK(LWREQ+1),IFAIL1)
               INIT = 'N'
            ELSE IF (IREVCM.EQ.3) THEN
               CALL F11BTF(ITN,STPLHS,STPRHS,ANORM,SIGMAX,WORK,LWREQ,
     +                     IFAIL1)
               IF (IFAIL1.EQ.0) WRITE (NOUT,99999) ITN, STPLHS
            END IF
            IF (IFAIL1.NE.0) IREVCM = 6
            GO TO 40
         ELSE IF (IFAIL.NE.0) THEN
            WRITE (NOUT,99991) IFAIL
            GO TO 60
         END IF
*
*        Obtain information about the computation
*
         IFAIL1 = 0
         CALL F11BTF(ITN,STPLHS,STPRHS,ANORM,SIGMAX,WORK,LWREQ,IFAIL1)
*
*        Print the output data
*
         WRITE (NOUT,99998)
         WRITE (NOUT,99997) 'Number of iterations for convergence:    ',
     +     ITN
         WRITE (NOUT,99996) 'Residual norm:                           ',
     +     STPLHS
         WRITE (NOUT,99996) 'Right-hand side of termination criterion:',
     +     STPRHS
         WRITE (NOUT,99996) '1-norm of matrix A:                      ',
     +     ANORM
*
*        Output x
*
         WRITE (NOUT,99995)
         WRITE (NOUT,99993) (X(I),I=1,N)
         WRITE (NOUT,99994)
         WRITE (NOUT,99993) (B(I),I=1,N)
      END IF
   60 CONTINUE
*
99999 FORMAT (/1X,'Monitoring at iteration no.',I4,/1X,1P,'residual no',
     +       'rm: ',E14.4)
99998 FORMAT (/1X,'Final Results')
99997 FORMAT (1X,A,I4)
99996 FORMAT (1X,A,1P,E14.4)
99995 FORMAT (/2X,'  Solution vector')
99994 FORMAT (/2X,'  Residual vector')
99993 FORMAT (1X,'(',1P,E16.4,',',1P,E16.4,')')
99992 FORMAT (1X,/1X,' ** F11BRF returned with IFAIL = ',I5)
99991 FORMAT (1X,/1X,' ** F11BSF returned with IFAIL = ',I5)
      END
