* F11BDF Example Program Text * Mark 19 Release. NAG Copyright 1999. * .. Parameters .. INTEGER NIN, NOUT PARAMETER (NIN=5,NOUT=6) INTEGER NMAX, LA, LIWORK, LWORK PARAMETER (NMAX=1000,LA=10000,LIWORK=7*NMAX+2,LWORK=6*NMAX) * .. Local Scalars .. DOUBLE PRECISION ANORM, DTOL, SIGMAX, STPLHS, STPRHS, TOL INTEGER I, IFAIL, IFAIL1, IREVCM, ITERM, ITN, LFILL, + LWREQ, M, MAXITN, MONIT, N, NNZ, NNZC, NPIVM CHARACTER MILU, NORM, PRECON, PSTRAT, WEIGHT CHARACTER*8 METHOD * .. Local Arrays .. DOUBLE PRECISION A(LA), B(NMAX), WGT(NMAX), WORK(LWORK), X(NMAX) INTEGER ICOL(LA), IDIAG(NMAX), IPIVP(NMAX), IPIVQ(NMAX), + IROW(LA), ISTR(NMAX+1), IWORK(LIWORK) * .. External Subroutines .. EXTERNAL F11BDF, F11BEF, F11BFF, F11DAF, F11DBF, F11XAF * .. Executable Statements .. WRITE (NOUT,*) 'F11BDF 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,*) LFILL, DTOL READ (NIN,*) MILU, 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 * READ (NIN,*) (B(I),I=1,N) READ (NIN,*) (X(I),I=1,N) * * Calculate incomplete LU factorization * IFAIL = 1 MILU = 'N' CALL F11DAF(N,NNZ,A,LA,IROW,ICOL,LFILL,DTOL,PSTRAT,MILU,IPIVP, + IPIVQ,ISTR,IDIAG,NNZC,NPIVM,IWORK,LIWORK,IFAIL) IF (IFAIL.EQ.0) THEN * * Call F11BDF to initialize the solver * IFAIL = 1 CALL F11BDF(METHOD,PRECON,NORM,WEIGHT,ITERM,N,M,TOL,MAXITN, + ANORM,SIGMAX,MONIT,LWREQ,WORK,LWORK,IFAIL) IF (IFAIL.NE.0) THEN WRITE (NOUT,99993) IFAIL GO TO 60 END IF ELSE WRITE (NOUT,99992) IFAIL GO TO 60 END IF * * Call repeatedly F11BEF 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 F11BEF(IREVCM,X,B,WGT,WORK,LWREQ,IFAIL) IF (IREVCM.NE.4) THEN IFAIL1 = -1 IF (IREVCM.EQ.-1) THEN CALL F11XAF('Transpose',N,NNZ,A,IROW,ICOL,'No checking', + X,B,IFAIL1) ELSE IF (IREVCM.EQ.1) THEN CALL F11XAF('No transpose',N,NNZ,A,IROW,ICOL, + 'No checking',X,B,IFAIL1) ELSE IF (IREVCM.EQ.2) THEN CALL F11DBF('No transpose',N,A,LA,IROW,ICOL,IPIVP,IPIVQ, + ISTR,IDIAG,'No checking',X,B,IFAIL1) ELSE IF (IREVCM.EQ.3) THEN IFAIL1 = 0 CALL F11BFF(ITN,STPLHS,STPRHS,ANORM,SIGMAX,WORK,LWREQ, + IFAIL1) WRITE (NOUT,99999) ITN, STPLHS WRITE (NOUT,99998) WRITE (NOUT,99997) (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,99991) IFAIL GO TO 60 END IF * * Obtain information about the computation * IFAIL1 = 0 CALL F11BFF(ITN,STPLHS,STPRHS,ANORM,SIGMAX,WORK,LWREQ,IFAIL1) * * Print the output data * WRITE (NOUT,99996) WRITE (NOUT,99995) 'Number of iterations for convergence: ', + ITN WRITE (NOUT,99994) 'Residual norm: ', + STPLHS WRITE (NOUT,99994) 'Right-hand side of termination criterion:', + STPRHS WRITE (NOUT,99994) '1-norm of matrix A: ', + ANORM * * Output x * WRITE (NOUT,99998) WRITE (NOUT,99997) (X(I),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 (/2X,' Solution vector',2X,' Residual vector') 99997 FORMAT (1X,1P,E16.4,1X,E16.4) 99996 FORMAT (/1X,'Final Results') 99995 FORMAT (1X,A,I4) 99994 FORMAT (1X,A,1P,E14.4) 99993 FORMAT (1X,/1X,' ** F11BDF returned with IFAIL = ',I5) 99992 FORMAT (1X,/1X,' ** F11DAF returned with IFAIL = ',I5) 99991 FORMAT (1X,/1X,' ** F11BEF returned with IFAIL = ',I5) END