172
  173
  174
  175
  176
  177
  178      LOGICAL            TSTERR
  179      INTEGER            NMAX, NN, NNB, NNS, NOUT
  180      DOUBLE PRECISION   THRESH
  181
  182
  183      LOGICAL            DOTYPE( * )
  184      INTEGER            IWORK( * ), NBVAL( * ), NSVAL( * ), NVAL( * )
  185      DOUBLE PRECISION   A( * ), AFAC( * ), AINV( * ), B( * ),
  186     $                   RWORK( * ), WORK( * ), X( * ), XACT( * )
  187
  188
  189
  190
  191
  192      DOUBLE PRECISION   ONE, ZERO
  193      parameter( one = 1.0d+0, zero = 0.0d+0 )
  194      INTEGER            NTYPES, NTESTS
  195      parameter( ntypes = 8, ntests = 7 )
  196      INTEGER            NBW
  197      parameter( nbw = 4 )
  198
  199
  200      LOGICAL            ZEROT
  201      CHARACTER          DIST, PACKIT, TYPE, UPLO, XTYPE
  202      CHARACTER*3        PATH
  203      INTEGER            I, I1, I2, IKD, IMAT, IN, INB, INFO, IOFF,
  204     $                   IRHS, IUPLO, IW, IZERO, K, KD, KL, KOFF, KU,
  205     $                   LDA, LDAB, MODE, N, NB, NERRS, NFAIL, NIMAT,
  206     $                   NKD, NRHS, NRUN
  207      DOUBLE PRECISION   AINVNM, ANORM, CNDNUM, RCOND, RCONDC
  208
  209
  210      INTEGER            ISEED( 4 ), ISEEDY( 4 ), KDVAL( NBW )
  211      DOUBLE PRECISION   RESULT( NTESTS )
  212
  213
  214      DOUBLE PRECISION   DGET06, DLANGE, DLANSB
  216
  217
  222
  223
  224      INTRINSIC          max, min
  225
  226
  227      LOGICAL            LERR, OK
  228      CHARACTER*32       SRNAMT
  229      INTEGER            INFOT, NUNIT
  230
  231
  232      COMMON             / infoc / infot, nunit, ok, lerr
  233      COMMON             / srnamc / srnamt
  234
  235
  236      DATA               iseedy / 1988, 1989, 1990, 1991 /
  237
  238
  239
  240
  241
  242      path( 1: 1 ) = 'Double precision'
  243      path( 2: 3 ) = 'PB'
  244      nrun = 0
  245      nfail = 0
  246      nerrs = 0
  247      DO 10 i = 1, 4
  248         iseed( i ) = iseedy( i )
  249   10 CONTINUE
  250
  251
  252
  253      IF( tsterr )
  254     $   
