153
  154
  155
  156
  157
  158
  159      LOGICAL            TSTERR
  160      INTEGER            NMAX, NN, NOUT, NRHS
  161      DOUBLE PRECISION   THRESH
  162
  163
  164      LOGICAL            DOTYPE( * )
  165      INTEGER            IWORK( * ), NVAL( * )
  166      DOUBLE PRECISION   RWORK( * )
  167      COMPLEX*16         A( * ), AFAC( * ), AINV( * ), B( * ),
  168     $                   WORK( * ), X( * ), XACT( * )
  169
  170
  171
  172
  173
  174      DOUBLE PRECISION   ONE, ZERO
  175      parameter( one = 1.0d+0, zero = 0.0d+0 )
  176      INTEGER            NTYPES, NTESTS
  177      parameter( ntypes = 10, ntests = 3 )
  178      INTEGER            NFACT
  179      parameter( nfact = 2 )
  180
  181
  182      LOGICAL            ZEROT
  183      CHARACTER          DIST, FACT, TYPE, UPLO, XTYPE
  184      CHARACTER*3        MATPATH, PATH
  185      INTEGER            I, I1, I2, IFACT, IMAT, IN, INFO, IOFF, IUPLO,
  186     $                   IZERO, J, K, KL, KU, LDA, LWORK, MODE, N,
  187     $                   NB, NBMIN, NERRS, NFAIL, NIMAT, NRUN, NT
  188      DOUBLE PRECISION   AINVNM, ANORM, CNDNUM, RCONDC
  189
  190
  191      CHARACTER          FACTS( NFACT ), UPLOS( 2 )
  192      INTEGER            ISEED( 4 ), ISEEDY( 4 )
  193      DOUBLE PRECISION   RESULT( NTESTS )
  194 
  195
  196
  197      DOUBLE PRECISION   ZLANHE
  199
  200
  205
  206
  207      LOGICAL            LERR, OK
  208      CHARACTER*32       SRNAMT
  209      INTEGER            INFOT, NUNIT
  210
  211
  212      COMMON             / infoc / infot, nunit, ok, lerr
  213      COMMON             / srnamc / srnamt
  214
  215
  216      INTRINSIC          max, min
  217
  218
  219      DATA               iseedy / 1988, 1989, 1990, 1991 /
  220      DATA               uplos / 'U', 'L' / , facts / 'F', 'N' /
  221
  222
  223
  224
  225
  226
  227
  228      path( 1: 1 ) = 'Zomplex precision'
  229      path( 2: 3 ) = 'HR'
  230
  231
  232
  233      matpath( 1: 1 ) = 'Zomplex precision'
  234      matpath( 2: 3 ) = 'HE'
  235
  236      nrun = 0
  237      nfail = 0
  238      nerrs = 0
  239      DO 10 i = 1, 4
  240         iseed( i ) = iseedy( i )
  241   10 CONTINUE
  242      lwork = max( 2*nmax, nmax*nrhs )
  243
  244
  245
  246      IF( tsterr )
  247     $   
