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 = 11, 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   ZLANSY
  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 ) = 'SR'
  230
  231
  232
  233      matpath( 1: 1 ) = 'Zomplex precision'
  234      matpath( 2: 3 ) = 'SY'
  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               IF( imat.NE.ntypes ) THEN
  287
  288
  289
  290
  291
  292
  293                  CALL zlatb4( matpath, imat, n, n, 
TYPE, KL, KU, ANORM,
 
  294     $                         MODE, CNDNUM, DIST )
  295
  296
  297
  298                  srnamt = 'ZLATMS'
  299                  CALL zlatms( n, n, dist, iseed, 
TYPE, RWORK, MODE,
 
  300     $                         CNDNUM, ANORM, KL, KU, UPLO, A, LDA,
  301     $                         WORK, INFO )
  302
  303
  304
  305                  IF( info.NE.0 ) THEN
  306                     CALL alaerh( path, 
'ZLATMS', info, 0, uplo, n, n,
 
  307     $                            -1, -1, -1, imat, nfail, nerrs, nout )
  308                     GO TO 160
  309                  END IF
  310
  311
  312
  313
  314                  IF( zerot ) THEN
  315                     IF( imat.EQ.3 ) THEN
  316                        izero = 1
  317                     ELSE IF( imat.EQ.4 ) THEN
  318                        izero = n
  319                     ELSE
  320                        izero = n / 2 + 1
  321                     END IF
  322
  323                     IF( imat.LT.6 ) THEN
  324
  325
  326
  327                        IF( iuplo.EQ.1 ) THEN
  328                           ioff = ( izero-1 )*lda
  329                           DO 20 i = 1, izero - 1
  330                              a( ioff+i ) = zero
  331   20                      CONTINUE
  332                           ioff = ioff + izero
  333                           DO 30 i = izero, n
  334                              a( ioff ) = zero
  335                              ioff = ioff + lda
  336   30                      CONTINUE
  337                        ELSE
  338                           ioff = izero
  339                           DO 40 i = 1, izero - 1
  340                              a( ioff ) = zero
  341                              ioff = ioff + lda
  342   40                      CONTINUE
  343                           ioff = ioff - izero
  344                           DO 50 i = izero, n
  345                              a( ioff+i ) = zero
  346   50                      CONTINUE
  347                        END IF
  348                     ELSE
  349                        IF( iuplo.EQ.1 ) THEN
  350
  351
  352
  353                           ioff = 0
  354                           DO 70 j = 1, n
  355                              i2 = min( j, izero )
  356                              DO 60 i = 1, i2
  357                                 a( ioff+i ) = zero
  358   60                         CONTINUE
  359                              ioff = ioff + lda
  360   70                      CONTINUE
  361                        ELSE
  362
  363
  364
  365                           ioff = 0
  366                           DO 90 j = 1, n
  367                              i1 = max( j, izero )
  368                              DO 80 i = i1, n
  369                                 a( ioff+i ) = zero
  370   80                         CONTINUE
  371                              ioff = ioff + lda
  372   90                      CONTINUE
  373                        END IF
  374                     END IF
  375                  ELSE
  376                     izero = 0
  377                  END IF
  378               ELSE
  379
  380
  381
  382
  383                  CALL zlatsy( uplo, n, a, lda, iseed )
 
  384               END IF
  385
  386               DO 150 ifact = 1, nfact
  387
  388
  389
  390                  fact = facts( ifact )
  391
  392
  393
  394
  395                  IF( zerot ) THEN
  396                     IF( ifact.EQ.1 )
  397     $                  GO TO 150
  398                     rcondc = zero
  399
  400                  ELSE IF( ifact.EQ.1 ) THEN
  401
  402
  403
  404                     anorm = 
zlansy( 
'1', uplo, n, a, lda, rwork )
 
  405
  406
  407
  408 
  409                     CALL zlacpy( uplo, n, n, a, lda, afac, lda )
 
  411     $                                 lwork, info )
  412
  413
  414
  415                     CALL zlacpy( uplo, n, n, afac, lda, ainv, lda )
 
  416                     lwork = (n+nb+1)*(nb+3)
  418     $                                 work, info )
  419                     ainvnm = 
