PROGRAM f08tnfe ! F08TNF Example Program Text ! Mark 23 Release. NAG Copyright 2011. ! .. Use Statements .. USE nag_library, ONLY : f06udf, nag_wp, x02ajf, zhpgv, ztpcon ! .. Implicit None Statement .. IMPLICIT NONE ! .. Parameters .. INTEGER, PARAMETER :: nin = 5, nout = 6 CHARACTER (1), PARAMETER :: uplo = 'U' ! .. Local Scalars .. REAL (KIND=nag_wp) :: anorm, bnorm, eps, rcond, rcondb, & t1, t2 INTEGER :: i, info, j, n ! .. Local Arrays .. COMPLEX (KIND=nag_wp), ALLOCATABLE :: ap(:), bp(:), work(:) COMPLEX (KIND=nag_wp) :: dummy(1,1) REAL (KIND=nag_wp), ALLOCATABLE :: eerbnd(:), rwork(:), w(:) ! .. Intrinsic Functions .. INTRINSIC abs ! .. Executable Statements .. WRITE (nout,*) 'F08TNF Example Program Results' WRITE (nout,*) ! Skip heading in data file READ (nin,*) READ (nin,*) n ALLOCATE (ap((n*(n+1))/2),bp((n*(n+1))/2),work(2*n),eerbnd(n),rwork(3*n & -2),w(n)) ! Read the upper or lower triangular parts of the matrices A and ! B from data file IF (uplo=='U') THEN READ (nin,*) ((ap(i+(j*(j-1))/2),j=i,n),i=1,n) READ (nin,*) ((bp(i+(j*(j-1))/2),j=i,n),i=1,n) ELSE IF (uplo=='L') THEN READ (nin,*) ((ap(i+((2*n-j)*(j-1))/2),j=1,i),i=1,n) READ (nin,*) ((bp(i+((2*n-j)*(j-1))/2),j=1,i),i=1,n) END IF ! Compute the one-norms of the symmetric matrices A and B anorm = f06udf('One norm',uplo,n,ap,rwork) bnorm = f06udf('One norm',uplo,n,bp,rwork) ! Solve the generalized symmetric eigenvalue problem ! A*x = lambda*B*x (ITYPE = 1) ! The NAG name equivalent of zhpgv is f08tnf CALL zhpgv(1,'No vectors',uplo,n,ap,bp,w,dummy,1,work,rwork,info) IF (info==0) THEN ! Print solution WRITE (nout,*) 'Eigenvalues' WRITE (nout,99999) w(1:n) ! Call ZTPCON (F07UUF) to estimate the reciprocal condition ! number of the Cholesky factor of B. Note that: ! cond(B) = 1/RCOND**2 CALL ztpcon('One norm',uplo,'Non-unit',n,bp,rcond,work,rwork,info) ! Print the reciprocal condition number of B rcondb = rcond**2 WRITE (nout,*) WRITE (nout,*) 'Estimate of reciprocal condition number for B' WRITE (nout,99998) rcondb ! Get the machine precision, EPS, and if RCONDB is not less ! than EPS**2, compute error estimates for the eigenvalues eps = x02ajf() IF (rcond>=eps) THEN t1 = eps/rcondb t2 = anorm/bnorm DO i = 1, n eerbnd(i) = t1*(t2+abs(w(i))) END DO ! Print the approximate error bounds for the eigenvalues WRITE (nout,*) WRITE (nout,*) 'Error estimates for the eigenvalues' WRITE (nout,99998) eerbnd(1:n) ELSE WRITE (nout,*) WRITE (nout,*) 'B is very ill-conditioned, error ', & 'estimates have not been computed' END IF ELSE IF (info>n .AND. info<=2*n) THEN i = info - n WRITE (nout,99997) 'The leading minor of order ', i, & ' of B is not positive definite' ELSE WRITE (nout,99996) 'Failure in ZHPGV. INFO =', info END IF 99999 FORMAT (3X,(6F11.4)) 99998 FORMAT (4X,1P,6E11.1) 99997 FORMAT (1X,A,I4,A) 99996 FORMAT (1X,A,I4) END PROGRAM f08tnfe