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   ZERO
  193      parameter( zero = 0.0d+0 )
  194      INTEGER            NTYPES
  195      parameter( ntypes = 9 )
  196      INTEGER            NTESTS
  197      parameter( ntests = 8 )
  198
  199
  200      LOGICAL            ZEROT
  201      CHARACTER          DIST, TYPE, UPLO, XTYPE
  202      CHARACTER*3        PATH
  203      INTEGER            I, IMAT, IN, INB, INFO, IOFF, IRHS, IUPLO,
  204     $                   IZERO, K, KL, KU, LDA, MODE, N, NB, NERRS,
  205     $                   NFAIL, NIMAT, NRHS, NRUN
  206      DOUBLE PRECISION   ANORM, CNDNUM, RCOND, RCONDC
  207
  208
  209      CHARACTER          UPLOS( 2 )
  210      INTEGER            ISEED( 4 ), ISEEDY( 4 )
  211      DOUBLE PRECISION   RESULT( NTESTS )
  212
  213
  214      DOUBLE PRECISION   DGET06, DLANSY
  216
  217
  222
  223
  224      LOGICAL            LERR, OK
  225      CHARACTER*32       SRNAMT
  226      INTEGER            INFOT, NUNIT
  227
  228
  229      COMMON             / infoc / infot, nunit, ok, lerr
  230      COMMON             / srnamc / srnamt
  231
  232
  233      INTRINSIC          max
  234
  235
  236      DATA               iseedy / 1988, 1989, 1990, 1991 /
  237      DATA               uplos / 'U', 'L' /
  238
  239
  240
  241
  242
  243      path( 1: 1 ) = 'Double precision'
  244      path( 2: 3 ) = 'PO'
  245      nrun = 0
  246      nfail = 0
  247      nerrs = 0
  248      DO 10 i = 1, 4
  249         iseed( i ) = iseedy( i )
  250   10 CONTINUE
  251
  252
  253
  254      IF( tsterr )
  255     $   
CALL derrpo( path, nout )
 
  256      infot = 0
  258
  259
  260
  261      DO 120 in = 1, nn
  262         n = nval( in )
  263         lda = max( n, 1 )
  264         xtype = 'N'
  265         nimat = ntypes
  266         IF( n.LE.0 )
  267     $      nimat = 1
  268
  269         izero = 0
  270         DO 110 imat = 1, nimat
  271
  272
  273
  274            IF( .NOT.dotype( imat ) )
  275     $         GO TO 110
  276
  277
  278
  279            zerot = imat.GE.3 .AND. imat.LE.5
  280            IF( zerot .AND. n.LT.imat-2 )
  281     $         GO TO 110
  282
  283
  284
  285            DO 100 iuplo = 1, 2
  286               uplo = uplos( iuplo )
  287
  288
  289
  290
  291               CALL dlatb4( path, imat, n, n, 
TYPE, KL, KU, ANORM, MODE,
 
  292     $                      CNDNUM, DIST )
  293
  294               srnamt = 'DLATMS'
  295               CALL dlatms( n, n, dist, iseed, 
TYPE, RWORK, MODE,
 
  296     $                      CNDNUM, ANORM, KL, KU, UPLO, A, LDA, WORK,
  297     $                      INFO )
  298
  299
  300
  301               IF( info.NE.0 ) THEN
  302                  CALL alaerh( path, 
'DLATMS', info, 0, uplo, n, n, -1,
 
  303     $                         -1, -1, imat, nfail, nerrs, nout )
  304                  GO TO 100
  305               END IF
  306
  307
  308
  309
  310               IF( zerot ) THEN
  311                  IF( imat.EQ.3 ) THEN
  312                     izero = 1
  313                  ELSE IF( imat.EQ.4 ) THEN
  314                     izero = n
  315                  ELSE
  316                     izero = n / 2 + 1
  317                  END IF
  318                  ioff = ( izero-1 )*lda
  319
  320
  321
  322                  IF( iuplo.EQ.1 ) THEN
  323                     DO 20 i = 1, izero - 1
  324                        a( ioff+i ) = zero
  325   20                CONTINUE
  326                     ioff = ioff + izero
  327                     DO 30 i = izero, n
  328                        a( ioff ) = zero
  329                        ioff = ioff + lda
  330   30                CONTINUE
  331                  ELSE
  332                     ioff = izero
  333                     DO 40 i = 1, izero - 1
  334                        a( ioff ) = zero
  335                        ioff = ioff + lda
  336   40                CONTINUE
  337                     ioff = ioff - izero
  338                     DO 50 i = izero, n
  339                        a( ioff+i ) = zero
  340   50                CONTINUE
  341                  END IF
  342               ELSE
  343                  izero = 0
  344               END IF
  345
  346
  347
  348               DO 90 inb = 1, nnb
  349                  nb = nbval( inb )
  351
  352
  353
  354                  CALL dlacpy( uplo, n, n, a, lda, afac, lda )
 
  355                  srnamt = 'DPOTRF'
  356                  CALL dpotrf( uplo, n, afac, lda, info )
 
  357
  358
  359
  360                  IF( info.NE.izero ) THEN
  361                     CALL alaerh( path, 
'DPOTRF', info, izero, uplo, n,
 
  362     $                            n, -1, -1, nb, imat, nfail, nerrs,
  363     $                            nout )
  364                     GO TO 90
  365                  END IF
  366
  367
  368
  369                  IF( info.NE.0 )
  370     $               GO TO 90
  371
  372
  373
  374
  375                  CALL dlacpy( uplo, n, n, afac, lda, ainv, lda )
 
  376                  CALL dpot01( uplo, n, a, lda, ainv, lda, rwork,
 
  377     $                         result( 1 ) )
  378
  379
  380
  381
  382                  CALL dlacpy( uplo, n, n, afac, lda, ainv, lda )
 
  383                  srnamt = 'DPOTRI'
  384                  CALL dpotri( uplo, n, ainv, lda, info )
 
  385
  386
  387
  388                  IF( info.NE.0 )
  389     $               
