153
  154
  155
  156
  157
  158
  159      LOGICAL            TSTERR
  160      INTEGER            NMAX, NN, NOUT, NRHS
  161      REAL               THRESH
  162
  163
  164      LOGICAL            DOTYPE( * )
  165      INTEGER            IWORK( * ), NVAL( * )
  166      REAL               RWORK( * )
  167      COMPLEX            A( * ), AFAC( * ), AINV( * ), B( * ),
  168     $                   WORK( * ), X( * ), XACT( * )
  169
  170
  171
  172
  173
  174      REAL               ONE, ZERO
  175      parameter( one = 1.0e+0, zero = 0.0e+0 )
  176      INTEGER            NTYPES, NTESTS
  177      parameter( ntypes = 11, ntests = 6 )
  178      INTEGER            NFACT
  179      parameter( nfact = 2 )
  180
  181
  182      LOGICAL            ZEROT
  183      CHARACTER          DIST, FACT, TYPE, UPLO, XTYPE
  184      CHARACTER*3        PATH
  185      INTEGER            I, I1, I2, IFACT, IMAT, IN, INFO, IOFF, IUPLO,
  186     $                   IZERO, J, K, K1, KL, KU, LDA, LWORK, MODE, N,
  187     $                   NB, NBMIN, NERRS, NFAIL, NIMAT, NRUN, NT
  188      REAL               AINVNM, ANORM, CNDNUM, RCOND, RCONDC
  189
  190
  191      CHARACTER          FACTS( NFACT ), UPLOS( 2 )
  192      INTEGER            ISEED( 4 ), ISEEDY( 4 )
  193      REAL               RESULT( NTESTS )
  194
  195
  196      REAL               CLANSY, SGET06
  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          cmplx, 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      path( 1: 1 ) = 'Complex precision'
  226      path( 2: 3 ) = 'SY'
  227      nrun = 0
  228      nfail = 0
  229      nerrs = 0
  230      DO 10 i = 1, 4
  231         iseed( i ) = iseedy( i )
  232   10 CONTINUE
  233      lwork = max( 2*nmax, nmax*nrhs )
  234
  235
  236
  237      IF( tsterr )
  238     $   