zlansy( 
'1', uplo, n, ainv, lda, rwork )
 
  420
  421
  422
  423                     IF( anorm.LE.zero .OR. ainvnm.LE.zero ) THEN
  424                        rcondc = one
  425                     ELSE
  426                        rcondc = ( one / anorm ) / ainvnm
  427                     END IF
  428                  END IF
  429
  430
  431
  432                  srnamt = 'ZLARHS'
  433                  CALL zlarhs( matpath, xtype, uplo, 
' ', n, n, kl, ku,
 
  434     $                         nrhs, a, lda, xact, lda, b, lda, iseed,
  435     $                         info )
  436                  xtype = 'C'
  437
  438
  439
  440                  IF( ifact.EQ.2 ) THEN
  441                     CALL zlacpy( uplo, n, n, a, lda, afac, lda )
 
  442                     CALL zlacpy( 
'Full', n, nrhs, b, lda, x, lda )
 
  443
  444
  445
  446
  447                     srnamt = 'ZSYSV_ROOK'
  448                     CALL zsysv_rook( uplo, n, nrhs, afac, lda, iwork,
 
  449     $                                x, lda, work, lwork, info )
  450
  451
  452
  453
  454                     k = izero
  455                     IF( k.GT.0 ) THEN
  456  100                   CONTINUE
  457                        IF( iwork( k ).LT.0 ) THEN
  458                           IF( iwork( k ).NE.-k ) THEN
  459                              k = -iwork( k )
  460                              GO TO 100
  461                           END IF
  462                        ELSE IF( iwork( k ).NE.k ) THEN
  463                           k = iwork( k )
  464                           GO TO 100
  465                        END IF
  466                     END IF
  467
  468
  469
  470                     IF( info.NE.k ) THEN
  471                        CALL alaerh( path, 
'ZSYSV_ROOK', info, k, uplo,
 
  472     $                               n, n, -1, -1, nrhs, imat, nfail,
  473     $                               nerrs, nout )
  474                        GO TO 120
  475                     ELSE IF( info.NE.0 ) THEN
  476                        GO TO 120
  477                     END IF
  478
  479
  480
  481
  483     $                                 iwork, ainv, lda, rwork,
  484     $                                 result( 1 ) )
  485
  486
  487
  488                     CALL zlacpy( 
'Full', n, nrhs, b, lda, work, lda )
 
  489                     CALL zsyt02( uplo, n, nrhs, a, lda, x, lda, work,
 
  490     $                            lda, rwork, result( 2 ) )
  491
  492
  493
  494
  495                     CALL zget04( n, nrhs, x, lda, xact, lda, rcondc,
 
  496     $                            result( 3 ) )
  497                     nt = 3
  498
  499
  500
  501
  502                     DO 110 k = 1, nt
  503                        IF( result( k ).GE.thresh ) THEN
  504                           IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  505     $                        
CALL aladhd( nout, path )
 
  506                           WRITE( nout, fmt = 9999 )'ZSYSV_ROOK', uplo,
  507     $                            n, imat, k, result( k )
  508                           nfail = nfail + 1
  509                        END IF
  510  110                CONTINUE
  511                     nrun = nrun + nt
  512  120                CONTINUE
  513                  END IF
  514
  515  150          CONTINUE
  516
  517  160       CONTINUE
  518  170    CONTINUE
  519  180 CONTINUE
  520
  521
  522
  523      CALL alasvm( path, nout, nfail, nrun, nerrs )
 
  524
  525 9999 FORMAT( 1x, a, ', UPLO=''', a1, ''', N =', i5, ', type ', i2,
  526     $      ', test ', i2, ', ratio =', g12.5 )
  527      RETURN
  528
  529
  530
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 zsysv_rook(uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info)
ZSYSV_ROOK computes the solution to system of linear equations A * X = B for SY matrices
subroutine zsytrf_rook(uplo, n, a, lda, ipiv, work, lwork, info)
ZSYTRF_ROOK
subroutine zsytri_rook(uplo, n, a, lda, ipiv, work, info)
ZSYTRI_ROOK
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
double precision function zlansy(norm, uplo, n, a, lda, work)
ZLANSY 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 zerrvx(path, nunit)
ZERRVX
subroutine zget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
ZGET04
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 zlatsy(uplo, n, x, ldx, iseed)
ZLATSY
subroutine zpot05(uplo, n, nrhs, a, lda, b, ldb, x, ldx, xact, ldxact, ferr, berr, reslts)
ZPOT05
subroutine zsyt01_rook(uplo, n, a, lda, afac, ldafac, ipiv, c, ldc, rwork, resid)
ZSYT01_ROOK
subroutine zsyt02(uplo, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
ZSYT02