1*> \brief \b SDRVSYX
2*
3*  =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6*            http://www.netlib.org/lapack/explore-html/
7*
8*  Definition:
9*  ===========
10*
11*       SUBROUTINE SDRVSY( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, NMAX,
12*                          A, AFAC, AINV, B, X, XACT, WORK, RWORK, IWORK,
13*                          NOUT )
14*
15*       .. Scalar Arguments ..
16*       LOGICAL            TSTERR
17*       INTEGER            NMAX, NN, NOUT, NRHS
18*       REAL               THRESH
19*       ..
20*       .. Array Arguments ..
21*       LOGICAL            DOTYPE( * )
22*       INTEGER            IWORK( * ), NVAL( * )
23*       REAL               A( * ), AFAC( * ), AINV( * ), B( * ),
24*      $                   RWORK( * ), WORK( * ), X( * ), XACT( * )
25*       ..
26*
27*
28*> \par Purpose:
29*  =============
30*>
31*> \verbatim
32*>
33*> SDRVSY tests the driver routines SSYSV, -SVX, and -SVXX
34*>
35*> Note that this file is used only when the XBLAS are available,
36*> otherwise sdrvsy.f defines this subroutine.
37*> \endverbatim
38*
39*  Arguments:
40*  ==========
41*
42*> \param[in] DOTYPE
43*> \verbatim
44*>          DOTYPE is LOGICAL array, dimension (NTYPES)
45*>          The matrix types to be used for testing.  Matrices of type j
46*>          (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) =
47*>          .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used.
48*> \endverbatim
49*>
50*> \param[in] NN
51*> \verbatim
52*>          NN is INTEGER
53*>          The number of values of N contained in the vector NVAL.
54*> \endverbatim
55*>
56*> \param[in] NVAL
57*> \verbatim
58*>          NVAL is INTEGER array, dimension (NN)
59*>          The values of the matrix dimension N.
60*> \endverbatim
61*>
62*> \param[in] NRHS
63*> \verbatim
64*>          NRHS is INTEGER
65*>          The number of right hand side vectors to be generated for
66*>          each linear system.
67*> \endverbatim
68*>
69*> \param[in] THRESH
70*> \verbatim
71*>          THRESH is REAL
72*>          The threshold value for the test ratios.  A result is
73*>          included in the output file if RESULT >= THRESH.  To have
74*>          every test ratio printed, use THRESH = 0.
75*> \endverbatim
76*>
77*> \param[in] TSTERR
78*> \verbatim
79*>          TSTERR is LOGICAL
80*>          Flag that indicates whether error exits are to be tested.
81*> \endverbatim
82*>
83*> \param[in] NMAX
84*> \verbatim
85*>          NMAX is INTEGER
86*>          The maximum value permitted for N, used in dimensioning the
87*>          work arrays.
88*> \endverbatim
89*>
90*> \param[out] A
91*> \verbatim
92*>          A is REAL array, dimension (NMAX*NMAX)
93*> \endverbatim
94*>
95*> \param[out] AFAC
96*> \verbatim
97*>          AFAC is REAL array, dimension (NMAX*NMAX)
98*> \endverbatim
99*>
100*> \param[out] AINV
101*> \verbatim
102*>          AINV is REAL array, dimension (NMAX*NMAX)
103*> \endverbatim
104*>
105*> \param[out] B
106*> \verbatim
107*>          B is REAL array, dimension (NMAX*NRHS)
108*> \endverbatim
109*>
110*> \param[out] X
111*> \verbatim
112*>          X is REAL array, dimension (NMAX*NRHS)
113*> \endverbatim
114*>
115*> \param[out] XACT
116*> \verbatim
117*>          XACT is REAL array, dimension (NMAX*NRHS)
118*> \endverbatim
119*>
120*> \param[out] WORK
121*> \verbatim
122*>          WORK is REAL array, dimension
123*>                      (NMAX*max(2,NRHS))
124*> \endverbatim
125*>
126*> \param[out] RWORK
127*> \verbatim
128*>          RWORK is REAL array, dimension (NMAX+2*NRHS)
129*> \endverbatim
130*>
131*> \param[out] IWORK
132*> \verbatim
133*>          IWORK is INTEGER array, dimension (2*NMAX)
134*> \endverbatim
135*>
136*> \param[in] NOUT
137*> \verbatim
138*>          NOUT is INTEGER
139*>          The unit number for output.
140*> \endverbatim
141*
142*  Authors:
143*  ========
144*
145*> \author Univ. of Tennessee
146*> \author Univ. of California Berkeley
147*> \author Univ. of Colorado Denver
148*> \author NAG Ltd.
149*
150*> \date December 2016
151*
152*> \ingroup single_lin
153*
154*  =====================================================================
155      SUBROUTINE SDRVSY( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, NMAX,
156     $                   A, AFAC, AINV, B, X, XACT, WORK, RWORK, IWORK,
157     $                   NOUT )
158*
159*  -- LAPACK test routine (version 3.7.0) --
160*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
161*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
162*     December 2016
163*
164*     .. Scalar Arguments ..
165      LOGICAL            TSTERR
166      INTEGER            NMAX, NN, NOUT, NRHS
167      REAL               THRESH
168*     ..
169*     .. Array Arguments ..
170      LOGICAL            DOTYPE( * )
171      INTEGER            IWORK( * ), NVAL( * )
172      REAL               A( * ), AFAC( * ), AINV( * ), B( * ),
173     $                   RWORK( * ), WORK( * ), X( * ), XACT( * )
174*     ..
175*
176*  =====================================================================
177*
178*     .. Parameters ..
179      REAL               ONE, ZERO
180      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
181      INTEGER            NTYPES, NTESTS
182      PARAMETER          ( NTYPES = 10, NTESTS = 6 )
183      INTEGER            NFACT
184      PARAMETER          ( NFACT = 2 )
185*     ..
186*     .. Local Scalars ..
187      LOGICAL            ZEROT
188      CHARACTER          DIST, EQUED, FACT, TYPE, UPLO, XTYPE
189      CHARACTER*3        PATH
190      INTEGER            I, I1, I2, IFACT, IMAT, IN, INFO, IOFF, IUPLO,
191     $                   IZERO, J, K, K1, KL, KU, LDA, LWORK, MODE, N,
192     $                   NB, NBMIN, NERRS, NFAIL, NIMAT, NRUN, NT,
193     $                   N_ERR_BNDS
194      REAL               AINVNM, ANORM, CNDNUM, RCOND, RCONDC,
195     $                   RPVGRW_SVXX
196*     ..
197*     .. Local Arrays ..
198      CHARACTER          FACTS( NFACT ), UPLOS( 2 )
199      INTEGER            ISEED( 4 ), ISEEDY( 4 )
200      REAL               RESULT( NTESTS ), BERR( NRHS ),
201     $                   ERRBNDS_N( NRHS, 3 ), ERRBNDS_C( NRHS, 3 )
202*     ..
203*     .. External Functions ..
204      REAL               SGET06, SLANSY
205      EXTERNAL           SGET06, SLANSY
206*     ..
207*     .. External Subroutines ..
208      EXTERNAL           ALADHD, ALAERH, ALASVM, SERRVX, SGET04, SLACPY,
209     $                   SLARHS, SLASET, SLATB4, SLATMS, SPOT02, SPOT05,
210     $                   SSYSV, SSYSVX, SSYT01, SSYTRF, SSYTRI2, XLAENV,
211     $                   SSYSVXX
212*     ..
213*     .. Scalars in Common ..
214      LOGICAL            LERR, OK
215      CHARACTER*32       SRNAMT
216      INTEGER            INFOT, NUNIT
217*     ..
218*     .. Common blocks ..
219      COMMON             / INFOC / INFOT, NUNIT, OK, LERR
220      COMMON             / SRNAMC / SRNAMT
221*     ..
222*     .. Intrinsic Functions ..
223      INTRINSIC          MAX, MIN
224*     ..
225*     .. Data statements ..
226      DATA               ISEEDY / 1988, 1989, 1990, 1991 /
227      DATA               UPLOS / 'U', 'L' / , FACTS / 'F', 'N' /
228*     ..
229*     .. Executable Statements ..
230*
231*     Initialize constants and the random number seed.
232*
233      PATH( 1: 1 ) = 'Single precision'
234      PATH( 2: 3 ) = 'SY'
235      NRUN = 0
236      NFAIL = 0
237      NERRS = 0
238      DO 10 I = 1, 4
239         ISEED( I ) = ISEEDY( I )
240   10 CONTINUE
241      LWORK = MAX( 2*NMAX, NMAX*NRHS )
242*
243*     Test the error exits
244*
245      IF( TSTERR )
246     $   CALL SERRVX( PATH, NOUT )
247      INFOT = 0
248*
249*     Set the block size and minimum block size for testing.
250*
251      NB = 1
252      NBMIN = 2
253      CALL XLAENV( 1, NB )
254      CALL XLAENV( 2, NBMIN )
255*
256*     Do for each value of N in NVAL
257*
258      DO 180 IN = 1, NN
259         N = NVAL( IN )
260         LDA = MAX( N, 1 )
261         XTYPE = 'N'
262         NIMAT = NTYPES
263         IF( N.LE.0 )
264     $      NIMAT = 1
265*
266         DO 170 IMAT = 1, NIMAT
267*
268*           Do the tests only if DOTYPE( IMAT ) is true.
269*
270            IF( .NOT.DOTYPE( IMAT ) )
271     $         GO TO 170
272*
273*           Skip types 3, 4, 5, or 6 if the matrix size is too small.
274*
275            ZEROT = IMAT.GE.3 .AND. IMAT.LE.6
276            IF( ZEROT .AND. N.LT.IMAT-2 )
277     $         GO TO 170
278*
279*           Do first for UPLO = 'U', then for UPLO = 'L'
280*
281            DO 160 IUPLO = 1, 2
282               UPLO = UPLOS( IUPLO )
283*
284*              Set up parameters with SLATB4 and generate a test matrix
285*              with SLATMS.
286*
287               CALL SLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM, MODE,
288     $                      CNDNUM, DIST )
289*
290               SRNAMT = 'SLATMS'
291               CALL SLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE,
292     $                      CNDNUM, ANORM, KL, KU, UPLO, A, LDA, WORK,
293     $                      INFO )
294*
295*              Check error code from SLATMS.
296*
297               IF( INFO.NE.0 ) THEN
298                  CALL ALAERH( PATH, 'SLATMS', INFO, 0, UPLO, N, N, -1,
299     $                         -1, -1, IMAT, NFAIL, NERRS, NOUT )
300                  GO TO 160
301               END IF
302*
303*              For types 3-6, zero one or more rows and columns of the
304*              matrix to test that INFO is returned correctly.
305*
306               IF( ZEROT ) THEN
307                  IF( IMAT.EQ.3 ) THEN
308                     IZERO = 1
309                  ELSE IF( IMAT.EQ.4 ) THEN
310                     IZERO = N
311                  ELSE
312                     IZERO = N / 2 + 1
313                  END IF
314*
315                  IF( IMAT.LT.6 ) THEN
316*
317*                    Set row and column IZERO to zero.
318*
319                     IF( IUPLO.EQ.1 ) THEN
320                        IOFF = ( IZERO-1 )*LDA
321                        DO 20 I = 1, IZERO - 1
322                           A( IOFF+I ) = ZERO
323   20                   CONTINUE
324                        IOFF = IOFF + IZERO
325                        DO 30 I = IZERO, N
326                           A( IOFF ) = ZERO
327                           IOFF = IOFF + LDA
328   30                   CONTINUE
329                     ELSE
330                        IOFF = IZERO
331                        DO 40 I = 1, IZERO - 1
332                           A( IOFF ) = ZERO
333                           IOFF = IOFF + LDA
334   40                   CONTINUE
335                        IOFF = IOFF - IZERO
336                        DO 50 I = IZERO, N
337                           A( IOFF+I ) = ZERO
338   50                   CONTINUE
339                     END IF
340                  ELSE
341                     IOFF = 0
342                     IF( IUPLO.EQ.1 ) THEN
343*
344*                       Set the first IZERO rows and columns to zero.
345*
346                        DO 70 J = 1, N
347                           I2 = MIN( J, IZERO )
348                           DO 60 I = 1, I2
349                              A( IOFF+I ) = ZERO
350   60                      CONTINUE
351                           IOFF = IOFF + LDA
352   70                   CONTINUE
353                     ELSE
354*
355*                       Set the last IZERO rows and columns to zero.
356*
357                        DO 90 J = 1, N
358                           I1 = MAX( J, IZERO )
359                           DO 80 I = I1, N
360                              A( IOFF+I ) = ZERO
361   80                      CONTINUE
362                           IOFF = IOFF + LDA
363   90                   CONTINUE
364                     END IF
365                  END IF
366               ELSE
367                  IZERO = 0
368               END IF
369*
370               DO 150 IFACT = 1, NFACT
371*
372*                 Do first for FACT = 'F', then for other values.
373*
374                  FACT = FACTS( IFACT )
375*
376*                 Compute the condition number for comparison with
377*                 the value returned by SSYSVX.
378*
379                  IF( ZEROT ) THEN
380                     IF( IFACT.EQ.1 )
381     $                  GO TO 150
382                     RCONDC = ZERO
383*
384                  ELSE IF( IFACT.EQ.1 ) THEN
385*
386*                    Compute the 1-norm of A.
387*
388                     ANORM = SLANSY( '1', UPLO, N, A, LDA, RWORK )
389*
390*                    Factor the matrix A.
391*
392                     CALL SLACPY( UPLO, N, N, A, LDA, AFAC, LDA )
393                     CALL SSYTRF( UPLO, N, AFAC, LDA, IWORK, WORK,
394     $                            LWORK, INFO )
395*
396*                    Compute inv(A) and take its norm.
397*
398                     CALL SLACPY( UPLO, N, N, AFAC, LDA, AINV, LDA )
399                     LWORK = (N+NB+1)*(NB+3)
400                     CALL SSYTRI2( UPLO, N, AINV, LDA, IWORK, WORK,
401     $                            LWORK, INFO )
402                     AINVNM = SLANSY( '1', UPLO, N, AINV, LDA, RWORK )
403*
404*                    Compute the 1-norm condition number of A.
405*
406                     IF( ANORM.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
407                        RCONDC = ONE
408                     ELSE
409                        RCONDC = ( ONE / ANORM ) / AINVNM
410                     END IF
411                  END IF
412*
413*                 Form an exact solution and set the right hand side.
414*
415                  SRNAMT = 'SLARHS'
416                  CALL SLARHS( PATH, XTYPE, UPLO, ' ', N, N, KL, KU,
417     $                         NRHS, A, LDA, XACT, LDA, B, LDA, ISEED,
418     $                         INFO )
419                  XTYPE = 'C'
420*
421*                 --- Test SSYSV  ---
422*
423                  IF( IFACT.EQ.2 ) THEN
424                     CALL SLACPY( UPLO, N, N, A, LDA, AFAC, LDA )
425                     CALL SLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
426*
427*                    Factor the matrix and solve the system using SSYSV.
428*
429                     SRNAMT = 'SSYSV '
430                     CALL SSYSV( UPLO, N, NRHS, AFAC, LDA, IWORK, X,
431     $                           LDA, WORK, LWORK, INFO )
432*
433*                    Adjust the expected value of INFO to account for
434*                    pivoting.
435*
436                     K = IZERO
437                     IF( K.GT.0 ) THEN
438  100                   CONTINUE
439                        IF( IWORK( K ).LT.0 ) THEN
440                           IF( IWORK( K ).NE.-K ) THEN
441                              K = -IWORK( K )
442                              GO TO 100
443                           END IF
444                        ELSE IF( IWORK( K ).NE.K ) THEN
445                           K = IWORK( K )
446                           GO TO 100
447                        END IF
448                     END IF
449*
450*                    Check error code from SSYSV .
451*
452                     IF( INFO.NE.K ) THEN
453                        CALL ALAERH( PATH, 'SSYSV ', INFO, K, UPLO, N,
454     $                               N, -1, -1, NRHS, IMAT, NFAIL,
455     $                               NERRS, NOUT )
456                        GO TO 120
457                     ELSE IF( INFO.NE.0 ) THEN
458                        GO TO 120
459                     END IF
460*
461*                    Reconstruct matrix from factors and compute
462*                    residual.
463*
464                     CALL SSYT01( UPLO, N, A, LDA, AFAC, LDA, IWORK,
465     $                            AINV, LDA, RWORK, RESULT( 1 ) )
466*
467*                    Compute residual of the computed solution.
468*
469                     CALL SLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
470                     CALL SPOT02( UPLO, N, NRHS, A, LDA, X, LDA, WORK,
471     $                            LDA, RWORK, RESULT( 2 ) )
472*
473*                    Check solution from generated exact solution.
474*
475                     CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
476     $                            RESULT( 3 ) )
477                     NT = 3
478*
479*                    Print information about the tests that did not pass
480*                    the threshold.
481*
482                     DO 110 K = 1, NT
483                        IF( RESULT( K ).GE.THRESH ) THEN
484                           IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
485     $                        CALL ALADHD( NOUT, PATH )
486                           WRITE( NOUT, FMT = 9999 )'SSYSV ', UPLO, N,
487     $                        IMAT, K, RESULT( K )
488                           NFAIL = NFAIL + 1
489                        END IF
490  110                CONTINUE
491                     NRUN = NRUN + NT
492  120                CONTINUE
493                  END IF
494*
495*                 --- Test SSYSVX ---
496*
497                  IF( IFACT.EQ.2 )
498     $               CALL SLASET( UPLO, N, N, ZERO, ZERO, AFAC, LDA )
499                  CALL SLASET( 'Full', N, NRHS, ZERO, ZERO, X, LDA )
500*
501*                 Solve the system and compute the condition number and
502*                 error bounds using SSYSVX.
503*
504                  SRNAMT = 'SSYSVX'
505                  CALL SSYSVX( FACT, UPLO, N, NRHS, A, LDA, AFAC, LDA,
506     $                         IWORK, B, LDA, X, LDA, RCOND, RWORK,
507     $                         RWORK( NRHS+1 ), WORK, LWORK,
508     $                         IWORK( N+1 ), INFO )
509*
510*                 Adjust the expected value of INFO to account for
511*                 pivoting.
512*
513                  K = IZERO
514                  IF( K.GT.0 ) THEN
515  130                CONTINUE
516                     IF( IWORK( K ).LT.0 ) THEN
517                        IF( IWORK( K ).NE.-K ) THEN
518                           K = -IWORK( K )
519                           GO TO 130
520                        END IF
521                     ELSE IF( IWORK( K ).NE.K ) THEN
522                        K = IWORK( K )
523                        GO TO 130
524                     END IF
525                  END IF
526*
527*                 Check the error code from SSYSVX.
528*
529                  IF( INFO.NE.K ) THEN
530                     CALL ALAERH( PATH, 'SSYSVX', INFO, K, FACT // UPLO,
531     $                            N, N, -1, -1, NRHS, IMAT, NFAIL,
532     $                            NERRS, NOUT )
533                     GO TO 150
534                  END IF
535*
536                  IF( INFO.EQ.0 ) THEN
537                     IF( IFACT.GE.2 ) THEN
538*
539*                       Reconstruct matrix from factors and compute
540*                       residual.
541*
542                        CALL SSYT01( UPLO, N, A, LDA, AFAC, LDA, IWORK,
543     $                               AINV, LDA, RWORK( 2*NRHS+1 ),
544     $                               RESULT( 1 ) )
545                        K1 = 1
546                     ELSE
547                        K1 = 2
548                     END IF
549*
550*                    Compute residual of the computed solution.
551*
552                     CALL SLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
553                     CALL SPOT02( UPLO, N, NRHS, A, LDA, X, LDA, WORK,
554     $                            LDA, RWORK( 2*NRHS+1 ), RESULT( 2 ) )
555*
556*                    Check solution from generated exact solution.
557*
558                     CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
559     $                            RESULT( 3 ) )
560*
561*                    Check the error bounds from iterative refinement.
562*
563                     CALL SPOT05( UPLO, N, NRHS, A, LDA, B, LDA, X, LDA,
564     $                            XACT, LDA, RWORK, RWORK( NRHS+1 ),
565     $                            RESULT( 4 ) )
566                  ELSE
567                     K1 = 6
568                  END IF
569*
570*                 Compare RCOND from SSYSVX with the computed value
571*                 in RCONDC.
572*
573                  RESULT( 6 ) = SGET06( RCOND, RCONDC )
574*
575*                 Print information about the tests that did not pass
576*                 the threshold.
577*
578                  DO 140 K = K1, 6
579                     IF( RESULT( K ).GE.THRESH ) THEN
580                        IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
581     $                     CALL ALADHD( NOUT, PATH )
582                        WRITE( NOUT, FMT = 9998 )'SSYSVX', FACT, UPLO,
583     $                     N, IMAT, K, RESULT( K )
584                        NFAIL = NFAIL + 1
585                     END IF
586  140             CONTINUE
587                  NRUN = NRUN + 7 - K1
588*
589*                 --- Test SSYSVXX ---
590*
591*                 Restore the matrices A and B.
592*
593                  IF( IFACT.EQ.2 )
594     $               CALL SLASET( UPLO, N, N, ZERO, ZERO, AFAC, LDA )
595                  CALL SLASET( 'Full', N, NRHS, ZERO, ZERO, X, LDA )
596*
597*                 Solve the system and compute the condition number
598*                 and error bounds using SSYSVXX.
599*
600                  SRNAMT = 'SSYSVXX'
601                  N_ERR_BNDS = 3
602                  EQUED = 'N'
603                  CALL SSYSVXX( FACT, UPLO, N, NRHS, A, LDA, AFAC,
604     $                 LDA, IWORK, EQUED, WORK( N+1 ), B, LDA, X,
605     $                 LDA, RCOND, RPVGRW_SVXX, BERR, N_ERR_BNDS,
606     $                 ERRBNDS_N, ERRBNDS_C, 0, ZERO, WORK,
607     $                 IWORK( N+1 ), INFO )
608*
609*                 Adjust the expected value of INFO to account for
610*                 pivoting.
611*
612                  K = IZERO
613                  IF( K.GT.0 ) THEN
614 135                 CONTINUE
615                     IF( IWORK( K ).LT.0 ) THEN
616                        IF( IWORK( K ).NE.-K ) THEN
617                           K = -IWORK( K )
618                           GO TO 135
619                        END IF
620                     ELSE IF( IWORK( K ).NE.K ) THEN
621                        K = IWORK( K )
622                        GO TO 135
623                     END IF
624                  END IF
625*
626*                 Check the error code from SSYSVXX.
627*
628                  IF( INFO.NE.K .AND. INFO.LE.N ) THEN
629                     CALL ALAERH( PATH, 'SSYSVXX', INFO, K,
630     $                    FACT // UPLO, N, N, -1, -1, NRHS, IMAT, NFAIL,
631     $                    NERRS, NOUT )
632                     GO TO 150
633                  END IF
634*
635                  IF( INFO.EQ.0 ) THEN
636                     IF( IFACT.GE.2 ) THEN
637*
638*                 Reconstruct matrix from factors and compute
639*                 residual.
640*
641                        CALL SSYT01( UPLO, N, A, LDA, AFAC, LDA, IWORK,
642     $                       AINV, LDA, RWORK(2*NRHS+1),
643     $                       RESULT( 1 ) )
644                        K1 = 1
645                     ELSE
646                        K1 = 2
647                     END IF
648*
649*                 Compute residual of the computed solution.
650*
651                     CALL SLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
652                     CALL SPOT02( UPLO, N, NRHS, A, LDA, X, LDA, WORK,
653     $                    LDA, RWORK( 2*NRHS+1 ), RESULT( 2 ) )
654*
655*                 Check solution from generated exact solution.
656*
657                     CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
658     $                    RESULT( 3 ) )
659*
660*                 Check the error bounds from iterative refinement.
661*
662                     CALL SPOT05( UPLO, N, NRHS, A, LDA, B, LDA, X, LDA,
663     $                    XACT, LDA, RWORK, RWORK( NRHS+1 ),
664     $                    RESULT( 4 ) )
665                  ELSE
666                     K1 = 6
667                  END IF
668*
669*                 Compare RCOND from SSYSVXX with the computed value
670*                 in RCONDC.
671*
672                  RESULT( 6 ) = SGET06( RCOND, RCONDC )
673*
674*                 Print information about the tests that did not pass
675*                 the threshold.
676*
677                  DO 85 K = K1, 6
678                     IF( RESULT( K ).GE.THRESH ) THEN
679                        IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
680     $                       CALL ALADHD( NOUT, PATH )
681                        WRITE( NOUT, FMT = 9998 )'SSYSVXX',
682     $                       FACT, UPLO, N, IMAT, K,
683     $                       RESULT( K )
684                        NFAIL = NFAIL + 1
685                     END IF
686 85               CONTINUE
687                  NRUN = NRUN + 7 - K1
688*
689  150          CONTINUE
690*
691  160       CONTINUE
692  170    CONTINUE
693  180 CONTINUE
694*
695*     Print a summary of the results.
696*
697      CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
698*
699
700*     Test Error Bounds from SSYSVXX
701
702      CALL SEBCHVXX(THRESH, PATH)
703
704 9999 FORMAT( 1X, A, ', UPLO=''', A1, ''', N =', I5, ', type ', I2,
705     $      ', test ', I2, ', ratio =', G12.5 )
706 9998 FORMAT( 1X, A, ', FACT=''', A1, ''', UPLO=''', A1, ''', N =', I5,
707     $      ', type ', I2, ', test ', I2, ', ratio =', G12.5 )
708      RETURN
709*
710*     End of SDRVSY
711*
712      END
713