LAPACK  3.4.0
LAPACK: Linear Algebra PACKage
sblat2.f
Go to the documentation of this file.
00001 *> \brief \b SBLAT2
00002 *
00003 *  =========== DOCUMENTATION ===========
00004 *
00005 * Online html documentation available at 
00006 *            http://www.netlib.org/lapack/explore-html/ 
00007 *
00008 *  Definition:
00009 *  ===========
00010 *
00011 *       PROGRAM SBLAT2
00012 * 
00013 *
00014 *> \par Purpose:
00015 *  =============
00016 *>
00017 *> \verbatim
00018 *>
00019 *> Test program for the REAL Level 2 Blas.
00020 *>
00021 *> The program must be driven by a short data file. The first 18 records
00022 *> of the file are read using list-directed input, the last 16 records
00023 *> are read using the format ( A6, L2 ). An annotated example of a data
00024 *> file can be obtained by deleting the first 3 characters from the
00025 *> following 34 lines:
00026 *> 'sblat2.out'      NAME OF SUMMARY OUTPUT FILE
00027 *> 6                 UNIT NUMBER OF SUMMARY FILE
00028 *> 'SBLAT2.SNAP'     NAME OF SNAPSHOT OUTPUT FILE
00029 *> -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)
00030 *> F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.
00031 *> F        LOGICAL FLAG, T TO STOP ON FAILURES.
00032 *> T        LOGICAL FLAG, T TO TEST ERROR EXITS.
00033 *> 16.0     THRESHOLD VALUE OF TEST RATIO
00034 *> 6                 NUMBER OF VALUES OF N
00035 *> 0 1 2 3 5 9       VALUES OF N
00036 *> 4                 NUMBER OF VALUES OF K
00037 *> 0 1 2 4           VALUES OF K
00038 *> 4                 NUMBER OF VALUES OF INCX AND INCY
00039 *> 1 2 -1 -2         VALUES OF INCX AND INCY
00040 *> 3                 NUMBER OF VALUES OF ALPHA
00041 *> 0.0 1.0 0.7       VALUES OF ALPHA
00042 *> 3                 NUMBER OF VALUES OF BETA
00043 *> 0.0 1.0 0.9       VALUES OF BETA
00044 *> SGEMV  T PUT F FOR NO TEST. SAME COLUMNS.
00045 *> SGBMV  T PUT F FOR NO TEST. SAME COLUMNS.
00046 *> SSYMV  T PUT F FOR NO TEST. SAME COLUMNS.
00047 *> SSBMV  T PUT F FOR NO TEST. SAME COLUMNS.
00048 *> SSPMV  T PUT F FOR NO TEST. SAME COLUMNS.
00049 *> STRMV  T PUT F FOR NO TEST. SAME COLUMNS.
00050 *> STBMV  T PUT F FOR NO TEST. SAME COLUMNS.
00051 *> STPMV  T PUT F FOR NO TEST. SAME COLUMNS.
00052 *> STRSV  T PUT F FOR NO TEST. SAME COLUMNS.
00053 *> STBSV  T PUT F FOR NO TEST. SAME COLUMNS.
00054 *> STPSV  T PUT F FOR NO TEST. SAME COLUMNS.
00055 *> SGER   T PUT F FOR NO TEST. SAME COLUMNS.
00056 *> SSYR   T PUT F FOR NO TEST. SAME COLUMNS.
00057 *> SSPR   T PUT F FOR NO TEST. SAME COLUMNS.
00058 *> SSYR2  T PUT F FOR NO TEST. SAME COLUMNS.
00059 *> SSPR2  T PUT F FOR NO TEST. SAME COLUMNS.
00060 *>
00061 *> Further Details
00062 *> ===============
00063 *>
00064 *>    See:
00065 *>
00066 *>       Dongarra J. J., Du Croz J. J., Hammarling S.  and Hanson R. J..
00067 *>       An  extended  set of Fortran  Basic Linear Algebra Subprograms.
00068 *>
00069 *>       Technical  Memoranda  Nos. 41 (revision 3) and 81,  Mathematics
00070 *>       and  Computer Science  Division,  Argonne  National Laboratory,
00071 *>       9700 South Cass Avenue, Argonne, Illinois 60439, US.
00072 *>
00073 *>       Or
00074 *>
00075 *>       NAG  Technical Reports TR3/87 and TR4/87,  Numerical Algorithms
00076 *>       Group  Ltd.,  NAG  Central  Office,  256  Banbury  Road, Oxford
00077 *>       OX2 7DE, UK,  and  Numerical Algorithms Group Inc.,  1101  31st
00078 *>       Street,  Suite 100,  Downers Grove,  Illinois 60515-1263,  USA.
00079 *>
00080 *>
00081 *> -- Written on 10-August-1987.
00082 *>    Richard Hanson, Sandia National Labs.
00083 *>    Jeremy Du Croz, NAG Central Office.
00084 *>
00085 *>    10-9-00:  Change STATUS='NEW' to 'UNKNOWN' so that the testers
00086 *>              can be run multiple times without deleting generated
00087 *>              output files (susan)
00088 *> \endverbatim
00089 *
00090 *  Authors:
00091 *  ========
00092 *
00093 *> \author Univ. of Tennessee 
00094 *> \author Univ. of California Berkeley 
00095 *> \author Univ. of Colorado Denver 
00096 *> \author NAG Ltd. 
00097 *
00098 *> \date November 2011
00099 *
00100 *> \ingroup single_blas_testing
00101 *
00102 *  =====================================================================      PROGRAM SBLAT2
00103 *
00104 *  -- Reference BLAS test routine (version 3.4.0) --
00105 *  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --
00106 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00107 *     November 2011
00108 *
00109 *  =====================================================================
00110 *
00111 *     .. Parameters ..
00112       INTEGER            NIN
00113       PARAMETER          ( NIN = 5 )
00114       INTEGER            NSUBS
00115       PARAMETER          ( NSUBS = 16 )
00116       REAL               ZERO, HALF, ONE
00117       PARAMETER          ( ZERO = 0.0, HALF = 0.5, ONE = 1.0 )
00118       INTEGER            NMAX, INCMAX
00119       PARAMETER          ( NMAX = 65, INCMAX = 2 )
00120       INTEGER            NINMAX, NIDMAX, NKBMAX, NALMAX, NBEMAX
00121       PARAMETER          ( NINMAX = 7, NIDMAX = 9, NKBMAX = 7,
00122      $                   NALMAX = 7, NBEMAX = 7 )
00123 *     .. Local Scalars ..
00124       REAL               EPS, ERR, THRESH
00125       INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NINC, NKB,
00126      $                   NOUT, NTRA
00127       LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,
00128      $                   TSTERR
00129       CHARACTER*1        TRANS
00130       CHARACTER*6        SNAMET
00131       CHARACTER*32       SNAPS, SUMMRY
00132 *     .. Local Arrays ..
00133       REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ),
00134      $                   ALF( NALMAX ), AS( NMAX*NMAX ), BET( NBEMAX ),
00135      $                   G( NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
00136      $                   XX( NMAX*INCMAX ), Y( NMAX ),
00137      $                   YS( NMAX*INCMAX ), YT( NMAX ),
00138      $                   YY( NMAX*INCMAX ), Z( 2*NMAX )
00139       INTEGER            IDIM( NIDMAX ), INC( NINMAX ), KB( NKBMAX )
00140       LOGICAL            LTEST( NSUBS )
00141       CHARACTER*6        SNAMES( NSUBS )
00142 *     .. External Functions ..
00143       REAL               SDIFF
00144       LOGICAL            LSE
00145       EXTERNAL           SDIFF, LSE
00146 *     .. External Subroutines ..
00147       EXTERNAL           SCHK1, SCHK2, SCHK3, SCHK4, SCHK5, SCHK6,
00148      $                   SCHKE, SMVCH
00149 *     .. Intrinsic Functions ..
00150       INTRINSIC          ABS, MAX, MIN
00151 *     .. Scalars in Common ..
00152       INTEGER            INFOT, NOUTC
00153       LOGICAL            LERR, OK
00154       CHARACTER*6        SRNAMT
00155 *     .. Common blocks ..
00156       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
00157       COMMON             /SRNAMC/SRNAMT
00158 *     .. Data statements ..
00159       DATA               SNAMES/'SGEMV ', 'SGBMV ', 'SSYMV ', 'SSBMV ',
00160      $                   'SSPMV ', 'STRMV ', 'STBMV ', 'STPMV ',
00161      $                   'STRSV ', 'STBSV ', 'STPSV ', 'SGER  ',
00162      $                   'SSYR  ', 'SSPR  ', 'SSYR2 ', 'SSPR2 '/
00163 *     .. Executable Statements ..
00164 *
00165 *     Read name and unit number for summary output file and open file.
00166 *
00167       READ( NIN, FMT = * )SUMMRY
00168       READ( NIN, FMT = * )NOUT
00169       OPEN( NOUT, FILE = SUMMRY, STATUS = 'UNKNOWN' )
00170       NOUTC = NOUT
00171 *
00172 *     Read name and unit number for snapshot output file and open file.
00173 *
00174       READ( NIN, FMT = * )SNAPS
00175       READ( NIN, FMT = * )NTRA
00176       TRACE = NTRA.GE.0
00177       IF( TRACE )THEN
00178          OPEN( NTRA, FILE = SNAPS, STATUS = 'UNKNOWN' )
00179       END IF
00180 *     Read the flag that directs rewinding of the snapshot file.
00181       READ( NIN, FMT = * )REWI
00182       REWI = REWI.AND.TRACE
00183 *     Read the flag that directs stopping on any failure.
00184       READ( NIN, FMT = * )SFATAL
00185 *     Read the flag that indicates whether error exits are to be tested.
00186       READ( NIN, FMT = * )TSTERR
00187 *     Read the threshold value of the test ratio
00188       READ( NIN, FMT = * )THRESH
00189 *
00190 *     Read and check the parameter values for the tests.
00191 *
00192 *     Values of N
00193       READ( NIN, FMT = * )NIDIM
00194       IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN
00195          WRITE( NOUT, FMT = 9997 )'N', NIDMAX
00196          GO TO 230
00197       END IF
00198       READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )
00199       DO 10 I = 1, NIDIM
00200          IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN
00201             WRITE( NOUT, FMT = 9996 )NMAX
00202             GO TO 230
00203          END IF
00204    10 CONTINUE
00205 *     Values of K
00206       READ( NIN, FMT = * )NKB
00207       IF( NKB.LT.1.OR.NKB.GT.NKBMAX )THEN
00208          WRITE( NOUT, FMT = 9997 )'K', NKBMAX
00209          GO TO 230
00210       END IF
00211       READ( NIN, FMT = * )( KB( I ), I = 1, NKB )
00212       DO 20 I = 1, NKB
00213          IF( KB( I ).LT.0 )THEN
00214             WRITE( NOUT, FMT = 9995 )
00215             GO TO 230
00216          END IF
00217    20 CONTINUE
00218 *     Values of INCX and INCY
00219       READ( NIN, FMT = * )NINC
00220       IF( NINC.LT.1.OR.NINC.GT.NINMAX )THEN
00221          WRITE( NOUT, FMT = 9997 )'INCX AND INCY', NINMAX
00222          GO TO 230
00223       END IF
00224       READ( NIN, FMT = * )( INC( I ), I = 1, NINC )
00225       DO 30 I = 1, NINC
00226          IF( INC( I ).EQ.0.OR.ABS( INC( I ) ).GT.INCMAX )THEN
00227             WRITE( NOUT, FMT = 9994 )INCMAX
00228             GO TO 230
00229          END IF
00230    30 CONTINUE
00231 *     Values of ALPHA
00232       READ( NIN, FMT = * )NALF
00233       IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN
00234          WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX
00235          GO TO 230
00236       END IF
00237       READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )
00238 *     Values of BETA
00239       READ( NIN, FMT = * )NBET
00240       IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN
00241          WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX
00242          GO TO 230
00243       END IF
00244       READ( NIN, FMT = * )( BET( I ), I = 1, NBET )
00245 *
00246 *     Report values of parameters.
00247 *
00248       WRITE( NOUT, FMT = 9993 )
00249       WRITE( NOUT, FMT = 9992 )( IDIM( I ), I = 1, NIDIM )
00250       WRITE( NOUT, FMT = 9991 )( KB( I ), I = 1, NKB )
00251       WRITE( NOUT, FMT = 9990 )( INC( I ), I = 1, NINC )
00252       WRITE( NOUT, FMT = 9989 )( ALF( I ), I = 1, NALF )
00253       WRITE( NOUT, FMT = 9988 )( BET( I ), I = 1, NBET )
00254       IF( .NOT.TSTERR )THEN
00255          WRITE( NOUT, FMT = * )
00256          WRITE( NOUT, FMT = 9980 )
00257       END IF
00258       WRITE( NOUT, FMT = * )
00259       WRITE( NOUT, FMT = 9999 )THRESH
00260       WRITE( NOUT, FMT = * )
00261 *
00262 *     Read names of subroutines and flags which indicate
00263 *     whether they are to be tested.
00264 *
00265       DO 40 I = 1, NSUBS
00266          LTEST( I ) = .FALSE.
00267    40 CONTINUE
00268    50 READ( NIN, FMT = 9984, END = 80 )SNAMET, LTESTT
00269       DO 60 I = 1, NSUBS
00270          IF( SNAMET.EQ.SNAMES( I ) )
00271      $      GO TO 70
00272    60 CONTINUE
00273       WRITE( NOUT, FMT = 9986 )SNAMET
00274       STOP
00275    70 LTEST( I ) = LTESTT
00276       GO TO 50
00277 *
00278    80 CONTINUE
00279       CLOSE ( NIN )
00280 *
00281 *     Compute EPS (the machine precision).
00282 *
00283       EPS = ONE
00284    90 CONTINUE
00285       IF( SDIFF( ONE + EPS, ONE ).EQ.ZERO )
00286      $   GO TO 100
00287       EPS = HALF*EPS
00288       GO TO 90
00289   100 CONTINUE
00290       EPS = EPS + EPS
00291       WRITE( NOUT, FMT = 9998 )EPS
00292 *
00293 *     Check the reliability of SMVCH using exact data.
00294 *
00295       N = MIN( 32, NMAX )
00296       DO 120 J = 1, N
00297          DO 110 I = 1, N
00298             A( I, J ) = MAX( I - J + 1, 0 )
00299   110    CONTINUE
00300          X( J ) = J
00301          Y( J ) = ZERO
00302   120 CONTINUE
00303       DO 130 J = 1, N
00304          YY( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3
00305   130 CONTINUE
00306 *     YY holds the exact result. On exit from SMVCH YT holds
00307 *     the result computed by SMVCH.
00308       TRANS = 'N'
00309       CALL SMVCH( TRANS, N, N, ONE, A, NMAX, X, 1, ZERO, Y, 1, YT, G,
00310      $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )
00311       SAME = LSE( YY, YT, N )
00312       IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN
00313          WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR
00314          STOP
00315       END IF
00316       TRANS = 'T'
00317       CALL SMVCH( TRANS, N, N, ONE, A, NMAX, X, -1, ZERO, Y, -1, YT, G,
00318      $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )
00319       SAME = LSE( YY, YT, N )
00320       IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN
00321          WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR
00322          STOP
00323       END IF
00324 *
00325 *     Test each subroutine in turn.
00326 *
00327       DO 210 ISNUM = 1, NSUBS
00328          WRITE( NOUT, FMT = * )
00329          IF( .NOT.LTEST( ISNUM ) )THEN
00330 *           Subprogram is not to be tested.
00331             WRITE( NOUT, FMT = 9983 )SNAMES( ISNUM )
00332          ELSE
00333             SRNAMT = SNAMES( ISNUM )
00334 *           Test error exits.
00335             IF( TSTERR )THEN
00336                CALL SCHKE( ISNUM, SNAMES( ISNUM ), NOUT )
00337                WRITE( NOUT, FMT = * )
00338             END IF
00339 *           Test computations.
00340             INFOT = 0
00341             OK = .TRUE.
00342             FATAL = .FALSE.
00343             GO TO ( 140, 140, 150, 150, 150, 160, 160,
00344      $              160, 160, 160, 160, 170, 180, 180,
00345      $              190, 190 )ISNUM
00346 *           Test SGEMV, 01, and SGBMV, 02.
00347   140       CALL SCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
00348      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,
00349      $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,
00350      $                  X, XX, XS, Y, YY, YS, YT, G )
00351             GO TO 200
00352 *           Test SSYMV, 03, SSBMV, 04, and SSPMV, 05.
00353   150       CALL SCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
00354      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,
00355      $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,
00356      $                  X, XX, XS, Y, YY, YS, YT, G )
00357             GO TO 200
00358 *           Test STRMV, 06, STBMV, 07, STPMV, 08,
00359 *           STRSV, 09, STBSV, 10, and STPSV, 11.
00360   160       CALL SCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
00361      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC,
00362      $                  NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z )
00363             GO TO 200
00364 *           Test SGER, 12.
00365   170       CALL SCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
00366      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
00367      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
00368      $                  YT, G, Z )
00369             GO TO 200
00370 *           Test SSYR, 13, and SSPR, 14.
00371   180       CALL SCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
00372      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
00373      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
00374      $                  YT, G, Z )
00375             GO TO 200
00376 *           Test SSYR2, 15, and SSPR2, 16.
00377   190       CALL SCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
00378      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
00379      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
00380      $                  YT, G, Z )
00381 *
00382   200       IF( FATAL.AND.SFATAL )
00383      $         GO TO 220
00384          END IF
00385   210 CONTINUE
00386       WRITE( NOUT, FMT = 9982 )
00387       GO TO 240
00388 *
00389   220 CONTINUE
00390       WRITE( NOUT, FMT = 9981 )
00391       GO TO 240
00392 *
00393   230 CONTINUE
00394       WRITE( NOUT, FMT = 9987 )
00395 *
00396   240 CONTINUE
00397       IF( TRACE )
00398      $   CLOSE ( NTRA )
00399       CLOSE ( NOUT )
00400       STOP
00401 *
00402  9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',
00403      $      'S THAN', F8.2 )
00404  9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, E9.1 )
00405  9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',
00406      $      'THAN ', I2 )
00407  9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )
00408  9995 FORMAT( ' VALUE OF K IS LESS THAN 0' )
00409  9994 FORMAT( ' ABSOLUTE VALUE OF INCX OR INCY IS 0 OR GREATER THAN ',
00410      $      I2 )
00411  9993 FORMAT( ' TESTS OF THE REAL             LEVEL 2 BLAS', //' THE F',
00412      $      'OLLOWING PARAMETER VALUES WILL BE USED:' )
00413  9992 FORMAT( '   FOR N              ', 9I6 )
00414  9991 FORMAT( '   FOR K              ', 7I6 )
00415  9990 FORMAT( '   FOR INCX AND INCY  ', 7I6 )
00416  9989 FORMAT( '   FOR ALPHA          ', 7F6.1 )
00417  9988 FORMAT( '   FOR BETA           ', 7F6.1 )
00418  9987 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',
00419      $      /' ******* TESTS ABANDONED *******' )
00420  9986 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',
00421      $      'ESTS ABANDONED *******' )
00422  9985 FORMAT( ' ERROR IN SMVCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',
00423      $      'ATED WRONGLY.', /' SMVCH WAS CALLED WITH TRANS = ', A1,
00424      $      ' AND RETURNED SAME = ', L1, ' AND ERR = ', F12.3, '.', /
00425      $   ' THIS MAY BE DUE TO FAULTS IN THE ARITHMETIC OR THE COMPILER.'
00426      $      , /' ******* TESTS ABANDONED *******' )
00427  9984 FORMAT( A6, L2 )
00428  9983 FORMAT( 1X, A6, ' WAS NOT TESTED' )
00429  9982 FORMAT( /' END OF TESTS' )
00430  9981 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )
00431  9980 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )
00432 *
00433 *     End of SBLAT2.
00434 *
00435       END
00436       SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
00437      $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,
00438      $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,
00439      $                  XS, Y, YY, YS, YT, G )
00440 *
00441 *  Tests SGEMV and SGBMV.
00442 *
00443 *  Auxiliary routine for test program for Level 2 Blas.
00444 *
00445 *  -- Written on 10-August-1987.
00446 *     Richard Hanson, Sandia National Labs.
00447 *     Jeremy Du Croz, NAG Central Office.
00448 *
00449 *     .. Parameters ..
00450       REAL               ZERO, HALF
00451       PARAMETER          ( ZERO = 0.0, HALF = 0.5 )
00452 *     .. Scalar Arguments ..
00453       REAL               EPS, THRESH
00454       INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,
00455      $                   NOUT, NTRA
00456       LOGICAL            FATAL, REWI, TRACE
00457       CHARACTER*6        SNAME
00458 *     .. Array Arguments ..
00459       REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
00460      $                   AS( NMAX*NMAX ), BET( NBET ), G( NMAX ),
00461      $                   X( NMAX ), XS( NMAX*INCMAX ),
00462      $                   XX( NMAX*INCMAX ), Y( NMAX ),
00463      $                   YS( NMAX*INCMAX ), YT( NMAX ),
00464      $                   YY( NMAX*INCMAX )
00465       INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )
00466 *     .. Local Scalars ..
00467       REAL               ALPHA, ALS, BETA, BLS, ERR, ERRMAX, TRANSL
00468       INTEGER            I, IA, IB, IC, IKU, IM, IN, INCX, INCXS, INCY,
00469      $                   INCYS, IX, IY, KL, KLS, KU, KUS, LAA, LDA,
00470      $                   LDAS, LX, LY, M, ML, MS, N, NARGS, NC, ND, NK,
00471      $                   NL, NS
00472       LOGICAL            BANDED, FULL, NULL, RESET, SAME, TRAN
00473       CHARACTER*1        TRANS, TRANSS
00474       CHARACTER*3        ICH
00475 *     .. Local Arrays ..
00476       LOGICAL            ISAME( 13 )
00477 *     .. External Functions ..
00478       LOGICAL            LSE, LSERES
00479       EXTERNAL           LSE, LSERES
00480 *     .. External Subroutines ..
00481       EXTERNAL           SGBMV, SGEMV, SMAKE, SMVCH
00482 *     .. Intrinsic Functions ..
00483       INTRINSIC          ABS, MAX, MIN
00484 *     .. Scalars in Common ..
00485       INTEGER            INFOT, NOUTC
00486       LOGICAL            LERR, OK
00487 *     .. Common blocks ..
00488       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
00489 *     .. Data statements ..
00490       DATA               ICH/'NTC'/
00491 *     .. Executable Statements ..
00492       FULL = SNAME( 3: 3 ).EQ.'E'
00493       BANDED = SNAME( 3: 3 ).EQ.'B'
00494 *     Define the number of arguments.
00495       IF( FULL )THEN
00496          NARGS = 11
00497       ELSE IF( BANDED )THEN
00498          NARGS = 13
00499       END IF
00500 *
00501       NC = 0
00502       RESET = .TRUE.
00503       ERRMAX = ZERO
00504 *
00505       DO 120 IN = 1, NIDIM
00506          N = IDIM( IN )
00507          ND = N/2 + 1
00508 *
00509          DO 110 IM = 1, 2
00510             IF( IM.EQ.1 )
00511      $         M = MAX( N - ND, 0 )
00512             IF( IM.EQ.2 )
00513      $         M = MIN( N + ND, NMAX )
00514 *
00515             IF( BANDED )THEN
00516                NK = NKB
00517             ELSE
00518                NK = 1
00519             END IF
00520             DO 100 IKU = 1, NK
00521                IF( BANDED )THEN
00522                   KU = KB( IKU )
00523                   KL = MAX( KU - 1, 0 )
00524                ELSE
00525                   KU = N - 1
00526                   KL = M - 1
00527                END IF
00528 *              Set LDA to 1 more than minimum value if room.
00529                IF( BANDED )THEN
00530                   LDA = KL + KU + 1
00531                ELSE
00532                   LDA = M
00533                END IF
00534                IF( LDA.LT.NMAX )
00535      $            LDA = LDA + 1
00536 *              Skip tests if not enough room.
00537                IF( LDA.GT.NMAX )
00538      $            GO TO 100
00539                LAA = LDA*N
00540                NULL = N.LE.0.OR.M.LE.0
00541 *
00542 *              Generate the matrix A.
00543 *
00544                TRANSL = ZERO
00545                CALL SMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX, AA,
00546      $                     LDA, KL, KU, RESET, TRANSL )
00547 *
00548                DO 90 IC = 1, 3
00549                   TRANS = ICH( IC: IC )
00550                   TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'
00551 *
00552                   IF( TRAN )THEN
00553                      ML = N
00554                      NL = M
00555                   ELSE
00556                      ML = M
00557                      NL = N
00558                   END IF
00559 *
00560                   DO 80 IX = 1, NINC
00561                      INCX = INC( IX )
00562                      LX = ABS( INCX )*NL
00563 *
00564 *                    Generate the vector X.
00565 *
00566                      TRANSL = HALF
00567                      CALL SMAKE( 'GE', ' ', ' ', 1, NL, X, 1, XX,
00568      $                           ABS( INCX ), 0, NL - 1, RESET, TRANSL )
00569                      IF( NL.GT.1 )THEN
00570                         X( NL/2 ) = ZERO
00571                         XX( 1 + ABS( INCX )*( NL/2 - 1 ) ) = ZERO
00572                      END IF
00573 *
00574                      DO 70 IY = 1, NINC
00575                         INCY = INC( IY )
00576                         LY = ABS( INCY )*ML
00577 *
00578                         DO 60 IA = 1, NALF
00579                            ALPHA = ALF( IA )
00580 *
00581                            DO 50 IB = 1, NBET
00582                               BETA = BET( IB )
00583 *
00584 *                             Generate the vector Y.
00585 *
00586                               TRANSL = ZERO
00587                               CALL SMAKE( 'GE', ' ', ' ', 1, ML, Y, 1,
00588      $                                    YY, ABS( INCY ), 0, ML - 1,
00589      $                                    RESET, TRANSL )
00590 *
00591                               NC = NC + 1
00592 *
00593 *                             Save every datum before calling the
00594 *                             subroutine.
00595 *
00596                               TRANSS = TRANS
00597                               MS = M
00598                               NS = N
00599                               KLS = KL
00600                               KUS = KU
00601                               ALS = ALPHA
00602                               DO 10 I = 1, LAA
00603                                  AS( I ) = AA( I )
00604    10                         CONTINUE
00605                               LDAS = LDA
00606                               DO 20 I = 1, LX
00607                                  XS( I ) = XX( I )
00608    20                         CONTINUE
00609                               INCXS = INCX
00610                               BLS = BETA
00611                               DO 30 I = 1, LY
00612                                  YS( I ) = YY( I )
00613    30                         CONTINUE
00614                               INCYS = INCY
00615 *
00616 *                             Call the subroutine.
00617 *
00618                               IF( FULL )THEN
00619                                  IF( TRACE )
00620      $                              WRITE( NTRA, FMT = 9994 )NC, SNAME,
00621      $                              TRANS, M, N, ALPHA, LDA, INCX, BETA,
00622      $                              INCY
00623                                  IF( REWI )
00624      $                              REWIND NTRA
00625                                  CALL SGEMV( TRANS, M, N, ALPHA, AA,
00626      $                                       LDA, XX, INCX, BETA, YY,
00627      $                                       INCY )
00628                               ELSE IF( BANDED )THEN
00629                                  IF( TRACE )
00630      $                              WRITE( NTRA, FMT = 9995 )NC, SNAME,
00631      $                              TRANS, M, N, KL, KU, ALPHA, LDA,
00632      $                              INCX, BETA, INCY
00633                                  IF( REWI )
00634      $                              REWIND NTRA
00635                                  CALL SGBMV( TRANS, M, N, KL, KU, ALPHA,
00636      $                                       AA, LDA, XX, INCX, BETA,
00637      $                                       YY, INCY )
00638                               END IF
00639 *
00640 *                             Check if error-exit was taken incorrectly.
00641 *
00642                               IF( .NOT.OK )THEN
00643                                  WRITE( NOUT, FMT = 9993 )
00644                                  FATAL = .TRUE.
00645                                  GO TO 130
00646                               END IF
00647 *
00648 *                             See what data changed inside subroutines.
00649 *
00650                               ISAME( 1 ) = TRANS.EQ.TRANSS
00651                               ISAME( 2 ) = MS.EQ.M
00652                               ISAME( 3 ) = NS.EQ.N
00653                               IF( FULL )THEN
00654                                  ISAME( 4 ) = ALS.EQ.ALPHA
00655                                  ISAME( 5 ) = LSE( AS, AA, LAA )
00656                                  ISAME( 6 ) = LDAS.EQ.LDA
00657                                  ISAME( 7 ) = LSE( XS, XX, LX )
00658                                  ISAME( 8 ) = INCXS.EQ.INCX
00659                                  ISAME( 9 ) = BLS.EQ.BETA
00660                                  IF( NULL )THEN
00661                                     ISAME( 10 ) = LSE( YS, YY, LY )
00662                                  ELSE
00663                                     ISAME( 10 ) = LSERES( 'GE', ' ', 1,
00664      $                                            ML, YS, YY,
00665      $                                            ABS( INCY ) )
00666                                  END IF
00667                                  ISAME( 11 ) = INCYS.EQ.INCY
00668                               ELSE IF( BANDED )THEN
00669                                  ISAME( 4 ) = KLS.EQ.KL
00670                                  ISAME( 5 ) = KUS.EQ.KU
00671                                  ISAME( 6 ) = ALS.EQ.ALPHA
00672                                  ISAME( 7 ) = LSE( AS, AA, LAA )
00673                                  ISAME( 8 ) = LDAS.EQ.LDA
00674                                  ISAME( 9 ) = LSE( XS, XX, LX )
00675                                  ISAME( 10 ) = INCXS.EQ.INCX
00676                                  ISAME( 11 ) = BLS.EQ.BETA
00677                                  IF( NULL )THEN
00678                                     ISAME( 12 ) = LSE( YS, YY, LY )
00679                                  ELSE
00680                                     ISAME( 12 ) = LSERES( 'GE', ' ', 1,
00681      $                                            ML, YS, YY,
00682      $                                            ABS( INCY ) )
00683                                  END IF
00684                                  ISAME( 13 ) = INCYS.EQ.INCY
00685                               END IF
00686 *
00687 *                             If data was incorrectly changed, report
00688 *                             and return.
00689 *
00690                               SAME = .TRUE.
00691                               DO 40 I = 1, NARGS
00692                                  SAME = SAME.AND.ISAME( I )
00693                                  IF( .NOT.ISAME( I ) )
00694      $                              WRITE( NOUT, FMT = 9998 )I
00695    40                         CONTINUE
00696                               IF( .NOT.SAME )THEN
00697                                  FATAL = .TRUE.
00698                                  GO TO 130
00699                               END IF
00700 *
00701                               IF( .NOT.NULL )THEN
00702 *
00703 *                                Check the result.
00704 *
00705                                  CALL SMVCH( TRANS, M, N, ALPHA, A,
00706      $                                       NMAX, X, INCX, BETA, Y,
00707      $                                       INCY, YT, G, YY, EPS, ERR,
00708      $                                       FATAL, NOUT, .TRUE. )
00709                                  ERRMAX = MAX( ERRMAX, ERR )
00710 *                                If got really bad answer, report and
00711 *                                return.
00712                                  IF( FATAL )
00713      $                              GO TO 130
00714                               ELSE
00715 *                                Avoid repeating tests with M.le.0 or
00716 *                                N.le.0.
00717                                  GO TO 110
00718                               END IF
00719 *
00720    50                      CONTINUE
00721 *
00722    60                   CONTINUE
00723 *
00724    70                CONTINUE
00725 *
00726    80             CONTINUE
00727 *
00728    90          CONTINUE
00729 *
00730   100       CONTINUE
00731 *
00732   110    CONTINUE
00733 *
00734   120 CONTINUE
00735 *
00736 *     Report result.
00737 *
00738       IF( ERRMAX.LT.THRESH )THEN
00739          WRITE( NOUT, FMT = 9999 )SNAME, NC
00740       ELSE
00741          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
00742       END IF
00743       GO TO 140
00744 *
00745   130 CONTINUE
00746       WRITE( NOUT, FMT = 9996 )SNAME
00747       IF( FULL )THEN
00748          WRITE( NOUT, FMT = 9994 )NC, SNAME, TRANS, M, N, ALPHA, LDA,
00749      $      INCX, BETA, INCY
00750       ELSE IF( BANDED )THEN
00751          WRITE( NOUT, FMT = 9995 )NC, SNAME, TRANS, M, N, KL, KU,
00752      $      ALPHA, LDA, INCX, BETA, INCY
00753       END IF
00754 *
00755   140 CONTINUE
00756       RETURN
00757 *
00758  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
00759      $      'S)' )
00760  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
00761      $      'ANGED INCORRECTLY *******' )
00762  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
00763      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
00764      $      ' - SUSPECT *******' )
00765  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
00766  9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 4( I3, ',' ), F4.1,
00767      $      ', A,', I3, ', X,', I2, ',', F4.1, ', Y,', I2, ') .' )
00768  9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 2( I3, ',' ), F4.1,
00769      $      ', A,', I3, ', X,', I2, ',', F4.1, ', Y,', I2,
00770      $      ')         .' )
00771  9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
00772      $      '******' )
00773 *
00774 *     End of SCHK1.
00775 *
00776       END
00777       SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
00778      $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,
00779      $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,
00780      $                  XS, Y, YY, YS, YT, G )
00781 *
00782 *  Tests SSYMV, SSBMV and SSPMV.
00783 *
00784 *  Auxiliary routine for test program for Level 2 Blas.
00785 *
00786 *  -- Written on 10-August-1987.
00787 *     Richard Hanson, Sandia National Labs.
00788 *     Jeremy Du Croz, NAG Central Office.
00789 *
00790 *     .. Parameters ..
00791       REAL               ZERO, HALF
00792       PARAMETER          ( ZERO = 0.0, HALF = 0.5 )
00793 *     .. Scalar Arguments ..
00794       REAL               EPS, THRESH
00795       INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,
00796      $                   NOUT, NTRA
00797       LOGICAL            FATAL, REWI, TRACE
00798       CHARACTER*6        SNAME
00799 *     .. Array Arguments ..
00800       REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
00801      $                   AS( NMAX*NMAX ), BET( NBET ), G( NMAX ),
00802      $                   X( NMAX ), XS( NMAX*INCMAX ),
00803      $                   XX( NMAX*INCMAX ), Y( NMAX ),
00804      $                   YS( NMAX*INCMAX ), YT( NMAX ),
00805      $                   YY( NMAX*INCMAX )
00806       INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )
00807 *     .. Local Scalars ..
00808       REAL               ALPHA, ALS, BETA, BLS, ERR, ERRMAX, TRANSL
00809       INTEGER            I, IA, IB, IC, IK, IN, INCX, INCXS, INCY,
00810      $                   INCYS, IX, IY, K, KS, LAA, LDA, LDAS, LX, LY,
00811      $                   N, NARGS, NC, NK, NS
00812       LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME
00813       CHARACTER*1        UPLO, UPLOS
00814       CHARACTER*2        ICH
00815 *     .. Local Arrays ..
00816       LOGICAL            ISAME( 13 )
00817 *     .. External Functions ..
00818       LOGICAL            LSE, LSERES
00819       EXTERNAL           LSE, LSERES
00820 *     .. External Subroutines ..
00821       EXTERNAL           SMAKE, SMVCH, SSBMV, SSPMV, SSYMV
00822 *     .. Intrinsic Functions ..
00823       INTRINSIC          ABS, MAX
00824 *     .. Scalars in Common ..
00825       INTEGER            INFOT, NOUTC
00826       LOGICAL            LERR, OK
00827 *     .. Common blocks ..
00828       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
00829 *     .. Data statements ..
00830       DATA               ICH/'UL'/
00831 *     .. Executable Statements ..
00832       FULL = SNAME( 3: 3 ).EQ.'Y'
00833       BANDED = SNAME( 3: 3 ).EQ.'B'
00834       PACKED = SNAME( 3: 3 ).EQ.'P'
00835 *     Define the number of arguments.
00836       IF( FULL )THEN
00837          NARGS = 10
00838       ELSE IF( BANDED )THEN
00839          NARGS = 11
00840       ELSE IF( PACKED )THEN
00841          NARGS = 9
00842       END IF
00843 *
00844       NC = 0
00845       RESET = .TRUE.
00846       ERRMAX = ZERO
00847 *
00848       DO 110 IN = 1, NIDIM
00849          N = IDIM( IN )
00850 *
00851          IF( BANDED )THEN
00852             NK = NKB
00853          ELSE
00854             NK = 1
00855          END IF
00856          DO 100 IK = 1, NK
00857             IF( BANDED )THEN
00858                K = KB( IK )
00859             ELSE
00860                K = N - 1
00861             END IF
00862 *           Set LDA to 1 more than minimum value if room.
00863             IF( BANDED )THEN
00864                LDA = K + 1
00865             ELSE
00866                LDA = N
00867             END IF
00868             IF( LDA.LT.NMAX )
00869      $         LDA = LDA + 1
00870 *           Skip tests if not enough room.
00871             IF( LDA.GT.NMAX )
00872      $         GO TO 100
00873             IF( PACKED )THEN
00874                LAA = ( N*( N + 1 ) )/2
00875             ELSE
00876                LAA = LDA*N
00877             END IF
00878             NULL = N.LE.0
00879 *
00880             DO 90 IC = 1, 2
00881                UPLO = ICH( IC: IC )
00882 *
00883 *              Generate the matrix A.
00884 *
00885                TRANSL = ZERO
00886                CALL SMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A, NMAX, AA,
00887      $                     LDA, K, K, RESET, TRANSL )
00888 *
00889                DO 80 IX = 1, NINC
00890                   INCX = INC( IX )
00891                   LX = ABS( INCX )*N
00892 *
00893 *                 Generate the vector X.
00894 *
00895                   TRANSL = HALF
00896                   CALL SMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX,
00897      $                        ABS( INCX ), 0, N - 1, RESET, TRANSL )
00898                   IF( N.GT.1 )THEN
00899                      X( N/2 ) = ZERO
00900                      XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
00901                   END IF
00902 *
00903                   DO 70 IY = 1, NINC
00904                      INCY = INC( IY )
00905                      LY = ABS( INCY )*N
00906 *
00907                      DO 60 IA = 1, NALF
00908                         ALPHA = ALF( IA )
00909 *
00910                         DO 50 IB = 1, NBET
00911                            BETA = BET( IB )
00912 *
00913 *                          Generate the vector Y.
00914 *
00915                            TRANSL = ZERO
00916                            CALL SMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,
00917      $                                 ABS( INCY ), 0, N - 1, RESET,
00918      $                                 TRANSL )
00919 *
00920                            NC = NC + 1
00921 *
00922 *                          Save every datum before calling the
00923 *                          subroutine.
00924 *
00925                            UPLOS = UPLO
00926                            NS = N
00927                            KS = K
00928                            ALS = ALPHA
00929                            DO 10 I = 1, LAA
00930                               AS( I ) = AA( I )
00931    10                      CONTINUE
00932                            LDAS = LDA
00933                            DO 20 I = 1, LX
00934                               XS( I ) = XX( I )
00935    20                      CONTINUE
00936                            INCXS = INCX
00937                            BLS = BETA
00938                            DO 30 I = 1, LY
00939                               YS( I ) = YY( I )
00940    30                      CONTINUE
00941                            INCYS = INCY
00942 *
00943 *                          Call the subroutine.
00944 *
00945                            IF( FULL )THEN
00946                               IF( TRACE )
00947      $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,
00948      $                           UPLO, N, ALPHA, LDA, INCX, BETA, INCY
00949                               IF( REWI )
00950      $                           REWIND NTRA
00951                               CALL SSYMV( UPLO, N, ALPHA, AA, LDA, XX,
00952      $                                    INCX, BETA, YY, INCY )
00953                            ELSE IF( BANDED )THEN
00954                               IF( TRACE )
00955      $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,
00956      $                           UPLO, N, K, ALPHA, LDA, INCX, BETA,
00957      $                           INCY
00958                               IF( REWI )
00959      $                           REWIND NTRA
00960                               CALL SSBMV( UPLO, N, K, ALPHA, AA, LDA,
00961      $                                    XX, INCX, BETA, YY, INCY )
00962                            ELSE IF( PACKED )THEN
00963                               IF( TRACE )
00964      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
00965      $                           UPLO, N, ALPHA, INCX, BETA, INCY
00966                               IF( REWI )
00967      $                           REWIND NTRA
00968                               CALL SSPMV( UPLO, N, ALPHA, AA, XX, INCX,
00969      $                                    BETA, YY, INCY )
00970                            END IF
00971 *
00972 *                          Check if error-exit was taken incorrectly.
00973 *
00974                            IF( .NOT.OK )THEN
00975                               WRITE( NOUT, FMT = 9992 )
00976                               FATAL = .TRUE.
00977                               GO TO 120
00978                            END IF
00979 *
00980 *                          See what data changed inside subroutines.
00981 *
00982                            ISAME( 1 ) = UPLO.EQ.UPLOS
00983                            ISAME( 2 ) = NS.EQ.N
00984                            IF( FULL )THEN
00985                               ISAME( 3 ) = ALS.EQ.ALPHA
00986                               ISAME( 4 ) = LSE( AS, AA, LAA )
00987                               ISAME( 5 ) = LDAS.EQ.LDA
00988                               ISAME( 6 ) = LSE( XS, XX, LX )
00989                               ISAME( 7 ) = INCXS.EQ.INCX
00990                               ISAME( 8 ) = BLS.EQ.BETA
00991                               IF( NULL )THEN
00992                                  ISAME( 9 ) = LSE( YS, YY, LY )
00993                               ELSE
00994                                  ISAME( 9 ) = LSERES( 'GE', ' ', 1, N,
00995      $                                        YS, YY, ABS( INCY ) )
00996                               END IF
00997                               ISAME( 10 ) = INCYS.EQ.INCY
00998                            ELSE IF( BANDED )THEN
00999                               ISAME( 3 ) = KS.EQ.K
01000                               ISAME( 4 ) = ALS.EQ.ALPHA
01001                               ISAME( 5 ) = LSE( AS, AA, LAA )
01002                               ISAME( 6 ) = LDAS.EQ.LDA
01003                               ISAME( 7 ) = LSE( XS, XX, LX )
01004                               ISAME( 8 ) = INCXS.EQ.INCX
01005                               ISAME( 9 ) = BLS.EQ.BETA
01006                               IF( NULL )THEN
01007                                  ISAME( 10 ) = LSE( YS, YY, LY )
01008                               ELSE
01009                                  ISAME( 10 ) = LSERES( 'GE', ' ', 1, N,
01010      $                                         YS, YY, ABS( INCY ) )
01011                               END IF
01012                               ISAME( 11 ) = INCYS.EQ.INCY
01013                            ELSE IF( PACKED )THEN
01014                               ISAME( 3 ) = ALS.EQ.ALPHA
01015                               ISAME( 4 ) = LSE( AS, AA, LAA )
01016                               ISAME( 5 ) = LSE( XS, XX, LX )
01017                               ISAME( 6 ) = INCXS.EQ.INCX
01018                               ISAME( 7 ) = BLS.EQ.BETA
01019                               IF( NULL )THEN
01020                                  ISAME( 8 ) = LSE( YS, YY, LY )
01021                               ELSE
01022                                  ISAME( 8 ) = LSERES( 'GE', ' ', 1, N,
01023      $                                        YS, YY, ABS( INCY ) )
01024                               END IF
01025                               ISAME( 9 ) = INCYS.EQ.INCY
01026                            END IF
01027 *
01028 *                          If data was incorrectly changed, report and
01029 *                          return.
01030 *
01031                            SAME = .TRUE.
01032                            DO 40 I = 1, NARGS
01033                               SAME = SAME.AND.ISAME( I )
01034                               IF( .NOT.ISAME( I ) )
01035      $                           WRITE( NOUT, FMT = 9998 )I
01036    40                      CONTINUE
01037                            IF( .NOT.SAME )THEN
01038                               FATAL = .TRUE.
01039                               GO TO 120
01040                            END IF
01041 *
01042                            IF( .NOT.NULL )THEN
01043 *
01044 *                             Check the result.
01045 *
01046                               CALL SMVCH( 'N', N, N, ALPHA, A, NMAX, X,
01047      $                                    INCX, BETA, Y, INCY, YT, G,
01048      $                                    YY, EPS, ERR, FATAL, NOUT,
01049      $                                    .TRUE. )
01050                               ERRMAX = MAX( ERRMAX, ERR )
01051 *                             If got really bad answer, report and
01052 *                             return.
01053                               IF( FATAL )
01054      $                           GO TO 120
01055                            ELSE
01056 *                             Avoid repeating tests with N.le.0
01057                               GO TO 110
01058                            END IF
01059 *
01060    50                   CONTINUE
01061 *
01062    60                CONTINUE
01063 *
01064    70             CONTINUE
01065 *
01066    80          CONTINUE
01067 *
01068    90       CONTINUE
01069 *
01070   100    CONTINUE
01071 *
01072   110 CONTINUE
01073 *
01074 *     Report result.
01075 *
01076       IF( ERRMAX.LT.THRESH )THEN
01077          WRITE( NOUT, FMT = 9999 )SNAME, NC
01078       ELSE
01079          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
01080       END IF
01081       GO TO 130
01082 *
01083   120 CONTINUE
01084       WRITE( NOUT, FMT = 9996 )SNAME
01085       IF( FULL )THEN
01086          WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, LDA, INCX,
01087      $      BETA, INCY
01088       ELSE IF( BANDED )THEN
01089          WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, K, ALPHA, LDA,
01090      $      INCX, BETA, INCY
01091       ELSE IF( PACKED )THEN
01092          WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, N, ALPHA, INCX,
01093      $      BETA, INCY
01094       END IF
01095 *
01096   130 CONTINUE
01097       RETURN
01098 *
01099  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
01100      $      'S)' )
01101  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
01102      $      'ANGED INCORRECTLY *******' )
01103  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
01104      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
01105      $      ' - SUSPECT *******' )
01106  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
01107  9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', AP',
01108      $      ', X,', I2, ',', F4.1, ', Y,', I2, ')                .' )
01109  9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 2( I3, ',' ), F4.1,
01110      $      ', A,', I3, ', X,', I2, ',', F4.1, ', Y,', I2,
01111      $      ')         .' )
01112  9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', A,',
01113      $      I3, ', X,', I2, ',', F4.1, ', Y,', I2, ')             .' )
01114  9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
01115      $      '******' )
01116 *
01117 *     End of SCHK2.
01118 *
01119       END
01120       SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
01121      $                  FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX,
01122      $                  INCMAX, A, AA, AS, X, XX, XS, XT, G, Z )
01123 *
01124 *  Tests STRMV, STBMV, STPMV, STRSV, STBSV and STPSV.
01125 *
01126 *  Auxiliary routine for test program for Level 2 Blas.
01127 *
01128 *  -- Written on 10-August-1987.
01129 *     Richard Hanson, Sandia National Labs.
01130 *     Jeremy Du Croz, NAG Central Office.
01131 *
01132 *     .. Parameters ..
01133       REAL               ZERO, HALF, ONE
01134       PARAMETER          ( ZERO = 0.0, HALF = 0.5, ONE = 1.0 )
01135 *     .. Scalar Arguments ..
01136       REAL               EPS, THRESH
01137       INTEGER            INCMAX, NIDIM, NINC, NKB, NMAX, NOUT, NTRA
01138       LOGICAL            FATAL, REWI, TRACE
01139       CHARACTER*6        SNAME
01140 *     .. Array Arguments ..
01141       REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ),
01142      $                   AS( NMAX*NMAX ), G( NMAX ), X( NMAX ),
01143      $                   XS( NMAX*INCMAX ), XT( NMAX ),
01144      $                   XX( NMAX*INCMAX ), Z( NMAX )
01145       INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )
01146 *     .. Local Scalars ..
01147       REAL               ERR, ERRMAX, TRANSL
01148       INTEGER            I, ICD, ICT, ICU, IK, IN, INCX, INCXS, IX, K,
01149      $                   KS, LAA, LDA, LDAS, LX, N, NARGS, NC, NK, NS
01150       LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME
01151       CHARACTER*1        DIAG, DIAGS, TRANS, TRANSS, UPLO, UPLOS
01152       CHARACTER*2        ICHD, ICHU
01153       CHARACTER*3        ICHT
01154 *     .. Local Arrays ..
01155       LOGICAL            ISAME( 13 )
01156 *     .. External Functions ..
01157       LOGICAL            LSE, LSERES
01158       EXTERNAL           LSE, LSERES
01159 *     .. External Subroutines ..
01160       EXTERNAL           SMAKE, SMVCH, STBMV, STBSV, STPMV, STPSV,
01161      $                   STRMV, STRSV
01162 *     .. Intrinsic Functions ..
01163       INTRINSIC          ABS, MAX
01164 *     .. Scalars in Common ..
01165       INTEGER            INFOT, NOUTC
01166       LOGICAL            LERR, OK
01167 *     .. Common blocks ..
01168       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
01169 *     .. Data statements ..
01170       DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/
01171 *     .. Executable Statements ..
01172       FULL = SNAME( 3: 3 ).EQ.'R'
01173       BANDED = SNAME( 3: 3 ).EQ.'B'
01174       PACKED = SNAME( 3: 3 ).EQ.'P'
01175 *     Define the number of arguments.
01176       IF( FULL )THEN
01177          NARGS = 8
01178       ELSE IF( BANDED )THEN
01179          NARGS = 9
01180       ELSE IF( PACKED )THEN
01181          NARGS = 7
01182       END IF
01183 *
01184       NC = 0
01185       RESET = .TRUE.
01186       ERRMAX = ZERO
01187 *     Set up zero vector for SMVCH.
01188       DO 10 I = 1, NMAX
01189          Z( I ) = ZERO
01190    10 CONTINUE
01191 *
01192       DO 110 IN = 1, NIDIM
01193          N = IDIM( IN )
01194 *
01195          IF( BANDED )THEN
01196             NK = NKB
01197          ELSE
01198             NK = 1
01199          END IF
01200          DO 100 IK = 1, NK
01201             IF( BANDED )THEN
01202                K = KB( IK )
01203             ELSE
01204                K = N - 1
01205             END IF
01206 *           Set LDA to 1 more than minimum value if room.
01207             IF( BANDED )THEN
01208                LDA = K + 1
01209             ELSE
01210                LDA = N
01211             END IF
01212             IF( LDA.LT.NMAX )
01213      $         LDA = LDA + 1
01214 *           Skip tests if not enough room.
01215             IF( LDA.GT.NMAX )
01216      $         GO TO 100
01217             IF( PACKED )THEN
01218                LAA = ( N*( N + 1 ) )/2
01219             ELSE
01220                LAA = LDA*N
01221             END IF
01222             NULL = N.LE.0
01223 *
01224             DO 90 ICU = 1, 2
01225                UPLO = ICHU( ICU: ICU )
01226 *
01227                DO 80 ICT = 1, 3
01228                   TRANS = ICHT( ICT: ICT )
01229 *
01230                   DO 70 ICD = 1, 2
01231                      DIAG = ICHD( ICD: ICD )
01232 *
01233 *                    Generate the matrix A.
01234 *
01235                      TRANSL = ZERO
01236                      CALL SMAKE( SNAME( 2: 3 ), UPLO, DIAG, N, N, A,
01237      $                           NMAX, AA, LDA, K, K, RESET, TRANSL )
01238 *
01239                      DO 60 IX = 1, NINC
01240                         INCX = INC( IX )
01241                         LX = ABS( INCX )*N
01242 *
01243 *                       Generate the vector X.
01244 *
01245                         TRANSL = HALF
01246                         CALL SMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX,
01247      $                              ABS( INCX ), 0, N - 1, RESET,
01248      $                              TRANSL )
01249                         IF( N.GT.1 )THEN
01250                            X( N/2 ) = ZERO
01251                            XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
01252                         END IF
01253 *
01254                         NC = NC + 1
01255 *
01256 *                       Save every datum before calling the subroutine.
01257 *
01258                         UPLOS = UPLO
01259                         TRANSS = TRANS
01260                         DIAGS = DIAG
01261                         NS = N
01262                         KS = K
01263                         DO 20 I = 1, LAA
01264                            AS( I ) = AA( I )
01265    20                   CONTINUE
01266                         LDAS = LDA
01267                         DO 30 I = 1, LX
01268                            XS( I ) = XX( I )
01269    30                   CONTINUE
01270                         INCXS = INCX
01271 *
01272 *                       Call the subroutine.
01273 *
01274                         IF( SNAME( 4: 5 ).EQ.'MV' )THEN
01275                            IF( FULL )THEN
01276                               IF( TRACE )
01277      $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,
01278      $                           UPLO, TRANS, DIAG, N, LDA, INCX
01279                               IF( REWI )
01280      $                           REWIND NTRA
01281                               CALL STRMV( UPLO, TRANS, DIAG, N, AA, LDA,
01282      $                                    XX, INCX )
01283                            ELSE IF( BANDED )THEN
01284                               IF( TRACE )
01285      $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,
01286      $                           UPLO, TRANS, DIAG, N, K, LDA, INCX
01287                               IF( REWI )
01288      $                           REWIND NTRA
01289                               CALL STBMV( UPLO, TRANS, DIAG, N, K, AA,
01290      $                                    LDA, XX, INCX )
01291                            ELSE IF( PACKED )THEN
01292                               IF( TRACE )
01293      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
01294      $                           UPLO, TRANS, DIAG, N, INCX
01295                               IF( REWI )
01296      $                           REWIND NTRA
01297                               CALL STPMV( UPLO, TRANS, DIAG, N, AA, XX,
01298      $                                    INCX )
01299                            END IF
01300                         ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN
01301                            IF( FULL )THEN
01302                               IF( TRACE )
01303      $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,
01304      $                           UPLO, TRANS, DIAG, N, LDA, INCX
01305                               IF( REWI )
01306      $                           REWIND NTRA
01307                               CALL STRSV( UPLO, TRANS, DIAG, N, AA, LDA,
01308      $                                    XX, INCX )
01309                            ELSE IF( BANDED )THEN
01310                               IF( TRACE )
01311      $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,
01312      $                           UPLO, TRANS, DIAG, N, K, LDA, INCX
01313                               IF( REWI )
01314      $                           REWIND NTRA
01315                               CALL STBSV( UPLO, TRANS, DIAG, N, K, AA,
01316      $                                    LDA, XX, INCX )
01317                            ELSE IF( PACKED )THEN
01318                               IF( TRACE )
01319      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
01320      $                           UPLO, TRANS, DIAG, N, INCX
01321                               IF( REWI )
01322      $                           REWIND NTRA
01323                               CALL STPSV( UPLO, TRANS, DIAG, N, AA, XX,
01324      $                                    INCX )
01325                            END IF
01326                         END IF
01327 *
01328 *                       Check if error-exit was taken incorrectly.
01329 *
01330                         IF( .NOT.OK )THEN
01331                            WRITE( NOUT, FMT = 9992 )
01332                            FATAL = .TRUE.
01333                            GO TO 120
01334                         END IF
01335 *
01336 *                       See what data changed inside subroutines.
01337 *
01338                         ISAME( 1 ) = UPLO.EQ.UPLOS
01339                         ISAME( 2 ) = TRANS.EQ.TRANSS
01340                         ISAME( 3 ) = DIAG.EQ.DIAGS
01341                         ISAME( 4 ) = NS.EQ.N
01342                         IF( FULL )THEN
01343                            ISAME( 5 ) = LSE( AS, AA, LAA )
01344                            ISAME( 6 ) = LDAS.EQ.LDA
01345                            IF( NULL )THEN
01346                               ISAME( 7 ) = LSE( XS, XX, LX )
01347                            ELSE
01348                               ISAME( 7 ) = LSERES( 'GE', ' ', 1, N, XS,
01349      $                                     XX, ABS( INCX ) )
01350                            END IF
01351                            ISAME( 8 ) = INCXS.EQ.INCX
01352                         ELSE IF( BANDED )THEN
01353                            ISAME( 5 ) = KS.EQ.K
01354                            ISAME( 6 ) = LSE( AS, AA, LAA )
01355                            ISAME( 7 ) = LDAS.EQ.LDA
01356                            IF( NULL )THEN
01357                               ISAME( 8 ) = LSE( XS, XX, LX )
01358                            ELSE
01359                               ISAME( 8 ) = LSERES( 'GE', ' ', 1, N, XS,
01360      $                                     XX, ABS( INCX ) )
01361                            END IF
01362                            ISAME( 9 ) = INCXS.EQ.INCX
01363                         ELSE IF( PACKED )THEN
01364                            ISAME( 5 ) = LSE( AS, AA, LAA )
01365                            IF( NULL )THEN
01366                               ISAME( 6 ) = LSE( XS, XX, LX )
01367                            ELSE
01368                               ISAME( 6 ) = LSERES( 'GE', ' ', 1, N, XS,
01369      $                                     XX, ABS( INCX ) )
01370                            END IF
01371                            ISAME( 7 ) = INCXS.EQ.INCX
01372                         END IF
01373 *
01374 *                       If data was incorrectly changed, report and
01375 *                       return.
01376 *
01377                         SAME = .TRUE.
01378                         DO 40 I = 1, NARGS
01379                            SAME = SAME.AND.ISAME( I )
01380                            IF( .NOT.ISAME( I ) )
01381      $                        WRITE( NOUT, FMT = 9998 )I
01382    40                   CONTINUE
01383                         IF( .NOT.SAME )THEN
01384                            FATAL = .TRUE.
01385                            GO TO 120
01386                         END IF
01387 *
01388                         IF( .NOT.NULL )THEN
01389                            IF( SNAME( 4: 5 ).EQ.'MV' )THEN
01390 *
01391 *                             Check the result.
01392 *
01393                               CALL SMVCH( TRANS, N, N, ONE, A, NMAX, X,
01394      $                                    INCX, ZERO, Z, INCX, XT, G,
01395      $                                    XX, EPS, ERR, FATAL, NOUT,
01396      $                                    .TRUE. )
01397                            ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN
01398 *
01399 *                             Compute approximation to original vector.
01400 *
01401                               DO 50 I = 1, N
01402                                  Z( I ) = XX( 1 + ( I - 1 )*
01403      $                                    ABS( INCX ) )
01404                                  XX( 1 + ( I - 1 )*ABS( INCX ) )
01405      $                              = X( I )
01406    50                         CONTINUE
01407                               CALL SMVCH( TRANS, N, N, ONE, A, NMAX, Z,
01408      $                                    INCX, ZERO, X, INCX, XT, G,
01409      $                                    XX, EPS, ERR, FATAL, NOUT,
01410      $                                    .FALSE. )
01411                            END IF
01412                            ERRMAX = MAX( ERRMAX, ERR )
01413 *                          If got really bad answer, report and return.
01414                            IF( FATAL )
01415      $                        GO TO 120
01416                         ELSE
01417 *                          Avoid repeating tests with N.le.0.
01418                            GO TO 110
01419                         END IF
01420 *
01421    60                CONTINUE
01422 *
01423    70             CONTINUE
01424 *
01425    80          CONTINUE
01426 *
01427    90       CONTINUE
01428 *
01429   100    CONTINUE
01430 *
01431   110 CONTINUE
01432 *
01433 *     Report result.
01434 *
01435       IF( ERRMAX.LT.THRESH )THEN
01436          WRITE( NOUT, FMT = 9999 )SNAME, NC
01437       ELSE
01438          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
01439       END IF
01440       GO TO 130
01441 *
01442   120 CONTINUE
01443       WRITE( NOUT, FMT = 9996 )SNAME
01444       IF( FULL )THEN
01445          WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, DIAG, N, LDA,
01446      $      INCX
01447       ELSE IF( BANDED )THEN
01448          WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, DIAG, N, K,
01449      $      LDA, INCX
01450       ELSE IF( PACKED )THEN
01451          WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, TRANS, DIAG, N, INCX
01452       END IF
01453 *
01454   130 CONTINUE
01455       RETURN
01456 *
01457  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
01458      $      'S)' )
01459  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
01460      $      'ANGED INCORRECTLY *******' )
01461  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
01462      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
01463      $      ' - SUSPECT *******' )
01464  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
01465  9995 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', AP, ',
01466      $      'X,', I2, ')                        .' )
01467  9994 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), 2( I3, ',' ),
01468      $      ' A,', I3, ', X,', I2, ')                 .' )
01469  9993 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', A,',
01470      $      I3, ', X,', I2, ')                     .' )
01471  9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
01472      $      '******' )
01473 *
01474 *     End of SCHK3.
01475 *
01476       END
01477       SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
01478      $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
01479      $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,
01480      $                  Z )
01481 *
01482 *  Tests SGER.
01483 *
01484 *  Auxiliary routine for test program for Level 2 Blas.
01485 *
01486 *  -- Written on 10-August-1987.
01487 *     Richard Hanson, Sandia National Labs.
01488 *     Jeremy Du Croz, NAG Central Office.
01489 *
01490 *     .. Parameters ..
01491       REAL               ZERO, HALF, ONE
01492       PARAMETER          ( ZERO = 0.0, HALF = 0.5, ONE = 1.0 )
01493 *     .. Scalar Arguments ..
01494       REAL               EPS, THRESH
01495       INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA
01496       LOGICAL            FATAL, REWI, TRACE
01497       CHARACTER*6        SNAME
01498 *     .. Array Arguments ..
01499       REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
01500      $                   AS( NMAX*NMAX ), G( NMAX ), X( NMAX ),
01501      $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),
01502      $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),
01503      $                   YY( NMAX*INCMAX ), Z( NMAX )
01504       INTEGER            IDIM( NIDIM ), INC( NINC )
01505 *     .. Local Scalars ..
01506       REAL               ALPHA, ALS, ERR, ERRMAX, TRANSL
01507       INTEGER            I, IA, IM, IN, INCX, INCXS, INCY, INCYS, IX,
01508      $                   IY, J, LAA, LDA, LDAS, LX, LY, M, MS, N, NARGS,
01509      $                   NC, ND, NS
01510       LOGICAL            NULL, RESET, SAME
01511 *     .. Local Arrays ..
01512       REAL               W( 1 )
01513       LOGICAL            ISAME( 13 )
01514 *     .. External Functions ..
01515       LOGICAL            LSE, LSERES
01516       EXTERNAL           LSE, LSERES
01517 *     .. External Subroutines ..
01518       EXTERNAL           SGER, SMAKE, SMVCH
01519 *     .. Intrinsic Functions ..
01520       INTRINSIC          ABS, MAX, MIN
01521 *     .. Scalars in Common ..
01522       INTEGER            INFOT, NOUTC
01523       LOGICAL            LERR, OK
01524 *     .. Common blocks ..
01525       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
01526 *     .. Executable Statements ..
01527 *     Define the number of arguments.
01528       NARGS = 9
01529 *
01530       NC = 0
01531       RESET = .TRUE.
01532       ERRMAX = ZERO
01533 *
01534       DO 120 IN = 1, NIDIM
01535          N = IDIM( IN )
01536          ND = N/2 + 1
01537 *
01538          DO 110 IM = 1, 2
01539             IF( IM.EQ.1 )
01540      $         M = MAX( N - ND, 0 )
01541             IF( IM.EQ.2 )
01542      $         M = MIN( N + ND, NMAX )
01543 *
01544 *           Set LDA to 1 more than minimum value if room.
01545             LDA = M
01546             IF( LDA.LT.NMAX )
01547      $         LDA = LDA + 1
01548 *           Skip tests if not enough room.
01549             IF( LDA.GT.NMAX )
01550      $         GO TO 110
01551             LAA = LDA*N
01552             NULL = N.LE.0.OR.M.LE.0
01553 *
01554             DO 100 IX = 1, NINC
01555                INCX = INC( IX )
01556                LX = ABS( INCX )*M
01557 *
01558 *              Generate the vector X.
01559 *
01560                TRANSL = HALF
01561                CALL SMAKE( 'GE', ' ', ' ', 1, M, X, 1, XX, ABS( INCX ),
01562      $                     0, M - 1, RESET, TRANSL )
01563                IF( M.GT.1 )THEN
01564                   X( M/2 ) = ZERO
01565                   XX( 1 + ABS( INCX )*( M/2 - 1 ) ) = ZERO
01566                END IF
01567 *
01568                DO 90 IY = 1, NINC
01569                   INCY = INC( IY )
01570                   LY = ABS( INCY )*N
01571 *
01572 *                 Generate the vector Y.
01573 *
01574                   TRANSL = ZERO
01575                   CALL SMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,
01576      $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )
01577                   IF( N.GT.1 )THEN
01578                      Y( N/2 ) = ZERO
01579                      YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO
01580                   END IF
01581 *
01582                   DO 80 IA = 1, NALF
01583                      ALPHA = ALF( IA )
01584 *
01585 *                    Generate the matrix A.
01586 *
01587                      TRANSL = ZERO
01588                      CALL SMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX,
01589      $                           AA, LDA, M - 1, N - 1, RESET, TRANSL )
01590 *
01591                      NC = NC + 1
01592 *
01593 *                    Save every datum before calling the subroutine.
01594 *
01595                      MS = M
01596                      NS = N
01597                      ALS = ALPHA
01598                      DO 10 I = 1, LAA
01599                         AS( I ) = AA( I )
01600    10                CONTINUE
01601                      LDAS = LDA
01602                      DO 20 I = 1, LX
01603                         XS( I ) = XX( I )
01604    20                CONTINUE
01605                      INCXS = INCX
01606                      DO 30 I = 1, LY
01607                         YS( I ) = YY( I )
01608    30                CONTINUE
01609                      INCYS = INCY
01610 *
01611 *                    Call the subroutine.
01612 *
01613                      IF( TRACE )
01614      $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, M, N,
01615      $                  ALPHA, INCX, INCY, LDA
01616                      IF( REWI )
01617      $                  REWIND NTRA
01618                      CALL SGER( M, N, ALPHA, XX, INCX, YY, INCY, AA,
01619      $                          LDA )
01620 *
01621 *                    Check if error-exit was taken incorrectly.
01622 *
01623                      IF( .NOT.OK )THEN
01624                         WRITE( NOUT, FMT = 9993 )
01625                         FATAL = .TRUE.
01626                         GO TO 140
01627                      END IF
01628 *
01629 *                    See what data changed inside subroutine.
01630 *
01631                      ISAME( 1 ) = MS.EQ.M
01632                      ISAME( 2 ) = NS.EQ.N
01633                      ISAME( 3 ) = ALS.EQ.ALPHA
01634                      ISAME( 4 ) = LSE( XS, XX, LX )
01635                      ISAME( 5 ) = INCXS.EQ.INCX
01636                      ISAME( 6 ) = LSE( YS, YY, LY )
01637                      ISAME( 7 ) = INCYS.EQ.INCY
01638                      IF( NULL )THEN
01639                         ISAME( 8 ) = LSE( AS, AA, LAA )
01640                      ELSE
01641                         ISAME( 8 ) = LSERES( 'GE', ' ', M, N, AS, AA,
01642      $                               LDA )
01643                      END IF
01644                      ISAME( 9 ) = LDAS.EQ.LDA
01645 *
01646 *                    If data was incorrectly changed, report and return.
01647 *
01648                      SAME = .TRUE.
01649                      DO 40 I = 1, NARGS
01650                         SAME = SAME.AND.ISAME( I )
01651                         IF( .NOT.ISAME( I ) )
01652      $                     WRITE( NOUT, FMT = 9998 )I
01653    40                CONTINUE
01654                      IF( .NOT.SAME )THEN
01655                         FATAL = .TRUE.
01656                         GO TO 140
01657                      END IF
01658 *
01659                      IF( .NOT.NULL )THEN
01660 *
01661 *                       Check the result column by column.
01662 *
01663                         IF( INCX.GT.0 )THEN
01664                            DO 50 I = 1, M
01665                               Z( I ) = X( I )
01666    50                      CONTINUE
01667                         ELSE
01668                            DO 60 I = 1, M
01669                               Z( I ) = X( M - I + 1 )
01670    60                      CONTINUE
01671                         END IF
01672                         DO 70 J = 1, N
01673                            IF( INCY.GT.0 )THEN
01674                               W( 1 ) = Y( J )
01675                            ELSE
01676                               W( 1 ) = Y( N - J + 1 )
01677                            END IF
01678                            CALL SMVCH( 'N', M, 1, ALPHA, Z, NMAX, W, 1,
01679      $                                 ONE, A( 1, J ), 1, YT, G,
01680      $                                 AA( 1 + ( J - 1 )*LDA ), EPS,
01681      $                                 ERR, FATAL, NOUT, .TRUE. )
01682                            ERRMAX = MAX( ERRMAX, ERR )
01683 *                          If got really bad answer, report and return.
01684                            IF( FATAL )
01685      $                        GO TO 130
01686    70                   CONTINUE
01687                      ELSE
01688 *                       Avoid repeating tests with M.le.0 or N.le.0.
01689                         GO TO 110
01690                      END IF
01691 *
01692    80             CONTINUE
01693 *
01694    90          CONTINUE
01695 *
01696   100       CONTINUE
01697 *
01698   110    CONTINUE
01699 *
01700   120 CONTINUE
01701 *
01702 *     Report result.
01703 *
01704       IF( ERRMAX.LT.THRESH )THEN
01705          WRITE( NOUT, FMT = 9999 )SNAME, NC
01706       ELSE
01707          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
01708       END IF
01709       GO TO 150
01710 *
01711   130 CONTINUE
01712       WRITE( NOUT, FMT = 9995 )J
01713 *
01714   140 CONTINUE
01715       WRITE( NOUT, FMT = 9996 )SNAME
01716       WRITE( NOUT, FMT = 9994 )NC, SNAME, M, N, ALPHA, INCX, INCY, LDA
01717 *
01718   150 CONTINUE
01719       RETURN
01720 *
01721  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
01722      $      'S)' )
01723  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
01724      $      'ANGED INCORRECTLY *******' )
01725  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
01726      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
01727      $      ' - SUSPECT *******' )
01728  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
01729  9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
01730  9994 FORMAT( 1X, I6, ': ', A6, '(', 2( I3, ',' ), F4.1, ', X,', I2,
01731      $      ', Y,', I2, ', A,', I3, ')                  .' )
01732  9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
01733      $      '******' )
01734 *
01735 *     End of SCHK4.
01736 *
01737       END
01738       SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
01739      $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
01740      $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,
01741      $                  Z )
01742 *
01743 *  Tests SSYR and SSPR.
01744 *
01745 *  Auxiliary routine for test program for Level 2 Blas.
01746 *
01747 *  -- Written on 10-August-1987.
01748 *     Richard Hanson, Sandia National Labs.
01749 *     Jeremy Du Croz, NAG Central Office.
01750 *
01751 *     .. Parameters ..
01752       REAL               ZERO, HALF, ONE
01753       PARAMETER          ( ZERO = 0.0, HALF = 0.5, ONE = 1.0 )
01754 *     .. Scalar Arguments ..
01755       REAL               EPS, THRESH
01756       INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA
01757       LOGICAL            FATAL, REWI, TRACE
01758       CHARACTER*6        SNAME
01759 *     .. Array Arguments ..
01760       REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
01761      $                   AS( NMAX*NMAX ), G( NMAX ), X( NMAX ),
01762      $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),
01763      $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),
01764      $                   YY( NMAX*INCMAX ), Z( NMAX )
01765       INTEGER            IDIM( NIDIM ), INC( NINC )
01766 *     .. Local Scalars ..
01767       REAL               ALPHA, ALS, ERR, ERRMAX, TRANSL
01768       INTEGER            I, IA, IC, IN, INCX, INCXS, IX, J, JA, JJ, LAA,
01769      $                   LDA, LDAS, LJ, LX, N, NARGS, NC, NS
01770       LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER
01771       CHARACTER*1        UPLO, UPLOS
01772       CHARACTER*2        ICH
01773 *     .. Local Arrays ..
01774       REAL               W( 1 )
01775       LOGICAL            ISAME( 13 )
01776 *     .. External Functions ..
01777       LOGICAL            LSE, LSERES
01778       EXTERNAL           LSE, LSERES
01779 *     .. External Subroutines ..
01780       EXTERNAL           SMAKE, SMVCH, SSPR, SSYR
01781 *     .. Intrinsic Functions ..
01782       INTRINSIC          ABS, MAX
01783 *     .. Scalars in Common ..
01784       INTEGER            INFOT, NOUTC
01785       LOGICAL            LERR, OK
01786 *     .. Common blocks ..
01787       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
01788 *     .. Data statements ..
01789       DATA               ICH/'UL'/
01790 *     .. Executable Statements ..
01791       FULL = SNAME( 3: 3 ).EQ.'Y'
01792       PACKED = SNAME( 3: 3 ).EQ.'P'
01793 *     Define the number of arguments.
01794       IF( FULL )THEN
01795          NARGS = 7
01796       ELSE IF( PACKED )THEN
01797          NARGS = 6
01798       END IF
01799 *
01800       NC = 0
01801       RESET = .TRUE.
01802       ERRMAX = ZERO
01803 *
01804       DO 100 IN = 1, NIDIM
01805          N = IDIM( IN )
01806 *        Set LDA to 1 more than minimum value if room.
01807          LDA = N
01808          IF( LDA.LT.NMAX )
01809      $      LDA = LDA + 1
01810 *        Skip tests if not enough room.
01811          IF( LDA.GT.NMAX )
01812      $      GO TO 100
01813          IF( PACKED )THEN
01814             LAA = ( N*( N + 1 ) )/2
01815          ELSE
01816             LAA = LDA*N
01817          END IF
01818 *
01819          DO 90 IC = 1, 2
01820             UPLO = ICH( IC: IC )
01821             UPPER = UPLO.EQ.'U'
01822 *
01823             DO 80 IX = 1, NINC
01824                INCX = INC( IX )
01825                LX = ABS( INCX )*N
01826 *
01827 *              Generate the vector X.
01828 *
01829                TRANSL = HALF
01830                CALL SMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),
01831      $                     0, N - 1, RESET, TRANSL )
01832                IF( N.GT.1 )THEN
01833                   X( N/2 ) = ZERO
01834                   XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
01835                END IF
01836 *
01837                DO 70 IA = 1, NALF
01838                   ALPHA = ALF( IA )
01839                   NULL = N.LE.0.OR.ALPHA.EQ.ZERO
01840 *
01841 *                 Generate the matrix A.
01842 *
01843                   TRANSL = ZERO
01844                   CALL SMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A, NMAX,
01845      $                        AA, LDA, N - 1, N - 1, RESET, TRANSL )
01846 *
01847                   NC = NC + 1
01848 *
01849 *                 Save every datum before calling the subroutine.
01850 *
01851                   UPLOS = UPLO
01852                   NS = N
01853                   ALS = ALPHA
01854                   DO 10 I = 1, LAA
01855                      AS( I ) = AA( I )
01856    10             CONTINUE
01857                   LDAS = LDA
01858                   DO 20 I = 1, LX
01859                      XS( I ) = XX( I )
01860    20             CONTINUE
01861                   INCXS = INCX
01862 *
01863 *                 Call the subroutine.
01864 *
01865                   IF( FULL )THEN
01866                      IF( TRACE )
01867      $                  WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, N,
01868      $                  ALPHA, INCX, LDA
01869                      IF( REWI )
01870      $                  REWIND NTRA
01871                      CALL SSYR( UPLO, N, ALPHA, XX, INCX, AA, LDA )
01872                   ELSE IF( PACKED )THEN
01873                      IF( TRACE )
01874      $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, N,
01875      $                  ALPHA, INCX
01876                      IF( REWI )
01877      $                  REWIND NTRA
01878                      CALL SSPR( UPLO, N, ALPHA, XX, INCX, AA )
01879                   END IF
01880 *
01881 *                 Check if error-exit was taken incorrectly.
01882 *
01883                   IF( .NOT.OK )THEN
01884                      WRITE( NOUT, FMT = 9992 )
01885                      FATAL = .TRUE.
01886                      GO TO 120
01887                   END IF
01888 *
01889 *                 See what data changed inside subroutines.
01890 *
01891                   ISAME( 1 ) = UPLO.EQ.UPLOS
01892                   ISAME( 2 ) = NS.EQ.N
01893                   ISAME( 3 ) = ALS.EQ.ALPHA
01894                   ISAME( 4 ) = LSE( XS, XX, LX )
01895                   ISAME( 5 ) = INCXS.EQ.INCX
01896                   IF( NULL )THEN
01897                      ISAME( 6 ) = LSE( AS, AA, LAA )
01898                   ELSE
01899                      ISAME( 6 ) = LSERES( SNAME( 2: 3 ), UPLO, N, N, AS,
01900      $                            AA, LDA )
01901                   END IF
01902                   IF( .NOT.PACKED )THEN
01903                      ISAME( 7 ) = LDAS.EQ.LDA
01904                   END IF
01905 *
01906 *                 If data was incorrectly changed, report and return.
01907 *
01908                   SAME = .TRUE.
01909                   DO 30 I = 1, NARGS
01910                      SAME = SAME.AND.ISAME( I )
01911                      IF( .NOT.ISAME( I ) )
01912      $                  WRITE( NOUT, FMT = 9998 )I
01913    30             CONTINUE
01914                   IF( .NOT.SAME )THEN
01915                      FATAL = .TRUE.
01916                      GO TO 120
01917                   END IF
01918 *
01919                   IF( .NOT.NULL )THEN
01920 *
01921 *                    Check the result column by column.
01922 *
01923                      IF( INCX.GT.0 )THEN
01924                         DO 40 I = 1, N
01925                            Z( I ) = X( I )
01926    40                   CONTINUE
01927                      ELSE
01928                         DO 50 I = 1, N
01929                            Z( I ) = X( N - I + 1 )
01930    50                   CONTINUE
01931                      END IF
01932                      JA = 1
01933                      DO 60 J = 1, N
01934                         W( 1 ) = Z( J )
01935                         IF( UPPER )THEN
01936                            JJ = 1
01937                            LJ = J
01938                         ELSE
01939                            JJ = J
01940                            LJ = N - J + 1
01941                         END IF
01942                         CALL SMVCH( 'N', LJ, 1, ALPHA, Z( JJ ), LJ, W,
01943      $                              1, ONE, A( JJ, J ), 1, YT, G,
01944      $                              AA( JA ), EPS, ERR, FATAL, NOUT,
01945      $                              .TRUE. )
01946                         IF( FULL )THEN
01947                            IF( UPPER )THEN
01948                               JA = JA + LDA
01949                            ELSE
01950                               JA = JA + LDA + 1
01951                            END IF
01952                         ELSE
01953                            JA = JA + LJ
01954                         END IF
01955                         ERRMAX = MAX( ERRMAX, ERR )
01956 *                       If got really bad answer, report and return.
01957                         IF( FATAL )
01958      $                     GO TO 110
01959    60                CONTINUE
01960                   ELSE
01961 *                    Avoid repeating tests if N.le.0.
01962                      IF( N.LE.0 )
01963      $                  GO TO 100
01964                   END IF
01965 *
01966    70          CONTINUE
01967 *
01968    80       CONTINUE
01969 *
01970    90    CONTINUE
01971 *
01972   100 CONTINUE
01973 *
01974 *     Report result.
01975 *
01976       IF( ERRMAX.LT.THRESH )THEN
01977          WRITE( NOUT, FMT = 9999 )SNAME, NC
01978       ELSE
01979          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
01980       END IF
01981       GO TO 130
01982 *
01983   110 CONTINUE
01984       WRITE( NOUT, FMT = 9995 )J
01985 *
01986   120 CONTINUE
01987       WRITE( NOUT, FMT = 9996 )SNAME
01988       IF( FULL )THEN
01989          WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, INCX, LDA
01990       ELSE IF( PACKED )THEN
01991          WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, ALPHA, INCX
01992       END IF
01993 *
01994   130 CONTINUE
01995       RETURN
01996 *
01997  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
01998      $      'S)' )
01999  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
02000      $      'ANGED INCORRECTLY *******' )
02001  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
02002      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
02003      $      ' - SUSPECT *******' )
02004  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
02005  9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
02006  9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',
02007      $      I2, ', AP)                           .' )
02008  9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',
02009      $      I2, ', A,', I3, ')                        .' )
02010  9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
02011      $      '******' )
02012 *
02013 *     End of SCHK5.
02014 *
02015       END
02016       SUBROUTINE SCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
02017      $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
02018      $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,
02019      $                  Z )
02020 *
02021 *  Tests SSYR2 and SSPR2.
02022 *
02023 *  Auxiliary routine for test program for Level 2 Blas.
02024 *
02025 *  -- Written on 10-August-1987.
02026 *     Richard Hanson, Sandia National Labs.
02027 *     Jeremy Du Croz, NAG Central Office.
02028 *
02029 *     .. Parameters ..
02030       REAL               ZERO, HALF, ONE
02031       PARAMETER          ( ZERO = 0.0, HALF = 0.5, ONE = 1.0 )
02032 *     .. Scalar Arguments ..
02033       REAL               EPS, THRESH
02034       INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA
02035       LOGICAL            FATAL, REWI, TRACE
02036       CHARACTER*6        SNAME
02037 *     .. Array Arguments ..
02038       REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
02039      $                   AS( NMAX*NMAX ), G( NMAX ), X( NMAX ),
02040      $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),
02041      $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),
02042      $                   YY( NMAX*INCMAX ), Z( NMAX, 2 )
02043       INTEGER            IDIM( NIDIM ), INC( NINC )
02044 *     .. Local Scalars ..
02045       REAL               ALPHA, ALS, ERR, ERRMAX, TRANSL
02046       INTEGER            I, IA, IC, IN, INCX, INCXS, INCY, INCYS, IX,
02047      $                   IY, J, JA, JJ, LAA, LDA, LDAS, LJ, LX, LY, N,
02048      $                   NARGS, NC, NS
02049       LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER
02050       CHARACTER*1        UPLO, UPLOS
02051       CHARACTER*2        ICH
02052 *     .. Local Arrays ..
02053       REAL               W( 2 )
02054       LOGICAL            ISAME( 13 )
02055 *     .. External Functions ..
02056       LOGICAL            LSE, LSERES
02057       EXTERNAL           LSE, LSERES
02058 *     .. External Subroutines ..
02059       EXTERNAL           SMAKE, SMVCH, SSPR2, SSYR2
02060 *     .. Intrinsic Functions ..
02061       INTRINSIC          ABS, MAX
02062 *     .. Scalars in Common ..
02063       INTEGER            INFOT, NOUTC
02064       LOGICAL            LERR, OK
02065 *     .. Common blocks ..
02066       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
02067 *     .. Data statements ..
02068       DATA               ICH/'UL'/
02069 *     .. Executable Statements ..
02070       FULL = SNAME( 3: 3 ).EQ.'Y'
02071       PACKED = SNAME( 3: 3 ).EQ.'P'
02072 *     Define the number of arguments.
02073       IF( FULL )THEN
02074          NARGS = 9
02075       ELSE IF( PACKED )THEN
02076          NARGS = 8
02077       END IF
02078 *
02079       NC = 0
02080       RESET = .TRUE.
02081       ERRMAX = ZERO
02082 *
02083       DO 140 IN = 1, NIDIM
02084          N = IDIM( IN )
02085 *        Set LDA to 1 more than minimum value if room.
02086          LDA = N
02087          IF( LDA.LT.NMAX )
02088      $      LDA = LDA + 1
02089 *        Skip tests if not enough room.
02090          IF( LDA.GT.NMAX )
02091      $      GO TO 140
02092          IF( PACKED )THEN
02093             LAA = ( N*( N + 1 ) )/2
02094          ELSE
02095             LAA = LDA*N
02096          END IF
02097 *
02098          DO 130 IC = 1, 2
02099             UPLO = ICH( IC: IC )
02100             UPPER = UPLO.EQ.'U'
02101 *
02102             DO 120 IX = 1, NINC
02103                INCX = INC( IX )
02104                LX = ABS( INCX )*N
02105 *
02106 *              Generate the vector X.
02107 *
02108                TRANSL = HALF
02109                CALL SMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),
02110      $                     0, N - 1, RESET, TRANSL )
02111                IF( N.GT.1 )THEN
02112                   X( N/2 ) = ZERO
02113                   XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
02114                END IF
02115 *
02116                DO 110 IY = 1, NINC
02117                   INCY = INC( IY )
02118                   LY = ABS( INCY )*N
02119 *
02120 *                 Generate the vector Y.
02121 *
02122                   TRANSL = ZERO
02123                   CALL SMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,
02124      $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )
02125                   IF( N.GT.1 )THEN
02126                      Y( N/2 ) = ZERO
02127                      YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO
02128                   END IF
02129 *
02130                   DO 100 IA = 1, NALF
02131                      ALPHA = ALF( IA )
02132                      NULL = N.LE.0.OR.ALPHA.EQ.ZERO
02133 *
02134 *                    Generate the matrix A.
02135 *
02136                      TRANSL = ZERO
02137                      CALL SMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A,
02138      $                           NMAX, AA, LDA, N - 1, N - 1, RESET,
02139      $                           TRANSL )
02140 *
02141                      NC = NC + 1
02142 *
02143 *                    Save every datum before calling the subroutine.
02144 *
02145                      UPLOS = UPLO
02146                      NS = N
02147                      ALS = ALPHA
02148                      DO 10 I = 1, LAA
02149                         AS( I ) = AA( I )
02150    10                CONTINUE
02151                      LDAS = LDA
02152                      DO 20 I = 1, LX
02153                         XS( I ) = XX( I )
02154    20                CONTINUE
02155                      INCXS = INCX
02156                      DO 30 I = 1, LY
02157                         YS( I ) = YY( I )
02158    30                CONTINUE
02159                      INCYS = INCY
02160 *
02161 *                    Call the subroutine.
02162 *
02163                      IF( FULL )THEN
02164                         IF( TRACE )
02165      $                     WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, N,
02166      $                     ALPHA, INCX, INCY, LDA
02167                         IF( REWI )
02168      $                     REWIND NTRA
02169                         CALL SSYR2( UPLO, N, ALPHA, XX, INCX, YY, INCY,
02170      $                              AA, LDA )
02171                      ELSE IF( PACKED )THEN
02172                         IF( TRACE )
02173      $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, N,
02174      $                     ALPHA, INCX, INCY
02175                         IF( REWI )
02176      $                     REWIND NTRA
02177                         CALL SSPR2( UPLO, N, ALPHA, XX, INCX, YY, INCY,
02178      $                              AA )
02179                      END IF
02180 *
02181 *                    Check if error-exit was taken incorrectly.
02182 *
02183                      IF( .NOT.OK )THEN
02184                         WRITE( NOUT, FMT = 9992 )
02185                         FATAL = .TRUE.
02186                         GO TO 160
02187                      END IF
02188 *
02189 *                    See what data changed inside subroutines.
02190 *
02191                      ISAME( 1 ) = UPLO.EQ.UPLOS
02192                      ISAME( 2 ) = NS.EQ.N
02193                      ISAME( 3 ) = ALS.EQ.ALPHA
02194                      ISAME( 4 ) = LSE( XS, XX, LX )
02195                      ISAME( 5 ) = INCXS.EQ.INCX
02196                      ISAME( 6 ) = LSE( YS, YY, LY )
02197                      ISAME( 7 ) = INCYS.EQ.INCY
02198                      IF( NULL )THEN
02199                         ISAME( 8 ) = LSE( AS, AA, LAA )
02200                      ELSE
02201                         ISAME( 8 ) = LSERES( SNAME( 2: 3 ), UPLO, N, N,
02202      $                               AS, AA, LDA )
02203                      END IF
02204                      IF( .NOT.PACKED )THEN
02205                         ISAME( 9 ) = LDAS.EQ.LDA
02206                      END IF
02207 *
02208 *                    If data was incorrectly changed, report and return.
02209 *
02210                      SAME = .TRUE.
02211                      DO 40 I = 1, NARGS
02212                         SAME = SAME.AND.ISAME( I )
02213                         IF( .NOT.ISAME( I ) )
02214      $                     WRITE( NOUT, FMT = 9998 )I
02215    40                CONTINUE
02216                      IF( .NOT.SAME )THEN
02217                         FATAL = .TRUE.
02218                         GO TO 160
02219                      END IF
02220 *
02221                      IF( .NOT.NULL )THEN
02222 *
02223 *                       Check the result column by column.
02224 *
02225                         IF( INCX.GT.0 )THEN
02226                            DO 50 I = 1, N
02227                               Z( I, 1 ) = X( I )
02228    50                      CONTINUE
02229                         ELSE
02230                            DO 60 I = 1, N
02231                               Z( I, 1 ) = X( N - I + 1 )
02232    60                      CONTINUE
02233                         END IF
02234                         IF( INCY.GT.0 )THEN
02235                            DO 70 I = 1, N
02236                               Z( I, 2 ) = Y( I )
02237    70                      CONTINUE
02238                         ELSE
02239                            DO 80 I = 1, N
02240                               Z( I, 2 ) = Y( N - I + 1 )
02241    80                      CONTINUE
02242                         END IF
02243                         JA = 1
02244                         DO 90 J = 1, N
02245                            W( 1 ) = Z( J, 2 )
02246                            W( 2 ) = Z( J, 1 )
02247                            IF( UPPER )THEN
02248                               JJ = 1
02249                               LJ = J
02250                            ELSE
02251                               JJ = J
02252                               LJ = N - J + 1
02253                            END IF
02254                            CALL SMVCH( 'N', LJ, 2, ALPHA, Z( JJ, 1 ),
02255      $                                 NMAX, W, 1, ONE, A( JJ, J ), 1,
02256      $                                 YT, G, AA( JA ), EPS, ERR, FATAL,
02257      $                                 NOUT, .TRUE. )
02258                            IF( FULL )THEN
02259                               IF( UPPER )THEN
02260                                  JA = JA + LDA
02261                               ELSE
02262                                  JA = JA + LDA + 1
02263                               END IF
02264                            ELSE
02265                               JA = JA + LJ
02266                            END IF
02267                            ERRMAX = MAX( ERRMAX, ERR )
02268 *                          If got really bad answer, report and return.
02269                            IF( FATAL )
02270      $                        GO TO 150
02271    90                   CONTINUE
02272                      ELSE
02273 *                       Avoid repeating tests with N.le.0.
02274                         IF( N.LE.0 )
02275      $                     GO TO 140
02276                      END IF
02277 *
02278   100             CONTINUE
02279 *
02280   110          CONTINUE
02281 *
02282   120       CONTINUE
02283 *
02284   130    CONTINUE
02285 *
02286   140 CONTINUE
02287 *
02288 *     Report result.
02289 *
02290       IF( ERRMAX.LT.THRESH )THEN
02291          WRITE( NOUT, FMT = 9999 )SNAME, NC
02292       ELSE
02293          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
02294       END IF
02295       GO TO 170
02296 *
02297   150 CONTINUE
02298       WRITE( NOUT, FMT = 9995 )J
02299 *
02300   160 CONTINUE
02301       WRITE( NOUT, FMT = 9996 )SNAME
02302       IF( FULL )THEN
02303          WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, INCX,
02304      $      INCY, LDA
02305       ELSE IF( PACKED )THEN
02306          WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, ALPHA, INCX, INCY
02307       END IF
02308 *
02309   170 CONTINUE
02310       RETURN
02311 *
02312  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
02313      $      'S)' )
02314  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
02315      $      'ANGED INCORRECTLY *******' )
02316  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
02317      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
02318      $      ' - SUSPECT *******' )
02319  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
02320  9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
02321  9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',
02322      $      I2, ', Y,', I2, ', AP)                     .' )
02323  9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',
02324      $      I2, ', Y,', I2, ', A,', I3, ')                  .' )
02325  9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
02326      $      '******' )
02327 *
02328 *     End of SCHK6.
02329 *
02330       END
02331       SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT )
02332 *
02333 *  Tests the error exits from the Level 2 Blas.
02334 *  Requires a special version of the error-handling routine XERBLA.
02335 *  ALPHA, BETA, A, X and Y should not need to be defined.
02336 *
02337 *  Auxiliary routine for test program for Level 2 Blas.
02338 *
02339 *  -- Written on 10-August-1987.
02340 *     Richard Hanson, Sandia National Labs.
02341 *     Jeremy Du Croz, NAG Central Office.
02342 *
02343 *     .. Scalar Arguments ..
02344       INTEGER            ISNUM, NOUT
02345       CHARACTER*6        SRNAMT
02346 *     .. Scalars in Common ..
02347       INTEGER            INFOT, NOUTC
02348       LOGICAL            LERR, OK
02349 *     .. Local Scalars ..
02350       REAL               ALPHA, BETA
02351 *     .. Local Arrays ..
02352       REAL               A( 1, 1 ), X( 1 ), Y( 1 )
02353 *     .. External Subroutines ..
02354       EXTERNAL           CHKXER, SGBMV, SGEMV, SGER, SSBMV, SSPMV, SSPR,
02355      $                   SSPR2, SSYMV, SSYR, SSYR2, STBMV, STBSV, STPMV,
02356      $                   STPSV, STRMV, STRSV
02357 *     .. Common blocks ..
02358       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
02359 *     .. Executable Statements ..
02360 *     OK is set to .FALSE. by the special version of XERBLA or by CHKXER
02361 *     if anything is wrong.
02362       OK = .TRUE.
02363 *     LERR is set to .TRUE. by the special version of XERBLA each time
02364 *     it is called, and is then tested and re-set by CHKXER.
02365       LERR = .FALSE.
02366       GO TO ( 10, 20, 30, 40, 50, 60, 70, 80,
02367      $        90, 100, 110, 120, 130, 140, 150,
02368      $        160 )ISNUM
02369    10 INFOT = 1
02370       CALL SGEMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02371       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02372       INFOT = 2
02373       CALL SGEMV( 'N', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02374       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02375       INFOT = 3
02376       CALL SGEMV( 'N', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02377       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02378       INFOT = 6
02379       CALL SGEMV( 'N', 2, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02380       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02381       INFOT = 8
02382       CALL SGEMV( 'N', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )
02383       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02384       INFOT = 11
02385       CALL SGEMV( 'N', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )
02386       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02387       GO TO 170
02388    20 INFOT = 1
02389       CALL SGBMV( '/', 0, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02390       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02391       INFOT = 2
02392       CALL SGBMV( 'N', -1, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02393       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02394       INFOT = 3
02395       CALL SGBMV( 'N', 0, -1, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02396       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02397       INFOT = 4
02398       CALL SGBMV( 'N', 0, 0, -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02399       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02400       INFOT = 5
02401       CALL SGBMV( 'N', 2, 0, 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02402       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02403       INFOT = 8
02404       CALL SGBMV( 'N', 0, 0, 1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02405       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02406       INFOT = 10
02407       CALL SGBMV( 'N', 0, 0, 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )
02408       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02409       INFOT = 13
02410       CALL SGBMV( 'N', 0, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )
02411       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02412       GO TO 170
02413    30 INFOT = 1
02414       CALL SSYMV( '/', 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02415       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02416       INFOT = 2
02417       CALL SSYMV( 'U', -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02418       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02419       INFOT = 5
02420       CALL SSYMV( 'U', 2, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02421       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02422       INFOT = 7
02423       CALL SSYMV( 'U', 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )
02424       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02425       INFOT = 10
02426       CALL SSYMV( 'U', 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )
02427       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02428       GO TO 170
02429    40 INFOT = 1
02430       CALL SSBMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02431       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02432       INFOT = 2
02433       CALL SSBMV( 'U', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02434       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02435       INFOT = 3
02436       CALL SSBMV( 'U', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02437       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02438       INFOT = 6
02439       CALL SSBMV( 'U', 0, 1, ALPHA, A, 1, X, 1, BETA, Y, 1 )
02440       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02441       INFOT = 8
02442       CALL SSBMV( 'U', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )
02443       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02444       INFOT = 11
02445       CALL SSBMV( 'U', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )
02446       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02447       GO TO 170
02448    50 INFOT = 1
02449       CALL SSPMV( '/', 0, ALPHA, A, X, 1, BETA, Y, 1 )
02450       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02451       INFOT = 2
02452       CALL SSPMV( 'U', -1, ALPHA, A, X, 1, BETA, Y, 1 )
02453       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02454       INFOT = 6
02455       CALL SSPMV( 'U', 0, ALPHA, A, X, 0, BETA, Y, 1 )
02456       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02457       INFOT = 9
02458       CALL SSPMV( 'U', 0, ALPHA, A, X, 1, BETA, Y, 0 )
02459       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02460       GO TO 170
02461    60 INFOT = 1
02462       CALL STRMV( '/', 'N', 'N', 0, A, 1, X, 1 )
02463       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02464       INFOT = 2
02465       CALL STRMV( 'U', '/', 'N', 0, A, 1, X, 1 )
02466       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02467       INFOT = 3
02468       CALL STRMV( 'U', 'N', '/', 0, A, 1, X, 1 )
02469       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02470       INFOT = 4
02471       CALL STRMV( 'U', 'N', 'N', -1, A, 1, X, 1 )
02472       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02473       INFOT = 6
02474       CALL STRMV( 'U', 'N', 'N', 2, A, 1, X, 1 )
02475       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02476       INFOT = 8
02477       CALL STRMV( 'U', 'N', 'N', 0, A, 1, X, 0 )
02478       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02479       GO TO 170
02480    70 INFOT = 1
02481       CALL STBMV( '/', 'N', 'N', 0, 0, A, 1, X, 1 )
02482       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02483       INFOT = 2
02484       CALL STBMV( 'U', '/', 'N', 0, 0, A, 1, X, 1 )
02485       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02486       INFOT = 3
02487       CALL STBMV( 'U', 'N', '/', 0, 0, A, 1, X, 1 )
02488       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02489       INFOT = 4
02490       CALL STBMV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 )
02491       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02492       INFOT = 5
02493       CALL STBMV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 )
02494       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02495       INFOT = 7
02496       CALL STBMV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 )
02497       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02498       INFOT = 9
02499       CALL STBMV( 'U', 'N', 'N', 0, 0, A, 1, X, 0 )
02500       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02501       GO TO 170
02502    80 INFOT = 1
02503       CALL STPMV( '/', 'N', 'N', 0, A, X, 1 )
02504       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02505       INFOT = 2
02506       CALL STPMV( 'U', '/', 'N', 0, A, X, 1 )
02507       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02508       INFOT = 3
02509       CALL STPMV( 'U', 'N', '/', 0, A, X, 1 )
02510       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02511       INFOT = 4
02512       CALL STPMV( 'U', 'N', 'N', -1, A, X, 1 )
02513       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02514       INFOT = 7
02515       CALL STPMV( 'U', 'N', 'N', 0, A, X, 0 )
02516       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02517       GO TO 170
02518    90 INFOT = 1
02519       CALL STRSV( '/', 'N', 'N', 0, A, 1, X, 1 )
02520       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02521       INFOT = 2
02522       CALL STRSV( 'U', '/', 'N', 0, A, 1, X, 1 )
02523       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02524       INFOT = 3
02525       CALL STRSV( 'U', 'N', '/', 0, A, 1, X, 1 )
02526       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02527       INFOT = 4
02528       CALL STRSV( 'U', 'N', 'N', -1, A, 1, X, 1 )
02529       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02530       INFOT = 6
02531       CALL STRSV( 'U', 'N', 'N', 2, A, 1, X, 1 )
02532       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02533       INFOT = 8
02534       CALL STRSV( 'U', 'N', 'N', 0, A, 1, X, 0 )
02535       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02536       GO TO 170
02537   100 INFOT = 1
02538       CALL STBSV( '/', 'N', 'N', 0, 0, A, 1, X, 1 )
02539       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02540       INFOT = 2
02541       CALL STBSV( 'U', '/', 'N', 0, 0, A, 1, X, 1 )
02542       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02543       INFOT = 3
02544       CALL STBSV( 'U', 'N', '/', 0, 0, A, 1, X, 1 )
02545       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02546       INFOT = 4
02547       CALL STBSV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 )
02548       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02549       INFOT = 5
02550       CALL STBSV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 )
02551       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02552       INFOT = 7
02553       CALL STBSV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 )
02554       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02555       INFOT = 9
02556       CALL STBSV( 'U', 'N', 'N', 0, 0, A, 1, X, 0 )
02557       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02558       GO TO 170
02559   110 INFOT = 1
02560       CALL STPSV( '/', 'N', 'N', 0, A, X, 1 )
02561       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02562       INFOT = 2
02563       CALL STPSV( 'U', '/', 'N', 0, A, X, 1 )
02564       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02565       INFOT = 3
02566       CALL STPSV( 'U', 'N', '/', 0, A, X, 1 )
02567       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02568       INFOT = 4
02569       CALL STPSV( 'U', 'N', 'N', -1, A, X, 1 )
02570       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02571       INFOT = 7
02572       CALL STPSV( 'U', 'N', 'N', 0, A, X, 0 )
02573       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02574       GO TO 170
02575   120 INFOT = 1
02576       CALL SGER( -1, 0, ALPHA, X, 1, Y, 1, A, 1 )
02577       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02578       INFOT = 2
02579       CALL SGER( 0, -1, ALPHA, X, 1, Y, 1, A, 1 )
02580       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02581       INFOT = 5
02582       CALL SGER( 0, 0, ALPHA, X, 0, Y, 1, A, 1 )
02583       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02584       INFOT = 7
02585       CALL SGER( 0, 0, ALPHA, X, 1, Y, 0, A, 1 )
02586       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02587       INFOT = 9
02588       CALL SGER( 2, 0, ALPHA, X, 1, Y, 1, A, 1 )
02589       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02590       GO TO 170
02591   130 INFOT = 1
02592       CALL SSYR( '/', 0, ALPHA, X, 1, A, 1 )
02593       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02594       INFOT = 2
02595       CALL SSYR( 'U', -1, ALPHA, X, 1, A, 1 )
02596       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02597       INFOT = 5
02598       CALL SSYR( 'U', 0, ALPHA, X, 0, A, 1 )
02599       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02600       INFOT = 7
02601       CALL SSYR( 'U', 2, ALPHA, X, 1, A, 1 )
02602       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02603       GO TO 170
02604   140 INFOT = 1
02605       CALL SSPR( '/', 0, ALPHA, X, 1, A )
02606       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02607       INFOT = 2
02608       CALL SSPR( 'U', -1, ALPHA, X, 1, A )
02609       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02610       INFOT = 5
02611       CALL SSPR( 'U', 0, ALPHA, X, 0, A )
02612       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02613       GO TO 170
02614   150 INFOT = 1
02615       CALL SSYR2( '/', 0, ALPHA, X, 1, Y, 1, A, 1 )
02616       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02617       INFOT = 2
02618       CALL SSYR2( 'U', -1, ALPHA, X, 1, Y, 1, A, 1 )
02619       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02620       INFOT = 5
02621       CALL SSYR2( 'U', 0, ALPHA, X, 0, Y, 1, A, 1 )
02622       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02623       INFOT = 7
02624       CALL SSYR2( 'U', 0, ALPHA, X, 1, Y, 0, A, 1 )
02625       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02626       INFOT = 9
02627       CALL SSYR2( 'U', 2, ALPHA, X, 1, Y, 1, A, 1 )
02628       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02629       GO TO 170
02630   160 INFOT = 1
02631       CALL SSPR2( '/', 0, ALPHA, X, 1, Y, 1, A )
02632       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02633       INFOT = 2
02634       CALL SSPR2( 'U', -1, ALPHA, X, 1, Y, 1, A )
02635       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02636       INFOT = 5
02637       CALL SSPR2( 'U', 0, ALPHA, X, 0, Y, 1, A )
02638       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02639       INFOT = 7
02640       CALL SSPR2( 'U', 0, ALPHA, X, 1, Y, 0, A )
02641       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
02642 *
02643   170 IF( OK )THEN
02644          WRITE( NOUT, FMT = 9999 )SRNAMT
02645       ELSE
02646          WRITE( NOUT, FMT = 9998 )SRNAMT
02647       END IF
02648       RETURN
02649 *
02650  9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' )
02651  9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****',
02652      $      '**' )
02653 *
02654 *     End of SCHKE.
02655 *
02656       END
02657       SUBROUTINE SMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL,
02658      $                  KU, RESET, TRANSL )
02659 *
02660 *  Generates values for an M by N matrix A within the bandwidth
02661 *  defined by KL and KU.
02662 *  Stores the values in the array AA in the data structure required
02663 *  by the routine, with unwanted elements set to rogue value.
02664 *
02665 *  TYPE is 'GE', 'GB', 'SY', 'SB', 'SP', 'TR', 'TB' OR 'TP'.
02666 *
02667 *  Auxiliary routine for test program for Level 2 Blas.
02668 *
02669 *  -- Written on 10-August-1987.
02670 *     Richard Hanson, Sandia National Labs.
02671 *     Jeremy Du Croz, NAG Central Office.
02672 *
02673 *     .. Parameters ..
02674       REAL               ZERO, ONE
02675       PARAMETER          ( ZERO = 0.0, ONE = 1.0 )
02676       REAL               ROGUE
02677       PARAMETER          ( ROGUE = -1.0E10 )
02678 *     .. Scalar Arguments ..
02679       REAL               TRANSL
02680       INTEGER            KL, KU, LDA, M, N, NMAX
02681       LOGICAL            RESET
02682       CHARACTER*1        DIAG, UPLO
02683       CHARACTER*2        TYPE
02684 *     .. Array Arguments ..
02685       REAL               A( NMAX, * ), AA( * )
02686 *     .. Local Scalars ..
02687       INTEGER            I, I1, I2, I3, IBEG, IEND, IOFF, J, KK
02688       LOGICAL            GEN, LOWER, SYM, TRI, UNIT, UPPER
02689 *     .. External Functions ..
02690       REAL               SBEG
02691       EXTERNAL           SBEG
02692 *     .. Intrinsic Functions ..
02693       INTRINSIC          MAX, MIN
02694 *     .. Executable Statements ..
02695       GEN = TYPE( 1: 1 ).EQ.'G'
02696       SYM = TYPE( 1: 1 ).EQ.'S'
02697       TRI = TYPE( 1: 1 ).EQ.'T'
02698       UPPER = ( SYM.OR.TRI ).AND.UPLO.EQ.'U'
02699       LOWER = ( SYM.OR.TRI ).AND.UPLO.EQ.'L'
02700       UNIT = TRI.AND.DIAG.EQ.'U'
02701 *
02702 *     Generate data in array A.
02703 *
02704       DO 20 J = 1, N
02705          DO 10 I = 1, M
02706             IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )
02707      $          THEN
02708                IF( ( I.LE.J.AND.J - I.LE.KU ).OR.
02709      $             ( I.GE.J.AND.I - J.LE.KL ) )THEN
02710                   A( I, J ) = SBEG( RESET ) + TRANSL
02711                ELSE
02712                   A( I, J ) = ZERO
02713                END IF
02714                IF( I.NE.J )THEN
02715                   IF( SYM )THEN
02716                      A( J, I ) = A( I, J )
02717                   ELSE IF( TRI )THEN
02718                      A( J, I ) = ZERO
02719                   END IF
02720                END IF
02721             END IF
02722    10    CONTINUE
02723          IF( TRI )
02724      $      A( J, J ) = A( J, J ) + ONE
02725          IF( UNIT )
02726      $      A( J, J ) = ONE
02727    20 CONTINUE
02728 *
02729 *     Store elements in array AS in data structure required by routine.
02730 *
02731       IF( TYPE.EQ.'GE' )THEN
02732          DO 50 J = 1, N
02733             DO 30 I = 1, M
02734                AA( I + ( J - 1 )*LDA ) = A( I, J )
02735    30       CONTINUE
02736             DO 40 I = M + 1, LDA
02737                AA( I + ( J - 1 )*LDA ) = ROGUE
02738    40       CONTINUE
02739    50    CONTINUE
02740       ELSE IF( TYPE.EQ.'GB' )THEN
02741          DO 90 J = 1, N
02742             DO 60 I1 = 1, KU + 1 - J
02743                AA( I1 + ( J - 1 )*LDA ) = ROGUE
02744    60       CONTINUE
02745             DO 70 I2 = I1, MIN( KL + KU + 1, KU + 1 + M - J )
02746                AA( I2 + ( J - 1 )*LDA ) = A( I2 + J - KU - 1, J )
02747    70       CONTINUE
02748             DO 80 I3 = I2, LDA
02749                AA( I3 + ( J - 1 )*LDA ) = ROGUE
02750    80       CONTINUE
02751    90    CONTINUE
02752       ELSE IF( TYPE.EQ.'SY'.OR.TYPE.EQ.'TR' )THEN
02753          DO 130 J = 1, N
02754             IF( UPPER )THEN
02755                IBEG = 1
02756                IF( UNIT )THEN
02757                   IEND = J - 1
02758                ELSE
02759                   IEND = J
02760                END IF
02761             ELSE
02762                IF( UNIT )THEN
02763                   IBEG = J + 1
02764                ELSE
02765                   IBEG = J
02766                END IF
02767                IEND = N
02768             END IF
02769             DO 100 I = 1, IBEG - 1
02770                AA( I + ( J - 1 )*LDA ) = ROGUE
02771   100       CONTINUE
02772             DO 110 I = IBEG, IEND
02773                AA( I + ( J - 1 )*LDA ) = A( I, J )
02774   110       CONTINUE
02775             DO 120 I = IEND + 1, LDA
02776                AA( I + ( J - 1 )*LDA ) = ROGUE
02777   120       CONTINUE
02778   130    CONTINUE
02779       ELSE IF( TYPE.EQ.'SB'.OR.TYPE.EQ.'TB' )THEN
02780          DO 170 J = 1, N
02781             IF( UPPER )THEN
02782                KK = KL + 1
02783                IBEG = MAX( 1, KL + 2 - J )
02784                IF( UNIT )THEN
02785                   IEND = KL
02786                ELSE
02787                   IEND = KL + 1
02788                END IF
02789             ELSE
02790                KK = 1
02791                IF( UNIT )THEN
02792                   IBEG = 2
02793                ELSE
02794                   IBEG = 1
02795                END IF
02796                IEND = MIN( KL + 1, 1 + M - J )
02797             END IF
02798             DO 140 I = 1, IBEG - 1
02799                AA( I + ( J - 1 )*LDA ) = ROGUE
02800   140       CONTINUE
02801             DO 150 I = IBEG, IEND
02802                AA( I + ( J - 1 )*LDA ) = A( I + J - KK, J )
02803   150       CONTINUE
02804             DO 160 I = IEND + 1, LDA
02805                AA( I + ( J - 1 )*LDA ) = ROGUE
02806   160       CONTINUE
02807   170    CONTINUE
02808       ELSE IF( TYPE.EQ.'SP'.OR.TYPE.EQ.'TP' )THEN
02809          IOFF = 0
02810          DO 190 J = 1, N
02811             IF( UPPER )THEN
02812                IBEG = 1
02813                IEND = J
02814             ELSE
02815                IBEG = J
02816                IEND = N
02817             END IF
02818             DO 180 I = IBEG, IEND
02819                IOFF = IOFF + 1
02820                AA( IOFF ) = A( I, J )
02821                IF( I.EQ.J )THEN
02822                   IF( UNIT )
02823      $               AA( IOFF ) = ROGUE
02824                END IF
02825   180       CONTINUE
02826   190    CONTINUE
02827       END IF
02828       RETURN
02829 *
02830 *     End of SMAKE.
02831 *
02832       END
02833       SUBROUTINE SMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y,
02834      $                  INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV )
02835 *
02836 *  Checks the results of the computational tests.
02837 *
02838 *  Auxiliary routine for test program for Level 2 Blas.
02839 *
02840 *  -- Written on 10-August-1987.
02841 *     Richard Hanson, Sandia National Labs.
02842 *     Jeremy Du Croz, NAG Central Office.
02843 *
02844 *     .. Parameters ..
02845       REAL               ZERO, ONE
02846       PARAMETER          ( ZERO = 0.0, ONE = 1.0 )
02847 *     .. Scalar Arguments ..
02848       REAL               ALPHA, BETA, EPS, ERR
02849       INTEGER            INCX, INCY, M, N, NMAX, NOUT
02850       LOGICAL            FATAL, MV
02851       CHARACTER*1        TRANS
02852 *     .. Array Arguments ..
02853       REAL               A( NMAX, * ), G( * ), X( * ), Y( * ), YT( * ),
02854      $                   YY( * )
02855 *     .. Local Scalars ..
02856       REAL               ERRI
02857       INTEGER            I, INCXL, INCYL, IY, J, JX, KX, KY, ML, NL
02858       LOGICAL            TRAN
02859 *     .. Intrinsic Functions ..
02860       INTRINSIC          ABS, MAX, SQRT
02861 *     .. Executable Statements ..
02862       TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'
02863       IF( TRAN )THEN
02864          ML = N
02865          NL = M
02866       ELSE
02867          ML = M
02868          NL = N
02869       END IF
02870       IF( INCX.LT.0 )THEN
02871          KX = NL
02872          INCXL = -1
02873       ELSE
02874          KX = 1
02875          INCXL = 1
02876       END IF
02877       IF( INCY.LT.0 )THEN
02878          KY = ML
02879          INCYL = -1
02880       ELSE
02881          KY = 1
02882          INCYL = 1
02883       END IF
02884 *
02885 *     Compute expected result in YT using data in A, X and Y.
02886 *     Compute gauges in G.
02887 *
02888       IY = KY
02889       DO 30 I = 1, ML
02890          YT( IY ) = ZERO
02891          G( IY ) = ZERO
02892          JX = KX
02893          IF( TRAN )THEN
02894             DO 10 J = 1, NL
02895                YT( IY ) = YT( IY ) + A( J, I )*X( JX )
02896                G( IY ) = G( IY ) + ABS( A( J, I )*X( JX ) )
02897                JX = JX + INCXL
02898    10       CONTINUE
02899          ELSE
02900             DO 20 J = 1, NL
02901                YT( IY ) = YT( IY ) + A( I, J )*X( JX )
02902                G( IY ) = G( IY ) + ABS( A( I, J )*X( JX ) )
02903                JX = JX + INCXL
02904    20       CONTINUE
02905          END IF
02906          YT( IY ) = ALPHA*YT( IY ) + BETA*Y( IY )
02907          G( IY ) = ABS( ALPHA )*G( IY ) + ABS( BETA*Y( IY ) )
02908          IY = IY + INCYL
02909    30 CONTINUE
02910 *
02911 *     Compute the error ratio for this result.
02912 *
02913       ERR = ZERO
02914       DO 40 I = 1, ML
02915          ERRI = ABS( YT( I ) - YY( 1 + ( I - 1 )*ABS( INCY ) ) )/EPS
02916          IF( G( I ).NE.ZERO )
02917      $      ERRI = ERRI/G( I )
02918          ERR = MAX( ERR, ERRI )
02919          IF( ERR*SQRT( EPS ).GE.ONE )
02920      $      GO TO 50
02921    40 CONTINUE
02922 *     If the loop completes, all results are at least half accurate.
02923       GO TO 70
02924 *
02925 *     Report fatal error.
02926 *
02927    50 FATAL = .TRUE.
02928       WRITE( NOUT, FMT = 9999 )
02929       DO 60 I = 1, ML
02930          IF( MV )THEN
02931             WRITE( NOUT, FMT = 9998 )I, YT( I ),
02932      $         YY( 1 + ( I - 1 )*ABS( INCY ) )
02933          ELSE
02934             WRITE( NOUT, FMT = 9998 )I, 
02935      $         YY( 1 + ( I - 1 )*ABS( INCY ) ), YT(I)
02936          END IF
02937    60 CONTINUE
02938 *
02939    70 CONTINUE
02940       RETURN
02941 *
02942  9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
02943      $      'F ACCURATE *******', /'           EXPECTED RESULT   COMPU',
02944      $      'TED RESULT' )
02945  9998 FORMAT( 1X, I7, 2G18.6 )
02946 *
02947 *     End of SMVCH.
02948 *
02949       END
02950       LOGICAL FUNCTION LSE( RI, RJ, LR )
02951 *
02952 *  Tests if two arrays are identical.
02953 *
02954 *  Auxiliary routine for test program for Level 2 Blas.
02955 *
02956 *  -- Written on 10-August-1987.
02957 *     Richard Hanson, Sandia National Labs.
02958 *     Jeremy Du Croz, NAG Central Office.
02959 *
02960 *     .. Scalar Arguments ..
02961       INTEGER            LR
02962 *     .. Array Arguments ..
02963       REAL               RI( * ), RJ( * )
02964 *     .. Local Scalars ..
02965       INTEGER            I
02966 *     .. Executable Statements ..
02967       DO 10 I = 1, LR
02968          IF( RI( I ).NE.RJ( I ) )
02969      $      GO TO 20
02970    10 CONTINUE
02971       LSE = .TRUE.
02972       GO TO 30
02973    20 CONTINUE
02974       LSE = .FALSE.
02975    30 RETURN
02976 *
02977 *     End of LSE.
02978 *
02979       END
02980       LOGICAL FUNCTION LSERES( TYPE, UPLO, M, N, AA, AS, LDA )
02981 *
02982 *  Tests if selected elements in two arrays are equal.
02983 *
02984 *  TYPE is 'GE', 'SY' or 'SP'.
02985 *
02986 *  Auxiliary routine for test program for Level 2 Blas.
02987 *
02988 *  -- Written on 10-August-1987.
02989 *     Richard Hanson, Sandia National Labs.
02990 *     Jeremy Du Croz, NAG Central Office.
02991 *
02992 *     .. Scalar Arguments ..
02993       INTEGER            LDA, M, N
02994       CHARACTER*1        UPLO
02995       CHARACTER*2        TYPE
02996 *     .. Array Arguments ..
02997       REAL               AA( LDA, * ), AS( LDA, * )
02998 *     .. Local Scalars ..
02999       INTEGER            I, IBEG, IEND, J
03000       LOGICAL            UPPER
03001 *     .. Executable Statements ..
03002       UPPER = UPLO.EQ.'U'
03003       IF( TYPE.EQ.'GE' )THEN
03004          DO 20 J = 1, N
03005             DO 10 I = M + 1, LDA
03006                IF( AA( I, J ).NE.AS( I, J ) )
03007      $            GO TO 70
03008    10       CONTINUE
03009    20    CONTINUE
03010       ELSE IF( TYPE.EQ.'SY' )THEN
03011          DO 50 J = 1, N
03012             IF( UPPER )THEN
03013                IBEG = 1
03014                IEND = J
03015             ELSE
03016                IBEG = J
03017                IEND = N
03018             END IF
03019             DO 30 I = 1, IBEG - 1
03020                IF( AA( I, J ).NE.AS( I, J ) )
03021      $            GO TO 70
03022    30       CONTINUE
03023             DO 40 I = IEND + 1, LDA
03024                IF( AA( I, J ).NE.AS( I, J ) )
03025      $            GO TO 70
03026    40       CONTINUE
03027    50    CONTINUE
03028       END IF
03029 *
03030       LSERES = .TRUE.
03031       GO TO 80
03032    70 CONTINUE
03033       LSERES = .FALSE.
03034    80 RETURN
03035 *
03036 *     End of LSERES.
03037 *
03038       END
03039       REAL FUNCTION SBEG( RESET )
03040 *
03041 *  Generates random numbers uniformly distributed between -0.5 and 0.5.
03042 *
03043 *  Auxiliary routine for test program for Level 2 Blas.
03044 *
03045 *  -- Written on 10-August-1987.
03046 *     Richard Hanson, Sandia National Labs.
03047 *     Jeremy Du Croz, NAG Central Office.
03048 *
03049 *     .. Scalar Arguments ..
03050       LOGICAL            RESET
03051 *     .. Local Scalars ..
03052       INTEGER            I, IC, MI
03053 *     .. Save statement ..
03054       SAVE               I, IC, MI
03055 *     .. Intrinsic Functions ..
03056       INTRINSIC          REAL
03057 *     .. Executable Statements ..
03058       IF( RESET )THEN
03059 *        Initialize local variables.
03060          MI = 891
03061          I = 7
03062          IC = 0
03063          RESET = .FALSE.
03064       END IF
03065 *
03066 *     The sequence of values of I is bounded between 1 and 999.
03067 *     If initial I = 1,2,3,6,7 or 9, the period will be 50.
03068 *     If initial I = 4 or 8, the period will be 25.
03069 *     If initial I = 5, the period will be 10.
03070 *     IC is used to break up the period by skipping 1 value of I in 6.
03071 *
03072       IC = IC + 1
03073    10 I = I*MI
03074       I = I - 1000*( I/1000 )
03075       IF( IC.GE.5 )THEN
03076          IC = 0
03077          GO TO 10
03078       END IF
03079       SBEG = REAL( I - 500 )/1001.0
03080       RETURN
03081 *
03082 *     End of SBEG.
03083 *
03084       END
03085       REAL FUNCTION SDIFF( X, Y )
03086 *
03087 *  Auxiliary routine for test program for Level 2 Blas.
03088 *
03089 *  -- Written on 10-August-1987.
03090 *     Richard Hanson, Sandia National Labs.
03091 *
03092 *     .. Scalar Arguments ..
03093       REAL               X, Y
03094 *     .. Executable Statements ..
03095       SDIFF = X - Y
03096       RETURN
03097 *
03098 *     End of SDIFF.
03099 *
03100       END
03101       SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
03102 *
03103 *  Tests whether XERBLA has detected an error when it should.
03104 *
03105 *  Auxiliary routine for test program for Level 2 Blas.
03106 *
03107 *  -- Written on 10-August-1987.
03108 *     Richard Hanson, Sandia National Labs.
03109 *     Jeremy Du Croz, NAG Central Office.
03110 *
03111 *     .. Scalar Arguments ..
03112       INTEGER            INFOT, NOUT
03113       LOGICAL            LERR, OK
03114       CHARACTER*6        SRNAMT
03115 *     .. Executable Statements ..
03116       IF( .NOT.LERR )THEN
03117          WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT
03118          OK = .FALSE.
03119       END IF
03120       LERR = .FALSE.
03121       RETURN
03122 *
03123  9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D',
03124      $      'ETECTED BY ', A6, ' *****' )
03125 *
03126 *     End of CHKXER.
03127 *
03128       END
03129       SUBROUTINE XERBLA( SRNAME, INFO )
03130 *
03131 *  This is a special version of XERBLA to be used only as part of
03132 *  the test program for testing error exits from the Level 2 BLAS
03133 *  routines.
03134 *
03135 *  XERBLA  is an error handler for the Level 2 BLAS routines.
03136 *
03137 *  It is called by the Level 2 BLAS routines if an input parameter is
03138 *  invalid.
03139 *
03140 *  Auxiliary routine for test program for Level 2 Blas.
03141 *
03142 *  -- Written on 10-August-1987.
03143 *     Richard Hanson, Sandia National Labs.
03144 *     Jeremy Du Croz, NAG Central Office.
03145 *
03146 *     .. Scalar Arguments ..
03147       INTEGER            INFO
03148       CHARACTER*6        SRNAME
03149 *     .. Scalars in Common ..
03150       INTEGER            INFOT, NOUT
03151       LOGICAL            LERR, OK
03152       CHARACTER*6        SRNAMT
03153 *     .. Common blocks ..
03154       COMMON             /INFOC/INFOT, NOUT, OK, LERR
03155       COMMON             /SRNAMC/SRNAMT
03156 *     .. Executable Statements ..
03157       LERR = .TRUE.
03158       IF( INFO.NE.INFOT )THEN
03159          IF( INFOT.NE.0 )THEN
03160             WRITE( NOUT, FMT = 9999 )INFO, INFOT
03161          ELSE
03162             WRITE( NOUT, FMT = 9997 )INFO
03163          END IF
03164          OK = .FALSE.
03165       END IF
03166       IF( SRNAME.NE.SRNAMT )THEN
03167          WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT
03168          OK = .FALSE.
03169       END IF
03170       RETURN
03171 *
03172  9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD',
03173      $      ' OF ', I2, ' *******' )
03174  9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE',
03175      $      'AD OF ', A6, ' *******' )
03176  9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6,
03177      $      ' *******' )
03178 *
03179 *     End of XERBLA
03180 *
03181       END
03182 
 All Files Functions