zdrvsx.f
来自「famous linear algebra library (LAPACK) p」· F 代码 · 共 817 行 · 第 1/3 页
F
817 行
A( JCOL, JCOL ) = ANORM
IF( JCOL.GT.1 )
$ A( JCOL, JCOL-1 ) = CONE
80 CONTINUE
*
ELSE IF( ITYPE.EQ.4 ) THEN
*
* Diagonal Matrix, [Eigen]values Specified
*
CALL ZLATMS( N, N, 'S', ISEED, 'H', RWORK, IMODE, COND,
$ ANORM, 0, 0, 'N', A, LDA, WORK( N+1 ),
$ IINFO )
*
ELSE IF( ITYPE.EQ.5 ) THEN
*
* Symmetric, eigenvalues specified
*
CALL ZLATMS( N, N, 'S', ISEED, 'H', RWORK, IMODE, COND,
$ ANORM, N, N, 'N', A, LDA, WORK( N+1 ),
$ IINFO )
*
ELSE IF( ITYPE.EQ.6 ) THEN
*
* General, eigenvalues specified
*
IF( KCONDS( JTYPE ).EQ.1 ) THEN
CONDS = ONE
ELSE IF( KCONDS( JTYPE ).EQ.2 ) THEN
CONDS = RTULPI
ELSE
CONDS = ZERO
END IF
*
CALL ZLATME( N, 'D', ISEED, WORK, IMODE, COND, CONE, ' ',
$ 'T', 'T', 'T', RWORK, 4, CONDS, N, N, ANORM,
$ A, LDA, WORK( 2*N+1 ), IINFO )
*
ELSE IF( ITYPE.EQ.7 ) THEN
*
* Diagonal, 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, 0, 0,
$ ZERO, ANORM, 'NO', A, LDA, IDUMMA, IINFO )
*
ELSE IF( ITYPE.EQ.8 ) THEN
*
* Symmetric, random eigenvalues
*
CALL ZLATMR( N, N, 'D', ISEED, 'H', WORK, 6, ONE, CONE,
$ 'T', 'N', WORK( N+1 ), 1, ONE,
$ WORK( 2*N+1 ), 1, ONE, 'N', IDUMMA, N, N,
$ ZERO, ANORM, 'NO', A, LDA, IDUMMA, IINFO )
*
ELSE IF( ITYPE.EQ.9 ) THEN
*
* General, 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, N,
$ ZERO, ANORM, 'NO', A, LDA, IDUMMA, IINFO )
IF( N.GE.4 ) THEN
CALL ZLASET( 'Full', 2, N, CZERO, CZERO, A, LDA )
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, IDUMMA, IINFO )
*
ELSE
*
IINFO = 1
END IF
*
IF( IINFO.NE.0 ) THEN
WRITE( NOUNIT, FMT = 9991 )'Generator', IINFO, N, JTYPE,
$ IOLDSD
INFO = ABS( IINFO )
RETURN
END IF
*
90 CONTINUE
*
* Test for minimal and generous workspace
*
DO 120 IWK = 1, 2
IF( IWK.EQ.1 ) THEN
NNWORK = 2*N
ELSE
NNWORK = MAX( 2*N, N*( N+1 ) / 2 )
END IF
NNWORK = MAX( NNWORK, 1 )
*
CALL ZGET24( .FALSE., JTYPE, THRESH, IOLDSD, NOUNIT, N,
$ A, LDA, H, HT, W, WT, WTMP, VS, LDVS, VS1,
$ RCDEIN, RCDVIN, NSLCT, ISLCT, 0, RESULT,
$ WORK, NNWORK, RWORK, BWORK, INFO )
*
* Check for RESULT(j) > THRESH
*
NTEST = 0
NFAIL = 0
DO 100 J = 1, 15
IF( RESULT( J ).GE.ZERO )
$ NTEST = NTEST + 1
IF( RESULT( J ).GE.THRESH )
$ NFAIL = NFAIL + 1
100 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
WRITE( NOUNIT, FMT = 9994 )
NTESTF = 2
END IF
*
DO 110 J = 1, 15
IF( RESULT( J ).GE.THRESH ) THEN
WRITE( NOUNIT, FMT = 9993 )N, IWK, IOLDSD, JTYPE,
$ J, RESULT( J )
END IF
110 CONTINUE
*
NERRS = NERRS + NFAIL
NTESTT = NTESTT + NTEST
*
120 CONTINUE
130 CONTINUE
140 CONTINUE
*
150 CONTINUE
*
* Read in data from file to check accuracy of condition estimation
* Read input data until N=0
*
JTYPE = 0
160 CONTINUE
READ( NIUNIT, FMT = *, END = 200 )N, NSLCT, ISRT
IF( N.EQ.0 )
$ GO TO 200
JTYPE = JTYPE + 1
ISEED( 1 ) = JTYPE
READ( NIUNIT, FMT = * )( ISLCT( I ), I = 1, NSLCT )
DO 170 I = 1, N
READ( NIUNIT, FMT = * )( A( I, J ), J = 1, N )
170 CONTINUE
READ( NIUNIT, FMT = * )RCDEIN, RCDVIN
*
CALL ZGET24( .TRUE., 22, THRESH, ISEED, NOUNIT, N, A, LDA, H, HT,
$ W, WT, WTMP, VS, LDVS, VS1, RCDEIN, RCDVIN, NSLCT,
$ ISLCT, ISRT, RESULT, WORK, LWORK, RWORK, BWORK,
$ INFO )
*
* Check for RESULT(j) > THRESH
*
NTEST = 0
NFAIL = 0
DO 180 J = 1, 17
IF( RESULT( J ).GE.ZERO )
$ NTEST = NTEST + 1
IF( RESULT( J ).GE.THRESH )
$ NFAIL = NFAIL + 1
180 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
WRITE( NOUNIT, FMT = 9994 )
NTESTF = 2
END IF
DO 190 J = 1, 17
IF( RESULT( J ).GE.THRESH ) THEN
WRITE( NOUNIT, FMT = 9992 )N, JTYPE, J, RESULT( J )
END IF
190 CONTINUE
*
NERRS = NERRS + NFAIL
NTESTT = NTESTT + NTEST
GO TO 160
200 CONTINUE
*
* Summary
*
CALL DLASUM( PATH, NOUNIT, NERRS, NTESTT )
*
9999 FORMAT( / 1X, A3, ' -- Complex Schur Form Decomposition Expert ',
$ 'Driver', / ' Matrix types (see ZDRVSX 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 ', ' ',
$ ' 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,
$ / ' ( A denotes A on input and T denotes A on output)',
$ / / ' 1 = 0 if T in Schur form (no sort), ',
$ ' 1/ulp otherwise', /
$ ' 2 = | A - VS T transpose(VS) | / ( n |A| ulp ) (no sort)',
$ / ' 3 = | I - VS transpose(VS) | / ( n ulp ) (no sort) ',
$ / ' 4 = 0 if W are eigenvalues of T (no sort),',
$ ' 1/ulp otherwise', /
$ ' 5 = 0 if T same no matter if VS computed (no sort),',
$ ' 1/ulp otherwise', /
$ ' 6 = 0 if W same no matter if VS computed (no sort)',
$ ', 1/ulp otherwise' )
9994 FORMAT( ' 7 = 0 if T in Schur form (sort), ', ' 1/ulp otherwise',
$ / ' 8 = | A - VS T transpose(VS) | / ( n |A| ulp ) (sort)',
$ / ' 9 = | I - VS transpose(VS) | / ( n ulp ) (sort) ',
$ / ' 10 = 0 if W are eigenvalues of T (sort),',
$ ' 1/ulp otherwise', /
$ ' 11 = 0 if T same no matter what else computed (sort),',
$ ' 1/ulp otherwise', /
$ ' 12 = 0 if W same no matter what else computed ',
$ '(sort), 1/ulp otherwise', /
$ ' 13 = 0 if sorting succesful, 1/ulp otherwise',
$ / ' 14 = 0 if RCONDE same no matter what else computed,',
$ ' 1/ulp otherwise', /
$ ' 15 = 0 if RCONDv same no matter what else computed,',
$ ' 1/ulp otherwise', /
$ ' 16 = | RCONDE - RCONDE(precomputed) | / cond(RCONDE),',
$ / ' 17 = | RCONDV - RCONDV(precomputed) | / cond(RCONDV),' )
9993 FORMAT( ' N=', I5, ', IWK=', I2, ', seed=', 4( I4, ',' ),
$ ' type ', I2, ', test(', I2, ')=', G10.3 )
9992 FORMAT( ' N=', I5, ', input example =', I3, ', test(', I2, ')=',
$ G10.3 )
9991 FORMAT( ' ZDRVSX: ', A, ' returned INFO=', I6, '.', / 9X, 'N=',
$ I6, ', JTYPE=', I6, ', ISEED=(', 3( I5, ',' ), I5, ')' )
*
RETURN
*
* End of ZDRVSX
*
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?