CALL cerrvx( path, nout )
 
  239      infot = 0
  240
  241
  242
  243      nb = 1
  244      nbmin = 2
  247
  248
  249
  250      DO 180 in = 1, nn
  251         n = nval( in )
  252         lda = max( n, 1 )
  253         xtype = 'N'
  254         nimat = ntypes
  255         IF( n.LE.0 )
  256     $      nimat = 1
  257
  258         DO 170 imat = 1, nimat
  259
  260
  261
  262            IF( .NOT.dotype( imat ) )
  263     $         GO TO 170
  264
  265
  266
  267            zerot = imat.GE.3 .AND. imat.LE.6
  268            IF( zerot .AND. n.LT.imat-2 )
  269     $         GO TO 170
  270
  271
  272
  273            DO 160 iuplo = 1, 2
  274               uplo = uplos( iuplo )
  275
  276               IF( imat.NE.ntypes ) THEN
  277
  278
  279
  280
  281                  CALL clatb4( path, imat, n, n, 
TYPE, KL, KU, ANORM,
 
  282     $                         MODE, CNDNUM, DIST )
  283
  284                  srnamt = 'CLATMS'
  285                  CALL clatms( n, n, dist, iseed, 
TYPE, RWORK, MODE,
 
  286     $                         CNDNUM, ANORM, KL, KU, UPLO, A, LDA,
  287     $                         WORK, INFO )
  288
  289
  290
  291                  IF( info.NE.0 ) THEN
  292                     CALL alaerh( path, 
'CLATMS', info, 0, uplo, n, n,
 
  293     $                            -1, -1, -1, imat, nfail, nerrs, nout )
  294                     GO TO 160
  295                  END IF
  296
  297
  298
  299
  300                  IF( zerot ) THEN
  301                     IF( imat.EQ.3 ) THEN
  302                        izero = 1
  303                     ELSE IF( imat.EQ.4 ) THEN
  304                        izero = n
  305                     ELSE
  306                        izero = n / 2 + 1
  307                     END IF
  308
  309                     IF( imat.LT.6 ) THEN
  310
  311
  312
  313                        IF( iuplo.EQ.1 ) THEN
  314                           ioff = ( izero-1 )*lda
  315                           DO 20 i = 1, izero - 1
  316                              a( ioff+i ) = zero
  317   20                      CONTINUE
  318                           ioff = ioff + izero
  319                           DO 30 i = izero, n
  320                              a( ioff ) = zero
  321                              ioff = ioff + lda
  322   30                      CONTINUE
  323                        ELSE
  324                           ioff = izero
  325                           DO 40 i = 1, izero - 1
  326                              a( ioff ) = zero
  327                              ioff = ioff + lda
  328   40                      CONTINUE
  329                           ioff = ioff - izero
  330                           DO 50 i = izero, n
  331                              a( ioff+i ) = zero
  332   50                      CONTINUE
  333                        END IF
  334                     ELSE
  335                        IF( iuplo.EQ.1 ) THEN
  336
  337
  338
  339                           ioff = 0
  340                           DO 70 j = 1, n
  341                              i2 = min( j, izero )
  342                              DO 60 i = 1, i2
  343                                 a( ioff+i ) = zero
  344   60                         CONTINUE
  345                              ioff = ioff + lda
  346   70                      CONTINUE
  347                        ELSE
  348
  349
  350
  351                           ioff = 0
  352                           DO 90 j = 1, n
  353                              i1 = max( j, izero )
  354                              DO 80 i = i1, n
  355                                 a( ioff+i ) = zero
  356   80                         CONTINUE
  357                              ioff = ioff + lda
  358   90                      CONTINUE
  359                        END IF
  360                     END IF
  361                  ELSE
  362                     izero = 0
  363                  END IF
  364               ELSE
  365
  366
  367
  368
  369                  CALL clatsy( uplo, n, a, lda, iseed )
 
  370               END IF
  371
  372               DO 150 ifact = 1, nfact
  373
  374
  375
  376                  fact = facts( ifact )
  377
  378
  379
  380
  381                  IF( zerot ) THEN
  382                     IF( ifact.EQ.1 )
  383     $                  GO TO 150
  384                     rcondc = zero
  385
  386                  ELSE IF( ifact.EQ.1 ) THEN
  387
  388
  389
  390                     anorm = 
clansy( 
'1', uplo, n, a, lda, rwork )
 
  391
  392
  393
  394                     CALL clacpy( uplo, n, n, a, lda, afac, lda )
 
  395                     CALL csytrf( uplo, n, afac, lda, iwork, work,
 
  396     $                            lwork, info )
  397
  398
  399
  400                     CALL clacpy( uplo, n, n, afac, lda, ainv, lda )
 
  401                     lwork = (n+nb+1)*(nb+3)
  402                     CALL csytri2( uplo, n, ainv, lda, iwork, work,
 
  403     $                            lwork, info )
  404                     ainvnm = 
