149
  150
  151
  152
  153
  154
  155      LOGICAL            TSTERR
  156      INTEGER            NMAX, NN, NNS, NOUT
  157      DOUBLE PRECISION   THRESH
  158
  159
  160      LOGICAL            DOTYPE( * )
  161      INTEGER            NSVAL( * ), NVAL( * )
  162      DOUBLE PRECISION   RWORK( * )
  163      COMPLEX*16         AB( * ), AINV( * ), B( * ), WORK( * ), X( * ),
  164     $                   XACT( * )
  165
  166
  167
  168
  169
  170      INTEGER            NTYPE1, NTYPES
  171      parameter( ntype1 = 9, ntypes = 17 )
  172      INTEGER            NTESTS
  173      parameter( ntests = 8 )
  174      INTEGER            NTRAN
  175      parameter( ntran = 3 )
  176      DOUBLE PRECISION   ONE, ZERO
  177      parameter( one = 1.0d+0, zero = 0.0d+0 )
  178
  179
  180      CHARACTER          DIAG, NORM, TRANS, UPLO, XTYPE
  181      CHARACTER*3        PATH
  182      INTEGER            I, IDIAG, IK, IMAT, IN, INFO, IRHS, ITRAN,
  183     $                   IUPLO, J, K, KD, LDA, LDAB, N, NERRS, NFAIL,
  184     $                   NIMAT, NIMAT2, NK, NRHS, NRUN
  185      DOUBLE PRECISION   AINVNM, ANORM, RCOND, RCONDC, RCONDI, RCONDO,
  186     $                   SCALE
  187
  188
  189      CHARACTER          TRANSS( NTRAN ), UPLOS( 2 )
  190      INTEGER            ISEED( 4 ), ISEEDY( 4 )
  191      DOUBLE PRECISION   RESULT( NTESTS )
  192
  193
  194      LOGICAL            LSAME
  195      DOUBLE PRECISION   ZLANTB, ZLANTR
  197
  198
  203
  204
  205      LOGICAL            LERR, OK
  206      CHARACTER*32       SRNAMT
  207      INTEGER            INFOT, IOUNIT
  208
  209
  210      COMMON             / infoc / infot, iounit, ok, lerr
  211      COMMON             / srnamc / srnamt
  212
  213
  214      INTRINSIC          dcmplx, max, min
  215
  216
  217      DATA               iseedy / 1988, 1989, 1990, 1991 /
  218      DATA               uplos / 'U', 'L' / , transs / 'N', 'T', 'C' /
  219
  220
  221
  222
  223
  224      path( 1: 1 ) = 'Zomplex precision'
  225      path( 2: 3 ) = 'TB'
  226      nrun = 0
  227      nfail = 0
  228      nerrs = 0
  229      DO 10 i = 1, 4
  230         iseed( i ) = iseedy( i )
  231   10 CONTINUE
  232
  233
  234
  235      IF( tsterr )
  236     $   
CALL zerrtr( path, nout )
 
  237      infot = 0
  238
  239      DO 140 in = 1, nn
  240
  241
  242
  243         n = nval( in )
  244         lda = max( 1, n )
  245         xtype = 'N'
  246         nimat = ntype1
  247         nimat2 = ntypes
  248         IF( n.LE.0 ) THEN
  249            nimat = 1
  250            nimat2 = ntype1 + 1
  251         END IF
  252
  253         nk = min( n+1, 4 )
  254         DO 130 ik = 1, nk
  255
  256
  257
  258
  259            IF( ik.EQ.1 ) THEN
  260               kd = 0
  261            ELSE IF( ik.EQ.2 ) THEN
  262               kd = max( n, 0 )
  263            ELSE IF( ik.EQ.3 ) THEN
  264               kd = ( 3*n-1 ) / 4
  265            ELSE IF( ik.EQ.4 ) THEN
  266               kd = ( n+1 ) / 4
  267            END IF
  268            ldab = kd + 1
  269
  270            DO 90 imat = 1, nimat
  271
  272
  273
  274               IF( .NOT.dotype( imat ) )
  275     $            GO TO 90
  276
  277               DO 80 iuplo = 1, 2
  278
  279
  280
  281                  uplo = uplos( iuplo )
  282
  283
  284
  285                  srnamt = 'ZLATTB'
  286                  CALL zlattb( imat, uplo, 
'No transpose', diag, iseed,
 
  287     $                         n, kd, ab, ldab, x, work, rwork, info )
  288
  289
  290
  291                  IF( 
lsame( diag, 
'N' ) ) 
THEN 
  292                     idiag = 1
  293                  ELSE
  294                     idiag = 2
  295                  END IF
  296
  297
  298
  299
  300                  CALL zlaset( 
'Full', n, n, dcmplx( zero ),
 
  301     $                         dcmplx( one ), ainv, lda )
  302                  IF( 
lsame( uplo, 
'U' ) ) 
THEN 
  303                     DO 20 j = 1, n
  304                        CALL ztbsv( uplo, 
'No transpose', diag, j, kd,
 
  305     $                              ab, ldab, ainv( ( j-1 )*lda+1 ), 1 )
  306   20                CONTINUE
  307                  ELSE
  308                     DO 30 j = 1, n
  309                        CALL ztbsv( uplo, 
'No transpose', diag, n-j+1,
 
  310     $                              kd, ab( ( j-1 )*ldab+1 ), ldab,
  311     $                              ainv( ( j-1 )*lda+j ), 1 )
  312   30                CONTINUE
  313                  END IF
  314
  315
  316
  317                  anorm = 
