LAPACK 3.3.1
Linear Algebra PACKage
|
00001 SUBROUTINE SCHKSY( DOTYPE, NN, NVAL, NNB, NBVAL, NNS, NSVAL, 00002 $ THRESH, TSTERR, NMAX, A, AFAC, AINV, B, X, 00003 $ XACT, WORK, RWORK, IWORK, NOUT ) 00004 * 00005 * -- LAPACK test routine (version 3.3.0) -- 00006 * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. 00007 * November 2010 00008 * 00009 * .. Scalar Arguments .. 00010 LOGICAL TSTERR 00011 INTEGER NMAX, NN, NNB, NNS, NOUT 00012 REAL THRESH 00013 * .. 00014 * .. Array Arguments .. 00015 LOGICAL DOTYPE( * ) 00016 INTEGER IWORK( * ), NBVAL( * ), NSVAL( * ), NVAL( * ) 00017 REAL A( * ), AFAC( * ), AINV( * ), B( * ), 00018 $ RWORK( * ), WORK( * ), X( * ), XACT( * ) 00019 * .. 00020 * 00021 * Purpose 00022 * ======= 00023 * 00024 * SCHKSY tests SSYTRF, -TRI2, -TRS, -TRS2, -RFS, and -CON. 00025 * 00026 * Arguments 00027 * ========= 00028 * 00029 * DOTYPE (input) LOGICAL array, dimension (NTYPES) 00030 * The matrix types to be used for testing. Matrices of type j 00031 * (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) = 00032 * .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used. 00033 * 00034 * NN (input) INTEGER 00035 * The number of values of N contained in the vector NVAL. 00036 * 00037 * NVAL (input) INTEGER array, dimension (NN) 00038 * The values of the matrix dimension N. 00039 * 00040 * NNB (input) INTEGER 00041 * The number of values of NB contained in the vector NBVAL. 00042 * 00043 * NBVAL (input) INTEGER array, dimension (NBVAL) 00044 * The values of the blocksize NB. 00045 * 00046 * NNS (input) INTEGER 00047 * The number of values of NRHS contained in the vector NSVAL. 00048 * 00049 * NSVAL (input) INTEGER array, dimension (NNS) 00050 * The values of the number of right hand sides NRHS. 00051 * 00052 * THRESH (input) REAL 00053 * The threshold value for the test ratios. A result is 00054 * included in the output file if RESULT >= THRESH. To have 00055 * every test ratio printed, use THRESH = 0. 00056 * 00057 * TSTERR (input) LOGICAL 00058 * Flag that indicates whether error exits are to be tested. 00059 * 00060 * NMAX (input) INTEGER 00061 * The maximum value permitted for N, used in dimensioning the 00062 * work arrays. 00063 * 00064 * A (workspace) REAL array, dimension (NMAX*NMAX) 00065 * 00066 * AFAC (workspace) REAL array, dimension (NMAX*NMAX) 00067 * 00068 * AINV (workspace) REAL array, dimension (NMAX*NMAX) 00069 * 00070 * B (workspace) REAL array, dimension (NMAX*NSMAX) 00071 * where NSMAX is the largest entry in NSVAL. 00072 * 00073 * X (workspace) REAL array, dimension (NMAX*NSMAX) 00074 * 00075 * XACT (workspace) REAL array, dimension (NMAX*NSMAX) 00076 * 00077 * WORK (workspace) REAL array, dimension 00078 * (NMAX*max(3,NSMAX)) 00079 * 00080 * RWORK (workspace) REAL array, dimension 00081 * (max(NMAX,2*NSMAX)) 00082 * 00083 * IWORK (workspace) INTEGER array, dimension (2*NMAX) 00084 * 00085 * NOUT (input) INTEGER 00086 * The unit number for output. 00087 * 00088 * ===================================================================== 00089 * 00090 * .. Parameters .. 00091 REAL ZERO 00092 PARAMETER ( ZERO = 0.0E+0 ) 00093 INTEGER NTYPES 00094 PARAMETER ( NTYPES = 10 ) 00095 INTEGER NTESTS 00096 PARAMETER ( NTESTS = 9 ) 00097 * .. 00098 * .. Local Scalars .. 00099 LOGICAL TRFCON, ZEROT 00100 CHARACTER DIST, TYPE, UPLO, XTYPE 00101 CHARACTER*3 PATH 00102 INTEGER I, I1, I2, IMAT, IN, INB, INFO, IOFF, IRHS, 00103 $ IUPLO, IZERO, J, K, KL, KU, LDA, LWORK, MODE, 00104 $ N, NB, NERRS, NFAIL, NIMAT, NRHS, NRUN, NT 00105 REAL ANORM, CNDNUM, RCOND, RCONDC 00106 * .. 00107 * .. Local Arrays .. 00108 CHARACTER UPLOS( 2 ) 00109 INTEGER ISEED( 4 ), ISEEDY( 4 ) 00110 REAL RESULT( NTESTS ) 00111 * .. 00112 * .. External Functions .. 00113 REAL SGET06, SLANSY 00114 EXTERNAL SGET06, SLANSY 00115 * .. 00116 * .. External Subroutines .. 00117 EXTERNAL ALAERH, ALAHD, ALASUM, SERRSY, SGET04, SLACPY, 00118 $ SLARHS, SLATB4, SLATMS, SPOT02, SPOT03, SPOT05, 00119 $ SSYCON, SSYCONV, SSYRFS, SSYT01, SSYTRF, 00120 $ SSYTRI2, SSYTRS, SSYTRS2, XLAENV 00121 * .. 00122 * .. Intrinsic Functions .. 00123 INTRINSIC MAX, MIN 00124 * .. 00125 * .. Scalars in Common .. 00126 LOGICAL LERR, OK 00127 CHARACTER*32 SRNAMT 00128 INTEGER INFOT, NUNIT 00129 * .. 00130 * .. Common blocks .. 00131 COMMON / INFOC / INFOT, NUNIT, OK, LERR 00132 COMMON / SRNAMC / SRNAMT 00133 * .. 00134 * .. Data statements .. 00135 DATA ISEEDY / 1988, 1989, 1990, 1991 / 00136 DATA UPLOS / 'U', 'L' / 00137 * .. 00138 * .. Executable Statements .. 00139 * 00140 * Initialize constants and the random number seed. 00141 * 00142 PATH( 1: 1 ) = 'Single precision' 00143 PATH( 2: 3 ) = 'SY' 00144 NRUN = 0 00145 NFAIL = 0 00146 NERRS = 0 00147 DO 10 I = 1, 4 00148 ISEED( I ) = ISEEDY( I ) 00149 10 CONTINUE 00150 * 00151 * Test the error exits 00152 * 00153 IF( TSTERR ) 00154 $ CALL SERRSY( PATH, NOUT ) 00155 INFOT = 0 00156 CALL XLAENV( 2, 2 ) 00157 * 00158 * Do for each value of N in NVAL 00159 * 00160 DO 180 IN = 1, NN 00161 N = NVAL( IN ) 00162 LDA = MAX( N, 1 ) 00163 XTYPE = 'N' 00164 NIMAT = NTYPES 00165 IF( N.LE.0 ) 00166 $ NIMAT = 1 00167 * 00168 IZERO = 0 00169 DO 170 IMAT = 1, NIMAT 00170 * 00171 * Do the tests only if DOTYPE( IMAT ) is true. 00172 * 00173 IF( .NOT.DOTYPE( IMAT ) ) 00174 $ GO TO 170 00175 * 00176 * Skip types 3, 4, 5, or 6 if the matrix size is too small. 00177 * 00178 ZEROT = IMAT.GE.3 .AND. IMAT.LE.6 00179 IF( ZEROT .AND. N.LT.IMAT-2 ) 00180 $ GO TO 170 00181 * 00182 * Do first for UPLO = 'U', then for UPLO = 'L' 00183 * 00184 DO 160 IUPLO = 1, 2 00185 UPLO = UPLOS( IUPLO ) 00186 * 00187 * Set up parameters with SLATB4 and generate a test matrix 00188 * with SLATMS. 00189 * 00190 CALL SLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM, MODE, 00191 $ CNDNUM, DIST ) 00192 * 00193 SRNAMT = 'SLATMS' 00194 CALL SLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE, 00195 $ CNDNUM, ANORM, KL, KU, UPLO, A, LDA, WORK, 00196 $ INFO ) 00197 * 00198 * Check error code from SLATMS. 00199 * 00200 IF( INFO.NE.0 ) THEN 00201 CALL ALAERH( PATH, 'SLATMS', INFO, 0, UPLO, N, N, -1, 00202 $ -1, -1, IMAT, NFAIL, NERRS, NOUT ) 00203 GO TO 160 00204 END IF 00205 * 00206 * For types 3-6, zero one or more rows and columns of 00207 * the matrix to test that INFO is returned correctly. 00208 * 00209 IF( ZEROT ) THEN 00210 IF( IMAT.EQ.3 ) THEN 00211 IZERO = 1 00212 ELSE IF( IMAT.EQ.4 ) THEN 00213 IZERO = N 00214 ELSE 00215 IZERO = N / 2 + 1 00216 END IF 00217 * 00218 IF( IMAT.LT.6 ) THEN 00219 * 00220 * Set row and column IZERO to zero. 00221 * 00222 IF( IUPLO.EQ.1 ) THEN 00223 IOFF = ( IZERO-1 )*LDA 00224 DO 20 I = 1, IZERO - 1 00225 A( IOFF+I ) = ZERO 00226 20 CONTINUE 00227 IOFF = IOFF + IZERO 00228 DO 30 I = IZERO, N 00229 A( IOFF ) = ZERO 00230 IOFF = IOFF + LDA 00231 30 CONTINUE 00232 ELSE 00233 IOFF = IZERO 00234 DO 40 I = 1, IZERO - 1 00235 A( IOFF ) = ZERO 00236 IOFF = IOFF + LDA 00237 40 CONTINUE 00238 IOFF = IOFF - IZERO 00239 DO 50 I = IZERO, N 00240 A( IOFF+I ) = ZERO 00241 50 CONTINUE 00242 END IF 00243 ELSE 00244 IOFF = 0 00245 IF( IUPLO.EQ.1 ) THEN 00246 * 00247 * Set the first IZERO rows and columns to zero. 00248 * 00249 DO 70 J = 1, N 00250 I2 = MIN( J, IZERO ) 00251 DO 60 I = 1, I2 00252 A( IOFF+I ) = ZERO 00253 60 CONTINUE 00254 IOFF = IOFF + LDA 00255 70 CONTINUE 00256 ELSE 00257 * 00258 * Set the last IZERO rows and columns to zero. 00259 * 00260 DO 90 J = 1, N 00261 I1 = MAX( J, IZERO ) 00262 DO 80 I = I1, N 00263 A( IOFF+I ) = ZERO 00264 80 CONTINUE 00265 IOFF = IOFF + LDA 00266 90 CONTINUE 00267 END IF 00268 END IF 00269 ELSE 00270 IZERO = 0 00271 END IF 00272 * 00273 * Do for each value of NB in NBVAL 00274 * 00275 DO 150 INB = 1, NNB 00276 NB = NBVAL( INB ) 00277 CALL XLAENV( 1, NB ) 00278 * 00279 * Compute the L*D*L' or U*D*U' factorization of the 00280 * matrix. 00281 * 00282 CALL SLACPY( UPLO, N, N, A, LDA, AFAC, LDA ) 00283 LWORK = MAX( 2, NB )*LDA 00284 SRNAMT = 'SSYTRF' 00285 CALL SSYTRF( UPLO, N, AFAC, LDA, IWORK, AINV, LWORK, 00286 $ INFO ) 00287 * 00288 * Adjust the expected value of INFO to account for 00289 * pivoting. 00290 * 00291 K = IZERO 00292 IF( K.GT.0 ) THEN 00293 100 CONTINUE 00294 IF( IWORK( K ).LT.0 ) THEN 00295 IF( IWORK( K ).NE.-K ) THEN 00296 K = -IWORK( K ) 00297 GO TO 100 00298 END IF 00299 ELSE IF( IWORK( K ).NE.K ) THEN 00300 K = IWORK( K ) 00301 GO TO 100 00302 END IF 00303 END IF 00304 * 00305 * Check error code from SSYTRF. 00306 * 00307 IF( INFO.NE.K ) 00308 $ CALL ALAERH( PATH, 'SSYTRF', INFO, K, UPLO, N, N, 00309 $ -1, -1, NB, IMAT, NFAIL, NERRS, NOUT ) 00310 IF( INFO.NE.0 ) THEN 00311 TRFCON = .TRUE. 00312 ELSE 00313 TRFCON = .FALSE. 00314 END IF 00315 * 00316 *+ TEST 1 00317 * Reconstruct matrix from factors and compute residual. 00318 * 00319 CALL SSYT01( UPLO, N, A, LDA, AFAC, LDA, IWORK, AINV, 00320 $ LDA, RWORK, RESULT( 1 ) ) 00321 NT = 1 00322 * 00323 *+ TEST 2 00324 * Form the inverse and compute the residual. 00325 * 00326 IF( INB.EQ.1 .AND. .NOT.TRFCON ) THEN 00327 CALL SLACPY( UPLO, N, N, AFAC, LDA, AINV, LDA ) 00328 SRNAMT = 'SSYTRI2' 00329 LWORK = (N+NB+1)*(NB+3) 00330 CALL SSYTRI2( UPLO, N, AINV, LDA, IWORK, WORK, 00331 $ LWORK, INFO ) 00332 * 00333 * Check error code from SSYTRI2. 00334 * 00335 IF( INFO.NE.0 ) 00336 $ CALL ALAERH( PATH, 'SSYTRI2', INFO, -1, UPLO, N, 00337 $ N, -1, -1, -1, IMAT, NFAIL, NERRS, 00338 $ NOUT ) 00339 * 00340 CALL SPOT03( UPLO, N, A, LDA, AINV, LDA, WORK, LDA, 00341 $ RWORK, RCONDC, RESULT( 2 ) ) 00342 NT = 2 00343 END IF 00344 * 00345 * Print information about the tests that did not pass 00346 * the threshold. 00347 * 00348 DO 110 K = 1, NT 00349 IF( RESULT( K ).GE.THRESH ) THEN 00350 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) 00351 $ CALL ALAHD( NOUT, PATH ) 00352 WRITE( NOUT, FMT = 9999 )UPLO, N, NB, IMAT, K, 00353 $ RESULT( K ) 00354 NFAIL = NFAIL + 1 00355 END IF 00356 110 CONTINUE 00357 NRUN = NRUN + NT 00358 * 00359 * Skip the other tests if this is not the first block 00360 * size. 00361 * 00362 IF( INB.GT.1 ) 00363 $ GO TO 150 00364 * 00365 * Do only the condition estimate if INFO is not 0. 00366 * 00367 IF( TRFCON ) THEN 00368 RCONDC = ZERO 00369 GO TO 140 00370 END IF 00371 * 00372 DO 130 IRHS = 1, NNS 00373 NRHS = NSVAL( IRHS ) 00374 * 00375 *+ TEST 3 (Using DSYTRS) 00376 * Solve and compute residual for A * X = B. 00377 * 00378 SRNAMT = 'SLARHS' 00379 CALL SLARHS( PATH, XTYPE, UPLO, ' ', N, N, KL, KU, 00380 $ NRHS, A, LDA, XACT, LDA, B, LDA, 00381 $ ISEED, INFO ) 00382 CALL SLACPY( 'Full', N, NRHS, B, LDA, X, LDA ) 00383 * 00384 SRNAMT = 'SSYTRS' 00385 CALL SSYTRS( UPLO, N, NRHS, AFAC, LDA, IWORK, X, 00386 $ LDA, INFO ) 00387 * 00388 * Check error code from SSYTRS. 00389 * 00390 IF( INFO.NE.0 ) 00391 $ CALL ALAERH( PATH, 'SSYTRS', INFO, 0, UPLO, N, 00392 $ N, -1, -1, NRHS, IMAT, NFAIL, 00393 $ NERRS, NOUT ) 00394 * 00395 CALL SLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA ) 00396 CALL SPOT02( UPLO, N, NRHS, A, LDA, X, LDA, WORK, 00397 $ LDA, RWORK, RESULT( 3 ) ) 00398 * 00399 *+ TEST 4 (Using DSYTRS2) 00400 * Solve and compute residual for A * X = B. 00401 * 00402 SRNAMT = 'SLARHS' 00403 CALL SLARHS( PATH, XTYPE, UPLO, ' ', N, N, KL, KU, 00404 $ NRHS, A, LDA, XACT, LDA, B, LDA, 00405 $ ISEED, INFO ) 00406 CALL SLACPY( 'Full', N, NRHS, B, LDA, X, LDA ) 00407 * 00408 SRNAMT = 'DSYTRS2' 00409 CALL SSYTRS2( UPLO, N, NRHS, AFAC, LDA, IWORK, X, 00410 $ LDA, WORK, INFO ) 00411 * 00412 * Check error code from SSYTRS2. 00413 * 00414 IF( INFO.NE.0 ) 00415 $ CALL ALAERH( PATH, 'SSYTRS2', INFO, 0, UPLO, N, 00416 $ N, -1, -1, NRHS, IMAT, NFAIL, 00417 $ NERRS, NOUT ) 00418 * 00419 CALL SLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA ) 00420 CALL SPOT02( UPLO, N, NRHS, A, LDA, X, LDA, WORK, 00421 $ LDA, RWORK, RESULT( 4 ) ) 00422 * 00423 *+ TEST 5 00424 * Check solution from generated exact solution. 00425 * 00426 CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC, 00427 $ RESULT( 5 ) ) 00428 * 00429 *+ TESTS 6, 7, and 8 00430 * Use iterative refinement to improve the solution. 00431 * 00432 SRNAMT = 'SSYRFS' 00433 CALL SSYRFS( UPLO, N, NRHS, A, LDA, AFAC, LDA, 00434 $ IWORK, B, LDA, X, LDA, RWORK, 00435 $ RWORK( NRHS+1 ), WORK, IWORK( N+1 ), 00436 $ INFO ) 00437 * 00438 * Check error code from SSYRFS. 00439 * 00440 IF( INFO.NE.0 ) 00441 $ CALL ALAERH( PATH, 'SSYRFS', INFO, 0, UPLO, N, 00442 $ N, -1, -1, NRHS, IMAT, NFAIL, 00443 $ NERRS, NOUT ) 00444 * 00445 CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC, 00446 $ RESULT( 6 ) ) 00447 CALL SPOT05( UPLO, N, NRHS, A, LDA, B, LDA, X, LDA, 00448 $ XACT, LDA, RWORK, RWORK( NRHS+1 ), 00449 $ RESULT( 7 ) ) 00450 * 00451 * Print information about the tests that did not pass 00452 * the threshold. 00453 * 00454 DO 120 K = 3, 8 00455 IF( RESULT( K ).GE.THRESH ) THEN 00456 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) 00457 $ CALL ALAHD( NOUT, PATH ) 00458 WRITE( NOUT, FMT = 9998 )UPLO, N, NRHS, 00459 $ IMAT, K, RESULT( K ) 00460 NFAIL = NFAIL + 1 00461 END IF 00462 120 CONTINUE 00463 NRUN = NRUN + 5 00464 130 CONTINUE 00465 * 00466 *+ TEST 9 00467 * Get an estimate of RCOND = 1/CNDNUM. 00468 * 00469 140 CONTINUE 00470 ANORM = SLANSY( '1', UPLO, N, A, LDA, RWORK ) 00471 SRNAMT = 'SSYCON' 00472 CALL SSYCON( UPLO, N, AFAC, LDA, IWORK, ANORM, RCOND, 00473 $ WORK, IWORK( N+1 ), INFO ) 00474 * 00475 * Check error code from SSYCON. 00476 * 00477 IF( INFO.NE.0 ) 00478 $ CALL ALAERH( PATH, 'SSYCON', INFO, 0, UPLO, N, N, 00479 $ -1, -1, -1, IMAT, NFAIL, NERRS, NOUT ) 00480 * 00481 RESULT( 9 ) = SGET06( RCOND, RCONDC ) 00482 * 00483 * Print information about the tests that did not pass 00484 * the threshold. 00485 * 00486 IF( RESULT( 9 ).GE.THRESH ) THEN 00487 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) 00488 $ CALL ALAHD( NOUT, PATH ) 00489 WRITE( NOUT, FMT = 9997 )UPLO, N, IMAT, 9, 00490 $ RESULT( 9 ) 00491 NFAIL = NFAIL + 1 00492 END IF 00493 NRUN = NRUN + 1 00494 150 CONTINUE 00495 * 00496 160 CONTINUE 00497 170 CONTINUE 00498 180 CONTINUE 00499 * 00500 * Print a summary of the results. 00501 * 00502 CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS ) 00503 * 00504 9999 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ', NB =', I4, ', type ', 00505 $ I2, ', test ', I2, ', ratio =', G12.5 ) 00506 9998 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ', NRHS=', I3, ', type ', 00507 $ I2, ', test(', I2, ') =', G12.5 ) 00508 9997 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ',', 10X, ' type ', I2, 00509 $ ', test(', I2, ') =', G12.5 ) 00510 RETURN 00511 * 00512 * End of SCHKSY 00513 * 00514 END