LAPACK 3.3.0
|
00001 SUBROUTINE ZDRVGT( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, A, AF, 00002 $ B, X, XACT, WORK, RWORK, IWORK, NOUT ) 00003 * 00004 * -- LAPACK test routine (version 3.1) -- 00005 * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. 00006 * November 2006 00007 * 00008 * .. Scalar Arguments .. 00009 LOGICAL TSTERR 00010 INTEGER NN, NOUT, NRHS 00011 DOUBLE PRECISION THRESH 00012 * .. 00013 * .. Array Arguments .. 00014 LOGICAL DOTYPE( * ) 00015 INTEGER IWORK( * ), NVAL( * ) 00016 DOUBLE PRECISION RWORK( * ) 00017 COMPLEX*16 A( * ), AF( * ), B( * ), WORK( * ), X( * ), 00018 $ XACT( * ) 00019 * .. 00020 * 00021 * Purpose 00022 * ======= 00023 * 00024 * ZDRVGT tests ZGTSV and -SVX. 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 * THRESH (input) DOUBLE PRECISION 00041 * The threshold value for the test ratios. A result is 00042 * included in the output file if RESULT >= THRESH. To have 00043 * every test ratio printed, use THRESH = 0. 00044 * 00045 * TSTERR (input) LOGICAL 00046 * Flag that indicates whether error exits are to be tested. 00047 * 00048 * A (workspace) COMPLEX*16 array, dimension (NMAX*4) 00049 * 00050 * AF (workspace) COMPLEX*16 array, dimension (NMAX*4) 00051 * 00052 * B (workspace) COMPLEX*16 array, dimension (NMAX*NRHS) 00053 * 00054 * X (workspace) COMPLEX*16 array, dimension (NMAX*NRHS) 00055 * 00056 * XACT (workspace) COMPLEX*16 array, dimension (NMAX*NRHS) 00057 * 00058 * WORK (workspace) COMPLEX*16 array, dimension 00059 * (NMAX*max(3,NRHS)) 00060 * 00061 * RWORK (workspace) DOUBLE PRECISION array, dimension (NMAX+2*NRHS) 00062 * 00063 * IWORK (workspace) INTEGER array, dimension (2*NMAX) 00064 * 00065 * NOUT (input) INTEGER 00066 * The unit number for output. 00067 * 00068 * ===================================================================== 00069 * 00070 * .. Parameters .. 00071 DOUBLE PRECISION ONE, ZERO 00072 PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) 00073 INTEGER NTYPES 00074 PARAMETER ( NTYPES = 12 ) 00075 INTEGER NTESTS 00076 PARAMETER ( NTESTS = 6 ) 00077 * .. 00078 * .. Local Scalars .. 00079 LOGICAL TRFCON, ZEROT 00080 CHARACTER DIST, FACT, TRANS, TYPE 00081 CHARACTER*3 PATH 00082 INTEGER I, IFACT, IMAT, IN, INFO, ITRAN, IX, IZERO, J, 00083 $ K, K1, KL, KOFF, KU, LDA, M, MODE, N, NERRS, 00084 $ NFAIL, NIMAT, NRUN, NT 00085 DOUBLE PRECISION AINVNM, ANORM, ANORMI, ANORMO, COND, RCOND, 00086 $ RCONDC, RCONDI, RCONDO 00087 * .. 00088 * .. Local Arrays .. 00089 CHARACTER TRANSS( 3 ) 00090 INTEGER ISEED( 4 ), ISEEDY( 4 ) 00091 DOUBLE PRECISION RESULT( NTESTS ), Z( 3 ) 00092 * .. 00093 * .. External Functions .. 00094 DOUBLE PRECISION DGET06, DZASUM, ZLANGT 00095 EXTERNAL DGET06, DZASUM, ZLANGT 00096 * .. 00097 * .. External Subroutines .. 00098 EXTERNAL ALADHD, ALAERH, ALASVM, ZCOPY, ZDSCAL, ZERRVX, 00099 $ ZGET04, ZGTSV, ZGTSVX, ZGTT01, ZGTT02, ZGTT05, 00100 $ ZGTTRF, ZGTTRS, ZLACPY, ZLAGTM, ZLARNV, ZLASET, 00101 $ ZLATB4, ZLATMS 00102 * .. 00103 * .. Intrinsic Functions .. 00104 INTRINSIC DCMPLX, MAX 00105 * .. 00106 * .. Scalars in Common .. 00107 LOGICAL LERR, OK 00108 CHARACTER*32 SRNAMT 00109 INTEGER INFOT, NUNIT 00110 * .. 00111 * .. Common blocks .. 00112 COMMON / INFOC / INFOT, NUNIT, OK, LERR 00113 COMMON / SRNAMC / SRNAMT 00114 * .. 00115 * .. Data statements .. 00116 DATA ISEEDY / 0, 0, 0, 1 / , TRANSS / 'N', 'T', 00117 $ 'C' / 00118 * .. 00119 * .. Executable Statements .. 00120 * 00121 PATH( 1: 1 ) = 'Zomplex precision' 00122 PATH( 2: 3 ) = 'GT' 00123 NRUN = 0 00124 NFAIL = 0 00125 NERRS = 0 00126 DO 10 I = 1, 4 00127 ISEED( I ) = ISEEDY( I ) 00128 10 CONTINUE 00129 * 00130 * Test the error exits 00131 * 00132 IF( TSTERR ) 00133 $ CALL ZERRVX( PATH, NOUT ) 00134 INFOT = 0 00135 * 00136 DO 140 IN = 1, NN 00137 * 00138 * Do for each value of N in NVAL. 00139 * 00140 N = NVAL( IN ) 00141 M = MAX( N-1, 0 ) 00142 LDA = MAX( 1, N ) 00143 NIMAT = NTYPES 00144 IF( N.LE.0 ) 00145 $ NIMAT = 1 00146 * 00147 DO 130 IMAT = 1, NIMAT 00148 * 00149 * Do the tests only if DOTYPE( IMAT ) is true. 00150 * 00151 IF( .NOT.DOTYPE( IMAT ) ) 00152 $ GO TO 130 00153 * 00154 * Set up parameters with ZLATB4. 00155 * 00156 CALL ZLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM, MODE, 00157 $ COND, DIST ) 00158 * 00159 ZEROT = IMAT.GE.8 .AND. IMAT.LE.10 00160 IF( IMAT.LE.6 ) THEN 00161 * 00162 * Types 1-6: generate matrices of known condition number. 00163 * 00164 KOFF = MAX( 2-KU, 3-MAX( 1, N ) ) 00165 SRNAMT = 'ZLATMS' 00166 CALL ZLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE, COND, 00167 $ ANORM, KL, KU, 'Z', AF( KOFF ), 3, WORK, 00168 $ INFO ) 00169 * 00170 * Check the error code from ZLATMS. 00171 * 00172 IF( INFO.NE.0 ) THEN 00173 CALL ALAERH( PATH, 'ZLATMS', INFO, 0, ' ', N, N, KL, 00174 $ KU, -1, IMAT, NFAIL, NERRS, NOUT ) 00175 GO TO 130 00176 END IF 00177 IZERO = 0 00178 * 00179 IF( N.GT.1 ) THEN 00180 CALL ZCOPY( N-1, AF( 4 ), 3, A, 1 ) 00181 CALL ZCOPY( N-1, AF( 3 ), 3, A( N+M+1 ), 1 ) 00182 END IF 00183 CALL ZCOPY( N, AF( 2 ), 3, A( M+1 ), 1 ) 00184 ELSE 00185 * 00186 * Types 7-12: generate tridiagonal matrices with 00187 * unknown condition numbers. 00188 * 00189 IF( .NOT.ZEROT .OR. .NOT.DOTYPE( 7 ) ) THEN 00190 * 00191 * Generate a matrix with elements from [-1,1]. 00192 * 00193 CALL ZLARNV( 2, ISEED, N+2*M, A ) 00194 IF( ANORM.NE.ONE ) 00195 $ CALL ZDSCAL( N+2*M, ANORM, A, 1 ) 00196 ELSE IF( IZERO.GT.0 ) THEN 00197 * 00198 * Reuse the last matrix by copying back the zeroed out 00199 * elements. 00200 * 00201 IF( IZERO.EQ.1 ) THEN 00202 A( N ) = Z( 2 ) 00203 IF( N.GT.1 ) 00204 $ A( 1 ) = Z( 3 ) 00205 ELSE IF( IZERO.EQ.N ) THEN 00206 A( 3*N-2 ) = Z( 1 ) 00207 A( 2*N-1 ) = Z( 2 ) 00208 ELSE 00209 A( 2*N-2+IZERO ) = Z( 1 ) 00210 A( N-1+IZERO ) = Z( 2 ) 00211 A( IZERO ) = Z( 3 ) 00212 END IF 00213 END IF 00214 * 00215 * If IMAT > 7, set one column of the matrix to 0. 00216 * 00217 IF( .NOT.ZEROT ) THEN 00218 IZERO = 0 00219 ELSE IF( IMAT.EQ.8 ) THEN 00220 IZERO = 1 00221 Z( 2 ) = A( N ) 00222 A( N ) = ZERO 00223 IF( N.GT.1 ) THEN 00224 Z( 3 ) = A( 1 ) 00225 A( 1 ) = ZERO 00226 END IF 00227 ELSE IF( IMAT.EQ.9 ) THEN 00228 IZERO = N 00229 Z( 1 ) = A( 3*N-2 ) 00230 Z( 2 ) = A( 2*N-1 ) 00231 A( 3*N-2 ) = ZERO 00232 A( 2*N-1 ) = ZERO 00233 ELSE 00234 IZERO = ( N+1 ) / 2 00235 DO 20 I = IZERO, N - 1 00236 A( 2*N-2+I ) = ZERO 00237 A( N-1+I ) = ZERO 00238 A( I ) = ZERO 00239 20 CONTINUE 00240 A( 3*N-2 ) = ZERO 00241 A( 2*N-1 ) = ZERO 00242 END IF 00243 END IF 00244 * 00245 DO 120 IFACT = 1, 2 00246 IF( IFACT.EQ.1 ) THEN 00247 FACT = 'F' 00248 ELSE 00249 FACT = 'N' 00250 END IF 00251 * 00252 * Compute the condition number for comparison with 00253 * the value returned by ZGTSVX. 00254 * 00255 IF( ZEROT ) THEN 00256 IF( IFACT.EQ.1 ) 00257 $ GO TO 120 00258 RCONDO = ZERO 00259 RCONDI = ZERO 00260 * 00261 ELSE IF( IFACT.EQ.1 ) THEN 00262 CALL ZCOPY( N+2*M, A, 1, AF, 1 ) 00263 * 00264 * Compute the 1-norm and infinity-norm of A. 00265 * 00266 ANORMO = ZLANGT( '1', N, A, A( M+1 ), A( N+M+1 ) ) 00267 ANORMI = ZLANGT( 'I', N, A, A( M+1 ), A( N+M+1 ) ) 00268 * 00269 * Factor the matrix A. 00270 * 00271 CALL ZGTTRF( N, AF, AF( M+1 ), AF( N+M+1 ), 00272 $ AF( N+2*M+1 ), IWORK, INFO ) 00273 * 00274 * Use ZGTTRS to solve for one column at a time of 00275 * inv(A), computing the maximum column sum as we go. 00276 * 00277 AINVNM = ZERO 00278 DO 40 I = 1, N 00279 DO 30 J = 1, N 00280 X( J ) = ZERO 00281 30 CONTINUE 00282 X( I ) = ONE 00283 CALL ZGTTRS( 'No transpose', N, 1, AF, AF( M+1 ), 00284 $ AF( N+M+1 ), AF( N+2*M+1 ), IWORK, X, 00285 $ LDA, INFO ) 00286 AINVNM = MAX( AINVNM, DZASUM( N, X, 1 ) ) 00287 40 CONTINUE 00288 * 00289 * Compute the 1-norm condition number of A. 00290 * 00291 IF( ANORMO.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN 00292 RCONDO = ONE 00293 ELSE 00294 RCONDO = ( ONE / ANORMO ) / AINVNM 00295 END IF 00296 * 00297 * Use ZGTTRS to solve for one column at a time of 00298 * inv(A'), computing the maximum column sum as we go. 00299 * 00300 AINVNM = ZERO 00301 DO 60 I = 1, N 00302 DO 50 J = 1, N 00303 X( J ) = ZERO 00304 50 CONTINUE 00305 X( I ) = ONE 00306 CALL ZGTTRS( 'Conjugate transpose', N, 1, AF, 00307 $ AF( M+1 ), AF( N+M+1 ), AF( N+2*M+1 ), 00308 $ IWORK, X, LDA, INFO ) 00309 AINVNM = MAX( AINVNM, DZASUM( N, X, 1 ) ) 00310 60 CONTINUE 00311 * 00312 * Compute the infinity-norm condition number of A. 00313 * 00314 IF( ANORMI.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN 00315 RCONDI = ONE 00316 ELSE 00317 RCONDI = ( ONE / ANORMI ) / AINVNM 00318 END IF 00319 END IF 00320 * 00321 DO 110 ITRAN = 1, 3 00322 TRANS = TRANSS( ITRAN ) 00323 IF( ITRAN.EQ.1 ) THEN 00324 RCONDC = RCONDO 00325 ELSE 00326 RCONDC = RCONDI 00327 END IF 00328 * 00329 * Generate NRHS random solution vectors. 00330 * 00331 IX = 1 00332 DO 70 J = 1, NRHS 00333 CALL ZLARNV( 2, ISEED, N, XACT( IX ) ) 00334 IX = IX + LDA 00335 70 CONTINUE 00336 * 00337 * Set the right hand side. 00338 * 00339 CALL ZLAGTM( TRANS, N, NRHS, ONE, A, A( M+1 ), 00340 $ A( N+M+1 ), XACT, LDA, ZERO, B, LDA ) 00341 * 00342 IF( IFACT.EQ.2 .AND. ITRAN.EQ.1 ) THEN 00343 * 00344 * --- Test ZGTSV --- 00345 * 00346 * Solve the system using Gaussian elimination with 00347 * partial pivoting. 00348 * 00349 CALL ZCOPY( N+2*M, A, 1, AF, 1 ) 00350 CALL ZLACPY( 'Full', N, NRHS, B, LDA, X, LDA ) 00351 * 00352 SRNAMT = 'ZGTSV ' 00353 CALL ZGTSV( N, NRHS, AF, AF( M+1 ), AF( N+M+1 ), X, 00354 $ LDA, INFO ) 00355 * 00356 * Check error code from ZGTSV . 00357 * 00358 IF( INFO.NE.IZERO ) 00359 $ CALL ALAERH( PATH, 'ZGTSV ', INFO, IZERO, ' ', 00360 $ N, N, 1, 1, NRHS, IMAT, NFAIL, 00361 $ NERRS, NOUT ) 00362 NT = 1 00363 IF( IZERO.EQ.0 ) THEN 00364 * 00365 * Check residual of computed solution. 00366 * 00367 CALL ZLACPY( 'Full', N, NRHS, B, LDA, WORK, 00368 $ LDA ) 00369 CALL ZGTT02( TRANS, N, NRHS, A, A( M+1 ), 00370 $ A( N+M+1 ), X, LDA, WORK, LDA, 00371 $ RWORK, RESULT( 2 ) ) 00372 * 00373 * Check solution from generated exact solution. 00374 * 00375 CALL ZGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC, 00376 $ RESULT( 3 ) ) 00377 NT = 3 00378 END IF 00379 * 00380 * Print information about the tests that did not pass 00381 * the threshold. 00382 * 00383 DO 80 K = 2, NT 00384 IF( RESULT( K ).GE.THRESH ) THEN 00385 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) 00386 $ CALL ALADHD( NOUT, PATH ) 00387 WRITE( NOUT, FMT = 9999 )'ZGTSV ', N, IMAT, 00388 $ K, RESULT( K ) 00389 NFAIL = NFAIL + 1 00390 END IF 00391 80 CONTINUE 00392 NRUN = NRUN + NT - 1 00393 END IF 00394 * 00395 * --- Test ZGTSVX --- 00396 * 00397 IF( IFACT.GT.1 ) THEN 00398 * 00399 * Initialize AF to zero. 00400 * 00401 DO 90 I = 1, 3*N - 2 00402 AF( I ) = ZERO 00403 90 CONTINUE 00404 END IF 00405 CALL ZLASET( 'Full', N, NRHS, DCMPLX( ZERO ), 00406 $ DCMPLX( ZERO ), X, LDA ) 00407 * 00408 * Solve the system and compute the condition number and 00409 * error bounds using ZGTSVX. 00410 * 00411 SRNAMT = 'ZGTSVX' 00412 CALL ZGTSVX( FACT, TRANS, N, NRHS, A, A( M+1 ), 00413 $ A( N+M+1 ), AF, AF( M+1 ), AF( N+M+1 ), 00414 $ AF( N+2*M+1 ), IWORK, B, LDA, X, LDA, 00415 $ RCOND, RWORK, RWORK( NRHS+1 ), WORK, 00416 $ RWORK( 2*NRHS+1 ), INFO ) 00417 * 00418 * Check the error code from ZGTSVX. 00419 * 00420 IF( INFO.NE.IZERO ) 00421 $ CALL ALAERH( PATH, 'ZGTSVX', INFO, IZERO, 00422 $ FACT // TRANS, N, N, 1, 1, NRHS, IMAT, 00423 $ NFAIL, NERRS, NOUT ) 00424 * 00425 IF( IFACT.GE.2 ) THEN 00426 * 00427 * Reconstruct matrix from factors and compute 00428 * residual. 00429 * 00430 CALL ZGTT01( N, A, A( M+1 ), A( N+M+1 ), AF, 00431 $ AF( M+1 ), AF( N+M+1 ), AF( N+2*M+1 ), 00432 $ IWORK, WORK, LDA, RWORK, RESULT( 1 ) ) 00433 K1 = 1 00434 ELSE 00435 K1 = 2 00436 END IF 00437 * 00438 IF( INFO.EQ.0 ) THEN 00439 TRFCON = .FALSE. 00440 * 00441 * Check residual of computed solution. 00442 * 00443 CALL ZLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA ) 00444 CALL ZGTT02( TRANS, N, NRHS, A, A( M+1 ), 00445 $ A( N+M+1 ), X, LDA, WORK, LDA, RWORK, 00446 $ RESULT( 2 ) ) 00447 * 00448 * Check solution from generated exact solution. 00449 * 00450 CALL ZGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC, 00451 $ RESULT( 3 ) ) 00452 * 00453 * Check the error bounds from iterative refinement. 00454 * 00455 CALL ZGTT05( TRANS, N, NRHS, A, A( M+1 ), 00456 $ A( N+M+1 ), B, LDA, X, LDA, XACT, LDA, 00457 $ RWORK, RWORK( NRHS+1 ), RESULT( 4 ) ) 00458 NT = 5 00459 END IF 00460 * 00461 * Print information about the tests that did not pass 00462 * the threshold. 00463 * 00464 DO 100 K = K1, NT 00465 IF( RESULT( K ).GE.THRESH ) THEN 00466 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) 00467 $ CALL ALADHD( NOUT, PATH ) 00468 WRITE( NOUT, FMT = 9998 )'ZGTSVX', FACT, TRANS, 00469 $ N, IMAT, K, RESULT( K ) 00470 NFAIL = NFAIL + 1 00471 END IF 00472 100 CONTINUE 00473 * 00474 * Check the reciprocal of the condition number. 00475 * 00476 RESULT( 6 ) = DGET06( RCOND, RCONDC ) 00477 IF( RESULT( 6 ).GE.THRESH ) THEN 00478 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) 00479 $ CALL ALADHD( NOUT, PATH ) 00480 WRITE( NOUT, FMT = 9998 )'ZGTSVX', FACT, TRANS, N, 00481 $ IMAT, K, RESULT( K ) 00482 NFAIL = NFAIL + 1 00483 END IF 00484 NRUN = NRUN + NT - K1 + 2 00485 * 00486 110 CONTINUE 00487 120 CONTINUE 00488 130 CONTINUE 00489 140 CONTINUE 00490 * 00491 * Print a summary of the results. 00492 * 00493 CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS ) 00494 * 00495 9999 FORMAT( 1X, A, ', N =', I5, ', type ', I2, ', test ', I2, 00496 $ ', ratio = ', G12.5 ) 00497 9998 FORMAT( 1X, A, ', FACT=''', A1, ''', TRANS=''', A1, ''', N =', 00498 $ I5, ', type ', I2, ', test ', I2, ', ratio = ', G12.5 ) 00499 RETURN 00500 * 00501 * End of ZDRVGT 00502 * 00503 END