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   ANORM, CNDNUM
  189
  190
  191      CHARACTER          FACTS( NFACT ), UPLOS( 2 )
  192      INTEGER            ISEED( 4 ), ISEEDY( 4 )
  193      DOUBLE PRECISION   RESULT( NTESTS )
  194
  195
  196      DOUBLE PRECISION   DGET06, ZLANHE
  198
  199
  204
  205
  206      LOGICAL            LERR, OK
  207      CHARACTER*32       SRNAMT
  208      INTEGER            INFOT, NUNIT
  209
  210
  211      COMMON             / infoc / infot, nunit, ok, lerr
  212      COMMON             / srnamc / srnamt
  213
  214
  215      INTRINSIC          dcmplx, max, min
  216
  217
  218      DATA               iseedy / 1988, 1989, 1990, 1991 /
  219      DATA               uplos / 'U', 'L' / , facts / 'F', 'N' /
  220
  221
  222
  223
  224
  225
  226
  227      path( 1: 1 ) = 'Zomplex precision'
  228      path( 2: 3 ) = 'HA'
  229
  230
  231
  232      matpath( 1: 1 ) = 'Zomplex precision'
  233      matpath( 2: 3 ) = 'HE'
  234
  235      nrun = 0
  236      nfail = 0
  237      nerrs = 0
  238      DO 10 i = 1, 4
  239         iseed( i ) = iseedy( i )
  240   10 CONTINUE
  241
  242
  243
  244      IF( tsterr )
  245     $   
