sdrvev.f
来自「famous linear algebra library (LAPACK) p」· F 代码 · 共 856 行 · 第 1/3 页
F
856 行
ELSE IF( ITYPE.EQ.10 ) THEN
*
* Triangular, random eigenvalues
*
CALL SLATMR( N, N, 'S', ISEED, 'N', WORK, 6, ONE, ONE,
$ '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 = 4*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 SLACPY( 'F', N, N, A, LDA, H, LDA )
CALL SGEEV( 'V', 'V', N, H, LDA, WR, WI, VL, LDVL, VR,
$ LDVR, WORK, NNWORK, IINFO )
IF( IINFO.NE.0 ) THEN
RESULT( 1 ) = ULPINV
WRITE( NOUNIT, FMT = 9993 )'SGEEV1', IINFO, N, JTYPE,
$ IOLDSD
INFO = ABS( IINFO )
GO TO 220
END IF
*
* Do Test (1)
*
CALL SGET22( 'N', 'N', 'N', N, A, LDA, VR, LDVR, WR, WI,
$ WORK, RES )
RESULT( 1 ) = RES( 1 )
*
* Do Test (2)
*
CALL SGET22( 'T', 'N', 'T', N, A, LDA, VL, LDVL, WR, WI,
$ WORK, RES )
RESULT( 2 ) = RES( 1 )
*
* Do Test (3)
*
DO 120 J = 1, N
TNRM = ONE
IF( WI( J ).EQ.ZERO ) THEN
TNRM = SNRM2( N, VR( 1, J ), 1 )
ELSE IF( WI( J ).GT.ZERO ) THEN
TNRM = SLAPY2( SNRM2( N, VR( 1, J ), 1 ),
$ SNRM2( N, VR( 1, J+1 ), 1 ) )
END IF
RESULT( 3 ) = MAX( RESULT( 3 ),
$ MIN( ULPINV, ABS( TNRM-ONE ) / ULP ) )
IF( WI( J ).GT.ZERO ) THEN
VMX = ZERO
VRMX = ZERO
DO 110 JJ = 1, N
VTST = SLAPY2( VR( JJ, J ), VR( JJ, J+1 ) )
IF( VTST.GT.VMX )
$ VMX = VTST
IF( VR( JJ, J+1 ).EQ.ZERO .AND.
$ ABS( VR( JJ, J ) ).GT.VRMX )
$ VRMX = ABS( VR( JJ, J ) )
110 CONTINUE
IF( VRMX / VMX.LT.ONE-TWO*ULP )
$ RESULT( 3 ) = ULPINV
END IF
120 CONTINUE
*
* Do Test (4)
*
DO 140 J = 1, N
TNRM = ONE
IF( WI( J ).EQ.ZERO ) THEN
TNRM = SNRM2( N, VL( 1, J ), 1 )
ELSE IF( WI( J ).GT.ZERO ) THEN
TNRM = SLAPY2( SNRM2( N, VL( 1, J ), 1 ),
$ SNRM2( N, VL( 1, J+1 ), 1 ) )
END IF
RESULT( 4 ) = MAX( RESULT( 4 ),
$ MIN( ULPINV, ABS( TNRM-ONE ) / ULP ) )
IF( WI( J ).GT.ZERO ) THEN
VMX = ZERO
VRMX = ZERO
DO 130 JJ = 1, N
VTST = SLAPY2( VL( JJ, J ), VL( JJ, J+1 ) )
IF( VTST.GT.VMX )
$ VMX = VTST
IF( VL( JJ, J+1 ).EQ.ZERO .AND.
$ ABS( VL( JJ, J ) ).GT.VRMX )
$ VRMX = ABS( VL( JJ, J ) )
130 CONTINUE
IF( VRMX / VMX.LT.ONE-TWO*ULP )
$ RESULT( 4 ) = ULPINV
END IF
140 CONTINUE
*
* Compute eigenvalues only, and test them
*
CALL SLACPY( 'F', N, N, A, LDA, H, LDA )
CALL SGEEV( 'N', 'N', N, H, LDA, WR1, WI1, DUM, 1, DUM,
$ 1, WORK, NNWORK, IINFO )
IF( IINFO.NE.0 ) THEN
RESULT( 1 ) = ULPINV
WRITE( NOUNIT, FMT = 9993 )'SGEEV2', IINFO, N, JTYPE,
$ IOLDSD
INFO = ABS( IINFO )
GO TO 220
END IF
*
* Do Test (5)
*
DO 150 J = 1, N
IF( WR( J ).NE.WR1( J ) .OR. WI( J ).NE.WI1( J ) )
$ RESULT( 5 ) = ULPINV
150 CONTINUE
*
* Compute eigenvalues and right eigenvectors, and test them
*
CALL SLACPY( 'F', N, N, A, LDA, H, LDA )
CALL SGEEV( 'N', 'V', N, H, LDA, WR1, WI1, DUM, 1, LRE,
$ LDLRE, WORK, NNWORK, IINFO )
IF( IINFO.NE.0 ) THEN
RESULT( 1 ) = ULPINV
WRITE( NOUNIT, FMT = 9993 )'SGEEV3', IINFO, N, JTYPE,
$ IOLDSD
INFO = ABS( IINFO )
GO TO 220
END IF
*
* Do Test (5) again
*
DO 160 J = 1, N
IF( WR( J ).NE.WR1( J ) .OR. WI( J ).NE.WI1( 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 SLACPY( 'F', N, N, A, LDA, H, LDA )
CALL SGEEV( 'V', 'N', N, H, LDA, WR1, WI1, LRE, LDLRE,
$ DUM, 1, WORK, NNWORK, IINFO )
IF( IINFO.NE.0 ) THEN
RESULT( 1 ) = ULPINV
WRITE( NOUNIT, FMT = 9993 )'SGEEV4', IINFO, N, JTYPE,
$ IOLDSD
INFO = ABS( IINFO )
GO TO 220
END IF
*
* Do Test (5) again
*
DO 190 J = 1, N
IF( WR( J ).NE.WR1( J ) .OR. WI( J ).NE.WI1( 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 SLASUM( PATH, NOUNIT, NERRS, NTESTT )
*
9999 FORMAT( / 1X, A3, ' -- Real Eigenvalue-Eigenvector Decomposition',
$ ' Driver', / ' Matrix types (see SDRVEV 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 ', / ' 12=Well-cond., random complex ', 6X, ' ',
$ ' 17=Ill-cond., large rand. complx ', / ' 13=Ill-condi',
$ 'tioned, evenly spaced. ', ' 18=Ill-cond., small rand.',
$ ' complx ' )
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 = | transpose(A) VL - VL 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( ' SDRVEV: ', A, ' returned INFO=', I6, '.', / 9X, 'N=',
$ I6, ', JTYPE=', I6, ', ISEED=(', 3( I5, ',' ), I5, ')' )
*
RETURN
*
* End of SDRVEV
*
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?