169      SUBROUTINE ddrvgb( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, A, LA,
 
  170     $                   AFB, LAFB, ASAV, B, BSAV, X, XACT, S, WORK,
 
  171     $                   RWORK, IWORK, NOUT )
 
  179      INTEGER            LA, LAFB, NN, NOUT, NRHS
 
  180      DOUBLE PRECISION   THRESH
 
  184      INTEGER            IWORK( * ), NVAL( * )
 
  185      DOUBLE PRECISION   A( * ), AFB( * ), ASAV( * ), B( * ), BSAV( * ),
 
  186     $                   rwork( * ), s( * ), work( * ), x( * ),
 
  193      DOUBLE PRECISION   ONE, ZERO
 
  194      PARAMETER          ( ONE = 1.0d+0, zero = 0.0d+0 )
 
  196      parameter( ntypes = 8 )
 
  198      parameter( ntests = 7 )
 
  200      parameter( ntran = 3 )
 
  203      LOGICAL            EQUIL, NOFACT, PREFAC, TRFCON, ZEROT
 
  204      CHARACTER          DIST, EQUED, FACT, TRANS, 
TYPE, XTYPE
 
  206      INTEGER            I, I1, I2, IEQUED, IFACT, IKL, IKU, IMAT, IN,
 
  207     $                   info, ioff, itran, izero, j, k, k1, kl, ku,
 
  208     $                   lda, ldafb, ldb, mode, n, nb, nbmin, nerrs,
 
  209     $                   nfact, nfail, nimat, nkl, nku, nrun, nt
 
  210      DOUBLE PRECISION   AINVNM, AMAX, ANORM, ANORMI, ANORMO, ANRMPV,
 
  211     $                   CNDNUM, COLCND, RCOND, RCONDC, RCONDI, RCONDO,
 
  212     $                   roldc, roldi, roldo, rowcnd, rpvgrw
 
  215      CHARACTER          EQUEDS( 4 ), FACTS( 3 ), TRANSS( NTRAN )
 
  216      INTEGER            ISEED( 4 ), ISEEDY( 4 )
 
  217      DOUBLE PRECISION   RESULT( NTESTS )
 
  221      DOUBLE PRECISION   DGET06, DLAMCH, DLANGB, DLANGE, DLANTB
 
  222      EXTERNAL           lsame, dget06, dlamch, dlangb, dlange, dlantb
 
  231      INTRINSIC          abs, max, min
 
  239      COMMON             / infoc / infot, nunit, ok, lerr
 
  240      COMMON             / srnamc / srnamt
 
  243      DATA               iseedy / 1988, 1989, 1990, 1991 /
 
  244      DATA               transs / 
'N', 
'T', 
'C' /
 
  245      DATA               facts / 
'F', 
'N', 
'E' /
 
  246      DATA               equeds / 
'N', 
'R', 
'C', 
'B' /
 
  252      path( 1: 1 ) = 
'Double precision' 
  258         iseed( i ) = iseedy( i )
 
  264     $   
CALL derrvx( path, nout )
 
  283         nkl = max( 1, min( n, 4 ) )
 
  298            ELSE IF( ikl.EQ.2 ) 
THEN 
  300            ELSE IF( ikl.EQ.3 ) 
THEN 
  302            ELSE IF( ikl.EQ.4 ) 
THEN 
  313               ELSE IF( iku.EQ.2 ) 
THEN 
  315               ELSE IF( iku.EQ.3 ) 
THEN 
  317               ELSE IF( iku.EQ.4 ) 
THEN 
  325               ldafb = 2*kl + ku + 1
 
  326               IF( lda*n.GT.la .OR. ldafb*n.GT.lafb ) 
THEN 
  327                  IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
 
  328     $               
CALL aladhd( nout, path )
 
  329                  IF( lda*n.GT.la ) 
THEN 
  330                     WRITE( nout, fmt = 9999 )la, n, kl, ku,
 
  334                  IF( ldafb*n.GT.lafb ) 