zlantb( 
'1', uplo, diag, n, kd, ab, ldab,
 
  318     $                    rwork )
  319                  ainvnm = 
zlantr( 
'1', uplo, diag, n, n, ainv, lda,
 
  320     $                     rwork )
  321                  IF( anorm.LE.zero .OR. ainvnm.LE.zero ) THEN
  322                     rcondo = one
  323                  ELSE
  324                     rcondo = ( one / anorm ) / ainvnm
  325                  END IF
  326
  327
  328
  329                  anorm = 
zlantb( 
'I', uplo, diag, n, kd, ab, ldab,
 
  330     $                    rwork )
  331                  ainvnm = 
zlantr( 
'I', uplo, diag, n, n, ainv, lda,
 
  332     $                     rwork )
  333                  IF( anorm.LE.zero .OR. ainvnm.LE.zero ) THEN
  334                     rcondi = one
  335                  ELSE
  336                     rcondi = ( one / anorm ) / ainvnm
  337                  END IF
  338
  339                  DO 60 irhs = 1, nns
  340                     nrhs = nsval( irhs )
  341                     xtype = 'N'
  342
  343                     DO 50 itran = 1, ntran
  344
  345
  346
  347                        trans = transs( itran )
  348                        IF( itran.EQ.1 ) THEN
  349                           norm = 'O'
  350                           rcondc = rcondo
  351                        ELSE
  352                           norm = 'I'
  353                           rcondc = rcondi
  354                        END IF
  355
  356
  357
  358
  359                        srnamt = 'ZLARHS'
  360                        CALL zlarhs( path, xtype, uplo, trans, n, n, kd,
 
  361     $                               idiag, nrhs, ab, ldab, xact, lda,
  362     $                               b, lda, iseed, info )
  363                        xtype = 'C'
  364                        CALL zlacpy( 
'Full', n, nrhs, b, lda, x, lda )
 
  365
  366                        srnamt = 'ZTBTRS'
  367                        CALL ztbtrs( uplo, trans, diag, n, kd, nrhs, ab,
 
  368     $                               ldab, x, lda, info )
  369
  370
  371
  372                        IF( info.NE.0 )
  373     $                     
CALL alaerh( path, 
'ZTBTRS', info, 0,
 
  374     $                                  uplo // trans // diag, n, n, kd,
  375     $                                  kd, nrhs, imat, nfail, nerrs,
  376     $                                  nout )
  377
  378                        CALL ztbt02( uplo, trans, diag, n, kd, nrhs, ab,
 
  379     $                               ldab, x, lda, b, lda, work, rwork,
  380     $                               result( 1 ) )
  381
  382
  383
  384
  385                        CALL zget04( n, nrhs, x, lda, xact, lda, rcondc,
 
  386     $                               result( 2 ) )
  387
  388
  389
  390
  391
  392                        srnamt = 'ZTBRFS'
  393                        CALL ztbrfs( uplo, trans, diag, n, kd, nrhs, ab,
 
  394     $                               ldab, b, lda, x, lda, rwork,
  395     $                               rwork( nrhs+1 ), work,
  396     $                               rwork( 2*nrhs+1 ), info )
  397
  398
  399
  400                        IF( info.NE.0 )
  401     $                     