CALL zerrvx( path, nout )
 
  248      infot = 0
  249
  250
  251
  252
  253      nb = 1
  254      nbmin = 2
  257
  258
  259
  260      DO 180 in = 1, nn
  261         n = nval( in )
  262         lda = max( n, 1 )
  263         xtype = 'N'
  264         nimat = ntypes
  265         IF( n.LE.0 )
  266     $      nimat = 1
  267
  268         DO 170 imat = 1, nimat
  269
  270
  271
  272            IF( .NOT.dotype( imat ) )
  273     $         GO TO 170
  274
  275
  276
  277            zerot = imat.GE.3 .AND. imat.LE.6
  278            IF( zerot .AND. n.LT.imat-2 )
  279     $         GO TO 170
  280
  281
  282
  283            DO 160 iuplo = 1, 2
  284               uplo = uplos( iuplo )
  285
  286
  287
  288
  289
  290
  291                  CALL zlatb4( matpath, imat, n, n, 
TYPE, KL, KU, ANORM,
 
  292     $                         MODE, CNDNUM, DIST )
  293
  294
  295
  296                  srnamt = 'ZLATMS'
  297                  CALL zlatms( n, n, dist, iseed, 
TYPE, RWORK, MODE,
 
  298     $                         CNDNUM, ANORM, KL, KU, UPLO, A, LDA,
  299     $                         WORK, INFO )
  300
  301
  302
  303                  IF( info.NE.0 ) THEN
  304                     CALL alaerh( path, 
'ZLATMS', info, 0, uplo, n, n,
 
  305     $                            -1, -1, -1, imat, nfail, nerrs, nout )
  306                     GO TO 160
  307                  END IF
  308
  309
  310
  311
  312                  IF( zerot ) THEN
  313                     IF( imat.EQ.3 ) THEN
  314                        izero = 1
  315                     ELSE IF( imat.EQ.4 ) THEN
  316                        izero = n
  317                     ELSE
  318                        izero = n / 2 + 1
  319                     END IF
  320
  321                     IF( imat.LT.6 ) THEN
  322
  323
  324
  325                        IF( iuplo.EQ.1 ) THEN
  326                           ioff = ( izero-1 )*lda
  327                           DO 20 i = 1, izero - 1
  328                              a( ioff+i ) = zero
  329   20                      CONTINUE
  330                           ioff = ioff + izero
  331                           DO 30 i = izero, n
  332                              a( ioff ) = zero
  333                              ioff = ioff + lda
  334   30                      CONTINUE
  335                        ELSE
  336                           ioff = izero
  337                           DO 40 i = 1, izero - 1
  338                              a( ioff ) = zero
  339                              ioff = ioff + lda
  340   40                      CONTINUE
  341                           ioff = ioff - izero
  342                           DO 50 i = izero, n
  343                              a( ioff+i ) = zero
  344   50                      CONTINUE
  345                        END IF
  346                     ELSE
  347                        IF( iuplo.EQ.1 ) THEN
  348
  349
  350
  351                           ioff = 0
  352                           DO 70 j = 1, n
  353                              i2 = min( j, izero )
  354                              DO 60 i = 1, i2
  355                                 a( ioff+i ) = zero
  356   60                         CONTINUE
  357                              ioff = ioff + lda
  358   70                      CONTINUE
  359                        ELSE
  360
  361
  362
  363                           ioff = 0
  364                           DO 90 j = 1, n
  365                              i1 = max( j, izero )
  366                              DO 80 i = i1, n
  367                                 a( ioff+i ) = zero
  368   80                         CONTINUE
  369                              ioff = ioff + lda
  370   90                      CONTINUE
  371                        END IF
  372                     END IF
  373                  ELSE
  374                     izero = 0
  375                  END IF
  376
  377
  378
  379
  380               DO 150 ifact = 1, nfact
  381
  382
  383
  384                  fact = facts( ifact )
  385
  386
  387
  388
  389                  IF( zerot ) THEN
  390                     IF( ifact.EQ.1 )
  391     $                  GO TO 150
  392                     rcondc = zero
  393
  394                  ELSE IF( ifact.EQ.1 ) THEN
  395
  396
  397
  398                     anorm = 
zlanhe( 
'1', uplo, n, a, lda, rwork )
 
  399
  400
  401
  402 
  403                     CALL zlacpy( uplo, n, n, a, lda, afac, lda )
 
  405     $                                 lwork, info )
  406
  407
  408
  409                     CALL zlacpy( uplo, n, n, afac, lda, ainv, lda )
 
  410                     lwork = (n+nb+1)*(nb+3)
  412     $                                 work, info )
  413                     ainvnm = 