CALL alaerh( path, 
'DPOTRI', info, 0, uplo, n, n,
 
  390     $                            -1, -1, -1, imat, nfail, nerrs, nout )
  391
  392                  CALL dpot03( uplo, n, a, lda, ainv, lda, work, lda,
 
  393     $                         rwork, rcondc, result( 2 ) )
  394
  395
  396
  397
  398                  DO 60 k = 1, 2
  399                     IF( result( k ).GE.thresh ) THEN
  400                        IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  401     $                     
CALL alahd( nout, path )
 
  402                        WRITE( nout, fmt = 9999 )uplo, n, nb, imat, k,
  403     $                     result( k )
  404                        nfail = nfail + 1
  405                     END IF
  406   60             CONTINUE
  407                  nrun = nrun + 2
  408
  409
  410
  411
  412                  IF( inb.NE.1 )
  413     $               GO TO 90
  414
  415                  DO 80 irhs = 1, nns
  416                     nrhs = nsval( irhs )
  417
  418
  419
  420
  421                     srnamt = 'DLARHS'
  422                     CALL dlarhs( path, xtype, uplo, 
' ', n, n, kl, ku,
 
  423     $                            nrhs, a, lda, xact, lda, b, lda,
  424     $                            iseed, info )
  425                     CALL dlacpy( 
'Full', n, nrhs, b, lda, x, lda )
 
  426
  427                     srnamt = 'DPOTRS'
  428                     CALL dpotrs( uplo, n, nrhs, afac, lda, x, lda,
 
  429     $                            info )
  430
  431
  432
  433                     IF( info.NE.0 )
  434     $                  
CALL alaerh( path, 
'DPOTRS', info, 0, uplo, n,
 
  435     $                               n, -1, -1, nrhs, imat, nfail,
  436     $                               nerrs, nout )
  437
  438                     CALL dlacpy( 
'Full', n, nrhs, b, lda, work, lda )
 
  439                     CALL dpot02( uplo, n, nrhs, a, lda, x, lda, work,
 
  440     $                            lda, rwork, result( 3 ) )
  441
  442
  443
  444
  445                     CALL dget04( n, nrhs, x, lda, xact, lda, rcondc,
 
  446     $                            result( 4 ) )
  447
  448
  449
  450
  451                     srnamt = 'DPORFS'
  452                     CALL dporfs( uplo, n, nrhs, a, lda, afac, lda, b,
 
  453     $                            lda, x, lda, rwork, rwork( nrhs+1 ),
  454     $                            work, iwork, info )
  455
  456
  457
  458                     IF( info.NE.0 )
  459     $                  
