schksy.f
来自「famous linear algebra library (LAPACK) p」· F 代码 · 共 490 行 · 第 1/2 页
F
490 行
*
* Set the first IZERO rows and columns to zero.
*
DO 70 J = 1, N
I2 = MIN( J, IZERO )
DO 60 I = 1, I2
A( IOFF+I ) = ZERO
60 CONTINUE
IOFF = IOFF + LDA
70 CONTINUE
ELSE
*
* Set the last IZERO rows and columns to zero.
*
DO 90 J = 1, N
I1 = MAX( J, IZERO )
DO 80 I = I1, N
A( IOFF+I ) = ZERO
80 CONTINUE
IOFF = IOFF + LDA
90 CONTINUE
END IF
END IF
ELSE
IZERO = 0
END IF
*
* Do for each value of NB in NBVAL
*
DO 150 INB = 1, NNB
NB = NBVAL( INB )
CALL XLAENV( 1, NB )
*
* Compute the L*D*L' or U*D*U' factorization of the
* matrix.
*
CALL SLACPY( UPLO, N, N, A, LDA, AFAC, LDA )
LWORK = MAX( 2, NB )*LDA
SRNAMT = 'SSYTRF'
CALL SSYTRF( UPLO, N, AFAC, LDA, IWORK, AINV, LWORK,
$ INFO )
*
* Adjust the expected value of INFO to account for
* pivoting.
*
K = IZERO
IF( K.GT.0 ) THEN
100 CONTINUE
IF( IWORK( K ).LT.0 ) THEN
IF( IWORK( K ).NE.-K ) THEN
K = -IWORK( K )
GO TO 100
END IF
ELSE IF( IWORK( K ).NE.K ) THEN
K = IWORK( K )
GO TO 100
END IF
END IF
*
* Check error code from SSYTRF.
*
IF( INFO.NE.K )
$ CALL ALAERH( PATH, 'SSYTRF', INFO, K, UPLO, N, N,
$ -1, -1, NB, IMAT, NFAIL, NERRS, NOUT )
IF( INFO.NE.0 ) THEN
TRFCON = .TRUE.
ELSE
TRFCON = .FALSE.
END IF
*
*+ TEST 1
* Reconstruct matrix from factors and compute residual.
*
CALL SSYT01( UPLO, N, A, LDA, AFAC, LDA, IWORK, AINV,
$ LDA, RWORK, RESULT( 1 ) )
NT = 1
*
*+ TEST 2
* Form the inverse and compute the residual.
*
IF( INB.EQ.1 .AND. .NOT.TRFCON ) THEN
CALL SLACPY( UPLO, N, N, AFAC, LDA, AINV, LDA )
SRNAMT = 'SSYTRI'
CALL SSYTRI( UPLO, N, AINV, LDA, IWORK, WORK,
$ INFO )
*
* Check error code from SSYTRI.
*
IF( INFO.NE.0 )
$ CALL ALAERH( PATH, 'SSYTRI', INFO, -1, UPLO, N,
$ N, -1, -1, -1, IMAT, NFAIL, NERRS,
$ NOUT )
*
CALL SPOT03( UPLO, N, A, LDA, AINV, LDA, WORK, LDA,
$ RWORK, RCONDC, RESULT( 2 ) )
NT = 2
END IF
*
* Print information about the tests that did not pass
* the threshold.
*
DO 110 K = 1, NT
IF( RESULT( K ).GE.THRESH ) THEN
IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
$ CALL ALAHD( NOUT, PATH )
WRITE( NOUT, FMT = 9999 )UPLO, N, NB, IMAT, K,
$ RESULT( K )
NFAIL = NFAIL + 1
END IF
110 CONTINUE
NRUN = NRUN + NT
*
* Skip the other tests if this is not the first block
* size.
*
IF( INB.GT.1 )
$ GO TO 150
*
* Do only the condition estimate if INFO is not 0.
*
IF( TRFCON ) THEN
RCONDC = ZERO
GO TO 140
END IF
*
DO 130 IRHS = 1, NNS
NRHS = NSVAL( IRHS )
*
*+ TEST 3
* Solve and compute residual for A * X = B.
*
SRNAMT = 'SLARHS'
CALL SLARHS( PATH, XTYPE, UPLO, ' ', N, N, KL, KU,
$ NRHS, A, LDA, XACT, LDA, B, LDA,
$ ISEED, INFO )
CALL SLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
*
SRNAMT = 'SSYTRS'
CALL SSYTRS( UPLO, N, NRHS, AFAC, LDA, IWORK, X,
$ LDA, INFO )
*
* Check error code from SSYTRS.
*
IF( INFO.NE.0 )
$ CALL ALAERH( PATH, 'SSYTRS', INFO, 0, UPLO, N,
$ N, -1, -1, NRHS, IMAT, NFAIL,
$ NERRS, NOUT )
*
CALL SLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
CALL SPOT02( UPLO, N, NRHS, A, LDA, X, LDA, WORK,
$ LDA, RWORK, RESULT( 3 ) )
*
*+ TEST 4
* Check solution from generated exact solution.
*
CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
$ RESULT( 4 ) )
*
*+ TESTS 5, 6, and 7
* Use iterative refinement to improve the solution.
*
SRNAMT = 'SSYRFS'
CALL SSYRFS( UPLO, N, NRHS, A, LDA, AFAC, LDA,
$ IWORK, B, LDA, X, LDA, RWORK,
$ RWORK( NRHS+1 ), WORK, IWORK( N+1 ),
$ INFO )
*
* Check error code from SSYRFS.
*
IF( INFO.NE.0 )
$ CALL ALAERH( PATH, 'SSYRFS', INFO, 0, UPLO, N,
$ N, -1, -1, NRHS, IMAT, NFAIL,
$ NERRS, NOUT )
*
CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
$ RESULT( 5 ) )
CALL SPOT05( UPLO, N, NRHS, A, LDA, B, LDA, X, LDA,
$ XACT, LDA, RWORK, RWORK( NRHS+1 ),
$ RESULT( 6 ) )
*
* Print information about the tests that did not pass
* the threshold.
*
DO 120 K = 3, 7
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
120 CONTINUE
NRUN = NRUN + 5
130 CONTINUE
*
*+ TEST 8
* Get an estimate of RCOND = 1/CNDNUM.
*
140 CONTINUE
ANORM = SLANSY( '1', UPLO, N, A, LDA, RWORK )
SRNAMT = 'SSYCON'
CALL SSYCON( UPLO, N, AFAC, LDA, IWORK, ANORM, RCOND,
$ WORK, IWORK( N+1 ), INFO )
*
* Check error code from SSYCON.
*
IF( INFO.NE.0 )
$ CALL ALAERH( PATH, 'SSYCON', INFO, 0, UPLO, N, N,
$ -1, -1, -1, IMAT, NFAIL, NERRS, NOUT )
*
RESULT( 8 ) = SGET06( RCOND, RCONDC )
*
* Print information about the tests that did not pass
* the threshold.
*
IF( RESULT( 8 ).GE.THRESH ) THEN
IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
$ CALL ALAHD( NOUT, PATH )
WRITE( NOUT, FMT = 9997 )UPLO, N, IMAT, 8,
$ RESULT( 8 )
NFAIL = NFAIL + 1
END IF
NRUN = NRUN + 1
150 CONTINUE
*
160 CONTINUE
170 CONTINUE
180 CONTINUE
*
* Print a summary of the results.
*
CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS )
*
9999 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ', NB =', I4, ', type ',
$ I2, ', test ', I2, ', ratio =', G12.5 )
9998 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ', NRHS=', I3, ', type ',
$ I2, ', test(', I2, ') =', G12.5 )
9997 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ',', 10X, ' type ', I2,
$ ', test(', I2, ') =', G12.5 )
RETURN
*
* End of SCHKSY
*
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?