zlanhe( 
'1', uplo, n, ainv, lda, rwork )
 
  414
  415
  416
  417                     IF( anorm.LE.zero .OR. ainvnm.LE.zero ) THEN
  418                        rcondc = one
  419                     ELSE
  420                        rcondc = ( one / anorm ) / ainvnm
  421                     END IF
  422                  END IF
  423
  424
  425
  426                  srnamt = 'ZLARHS'
  427                  CALL zlarhs( matpath, xtype, uplo, 
' ', n, n, kl, ku,
 
  428     $                         nrhs, a, lda, xact, lda, b, lda, iseed,
  429     $                         info )
  430                  xtype = 'C'
  431
  432
  433
  434                  IF( ifact.EQ.2 ) THEN
  435                     CALL zlacpy( uplo, n, n, a, lda, afac, lda )
 
  436                     CALL zlacpy( 
'Full', n, nrhs, b, lda, x, lda )
 
  437
  438
  439
  440
  441                     srnamt = 'ZHESV_ROOK'
  442                     CALL zhesv_rook( uplo, n, nrhs, afac, lda, iwork,
 
  443     $                                x, lda, work, lwork, info )
  444
  445
  446
  447
  448                     k = izero
  449                     IF( k.GT.0 ) THEN
  450  100                   CONTINUE
  451                        IF( iwork( k ).LT.0 ) THEN
  452                           IF( iwork( k ).NE.-k ) THEN
  453                              k = -iwork( k )
  454                              GO TO 100
  455                           END IF
  456                        ELSE IF( iwork( k ).NE.k ) THEN
  457                           k = iwork( k )
  458                           GO TO 100
  459                        END IF
  460                     END IF
  461
  462
  463
  464                     IF( info.NE.k ) THEN
  465                        CALL alaerh( path, 
'ZHESV_ROOK', info, k, uplo,
 
  466     $                               n, n, -1, -1, nrhs, imat, nfail,
  467     $                               nerrs, nout )
  468                        GO TO 120
  469                     ELSE IF( info.NE.0 ) THEN
  470                        GO TO 120
  471                     END IF
  472
  473
  474
  475
  477     $                                 iwork, ainv, lda, rwork,
  478     $                                 result( 1 ) )
  479
  480
  481
  482                     CALL zlacpy( 
'Full', n, nrhs, b, lda, work, lda )
 
  483                     CALL zpot02( uplo, n, nrhs, a, lda, x, lda, work,
 
  484     $                            lda, rwork, result( 2 ) )
  485
  486
  487
  488
  489                     CALL zget04( n, nrhs, x, lda, xact, lda, rcondc,
 
  490     $                            result( 3 ) )
  491                     nt = 3
  492
  493
  494
  495
  496                     DO 110 k = 1, nt
  497                        IF( result( k ).GE.thresh ) THEN
  498                           IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  499     $                        
CALL aladhd( nout, path )
 
  500                           WRITE( nout, fmt = 9999 )'ZHESV_ROOK', uplo,
  501     $                            n, imat, k, result( k )
  502                           nfail = nfail + 1
  503                        END IF
  504  110                CONTINUE
  505                     nrun = nrun + nt
  506  120                CONTINUE
  507                  END IF
  508
  509  150          CONTINUE
  510
  511  160       CONTINUE
  512  170    CONTINUE
  513  180 CONTINUE
  514
  515
  516
  517      CALL alasvm( path, nout, nfail, nrun, nerrs )
 
  518
  519 9999 FORMAT( 1x, a, ', UPLO=''', a1, ''', N =', i5, ', type ', i2,
  520     $      ', test ', i2, ', ratio =', g12.5 )
  521      RETURN
  522
  523
  524
subroutine alasvm(type, nout, nfail, nrun, nerrs)
ALASVM
subroutine xlaenv(ispec, nvalue)
XLAENV
subroutine zlarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
ZLARHS
subroutine aladhd(iounit, path)
ALADHD
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine zhesv_rook(uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info)
ZHESV_ROOK computes the solution to a system of linear equations A * X = B for HE matrices using the ...
subroutine zhetrf_rook(uplo, n, a, lda, ipiv, work, lwork, info)
ZHETRF_ROOK computes the factorization of a complex Hermitian indefinite matrix using the bounded Bun...
subroutine zhetri_rook(uplo, n, a, lda, ipiv, work, info)
ZHETRI_ROOK computes the inverse of HE matrix using the factorization obtained with the bounded Bunch...
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
double precision function zlanhe(norm, uplo, n, a, lda, work)
ZLANHE returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine zerrvx(path, nunit)
ZERRVX
subroutine zget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
ZGET04
subroutine zhet01_rook(uplo, n, a, lda, afac, ldafac, ipiv, c, ldc, rwork, resid)
ZHET01_ROOK
subroutine zlatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
ZLATB4
subroutine zlatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
ZLATMS
subroutine zpot02(uplo, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
ZPOT02