CALL alaerh( path, 
'DPORFS', info, 0, uplo, n,
 
  460     $                               n, -1, -1, nrhs, imat, nfail,
  461     $                               nerrs, nout )
  462
  463                     CALL dget04( n, nrhs, x, lda, xact, lda, rcondc,
 
  464     $                            result( 5 ) )
  465                     CALL dpot05( uplo, n, nrhs, a, lda, b, lda, x, lda,
 
  466     $                            xact, lda, rwork, rwork( nrhs+1 ),
  467     $                            result( 6 ) )
  468
  469
  470
  471
  472                     DO 70 k = 3, 7
  473                        IF( result( k ).GE.thresh ) THEN
  474                           IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  475     $                        
CALL alahd( nout, path )
 
  476                           WRITE( nout, fmt = 9998 )uplo, n, nrhs,
  477     $                        imat, k, result( k )
  478                           nfail = nfail + 1
  479                        END IF
  480   70                CONTINUE
  481                     nrun = nrun + 5
  482   80             CONTINUE
  483
  484
  485
  486
  487                  anorm = 
dlansy( 
'1', uplo, n, a, lda, rwork )
 
  488                  srnamt = 'DPOCON'
  489                  CALL dpocon( uplo, n, afac, lda, anorm, rcond, work,
 
  490     $                         iwork, info )
  491
  492
  493
  494                  IF( info.NE.0 )
  495     $               
CALL alaerh( path, 
'DPOCON', info, 0, uplo, n, n,
 
  496     $                            -1, -1, -1, imat, nfail, nerrs, nout )
  497
  498                  result( 8 ) = 
dget06( rcond, rcondc )
 
  499
  500
  501
  502                  IF( result( 8 ).GE.thresh ) THEN
  503                     IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  504     $                  
CALL alahd( nout, path )
 
  505                     WRITE( nout, fmt = 9997 )uplo, n, imat, 8,
  506     $                  result( 8 )
  507                     nfail = nfail + 1
  508                  END IF
  509                  nrun = nrun + 1
  510   90          CONTINUE
  511  100       CONTINUE
  512  110    CONTINUE
  513  120 CONTINUE
  514
  515
  516
  517      CALL alasum( path, nout, nfail, nrun, nerrs )
 
  518
  519 9999 FORMAT( ' UPLO = ''', a1, ''', N =', i5, ', NB =', i4, ', type ',
  520     $      i2, ', test ', i2, ', ratio =', g12.5 )
  521 9998 FORMAT( ' UPLO = ''', a1, ''', N =', i5, ', NRHS=', i3, ', type ',
  522     $      i2, ', test(', i2, ') =', g12.5 )
  523 9997 FORMAT( ' UPLO = ''', a1, ''', N =', i5, ',', 10x, ' type ', i2,
  524     $      ', test(', i2, ') =', g12.5 )
  525      RETURN
  526
  527
  528
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 dpot01(uplo, n, a, lda, afac, ldafac, rwork, resid)
DPOT01
subroutine dpot02(uplo, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
DPOT02
subroutine dpot03(uplo, n, a, lda, ainv, ldainv, work, ldwork, rwork, rcond, resid)
DPOT03
subroutine dpot05(uplo, n, nrhs, a, lda, b, ldb, x, ldx, xact, ldxact, ferr, berr, reslts)
DPOT05
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
double precision function dlansy(norm, uplo, n, a, lda, work)
DLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine dpocon(uplo, n, a, lda, anorm, rcond, work, iwork, info)
DPOCON
subroutine dporfs(uplo, n, nrhs, a, lda, af, ldaf, b, ldb, x, ldx, ferr, berr, work, iwork, info)
DPORFS
subroutine dpotrf(uplo, n, a, lda, info)
DPOTRF
subroutine dpotri(uplo, n, a, lda, info)
DPOTRI
subroutine dpotrs(uplo, n, nrhs, a, lda, b, ldb, info)
DPOTRS