CALL derrpo( path, nout )
 
  255      infot = 0
  257      kdval( 1 ) = 0
  258
  259
  260
  261      DO 90 in = 1, nn
  262         n = nval( in )
  263         lda = max( n, 1 )
  264         xtype = 'N'
  265
  266
  267
  268         nkd = max( 1, min( n, 4 ) )
  269         nimat = ntypes
  270         IF( n.EQ.0 )
  271     $      nimat = 1
  272
  273         kdval( 2 ) = n + ( n+1 ) / 4
  274         kdval( 3 ) = ( 3*n-1 ) / 4
  275         kdval( 4 ) = ( n+1 ) / 4
  276
  277         DO 80 ikd = 1, nkd
  278
  279
  280
  281
  282
  283            kd = kdval( ikd )
  284            ldab = kd + 1
  285
  286
  287
  288            DO 70 iuplo = 1, 2
  289               koff = 1
  290               IF( iuplo.EQ.1 ) THEN
  291                  uplo = 'U'
  292                  koff = max( 1, kd+2-n )
  293                  packit = 'Q'
  294               ELSE
  295                  uplo = 'L'
  296                  packit = 'B'
  297               END IF
  298
  299               DO 60 imat = 1, nimat
  300
  301
  302
  303                  IF( .NOT.dotype( imat ) )
  304     $               GO TO 60
  305
  306
  307
  308                  zerot = imat.GE.2 .AND. imat.LE.4
  309                  IF( zerot .AND. n.LT.imat-1 )
  310     $               GO TO 60
  311
  312                  IF( .NOT.zerot .OR. .NOT.dotype( 1 ) ) THEN
  313
  314
  315
  316
  317                     CALL dlatb4( path, imat, n, n, 
TYPE, KL, KU, ANORM,
 
  318     $                            MODE, CNDNUM, DIST )
  319
  320                     srnamt = 'DLATMS'
  321                     CALL dlatms( n, n, dist, iseed, 
TYPE, RWORK, MODE,
 
  322     $                            CNDNUM, ANORM, KD, KD, PACKIT,
  323     $                            A( KOFF ), LDAB, WORK, INFO )
  324
  325
  326
  327                     IF( info.NE.0 ) THEN
  328                        CALL alaerh( path, 
'DLATMS', info, 0, uplo, n,
 
  329     $                               n, kd, kd, -1, imat, nfail, nerrs,
  330     $                               nout )
  331                        GO TO 60
  332                     END IF
  333                  ELSE IF( izero.GT.0 ) THEN
  334
  335
  336
  337
  338                     iw = 2*lda + 1
  339                     IF( iuplo.EQ.1 ) THEN
  340                        ioff = ( izero-1 )*ldab + kd + 1
  341                        CALL dcopy( izero-i1, work( iw ), 1,
 
  342     $                              a( ioff-izero+i1 ), 1 )
  343                        iw = iw + izero - i1
  344                        CALL dcopy( i2-izero+1, work( iw ), 1,
 
  345     $                              a( ioff ), max( ldab-1, 1 ) )
  346                     ELSE
  347                        ioff = ( i1-1 )*ldab + 1
  348                        CALL dcopy( izero-i1, work( iw ), 1,
 
  349     $                              a( ioff+izero-i1 ),
  350     $                              max( ldab-1, 1 ) )
  351                        ioff = ( izero-1 )*ldab + 1
  352                        iw = iw + izero - i1
  353                        CALL dcopy( i2-izero+1, work( iw ), 1,
 
  354     $                              a( ioff ), 1 )
  355                     END IF
  356                  END IF
  357
  358
  359
  360
  361                  izero = 0
  362                  IF( zerot ) THEN
  363                     IF( imat.EQ.2 ) THEN
  364                        izero = 1
  365                     ELSE IF( imat.EQ.3 ) THEN
  366                        izero = n
  367                     ELSE
  368                        izero = n / 2 + 1
  369                     END IF
  370
  371
  372
  373                     iw = 2*lda
  374                     DO 20 i = 1, min( 2*kd+1, n )
  375                        work( iw+i ) = zero
  376   20                CONTINUE
  377                     iw = iw + 1
  378                     i1 = max( izero-kd, 1 )
  379                     i2 = min( izero+kd, n )
  380
  381                     IF( iuplo.EQ.1 ) THEN
  382                        ioff = ( izero-1 )*ldab + kd + 1
  383                        CALL dswap( izero-i1, a( ioff-izero+i1 ), 1,
 
  384     $                              work( iw ), 1 )
  385                        iw = iw + izero - i1
  386                        CALL dswap( i2-izero+1, a( ioff ),
 
  387     $                              max( ldab-1, 1 ), work( iw ), 1 )
  388                     ELSE
  389                        ioff = ( i1-1 )*ldab + 1
  390                        CALL dswap( izero-i1, a( ioff+izero-i1 ),
 
  391     $                              max( ldab-1, 1 ), work( iw ), 1 )
  392                        ioff = ( izero-1 )*ldab + 1
  393                        iw = iw + izero - i1
  394                        CALL dswap( i2-izero+1, a( ioff ), 1,
 
  395     $                              work( iw ), 1 )
  396                     END IF
  397                  END IF
  398
  399
  400
  401                  DO 50 inb = 1, nnb
  402                     nb = nbval( inb )
  404
  405
  406
  407
  408                     CALL dlacpy( 
'Full', kd+1, n, a, ldab, afac, ldab )
 
  409                     srnamt = 'DPBTRF'
  410                     CALL dpbtrf( uplo, n, kd, afac, ldab, info )
 
  411
  412
  413
  414                     IF( info.NE.izero ) THEN
  415                        CALL alaerh( path, 
'DPBTRF', info, izero, uplo,
 
  416     $                               n, n, kd, kd, nb, imat, nfail,
  417     $                               nerrs, nout )
  418                        GO TO 50
  419                     END IF
  420
  421
  422
  423                     IF( info.NE.0 )
  424     $                  GO TO 50
  425
  426
  427
  428
  429
  430                     CALL dlacpy( 
'Full', kd+1, n, afac, ldab, ainv,
 
  431     $                            ldab )
  432                     CALL dpbt01( uplo, n, kd, a, ldab, ainv, ldab,
 
  433     $                            rwork, result( 1 ) )
  434
  435
  436
  437                     IF( result( 1 ).GE.thresh ) THEN
  438                        IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  439     $                     