CALL alaerh( path, 
'ZTBRFS', info, 0,
 
  402     $                                  uplo // trans // diag, n, n, kd,
  403     $                                  kd, nrhs, imat, nfail, nerrs,
  404     $                                  nout )
  405
  406                        CALL zget04( n, nrhs, x, lda, xact, lda, rcondc,
 
  407     $                               result( 3 ) )
  408                        CALL ztbt05( uplo, trans, diag, n, kd, nrhs, ab,
 
  409     $                               ldab, b, lda, x, lda, xact, lda,
  410     $                               rwork, rwork( nrhs+1 ),
  411     $                               result( 4 ) )
  412
  413
  414
  415
  416                        DO 40 k = 1, 5
  417                           IF( result( k ).GE.thresh ) THEN
  418                              IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  419     $                           
CALL alahd( nout, path )
 
  420                              WRITE( nout, fmt = 9999 )uplo, trans,
  421     $                           diag, n, kd, nrhs, imat, k, result( k )
  422                              nfail = nfail + 1
  423                           END IF
  424   40                   CONTINUE
  425                        nrun = nrun + 5
  426   50                CONTINUE
  427   60             CONTINUE
  428
  429
  430
  431
  432                  DO 70 itran = 1, 2
  433                     IF( itran.EQ.1 ) THEN
  434                        norm = 'O'
  435                        rcondc = rcondo
  436                     ELSE
  437                        norm = 'I'
  438                        rcondc = rcondi
  439                     END IF
  440                     srnamt = 'ZTBCON'
  441                     CALL ztbcon( norm, uplo, diag, n, kd, ab, ldab,
 
  442     $                            rcond, work, rwork, info )
  443
  444
  445
  446                     IF( info.NE.0 )
  447     $                  
CALL alaerh( path, 
'ZTBCON', info, 0,
 
  448     $                               norm // uplo // diag, n, n, kd, kd,
  449     $                               -1, imat, nfail, nerrs, nout )
  450
  451                     CALL ztbt06( rcond, rcondc, uplo, diag, n, kd, ab,
 
  452     $                            ldab, rwork, result( 6 ) )
  453
  454
  455
  456                     IF( result( 6 ).GE.thresh ) THEN
  457                        IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  458     $                     
CALL alahd( nout, path )
 
  459                        WRITE( nout, fmt = 9998 ) 'ZTBCON', norm, uplo,
  460     $                     diag, n, kd, imat, 6, result( 6 )
  461                        nfail = nfail + 1
  462                     END IF
  463                     nrun = nrun + 1
  464   70             CONTINUE
  465   80          CONTINUE
  466   90       CONTINUE
  467
  468
  469
  470            DO 120 imat = ntype1 + 1, nimat2
  471
  472
  473
  474               IF( .NOT.dotype( imat ) )
  475     $            GO TO 120
  476
  477               DO 110 iuplo = 1, 2
  478
  479
  480
  481                  uplo = uplos( iuplo )
  482                  DO 100 itran = 1, ntran
  483
  484
  485
  486                     trans = transs( itran )
  487
  488
  489
  490                     srnamt = 'ZLATTB'
  491                     CALL zlattb( imat, uplo, trans, diag, iseed, n, kd,
 
  492     $                            ab, ldab, x, work, rwork, info )
  493
  494
  495
  496
  497                     srnamt = 'ZLATBS'
  498                     CALL zcopy( n, x, 1, b, 1 )
 
  499                     CALL zlatbs( uplo, trans, diag, 
'N', n, kd, ab,
 
  500     $                            ldab, b, scale, rwork, info )
  501
  502
  503
  504                     IF( info.NE.0 )
  505     $                  
CALL alaerh( path, 
'ZLATBS', info, 0,
 
  506     $                               uplo // trans // diag // 'N', n, n,
  507     $                               kd, kd, -1, imat, nfail, nerrs,
  508     $                               nout )
  509
  510                     CALL ztbt03( uplo, trans, diag, n, kd, 1, ab, ldab,
 
  511     $                            scale, rwork, one, b, lda, x, lda,
  512     $                            work, result( 7 ) )
  513
  514
  515
  516
  517                     CALL zcopy( n, x, 1, b, 1 )
 
  518                     CALL zlatbs( uplo, trans, diag, 
'Y', n, kd, ab,
 
  519     $                            ldab, b, scale, rwork, info )
  520
  521
  522
  523                     IF( info.NE.0 )
  524     $                  