CALL zerrvx( path, nout )
 
  246      infot = 0
  247
  248
  249
  250      nb = 1
  251      nbmin = 2
  254
  255
  256
  257      DO 180 in = 1, nn
  258         n = nval( in )
  259         lwork = max( 3*n-2, n*(1+nb) )
  260         lwork = max( lwork, 1 )
  261         lda = max( n, 1 )
  262         xtype = 'N'
  263         nimat = ntypes
  264         IF( n.LE.0 )
  265     $      nimat = 1
  266
  267         DO 170 imat = 1, nimat
  268
  269
  270
  271            IF( .NOT.dotype( imat ) )
  272     $         GO TO 170
  273
  274
  275
  276            zerot = imat.GE.3 .AND. imat.LE.6
  277            IF( zerot .AND. n.LT.imat-2 )
  278     $         GO TO 170
  279
  280
  281
  282            DO 160 iuplo = 1, 2
  283               uplo = uplos( iuplo )
  284
  285
  286
  287
  288
  289
  290               CALL zlatb4( matpath, imat, n, n, 
TYPE, KL, KU, ANORM,
 
  291     $                       MODE, CNDNUM, DIST )
  292
  293               srnamt = 'ZLATMS'
  294               CALL zlatms( n, n, dist, iseed, 
TYPE, RWORK, MODE,
 
  295     $                      CNDNUM, ANORM, KL, KU, UPLO, A, LDA, WORK,
  296     $                      INFO )
  297
  298
  299
  300               IF( info.NE.0 ) THEN
  301                  CALL alaerh( path, 
'ZLATMS', info, 0, uplo, n, n, -1,
 
  302     $                         -1, -1, imat, nfail, nerrs, nout )
  303                  GO TO 160
  304               END IF
  305
  306
  307
  308
  309               IF( zerot ) THEN
  310                  IF( imat.EQ.3 ) THEN
  311                     izero = 1
  312                  ELSE IF( imat.EQ.4 ) THEN
  313                     izero = n
  314                  ELSE
  315                     izero = n / 2 + 1
  316                  END IF
  317
  318                  IF( imat.LT.6 ) THEN
  319
  320
  321
  322                     IF( iuplo.EQ.1 ) THEN
  323                        ioff = ( izero-1 )*lda
  324                        DO 20 i = 1, izero - 1
  325                           a( ioff+i ) = zero
  326   20                   CONTINUE
  327                        ioff = ioff + izero
  328                        DO 30 i = izero, n
  329                           a( ioff ) = zero
  330                           ioff = ioff + lda
  331   30                   CONTINUE
  332                     ELSE
  333                        ioff = izero
  334                        DO 40 i = 1, izero - 1
  335                           a( ioff ) = zero
  336                           ioff = ioff + lda
  337   40                   CONTINUE
  338                        ioff = ioff - izero
  339                        DO 50 i = izero, n
  340                           a( ioff+i ) = zero
  341   50                   CONTINUE
  342                     END IF
  343                  ELSE
  344                     ioff = 0
  345                     IF( iuplo.EQ.1 ) THEN
  346
  347
  348
  349                        DO 70 j = 1, n
  350                           i2 = min( j, izero )
  351                           DO 60 i = 1, i2
  352                              a( ioff+i ) = zero
  353   60                      CONTINUE
  354                           ioff = ioff + lda
  355   70                   CONTINUE
  356                        izero = 1
  357                     ELSE
  358
  359
  360
  361                        DO 90 j = 1, n
  362                           i1 = max( j, izero )
  363                           DO 80 i = i1, n
  364                              a( ioff+i ) = zero
  365   80                      CONTINUE
  366                           ioff = ioff + lda
  367   90                   CONTINUE
  368                     END IF
  369                  END IF
  370               ELSE
  371                  izero = 0
  372               END IF
  373
  374
  375
  376               CALL zlaipd( n, a, lda+1, 0 )
 
  377
  378               DO 150 ifact = 1, nfact
  379
  380
  381
  382                  fact = facts( ifact )
  383
  384
  385
  386                  srnamt = 'ZLARHS'
  387                  CALL zlarhs( matpath, xtype, uplo, 
' ', n, n, kl, ku,
 
  388     $                         nrhs, a, lda, xact, lda, b, lda, iseed,
  389     $                         info )
  390                  xtype = 'C'
  391
  392
  393
  394                  IF( ifact.EQ.2 ) THEN
  395                     CALL zlacpy( uplo, n, n, a, lda, afac, lda )
 
  396                     CALL zlacpy( 
'Full', n, nrhs, b, lda, x, lda )
 
  397
  398
  399
  400                     srnamt = 'ZHESV_AA '
  401                     CALL zhesv_aa( uplo, n, nrhs, afac, lda, iwork,
 
  402     $                                 x, lda, work, lwork, info )
  403
  404
  405
  406
  407                     IF( izero.GT.0 ) THEN
  408                        j = 1
  409                        k = izero
  410  100                   CONTINUE
  411                        IF( j.EQ.k ) THEN
  412                           k = iwork( j )
  413                        ELSE IF( iwork( j ).EQ.k ) THEN
  414                           k = j
  415                        END IF
  416                        IF( j.LT.k ) THEN
  417                           j = j + 1
  418                           GO TO 100
  419                        END IF
  420                     ELSE
  421                        k = 0
  422                     END IF
  423
  424
  425
  426                     IF( info.NE.k ) THEN
  427                        CALL alaerh( path, 
'ZHESV_AA', info, k, uplo, n,
 
  428     $                               n, -1, -1, nrhs, imat, nfail,
  429     $                               nerrs, nout )
  430                        GO TO 120
  431                     ELSE IF( info.NE.0 ) THEN
  432                        GO TO 120
  433                     END IF
  434
  435
  436
  437
  438                     CALL zhet01_aa( uplo, n, a, lda, afac, lda,
 
  439     $                                  iwork, ainv, lda, rwork,
  440     $                                  result( 1 ) )
  441
  442
  443
  444                     CALL zlacpy( 
'Full', n, nrhs, b, lda, work, lda )
 
  445                     CALL zpot02( uplo, n, nrhs, a, lda, x, lda, work,
 
  446     $                            lda, rwork, result( 2 ) )
  447                     nt = 2
  448
  449
  450
  451
  452                     DO 110 k = 1, nt
  453                        IF( result( k ).GE.thresh ) THEN
  454                           IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  455     $                        
CALL aladhd( nout, path )
 
  456                           WRITE( nout, fmt = 9999 )'ZHESV_AA', uplo, n,
  457     $                        imat, k, result( k )
  458                           nfail = nfail + 1
  459                        END IF
  460  110                CONTINUE
  461                     nrun = nrun + nt
  462  120                CONTINUE
  463                  END IF
  464
  465  150          CONTINUE
  466
  467  160       CONTINUE
  468  170    CONTINUE
  469  180 CONTINUE
  470
  471
  472
  473      CALL alasvm( path, nout, nfail, nrun, nerrs )
 
  474
  475 9999 FORMAT( 1x, a, ', UPLO=''', a1, ''', N =', i5, ', type ', i2,
  476     $      ', test ', i2, ', ratio =', g12.5 )
  477       RETURN
  478
  479
  480
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
double precision function dget06(rcond, rcondc)
DGET06
subroutine zhesv_aa(uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info)
ZHESV_AA computes the solution to system of linear equations A * X = B for HE matrices
subroutine zhetrf_aa(uplo, n, a, lda, ipiv, work, lwork, info)
ZHETRF_AA
subroutine zhetri2(uplo, n, a, lda, ipiv, work, lwork, info)
ZHETRI2
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_aa(uplo, n, a, lda, afac, ldafac, ipiv, c, ldc, rwork, resid)
ZHET01_AA
subroutine zlaipd(n, a, inda, vinda)
ZLAIPD
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