📄 zdrvev.f
字号:
CALL ZLASET( 'Full', N-3, 1, CZERO, CZERO, A( 3, 1 ),
$ LDA )
CALL ZLASET( 'Full', N-3, 2, CZERO, CZERO,
$ A( 3, N-1 ), LDA )
CALL ZLASET( 'Full', 1, N, CZERO, CZERO, A( N, 1 ),
$ LDA )
END IF
*
ELSE IF( ITYPE.EQ.10 ) THEN
*
* Triangular, random eigenvalues
*
CALL ZLATMR( N, N, 'D', ISEED, 'N', WORK, 6, ONE, CONE,
$ 'T', 'N', WORK( N+1 ), 1, ONE,
$ WORK( 2*N+1 ), 1, ONE, 'N', IDUMMA, N, 0,
$ ZERO, ANORM, 'NO', A, LDA, IWORK, IINFO )
*
ELSE
*
IINFO = 1
END IF
*
IF( IINFO.NE.0 ) THEN
WRITE( NOUNIT, FMT = 9993 )'Generator', IINFO, N, JTYPE,
$ IOLDSD
INFO = ABS( IINFO )
RETURN
END IF
*
90 CONTINUE
*
* Test for minimal and generous workspace
*
DO 250 IWK = 1, 2
IF( IWK.EQ.1 ) THEN
NNWORK = 2*N
ELSE
NNWORK = 5*N + 2*N**2
END IF
NNWORK = MAX( NNWORK, 1 )
*
* Initialize RESULT
*
DO 100 J = 1, 7
RESULT( J ) = -ONE
100 CONTINUE
*
* Compute eigenvalues and eigenvectors, and test them
*
CALL ZLACPY( 'F', N, N, A, LDA, H, LDA )
CALL ZGEEV( 'V', 'V', N, H, LDA, W, VL, LDVL, VR, LDVR,
$ WORK, NNWORK, RWORK, IINFO )
IF( IINFO.NE.0 ) THEN
RESULT( 1 ) = ULPINV
WRITE( NOUNIT, FMT = 9993 )'ZGEEV1', IINFO, N, JTYPE,
$ IOLDSD
INFO = ABS( IINFO )
GO TO 220
END IF
*
* Do Test (1)
*
CALL ZGET22( 'N', 'N', 'N', N, A, LDA, VR, LDVR, W, WORK,
$ RWORK, RES )
RESULT( 1 ) = RES( 1 )
*
* Do Test (2)
*
CALL ZGET22( 'C', 'N', 'C', N, A, LDA, VL, LDVL, W, WORK,
$ RWORK, RES )
RESULT( 2 ) = RES( 1 )
*
* Do Test (3)
*
DO 120 J = 1, N
TNRM = DZNRM2( N, VR( 1, J ), 1 )
RESULT( 3 ) = MAX( RESULT( 3 ),
$ MIN( ULPINV, ABS( TNRM-ONE ) / ULP ) )
VMX = ZERO
VRMX = ZERO
DO 110 JJ = 1, N
VTST = ABS( VR( JJ, J ) )
IF( VTST.GT.VMX )
$ VMX = VTST
IF( DIMAG( VR( JJ, J ) ).EQ.ZERO .AND.
$ ABS( DBLE( VR( JJ, J ) ) ).GT.VRMX )
$ VRMX = ABS( DBLE( VR( JJ, J ) ) )
110 CONTINUE
IF( VRMX / VMX.LT.ONE-TWO*ULP )
$ RESULT( 3 ) = ULPINV
120 CONTINUE
*
* Do Test (4)
*
DO 140 J = 1, N
TNRM = DZNRM2( N, VL( 1, J ), 1 )
RESULT( 4 ) = MAX( RESULT( 4 ),
$ MIN( ULPINV, ABS( TNRM-ONE ) / ULP ) )
VMX = ZERO
VRMX = ZERO
DO 130 JJ = 1, N
VTST = ABS( VL( JJ, J ) )
IF( VTST.GT.VMX )
$ VMX = VTST
IF( DIMAG( VL( JJ, J ) ).EQ.ZERO .AND.
$ ABS( DBLE( VL( JJ, J ) ) ).GT.VRMX )
$ VRMX = ABS( DBLE( VL( JJ, J ) ) )
130 CONTINUE
IF( VRMX / VMX.LT.ONE-TWO*ULP )
$ RESULT( 4 ) = ULPINV
140 CONTINUE
*
* Compute eigenvalues only, and test them
*
CALL ZLACPY( 'F', N, N, A, LDA, H, LDA )
CALL ZGEEV( 'N', 'N', N, H, LDA, W1, DUM, 1, DUM, 1,
$ WORK, NNWORK, RWORK, IINFO )
IF( IINFO.NE.0 ) THEN
RESULT( 1 ) = ULPINV
WRITE( NOUNIT, FMT = 9993 )'ZGEEV2', IINFO, N, JTYPE,
$ IOLDSD
INFO = ABS( IINFO )
GO TO 220
END IF
*
* Do Test (5)
*
DO 150 J = 1, N
IF( W( J ).NE.W1( J ) )
$ RESULT( 5 ) = ULPINV
150 CONTINUE
*
* Compute eigenvalues and right eigenvectors, and test them
*
CALL ZLACPY( 'F', N, N, A, LDA, H, LDA )
CALL ZGEEV( 'N', 'V', N, H, LDA, W1, DUM, 1, LRE, LDLRE,
$ WORK, NNWORK, RWORK, IINFO )
IF( IINFO.NE.0 ) THEN
RESULT( 1 ) = ULPINV
WRITE( NOUNIT, FMT = 9993 )'ZGEEV3', IINFO, N, JTYPE,
$ IOLDSD
INFO = ABS( IINFO )
GO TO 220
END IF
*
* Do Test (5) again
*
DO 160 J = 1, N
IF( W( J ).NE.W1( J ) )
$ RESULT( 5 ) = ULPINV
160 CONTINUE
*
* Do Test (6)
*
DO 180 J = 1, N
DO 170 JJ = 1, N
IF( VR( J, JJ ).NE.LRE( J, JJ ) )
$ RESULT( 6 ) = ULPINV
170 CONTINUE
180 CONTINUE
*
* Compute eigenvalues and left eigenvectors, and test them
*
CALL ZLACPY( 'F', N, N, A, LDA, H, LDA )
CALL ZGEEV( 'V', 'N', N, H, LDA, W1, LRE, LDLRE, DUM, 1,
$ WORK, NNWORK, RWORK, IINFO )
IF( IINFO.NE.0 ) THEN
RESULT( 1 ) = ULPINV
WRITE( NOUNIT, FMT = 9993 )'ZGEEV4', IINFO, N, JTYPE,
$ IOLDSD
INFO = ABS( IINFO )
GO TO 220
END IF
*
* Do Test (5) again
*
DO 190 J = 1, N
IF( W( J ).NE.W1( J ) )
$ RESULT( 5 ) = ULPINV
190 CONTINUE
*
* Do Test (7)
*
DO 210 J = 1, N
DO 200 JJ = 1, N
IF( VL( J, JJ ).NE.LRE( J, JJ ) )
$ RESULT( 7 ) = ULPINV
200 CONTINUE
210 CONTINUE
*
* End of Loop -- Check for RESULT(j) > THRESH
*
220 CONTINUE
*
NTEST = 0
NFAIL = 0
DO 230 J = 1, 7
IF( RESULT( J ).GE.ZERO )
$ NTEST = NTEST + 1
IF( RESULT( J ).GE.THRESH )
$ NFAIL = NFAIL + 1
230 CONTINUE
*
IF( NFAIL.GT.0 )
$ NTESTF = NTESTF + 1
IF( NTESTF.EQ.1 ) THEN
WRITE( NOUNIT, FMT = 9999 )PATH
WRITE( NOUNIT, FMT = 9998 )
WRITE( NOUNIT, FMT = 9997 )
WRITE( NOUNIT, FMT = 9996 )
WRITE( NOUNIT, FMT = 9995 )THRESH
NTESTF = 2
END IF
*
DO 240 J = 1, 7
IF( RESULT( J ).GE.THRESH ) THEN
WRITE( NOUNIT, FMT = 9994 )N, IWK, IOLDSD, JTYPE,
$ J, RESULT( J )
END IF
240 CONTINUE
*
NERRS = NERRS + NFAIL
NTESTT = NTESTT + NTEST
*
250 CONTINUE
260 CONTINUE
270 CONTINUE
*
* Summary
*
CALL DLASUM( PATH, NOUNIT, NERRS, NTESTT )
*
9999 FORMAT( / 1X, A3, ' -- Complex Eigenvalue-Eigenvector ',
$ 'Decomposition Driver', /
$ ' Matrix types (see ZDRVEV for details): ' )
*
9998 FORMAT( / ' Special Matrices:', / ' 1=Zero matrix. ',
$ ' ', ' 5=Diagonal: geometr. spaced entries.',
$ / ' 2=Identity matrix. ', ' 6=Diagona',
$ 'l: clustered entries.', / ' 3=Transposed Jordan block. ',
$ ' ', ' 7=Diagonal: large, evenly spaced.', / ' ',
$ '4=Diagonal: evenly spaced entries. ', ' 8=Diagonal: s',
$ 'mall, evenly spaced.' )
9997 FORMAT( ' Dense, Non-Symmetric Matrices:', / ' 9=Well-cond., ev',
$ 'enly spaced eigenvals.', ' 14=Ill-cond., geomet. spaced e',
$ 'igenals.', / ' 10=Well-cond., geom. spaced eigenvals. ',
$ ' 15=Ill-conditioned, clustered e.vals.', / ' 11=Well-cond',
$ 'itioned, clustered e.vals. ', ' 16=Ill-cond., random comp',
$ 'lex ', A6, / ' 12=Well-cond., random complex ', A6, ' ',
$ ' 17=Ill-cond., large rand. complx ', A4, / ' 13=Ill-condi',
$ 'tioned, evenly spaced. ', ' 18=Ill-cond., small rand.',
$ ' complx ', A4 )
9996 FORMAT( ' 19=Matrix with random O(1) entries. ', ' 21=Matrix ',
$ 'with small random entries.', / ' 20=Matrix with large ran',
$ 'dom entries. ', / )
9995 FORMAT( ' Tests performed with test threshold =', F8.2,
$ / / ' 1 = | A VR - VR W | / ( n |A| ulp ) ',
$ / ' 2 = | conj-trans(A) VL - VL conj-trans(W) | /',
$ ' ( n |A| ulp ) ', / ' 3 = | |VR(i)| - 1 | / ulp ',
$ / ' 4 = | |VL(i)| - 1 | / ulp ',
$ / ' 5 = 0 if W same no matter if VR or VL computed,',
$ ' 1/ulp otherwise', /
$ ' 6 = 0 if VR same no matter if VL computed,',
$ ' 1/ulp otherwise', /
$ ' 7 = 0 if VL same no matter if VR computed,',
$ ' 1/ulp otherwise', / )
9994 FORMAT( ' N=', I5, ', IWK=', I2, ', seed=', 4( I4, ',' ),
$ ' type ', I2, ', test(', I2, ')=', G10.3 )
9993 FORMAT( ' ZDRVEV: ', A, ' returned INFO=', I6, '.', / 9X, 'N=',
$ I6, ', JTYPE=', I6, ', ISEED=(', 3( I5, ',' ), I5, ')' )
*
RETURN
*
* End of ZDRVEV
*
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -