zchkpt.f
来自「famous linear algebra library (LAPACK) p」· F 代码 · 共 461 行 · 第 1/2 页
F
461 行
IF( IZERO.EQ.1 ) THEN
D( 1 ) = Z( 2 )
IF( N.GT.1 )
$ E( 1 ) = Z( 3 )
ELSE IF( IZERO.EQ.N ) THEN
E( N-1 ) = Z( 1 )
D( N ) = Z( 2 )
ELSE
E( IZERO-1 ) = Z( 1 )
D( IZERO ) = Z( 2 )
E( IZERO ) = Z( 3 )
END IF
END IF
*
* For types 8-10, set one row and column of the matrix to
* zero.
*
IZERO = 0
IF( IMAT.EQ.8 ) THEN
IZERO = 1
Z( 2 ) = D( 1 )
D( 1 ) = ZERO
IF( N.GT.1 ) THEN
Z( 3 ) = E( 1 )
E( 1 ) = ZERO
END IF
ELSE IF( IMAT.EQ.9 ) THEN
IZERO = N
IF( N.GT.1 ) THEN
Z( 1 ) = E( N-1 )
E( N-1 ) = ZERO
END IF
Z( 2 ) = D( N )
D( N ) = ZERO
ELSE IF( IMAT.EQ.10 ) THEN
IZERO = ( N+1 ) / 2
IF( IZERO.GT.1 ) THEN
Z( 1 ) = E( IZERO-1 )
Z( 3 ) = E( IZERO )
E( IZERO-1 ) = ZERO
E( IZERO ) = ZERO
END IF
Z( 2 ) = D( IZERO )
D( IZERO ) = ZERO
END IF
END IF
*
CALL DCOPY( N, D, 1, D( N+1 ), 1 )
IF( N.GT.1 )
$ CALL ZCOPY( N-1, E, 1, E( N+1 ), 1 )
*
*+ TEST 1
* Factor A as L*D*L' and compute the ratio
* norm(L*D*L' - A) / (n * norm(A) * EPS )
*
CALL ZPTTRF( N, D( N+1 ), E( N+1 ), INFO )
*
* Check error code from ZPTTRF.
*
IF( INFO.NE.IZERO ) THEN
CALL ALAERH( PATH, 'ZPTTRF', INFO, IZERO, ' ', N, N, -1,
$ -1, -1, IMAT, NFAIL, NERRS, NOUT )
GO TO 110
END IF
*
IF( INFO.GT.0 ) THEN
RCONDC = ZERO
GO TO 100
END IF
*
CALL ZPTT01( N, D, E, D( N+1 ), E( N+1 ), WORK,
$ RESULT( 1 ) )
*
* Print the test ratio if greater than or equal to THRESH.
*
IF( RESULT( 1 ).GE.THRESH ) THEN
IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
$ CALL ALAHD( NOUT, PATH )
WRITE( NOUT, FMT = 9999 )N, IMAT, 1, RESULT( 1 )
NFAIL = NFAIL + 1
END IF
NRUN = NRUN + 1
*
* Compute RCONDC = 1 / (norm(A) * norm(inv(A))
*
* Compute norm(A).
*
ANORM = ZLANHT( '1', N, D, E )
*
* Use ZPTTRS to solve for one column at a time of inv(A),
* computing the maximum column sum as we go.
*
AINVNM = ZERO
DO 50 I = 1, N
DO 40 J = 1, N
X( J ) = ZERO
40 CONTINUE
X( I ) = ONE
CALL ZPTTRS( 'Lower', N, 1, D( N+1 ), E( N+1 ), X, LDA,
$ INFO )
AINVNM = MAX( AINVNM, DZASUM( N, X, 1 ) )
50 CONTINUE
RCONDC = ONE / MAX( ONE, ANORM*AINVNM )
*
DO 90 IRHS = 1, NNS
NRHS = NSVAL( IRHS )
*
* Generate NRHS random solution vectors.
*
IX = 1
DO 60 J = 1, NRHS
CALL ZLARNV( 2, ISEED, N, XACT( IX ) )
IX = IX + LDA
60 CONTINUE
*
DO 80 IUPLO = 1, 2
*
* Do first for UPLO = 'U', then for UPLO = 'L'.
*
UPLO = UPLOS( IUPLO )
*
* Set the right hand side.
*
CALL ZLAPTM( UPLO, N, NRHS, ONE, D, E, XACT, LDA,
$ ZERO, B, LDA )
*
*+ TEST 2
* Solve A*x = b and compute the residual.
*
CALL ZLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
CALL ZPTTRS( UPLO, N, NRHS, D( N+1 ), E( N+1 ), X,
$ LDA, INFO )
*
* Check error code from ZPTTRS.
*
IF( INFO.NE.0 )
$ CALL ALAERH( PATH, 'ZPTTRS', INFO, 0, UPLO, N, N,
$ -1, -1, NRHS, IMAT, NFAIL, NERRS,
$ NOUT )
*
CALL ZLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
CALL ZPTT02( UPLO, N, NRHS, D, E, X, LDA, WORK, LDA,
$ RESULT( 2 ) )
*
*+ TEST 3
* Check solution from generated exact solution.
*
CALL ZGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
$ RESULT( 3 ) )
*
*+ TESTS 4, 5, and 6
* Use iterative refinement to improve the solution.
*
SRNAMT = 'ZPTRFS'
CALL ZPTRFS( UPLO, N, NRHS, D, E, D( N+1 ), E( N+1 ),
$ B, LDA, X, LDA, RWORK, RWORK( NRHS+1 ),
$ WORK, RWORK( 2*NRHS+1 ), INFO )
*
* Check error code from ZPTRFS.
*
IF( INFO.NE.0 )
$ CALL ALAERH( PATH, 'ZPTRFS', INFO, 0, UPLO, N, N,
$ -1, -1, NRHS, IMAT, NFAIL, NERRS,
$ NOUT )
*
CALL ZGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
$ RESULT( 4 ) )
CALL ZPTT05( N, NRHS, D, E, B, LDA, X, LDA, XACT, LDA,
$ RWORK, RWORK( NRHS+1 ), RESULT( 5 ) )
*
* Print information about the tests that did not pass the
* threshold.
*
DO 70 K = 2, 6
IF( RESULT( K ).GE.THRESH ) THEN
IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
$ CALL ALAHD( NOUT, PATH )
WRITE( NOUT, FMT = 9998 )UPLO, N, NRHS, IMAT,
$ K, RESULT( K )
NFAIL = NFAIL + 1
END IF
70 CONTINUE
NRUN = NRUN + 5
*
80 CONTINUE
90 CONTINUE
*
*+ TEST 7
* Estimate the reciprocal of the condition number of the
* matrix.
*
100 CONTINUE
SRNAMT = 'ZPTCON'
CALL ZPTCON( N, D( N+1 ), E( N+1 ), ANORM, RCOND, RWORK,
$ INFO )
*
* Check error code from ZPTCON.
*
IF( INFO.NE.0 )
$ CALL ALAERH( PATH, 'ZPTCON', INFO, 0, ' ', N, N, -1, -1,
$ -1, IMAT, NFAIL, NERRS, NOUT )
*
RESULT( 7 ) = DGET06( RCOND, RCONDC )
*
* Print the test ratio if greater than or equal to THRESH.
*
IF( RESULT( 7 ).GE.THRESH ) THEN
IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
$ CALL ALAHD( NOUT, PATH )
WRITE( NOUT, FMT = 9999 )N, IMAT, 7, RESULT( 7 )
NFAIL = NFAIL + 1
END IF
NRUN = NRUN + 1
110 CONTINUE
120 CONTINUE
*
* Print a summary of the results.
*
CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS )
*
9999 FORMAT( ' N =', I5, ', type ', I2, ', test ', I2, ', ratio = ',
$ G12.5 )
9998 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ', NRHS =', I3,
$ ', type ', I2, ', test ', I2, ', ratio = ', G12.5 )
RETURN
*
* End of ZCHKPT
*
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?