zdrvgt.f
来自「famous linear algebra library (LAPACK) p」· F 代码 · 共 504 行 · 第 1/2 页
F
504 行
* the value returned by ZGTSVX.
*
IF( ZEROT ) THEN
IF( IFACT.EQ.1 )
$ GO TO 120
RCONDO = ZERO
RCONDI = ZERO
*
ELSE IF( IFACT.EQ.1 ) THEN
CALL ZCOPY( N+2*M, A, 1, AF, 1 )
*
* Compute the 1-norm and infinity-norm of A.
*
ANORMO = ZLANGT( '1', N, A, A( M+1 ), A( N+M+1 ) )
ANORMI = ZLANGT( 'I', N, A, A( M+1 ), A( N+M+1 ) )
*
* Factor the matrix A.
*
CALL ZGTTRF( N, AF, AF( M+1 ), AF( N+M+1 ),
$ AF( N+2*M+1 ), IWORK, INFO )
*
* Use ZGTTRS to solve for one column at a time of
* inv(A), computing the maximum column sum as we go.
*
AINVNM = ZERO
DO 40 I = 1, N
DO 30 J = 1, N
X( J ) = ZERO
30 CONTINUE
X( I ) = ONE
CALL ZGTTRS( 'No transpose', N, 1, AF, AF( M+1 ),
$ AF( N+M+1 ), AF( N+2*M+1 ), IWORK, X,
$ LDA, INFO )
AINVNM = MAX( AINVNM, DZASUM( N, X, 1 ) )
40 CONTINUE
*
* Compute the 1-norm condition number of A.
*
IF( ANORMO.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
RCONDO = ONE
ELSE
RCONDO = ( ONE / ANORMO ) / AINVNM
END IF
*
* Use ZGTTRS to solve for one column at a time of
* inv(A'), computing the maximum column sum as we go.
*
AINVNM = ZERO
DO 60 I = 1, N
DO 50 J = 1, N
X( J ) = ZERO
50 CONTINUE
X( I ) = ONE
CALL ZGTTRS( 'Conjugate transpose', N, 1, AF,
$ AF( M+1 ), AF( N+M+1 ), AF( N+2*M+1 ),
$ IWORK, X, LDA, INFO )
AINVNM = MAX( AINVNM, DZASUM( N, X, 1 ) )
60 CONTINUE
*
* Compute the infinity-norm condition number of A.
*
IF( ANORMI.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
RCONDI = ONE
ELSE
RCONDI = ( ONE / ANORMI ) / AINVNM
END IF
END IF
*
DO 110 ITRAN = 1, 3
TRANS = TRANSS( ITRAN )
IF( ITRAN.EQ.1 ) THEN
RCONDC = RCONDO
ELSE
RCONDC = RCONDI
END IF
*
* Generate NRHS random solution vectors.
*
IX = 1
DO 70 J = 1, NRHS
CALL ZLARNV( 2, ISEED, N, XACT( IX ) )
IX = IX + LDA
70 CONTINUE
*
* Set the right hand side.
*
CALL ZLAGTM( TRANS, N, NRHS, ONE, A, A( M+1 ),
$ A( N+M+1 ), XACT, LDA, ZERO, B, LDA )
*
IF( IFACT.EQ.2 .AND. ITRAN.EQ.1 ) THEN
*
* --- Test ZGTSV ---
*
* Solve the system using Gaussian elimination with
* partial pivoting.
*
CALL ZCOPY( N+2*M, A, 1, AF, 1 )
CALL ZLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
*
SRNAMT = 'ZGTSV '
CALL ZGTSV( N, NRHS, AF, AF( M+1 ), AF( N+M+1 ), X,
$ LDA, INFO )
*
* Check error code from ZGTSV .
*
IF( INFO.NE.IZERO )
$ CALL ALAERH( PATH, 'ZGTSV ', INFO, IZERO, ' ',
$ N, N, 1, 1, NRHS, IMAT, NFAIL,
$ NERRS, NOUT )
NT = 1
IF( IZERO.EQ.0 ) THEN
*
* Check residual of computed solution.
*
CALL ZLACPY( 'Full', N, NRHS, B, LDA, WORK,
$ LDA )
CALL ZGTT02( TRANS, N, NRHS, A, A( M+1 ),
$ A( N+M+1 ), X, LDA, WORK, LDA,
$ RWORK, RESULT( 2 ) )
*
* Check solution from generated exact solution.
*
CALL ZGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
$ RESULT( 3 ) )
NT = 3
END IF
*
* Print information about the tests that did not pass
* the threshold.
*
DO 80 K = 2, NT
IF( RESULT( K ).GE.THRESH ) THEN
IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
$ CALL ALADHD( NOUT, PATH )
WRITE( NOUT, FMT = 9999 )'ZGTSV ', N, IMAT,
$ K, RESULT( K )
NFAIL = NFAIL + 1
END IF
80 CONTINUE
NRUN = NRUN + NT - 1
END IF
*
* --- Test ZGTSVX ---
*
IF( IFACT.GT.1 ) THEN
*
* Initialize AF to zero.
*
DO 90 I = 1, 3*N - 2
AF( I ) = ZERO
90 CONTINUE
END IF
CALL ZLASET( 'Full', N, NRHS, DCMPLX( ZERO ),
$ DCMPLX( ZERO ), X, LDA )
*
* Solve the system and compute the condition number and
* error bounds using ZGTSVX.
*
SRNAMT = 'ZGTSVX'
CALL ZGTSVX( FACT, TRANS, N, NRHS, A, A( M+1 ),
$ A( N+M+1 ), AF, AF( M+1 ), AF( N+M+1 ),
$ AF( N+2*M+1 ), IWORK, B, LDA, X, LDA,
$ RCOND, RWORK, RWORK( NRHS+1 ), WORK,
$ RWORK( 2*NRHS+1 ), INFO )
*
* Check the error code from ZGTSVX.
*
IF( INFO.NE.IZERO )
$ CALL ALAERH( PATH, 'ZGTSVX', INFO, IZERO,
$ FACT // TRANS, N, N, 1, 1, NRHS, IMAT,
$ NFAIL, NERRS, NOUT )
*
IF( IFACT.GE.2 ) THEN
*
* Reconstruct matrix from factors and compute
* residual.
*
CALL ZGTT01( N, A, A( M+1 ), A( N+M+1 ), AF,
$ AF( M+1 ), AF( N+M+1 ), AF( N+2*M+1 ),
$ IWORK, WORK, LDA, RWORK, RESULT( 1 ) )
K1 = 1
ELSE
K1 = 2
END IF
*
IF( INFO.EQ.0 ) THEN
TRFCON = .FALSE.
*
* Check residual of computed solution.
*
CALL ZLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
CALL ZGTT02( TRANS, N, NRHS, A, A( M+1 ),
$ A( N+M+1 ), X, LDA, WORK, LDA, RWORK,
$ RESULT( 2 ) )
*
* Check solution from generated exact solution.
*
CALL ZGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
$ RESULT( 3 ) )
*
* Check the error bounds from iterative refinement.
*
CALL ZGTT05( TRANS, N, NRHS, A, A( M+1 ),
$ A( N+M+1 ), B, LDA, X, LDA, XACT, LDA,
$ RWORK, RWORK( NRHS+1 ), RESULT( 4 ) )
NT = 5
END IF
*
* Print information about the tests that did not pass
* the threshold.
*
DO 100 K = K1, NT
IF( RESULT( K ).GE.THRESH ) THEN
IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
$ CALL ALADHD( NOUT, PATH )
WRITE( NOUT, FMT = 9998 )'ZGTSVX', FACT, TRANS,
$ N, IMAT, K, RESULT( K )
NFAIL = NFAIL + 1
END IF
100 CONTINUE
*
* Check the reciprocal of the condition number.
*
RESULT( 6 ) = DGET06( RCOND, RCONDC )
IF( RESULT( 6 ).GE.THRESH ) THEN
IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
$ CALL ALADHD( NOUT, PATH )
WRITE( NOUT, FMT = 9998 )'ZGTSVX', FACT, TRANS, N,
$ IMAT, K, RESULT( K )
NFAIL = NFAIL + 1
END IF
NRUN = NRUN + NT - K1 + 2
*
110 CONTINUE
120 CONTINUE
130 CONTINUE
140 CONTINUE
*
* Print a summary of the results.
*
CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
*
9999 FORMAT( 1X, A6, ', N =', I5, ', type ', I2, ', test ', I2,
$ ', ratio = ', G12.5 )
9998 FORMAT( 1X, A6, ', FACT=''', A1, ''', TRANS=''', A1, ''', N =',
$ I5, ', type ', I2, ', test ', I2, ', ratio = ', G12.5 )
RETURN
*
* End of ZDRVGT
*
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?