clansy( 
'1', uplo, n, ainv, lda, rwork )
 
  405
  406
  407
  408                     IF( anorm.LE.zero .OR. ainvnm.LE.zero ) THEN
  409                        rcondc = one
  410                     ELSE
  411                        rcondc = ( one / anorm ) / ainvnm
  412                     END IF
  413                  END IF
  414
  415
  416
  417                  srnamt = 'CLARHS'
  418                  CALL clarhs( path, xtype, uplo, 
' ', n, n, kl, ku,
 
  419     $                         nrhs, a, lda, xact, lda, b, lda, iseed,
  420     $                         info )
  421                  xtype = 'C'
  422
  423
  424
  425                  IF( ifact.EQ.2 ) THEN
  426                     CALL clacpy( uplo, n, n, a, lda, afac, lda )
 
  427                     CALL clacpy( 
'Full', n, nrhs, b, lda, x, lda )
 
  428
  429
  430
  431                     srnamt = 'CSYSV '
  432                     CALL csysv( uplo, n, nrhs, afac, lda, iwork, x,
 
  433     $                           lda, work, lwork, info )
  434
  435
  436
  437
  438                     k = izero
  439                     IF( k.GT.0 ) THEN
  440  100                   CONTINUE
  441                        IF( iwork( k ).LT.0 ) THEN
  442                           IF( iwork( k ).NE.-k ) THEN
  443                              k = -iwork( k )
  444                              GO TO 100
  445                           END IF
  446                        ELSE IF( iwork( k ).NE.k ) THEN
  447                           k = iwork( k )
  448                           GO TO 100
  449                        END IF
  450                     END IF
  451
  452
  453
  454                     IF( info.NE.k ) THEN
  455                        CALL alaerh( path, 
'CSYSV ', info, k, uplo, n,
 
  456     $                               n, -1, -1, nrhs, imat, nfail,
  457     $                               nerrs, nout )
  458                        GO TO 120
  459                     ELSE IF( info.NE.0 ) THEN
  460                        GO TO 120
  461                     END IF
  462
  463
  464
  465
  466                     CALL csyt01( uplo, n, a, lda, afac, lda, iwork,
 
  467     $                            ainv, lda, rwork, result( 1 ) )
  468
  469
  470
  471                     CALL clacpy( 
'Full', n, nrhs, b, lda, work, lda )
 
  472                     CALL csyt02( uplo, n, nrhs, a, lda, x, lda, work,
 
  473     $                            lda, rwork, result( 2 ) )
  474
  475
  476
  477                     CALL cget04( n, nrhs, x, lda, xact, lda, rcondc,
 
  478     $                            result( 3 ) )
  479                     nt = 3
  480
  481
  482
  483
  484                     DO 110 k = 1, nt
  485                        IF( result( k ).GE.thresh ) THEN
  486                           IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  487     $                        
CALL aladhd( nout, path )
 
  488                           WRITE( nout, fmt = 9999 )'CSYSV ', uplo, n,
  489     $                        imat, k, result( k )
  490                           nfail = nfail + 1
  491                        END IF
  492  110                CONTINUE
  493                     nrun = nrun + nt
  494  120                CONTINUE
  495                  END IF
  496
  497
  498
  499                  IF( ifact.EQ.2 )
  500     $               
CALL claset( uplo, n, n, cmplx( zero ),
 
  501     $                            cmplx( zero ), afac, lda )
  502                  CALL claset( 
'Full', n, nrhs, cmplx( zero ),
 
  503     $                         cmplx( zero ), x, lda )
  504
  505
  506
  507
  508                  srnamt = 'CSYSVX'
  509                  CALL csysvx( fact, uplo, n, nrhs, a, lda, afac, lda,
 
  510     $                         iwork, b, lda, x, lda, rcond, rwork,
  511     $                         rwork( nrhs+1 ), work, lwork,
  512     $                         rwork( 2*nrhs+1 ), info )
  513
  514
  515
  516
  517                  k = izero
  518                  IF( k.GT.0 ) THEN
  519  130                CONTINUE
  520                     IF( iwork( k ).LT.0 ) THEN
  521                        IF( iwork( k ).NE.-k ) THEN
  522                           k = -iwork( k )
  523                           GO TO 130
  524                        END IF
  525                     ELSE IF( iwork( k ).NE.k ) THEN
  526                        k = iwork( k )
  527                        GO TO 130
  528                     END IF
  529                  END IF
  530
  531
  532
  533                  IF( info.NE.k ) THEN
  534                     CALL alaerh( path, 
'CSYSVX', info, k, fact // uplo,
 
  535     $                            n, n, -1, -1, nrhs, imat, nfail,
  536     $                            nerrs, nout )
  537                     GO TO 150
  538                  END IF
  539
  540                  IF( info.EQ.0 ) THEN
  541                     IF( ifact.GE.2 ) THEN
  542
  543
  544
  545
  546                        CALL csyt01( uplo, n, a, lda, afac, lda, iwork,
 
  547     $                               ainv, lda, rwork( 2*nrhs+1 ),
  548     $                               result( 1 ) )
  549                        k1 = 1
  550                     ELSE
  551                        k1 = 2
  552                     END IF
  553
  554
  555
  556                     CALL clacpy( 
'Full', n, nrhs, b, lda, work, lda )
 
  557                     CALL csyt02( uplo, n, nrhs, a, lda, x, lda, work,
 
  558     $                            lda, rwork( 2*nrhs+1 ), result( 2 ) )
  559
  560
  561
  562                     CALL cget04( n, nrhs, x, lda, xact, lda, rcondc,
 
  563     $                            result( 3 ) )
  564
  565
  566
  567                     CALL cpot05( uplo, n, nrhs, a, lda, b, lda, x, lda,
 
  568     $                            xact, lda, rwork, rwork( nrhs+1 ),
  569     $                            result( 4 ) )
  570                  ELSE
  571                     k1 = 6
  572                  END IF
  573
  574
  575
  576
  577                  result( 6 ) = 