CALL alahd( nout, path )
 
  440                        WRITE( nout, fmt = 9999 )uplo, n, kd, nb, imat,
  441     $                     1, result( 1 )
  442                        nfail = nfail + 1
  443                     END IF
  444                     nrun = nrun + 1
  445
  446
  447
  448                     IF( inb.GT.1 )
  449     $                  GO TO 50
  450
  451
  452
  453
  454                     CALL dlaset( 
'Full', n, n, zero, one, ainv, lda )
 
  455                     srnamt = 'DPBTRS'
  456                     CALL dpbtrs( uplo, n, kd, n, afac, ldab, ainv, lda,
 
  457     $                            info )
  458
  459
  460
  461                     anorm = 
dlansb( 
'1', uplo, n, kd, a, ldab, rwork )
 
  462                     ainvnm = 
dlange( 
'1', n, n, ainv, lda, rwork )
 
  463                     IF( anorm.LE.zero .OR. ainvnm.LE.zero ) THEN
  464                        rcondc = one
  465                     ELSE
  466                        rcondc = ( one / anorm ) / ainvnm
  467                     END IF
  468
  469                     DO 40 irhs = 1, nns
  470                        nrhs = nsval( irhs )
  471
  472
  473
  474
  475                        srnamt = 'DLARHS'
  476                        CALL dlarhs( path, xtype, uplo, 
' ', n, n, kd,
 
  477     $                               kd, nrhs, a, ldab, xact, lda, b,
  478     $                               lda, iseed, info )
  479                        CALL dlacpy( 
'Full', n, nrhs, b, lda, x, lda )
 
  480
  481                        srnamt = 'DPBTRS'
  482                        CALL dpbtrs( uplo, n, kd, nrhs, afac, ldab, x,
 
  483     $                               lda, info )
  484
  485
  486
  487                        IF( info.NE.0 )
  488     $                     
CALL alaerh( path, 
'DPBTRS', info, 0, uplo,
 
  489     $                                  n, n, kd, kd, nrhs, imat, nfail,
  490     $                                  nerrs, nout )
  491
  492                        CALL dlacpy( 
'Full', n, nrhs, b, lda, work,
 
  493     $                               lda )
  494                        CALL dpbt02( uplo, n, kd, nrhs, a, ldab, x, lda,
 
  495     $                               work, lda, rwork, result( 2 ) )
  496
  497
  498
  499
  500                        CALL dget04( n, nrhs, x, lda, xact, lda, rcondc,
 
  501     $                               result( 3 ) )
  502
  503
  504
  505
  506                        srnamt = 'DPBRFS'
  507                        CALL dpbrfs( uplo, n, kd, nrhs, a, ldab, afac,
 
  508     $                               ldab, b, lda, x, lda, rwork,
  509     $                               rwork( nrhs+1 ), work, iwork,
  510     $                               info )
  511
  512
  513
  514                        IF( info.NE.0 )
  515     $                     
CALL alaerh( path, 
'DPBRFS', info, 0, uplo,
 
  516     $                                  n, n, kd, kd, nrhs, imat, nfail,
  517     $                                  nerrs, nout )
  518
  519                        CALL dget04( n, nrhs, x, lda, xact, lda, rcondc,
 
  520     $                               result( 4 ) )
  521                        CALL dpbt05( uplo, n, kd, nrhs, a, ldab, b, lda,
 
  522     $                               x, lda, xact, lda, rwork,
  523     $                               rwork( nrhs+1 ), result( 5 ) )
  524
  525
  526
  527
  528                        DO 30 k = 2, 6
  529                           IF( result( k ).GE.thresh ) THEN
  530                              IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  531     $                           