CALL alaerh( path, 
'ZLATBS', info, 0,
 
  525     $                               uplo // trans // diag // 'Y', n, n,
  526     $                               kd, kd, -1, imat, nfail, nerrs,
  527     $                               nout )
  528
  529                     CALL ztbt03( uplo, trans, diag, n, kd, 1, ab, ldab,
 
  530     $                            scale, rwork, one, b, lda, x, lda,
  531     $                            work, result( 8 ) )
  532
  533
  534
  535
  536                     IF( result( 7 ).GE.thresh ) THEN
  537                        IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  538     $                     
CALL alahd( nout, path )
 
  539                        WRITE( nout, fmt = 9997 )'ZLATBS', uplo, trans,
  540     $                     diag, 'N', n, kd, imat, 7, result( 7 )
  541                        nfail = nfail + 1
  542                     END IF
  543                     IF( result( 8 ).GE.thresh ) THEN
  544                        IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  545     $                     
CALL alahd( nout, path )
 
  546                        WRITE( nout, fmt = 9997 )'ZLATBS', uplo, trans,
  547     $                     diag, 'Y', n, kd, imat, 8, result( 8 )
  548                        nfail = nfail + 1
  549                     END IF
  550                     nrun = nrun + 2
  551  100             CONTINUE
  552  110          CONTINUE
  553  120       CONTINUE
  554  130    CONTINUE
  555  140 CONTINUE
  556
  557
  558
  559      CALL alasum( path, nout, nfail, nrun, nerrs )
 
  560
  561 9999 FORMAT( ' UPLO=''', a1, ''', TRANS=''', a1, ''',
  562     $      DIAG=''', a1, ''', N=', i5, ', KD=', i5, ', NRHS=', i5,
  563     $      ', type ', i2, ', test(', i2, ')=', g12.5 )
  564 9998 FORMAT( 1x, a, '( ''', a1, ''', ''', a1, ''', ''', a1, ''',',
  565     $      i5, ',', i5, ',  ... ), type ', i2, ', test(', i2, ')=',
  566     $      g12.5 )
  567 9997 FORMAT( 1x, a, '( ''', a1, ''', ''', a1, ''', ''', a1, ''', ''',
  568     $      a1, ''',', i5, ',', i5, ', ...  ),  type ', i2, ', test(',
  569     $      i1, ')=', g12.5 )
  570      RETURN
  571
  572
  573
subroutine alasum(type, nout, nfail, nrun, nerrs)
ALASUM
subroutine zlarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
ZLARHS
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine alahd(iounit, path)
ALAHD
subroutine zcopy(n, zx, incx, zy, incy)
ZCOPY
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
double precision function zlantb(norm, uplo, diag, n, k, ab, ldab, work)
ZLANTB returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
double precision function zlantr(norm, uplo, diag, m, n, a, lda, work)
ZLANTR returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine zlaset(uplo, m, n, alpha, beta, a, lda)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zlatbs(uplo, trans, diag, normin, n, kd, ab, ldab, x, scale, cnorm, info)
ZLATBS solves a triangular banded system of equations.
logical function lsame(ca, cb)
LSAME
subroutine ztbcon(norm, uplo, diag, n, kd, ab, ldab, rcond, work, rwork, info)
ZTBCON
subroutine ztbrfs(uplo, trans, diag, n, kd, nrhs, ab, ldab, b, ldb, x, ldx, ferr, berr, work, rwork, info)
ZTBRFS
subroutine ztbsv(uplo, trans, diag, n, k, a, lda, x, incx)
ZTBSV
subroutine ztbtrs(uplo, trans, diag, n, kd, nrhs, ab, ldab, b, ldb, info)
ZTBTRS
subroutine zerrtr(path, nunit)
ZERRTR
subroutine zget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
ZGET04
subroutine zlattb(imat, uplo, trans, diag, iseed, n, kd, ab, ldab, b, work, rwork, info)
ZLATTB
subroutine ztbt02(uplo, trans, diag, n, kd, nrhs, ab, ldab, x, ldx, b, ldb, work, rwork, resid)
ZTBT02
subroutine ztbt03(uplo, trans, diag, n, kd, nrhs, ab, ldab, scale, cnorm, tscal, x, ldx, b, ldb, work, resid)
ZTBT03
subroutine ztbt05(uplo, trans, diag, n, kd, nrhs, ab, ldab, b, ldb, x, ldx, xact, ldxact, ferr, berr, reslts)
ZTBT05
subroutine ztbt06(rcond, rcondc, uplo, diag, n, kd, ab, ldab, rwork, rat)
ZTBT06