sget06( rcond, rcondc )
 
  578
  579
  580
  581
  582                  DO 140 k = k1, 6
  583                     IF( result( k ).GE.thresh ) THEN
  584                        IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
  585     $                     
CALL aladhd( nout, path )
 
  586                        WRITE( nout, fmt = 9998 )'CSYSVX', fact, uplo,
  587     $                     n, imat, k, result( k )
  588                        nfail = nfail + 1
  589                     END IF
  590  140             CONTINUE
  591                  nrun = nrun + 7 - k1
  592
  593  150          CONTINUE
  594
  595  160       CONTINUE
  596  170    CONTINUE
  597  180 CONTINUE
  598
  599
  600
  601      CALL alasvm( path, nout, nfail, nrun, nerrs )
 
  602
  603 9999 FORMAT( 1x, a, ', UPLO=''', a1, ''', N =', i5, ', type ', i2,
  604     $      ', test ', i2, ', ratio =', g12.5 )
  605 9998 FORMAT( 1x, a, ', FACT=''', a1, ''', UPLO=''', a1, ''', N =', i5,
  606     $      ', type ', i2, ', test ', i2, ', ratio =', g12.5 )
  607      RETURN
  608
  609
  610
subroutine alasvm(type, nout, nfail, nrun, nerrs)
ALASVM
subroutine clarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
CLARHS
subroutine xlaenv(ispec, nvalue)
XLAENV
subroutine aladhd(iounit, path)
ALADHD
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine cerrvx(path, nunit)
CERRVX
subroutine cget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
CGET04
subroutine clatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
CLATB4
subroutine clatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
CLATMS
subroutine clatsy(uplo, n, x, ldx, iseed)
CLATSY
subroutine cpot05(uplo, n, nrhs, a, lda, b, ldb, x, ldx, xact, ldxact, ferr, berr, reslts)
CPOT05
subroutine csyt01(uplo, n, a, lda, afac, ldafac, ipiv, c, ldc, rwork, resid)
CSYT01
subroutine csyt02(uplo, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
CSYT02
subroutine csysv(uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info)
CSYSV computes the solution to system of linear equations A * X = B for SY matrices
subroutine csysvx(fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, b, ldb, x, ldx, rcond, ferr, berr, work, lwork, rwork, info)
CSYSVX computes the solution to system of linear equations A * X = B for SY matrices
subroutine csytrf(uplo, n, a, lda, ipiv, work, lwork, info)
CSYTRF
subroutine csytri2(uplo, n, a, lda, ipiv, work, lwork, info)
CSYTRI2
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
real function clansy(norm, uplo, n, a, lda, work)
CLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine claset(uplo, m, n, alpha, beta, a, lda)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
real function sget06(rcond, rcondc)
SGET06