diff options
author | jason <jason@8a072113-8704-0410-8d35-dd094bca7971> | 2008-10-28 01:38:50 +0000 |
---|---|---|
committer | jason <jason@8a072113-8704-0410-8d35-dd094bca7971> | 2008-10-28 01:38:50 +0000 |
commit | baba851215b44ac3b60b9248eb02bcce7eb76247 (patch) | |
tree | 8c0f5c006875532a30d4409f5e94b0f310ff00a7 /TESTING/LIN/schkgt.f | |
download | lapack-baba851215b44ac3b60b9248eb02bcce7eb76247.tar.gz lapack-baba851215b44ac3b60b9248eb02bcce7eb76247.tar.bz2 lapack-baba851215b44ac3b60b9248eb02bcce7eb76247.zip |
Move LAPACK trunk into position.
Diffstat (limited to 'TESTING/LIN/schkgt.f')
-rw-r--r-- | TESTING/LIN/schkgt.f | 465 |
1 files changed, 465 insertions, 0 deletions
diff --git a/TESTING/LIN/schkgt.f b/TESTING/LIN/schkgt.f new file mode 100644 index 00000000..228f9286 --- /dev/null +++ b/TESTING/LIN/schkgt.f @@ -0,0 +1,465 @@ + SUBROUTINE SCHKGT( DOTYPE, NN, NVAL, NNS, NSVAL, THRESH, TSTERR, + $ A, AF, B, X, XACT, WORK, RWORK, IWORK, NOUT ) +* +* -- LAPACK test routine (version 3.1) -- +* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. +* November 2006 +* +* .. Scalar Arguments .. + LOGICAL TSTERR + INTEGER NN, NNS, NOUT + REAL THRESH +* .. +* .. Array Arguments .. + LOGICAL DOTYPE( * ) + INTEGER IWORK( * ), NSVAL( * ), NVAL( * ) + REAL A( * ), AF( * ), B( * ), RWORK( * ), WORK( * ), + $ X( * ), XACT( * ) +* .. +* +* Purpose +* ======= +* +* SCHKGT tests SGTTRF, -TRS, -RFS, and -CON +* +* Arguments +* ========= +* +* DOTYPE (input) LOGICAL array, dimension (NTYPES) +* The matrix types to be used for testing. Matrices of type j +* (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) = +* .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used. +* +* NN (input) INTEGER +* The number of values of N contained in the vector NVAL. +* +* NVAL (input) INTEGER array, dimension (NN) +* The values of the matrix dimension N. +* +* NNS (input) INTEGER +* The number of values of NRHS contained in the vector NSVAL. +* +* NSVAL (input) INTEGER array, dimension (NNS) +* The values of the number of right hand sides NRHS. +* +* THRESH (input) REAL +* The threshold value for the test ratios. A result is +* included in the output file if RESULT >= THRESH. To have +* every test ratio printed, use THRESH = 0. +* +* TSTERR (input) LOGICAL +* Flag that indicates whether error exits are to be tested. +* +* A (workspace) REAL array, dimension (NMAX*4) +* +* AF (workspace) REAL array, dimension (NMAX*4) +* +* B (workspace) REAL array, dimension (NMAX*NSMAX) +* where NSMAX is the largest entry in NSVAL. +* +* X (workspace) REAL array, dimension (NMAX*NSMAX) +* +* XACT (workspace) REAL array, dimension (NMAX*NSMAX) +* +* WORK (workspace) REAL array, dimension +* (NMAX*max(3,NSMAX)) +* +* RWORK (workspace) REAL array, dimension +* (max(NMAX,2*NSMAX)) +* +* IWORK (workspace) INTEGER array, dimension (2*NMAX) +* +* NOUT (input) INTEGER +* The unit number for output. +* +* ===================================================================== +* +* .. Parameters .. + REAL ONE, ZERO + PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) + INTEGER NTYPES + PARAMETER ( NTYPES = 12 ) + INTEGER NTESTS + PARAMETER ( NTESTS = 7 ) +* .. +* .. Local Scalars .. + LOGICAL TRFCON, ZEROT + CHARACTER DIST, NORM, TRANS, TYPE + CHARACTER*3 PATH + INTEGER I, IMAT, IN, INFO, IRHS, ITRAN, IX, IZERO, J, + $ K, KL, KOFF, KU, LDA, M, MODE, N, NERRS, NFAIL, + $ NIMAT, NRHS, NRUN + REAL AINVNM, ANORM, COND, RCOND, RCONDC, RCONDI, + $ RCONDO +* .. +* .. Local Arrays .. + CHARACTER TRANSS( 3 ) + INTEGER ISEED( 4 ), ISEEDY( 4 ) + REAL RESULT( NTESTS ), Z( 3 ) +* .. +* .. External Functions .. + REAL SASUM, SGET06, SLANGT + EXTERNAL SASUM, SGET06, SLANGT +* .. +* .. External Subroutines .. + EXTERNAL ALAERH, ALAHD, ALASUM, SCOPY, SERRGE, SGET04, + $ SGTCON, SGTRFS, SGTT01, SGTT02, SGTT05, SGTTRF, + $ SGTTRS, SLACPY, SLAGTM, SLARNV, SLATB4, SLATMS, + $ SSCAL +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Scalars in Common .. + LOGICAL LERR, OK + CHARACTER(32) SRNAMT + INTEGER INFOT, NUNIT +* .. +* .. Common blocks .. + COMMON / INFOC / INFOT, NUNIT, OK, LERR + COMMON / SRNAMC / SRNAMT +* .. +* .. Data statements .. + DATA ISEEDY / 0, 0, 0, 1 / , TRANSS / 'N', 'T', + $ 'C' / +* .. +* .. Executable Statements .. +* + PATH( 1: 1 ) = 'Single precision' + PATH( 2: 3 ) = 'GT' + NRUN = 0 + NFAIL = 0 + NERRS = 0 + DO 10 I = 1, 4 + ISEED( I ) = ISEEDY( I ) + 10 CONTINUE +* +* Test the error exits +* + IF( TSTERR ) + $ CALL SERRGE( PATH, NOUT ) + INFOT = 0 +* + DO 110 IN = 1, NN +* +* Do for each value of N in NVAL. +* + N = NVAL( IN ) + M = MAX( N-1, 0 ) + LDA = MAX( 1, N ) + NIMAT = NTYPES + IF( N.LE.0 ) + $ NIMAT = 1 +* + DO 100 IMAT = 1, NIMAT +* +* Do the tests only if DOTYPE( IMAT ) is true. +* + IF( .NOT.DOTYPE( IMAT ) ) + $ GO TO 100 +* +* Set up parameters with SLATB4. +* + CALL SLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM, MODE, + $ COND, DIST ) +* + ZEROT = IMAT.GE.8 .AND. IMAT.LE.10 + IF( IMAT.LE.6 ) THEN +* +* Types 1-6: generate matrices of known condition number. +* + KOFF = MAX( 2-KU, 3-MAX( 1, N ) ) + SRNAMT = 'SLATMS' + CALL SLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE, COND, + $ ANORM, KL, KU, 'Z', AF( KOFF ), 3, WORK, + $ INFO ) +* +* Check the error code from SLATMS. +* + IF( INFO.NE.0 ) THEN + CALL ALAERH( PATH, 'SLATMS', INFO, 0, ' ', N, N, KL, + $ KU, -1, IMAT, NFAIL, NERRS, NOUT ) + GO TO 100 + END IF + IZERO = 0 +* + IF( N.GT.1 ) THEN + CALL SCOPY( N-1, AF( 4 ), 3, A, 1 ) + CALL SCOPY( N-1, AF( 3 ), 3, A( N+M+1 ), 1 ) + END IF + CALL SCOPY( N, AF( 2 ), 3, A( M+1 ), 1 ) + ELSE +* +* Types 7-12: generate tridiagonal matrices with +* unknown condition numbers. +* + IF( .NOT.ZEROT .OR. .NOT.DOTYPE( 7 ) ) THEN +* +* Generate a matrix with elements from [-1,1]. +* + CALL SLARNV( 2, ISEED, N+2*M, A ) + IF( ANORM.NE.ONE ) + $ CALL SSCAL( N+2*M, ANORM, A, 1 ) + ELSE IF( IZERO.GT.0 ) THEN +* +* Reuse the last matrix by copying back the zeroed out +* elements. +* + IF( IZERO.EQ.1 ) THEN + A( N ) = Z( 2 ) + IF( N.GT.1 ) + $ A( 1 ) = Z( 3 ) + ELSE IF( IZERO.EQ.N ) THEN + A( 3*N-2 ) = Z( 1 ) + A( 2*N-1 ) = Z( 2 ) + ELSE + A( 2*N-2+IZERO ) = Z( 1 ) + A( N-1+IZERO ) = Z( 2 ) + A( IZERO ) = Z( 3 ) + END IF + END IF +* +* If IMAT > 7, set one column of the matrix to 0. +* + IF( .NOT.ZEROT ) THEN + IZERO = 0 + ELSE IF( IMAT.EQ.8 ) THEN + IZERO = 1 + Z( 2 ) = A( N ) + A( N ) = ZERO + IF( N.GT.1 ) THEN + Z( 3 ) = A( 1 ) + A( 1 ) = ZERO + END IF + ELSE IF( IMAT.EQ.9 ) THEN + IZERO = N + Z( 1 ) = A( 3*N-2 ) + Z( 2 ) = A( 2*N-1 ) + A( 3*N-2 ) = ZERO + A( 2*N-1 ) = ZERO + ELSE + IZERO = ( N+1 ) / 2 + DO 20 I = IZERO, N - 1 + A( 2*N-2+I ) = ZERO + A( N-1+I ) = ZERO + A( I ) = ZERO + 20 CONTINUE + A( 3*N-2 ) = ZERO + A( 2*N-1 ) = ZERO + END IF + END IF +* +*+ TEST 1 +* Factor A as L*U and compute the ratio +* norm(L*U - A) / (n * norm(A) * EPS ) +* + CALL SCOPY( N+2*M, A, 1, AF, 1 ) + SRNAMT = 'SGTTRF' + CALL SGTTRF( N, AF, AF( M+1 ), AF( N+M+1 ), AF( N+2*M+1 ), + $ IWORK, INFO ) +* +* Check error code from SGTTRF. +* + IF( INFO.NE.IZERO ) + $ CALL ALAERH( PATH, 'SGTTRF', INFO, IZERO, ' ', N, N, 1, + $ 1, -1, IMAT, NFAIL, NERRS, NOUT ) + TRFCON = INFO.NE.0 +* + CALL SGTT01( 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 ) ) +* +* Print the test ratio if it is .GE. 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 +* + DO 50 ITRAN = 1, 2 + TRANS = TRANSS( ITRAN ) + IF( ITRAN.EQ.1 ) THEN + NORM = 'O' + ELSE + NORM = 'I' + END IF + ANORM = SLANGT( NORM, N, A, A( M+1 ), A( N+M+1 ) ) +* + IF( .NOT.TRFCON ) THEN +* +* Use SGTTRS to solve for one column at a time of inv(A) +* or inv(A^T), 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 SGTTRS( TRANS, N, 1, AF, AF( M+1 ), + $ AF( N+M+1 ), AF( N+2*M+1 ), IWORK, X, + $ LDA, INFO ) + AINVNM = MAX( AINVNM, SASUM( N, X, 1 ) ) + 40 CONTINUE +* +* Compute RCONDC = 1 / (norm(A) * norm(inv(A)) +* + IF( ANORM.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN + RCONDC = ONE + ELSE + RCONDC = ( ONE / ANORM ) / AINVNM + END IF + IF( ITRAN.EQ.1 ) THEN + RCONDO = RCONDC + ELSE + RCONDI = RCONDC + END IF + ELSE + RCONDC = ZERO + END IF +* +*+ TEST 7 +* Estimate the reciprocal of the condition number of the +* matrix. +* + SRNAMT = 'SGTCON' + CALL SGTCON( NORM, N, AF, AF( M+1 ), AF( N+M+1 ), + $ AF( N+2*M+1 ), IWORK, ANORM, RCOND, WORK, + $ IWORK( N+1 ), INFO ) +* +* Check error code from SGTCON. +* + IF( INFO.NE.0 ) + $ CALL ALAERH( PATH, 'SGTCON', INFO, 0, NORM, N, N, -1, + $ -1, -1, IMAT, NFAIL, NERRS, NOUT ) +* + RESULT( 7 ) = SGET06( RCOND, RCONDC ) +* +* Print the test ratio if it is .GE. THRESH. +* + IF( RESULT( 7 ).GE.THRESH ) THEN + IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) + $ CALL ALAHD( NOUT, PATH ) + WRITE( NOUT, FMT = 9997 )NORM, N, IMAT, 7, + $ RESULT( 7 ) + NFAIL = NFAIL + 1 + END IF + NRUN = NRUN + 1 + 50 CONTINUE +* +* Skip the remaining tests if the matrix is singular. +* + IF( TRFCON ) + $ GO TO 100 +* + DO 90 IRHS = 1, NNS + NRHS = NSVAL( IRHS ) +* +* Generate NRHS random solution vectors. +* + IX = 1 + DO 60 J = 1, NRHS + CALL SLARNV( 2, ISEED, N, XACT( IX ) ) + IX = IX + LDA + 60 CONTINUE +* + DO 80 ITRAN = 1, 3 + TRANS = TRANSS( ITRAN ) + IF( ITRAN.EQ.1 ) THEN + RCONDC = RCONDO + ELSE + RCONDC = RCONDI + END IF +* +* Set the right hand side. +* + CALL SLAGTM( TRANS, N, NRHS, ONE, A, A( M+1 ), + $ A( N+M+1 ), XACT, LDA, ZERO, B, LDA ) +* +*+ TEST 2 +* Solve op(A) * X = B and compute the residual. +* + CALL SLACPY( 'Full', N, NRHS, B, LDA, X, LDA ) + SRNAMT = 'SGTTRS' + CALL SGTTRS( TRANS, N, NRHS, AF, AF( M+1 ), + $ AF( N+M+1 ), AF( N+2*M+1 ), IWORK, X, + $ LDA, INFO ) +* +* Check error code from SGTTRS. +* + IF( INFO.NE.0 ) + $ CALL ALAERH( PATH, 'SGTTRS', INFO, 0, TRANS, N, N, + $ -1, -1, NRHS, IMAT, NFAIL, NERRS, + $ NOUT ) +* + CALL SLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA ) + CALL SGTT02( TRANS, N, NRHS, A, A( M+1 ), A( N+M+1 ), + $ X, LDA, WORK, LDA, RWORK, RESULT( 2 ) ) +* +*+ TEST 3 +* Check solution from generated exact solution. +* + CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC, + $ RESULT( 3 ) ) +* +*+ TESTS 4, 5, and 6 +* Use iterative refinement to improve the solution. +* + SRNAMT = 'SGTRFS' + CALL SGTRFS( 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, + $ RWORK, RWORK( NRHS+1 ), WORK, + $ IWORK( N+1 ), INFO ) +* +* Check error code from SGTRFS. +* + IF( INFO.NE.0 ) + $ CALL ALAERH( PATH, 'SGTRFS', INFO, 0, TRANS, N, N, + $ -1, -1, NRHS, IMAT, NFAIL, NERRS, + $ NOUT ) +* + CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC, + $ RESULT( 4 ) ) + CALL SGTT05( TRANS, N, NRHS, A, A( M+1 ), A( N+M+1 ), + $ 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 )TRANS, N, NRHS, IMAT, + $ K, RESULT( K ) + NFAIL = NFAIL + 1 + END IF + 70 CONTINUE + NRUN = NRUN + 5 + 80 CONTINUE + 90 CONTINUE +* + 100 CONTINUE + 110 CONTINUE +* +* Print a summary of the results. +* + CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS ) +* + 9999 FORMAT( 12X, 'N =', I5, ',', 10X, ' type ', I2, ', test(', I2, + $ ') = ', G12.5 ) + 9998 FORMAT( ' TRANS=''', A1, ''', N =', I5, ', NRHS=', I3, ', type ', + $ I2, ', test(', I2, ') = ', G12.5 ) + 9997 FORMAT( ' NORM =''', A1, ''', N =', I5, ',', 10X, ' type ', I2, + $ ', test(', I2, ') = ', G12.5 ) + RETURN +* +* End of SCHKGT +* + END |