THEN 
  335                     WRITE( nout, fmt = 9998 )lafb, n, kl, ku,
 
  342               DO 120 imat = 1, nimat
 
  346                  IF( .NOT.dotype( imat ) )
 
  351                  zerot = imat.GE.2 .AND. imat.LE.4
 
  352                  IF( zerot .AND. n.LT.imat-1 )
 
  358                  CALL dlatb4( path, imat, n, n, 
TYPE, kl, ku, anorm,
 
  359     $                         mode, cndnum, dist )
 
  360                  rcondc = one / cndnum
 
  363                  CALL dlatms( n, n, dist, iseed, 
TYPE, rwork, mode,
 
  364     $                         cndnum, anorm, kl, ku, 
'Z', a, lda, work,
 
  370                     CALL alaerh( path, 
'DLATMS', info, 0, 
' ', n, n,
 
  371     $                            kl, ku, -1, imat, nfail, nerrs, nout )
 
  382                     ELSE IF( imat.EQ.3 ) 
THEN 
  387                     ioff = ( izero-1 )*lda
 
  389                        i1 = max( 1, ku+2-izero )
 
  390                        i2 = min( kl+ku+1, ku+1+( n-izero ) )
 
  396                           DO 30 i = max( 1, ku+2-j ),
 
  397     $                             min( kl+ku+1, ku+1+( n-j ) )
 
  407                  CALL dlacpy( 
'Full', kl+ku+1, n, a, lda, asav, lda )
 
  410                     equed = equeds( iequed )
 
  411                     IF( iequed.EQ.1 ) 
THEN 
  417                     DO 100 ifact = 1, nfact
 
  418                        fact = facts( ifact )
 
  419                        prefac = lsame( fact, 
'F' )
 
  420                        nofact = lsame( fact, 
'N' )
 
  421                        equil = lsame( fact, 
'E' )
 
  429                        ELSE IF( .NOT.nofact ) 
THEN 
  436                           CALL dlacpy( 
'Full', kl+ku+1, n, asav, lda,
 
  437     $                                  afb( kl+1 ), ldafb )
 
  438                           IF( equil .OR. iequed.GT.1 ) 
THEN 
  443                              CALL dgbequ( n, n, kl, ku, afb( kl+1 ),
 
  444     $                                     ldafb, s, s( n+1 ), rowcnd,
 
  445     $                                     colcnd, amax, info )
 
  446                              IF( info.EQ.0 .AND. n.GT.0 ) 
THEN 
  447                                 IF( lsame( equed, 
'R' ) ) 
THEN 
  450                                 ELSE IF( lsame( equed, 
'C' ) ) 
THEN 
  453                                 ELSE IF( lsame( equed, 
'B' ) ) 
THEN 
  460                                 CALL dlaqgb( n, n, kl, ku, afb( kl+1 ),
 
  461     $                                        ldafb, s, s( n+1 ),
 
  462     $                                        rowcnd, colcnd, amax,
 
  477                           anormo = dlangb( 
'1', n, kl, ku, afb( kl+1 ),
 
  479                           anormi = dlangb( 
'I', n, kl, ku, afb( kl+1 ),
 
  484                           CALL dgbtrf( n, n, kl, ku, afb, ldafb, iwork,
 
  489                           CALL dlaset( 
'Full', n, n, zero, one, work,
 
  492                           CALL dgbtrs( 
'No transpose', n, kl, ku, n,
 
  493     $                                  afb, ldafb, iwork, work, ldb,
 
  498                           ainvnm = dlange( 
'1', n, n, work, ldb,
 
  500                           IF( anormo.LE.zero .OR. ainvnm.LE.zero ) 
THEN 
  503                              rcondo = ( one / anormo ) / ainvnm
 
  509                           ainvnm = dlange( 
'I', n, n, work, ldb,
 
  511                           IF( anormi.LE.zero .OR. ainvnm.LE.zero ) 
THEN 
  514                              rcondi = ( one / anormi ) / ainvnm
 
  518                        DO 90 itran = 1, ntran
 
  522                           trans = transs( itran )
 
  523                           IF( itran.EQ.1 ) 
THEN 
  531                           CALL dlacpy( 
'Full', kl+ku+1, n, asav, lda,
 
  538                           CALL dlarhs( path, xtype, 
'Full', trans, n,
 
  539     $                                  n, kl, ku, nrhs, a, lda, xact,
 
  540     $                                  ldb, b, ldb, iseed, info )
 
  542                           CALL dlacpy( 
'Full', n, nrhs, b, ldb, bsav,
 
  545                           IF( nofact .AND. itran.EQ.1 ) 
THEN 
  552                              CALL dlacpy( 
'Full', kl+ku+1, n, a, lda,
 
  553     $                                     afb( kl+1 ), ldafb )
 
  554                              CALL dlacpy( 
'Full', n, nrhs, b, ldb, x,
 
  558                              CALL dgbsv( n, kl, ku, nrhs, afb, ldafb,
 
  559     $                                    iwork, x, ldb, info )
 
  564     $                           
CALL alaerh( path, 
'DGBSV ', info,
 
  565     $                                        izero, 
' ', n, n, kl, ku,
 
  566     $                                        nrhs, imat, nfail, nerrs,
 
  572                              CALL dgbt01( n, n, kl, ku, a, lda, afb,
 
  573     $                                     ldafb, iwork, work,
 
  576                              IF( izero.EQ.0 ) 
THEN 
  581                                 CALL dlacpy( 
'Full', n, nrhs, b, ldb,
 
  583                                 CALL dgbt02( 
'No transpose', n, n, kl,
 
  584     $                                        ku, nrhs, a, lda, x, ldb,
 
  591                                 CALL dget04( n, nrhs, x, ldb, xact,
 
  592     $                                        ldb, rcondc, result( 3 ) )
 
  600                                 IF( result( k ).GE.thresh ) 
THEN 
  601                                    IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
 
  602     $                                 
CALL aladhd( nout, path )
 
  603                                    WRITE( nout, fmt = 9997 )
'DGBSV ',
 
  604     $                                 n, kl, ku, imat, k, result( k )
 
  614     $                        
CALL dlaset( 
'Full', 2*kl+ku+1, n, zero,
 
  616                           CALL dlaset( 
'Full', n, nrhs, zero, zero, x,
 
  618                           IF( iequed.GT.1 .AND. n.GT.0 ) 
THEN 
  623                              CALL dlaqgb( n, n, kl, ku, a, lda, s,
 
  624     $                                     s( n+1 ), rowcnd, colcnd,
 
  632                           CALL dgbsvx( fact, trans, n, kl, ku, nrhs, a,
 
  633     $                                  lda, afb, ldafb, iwork, equed,
 
  634     $                                  s, s( n+1 ), b, ldb, x, ldb,
 
  635     $                                  rcond, rwork, rwork( nrhs+1 ),
 
  636     $                                  work, iwork( n+1 ), info )
 
  641     $                        
CALL alaerh( path, 
'DGBSVX', info, izero,
 
  642     $                                     fact // trans, n, n, kl, ku,
 
  643     $                                     nrhs, imat, nfail, nerrs,
 
  649                           IF( info.NE.0 .AND. info.LE.n) 
THEN 
  652                                 DO 60 i = max( ku+2-j, 1 ),
 
  653     $                                   min( n+ku+1-j, kl+ku+1 )
 
  654                                    anrmpv = max( anrmpv,
 
  655     $                                       abs( a( i+( j-1 )*lda ) ) )
 
  658                              rpvgrw = dlantb( 
'M', 
'U', 
'N', info,
 
  659     $                                 min( info-1, kl+ku ),
 
  660     $                                 afb( max( 1, kl+ku+2-info ) ),
 
  662                              IF( rpvgrw.EQ.zero ) 
THEN 
  665                                 rpvgrw = anrmpv / rpvgrw
 
  668                              rpvgrw = dlantb( 
'M', 
'U', 
'N', n, kl+ku,
 
  670                              IF( rpvgrw.EQ.zero ) 
THEN 
  673                                 rpvgrw = dlangb( 
'M', n, kl, ku, a,
 
  674     $                                    lda, work ) / rpvgrw
 
  677                           result( 7 ) = abs( rpvgrw-work( 1 ) ) /
 
  678     $                                   max( work( 1 ), rpvgrw ) /
 
  681                           IF( .NOT.prefac ) 
THEN 
  686                              CALL dgbt01( n, n, kl, ku, a, lda, afb,
 
  687     $                                     ldafb, iwork, work,
 
  699                              CALL dlacpy( 
'Full', n, nrhs, bsav, ldb,
 
  701                              CALL dgbt02( trans, n, n, kl, ku, nrhs,
 
  702     $                                     asav, lda, x, ldb, work, ldb,
 
  709                              IF( nofact .OR. ( prefac .AND.
 
  710     $                            lsame( equed, 
'N' ) ) ) 
THEN 
  711                                 CALL dget04( n, nrhs, x, ldb, xact,
 
  712     $                                        ldb, rcondc, result( 3 ) )
 
  714                                 IF( itran.EQ.1 ) 
THEN 
  719                                 CALL dget04( n, nrhs, x, ldb, xact,
 
  720     $                                        ldb, roldc, result( 3 ) )
 
  726                              CALL dgbt05( trans, n, kl, ku, nrhs, asav,
 
  727     $                                     lda, b, ldb, x, ldb, xact,
 
  728     $                                     ldb, rwork, rwork( nrhs+1 ),
 
  737                           result( 6 ) = dget06( rcond, rcondc )
 
  742                           IF( .NOT.trfcon ) 
THEN 
  744                                 IF( result( k ).GE.thresh ) 
THEN 
  745                                    IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
 
  746     $                                 
CALL aladhd( nout, path )
 
  748                                       WRITE( nout, fmt = 9995 )
 
  749     $                                    
'DGBSVX', fact, trans, n, kl,
 
  750     $                                    ku, equed, imat, k,
 
  753                                       WRITE( nout, fmt = 9996 )
 
  754     $                                    
'DGBSVX', fact, trans, n, kl,
 
  755     $                                    ku, imat, k, result( k )
 
  760                              nrun = nrun + ntests - k1 + 1
 
  762                              IF( result( 1 ).GE.thresh .AND. .NOT.
 
  764                                 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
 
  765     $                              
CALL aladhd( nout, path )
 
  767                                    WRITE( nout, fmt = 9995 )
'DGBSVX',
 
  768     $                                 fact, trans, n, kl, ku, equed,
 
  769     $                                 imat, 1, result( 1 )
 
  771                                    WRITE( nout, fmt = 9996 )
'DGBSVX',
 
  772     $                                 fact, trans, n, kl, ku, imat, 1,
 
  778                              IF( result( 6 ).GE.thresh ) 
THEN 
  779                                 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
 
  780     $                              
CALL aladhd( nout, path )
 
  782                                    WRITE( nout, fmt = 9995 )
'DGBSVX',
 
  783     $                                 fact, trans, n, kl, ku, equed,
 
  784     $                                 imat, 6, result( 6 )
 
  786                                    WRITE( nout, fmt = 9996 )
'DGBSVX',
 
  787     $                                 fact, trans, n, kl, ku, imat, 6,
 
  793                              IF( result( 7 ).GE.thresh ) 
THEN 
  794                                 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
 
  795     $                              
CALL aladhd( nout, path )
 
  797                                    WRITE( nout, fmt = 9995 )
'DGBSVX',
 
  798     $                                 fact, trans, n, kl, ku, equed,
 
  799     $                                 imat, 7, result( 7 )
 
  801                                    WRITE( nout, fmt = 9996 )
'DGBSVX',
 
  802     $                                 fact, trans, n, kl, ku, imat, 7,
 
  820      CALL alasvm( path, nout, nfail, nrun, nerrs )
 
  822 9999 
FORMAT( 
' *** In DDRVGB, LA=', i5, 
' is too small for N=', i5,
 
  823     $      
', KU=', i5, 
', KL=', i5, / 
' ==> Increase LA to at least ',
 
  825 9998 
FORMAT( 
' *** In DDRVGB, LAFB=', i5, 
' is too small for N=', i5,
 
  826     $      
', KU=', i5, 
', KL=', i5, /
 
  827     $      
' ==> Increase LAFB to at least ', i5 )
 
  828 9997 
FORMAT( 1x, a, 
', N=', i5, 
', KL=', i5, 
', KU=', i5, 
', type ',
 
  829     $      i1, 
', test(', i1, 
')=', g12.5 )
 
  830 9996 
FORMAT( 1x, a, 
'( ''', a1, 
''',''', a1, 
''',', i5, 
',', i5, 
',',
 
  831     $      i5, 
',...), type ', i1, 
', test(', i1, 
')=', g12.5 )
 
  832 9995 
FORMAT( 1x, a, 
'( ''', a1, 
''',''', a1, 
''',', i5, 
',', i5, 
',',
 
  833     $      i5, 
',...), EQUED=''', a1, 
''', type ', i1, 
', test(', i1,