* F11GDF Example Program Text * Mark 20 Release. NAG Copyright 2001. * .. Parameters .. INTEGER NIN, NOUT PARAMETER (NIN=5,NOUT=6) INTEGER NMAX, LA, LIWORK, LWORK PARAMETER (NMAX=1000,LA=10000,LIWORK=2*LA+7*NMAX+1, + LWORK=6*NMAX) * .. Local Scalars .. DOUBLE PRECISION ANORM, DSCALE, DTOL, SIGERR, SIGMAX, SIGTOL, + STPLHS, STPRHS, TOL INTEGER I, IFAIL, IFAIL1, IREVCM, ITERM, ITN, ITS, LFILL, + LWREQ, MAXITN, MAXITS, MONIT, N, NNZ, NNZC, NPIVM CHARACTER MIC, NORM, PRECON, PSTRAT, SIGCMP, WEIGHT CHARACTER*6 METHOD * .. Local Arrays .. DOUBLE PRECISION A(LA), B(NMAX), WGT(NMAX), WORK(LWORK), X(NMAX) INTEGER ICOL(LA), IPIV(NMAX), IROW(LA), ISTR(NMAX+1), + IWORK(LIWORK) * .. External Subroutines .. EXTERNAL F11GDF, F11GEF, F11GFF, F11JAF, F11JBF, F11XEF * .. Executable Statements .. WRITE (NOUT,*) 'F11GDF 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, SIGCMP, NORM, WEIGHT, ITERM READ (NIN,*) TOL, MAXITN READ (NIN,*) MONIT ANORM = 0.0D0 SIGMAX = 0.0D0 SIGTOL = 1.0D-2 MAXITS = N * * Read the parameters for the preconditioner * READ (NIN,*) LFILL, DTOL READ (NIN,*) MIC, DSCALE READ (NIN,*) PSTRAT * * 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 x * READ (NIN,*) (B(I),I=1,N) READ (NIN,*) (X(I),I=1,N) * IF (METHOD.EQ.'CG') THEN WRITE (NOUT,99999) ELSE IF (METHOD.EQ.'SYMMLQ') THEN WRITE (NOUT,99998) ELSE IF (METHOD.EQ.'MINRES') THEN WRITE (NOUT,99997) END IF * * Calculate incomplete Cholesky factorization * IFAIL = 1 CALL F11JAF(N,NNZ,A,LA,IROW,ICOL,LFILL,DTOL,MIC,DSCALE,PSTRAT, + IPIV,ISTR,NNZC,NPIVM,IWORK,LIWORK,IFAIL) IF (IFAIL.NE.0) THEN WRITE (NOUT,99990) IFAIL GO TO 60 END IF * * Call F11GDF to initialize the solver * IFAIL = 1 CALL F11GDF(METHOD,PRECON,SIGCMP,NORM,WEIGHT,ITERM,N,TOL, + MAXITN,ANORM,SIGMAX,SIGTOL,MAXITS,MONIT,LWREQ,WORK, + LWORK,IFAIL) IF (IFAIL.NE.0) THEN WRITE (NOUT,99989) IFAIL GO TO 60 END IF * * Call repeatedly F11GEF 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 = 1 IREVCM = 0 * LWREQ = LWORK 40 CONTINUE CALL F11GEF(IREVCM,X,B,WGT,WORK,LWREQ,IFAIL) IF (IREVCM.NE.4) THEN IFAIL1 = -1 IF (IREVCM.EQ.1) THEN CALL F11XEF(N,NNZ,A,IROW,ICOL,'No checking',X,B,IFAIL1) ELSE IF (IREVCM.EQ.2) THEN CALL F11JBF(N,A,LA,IROW,ICOL,IPIV,ISTR,'No checking',X,B, + IFAIL1) ELSE IF (IREVCM.EQ.3) THEN IFAIL1 = 0 CALL F11GFF(ITN,STPLHS,STPRHS,ANORM,SIGMAX,ITS,SIGERR, + WORK,LWREQ,IFAIL1) WRITE (NOUT,99996) ITN, STPLHS WRITE (NOUT,99995) WRITE (NOUT,99994) (X(I),B(I),I=1,N) END IF IF (IFAIL1.NE.0) IREVCM = 6 GO TO 40 ELSE IF (IFAIL.NE.0) THEN WRITE (NOUT,99988) IFAIL GO TO 60 END IF * * Obtain information about the computation * IFAIL1 = 0 CALL F11GFF(ITN,STPLHS,STPRHS,ANORM,SIGMAX,ITS,SIGERR,WORK, + LWREQ,IFAIL1) * * Print the output data * WRITE (NOUT,99993) WRITE (NOUT,99992) 'Number of iterations for convergence: ', + ITN WRITE (NOUT,99991) 'Residual norm: ', + STPLHS WRITE (NOUT,99991) 'Right-hand side of termination criterion:', + STPRHS WRITE (NOUT,99991) '1-norm of matrix A: ', + ANORM WRITE (NOUT,99991) 'Largest singular value of A_bar: ', + SIGMAX * * Output x * WRITE (NOUT,99995) WRITE (NOUT,99994) (X(I),B(I),I=1,N) END IF 60 CONTINUE * 99999 FORMAT (/1X,'Solve a system of linear equations using the conjug', + 'ate gradient method') 99998 FORMAT (/1X,'Solve a system of linear equations using the Lanczo', + 's method (SYMMLQ)') 99997 FORMAT (/1X,'Solve a system of linear equations using the minimu', + 'm residual method (MINRES)') 99996 FORMAT (/1X,'Monitoring at iteration no.',I4,/1X,1P,'residual no', + 'rm: ',E14.4) 99995 FORMAT (2X,'Solution vector',2X,'Residual vector') 99994 FORMAT (1X,1P,E16.4,1X,E16.4) 99993 FORMAT (/1X,'Final Results') 99992 FORMAT (1X,A,I4) 99991 FORMAT (1X,A,1P,E14.4) 99990 FORMAT (1X,/1X,' ** F11JAF returned with IFAIL = ',I5) 99989 FORMAT (1X,/1X,' ** F11GDF returned with IFAIL = ',I5) 99988 FORMAT (1X,/1X,' ** F11GEF returned with IFAIL = ',I5) END