CALL alahd( nout, path )
 
  532                              WRITE( nout, fmt = 9998 )uplo, n, kd,
  533     $                           nrhs, imat, k, result( k )
  534                              nfail = nfail + 1
  535                           END IF
  536   30                   CONTINUE
  537                        nrun = nrun + 5
  538   40                CONTINUE
  539
  540
  541
  542
  543                     srnamt = 'DPBCON'
  544                     CALL dpbcon( uplo, n, kd, afac, ldab, anorm, rcond,
 
  545     $                            work, iwork, info )
  546
  547
  548
  549                     IF( info.NE.0 )
  550     $                  
CALL alaerh( path, 
'DPBCON', info, 0, uplo, n,
 
  551     $                               n, kd, kd, -1, imat, nfail, nerrs,
  552     $                               nout )
  553
  554                     result( 7 ) = 
dget06( rcond, rcondc )
 
  555
  556
  557
  558                     IF( result( 7 ).GE.thresh ) THEN
  559                        IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  560     $                     
CALL alahd( nout, path )
 
  561                        WRITE( nout, fmt = 9997 )uplo, n, kd, imat, 7,
  562     $                     result( 7 )
  563                        nfail = nfail + 1
  564                     END IF
  565                     nrun = nrun + 1
  566   50             CONTINUE
  567   60          CONTINUE
  568   70       CONTINUE
  569   80    CONTINUE
  570   90 CONTINUE
  571
  572
  573
  574      CALL alasum( path, nout, nfail, nrun, nerrs )
 
  575
  576 9999 FORMAT( ' UPLO=''', a1, ''', N=', i5, ', KD=', i5, ', NB=', i4,
  577     $      ', type ', i2, ', test ', i2, ', ratio= ', g12.5 )
  578 9998 FORMAT( ' UPLO=''', a1, ''', N=', i5, ', KD=', i5, ', NRHS=', i3,
  579     $      ', type ', i2, ', test(', i2, ') = ', g12.5 )
  580 9997 FORMAT( ' UPLO=''', a1, ''', N=', i5, ', KD=', i5, ',', 10x,
  581     $      ' type ', i2, ', test(', i2, ') = ', g12.5 )
  582      RETURN
  583
  584
  585
subroutine alasum(type, nout, nfail, nrun, nerrs)
ALASUM
subroutine dlarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
DLARHS
subroutine xlaenv(ispec, nvalue)
XLAENV
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine alahd(iounit, path)
ALAHD
subroutine derrpo(path, nunit)
DERRPO
subroutine dget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
DGET04
double precision function dget06(rcond, rcondc)
DGET06
subroutine dlatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
DLATB4
subroutine dlatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
DLATMS
subroutine dpbt01(uplo, n, kd, a, lda, afac, ldafac, rwork, resid)
DPBT01
subroutine dpbt02(uplo, n, kd, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
DPBT02
subroutine dpbt05(uplo, n, kd, nrhs, ab, ldab, b, ldb, x, ldx, xact, ldxact, ferr, berr, reslts)
DPBT05
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
double precision function dlange(norm, m, n, a, lda, work)
DLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
double precision function dlansb(norm, uplo, n, k, ab, ldab, work)
DLANSB returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine dpbcon(uplo, n, kd, ab, ldab, anorm, rcond, work, iwork, info)
DPBCON
subroutine dpbrfs(uplo, n, kd, nrhs, ab, ldab, afb, ldafb, b, ldb, x, ldx, ferr, berr, work, iwork, info)
DPBRFS
subroutine dpbtrf(uplo, n, kd, ab, ldab, info)
DPBTRF
subroutine dpbtrs(uplo, n, kd, nrhs, ab, ldab, b, ldb, info)
DPBTRS
subroutine dswap(n, dx, incx, dy, incy)
DSWAP