1*> \brief \b DCHKGB 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8* Definition: 9* =========== 10* 11* SUBROUTINE DCHKGB( DOTYPE, NM, MVAL, NN, NVAL, NNB, NBVAL, NNS, 12* NSVAL, THRESH, TSTERR, A, LA, AFAC, LAFAC, B, 13* X, XACT, WORK, RWORK, IWORK, NOUT ) 14* 15* .. Scalar Arguments .. 16* LOGICAL TSTERR 17* INTEGER LA, LAFAC, NM, NN, NNB, NNS, NOUT 18* DOUBLE PRECISION THRESH 19* .. 20* .. Array Arguments .. 21* LOGICAL DOTYPE( * ) 22* INTEGER IWORK( * ), MVAL( * ), NBVAL( * ), NSVAL( * ), 23* $ NVAL( * ) 24* DOUBLE PRECISION A( * ), AFAC( * ), B( * ), RWORK( * ), 25* $ WORK( * ), X( * ), XACT( * ) 26* .. 27* 28* 29*> \par Purpose: 30* ============= 31*> 32*> \verbatim 33*> 34*> DCHKGB tests DGBTRF, -TRS, -RFS, and -CON 35*> \endverbatim 36* 37* Arguments: 38* ========== 39* 40*> \param[in] DOTYPE 41*> \verbatim 42*> DOTYPE is LOGICAL array, dimension (NTYPES) 43*> The matrix types to be used for testing. Matrices of type j 44*> (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) = 45*> .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used. 46*> \endverbatim 47*> 48*> \param[in] NM 49*> \verbatim 50*> NM is INTEGER 51*> The number of values of M contained in the vector MVAL. 52*> \endverbatim 53*> 54*> \param[in] MVAL 55*> \verbatim 56*> MVAL is INTEGER array, dimension (NM) 57*> The values of the matrix row dimension M. 58*> \endverbatim 59*> 60*> \param[in] NN 61*> \verbatim 62*> NN is INTEGER 63*> The number of values of N contained in the vector NVAL. 64*> \endverbatim 65*> 66*> \param[in] NVAL 67*> \verbatim 68*> NVAL is INTEGER array, dimension (NN) 69*> The values of the matrix column dimension N. 70*> \endverbatim 71*> 72*> \param[in] NNB 73*> \verbatim 74*> NNB is INTEGER 75*> The number of values of NB contained in the vector NBVAL. 76*> \endverbatim 77*> 78*> \param[in] NBVAL 79*> \verbatim 80*> NBVAL is INTEGER array, dimension (NNB) 81*> The values of the blocksize NB. 82*> \endverbatim 83*> 84*> \param[in] NNS 85*> \verbatim 86*> NNS is INTEGER 87*> The number of values of NRHS contained in the vector NSVAL. 88*> \endverbatim 89*> 90*> \param[in] NSVAL 91*> \verbatim 92*> NSVAL is INTEGER array, dimension (NNS) 93*> The values of the number of right hand sides NRHS. 94*> \endverbatim 95*> 96*> \param[in] THRESH 97*> \verbatim 98*> THRESH is DOUBLE PRECISION 99*> The threshold value for the test ratios. A result is 100*> included in the output file if RESULT >= THRESH. To have 101*> every test ratio printed, use THRESH = 0. 102*> \endverbatim 103*> 104*> \param[in] TSTERR 105*> \verbatim 106*> TSTERR is LOGICAL 107*> Flag that indicates whether error exits are to be tested. 108*> \endverbatim 109*> 110*> \param[out] A 111*> \verbatim 112*> A is DOUBLE PRECISION array, dimension (LA) 113*> \endverbatim 114*> 115*> \param[in] LA 116*> \verbatim 117*> LA is INTEGER 118*> The length of the array A. LA >= (KLMAX+KUMAX+1)*NMAX 119*> where KLMAX is the largest entry in the local array KLVAL, 120*> KUMAX is the largest entry in the local array KUVAL and 121*> NMAX is the largest entry in the input array NVAL. 122*> \endverbatim 123*> 124*> \param[out] AFAC 125*> \verbatim 126*> AFAC is DOUBLE PRECISION array, dimension (LAFAC) 127*> \endverbatim 128*> 129*> \param[in] LAFAC 130*> \verbatim 131*> LAFAC is INTEGER 132*> The length of the array AFAC. LAFAC >= (2*KLMAX+KUMAX+1)*NMAX 133*> where KLMAX is the largest entry in the local array KLVAL, 134*> KUMAX is the largest entry in the local array KUVAL and 135*> NMAX is the largest entry in the input array NVAL. 136*> \endverbatim 137*> 138*> \param[out] B 139*> \verbatim 140*> B is DOUBLE PRECISION array, dimension (NMAX*NSMAX) 141*> where NSMAX is the largest entry in NSVAL. 142*> \endverbatim 143*> 144*> \param[out] X 145*> \verbatim 146*> X is DOUBLE PRECISION array, dimension (NMAX*NSMAX) 147*> \endverbatim 148*> 149*> \param[out] XACT 150*> \verbatim 151*> XACT is DOUBLE PRECISION array, dimension (NMAX*NSMAX) 152*> \endverbatim 153*> 154*> \param[out] WORK 155*> \verbatim 156*> WORK is DOUBLE PRECISION array, dimension 157*> (NMAX*max(3,NSMAX,NMAX)) 158*> \endverbatim 159*> 160*> \param[out] RWORK 161*> \verbatim 162*> RWORK is DOUBLE PRECISION array, dimension 163*> (NMAX+2*NSMAX) 164*> \endverbatim 165*> 166*> \param[out] IWORK 167*> \verbatim 168*> IWORK is INTEGER array, dimension (2*NMAX) 169*> \endverbatim 170*> 171*> \param[in] NOUT 172*> \verbatim 173*> NOUT is INTEGER 174*> The unit number for output. 175*> \endverbatim 176* 177* Authors: 178* ======== 179* 180*> \author Univ. of Tennessee 181*> \author Univ. of California Berkeley 182*> \author Univ. of Colorado Denver 183*> \author NAG Ltd. 184* 185*> \ingroup double_lin 186* 187* ===================================================================== 188 SUBROUTINE DCHKGB( DOTYPE, NM, MVAL, NN, NVAL, NNB, NBVAL, NNS, 189 $ NSVAL, THRESH, TSTERR, A, LA, AFAC, LAFAC, B, 190 $ X, XACT, WORK, RWORK, IWORK, NOUT ) 191* 192* -- LAPACK test routine -- 193* -- LAPACK is a software package provided by Univ. of Tennessee, -- 194* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 195* 196* .. Scalar Arguments .. 197 LOGICAL TSTERR 198 INTEGER LA, LAFAC, NM, NN, NNB, NNS, NOUT 199 DOUBLE PRECISION THRESH 200* .. 201* .. Array Arguments .. 202 LOGICAL DOTYPE( * ) 203 INTEGER IWORK( * ), MVAL( * ), NBVAL( * ), NSVAL( * ), 204 $ NVAL( * ) 205 DOUBLE PRECISION A( * ), AFAC( * ), B( * ), RWORK( * ), 206 $ WORK( * ), X( * ), XACT( * ) 207* .. 208* 209* ===================================================================== 210* 211* .. Parameters .. 212 DOUBLE PRECISION ONE, ZERO 213 PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) 214 INTEGER NTYPES, NTESTS 215 PARAMETER ( NTYPES = 8, NTESTS = 7 ) 216 INTEGER NBW, NTRAN 217 PARAMETER ( NBW = 4, NTRAN = 3 ) 218* .. 219* .. Local Scalars .. 220 LOGICAL TRFCON, ZEROT 221 CHARACTER DIST, NORM, TRANS, TYPE, XTYPE 222 CHARACTER*3 PATH 223 INTEGER I, I1, I2, IKL, IKU, IM, IMAT, IN, INB, INFO, 224 $ IOFF, IRHS, ITRAN, IZERO, J, K, KL, KOFF, KU, 225 $ LDA, LDAFAC, LDB, M, MODE, N, NB, NERRS, NFAIL, 226 $ NIMAT, NKL, NKU, NRHS, NRUN 227 DOUBLE PRECISION AINVNM, ANORM, ANORMI, ANORMO, CNDNUM, RCOND, 228 $ RCONDC, RCONDI, RCONDO 229* .. 230* .. Local Arrays .. 231 CHARACTER TRANSS( NTRAN ) 232 INTEGER ISEED( 4 ), ISEEDY( 4 ), KLVAL( NBW ), 233 $ KUVAL( NBW ) 234 DOUBLE PRECISION RESULT( NTESTS ) 235* .. 236* .. External Functions .. 237 DOUBLE PRECISION DGET06, DLANGB, DLANGE 238 EXTERNAL DGET06, DLANGB, DLANGE 239* .. 240* .. External Subroutines .. 241 EXTERNAL ALAERH, ALAHD, ALASUM, DCOPY, DERRGE, DGBCON, 242 $ DGBRFS, DGBT01, DGBT02, DGBT05, DGBTRF, DGBTRS, 243 $ DGET04, DLACPY, DLARHS, DLASET, DLATB4, DLATMS, 244 $ XLAENV 245* .. 246* .. Intrinsic Functions .. 247 INTRINSIC MAX, MIN 248* .. 249* .. Scalars in Common .. 250 LOGICAL LERR, OK 251 CHARACTER*32 SRNAMT 252 INTEGER INFOT, NUNIT 253* .. 254* .. Common blocks .. 255 COMMON / INFOC / INFOT, NUNIT, OK, LERR 256 COMMON / SRNAMC / SRNAMT 257* .. 258* .. Data statements .. 259 DATA ISEEDY / 1988, 1989, 1990, 1991 / , 260 $ TRANSS / 'N', 'T', 'C' / 261* .. 262* .. Executable Statements .. 263* 264* Initialize constants and the random number seed. 265* 266 PATH( 1: 1 ) = 'Double precision' 267 PATH( 2: 3 ) = 'GB' 268 NRUN = 0 269 NFAIL = 0 270 NERRS = 0 271 DO 10 I = 1, 4 272 ISEED( I ) = ISEEDY( I ) 273 10 CONTINUE 274* 275* Test the error exits 276* 277 IF( TSTERR ) 278 $ CALL DERRGE( PATH, NOUT ) 279 INFOT = 0 280 CALL XLAENV( 2, 2 ) 281* 282* Initialize the first value for the lower and upper bandwidths. 283* 284 KLVAL( 1 ) = 0 285 KUVAL( 1 ) = 0 286* 287* Do for each value of M in MVAL 288* 289 DO 160 IM = 1, NM 290 M = MVAL( IM ) 291* 292* Set values to use for the lower bandwidth. 293* 294 KLVAL( 2 ) = M + ( M+1 ) / 4 295* 296* KLVAL( 2 ) = MAX( M-1, 0 ) 297* 298 KLVAL( 3 ) = ( 3*M-1 ) / 4 299 KLVAL( 4 ) = ( M+1 ) / 4 300* 301* Do for each value of N in NVAL 302* 303 DO 150 IN = 1, NN 304 N = NVAL( IN ) 305 XTYPE = 'N' 306* 307* Set values to use for the upper bandwidth. 308* 309 KUVAL( 2 ) = N + ( N+1 ) / 4 310* 311* KUVAL( 2 ) = MAX( N-1, 0 ) 312* 313 KUVAL( 3 ) = ( 3*N-1 ) / 4 314 KUVAL( 4 ) = ( N+1 ) / 4 315* 316* Set limits on the number of loop iterations. 317* 318 NKL = MIN( M+1, 4 ) 319 IF( N.EQ.0 ) 320 $ NKL = 2 321 NKU = MIN( N+1, 4 ) 322 IF( M.EQ.0 ) 323 $ NKU = 2 324 NIMAT = NTYPES 325 IF( M.LE.0 .OR. N.LE.0 ) 326 $ NIMAT = 1 327* 328 DO 140 IKL = 1, NKL 329* 330* Do for KL = 0, (5*M+1)/4, (3M-1)/4, and (M+1)/4. This 331* order makes it easier to skip redundant values for small 332* values of M. 333* 334 KL = KLVAL( IKL ) 335 DO 130 IKU = 1, NKU 336* 337* Do for KU = 0, (5*N+1)/4, (3N-1)/4, and (N+1)/4. This 338* order makes it easier to skip redundant values for 339* small values of N. 340* 341 KU = KUVAL( IKU ) 342* 343* Check that A and AFAC are big enough to generate this 344* matrix. 345* 346 LDA = KL + KU + 1 347 LDAFAC = 2*KL + KU + 1 348 IF( ( LDA*N ).GT.LA .OR. ( LDAFAC*N ).GT.LAFAC ) THEN 349 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) 350 $ CALL ALAHD( NOUT, PATH ) 351 IF( N*( KL+KU+1 ).GT.LA ) THEN 352 WRITE( NOUT, FMT = 9999 )LA, M, N, KL, KU, 353 $ N*( KL+KU+1 ) 354 NERRS = NERRS + 1 355 END IF 356 IF( N*( 2*KL+KU+1 ).GT.LAFAC ) THEN 357 WRITE( NOUT, FMT = 9998 )LAFAC, M, N, KL, KU, 358 $ N*( 2*KL+KU+1 ) 359 NERRS = NERRS + 1 360 END IF 361 GO TO 130 362 END IF 363* 364 DO 120 IMAT = 1, NIMAT 365* 366* Do the tests only if DOTYPE( IMAT ) is true. 367* 368 IF( .NOT.DOTYPE( IMAT ) ) 369 $ GO TO 120 370* 371* Skip types 2, 3, or 4 if the matrix size is too 372* small. 373* 374 ZEROT = IMAT.GE.2 .AND. IMAT.LE.4 375 IF( ZEROT .AND. N.LT.IMAT-1 ) 376 $ GO TO 120 377* 378 IF( .NOT.ZEROT .OR. .NOT.DOTYPE( 1 ) ) THEN 379* 380* Set up parameters with DLATB4 and generate a 381* test matrix with DLATMS. 382* 383 CALL DLATB4( PATH, IMAT, M, N, TYPE, KL, KU, 384 $ ANORM, MODE, CNDNUM, DIST ) 385* 386 KOFF = MAX( 1, KU+2-N ) 387 DO 20 I = 1, KOFF - 1 388 A( I ) = ZERO 389 20 CONTINUE 390 SRNAMT = 'DLATMS' 391 CALL DLATMS( M, N, DIST, ISEED, TYPE, RWORK, 392 $ MODE, CNDNUM, ANORM, KL, KU, 'Z', 393 $ A( KOFF ), LDA, WORK, INFO ) 394* 395* Check the error code from DLATMS. 396* 397 IF( INFO.NE.0 ) THEN 398 CALL ALAERH( PATH, 'DLATMS', INFO, 0, ' ', M, 399 $ N, KL, KU, -1, IMAT, NFAIL, 400 $ NERRS, NOUT ) 401 GO TO 120 402 END IF 403 ELSE IF( IZERO.GT.0 ) THEN 404* 405* Use the same matrix for types 3 and 4 as for 406* type 2 by copying back the zeroed out column. 407* 408 CALL DCOPY( I2-I1+1, B, 1, A( IOFF+I1 ), 1 ) 409 END IF 410* 411* For types 2, 3, and 4, zero one or more columns of 412* the matrix to test that INFO is returned correctly. 413* 414 IZERO = 0 415 IF( ZEROT ) THEN 416 IF( IMAT.EQ.2 ) THEN 417 IZERO = 1 418 ELSE IF( IMAT.EQ.3 ) THEN 419 IZERO = MIN( M, N ) 420 ELSE 421 IZERO = MIN( M, N ) / 2 + 1 422 END IF 423 IOFF = ( IZERO-1 )*LDA 424 IF( IMAT.LT.4 ) THEN 425* 426* Store the column to be zeroed out in B. 427* 428 I1 = MAX( 1, KU+2-IZERO ) 429 I2 = MIN( KL+KU+1, KU+1+( M-IZERO ) ) 430 CALL DCOPY( I2-I1+1, A( IOFF+I1 ), 1, B, 1 ) 431* 432 DO 30 I = I1, I2 433 A( IOFF+I ) = ZERO 434 30 CONTINUE 435 ELSE 436 DO 50 J = IZERO, N 437 DO 40 I = MAX( 1, KU+2-J ), 438 $ MIN( KL+KU+1, KU+1+( M-J ) ) 439 A( IOFF+I ) = ZERO 440 40 CONTINUE 441 IOFF = IOFF + LDA 442 50 CONTINUE 443 END IF 444 END IF 445* 446* These lines, if used in place of the calls in the 447* loop over INB, cause the code to bomb on a Sun 448* SPARCstation. 449* 450* ANORMO = DLANGB( 'O', N, KL, KU, A, LDA, RWORK ) 451* ANORMI = DLANGB( 'I', N, KL, KU, A, LDA, RWORK ) 452* 453* Do for each blocksize in NBVAL 454* 455 DO 110 INB = 1, NNB 456 NB = NBVAL( INB ) 457 CALL XLAENV( 1, NB ) 458* 459* Compute the LU factorization of the band matrix. 460* 461 IF( M.GT.0 .AND. N.GT.0 ) 462 $ CALL DLACPY( 'Full', KL+KU+1, N, A, LDA, 463 $ AFAC( KL+1 ), LDAFAC ) 464 SRNAMT = 'DGBTRF' 465 CALL DGBTRF( M, N, KL, KU, AFAC, LDAFAC, IWORK, 466 $ INFO ) 467* 468* Check error code from DGBTRF. 469* 470 IF( INFO.NE.IZERO ) 471 $ CALL ALAERH( PATH, 'DGBTRF', INFO, IZERO, 472 $ ' ', M, N, KL, KU, NB, IMAT, 473 $ NFAIL, NERRS, NOUT ) 474 TRFCON = .FALSE. 475* 476*+ TEST 1 477* Reconstruct matrix from factors and compute 478* residual. 479* 480 CALL DGBT01( M, N, KL, KU, A, LDA, AFAC, LDAFAC, 481 $ IWORK, WORK, RESULT( 1 ) ) 482* 483* Print information about the tests so far that 484* did not pass the threshold. 485* 486 IF( RESULT( 1 ).GE.THRESH ) THEN 487 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) 488 $ CALL ALAHD( NOUT, PATH ) 489 WRITE( NOUT, FMT = 9997 )M, N, KL, KU, NB, 490 $ IMAT, 1, RESULT( 1 ) 491 NFAIL = NFAIL + 1 492 END IF 493 NRUN = NRUN + 1 494* 495* Skip the remaining tests if this is not the 496* first block size or if M .ne. N. 497* 498 IF( INB.GT.1 .OR. M.NE.N ) 499 $ GO TO 110 500* 501 ANORMO = DLANGB( 'O', N, KL, KU, A, LDA, RWORK ) 502 ANORMI = DLANGB( 'I', N, KL, KU, A, LDA, RWORK ) 503* 504 IF( INFO.EQ.0 ) THEN 505* 506* Form the inverse of A so we can get a good 507* estimate of CNDNUM = norm(A) * norm(inv(A)). 508* 509 LDB = MAX( 1, N ) 510 CALL DLASET( 'Full', N, N, ZERO, ONE, WORK, 511 $ LDB ) 512 SRNAMT = 'DGBTRS' 513 CALL DGBTRS( 'No transpose', N, KL, KU, N, 514 $ AFAC, LDAFAC, IWORK, WORK, LDB, 515 $ INFO ) 516* 517* Compute the 1-norm condition number of A. 518* 519 AINVNM = DLANGE( 'O', N, N, WORK, LDB, 520 $ RWORK ) 521 IF( ANORMO.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN 522 RCONDO = ONE 523 ELSE 524 RCONDO = ( ONE / ANORMO ) / AINVNM 525 END IF 526* 527* Compute the infinity-norm condition number of 528* A. 529* 530 AINVNM = DLANGE( 'I', N, N, WORK, LDB, 531 $ RWORK ) 532 IF( ANORMI.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN 533 RCONDI = ONE 534 ELSE 535 RCONDI = ( ONE / ANORMI ) / AINVNM 536 END IF 537 ELSE 538* 539* Do only the condition estimate if INFO.NE.0. 540* 541 TRFCON = .TRUE. 542 RCONDO = ZERO 543 RCONDI = ZERO 544 END IF 545* 546* Skip the solve tests if the matrix is singular. 547* 548 IF( TRFCON ) 549 $ GO TO 90 550* 551 DO 80 IRHS = 1, NNS 552 NRHS = NSVAL( IRHS ) 553 XTYPE = 'N' 554* 555 DO 70 ITRAN = 1, NTRAN 556 TRANS = TRANSS( ITRAN ) 557 IF( ITRAN.EQ.1 ) THEN 558 RCONDC = RCONDO 559 NORM = 'O' 560 ELSE 561 RCONDC = RCONDI 562 NORM = 'I' 563 END IF 564* 565*+ TEST 2: 566* Solve and compute residual for op(A) * X = B. 567* 568 SRNAMT = 'DLARHS' 569 CALL DLARHS( PATH, XTYPE, ' ', TRANS, N, 570 $ N, KL, KU, NRHS, A, LDA, 571 $ XACT, LDB, B, LDB, ISEED, 572 $ INFO ) 573 XTYPE = 'C' 574 CALL DLACPY( 'Full', N, NRHS, B, LDB, X, 575 $ LDB ) 576* 577 SRNAMT = 'DGBTRS' 578 CALL DGBTRS( TRANS, N, KL, KU, NRHS, AFAC, 579 $ LDAFAC, IWORK, X, LDB, INFO ) 580* 581* Check error code from DGBTRS. 582* 583 IF( INFO.NE.0 ) 584 $ CALL ALAERH( PATH, 'DGBTRS', INFO, 0, 585 $ TRANS, N, N, KL, KU, -1, 586 $ IMAT, NFAIL, NERRS, NOUT ) 587* 588 CALL DLACPY( 'Full', N, NRHS, B, LDB, 589 $ WORK, LDB ) 590 CALL DGBT02( TRANS, M, N, KL, KU, NRHS, A, 591 $ LDA, X, LDB, WORK, LDB, 592 $ RWORK, RESULT( 2 ) ) 593* 594*+ TEST 3: 595* Check solution from generated exact 596* solution. 597* 598 CALL DGET04( N, NRHS, X, LDB, XACT, LDB, 599 $ RCONDC, RESULT( 3 ) ) 600* 601*+ TESTS 4, 5, 6: 602* Use iterative refinement to improve the 603* solution. 604* 605 SRNAMT = 'DGBRFS' 606 CALL DGBRFS( TRANS, N, KL, KU, NRHS, A, 607 $ LDA, AFAC, LDAFAC, IWORK, B, 608 $ LDB, X, LDB, RWORK, 609 $ RWORK( NRHS+1 ), WORK, 610 $ IWORK( N+1 ), INFO ) 611* 612* Check error code from DGBRFS. 613* 614 IF( INFO.NE.0 ) 615 $ CALL ALAERH( PATH, 'DGBRFS', INFO, 0, 616 $ TRANS, N, N, KL, KU, NRHS, 617 $ IMAT, NFAIL, NERRS, NOUT ) 618* 619 CALL DGET04( N, NRHS, X, LDB, XACT, LDB, 620 $ RCONDC, RESULT( 4 ) ) 621 CALL DGBT05( TRANS, N, KL, KU, NRHS, A, 622 $ LDA, B, LDB, X, LDB, XACT, 623 $ LDB, RWORK, RWORK( NRHS+1 ), 624 $ RESULT( 5 ) ) 625 DO 60 K = 2, 6 626 IF( RESULT( K ).GE.THRESH ) THEN 627 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) 628 $ CALL ALAHD( NOUT, PATH ) 629 WRITE( NOUT, FMT = 9996 )TRANS, N, 630 $ KL, KU, NRHS, IMAT, K, 631 $ RESULT( K ) 632 NFAIL = NFAIL + 1 633 END IF 634 60 CONTINUE 635 NRUN = NRUN + 5 636 70 CONTINUE 637 80 CONTINUE 638* 639*+ TEST 7: 640* Get an estimate of RCOND = 1/CNDNUM. 641* 642 90 CONTINUE 643 DO 100 ITRAN = 1, 2 644 IF( ITRAN.EQ.1 ) THEN 645 ANORM = ANORMO 646 RCONDC = RCONDO 647 NORM = 'O' 648 ELSE 649 ANORM = ANORMI 650 RCONDC = RCONDI 651 NORM = 'I' 652 END IF 653 SRNAMT = 'DGBCON' 654 CALL DGBCON( NORM, N, KL, KU, AFAC, LDAFAC, 655 $ IWORK, ANORM, RCOND, WORK, 656 $ IWORK( N+1 ), INFO ) 657* 658* Check error code from DGBCON. 659* 660 IF( INFO.NE.0 ) 661 $ CALL ALAERH( PATH, 'DGBCON', INFO, 0, 662 $ NORM, N, N, KL, KU, -1, IMAT, 663 $ NFAIL, NERRS, NOUT ) 664* 665 RESULT( 7 ) = DGET06( RCOND, RCONDC ) 666* 667* Print information about the tests that did 668* not pass the threshold. 669* 670 IF( RESULT( 7 ).GE.THRESH ) THEN 671 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) 672 $ CALL ALAHD( NOUT, PATH ) 673 WRITE( NOUT, FMT = 9995 )NORM, N, KL, KU, 674 $ IMAT, 7, RESULT( 7 ) 675 NFAIL = NFAIL + 1 676 END IF 677 NRUN = NRUN + 1 678 100 CONTINUE 679* 680 110 CONTINUE 681 120 CONTINUE 682 130 CONTINUE 683 140 CONTINUE 684 150 CONTINUE 685 160 CONTINUE 686* 687* Print a summary of the results. 688* 689 CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS ) 690* 691 9999 FORMAT( ' *** In DCHKGB, LA=', I5, ' is too small for M=', I5, 692 $ ', N=', I5, ', KL=', I4, ', KU=', I4, 693 $ / ' ==> Increase LA to at least ', I5 ) 694 9998 FORMAT( ' *** In DCHKGB, LAFAC=', I5, ' is too small for M=', I5, 695 $ ', N=', I5, ', KL=', I4, ', KU=', I4, 696 $ / ' ==> Increase LAFAC to at least ', I5 ) 697 9997 FORMAT( ' M =', I5, ', N =', I5, ', KL=', I5, ', KU=', I5, 698 $ ', NB =', I4, ', type ', I1, ', test(', I1, ')=', G12.5 ) 699 9996 FORMAT( ' TRANS=''', A1, ''', N=', I5, ', KL=', I5, ', KU=', I5, 700 $ ', NRHS=', I3, ', type ', I1, ', test(', I1, ')=', G12.5 ) 701 9995 FORMAT( ' NORM =''', A1, ''', N=', I5, ', KL=', I5, ', KU=', I5, 702 $ ',', 10X, ' type ', I1, ', test(', I1, ')=', G12.5 ) 703* 704 RETURN 705* 706* End of DCHKGB 707* 708 END 709