Home | History | Annotate | Download | only in testing
      1       PROGRAM CBLAT2
      2 *
      3 *  Test program for the COMPLEX          Level 2 Blas.
      4 *
      5 *  The program must be driven by a short data file. The first 17 records
      6 *  of the file are read using list-directed input, the last 17 records
      7 *  are read using the format ( A12, L2 ). An annotated example of a data
      8 *  file can be obtained by deleting the first 3 characters from the
      9 *  following 34 lines:
     10 *  'CBLAT2.SNAP'     NAME OF SNAPSHOT OUTPUT FILE
     11 *  -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)
     12 *  F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.
     13 *  F        LOGICAL FLAG, T TO STOP ON FAILURES.
     14 *  T        LOGICAL FLAG, T TO TEST ERROR EXITS.
     15 *  2        0 TO TEST COLUMN-MAJOR, 1 TO TEST ROW-MAJOR, 2 TO TEST BOTH
     16 *  16.0     THRESHOLD VALUE OF TEST RATIO
     17 *  6                 NUMBER OF VALUES OF N
     18 *  0 1 2 3 5 9       VALUES OF N
     19 *  4                 NUMBER OF VALUES OF K
     20 *  0 1 2 4           VALUES OF K
     21 *  4                 NUMBER OF VALUES OF INCX AND INCY
     22 *  1 2 -1 -2         VALUES OF INCX AND INCY
     23 *  3                 NUMBER OF VALUES OF ALPHA
     24 *  (0.0,0.0) (1.0,0.0) (0.7,-0.9)       VALUES OF ALPHA
     25 *  3                 NUMBER OF VALUES OF BETA
     26 *  (0.0,0.0) (1.0,0.0) (1.3,-1.1)       VALUES OF BETA
     27 *  cblas_cgemv  T PUT F FOR NO TEST. SAME COLUMNS.
     28 *  cblas_cgbmv  T PUT F FOR NO TEST. SAME COLUMNS.
     29 *  cblas_chemv  T PUT F FOR NO TEST. SAME COLUMNS.
     30 *  cblas_chbmv  T PUT F FOR NO TEST. SAME COLUMNS.
     31 *  cblas_chpmv  T PUT F FOR NO TEST. SAME COLUMNS.
     32 *  cblas_ctrmv  T PUT F FOR NO TEST. SAME COLUMNS.
     33 *  cblas_ctbmv  T PUT F FOR NO TEST. SAME COLUMNS.
     34 *  cblas_ctpmv  T PUT F FOR NO TEST. SAME COLUMNS.
     35 *  cblas_ctrsv  T PUT F FOR NO TEST. SAME COLUMNS.
     36 *  cblas_ctbsv  T PUT F FOR NO TEST. SAME COLUMNS.
     37 *  cblas_ctpsv  T PUT F FOR NO TEST. SAME COLUMNS.
     38 *  cblas_cgerc  T PUT F FOR NO TEST. SAME COLUMNS.
     39 *  cblas_cgeru  T PUT F FOR NO TEST. SAME COLUMNS.
     40 *  cblas_cher   T PUT F FOR NO TEST. SAME COLUMNS.
     41 *  cblas_chpr   T PUT F FOR NO TEST. SAME COLUMNS.
     42 *  cblas_cher2  T PUT F FOR NO TEST. SAME COLUMNS.
     43 *  cblas_chpr2  T PUT F FOR NO TEST. SAME COLUMNS.
     44 *
     45 *     See:
     46 *
     47 *        Dongarra J. J., Du Croz J. J., Hammarling S.  and Hanson R. J..
     48 *        An  extended  set of Fortran  Basic Linear Algebra Subprograms.
     49 *
     50 *        Technical  Memoranda  Nos. 41 (revision 3) and 81,  Mathematics
     51 *        and  Computer Science  Division,  Argonne  National Laboratory,
     52 *        9700 South Cass Avenue, Argonne, Illinois 60439, US.
     53 *
     54 *        Or
     55 *
     56 *        NAG  Technical Reports TR3/87 and TR4/87,  Numerical Algorithms
     57 *        Group  Ltd.,  NAG  Central  Office,  256  Banbury  Road, Oxford
     58 *        OX2 7DE, UK,  and  Numerical Algorithms Group Inc.,  1101  31st
     59 *        Street,  Suite 100,  Downers Grove,  Illinois 60515-1263,  USA.
     60 *
     61 *
     62 *  -- Written on 10-August-1987.
     63 *     Richard Hanson, Sandia National Labs.
     64 *     Jeremy Du Croz, NAG Central Office.
     65 *
     66 *     .. Parameters ..
     67       INTEGER            NIN, NOUT
     68       PARAMETER          ( NIN = 5, NOUT = 6 )
     69       INTEGER            NSUBS
     70       PARAMETER          ( NSUBS = 17 )
     71       COMPLEX            ZERO, ONE
     72       PARAMETER          ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )
     73       REAL               RZERO, RHALF, RONE
     74       PARAMETER          ( RZERO = 0.0, RHALF = 0.5, RONE = 1.0 )
     75       INTEGER            NMAX, INCMAX
     76       PARAMETER          ( NMAX = 65, INCMAX = 2 )
     77       INTEGER            NINMAX, NIDMAX, NKBMAX, NALMAX, NBEMAX
     78       PARAMETER          ( NINMAX = 7, NIDMAX = 9, NKBMAX = 7,
     79      $                   NALMAX = 7, NBEMAX = 7 )
     80 *     .. Local Scalars ..
     81       REAL               EPS, ERR, THRESH
     82       INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NINC, NKB,
     83      $                   NTRA, LAYOUT
     84       LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,
     85      $                   TSTERR, CORDER, RORDER
     86       CHARACTER*1        TRANS
     87       CHARACTER*12       SNAMET
     88       CHARACTER*32       SNAPS
     89 *     .. Local Arrays ..
     90       COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ),
     91      $                   ALF( NALMAX ), AS( NMAX*NMAX ), BET( NBEMAX ),
     92      $                   X( NMAX ), XS( NMAX*INCMAX ),
     93      $                   XX( NMAX*INCMAX ), Y( NMAX ),
     94      $                   YS( NMAX*INCMAX ), YT( NMAX ),
     95      $                   YY( NMAX*INCMAX ), Z( 2*NMAX )
     96       REAL               G( NMAX )
     97       INTEGER            IDIM( NIDMAX ), INC( NINMAX ), KB( NKBMAX )
     98       LOGICAL            LTEST( NSUBS )
     99       CHARACTER*12       SNAMES( NSUBS )
    100 *     .. External Functions ..
    101       REAL               SDIFF
    102       LOGICAL            LCE
    103       EXTERNAL           SDIFF, LCE
    104 *     .. External Subroutines ..
    105       EXTERNAL           CCHK1, CCHK2, CCHK3, CCHK4, CCHK5, CCHK6,
    106      $                   CC2CHKE, CMVCH
    107 *     .. Intrinsic Functions ..
    108       INTRINSIC          ABS, MAX, MIN
    109 *     .. Scalars in Common ..
    110       INTEGER            INFOT, NOUTC
    111       LOGICAL            OK
    112       CHARACTER*12       SRNAMT
    113 *     .. Common blocks ..
    114       COMMON             /INFOC/INFOT, NOUTC, OK
    115       COMMON             /SRNAMC/SRNAMT
    116 *     .. Data statements ..
    117       DATA               SNAMES/'cblas_cgemv ', 'cblas_cgbmv ',
    118      $                   'cblas_chemv ','cblas_chbmv ','cblas_chpmv ',
    119      $                   'cblas_ctrmv ','cblas_ctbmv ','cblas_ctpmv ',
    120      $                   'cblas_ctrsv ','cblas_ctbsv ','cblas_ctpsv ',
    121      $                   'cblas_cgerc ','cblas_cgeru ','cblas_cher  ',
    122      $                   'cblas_chpr  ','cblas_cher2 ','cblas_chpr2 '/
    123 *     .. Executable Statements ..
    124 *
    125       NOUTC = NOUT
    126 *
    127 *     Read name and unit number for summary output file and open file.
    128 *
    129       READ( NIN, FMT = * )SNAPS
    130       READ( NIN, FMT = * )NTRA
    131       TRACE = NTRA.GE.0
    132       IF( TRACE )THEN
    133          OPEN( NTRA, FILE = SNAPS )
    134       END IF
    135 *     Read the flag that directs rewinding of the snapshot file.
    136       READ( NIN, FMT = * )REWI
    137       REWI = REWI.AND.TRACE
    138 *     Read the flag that directs stopping on any failure.
    139       READ( NIN, FMT = * )SFATAL
    140 *     Read the flag that indicates whether error exits are to be tested.
    141       READ( NIN, FMT = * )TSTERR
    142 *     Read the flag that indicates whether row-major data layout to be tested.
    143       READ( NIN, FMT = * )LAYOUT
    144 *     Read the threshold value of the test ratio
    145       READ( NIN, FMT = * )THRESH
    146 *
    147 *     Read and check the parameter values for the tests.
    148 *
    149 *     Values of N
    150       READ( NIN, FMT = * )NIDIM
    151       IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN
    152          WRITE( NOUT, FMT = 9997 )'N', NIDMAX
    153          GO TO 230
    154       END IF
    155       READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )
    156       DO 10 I = 1, NIDIM
    157          IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN
    158             WRITE( NOUT, FMT = 9996 )NMAX
    159             GO TO 230
    160          END IF
    161    10 CONTINUE
    162 *     Values of K
    163       READ( NIN, FMT = * )NKB
    164       IF( NKB.LT.1.OR.NKB.GT.NKBMAX )THEN
    165          WRITE( NOUT, FMT = 9997 )'K', NKBMAX
    166          GO TO 230
    167       END IF
    168       READ( NIN, FMT = * )( KB( I ), I = 1, NKB )
    169       DO 20 I = 1, NKB
    170          IF( KB( I ).LT.0 )THEN
    171             WRITE( NOUT, FMT = 9995 )
    172             GO TO 230
    173          END IF
    174    20 CONTINUE
    175 *     Values of INCX and INCY
    176       READ( NIN, FMT = * )NINC
    177       IF( NINC.LT.1.OR.NINC.GT.NINMAX )THEN
    178          WRITE( NOUT, FMT = 9997 )'INCX AND INCY', NINMAX
    179          GO TO 230
    180       END IF
    181       READ( NIN, FMT = * )( INC( I ), I = 1, NINC )
    182       DO 30 I = 1, NINC
    183          IF( INC( I ).EQ.0.OR.ABS( INC( I ) ).GT.INCMAX )THEN
    184             WRITE( NOUT, FMT = 9994 )INCMAX
    185             GO TO 230
    186          END IF
    187    30 CONTINUE
    188 *     Values of ALPHA
    189       READ( NIN, FMT = * )NALF
    190       IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN
    191          WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX
    192          GO TO 230
    193       END IF
    194       READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )
    195 *     Values of BETA
    196       READ( NIN, FMT = * )NBET
    197       IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN
    198          WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX
    199          GO TO 230
    200       END IF
    201       READ( NIN, FMT = * )( BET( I ), I = 1, NBET )
    202 *
    203 *     Report values of parameters.
    204 *
    205       WRITE( NOUT, FMT = 9993 )
    206       WRITE( NOUT, FMT = 9992 )( IDIM( I ), I = 1, NIDIM )
    207       WRITE( NOUT, FMT = 9991 )( KB( I ), I = 1, NKB )
    208       WRITE( NOUT, FMT = 9990 )( INC( I ), I = 1, NINC )
    209       WRITE( NOUT, FMT = 9989 )( ALF( I ), I = 1, NALF )
    210       WRITE( NOUT, FMT = 9988 )( BET( I ), I = 1, NBET )
    211       IF( .NOT.TSTERR )THEN
    212          WRITE( NOUT, FMT = * )
    213          WRITE( NOUT, FMT = 9980 )
    214       END IF
    215       WRITE( NOUT, FMT = * )
    216       WRITE( NOUT, FMT = 9999 )THRESH
    217       WRITE( NOUT, FMT = * )
    218 
    219       RORDER = .FALSE.
    220       CORDER = .FALSE.
    221       IF (LAYOUT.EQ.2) THEN
    222          RORDER = .TRUE.
    223          CORDER = .TRUE.
    224          WRITE( *, FMT = 10002 )
    225       ELSE IF (LAYOUT.EQ.1) THEN
    226          RORDER = .TRUE.
    227          WRITE( *, FMT = 10001 )
    228       ELSE IF (LAYOUT.EQ.0) THEN
    229          CORDER = .TRUE.
    230          WRITE( *, FMT = 10000 )
    231       END IF
    232       WRITE( *, FMT = * )
    233 *
    234 *     Read names of subroutines and flags which indicate
    235 *     whether they are to be tested.
    236 *
    237       DO 40 I = 1, NSUBS
    238          LTEST( I ) = .FALSE.
    239    40 CONTINUE
    240    50 READ( NIN, FMT = 9984, END = 80 )SNAMET, LTESTT
    241       DO 60 I = 1, NSUBS
    242          IF( SNAMET.EQ.SNAMES( I ) )
    243      $      GO TO 70
    244    60 CONTINUE
    245       WRITE( NOUT, FMT = 9986 )SNAMET
    246       STOP
    247    70 LTEST( I ) = LTESTT
    248       GO TO 50
    249 *
    250    80 CONTINUE
    251       CLOSE ( NIN )
    252 *
    253 *     Compute EPS (the machine precision).
    254 *
    255       EPS = RONE
    256    90 CONTINUE
    257       IF( SDIFF( RONE + EPS, RONE ).EQ.RZERO )
    258      $   GO TO 100
    259       EPS = RHALF*EPS
    260       GO TO 90
    261   100 CONTINUE
    262       EPS = EPS + EPS
    263       WRITE( NOUT, FMT = 9998 )EPS
    264 *
    265 *     Check the reliability of CMVCH using exact data.
    266 *
    267       N = MIN( 32, NMAX )
    268       DO 120 J = 1, N
    269          DO 110 I = 1, N
    270             A( I, J ) = MAX( I - J + 1, 0 )
    271   110    CONTINUE
    272          X( J ) = J
    273          Y( J ) = ZERO
    274   120 CONTINUE
    275       DO 130 J = 1, N
    276          YY( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3
    277   130 CONTINUE
    278 *     YY holds the exact result. On exit from CMVCH YT holds
    279 *     the result computed by CMVCH.
    280       TRANS = 'N'
    281       CALL CMVCH( TRANS, N, N, ONE, A, NMAX, X, 1, ZERO, Y, 1, YT, G,
    282      $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )
    283       SAME = LCE( YY, YT, N )
    284       IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
    285          WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR
    286          STOP
    287       END IF
    288       TRANS = 'T'
    289       CALL CMVCH( TRANS, N, N, ONE, A, NMAX, X, -1, ZERO, Y, -1, YT, G,
    290      $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )
    291       SAME = LCE( YY, YT, N )
    292       IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
    293          WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR
    294          STOP
    295       END IF
    296 *
    297 *     Test each subroutine in turn.
    298 *
    299       DO 210 ISNUM = 1, NSUBS
    300          WRITE( NOUT, FMT = * )
    301          IF( .NOT.LTEST( ISNUM ) )THEN
    302 *           Subprogram is not to be tested.
    303             WRITE( NOUT, FMT = 9983 )SNAMES( ISNUM )
    304          ELSE
    305             SRNAMT = SNAMES( ISNUM )
    306 *           Test error exits.
    307             IF( TSTERR )THEN
    308                CALL CC2CHKE( SNAMES( ISNUM ) )
    309                WRITE( NOUT, FMT = * )
    310             END IF
    311 *           Test computations.
    312             INFOT = 0
    313             OK = .TRUE.
    314             FATAL = .FALSE.
    315             GO TO ( 140, 140, 150, 150, 150, 160, 160,
    316      $              160, 160, 160, 160, 170, 170, 180,
    317      $              180, 190, 190 )ISNUM
    318 *           Test CGEMV, 01, and CGBMV, 02.
    319   140       IF (CORDER) THEN
    320             CALL CCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    321      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,
    322      $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,
    323      $                  X, XX, XS, Y, YY, YS, YT, G, 0 )
    324             END IF
    325             IF (RORDER) THEN
    326             CALL CCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    327      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,
    328      $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,
    329      $                  X, XX, XS, Y, YY, YS, YT, G, 1 )
    330             END IF
    331             GO TO 200
    332 *           Test CHEMV, 03, CHBMV, 04, and CHPMV, 05.
    333   150      IF (CORDER) THEN
    334            CALL CCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    335      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,
    336      $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,
    337      $                  X, XX, XS, Y, YY, YS, YT, G, 0 )
    338            END IF
    339            IF (RORDER) THEN
    340            CALL CCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    341      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,
    342      $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,
    343      $                  X, XX, XS, Y, YY, YS, YT, G, 1 )
    344            END IF
    345             GO TO 200
    346 *           Test CTRMV, 06, CTBMV, 07, CTPMV, 08,
    347 *           CTRSV, 09, CTBSV, 10, and CTPSV, 11.
    348   160      IF (CORDER) THEN
    349            CALL CCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    350      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC,
    351      $                  NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z, 
    352      $			0 )
    353            END IF
    354            IF (RORDER) THEN
    355            CALL CCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    356      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC,
    357      $                  NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z, 
    358      $			1 )
    359            END IF
    360             GO TO 200
    361 *           Test CGERC, 12, CGERU, 13.
    362   170      IF (CORDER) THEN
    363            CALL CCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    364      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
    365      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
    366      $                  YT, G, Z, 0 )
    367            END IF
    368            IF (RORDER) THEN
    369            CALL CCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    370      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
    371      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
    372      $                  YT, G, Z, 1 )
    373            END IF
    374             GO TO 200
    375 *           Test CHER, 14, and CHPR, 15.
    376   180      IF (CORDER) THEN
    377            CALL CCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    378      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
    379      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
    380      $                  YT, G, Z, 0 )
    381            END IF
    382            IF (RORDER) THEN
    383            CALL CCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    384      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
    385      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
    386      $                  YT, G, Z, 1 )
    387            END IF
    388             GO TO 200
    389 *           Test CHER2, 16, and CHPR2, 17.
    390   190      IF (CORDER) THEN
    391            CALL CCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    392      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
    393      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
    394      $                  YT, G, Z, 0 )
    395            END IF
    396            IF (RORDER) THEN
    397            CALL CCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
    398      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
    399      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
    400      $                  YT, G, Z, 1 )
    401            END IF
    402 *
    403   200       IF( FATAL.AND.SFATAL )
    404      $         GO TO 220
    405          END IF
    406   210 CONTINUE
    407       WRITE( NOUT, FMT = 9982 )
    408       GO TO 240
    409 *
    410   220 CONTINUE
    411       WRITE( NOUT, FMT = 9981 )
    412       GO TO 240
    413 *
    414   230 CONTINUE
    415       WRITE( NOUT, FMT = 9987 )
    416 *
    417   240 CONTINUE
    418       IF( TRACE )
    419      $   CLOSE ( NTRA )
    420       CLOSE ( NOUT )
    421       STOP
    422 *
    423 10002 FORMAT( ' COLUMN-MAJOR AND ROW-MAJOR DATA LAYOUTS ARE TESTED' )
    424 10001 FORMAT( ' ROW-MAJOR DATA LAYOUT IS TESTED' )
    425 10000 FORMAT( ' COLUMN-MAJOR DATA LAYOUT IS TESTED' )
    426  9999 FORMAT(' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',
    427      $      'S THAN', F8.2 )
    428  9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, E9.1 )
    429  9997 FORMAT(' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',
    430      $      'THAN ', I2 )
    431  9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )
    432  9995 FORMAT( ' VALUE OF K IS LESS THAN 0' )
    433  9994 FORMAT( ' ABSOLUTE VALUE OF INCX OR INCY IS 0 OR GREATER THAN ',
    434      $      I2 )
    435  9993 FORMAT(' TESTS OF THE COMPLEX          LEVEL 2 BLAS', //' THE F',
    436      $      'OLLOWING PARAMETER VALUES WILL BE USED:' )
    437  9992 FORMAT( '   FOR N              ', 9I6 )
    438  9991 FORMAT( '   FOR K              ', 7I6 )
    439  9990 FORMAT( '   FOR INCX AND INCY  ', 7I6 )
    440  9989 FORMAT( '   FOR ALPHA          ',
    441      $      7('(', F4.1, ',', F4.1, ')  ', : ) )
    442  9988 FORMAT( '   FOR BETA           ',
    443      $      7('(', F4.1, ',', F4.1, ')  ', : ) )
    444  9987 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',
    445      $      /' ******* TESTS ABANDONED *******' )
    446  9986 FORMAT(' SUBPROGRAM NAME ',A12, ' NOT RECOGNIZED', /' ******* T',
    447      $      'ESTS ABANDONED *******' )
    448  9985 FORMAT(' ERROR IN CMVCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',
    449      $      'ATED WRONGLY.', /' CMVCH WAS CALLED WITH TRANS = ', A1,
    450      $      ' AND RETURNED SAME = ', L1, ' AND ERR = ', F12.3, '.', /
    451      $  ' THIS MAY BE DUE TO FAULTS IN THE ARITHMETIC OR THE COMPILER.'
    452      $      , /' ******* TESTS ABANDONED *******' )
    453  9984 FORMAT(A12, L2 )
    454  9983 FORMAT( 1X,A12, ' WAS NOT TESTED' )
    455  9982 FORMAT( /' END OF TESTS' )
    456  9981 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )
    457  9980 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )
    458 *
    459 *     End of CBLAT2.
    460 *
    461       END
    462       SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
    463      $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,
    464      $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,
    465      $                  XS, Y, YY, YS, YT, G, IORDER )
    466 *
    467 *  Tests CGEMV and CGBMV.
    468 *
    469 *  Auxiliary routine for test program for Level 2 Blas.
    470 *
    471 *  -- Written on 10-August-1987.
    472 *     Richard Hanson, Sandia National Labs.
    473 *     Jeremy Du Croz, NAG Central Office.
    474 *
    475 *     .. Parameters ..
    476       COMPLEX            ZERO, HALF
    477       PARAMETER          ( ZERO = ( 0.0, 0.0 ), HALF = ( 0.5, 0.0 ) )
    478       REAL               RZERO
    479       PARAMETER          ( RZERO = 0.0 )
    480 *     .. Scalar Arguments ..
    481       REAL               EPS, THRESH
    482       INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,
    483      $                   NOUT, NTRA, IORDER
    484       LOGICAL            FATAL, REWI, TRACE
    485       CHARACTER*12       SNAME
    486 *     .. Array Arguments ..
    487       COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
    488      $                   AS( NMAX*NMAX ), BET( NBET ), X( NMAX ),
    489      $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),
    490      $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),
    491      $                   YY( NMAX*INCMAX )
    492       REAL               G( NMAX )
    493       INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )
    494 *     .. Local Scalars ..
    495       COMPLEX            ALPHA, ALS, BETA, BLS, TRANSL
    496       REAL               ERR, ERRMAX
    497       INTEGER            I, IA, IB, IC, IKU, IM, IN, INCX, INCXS, INCY,
    498      $                   INCYS, IX, IY, KL, KLS, KU, KUS, LAA, LDA,
    499      $                   LDAS, LX, LY, M, ML, MS, N, NARGS, NC, ND, NK,
    500      $                   NL, NS
    501       LOGICAL            BANDED, FULL, NULL, RESET, SAME, TRAN
    502       CHARACTER*1        TRANS, TRANSS
    503       CHARACTER*14       CTRANS
    504       CHARACTER*3        ICH
    505 *     .. Local Arrays ..
    506       LOGICAL            ISAME( 13 )
    507 *     .. External Functions ..
    508       LOGICAL            LCE, LCERES
    509       EXTERNAL           LCE, LCERES
    510 *     .. External Subroutines ..
    511       EXTERNAL           CCGBMV, CCGEMV, CMAKE, CMVCH
    512 *     .. Intrinsic Functions ..
    513       INTRINSIC          ABS, MAX, MIN
    514 *     .. Scalars in Common ..
    515       INTEGER            INFOT, NOUTC
    516       LOGICAL            OK
    517 *     .. Common blocks ..
    518       COMMON             /INFOC/INFOT, NOUTC, OK
    519 *     .. Data statements ..
    520       DATA               ICH/'NTC'/
    521 *     .. Executable Statements ..
    522       FULL = SNAME( 9: 9 ).EQ.'e'
    523       BANDED = SNAME( 9: 9 ).EQ.'b'
    524 *     Define the number of arguments.
    525       IF( FULL )THEN
    526          NARGS = 11
    527       ELSE IF( BANDED )THEN
    528          NARGS = 13
    529       END IF
    530 *
    531       NC = 0
    532       RESET = .TRUE.
    533       ERRMAX = RZERO
    534 *
    535       DO 120 IN = 1, NIDIM
    536          N = IDIM( IN )
    537          ND = N/2 + 1
    538 *
    539          DO 110 IM = 1, 2
    540             IF( IM.EQ.1 )
    541      $         M = MAX( N - ND, 0 )
    542             IF( IM.EQ.2 )
    543      $         M = MIN( N + ND, NMAX )
    544 *
    545             IF( BANDED )THEN
    546                NK = NKB
    547             ELSE
    548                NK = 1
    549             END IF
    550             DO 100 IKU = 1, NK
    551                IF( BANDED )THEN
    552                   KU = KB( IKU )
    553                   KL = MAX( KU - 1, 0 )
    554                ELSE
    555                   KU = N - 1
    556                   KL = M - 1
    557                END IF
    558 *              Set LDA to 1 more than minimum value if room.
    559                IF( BANDED )THEN
    560                   LDA = KL + KU + 1
    561                ELSE
    562                   LDA = M
    563                END IF
    564                IF( LDA.LT.NMAX )
    565      $            LDA = LDA + 1
    566 *              Skip tests if not enough room.
    567                IF( LDA.GT.NMAX )
    568      $            GO TO 100
    569                LAA = LDA*N
    570                NULL = N.LE.0.OR.M.LE.0
    571 *
    572 *              Generate the matrix A.
    573 *
    574                TRANSL = ZERO
    575                CALL CMAKE( SNAME( 8: 9 ), ' ', ' ', M, N, A, NMAX, AA,
    576      $                     LDA, KL, KU, RESET, TRANSL )
    577 *
    578                DO 90 IC = 1, 3
    579                   TRANS = ICH( IC: IC )
    580                   IF (TRANS.EQ.'N')THEN
    581                      CTRANS = '  CblasNoTrans'
    582                   ELSE IF (TRANS.EQ.'T')THEN
    583                      CTRANS = '    CblasTrans'
    584                   ELSE 
    585                      CTRANS = 'CblasConjTrans'
    586                   END IF
    587                   TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'
    588 *
    589                   IF( TRAN )THEN
    590                      ML = N
    591                      NL = M
    592                   ELSE
    593                      ML = M
    594                      NL = N
    595                   END IF
    596 *
    597                   DO 80 IX = 1, NINC
    598                      INCX = INC( IX )
    599                      LX = ABS( INCX )*NL
    600 *
    601 *                    Generate the vector X.
    602 *
    603                      TRANSL = HALF
    604                      CALL CMAKE( 'ge', ' ', ' ', 1, NL, X, 1, XX,
    605      $                          ABS( INCX ), 0, NL - 1, RESET, TRANSL )
    606                      IF( NL.GT.1 )THEN
    607                         X( NL/2 ) = ZERO
    608                         XX( 1 + ABS( INCX )*( NL/2 - 1 ) ) = ZERO
    609                      END IF
    610 *
    611                      DO 70 IY = 1, NINC
    612                         INCY = INC( IY )
    613                         LY = ABS( INCY )*ML
    614 *
    615                         DO 60 IA = 1, NALF
    616                            ALPHA = ALF( IA )
    617 *
    618                            DO 50 IB = 1, NBET
    619                               BETA = BET( IB )
    620 *
    621 *                             Generate the vector Y.
    622 *
    623                               TRANSL = ZERO
    624                               CALL CMAKE( 'ge', ' ', ' ', 1, ML, Y, 1,
    625      $                                    YY, ABS( INCY ), 0, ML - 1,
    626      $                                    RESET, TRANSL )
    627 *
    628                               NC = NC + 1
    629 *
    630 *                             Save every datum before calling the
    631 *                             subroutine.
    632 *
    633                               TRANSS = TRANS
    634                               MS = M
    635                               NS = N
    636                               KLS = KL
    637                               KUS = KU
    638                               ALS = ALPHA
    639                               DO 10 I = 1, LAA
    640                                  AS( I ) = AA( I )
    641    10                         CONTINUE
    642                               LDAS = LDA
    643                               DO 20 I = 1, LX
    644                                  XS( I ) = XX( I )
    645    20                         CONTINUE
    646                               INCXS = INCX
    647                               BLS = BETA
    648                               DO 30 I = 1, LY
    649                                  YS( I ) = YY( I )
    650    30                         CONTINUE
    651                               INCYS = INCY
    652 *
    653 *                             Call the subroutine.
    654 *
    655                               IF( FULL )THEN
    656                                  IF( TRACE )
    657      $                              WRITE( NTRA, FMT = 9994 )NC, SNAME,
    658      $                             CTRANS, M, N, ALPHA, LDA, INCX, BETA,
    659      $                              INCY
    660                                  IF( REWI )
    661      $                              REWIND NTRA
    662                                  CALL CCGEMV( IORDER, TRANS, M, N,
    663      $                                      ALPHA, AA, LDA, XX, INCX,
    664      $                                      BETA, YY, INCY )
    665                               ELSE IF( BANDED )THEN
    666                                  IF( TRACE )
    667      $                              WRITE( NTRA, FMT = 9995 )NC, SNAME,
    668      $                              CTRANS, M, N, KL, KU, ALPHA, LDA,
    669      $                              INCX, BETA, INCY
    670                                  IF( REWI )
    671      $                              REWIND NTRA
    672                                  CALL CCGBMV( IORDER, TRANS, M, N, KL,
    673      $                                       KU, ALPHA, AA, LDA, XX,
    674      $                                       INCX, BETA, YY, INCY )
    675                               END IF
    676 *
    677 *                            Check if error-exit was taken incorrectly.
    678 *
    679                               IF( .NOT.OK )THEN
    680                                  WRITE( NOUT, FMT = 9993 )
    681                                  FATAL = .TRUE.
    682                                  GO TO 130
    683                               END IF
    684 *
    685 *                             See what data changed inside subroutines.
    686 *
    687 *        IF(TRANS .NE. 'C' .OR. (INCX .GT. 0 .AND. INCY .GT. 0)) THEN 
    688                               ISAME( 1 ) = TRANS.EQ.TRANSS
    689                               ISAME( 2 ) = MS.EQ.M
    690                               ISAME( 3 ) = NS.EQ.N
    691                               IF( FULL )THEN
    692                                  ISAME( 4 ) = ALS.EQ.ALPHA
    693                                  ISAME( 5 ) = LCE( AS, AA, LAA )
    694                                  ISAME( 6 ) = LDAS.EQ.LDA
    695                                  ISAME( 7 ) = LCE( XS, XX, LX )
    696                                  ISAME( 8 ) = INCXS.EQ.INCX
    697                                  ISAME( 9 ) = BLS.EQ.BETA
    698                                  IF( NULL )THEN
    699                                     ISAME( 10 ) = LCE( YS, YY, LY )
    700                                  ELSE
    701                                     ISAME( 10 ) = LCERES( 'ge', ' ', 1,
    702      $                                            ML, YS, YY,
    703      $                                            ABS( INCY ) )
    704                                  END IF
    705                                  ISAME( 11 ) = INCYS.EQ.INCY
    706                               ELSE IF( BANDED )THEN
    707                                  ISAME( 4 ) = KLS.EQ.KL
    708                                  ISAME( 5 ) = KUS.EQ.KU
    709                                  ISAME( 6 ) = ALS.EQ.ALPHA
    710                                  ISAME( 7 ) = LCE( AS, AA, LAA )
    711                                  ISAME( 8 ) = LDAS.EQ.LDA
    712                                  ISAME( 9 ) = LCE( XS, XX, LX )
    713                                  ISAME( 10 ) = INCXS.EQ.INCX
    714                                  ISAME( 11 ) = BLS.EQ.BETA
    715                                  IF( NULL )THEN
    716                                     ISAME( 12 ) = LCE( YS, YY, LY )
    717                                  ELSE
    718                                     ISAME( 12 ) = LCERES( 'ge', ' ', 1,
    719      $                                            ML, YS, YY,
    720      $                                            ABS( INCY ) )
    721                                  END IF
    722                                  ISAME( 13 ) = INCYS.EQ.INCY
    723                               END IF
    724 *
    725 *                             If data was incorrectly changed, report
    726 *                             and return.
    727 *
    728                               SAME = .TRUE.
    729                               DO 40 I = 1, NARGS
    730                                  SAME = SAME.AND.ISAME( I )
    731                                  IF( .NOT.ISAME( I ) )
    732      $                              WRITE( NOUT, FMT = 9998 )I
    733    40                         CONTINUE
    734                               IF( .NOT.SAME )THEN
    735                                  FATAL = .TRUE.
    736                                  GO TO 130
    737                               END IF
    738 *
    739                               IF( .NOT.NULL )THEN
    740 *
    741 *                                Check the result.
    742 *
    743                                  CALL CMVCH( TRANS, M, N, ALPHA, A,
    744      $                                       NMAX, X, INCX, BETA, Y,
    745      $                                       INCY, YT, G, YY, EPS, ERR,
    746      $                                       FATAL, NOUT, .TRUE. )
    747                                  ERRMAX = MAX( ERRMAX, ERR )
    748 *                                If got really bad answer, report and
    749 *                                return.
    750                                  IF( FATAL )
    751      $                              GO TO 130
    752                               ELSE
    753 *                                Avoid repeating tests with M.le.0 or
    754 *                                N.le.0.
    755                                  GO TO 110
    756                               END IF
    757 *                          END IF
    758 *
    759    50                      CONTINUE
    760 *
    761    60                   CONTINUE
    762 *
    763    70                CONTINUE
    764 *
    765    80             CONTINUE
    766 *
    767    90          CONTINUE
    768 *
    769   100       CONTINUE
    770 *
    771   110    CONTINUE
    772 *
    773   120 CONTINUE
    774 *
    775 *     Report result.
    776 *
    777       IF( ERRMAX.LT.THRESH )THEN
    778          WRITE( NOUT, FMT = 9999 )SNAME, NC
    779       ELSE
    780          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
    781       END IF
    782       GO TO 140
    783 *
    784   130 CONTINUE
    785       WRITE( NOUT, FMT = 9996 )SNAME
    786       IF( FULL )THEN
    787          WRITE( NOUT, FMT = 9994 )NC, SNAME, CTRANS, M, N, ALPHA, LDA,
    788      $      INCX, BETA, INCY
    789       ELSE IF( BANDED )THEN
    790          WRITE( NOUT, FMT = 9995 )NC, SNAME, CTRANS, M, N, KL, KU,
    791      $      ALPHA, LDA, INCX, BETA, INCY
    792       END IF
    793 *
    794   140 CONTINUE
    795       RETURN
    796 *
    797  9999 FORMAT(' ',A12, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
    798      $      'S)' )
    799  9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
    800      $      'ANGED INCORRECTLY *******' )
    801  9997 FORMAT(' ',A12, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
    802      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
    803      $      ' - SUSPECT *******' )
    804  9996 FORMAT( ' ******* ',A12, ' FAILED ON CALL NUMBER:' )
    805  9995 FORMAT( 1X, I6, ': ',A12, '(', A14, ',', 4( I3, ',' ), '(',
    806      $      F4.1, ',', F4.1, '), A,',/ 10x, I3, ', X,', I2, ',(',
    807      $      F4.1, ',', F4.1, '), Y,', I2, ') .' )
    808  9994 FORMAT( 1X, I6, ': ',A12, '(', A14, ',', 2( I3, ',' ), '(',
    809      $      F4.1, ',', F4.1, '), A,',/ 10x, I3, ', X,', I2, ',(',
    810      $       F4.1, ',', F4.1, '), Y,', I2, ') .' )
    811  9993 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
    812      $      '******' )
    813 *
    814 *     End of CCHK1.
    815 *
    816       END
    817       SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
    818      $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,
    819      $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,
    820      $                  XS, Y, YY, YS, YT, G, IORDER )
    821 *
    822 *  Tests CHEMV, CHBMV and CHPMV.
    823 *
    824 *  Auxiliary routine for test program for Level 2 Blas.
    825 *
    826 *  -- Written on 10-August-1987.
    827 *     Richard Hanson, Sandia National Labs.
    828 *     Jeremy Du Croz, NAG Central Office.
    829 *
    830 *     .. Parameters ..
    831       COMPLEX            ZERO, HALF
    832       PARAMETER          ( ZERO = ( 0.0, 0.0 ), HALF = ( 0.5, 0.0 ) )
    833       REAL               RZERO
    834       PARAMETER          ( RZERO = 0.0 )
    835 *     .. Scalar Arguments ..
    836       REAL               EPS, THRESH
    837       INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,
    838      $                   NOUT, NTRA, IORDER
    839       LOGICAL            FATAL, REWI, TRACE
    840       CHARACTER*12       SNAME
    841 *     .. Array Arguments ..
    842       COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
    843      $                   AS( NMAX*NMAX ), BET( NBET ), X( NMAX ),
    844      $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),
    845      $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),
    846      $                   YY( NMAX*INCMAX )
    847       REAL               G( NMAX )
    848       INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )
    849 *     .. Local Scalars ..
    850       COMPLEX            ALPHA, ALS, BETA, BLS, TRANSL
    851       REAL               ERR, ERRMAX
    852       INTEGER            I, IA, IB, IC, IK, IN, INCX, INCXS, INCY,
    853      $                   INCYS, IX, IY, K, KS, LAA, LDA, LDAS, LX, LY,
    854      $                   N, NARGS, NC, NK, NS
    855       LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME
    856       CHARACTER*1        UPLO, UPLOS
    857       CHARACTER*14       CUPLO
    858       CHARACTER*2        ICH
    859 *     .. Local Arrays ..
    860       LOGICAL            ISAME( 13 )
    861 *     .. External Functions ..
    862       LOGICAL            LCE, LCERES
    863       EXTERNAL           LCE, LCERES
    864 *     .. External Subroutines ..
    865       EXTERNAL           CCHBMV, CCHEMV, CCHPMV, CMAKE, CMVCH
    866 *     .. Intrinsic Functions ..
    867       INTRINSIC          ABS, MAX
    868 *     .. Scalars in Common ..
    869       INTEGER            INFOT, NOUTC
    870       LOGICAL             OK
    871 *     .. Common blocks ..
    872       COMMON             /INFOC/INFOT, NOUTC, OK
    873 *     .. Data statements ..
    874       DATA               ICH/'UL'/
    875 *     .. Executable Statements ..
    876       FULL = SNAME( 9: 9 ).EQ.'e'
    877       BANDED = SNAME( 9: 9 ).EQ.'b'
    878       PACKED = SNAME( 9: 9 ).EQ.'p'
    879 *     Define the number of arguments.
    880       IF( FULL )THEN
    881          NARGS = 10
    882       ELSE IF( BANDED )THEN
    883          NARGS = 11
    884       ELSE IF( PACKED )THEN
    885          NARGS = 9
    886       END IF
    887 *
    888       NC = 0
    889       RESET = .TRUE.
    890       ERRMAX = RZERO
    891 *
    892       DO 110 IN = 1, NIDIM
    893          N = IDIM( IN )
    894 *
    895          IF( BANDED )THEN
    896             NK = NKB
    897          ELSE
    898             NK = 1
    899          END IF
    900          DO 100 IK = 1, NK
    901             IF( BANDED )THEN
    902                K = KB( IK )
    903             ELSE
    904                K = N - 1
    905             END IF
    906 *           Set LDA to 1 more than minimum value if room.
    907             IF( BANDED )THEN
    908                LDA = K + 1
    909             ELSE
    910                LDA = N
    911             END IF
    912             IF( LDA.LT.NMAX )
    913      $         LDA = LDA + 1
    914 *           Skip tests if not enough room.
    915             IF( LDA.GT.NMAX )
    916      $         GO TO 100
    917             IF( PACKED )THEN
    918                LAA = ( N*( N + 1 ) )/2
    919             ELSE
    920                LAA = LDA*N
    921             END IF
    922             NULL = N.LE.0
    923 *
    924             DO 90 IC = 1, 2
    925                UPLO = ICH( IC: IC )
    926                IF (UPLO.EQ.'U')THEN
    927                   CUPLO = '    CblasUpper'
    928                ELSE 
    929                   CUPLO = '    CblasLower'
    930                END IF
    931 *
    932 *              Generate the matrix A.
    933 *
    934                TRANSL = ZERO
    935                CALL CMAKE( SNAME( 8: 9 ), UPLO, ' ', N, N, A, NMAX, AA,
    936      $                     LDA, K, K, RESET, TRANSL )
    937 *
    938                DO 80 IX = 1, NINC
    939                   INCX = INC( IX )
    940                   LX = ABS( INCX )*N
    941 *
    942 *                 Generate the vector X.
    943 *
    944                   TRANSL = HALF
    945                   CALL CMAKE( 'ge', ' ', ' ', 1, N, X, 1, XX,
    946      $                        ABS( INCX ), 0, N - 1, RESET, TRANSL )
    947                   IF( N.GT.1 )THEN
    948                      X( N/2 ) = ZERO
    949                      XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
    950                   END IF
    951 *
    952                   DO 70 IY = 1, NINC
    953                      INCY = INC( IY )
    954                      LY = ABS( INCY )*N
    955 *
    956                      DO 60 IA = 1, NALF
    957                         ALPHA = ALF( IA )
    958 *
    959                         DO 50 IB = 1, NBET
    960                            BETA = BET( IB )
    961 *
    962 *                          Generate the vector Y.
    963 *
    964                            TRANSL = ZERO
    965                            CALL CMAKE( 'ge', ' ', ' ', 1, N, Y, 1, YY,
    966      $                                 ABS( INCY ), 0, N - 1, RESET,
    967      $                                 TRANSL )
    968 *
    969                            NC = NC + 1
    970 *
    971 *                          Save every datum before calling the
    972 *                          subroutine.
    973 *
    974                            UPLOS = UPLO
    975                            NS = N
    976                            KS = K
    977                            ALS = ALPHA
    978                            DO 10 I = 1, LAA
    979                               AS( I ) = AA( I )
    980    10                      CONTINUE
    981                            LDAS = LDA
    982                            DO 20 I = 1, LX
    983                               XS( I ) = XX( I )
    984    20                      CONTINUE
    985                            INCXS = INCX
    986                            BLS = BETA
    987                            DO 30 I = 1, LY
    988                               YS( I ) = YY( I )
    989    30                      CONTINUE
    990                            INCYS = INCY
    991 *
    992 *                          Call the subroutine.
    993 *
    994                            IF( FULL )THEN
    995                               IF( TRACE )
    996      $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,
    997      $                           CUPLO, N, ALPHA, LDA, INCX, BETA, INCY
    998                               IF( REWI )
    999      $                           REWIND NTRA
   1000                               CALL CCHEMV( IORDER, UPLO, N, ALPHA, AA,
   1001      $                                    LDA, XX, INCX, BETA, YY,
   1002      $                                    INCY )
   1003                            ELSE IF( BANDED )THEN
   1004                               IF( TRACE )
   1005      $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,
   1006      $                           CUPLO, N, K, ALPHA, LDA, INCX, BETA,
   1007      $                           INCY
   1008                               IF( REWI )
   1009      $                           REWIND NTRA
   1010                               CALL CCHBMV( IORDER, UPLO, N, K, ALPHA,
   1011      $                                    AA, LDA, XX, INCX, BETA,
   1012      $                                    YY, INCY )
   1013                            ELSE IF( PACKED )THEN
   1014                               IF( TRACE )
   1015      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
   1016      $                           CUPLO, N, ALPHA, INCX, BETA, INCY
   1017                               IF( REWI )
   1018      $                           REWIND NTRA
   1019                               CALL CCHPMV( IORDER, UPLO, N, ALPHA, AA,
   1020      $                                    XX, INCX, BETA, YY, INCY )
   1021                            END IF
   1022 *
   1023 *                          Check if error-exit was taken incorrectly.
   1024 *
   1025                            IF( .NOT.OK )THEN
   1026                               WRITE( NOUT, FMT = 9992 )
   1027                               FATAL = .TRUE.
   1028                               GO TO 120
   1029                            END IF
   1030 *
   1031 *                          See what data changed inside subroutines.
   1032 *
   1033                            ISAME( 1 ) = UPLO.EQ.UPLOS
   1034                            ISAME( 2 ) = NS.EQ.N
   1035                            IF( FULL )THEN
   1036                               ISAME( 3 ) = ALS.EQ.ALPHA
   1037                               ISAME( 4 ) = LCE( AS, AA, LAA )
   1038                               ISAME( 5 ) = LDAS.EQ.LDA
   1039                               ISAME( 6 ) = LCE( XS, XX, LX )
   1040                               ISAME( 7 ) = INCXS.EQ.INCX
   1041                               ISAME( 8 ) = BLS.EQ.BETA
   1042                               IF( NULL )THEN
   1043                                  ISAME( 9 ) = LCE( YS, YY, LY )
   1044                               ELSE
   1045                                  ISAME( 9 ) = LCERES( 'ge', ' ', 1, N,
   1046      $                                        YS, YY, ABS( INCY ) )
   1047                               END IF
   1048                               ISAME( 10 ) = INCYS.EQ.INCY
   1049                            ELSE IF( BANDED )THEN
   1050                               ISAME( 3 ) = KS.EQ.K
   1051                               ISAME( 4 ) = ALS.EQ.ALPHA
   1052                               ISAME( 5 ) = LCE( AS, AA, LAA )
   1053                               ISAME( 6 ) = LDAS.EQ.LDA
   1054                               ISAME( 7 ) = LCE( XS, XX, LX )
   1055                               ISAME( 8 ) = INCXS.EQ.INCX
   1056                               ISAME( 9 ) = BLS.EQ.BETA
   1057                               IF( NULL )THEN
   1058                                  ISAME( 10 ) = LCE( YS, YY, LY )
   1059                               ELSE
   1060                                  ISAME( 10 ) = LCERES( 'ge', ' ', 1, N,
   1061      $                                         YS, YY, ABS( INCY ) )
   1062                               END IF
   1063                               ISAME( 11 ) = INCYS.EQ.INCY
   1064                            ELSE IF( PACKED )THEN
   1065                               ISAME( 3 ) = ALS.EQ.ALPHA
   1066                               ISAME( 4 ) = LCE( AS, AA, LAA )
   1067                               ISAME( 5 ) = LCE( XS, XX, LX )
   1068                               ISAME( 6 ) = INCXS.EQ.INCX
   1069                               ISAME( 7 ) = BLS.EQ.BETA
   1070                               IF( NULL )THEN
   1071                                  ISAME( 8 ) = LCE( YS, YY, LY )
   1072                               ELSE
   1073                                  ISAME( 8 ) = LCERES( 'ge', ' ', 1, N,
   1074      $                                        YS, YY, ABS( INCY ) )
   1075                               END IF
   1076                               ISAME( 9 ) = INCYS.EQ.INCY
   1077                            END IF
   1078 *
   1079 *                          If data was incorrectly changed, report and
   1080 *                          return.
   1081 *
   1082                            SAME = .TRUE.
   1083                            DO 40 I = 1, NARGS
   1084                               SAME = SAME.AND.ISAME( I )
   1085                               IF( .NOT.ISAME( I ) )
   1086      $                           WRITE( NOUT, FMT = 9998 )I
   1087    40                      CONTINUE
   1088                            IF( .NOT.SAME )THEN
   1089                               FATAL = .TRUE.
   1090                               GO TO 120
   1091                            END IF
   1092 *
   1093                            IF( .NOT.NULL )THEN
   1094 *
   1095 *                             Check the result.
   1096 *
   1097                               CALL CMVCH( 'N', N, N, ALPHA, A, NMAX, X,
   1098      $                                    INCX, BETA, Y, INCY, YT, G,
   1099      $                                    YY, EPS, ERR, FATAL, NOUT,
   1100      $                                    .TRUE. )
   1101                               ERRMAX = MAX( ERRMAX, ERR )
   1102 *                             If got really bad answer, report and
   1103 *                             return.
   1104                               IF( FATAL )
   1105      $                           GO TO 120
   1106                            ELSE
   1107 *                             Avoid repeating tests with N.le.0
   1108                               GO TO 110
   1109                            END IF
   1110 *
   1111    50                   CONTINUE
   1112 *
   1113    60                CONTINUE
   1114 *
   1115    70             CONTINUE
   1116 *
   1117    80          CONTINUE
   1118 *
   1119    90       CONTINUE
   1120 *
   1121   100    CONTINUE
   1122 *
   1123   110 CONTINUE
   1124 *
   1125 *     Report result.
   1126 *
   1127       IF( ERRMAX.LT.THRESH )THEN
   1128          WRITE( NOUT, FMT = 9999 )SNAME, NC
   1129       ELSE
   1130          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
   1131       END IF
   1132       GO TO 130
   1133 *
   1134   120 CONTINUE
   1135       WRITE( NOUT, FMT = 9996 )SNAME
   1136       IF( FULL )THEN
   1137          WRITE( NOUT, FMT = 9993 )NC, SNAME, CUPLO, N, ALPHA, LDA, INCX,
   1138      $      BETA, INCY
   1139       ELSE IF( BANDED )THEN
   1140          WRITE( NOUT, FMT = 9994 )NC, SNAME, CUPLO, N, K, ALPHA, LDA,
   1141      $      INCX, BETA, INCY
   1142       ELSE IF( PACKED )THEN
   1143          WRITE( NOUT, FMT = 9995 )NC, SNAME, CUPLO, N, ALPHA, INCX,
   1144      $      BETA, INCY
   1145       END IF
   1146 *
   1147   130 CONTINUE
   1148       RETURN
   1149 *
   1150  9999 FORMAT(' ',A12, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
   1151      $      'S)' )
   1152  9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
   1153      $      'ANGED INCORRECTLY *******' )
   1154  9997 FORMAT(' ',A12, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
   1155      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
   1156      $      ' - SUSPECT *******' )
   1157  9996 FORMAT( ' ******* ',A12, ' FAILED ON CALL NUMBER:' )
   1158  9995 FORMAT( 1X, I6, ': ',A12, '(', A14, ',', I3, ',(', F4.1, ',',
   1159      $      F4.1, '), AP, X,',/ 10x, I2, ',(', F4.1, ',', F4.1,
   1160      $      '), Y,', I2, ') .' )
   1161  9994 FORMAT( 1X, I6, ': ',A12, '(', A14, ',', 2( I3, ',' ), '(',
   1162      $      F4.1, ',', F4.1, '), A,', I3, ', X,',/ 10x, I2, ',(',
   1163      $      F4.1, ',', F4.1, '), Y,', I2, ') .' )
   1164  9993 FORMAT( 1X, I6, ': ',A12, '(', A14, ',', I3, ',(', F4.1, ',',
   1165      $     F4.1, '), A,', I3, ', X,',/ 10x, I2, ',(', F4.1, ',',
   1166      $     F4.1, '), ', 'Y,', I2, ') .' )
   1167  9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
   1168      $      '******' )
   1169 *
   1170 *     End of CCHK2.
   1171 *
   1172       END
   1173       SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
   1174      $                  FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX,
   1175      $                 INCMAX, A, AA, AS, X, XX, XS, XT, G, Z, IORDER )
   1176 *
   1177 *  Tests CTRMV, CTBMV, CTPMV, CTRSV, CTBSV and CTPSV.
   1178 *
   1179 *  Auxiliary routine for test program for Level 2 Blas.
   1180 *
   1181 *  -- Written on 10-August-1987.
   1182 *     Richard Hanson, Sandia National Labs.
   1183 *     Jeremy Du Croz, NAG Central Office.
   1184 *
   1185 *     .. Parameters ..
   1186       COMPLEX            ZERO, HALF, ONE
   1187       PARAMETER          ( ZERO = ( 0.0, 0.0 ), HALF = ( 0.5, 0.0 ),
   1188      $                   ONE = ( 1.0, 0.0 ) )
   1189       REAL               RZERO
   1190       PARAMETER          ( RZERO = 0.0 )
   1191 *     .. Scalar Arguments ..
   1192       REAL               EPS, THRESH
   1193       INTEGER            INCMAX, NIDIM, NINC, NKB, NMAX, NOUT, NTRA,
   1194      $                   IORDER
   1195       LOGICAL            FATAL, REWI, TRACE
   1196       CHARACTER*12       SNAME
   1197 *     .. Array Arguments ..
   1198       COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ),
   1199      $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
   1200      $                   XT( NMAX ), XX( NMAX*INCMAX ), Z( NMAX )
   1201       REAL               G( NMAX )
   1202       INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )
   1203 *     .. Local Scalars ..
   1204       COMPLEX            TRANSL
   1205       REAL               ERR, ERRMAX
   1206       INTEGER            I, ICD, ICT, ICU, IK, IN, INCX, INCXS, IX, K,
   1207      $                   KS, LAA, LDA, LDAS, LX, N, NARGS, NC, NK, NS
   1208       LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME
   1209       CHARACTER*1        DIAG, DIAGS, TRANS, TRANSS, UPLO, UPLOS
   1210       CHARACTER*14       CUPLO,CTRANS,CDIAG
   1211       CHARACTER*2        ICHD, ICHU
   1212       CHARACTER*3        ICHT
   1213 *     .. Local Arrays ..
   1214       LOGICAL            ISAME( 13 )
   1215 *     .. External Functions ..
   1216       LOGICAL            LCE, LCERES
   1217       EXTERNAL           LCE, LCERES
   1218 *     .. External Subroutines ..
   1219       EXTERNAL           CMAKE, CMVCH, CCTBMV, CCTBSV, CCTPMV,
   1220      $                   CCTPSV, CCTRMV, CCTRSV
   1221 *     .. Intrinsic Functions ..
   1222       INTRINSIC          ABS, MAX
   1223 *     .. Scalars in Common ..
   1224       INTEGER            INFOT, NOUTC
   1225       LOGICAL             OK
   1226 *     .. Common blocks ..
   1227       COMMON             /INFOC/INFOT, NOUTC, OK
   1228 *     .. Data statements ..
   1229       DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/
   1230 *     .. Executable Statements ..
   1231       FULL = SNAME( 9: 9 ).EQ.'r'
   1232       BANDED = SNAME( 9: 9 ).EQ.'b'
   1233       PACKED = SNAME( 9: 9 ).EQ.'p'
   1234 *     Define the number of arguments.
   1235       IF( FULL )THEN
   1236          NARGS = 8
   1237       ELSE IF( BANDED )THEN
   1238          NARGS = 9
   1239       ELSE IF( PACKED )THEN
   1240          NARGS = 7
   1241       END IF
   1242 *
   1243       NC = 0
   1244       RESET = .TRUE.
   1245       ERRMAX = RZERO
   1246 *     Set up zero vector for CMVCH.
   1247       DO 10 I = 1, NMAX
   1248          Z( I ) = ZERO
   1249    10 CONTINUE
   1250 *
   1251       DO 110 IN = 1, NIDIM
   1252          N = IDIM( IN )
   1253 *
   1254          IF( BANDED )THEN
   1255             NK = NKB
   1256          ELSE
   1257             NK = 1
   1258          END IF
   1259          DO 100 IK = 1, NK
   1260             IF( BANDED )THEN
   1261                K = KB( IK )
   1262             ELSE
   1263                K = N - 1
   1264             END IF
   1265 *           Set LDA to 1 more than minimum value if room.
   1266             IF( BANDED )THEN
   1267                LDA = K + 1
   1268             ELSE
   1269                LDA = N
   1270             END IF
   1271             IF( LDA.LT.NMAX )
   1272      $         LDA = LDA + 1
   1273 *           Skip tests if not enough room.
   1274             IF( LDA.GT.NMAX )
   1275      $         GO TO 100
   1276             IF( PACKED )THEN
   1277                LAA = ( N*( N + 1 ) )/2
   1278             ELSE
   1279                LAA = LDA*N
   1280             END IF
   1281             NULL = N.LE.0
   1282 *
   1283             DO 90 ICU = 1, 2
   1284                UPLO = ICHU( ICU: ICU )
   1285                IF (UPLO.EQ.'U')THEN
   1286                   CUPLO = '    CblasUpper'
   1287                ELSE 
   1288                   CUPLO = '    CblasLower'
   1289                END IF
   1290 *
   1291                DO 80 ICT = 1, 3
   1292                   TRANS = ICHT( ICT: ICT )
   1293                   IF (TRANS.EQ.'N')THEN
   1294                      CTRANS = '  CblasNoTrans'
   1295                   ELSE IF (TRANS.EQ.'T')THEN
   1296                      CTRANS = '    CblasTrans'
   1297                   ELSE 
   1298                      CTRANS = 'CblasConjTrans'
   1299                   END IF
   1300 *
   1301                   DO 70 ICD = 1, 2
   1302                      DIAG = ICHD( ICD: ICD )
   1303                      IF (DIAG.EQ.'N')THEN
   1304                         CDIAG = '  CblasNonUnit'
   1305                      ELSE
   1306                         CDIAG = '     CblasUnit'
   1307                      END IF
   1308 *
   1309 *                    Generate the matrix A.
   1310 *
   1311                      TRANSL = ZERO
   1312                      CALL CMAKE( SNAME( 8: 9 ), UPLO, DIAG, N, N, A,
   1313      $                           NMAX, AA, LDA, K, K, RESET, TRANSL )
   1314 *
   1315                      DO 60 IX = 1, NINC
   1316                         INCX = INC( IX )
   1317                         LX = ABS( INCX )*N
   1318 *
   1319 *                       Generate the vector X.
   1320 *
   1321                         TRANSL = HALF
   1322                         CALL CMAKE( 'ge', ' ', ' ', 1, N, X, 1, XX,
   1323      $                              ABS( INCX ), 0, N - 1, RESET,
   1324      $                              TRANSL )
   1325                         IF( N.GT.1 )THEN
   1326                            X( N/2 ) = ZERO
   1327                            XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
   1328                         END IF
   1329 *
   1330                         NC = NC + 1
   1331 *
   1332 *                       Save every datum before calling the subroutine.
   1333 *
   1334                         UPLOS = UPLO
   1335                         TRANSS = TRANS
   1336                         DIAGS = DIAG
   1337                         NS = N
   1338                         KS = K
   1339                         DO 20 I = 1, LAA
   1340                            AS( I ) = AA( I )
   1341    20                   CONTINUE
   1342                         LDAS = LDA
   1343                         DO 30 I = 1, LX
   1344                            XS( I ) = XX( I )
   1345    30                   CONTINUE
   1346                         INCXS = INCX
   1347 *
   1348 *                       Call the subroutine.
   1349 *
   1350                         IF( SNAME( 10: 11 ).EQ.'mv' )THEN
   1351                            IF( FULL )THEN
   1352                               IF( TRACE )
   1353      $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,
   1354      $                           CUPLO, CTRANS, CDIAG, N, LDA, INCX
   1355                               IF( REWI )
   1356      $                           REWIND NTRA
   1357                               CALL CCTRMV( IORDER, UPLO, TRANS, DIAG,
   1358      $                                    N, AA, LDA, XX, INCX )
   1359                            ELSE IF( BANDED )THEN
   1360                               IF( TRACE )
   1361      $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,
   1362      $                           CUPLO, CTRANS, CDIAG, N, K, LDA, INCX
   1363                               IF( REWI )
   1364      $                           REWIND NTRA
   1365                               CALL CCTBMV( IORDER, UPLO, TRANS, DIAG,
   1366      $                                    N, K, AA, LDA, XX, INCX )
   1367                            ELSE IF( PACKED )THEN
   1368                               IF( TRACE )
   1369      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
   1370      $                           CUPLO, CTRANS, CDIAG, N, INCX
   1371                               IF( REWI )
   1372      $                           REWIND NTRA
   1373                               CALL CCTPMV( IORDER, UPLO, TRANS, DIAG,
   1374      $                                    N, AA, XX, INCX )
   1375                            END IF
   1376                         ELSE IF( SNAME( 10: 11 ).EQ.'sv' )THEN
   1377                            IF( FULL )THEN
   1378                               IF( TRACE )
   1379      $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,
   1380      $                           CUPLO, CTRANS, CDIAG, N, LDA, INCX
   1381                               IF( REWI )
   1382      $                           REWIND NTRA
   1383                               CALL CCTRSV( IORDER, UPLO, TRANS, DIAG,
   1384      $                                    N, AA, LDA, XX, INCX )
   1385                            ELSE IF( BANDED )THEN
   1386                               IF( TRACE )
   1387      $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,
   1388      $                           CUPLO, CTRANS, CDIAG, N, K, LDA, INCX
   1389                               IF( REWI )
   1390      $                           REWIND NTRA
   1391                               CALL CCTBSV( IORDER, UPLO, TRANS, DIAG,
   1392      $                                    N, K, AA, LDA, XX, INCX )
   1393                            ELSE IF( PACKED )THEN
   1394                               IF( TRACE )
   1395      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
   1396      $                           CUPLO, CTRANS, CDIAG, N, INCX
   1397                               IF( REWI )
   1398      $                           REWIND NTRA
   1399                               CALL CCTPSV( IORDER, UPLO, TRANS, DIAG,
   1400      $                                    N, AA, XX, INCX )
   1401                            END IF
   1402                         END IF
   1403 *
   1404 *                       Check if error-exit was taken incorrectly.
   1405 *
   1406                         IF( .NOT.OK )THEN
   1407                            WRITE( NOUT, FMT = 9992 )
   1408                            FATAL = .TRUE.
   1409                            GO TO 120
   1410                         END IF
   1411 *
   1412 *                       See what data changed inside subroutines.
   1413 *
   1414                         ISAME( 1 ) = UPLO.EQ.UPLOS
   1415                         ISAME( 2 ) = TRANS.EQ.TRANSS
   1416                         ISAME( 3 ) = DIAG.EQ.DIAGS
   1417                         ISAME( 4 ) = NS.EQ.N
   1418                         IF( FULL )THEN
   1419                            ISAME( 5 ) = LCE( AS, AA, LAA )
   1420                            ISAME( 6 ) = LDAS.EQ.LDA
   1421                            IF( NULL )THEN
   1422                               ISAME( 7 ) = LCE( XS, XX, LX )
   1423                            ELSE
   1424                               ISAME( 7 ) = LCERES( 'ge', ' ', 1, N, XS,
   1425      $                                     XX, ABS( INCX ) )
   1426                            END IF
   1427                            ISAME( 8 ) = INCXS.EQ.INCX
   1428                         ELSE IF( BANDED )THEN
   1429                            ISAME( 5 ) = KS.EQ.K
   1430                            ISAME( 6 ) = LCE( AS, AA, LAA )
   1431                            ISAME( 7 ) = LDAS.EQ.LDA
   1432                            IF( NULL )THEN
   1433                               ISAME( 8 ) = LCE( XS, XX, LX )
   1434                            ELSE
   1435                               ISAME( 8 ) = LCERES( 'ge', ' ', 1, N, XS,
   1436      $                                     XX, ABS( INCX ) )
   1437                            END IF
   1438                            ISAME( 9 ) = INCXS.EQ.INCX
   1439                         ELSE IF( PACKED )THEN
   1440                            ISAME( 5 ) = LCE( AS, AA, LAA )
   1441                            IF( NULL )THEN
   1442                               ISAME( 6 ) = LCE( XS, XX, LX )
   1443                            ELSE
   1444                               ISAME( 6 ) = LCERES( 'ge', ' ', 1, N, XS,
   1445      $                                     XX, ABS( INCX ) )
   1446                            END IF
   1447                            ISAME( 7 ) = INCXS.EQ.INCX
   1448                         END IF
   1449 *
   1450 *                       If data was incorrectly changed, report and
   1451 *                       return.
   1452 *
   1453                         SAME = .TRUE.
   1454                         DO 40 I = 1, NARGS
   1455                            SAME = SAME.AND.ISAME( I )
   1456                            IF( .NOT.ISAME( I ) )
   1457      $                        WRITE( NOUT, FMT = 9998 )I
   1458    40                   CONTINUE
   1459                         IF( .NOT.SAME )THEN
   1460                            FATAL = .TRUE.
   1461                            GO TO 120
   1462                         END IF
   1463 *
   1464                         IF( .NOT.NULL )THEN
   1465                            IF( SNAME( 10: 11 ).EQ.'mv' )THEN
   1466 *
   1467 *                             Check the result.
   1468 *
   1469                               CALL CMVCH( TRANS, N, N, ONE, A, NMAX, X,
   1470      $                                    INCX, ZERO, Z, INCX, XT, G,
   1471      $                                    XX, EPS, ERR, FATAL, NOUT,
   1472      $                                    .TRUE. )
   1473                            ELSE IF( SNAME( 10: 11 ).EQ.'sv' )THEN
   1474 *
   1475 *                             Compute approximation to original vector.
   1476 *
   1477                               DO 50 I = 1, N
   1478                                  Z( I ) = XX( 1 + ( I - 1 )*
   1479      $                                    ABS( INCX ) )
   1480                                  XX( 1 + ( I - 1 )*ABS( INCX ) )
   1481      $                              = X( I )
   1482    50                         CONTINUE
   1483                               CALL CMVCH( TRANS, N, N, ONE, A, NMAX, Z,
   1484      $                                    INCX, ZERO, X, INCX, XT, G,
   1485      $                                    XX, EPS, ERR, FATAL, NOUT,
   1486      $                                    .FALSE. )
   1487                            END IF
   1488                            ERRMAX = MAX( ERRMAX, ERR )
   1489 *                          If got really bad answer, report and return.
   1490                            IF( FATAL )
   1491      $                        GO TO 120
   1492                         ELSE
   1493 *                          Avoid repeating tests with N.le.0.
   1494                            GO TO 110
   1495                         END IF
   1496 *
   1497    60                CONTINUE
   1498 *
   1499    70             CONTINUE
   1500 *
   1501    80          CONTINUE
   1502 *
   1503    90       CONTINUE
   1504 *
   1505   100    CONTINUE
   1506 *
   1507   110 CONTINUE
   1508 *
   1509 *     Report result.
   1510 *
   1511       IF( ERRMAX.LT.THRESH )THEN
   1512          WRITE( NOUT, FMT = 9999 )SNAME, NC
   1513       ELSE
   1514          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
   1515       END IF
   1516       GO TO 130
   1517 *
   1518   120 CONTINUE
   1519       WRITE( NOUT, FMT = 9996 )SNAME
   1520       IF( FULL )THEN
   1521          WRITE( NOUT, FMT = 9993 )NC, SNAME, CUPLO, CTRANS, CDIAG, N,
   1522      $          LDA, INCX
   1523       ELSE IF( BANDED )THEN
   1524          WRITE( NOUT, FMT = 9994 )NC, SNAME, CUPLO, CTRANS, CDIAG, N, K,
   1525      $      LDA, INCX
   1526       ELSE IF( PACKED )THEN
   1527          WRITE( NOUT, FMT = 9995 )NC, SNAME, CUPLO, CTRANS, CDIAG, N,
   1528      $          INCX
   1529       END IF
   1530 *
   1531   130 CONTINUE
   1532       RETURN
   1533 *
   1534  9999 FORMAT(' ',A12, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
   1535      $      'S)' )
   1536  9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
   1537      $      'ANGED INCORRECTLY *******' )
   1538  9997 FORMAT(' ',A12, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
   1539      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
   1540      $      ' - SUSPECT *******' )
   1541  9996 FORMAT( ' ******* ',A12, ' FAILED ON CALL NUMBER:' )
   1542  9995 FORMAT(1X, I6, ': ',A12, '(', 3( A14, ',' ),/ 10x, I3, ', AP, ',
   1543      $      'X,', I2, ') .' )
   1544  9994 FORMAT(1X, I6, ': ',A12, '(', 3( A14, ',' ),/ 10x,  2( I3, ',' ),
   1545      $     ' A,', I3, ', X,', I2, ') .' )
   1546  9993 FORMAT( 1X, I6, ': ',A12, '(', 3( A14, ',' ),/ 10x, I3, ', A,',
   1547      $      I3, ', X,', I2, ') .' )
   1548  9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
   1549      $      '******' )
   1550 *
   1551 *     End of CCHK3.
   1552 *
   1553       END
   1554       SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
   1555      $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
   1556      $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,
   1557      $                  Z, IORDER )
   1558 *
   1559 *  Tests CGERC and CGERU.
   1560 *
   1561 *  Auxiliary routine for test program for Level 2 Blas.
   1562 *
   1563 *  -- Written on 10-August-1987.
   1564 *     Richard Hanson, Sandia National Labs.
   1565 *     Jeremy Du Croz, NAG Central Office.
   1566 *
   1567 *     .. Parameters ..
   1568       COMPLEX            ZERO, HALF, ONE
   1569       PARAMETER          ( ZERO = ( 0.0, 0.0 ), HALF = ( 0.5, 0.0 ),
   1570      $                   ONE = ( 1.0, 0.0 ) )
   1571       REAL               RZERO
   1572       PARAMETER          ( RZERO = 0.0 )
   1573 *     .. Scalar Arguments ..
   1574       REAL               EPS, THRESH
   1575       INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA,
   1576      $                   IORDER
   1577       LOGICAL            FATAL, REWI, TRACE
   1578       CHARACTER*12       SNAME
   1579 *     .. Array Arguments ..
   1580       COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
   1581      $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
   1582      $                   XX( NMAX*INCMAX ), Y( NMAX ),
   1583      $                   YS( NMAX*INCMAX ), YT( NMAX ),
   1584      $                   YY( NMAX*INCMAX ), Z( NMAX )
   1585       REAL               G( NMAX )
   1586       INTEGER            IDIM( NIDIM ), INC( NINC )
   1587 *     .. Local Scalars ..
   1588       COMPLEX            ALPHA, ALS, TRANSL
   1589       REAL               ERR, ERRMAX
   1590       INTEGER            I, IA, IM, IN, INCX, INCXS, INCY, INCYS, IX,
   1591      $                  IY, J, LAA, LDA, LDAS, LX, LY, M, MS, N, NARGS,
   1592      $                   NC, ND, NS
   1593       LOGICAL            CONJ, NULL, RESET, SAME
   1594 *     .. Local Arrays ..
   1595       COMPLEX            W( 1 )
   1596       LOGICAL            ISAME( 13 )
   1597 *     .. External Functions ..
   1598       LOGICAL            LCE, LCERES
   1599       EXTERNAL           LCE, LCERES
   1600 *     .. External Subroutines ..
   1601       EXTERNAL           CCGERC, CCGERU, CMAKE, CMVCH
   1602 *     .. Intrinsic Functions ..
   1603       INTRINSIC          ABS, CONJG, MAX, MIN
   1604 *     .. Scalars in Common ..
   1605       INTEGER            INFOT, NOUTC
   1606       LOGICAL             OK
   1607 *     .. Common blocks ..
   1608       COMMON             /INFOC/INFOT, NOUTC, OK
   1609 *     .. Executable Statements ..
   1610       CONJ = SNAME( 11: 11 ).EQ.'c'
   1611 *     Define the number of arguments.
   1612       NARGS = 9
   1613 *
   1614       NC = 0
   1615       RESET = .TRUE.
   1616       ERRMAX = RZERO
   1617 *
   1618       DO 120 IN = 1, NIDIM
   1619          N = IDIM( IN )
   1620          ND = N/2 + 1
   1621 *
   1622          DO 110 IM = 1, 2
   1623             IF( IM.EQ.1 )
   1624      $         M = MAX( N - ND, 0 )
   1625             IF( IM.EQ.2 )
   1626      $         M = MIN( N + ND, NMAX )
   1627 *
   1628 *           Set LDA to 1 more than minimum value if room.
   1629             LDA = M
   1630             IF( LDA.LT.NMAX )
   1631      $         LDA = LDA + 1
   1632 *           Skip tests if not enough room.
   1633             IF( LDA.GT.NMAX )
   1634      $         GO TO 110
   1635             LAA = LDA*N
   1636             NULL = N.LE.0.OR.M.LE.0
   1637 *
   1638             DO 100 IX = 1, NINC
   1639                INCX = INC( IX )
   1640                LX = ABS( INCX )*M
   1641 *
   1642 *              Generate the vector X.
   1643 *
   1644                TRANSL = HALF
   1645                CALL CMAKE( 'ge', ' ', ' ', 1, M, X, 1, XX, ABS( INCX ),
   1646      $                     0, M - 1, RESET, TRANSL )
   1647                IF( M.GT.1 )THEN
   1648                   X( M/2 ) = ZERO
   1649                   XX( 1 + ABS( INCX )*( M/2 - 1 ) ) = ZERO
   1650                END IF
   1651 *
   1652                DO 90 IY = 1, NINC
   1653                   INCY = INC( IY )
   1654                   LY = ABS( INCY )*N
   1655 *
   1656 *                 Generate the vector Y.
   1657 *
   1658                   TRANSL = ZERO
   1659                   CALL CMAKE( 'ge', ' ', ' ', 1, N, Y, 1, YY,
   1660      $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )
   1661                   IF( N.GT.1 )THEN
   1662                      Y( N/2 ) = ZERO
   1663                      YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO
   1664                   END IF
   1665 *
   1666                   DO 80 IA = 1, NALF
   1667                      ALPHA = ALF( IA )
   1668 *
   1669 *                    Generate the matrix A.
   1670 *
   1671                      TRANSL = ZERO
   1672                      CALL CMAKE(SNAME( 8: 9 ), ' ', ' ', M, N, A, NMAX,
   1673      $                           AA, LDA, M - 1, N - 1, RESET, TRANSL )
   1674 *
   1675                      NC = NC + 1
   1676 *
   1677 *                    Save every datum before calling the subroutine.
   1678 *
   1679                      MS = M
   1680                      NS = N
   1681                      ALS = ALPHA
   1682                      DO 10 I = 1, LAA
   1683                         AS( I ) = AA( I )
   1684    10                CONTINUE
   1685                      LDAS = LDA
   1686                      DO 20 I = 1, LX
   1687                         XS( I ) = XX( I )
   1688    20                CONTINUE
   1689                      INCXS = INCX
   1690                      DO 30 I = 1, LY
   1691                         YS( I ) = YY( I )
   1692    30                CONTINUE
   1693                      INCYS = INCY
   1694 *
   1695 *                    Call the subroutine.
   1696 *
   1697                      IF( TRACE )
   1698      $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, M, N,
   1699      $                  ALPHA, INCX, INCY, LDA
   1700                      IF( CONJ )THEN
   1701                         IF( REWI )
   1702      $                     REWIND NTRA
   1703                         CALL CCGERC( IORDER, M, N, ALPHA, XX, INCX,
   1704      $                              YY, INCY, AA, LDA )
   1705                      ELSE
   1706                         IF( REWI )
   1707      $                     REWIND NTRA
   1708                         CALL CCGERU( IORDER, M, N, ALPHA, XX, INCX,
   1709      $                              YY, INCY, AA, LDA )
   1710                      END IF
   1711 *
   1712 *                    Check if error-exit was taken incorrectly.
   1713 *
   1714                      IF( .NOT.OK )THEN
   1715                         WRITE( NOUT, FMT = 9993 )
   1716                         FATAL = .TRUE.
   1717                         GO TO 140
   1718                      END IF
   1719 *
   1720 *                    See what data changed inside subroutine.
   1721 *
   1722                      ISAME( 1 ) = MS.EQ.M
   1723                      ISAME( 2 ) = NS.EQ.N
   1724                      ISAME( 3 ) = ALS.EQ.ALPHA
   1725                      ISAME( 4 ) = LCE( XS, XX, LX )
   1726                      ISAME( 5 ) = INCXS.EQ.INCX
   1727                      ISAME( 6 ) = LCE( YS, YY, LY )
   1728                      ISAME( 7 ) = INCYS.EQ.INCY
   1729                      IF( NULL )THEN
   1730                         ISAME( 8 ) = LCE( AS, AA, LAA )
   1731                      ELSE
   1732                         ISAME( 8 ) = LCERES( 'ge', ' ', M, N, AS, AA,
   1733      $                               LDA )
   1734                      END IF
   1735                      ISAME( 9 ) = LDAS.EQ.LDA
   1736 *
   1737 *                   If data was incorrectly changed, report and return.
   1738 *
   1739                      SAME = .TRUE.
   1740                      DO 40 I = 1, NARGS
   1741                         SAME = SAME.AND.ISAME( I )
   1742                         IF( .NOT.ISAME( I ) )
   1743      $                     WRITE( NOUT, FMT = 9998 )I
   1744    40                CONTINUE
   1745                      IF( .NOT.SAME )THEN
   1746                         FATAL = .TRUE.
   1747                         GO TO 140
   1748                      END IF
   1749 *
   1750                      IF( .NOT.NULL )THEN
   1751 *
   1752 *                       Check the result column by column.
   1753 *
   1754                         IF( INCX.GT.0 )THEN
   1755                            DO 50 I = 1, M
   1756                               Z( I ) = X( I )
   1757    50                      CONTINUE
   1758                         ELSE
   1759                            DO 60 I = 1, M
   1760                               Z( I ) = X( M - I + 1 )
   1761    60                      CONTINUE
   1762                         END IF
   1763                         DO 70 J = 1, N
   1764                            IF( INCY.GT.0 )THEN
   1765                               W( 1 ) = Y( J )
   1766                            ELSE
   1767                               W( 1 ) = Y( N - J + 1 )
   1768                            END IF
   1769                            IF( CONJ )
   1770      $                        W( 1 ) = CONJG( W( 1 ) )
   1771                            CALL CMVCH( 'N', M, 1, ALPHA, Z, NMAX, W, 1,
   1772      $                                 ONE, A( 1, J ), 1, YT, G,
   1773      $                                 AA( 1 + ( J - 1 )*LDA ), EPS,
   1774      $                                 ERR, FATAL, NOUT, .TRUE. )
   1775                            ERRMAX = MAX( ERRMAX, ERR )
   1776 *                          If got really bad answer, report and return.
   1777                            IF( FATAL )
   1778      $                        GO TO 130
   1779    70                   CONTINUE
   1780                      ELSE
   1781 *                       Avoid repeating tests with M.le.0 or N.le.0.
   1782                         GO TO 110
   1783                      END IF
   1784 *
   1785    80             CONTINUE
   1786 *
   1787    90          CONTINUE
   1788 *
   1789   100       CONTINUE
   1790 *
   1791   110    CONTINUE
   1792 *
   1793   120 CONTINUE
   1794 *
   1795 *     Report result.
   1796 *
   1797       IF( ERRMAX.LT.THRESH )THEN
   1798          WRITE( NOUT, FMT = 9999 )SNAME, NC
   1799       ELSE
   1800          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
   1801       END IF
   1802       GO TO 150
   1803 *
   1804   130 CONTINUE
   1805       WRITE( NOUT, FMT = 9995 )J
   1806 *
   1807   140 CONTINUE
   1808       WRITE( NOUT, FMT = 9996 )SNAME
   1809       WRITE( NOUT, FMT = 9994 )NC, SNAME, M, N, ALPHA, INCX, INCY, LDA
   1810 *
   1811   150 CONTINUE
   1812       RETURN
   1813 *
   1814  9999 FORMAT(' ',A12, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
   1815      $      'S)' )
   1816  9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
   1817      $      'ANGED INCORRECTLY *******' )
   1818  9997 FORMAT(' ',A12, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
   1819      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
   1820      $      ' - SUSPECT *******' )
   1821  9996 FORMAT( ' ******* ',A12, ' FAILED ON CALL NUMBER:' )
   1822  9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
   1823  9994 FORMAT(1X, I6, ': ',A12, '(', 2( I3, ',' ), '(', F4.1, ',', F4.1,
   1824      $     '), X,', I2, ', Y,', I2, ', A,', I3, ') .' )
   1825  9993 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
   1826      $      '******' )
   1827 *
   1828 *     End of CCHK4.
   1829 *
   1830       END
   1831       SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
   1832      $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
   1833      $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,
   1834      $                  Z, IORDER )
   1835 *
   1836 *  Tests CHER and CHPR.
   1837 *
   1838 *  Auxiliary routine for test program for Level 2 Blas.
   1839 *
   1840 *  -- Written on 10-August-1987.
   1841 *     Richard Hanson, Sandia National Labs.
   1842 *     Jeremy Du Croz, NAG Central Office.
   1843 *
   1844 *     .. Parameters ..
   1845       COMPLEX            ZERO, HALF, ONE
   1846       PARAMETER          ( ZERO = ( 0.0, 0.0 ), HALF = ( 0.5, 0.0 ),
   1847      $                   ONE = ( 1.0, 0.0 ) )
   1848       REAL               RZERO
   1849       PARAMETER          ( RZERO = 0.0 )
   1850 *     .. Scalar Arguments ..
   1851       REAL               EPS, THRESH
   1852       INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA,
   1853      $                   IORDER
   1854       LOGICAL            FATAL, REWI, TRACE
   1855       CHARACTER*12       SNAME
   1856 *     .. Array Arguments ..
   1857       COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
   1858      $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
   1859      $                   XX( NMAX*INCMAX ), Y( NMAX ),
   1860      $                   YS( NMAX*INCMAX ), YT( NMAX ),
   1861      $                   YY( NMAX*INCMAX ), Z( NMAX )
   1862       REAL               G( NMAX )
   1863       INTEGER            IDIM( NIDIM ), INC( NINC )
   1864 *     .. Local Scalars ..
   1865       COMPLEX            ALPHA, TRANSL
   1866       REAL               ERR, ERRMAX, RALPHA, RALS
   1867       INTEGER           I, IA, IC, IN, INCX, INCXS, IX, J, JA, JJ, LAA,
   1868      $                   LDA, LDAS, LJ, LX, N, NARGS, NC, NS
   1869       LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER
   1870       CHARACTER*1        UPLO, UPLOS
   1871       CHARACTER*14       CUPLO
   1872       CHARACTER*2        ICH
   1873 *     .. Local Arrays ..
   1874       COMPLEX            W( 1 )
   1875       LOGICAL            ISAME( 13 )
   1876 *     .. External Functions ..
   1877       LOGICAL            LCE, LCERES
   1878       EXTERNAL           LCE, LCERES
   1879 *     .. External Subroutines ..
   1880       EXTERNAL           CCHER, CCHPR, CMAKE, CMVCH
   1881 *     .. Intrinsic Functions ..
   1882       INTRINSIC          ABS, CMPLX, CONJG, MAX, REAL
   1883 *     .. Scalars in Common ..
   1884       INTEGER            INFOT, NOUTC
   1885       LOGICAL             OK
   1886 *     .. Common blocks ..
   1887       COMMON             /INFOC/INFOT, NOUTC, OK
   1888 *     .. Data statements ..
   1889       DATA               ICH/'UL'/
   1890 *     .. Executable Statements ..
   1891       FULL = SNAME( 9: 9 ).EQ.'e'
   1892       PACKED = SNAME( 9: 9 ).EQ.'p'
   1893 *     Define the number of arguments.
   1894       IF( FULL )THEN
   1895          NARGS = 7
   1896       ELSE IF( PACKED )THEN
   1897          NARGS = 6
   1898       END IF
   1899 *
   1900       NC = 0
   1901       RESET = .TRUE.
   1902       ERRMAX = RZERO
   1903 *
   1904       DO 100 IN = 1, NIDIM
   1905          N = IDIM( IN )
   1906 *        Set LDA to 1 more than minimum value if room.
   1907          LDA = N
   1908          IF( LDA.LT.NMAX )
   1909      $      LDA = LDA + 1
   1910 *        Skip tests if not enough room.
   1911          IF( LDA.GT.NMAX )
   1912      $      GO TO 100
   1913          IF( PACKED )THEN
   1914             LAA = ( N*( N + 1 ) )/2
   1915          ELSE
   1916             LAA = LDA*N
   1917          END IF
   1918 *
   1919          DO 90 IC = 1, 2
   1920             UPLO = ICH( IC: IC )
   1921             IF (UPLO.EQ.'U')THEN
   1922                CUPLO = '    CblasUpper'
   1923             ELSE
   1924                CUPLO = '    CblasLower'
   1925             END IF
   1926             UPPER = UPLO.EQ.'U'
   1927 *
   1928             DO 80 IX = 1, NINC
   1929                INCX = INC( IX )
   1930                LX = ABS( INCX )*N
   1931 *
   1932 *              Generate the vector X.
   1933 *
   1934                TRANSL = HALF
   1935                CALL CMAKE( 'ge', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),
   1936      $                     0, N - 1, RESET, TRANSL )
   1937                IF( N.GT.1 )THEN
   1938                   X( N/2 ) = ZERO
   1939                   XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
   1940                END IF
   1941 *
   1942                DO 70 IA = 1, NALF
   1943                   RALPHA = REAL( ALF( IA ) )
   1944                   ALPHA = CMPLX( RALPHA, RZERO )
   1945                   NULL = N.LE.0.OR.RALPHA.EQ.RZERO
   1946 *
   1947 *                 Generate the matrix A.
   1948 *
   1949                   TRANSL = ZERO
   1950                   CALL CMAKE( SNAME( 8: 9 ), UPLO, ' ', N, N, A, NMAX,
   1951      $                        AA, LDA, N - 1, N - 1, RESET, TRANSL )
   1952 *
   1953                   NC = NC + 1
   1954 *
   1955 *                 Save every datum before calling the subroutine.
   1956 *
   1957                   UPLOS = UPLO
   1958                   NS = N
   1959                   RALS = RALPHA
   1960                   DO 10 I = 1, LAA
   1961                      AS( I ) = AA( I )
   1962    10             CONTINUE
   1963                   LDAS = LDA
   1964                   DO 20 I = 1, LX
   1965                      XS( I ) = XX( I )
   1966    20             CONTINUE
   1967                   INCXS = INCX
   1968 *
   1969 *                 Call the subroutine.
   1970 *
   1971                   IF( FULL )THEN
   1972                      IF( TRACE )
   1973      $                  WRITE( NTRA, FMT = 9993 )NC, SNAME, CUPLO, N,
   1974      $                  RALPHA, INCX, LDA
   1975                      IF( REWI )
   1976      $                  REWIND NTRA
   1977                      CALL CCHER( IORDER, UPLO, N, RALPHA, XX,
   1978      $                            INCX, AA, LDA )
   1979                   ELSE IF( PACKED )THEN
   1980                      IF( TRACE )
   1981      $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, CUPLO, N,
   1982      $                  RALPHA, INCX
   1983                      IF( REWI )
   1984      $                  REWIND NTRA
   1985                      CALL CCHPR( IORDER, UPLO, N, RALPHA,
   1986      $                            XX, INCX, AA )
   1987                   END IF
   1988 *
   1989 *                 Check if error-exit was taken incorrectly.
   1990 *
   1991                   IF( .NOT.OK )THEN
   1992                      WRITE( NOUT, FMT = 9992 )
   1993                      FATAL = .TRUE.
   1994                      GO TO 120
   1995                   END IF
   1996 *
   1997 *                 See what data changed inside subroutines.
   1998 *
   1999                   ISAME( 1 ) = UPLO.EQ.UPLOS
   2000                   ISAME( 2 ) = NS.EQ.N
   2001                   ISAME( 3 ) = RALS.EQ.RALPHA
   2002                   ISAME( 4 ) = LCE( XS, XX, LX )
   2003                   ISAME( 5 ) = INCXS.EQ.INCX
   2004                   IF( NULL )THEN
   2005                      ISAME( 6 ) = LCE( AS, AA, LAA )
   2006                   ELSE
   2007                     ISAME( 6 ) = LCERES( SNAME( 8: 9 ), UPLO, N, N, AS,
   2008      $                            AA, LDA )
   2009                   END IF
   2010                   IF( .NOT.PACKED )THEN
   2011                      ISAME( 7 ) = LDAS.EQ.LDA
   2012                   END IF
   2013 *
   2014 *                 If data was incorrectly changed, report and return.
   2015 *
   2016                   SAME = .TRUE.
   2017                   DO 30 I = 1, NARGS
   2018                      SAME = SAME.AND.ISAME( I )
   2019                      IF( .NOT.ISAME( I ) )
   2020      $                  WRITE( NOUT, FMT = 9998 )I
   2021    30             CONTINUE
   2022                   IF( .NOT.SAME )THEN
   2023                      FATAL = .TRUE.
   2024                      GO TO 120
   2025                   END IF
   2026 *
   2027                   IF( .NOT.NULL )THEN
   2028 *
   2029 *                    Check the result column by column.
   2030 *
   2031                      IF( INCX.GT.0 )THEN
   2032                         DO 40 I = 1, N
   2033                            Z( I ) = X( I )
   2034    40                   CONTINUE
   2035                      ELSE
   2036                         DO 50 I = 1, N
   2037                            Z( I ) = X( N - I + 1 )
   2038    50                   CONTINUE
   2039                      END IF
   2040                      JA = 1
   2041                      DO 60 J = 1, N
   2042                         W( 1 ) = CONJG( Z( J ) )
   2043                         IF( UPPER )THEN
   2044                            JJ = 1
   2045                            LJ = J
   2046                         ELSE
   2047                            JJ = J
   2048                            LJ = N - J + 1
   2049                         END IF
   2050                         CALL CMVCH( 'N', LJ, 1, ALPHA, Z( JJ ), LJ, W,
   2051      $                              1, ONE, A( JJ, J ), 1, YT, G,
   2052      $                              AA( JA ), EPS, ERR, FATAL, NOUT,
   2053      $                              .TRUE. )
   2054                         IF( FULL )THEN
   2055                            IF( UPPER )THEN
   2056                               JA = JA + LDA
   2057                            ELSE
   2058                               JA = JA + LDA + 1
   2059                            END IF
   2060                         ELSE
   2061                            JA = JA + LJ
   2062                         END IF
   2063                         ERRMAX = MAX( ERRMAX, ERR )
   2064 *                       If got really bad answer, report and return.
   2065                         IF( FATAL )
   2066      $                     GO TO 110
   2067    60                CONTINUE
   2068                   ELSE
   2069 *                    Avoid repeating tests if N.le.0.
   2070                      IF( N.LE.0 )
   2071      $                  GO TO 100
   2072                   END IF
   2073 *
   2074    70          CONTINUE
   2075 *
   2076    80       CONTINUE
   2077 *
   2078    90    CONTINUE
   2079 *
   2080   100 CONTINUE
   2081 *
   2082 *     Report result.
   2083 *
   2084       IF( ERRMAX.LT.THRESH )THEN
   2085          WRITE( NOUT, FMT = 9999 )SNAME, NC
   2086       ELSE
   2087          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
   2088       END IF
   2089       GO TO 130
   2090 *
   2091   110 CONTINUE
   2092       WRITE( NOUT, FMT = 9995 )J
   2093 *
   2094   120 CONTINUE
   2095       WRITE( NOUT, FMT = 9996 )SNAME
   2096       IF( FULL )THEN
   2097          WRITE( NOUT, FMT = 9993 )NC, SNAME, CUPLO, N, RALPHA, INCX, LDA
   2098       ELSE IF( PACKED )THEN
   2099          WRITE( NOUT, FMT = 9994 )NC, SNAME, CUPLO, N, RALPHA, INCX
   2100       END IF
   2101 *
   2102   130 CONTINUE
   2103       RETURN
   2104 *
   2105  9999 FORMAT(' ',A12, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
   2106      $      'S)' )
   2107  9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
   2108      $      'ANGED INCORRECTLY *******' )
   2109  9997 FORMAT(' ',A12, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
   2110      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
   2111      $      ' - SUSPECT *******' )
   2112  9996 FORMAT( ' ******* ',A12, ' FAILED ON CALL NUMBER:' )
   2113  9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
   2114  9994 FORMAT(1X, I6, ': ',A12, '(', A14, ',', I3, ',', F4.1, ', X,',
   2115      $      I2, ', AP) .' )
   2116  9993 FORMAT(1X, I6, ': ',A12, '(', A14, ',', I3, ',', F4.1, ', X,',
   2117      $     I2, ', A,', I3, ') .' )
   2118  9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
   2119      $      '******' )
   2120 *
   2121 *     End of CCHK5.
   2122 *
   2123       END
   2124       SUBROUTINE CCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
   2125      $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
   2126      $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,
   2127      $                  Z, IORDER )
   2128 *
   2129 *  Tests CHER2 and CHPR2.
   2130 *
   2131 *  Auxiliary routine for test program for Level 2 Blas.
   2132 *
   2133 *  -- Written on 10-August-1987.
   2134 *     Richard Hanson, Sandia National Labs.
   2135 *     Jeremy Du Croz, NAG Central Office.
   2136 *
   2137 *     .. Parameters ..
   2138       COMPLEX            ZERO, HALF, ONE
   2139       PARAMETER          ( ZERO = ( 0.0, 0.0 ), HALF = ( 0.5, 0.0 ),
   2140      $                   ONE = ( 1.0, 0.0 ) )
   2141       REAL               RZERO
   2142       PARAMETER          ( RZERO = 0.0 )
   2143 *     .. Scalar Arguments ..
   2144       REAL               EPS, THRESH
   2145       INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA,
   2146      $                   IORDER
   2147       LOGICAL            FATAL, REWI, TRACE
   2148       CHARACTER*12       SNAME
   2149 *     .. Array Arguments ..
   2150       COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
   2151      $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
   2152      $                   XX( NMAX*INCMAX ), Y( NMAX ),
   2153      $                   YS( NMAX*INCMAX ), YT( NMAX ),
   2154      $                   YY( NMAX*INCMAX ), Z( NMAX, 2 )
   2155       REAL               G( NMAX )
   2156       INTEGER            IDIM( NIDIM ), INC( NINC )
   2157 *     .. Local Scalars ..
   2158       COMPLEX            ALPHA, ALS, TRANSL
   2159       REAL               ERR, ERRMAX
   2160       INTEGER            I, IA, IC, IN, INCX, INCXS, INCY, INCYS, IX,
   2161      $                   IY, J, JA, JJ, LAA, LDA, LDAS, LJ, LX, LY, N,
   2162      $                   NARGS, NC, NS
   2163       LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER
   2164       CHARACTER*1        UPLO, UPLOS
   2165       CHARACTER*14       CUPLO
   2166       CHARACTER*2        ICH
   2167 *     .. Local Arrays ..
   2168       COMPLEX            W( 2 )
   2169       LOGICAL            ISAME( 13 )
   2170 *     .. External Functions ..
   2171       LOGICAL            LCE, LCERES
   2172       EXTERNAL           LCE, LCERES
   2173 *     .. External Subroutines ..
   2174       EXTERNAL           CCHER2, CCHPR2, CMAKE, CMVCH
   2175 *     .. Intrinsic Functions ..
   2176       INTRINSIC          ABS, CONJG, MAX
   2177 *     .. Scalars in Common ..
   2178       INTEGER            INFOT, NOUTC
   2179       LOGICAL             OK
   2180 *     .. Common blocks ..
   2181       COMMON             /INFOC/INFOT, NOUTC, OK
   2182 *     .. Data statements ..
   2183       DATA               ICH/'UL'/
   2184 *     .. Executable Statements ..
   2185       FULL = SNAME( 9: 9 ).EQ.'e'
   2186       PACKED = SNAME( 9: 9 ).EQ.'p'
   2187 *     Define the number of arguments.
   2188       IF( FULL )THEN
   2189          NARGS = 9
   2190       ELSE IF( PACKED )THEN
   2191          NARGS = 8
   2192       END IF
   2193 *
   2194       NC = 0
   2195       RESET = .TRUE.
   2196       ERRMAX = RZERO
   2197 *
   2198       DO 140 IN = 1, NIDIM
   2199          N = IDIM( IN )
   2200 *        Set LDA to 1 more than minimum value if room.
   2201          LDA = N
   2202          IF( LDA.LT.NMAX )
   2203      $      LDA = LDA + 1
   2204 *        Skip tests if not enough room.
   2205          IF( LDA.GT.NMAX )
   2206      $      GO TO 140
   2207          IF( PACKED )THEN
   2208             LAA = ( N*( N + 1 ) )/2
   2209          ELSE
   2210             LAA = LDA*N
   2211          END IF
   2212 *
   2213          DO 130 IC = 1, 2
   2214             UPLO = ICH( IC: IC )
   2215             IF (UPLO.EQ.'U')THEN
   2216                CUPLO = '    CblasUpper'
   2217             ELSE
   2218                CUPLO = '    CblasLower'
   2219             END IF
   2220             UPPER = UPLO.EQ.'U'
   2221 *
   2222             DO 120 IX = 1, NINC
   2223                INCX = INC( IX )
   2224                LX = ABS( INCX )*N
   2225 *
   2226 *              Generate the vector X.
   2227 *
   2228                TRANSL = HALF
   2229                CALL CMAKE( 'ge', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),
   2230      $                     0, N - 1, RESET, TRANSL )
   2231                IF( N.GT.1 )THEN
   2232                   X( N/2 ) = ZERO
   2233                   XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
   2234                END IF
   2235 *
   2236                DO 110 IY = 1, NINC
   2237                   INCY = INC( IY )
   2238                   LY = ABS( INCY )*N
   2239 *
   2240 *                 Generate the vector Y.
   2241 *
   2242                   TRANSL = ZERO
   2243                   CALL CMAKE( 'ge', ' ', ' ', 1, N, Y, 1, YY,
   2244      $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )
   2245                   IF( N.GT.1 )THEN
   2246                      Y( N/2 ) = ZERO
   2247                      YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO
   2248                   END IF
   2249 *
   2250                   DO 100 IA = 1, NALF
   2251                      ALPHA = ALF( IA )
   2252                      NULL = N.LE.0.OR.ALPHA.EQ.ZERO
   2253 *
   2254 *                    Generate the matrix A.
   2255 *
   2256                      TRANSL = ZERO
   2257                      CALL CMAKE( SNAME( 8: 9 ), UPLO, ' ', N, N, A,
   2258      $                           NMAX, AA, LDA, N - 1, N - 1, RESET,
   2259      $                           TRANSL )
   2260 *
   2261                      NC = NC + 1
   2262 *
   2263 *                    Save every datum before calling the subroutine.
   2264 *
   2265                      UPLOS = UPLO
   2266                      NS = N
   2267                      ALS = ALPHA
   2268                      DO 10 I = 1, LAA
   2269                         AS( I ) = AA( I )
   2270    10                CONTINUE
   2271                      LDAS = LDA
   2272                      DO 20 I = 1, LX
   2273                         XS( I ) = XX( I )
   2274    20                CONTINUE
   2275                      INCXS = INCX
   2276                      DO 30 I = 1, LY
   2277                         YS( I ) = YY( I )
   2278    30                CONTINUE
   2279                      INCYS = INCY
   2280 *
   2281 *                    Call the subroutine.
   2282 *
   2283                      IF( FULL )THEN
   2284                         IF( TRACE )
   2285      $                     WRITE( NTRA, FMT = 9993 )NC, SNAME, CUPLO, N,
   2286      $                     ALPHA, INCX, INCY, LDA
   2287                         IF( REWI )
   2288      $                     REWIND NTRA
   2289                         CALL CCHER2( IORDER, UPLO, N, ALPHA, XX, INCX,
   2290      $                              YY, INCY, AA, LDA )
   2291                      ELSE IF( PACKED )THEN
   2292                         IF( TRACE )
   2293      $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, CUPLO, N,
   2294      $                     ALPHA, INCX, INCY
   2295                         IF( REWI )
   2296      $                     REWIND NTRA
   2297                         CALL CCHPR2( IORDER, UPLO, N, ALPHA, XX, INCX,
   2298      $                              YY, INCY, AA )
   2299                      END IF
   2300 *
   2301 *                    Check if error-exit was taken incorrectly.
   2302 *
   2303                      IF( .NOT.OK )THEN
   2304                         WRITE( NOUT, FMT = 9992 )
   2305                         FATAL = .TRUE.
   2306                         GO TO 160
   2307                      END IF
   2308 *
   2309 *                    See what data changed inside subroutines.
   2310 *
   2311                      ISAME( 1 ) = UPLO.EQ.UPLOS
   2312                      ISAME( 2 ) = NS.EQ.N
   2313                      ISAME( 3 ) = ALS.EQ.ALPHA
   2314                      ISAME( 4 ) = LCE( XS, XX, LX )
   2315                      ISAME( 5 ) = INCXS.EQ.INCX
   2316                      ISAME( 6 ) = LCE( YS, YY, LY )
   2317                      ISAME( 7 ) = INCYS.EQ.INCY
   2318                      IF( NULL )THEN
   2319                         ISAME( 8 ) = LCE( AS, AA, LAA )
   2320                      ELSE
   2321                         ISAME( 8 ) = LCERES( SNAME( 8: 9 ), UPLO, N, N,
   2322      $                               AS, AA, LDA )
   2323                      END IF
   2324                      IF( .NOT.PACKED )THEN
   2325                         ISAME( 9 ) = LDAS.EQ.LDA
   2326                      END IF
   2327 *
   2328 *                   If data was incorrectly changed, report and return.
   2329 *
   2330                      SAME = .TRUE.
   2331                      DO 40 I = 1, NARGS
   2332                         SAME = SAME.AND.ISAME( I )
   2333                         IF( .NOT.ISAME( I ) )
   2334      $                     WRITE( NOUT, FMT = 9998 )I
   2335    40                CONTINUE
   2336                      IF( .NOT.SAME )THEN
   2337                         FATAL = .TRUE.
   2338                         GO TO 160
   2339                      END IF
   2340 *
   2341                      IF( .NOT.NULL )THEN
   2342 *
   2343 *                       Check the result column by column.
   2344 *
   2345                         IF( INCX.GT.0 )THEN
   2346                            DO 50 I = 1, N
   2347                               Z( I, 1 ) = X( I )
   2348    50                      CONTINUE
   2349                         ELSE
   2350                            DO 60 I = 1, N
   2351                               Z( I, 1 ) = X( N - I + 1 )
   2352    60                      CONTINUE
   2353                         END IF
   2354                         IF( INCY.GT.0 )THEN
   2355                            DO 70 I = 1, N
   2356                               Z( I, 2 ) = Y( I )
   2357    70                      CONTINUE
   2358                         ELSE
   2359                            DO 80 I = 1, N
   2360                               Z( I, 2 ) = Y( N - I + 1 )
   2361    80                      CONTINUE
   2362                         END IF
   2363                         JA = 1
   2364                         DO 90 J = 1, N
   2365                            W( 1 ) = ALPHA*CONJG( Z( J, 2 ) )
   2366                            W( 2 ) = CONJG( ALPHA )*CONJG( Z( J, 1 ) )
   2367                            IF( UPPER )THEN
   2368                               JJ = 1
   2369                               LJ = J
   2370                            ELSE
   2371                               JJ = J
   2372                               LJ = N - J + 1
   2373                            END IF
   2374                            CALL CMVCH( 'N', LJ, 2, ONE, Z( JJ, 1 ),
   2375      $                                 NMAX, W, 1, ONE, A( JJ, J ), 1,
   2376      $                                YT, G, AA( JA ), EPS, ERR, FATAL,
   2377      $                                 NOUT, .TRUE. )
   2378                            IF( FULL )THEN
   2379                               IF( UPPER )THEN
   2380                                  JA = JA + LDA
   2381                               ELSE
   2382                                  JA = JA + LDA + 1
   2383                               END IF
   2384                            ELSE
   2385                               JA = JA + LJ
   2386                            END IF
   2387                            ERRMAX = MAX( ERRMAX, ERR )
   2388 *                          If got really bad answer, report and return.
   2389                            IF( FATAL )
   2390      $                        GO TO 150
   2391    90                   CONTINUE
   2392                      ELSE
   2393 *                       Avoid repeating tests with N.le.0.
   2394                         IF( N.LE.0 )
   2395      $                     GO TO 140
   2396                      END IF
   2397 *
   2398   100             CONTINUE
   2399 *
   2400   110          CONTINUE
   2401 *
   2402   120       CONTINUE
   2403 *
   2404   130    CONTINUE
   2405 *
   2406   140 CONTINUE
   2407 *
   2408 *     Report result.
   2409 *
   2410       IF( ERRMAX.LT.THRESH )THEN
   2411          WRITE( NOUT, FMT = 9999 )SNAME, NC
   2412       ELSE
   2413          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
   2414       END IF
   2415       GO TO 170
   2416 *
   2417   150 CONTINUE
   2418       WRITE( NOUT, FMT = 9995 )J
   2419 *
   2420   160 CONTINUE
   2421       WRITE( NOUT, FMT = 9996 )SNAME
   2422       IF( FULL )THEN
   2423          WRITE( NOUT, FMT = 9993 )NC, SNAME, CUPLO, N, ALPHA, INCX,
   2424      $      INCY, LDA
   2425       ELSE IF( PACKED )THEN
   2426          WRITE( NOUT, FMT = 9994 )NC, SNAME, CUPLO, N, ALPHA, INCX, INCY
   2427       END IF
   2428 *
   2429   170 CONTINUE
   2430       RETURN
   2431 *
   2432  9999 FORMAT(' ',A12, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
   2433      $      'S)' )
   2434  9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
   2435      $      'ANGED INCORRECTLY *******' )
   2436  9997 FORMAT(' ',A12, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
   2437      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
   2438      $      ' - SUSPECT *******' )
   2439  9996 FORMAT( ' ******* ',A12, ' FAILED ON CALL NUMBER:' )
   2440  9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
   2441  9994 FORMAT(1X, I6, ': ',A12, '(', A14, ',', I3, ',(', F4.1, ',',
   2442      $     F4.1, '), X,', I2, ', Y,', I2, ', AP) .' )
   2443  9993 FORMAT(1X, I6, ': ',A12, '(', A14, ',', I3, ',(', F4.1, ',',
   2444      $     F4.1, '), X,', I2, ', Y,', I2, ', A,', I3, ') .' )
   2445  9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
   2446      $      '******' )
   2447 *
   2448 *     End of CCHK6.
   2449 *
   2450       END
   2451       SUBROUTINE CMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y,
   2452      $                  INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV )
   2453 *
   2454 *  Checks the results of the computational tests.
   2455 *
   2456 *  Auxiliary routine for test program for Level 2 Blas.
   2457 *
   2458 *  -- Written on 10-August-1987.
   2459 *     Richard Hanson, Sandia National Labs.
   2460 *     Jeremy Du Croz, NAG Central Office.
   2461 *
   2462 *     .. Parameters ..
   2463       COMPLEX            ZERO
   2464       PARAMETER          ( ZERO = ( 0.0, 0.0 ) )
   2465       REAL               RZERO, RONE
   2466       PARAMETER          ( RZERO = 0.0, RONE = 1.0 )
   2467 *     .. Scalar Arguments ..
   2468       COMPLEX            ALPHA, BETA
   2469       REAL               EPS, ERR
   2470       INTEGER            INCX, INCY, M, N, NMAX, NOUT
   2471       LOGICAL            FATAL, MV
   2472       CHARACTER*1        TRANS
   2473 *     .. Array Arguments ..
   2474       COMPLEX            A( NMAX, * ), X( * ), Y( * ), YT( * ), YY( * )
   2475       REAL               G( * )
   2476 *     .. Local Scalars ..
   2477       COMPLEX            C
   2478       REAL               ERRI
   2479       INTEGER            I, INCXL, INCYL, IY, J, JX, KX, KY, ML, NL
   2480       LOGICAL            CTRAN, TRAN
   2481 *     .. Intrinsic Functions ..
   2482       INTRINSIC          ABS, AIMAG, CONJG, MAX, REAL, SQRT
   2483 *     .. Statement Functions ..
   2484       REAL               ABS1
   2485 *     .. Statement Function definitions ..
   2486       ABS1( C ) = ABS( REAL( C ) ) + ABS( AIMAG( C ) )
   2487 *     .. Executable Statements ..
   2488       TRAN = TRANS.EQ.'T'
   2489       CTRAN = TRANS.EQ.'C'
   2490       IF( TRAN.OR.CTRAN )THEN
   2491          ML = N
   2492          NL = M
   2493       ELSE
   2494          ML = M
   2495          NL = N
   2496       END IF
   2497       IF( INCX.LT.0 )THEN
   2498          KX = NL
   2499          INCXL = -1
   2500       ELSE
   2501          KX = 1
   2502          INCXL = 1
   2503       END IF
   2504       IF( INCY.LT.0 )THEN
   2505          KY = ML
   2506          INCYL = -1
   2507       ELSE
   2508          KY = 1
   2509          INCYL = 1
   2510       END IF
   2511 *
   2512 *     Compute expected result in YT using data in A, X and Y.
   2513 *     Compute gauges in G.
   2514 *
   2515       IY = KY
   2516       DO 40 I = 1, ML
   2517          YT( IY ) = ZERO
   2518          G( IY ) = RZERO
   2519          JX = KX
   2520          IF( TRAN )THEN
   2521             DO 10 J = 1, NL
   2522                YT( IY ) = YT( IY ) + A( J, I )*X( JX )
   2523                G( IY ) = G( IY ) + ABS1( A( J, I ) )*ABS1( X( JX ) )
   2524                JX = JX + INCXL
   2525    10       CONTINUE
   2526          ELSE IF( CTRAN )THEN
   2527             DO 20 J = 1, NL
   2528                YT( IY ) = YT( IY ) + CONJG( A( J, I ) )*X( JX )
   2529                G( IY ) = G( IY ) + ABS1( A( J, I ) )*ABS1( X( JX ) )
   2530                JX = JX + INCXL
   2531    20       CONTINUE
   2532          ELSE
   2533             DO 30 J = 1, NL
   2534                YT( IY ) = YT( IY ) + A( I, J )*X( JX )
   2535                G( IY ) = G( IY ) + ABS1( A( I, J ) )*ABS1( X( JX ) )
   2536                JX = JX + INCXL
   2537    30       CONTINUE
   2538          END IF
   2539          YT( IY ) = ALPHA*YT( IY ) + BETA*Y( IY )
   2540          G( IY ) = ABS1( ALPHA )*G( IY ) + ABS1( BETA )*ABS1( Y( IY ) )
   2541          IY = IY + INCYL
   2542    40 CONTINUE
   2543 *
   2544 *     Compute the error ratio for this result.
   2545 *
   2546       ERR = ZERO
   2547       DO 50 I = 1, ML
   2548          ERRI = ABS( YT( I ) - YY( 1 + ( I - 1 )*ABS( INCY ) ) )/EPS
   2549          IF( G( I ).NE.RZERO )
   2550      $      ERRI = ERRI/G( I )
   2551          ERR = MAX( ERR, ERRI )
   2552          IF( ERR*SQRT( EPS ).GE.RONE )
   2553      $      GO TO 60
   2554    50 CONTINUE
   2555 *     If the loop completes, all results are at least half accurate.
   2556       GO TO 80
   2557 *
   2558 *     Report fatal error.
   2559 *
   2560    60 FATAL = .TRUE.
   2561       WRITE( NOUT, FMT = 9999 )
   2562       DO 70 I = 1, ML
   2563          IF( MV )THEN
   2564             WRITE( NOUT, FMT = 9998 )I, YT( I ),
   2565      $         YY( 1 + ( I - 1 )*ABS( INCY ) )
   2566          ELSE
   2567             WRITE( NOUT, FMT = 9998 )I,
   2568      $         YY( 1 + ( I - 1 )*ABS( INCY ) ), YT( I )
   2569          END IF
   2570    70 CONTINUE
   2571 *
   2572    80 CONTINUE
   2573       RETURN
   2574 *
   2575  9999 FORMAT(' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
   2576      $     'F ACCURATE *******', /'                       EXPECTED RE',
   2577      $     'SULT                    COMPUTED RESULT' )
   2578  9998 FORMAT( 1X, I7, 2( '  (', G15.6, ',', G15.6, ')' ) )
   2579 *
   2580 *     End of CMVCH.
   2581 *
   2582       END
   2583       LOGICAL FUNCTION LCE( RI, RJ, LR )
   2584 *
   2585 *  Tests if two arrays are identical.
   2586 *
   2587 *  Auxiliary routine for test program for Level 2 Blas.
   2588 *
   2589 *  -- Written on 10-August-1987.
   2590 *     Richard Hanson, Sandia National Labs.
   2591 *     Jeremy Du Croz, NAG Central Office.
   2592 *
   2593 *     .. Scalar Arguments ..
   2594       INTEGER            LR
   2595 *     .. Array Arguments ..
   2596       COMPLEX            RI( * ), RJ( * )
   2597 *     .. Local Scalars ..
   2598       INTEGER            I
   2599 *     .. Executable Statements ..
   2600       DO 10 I = 1, LR
   2601          IF( RI( I ).NE.RJ( I ) )
   2602      $      GO TO 20
   2603    10 CONTINUE
   2604       LCE = .TRUE.
   2605       GO TO 30
   2606    20 CONTINUE
   2607       LCE = .FALSE.
   2608    30 RETURN
   2609 *
   2610 *     End of LCE.
   2611 *
   2612       END
   2613       LOGICAL FUNCTION LCERES( TYPE, UPLO, M, N, AA, AS, LDA )
   2614 *
   2615 *  Tests if selected elements in two arrays are equal.
   2616 *
   2617 *  TYPE is 'ge', 'he' or 'hp'.
   2618 *
   2619 *  Auxiliary routine for test program for Level 2 Blas.
   2620 *
   2621 *  -- Written on 10-August-1987.
   2622 *     Richard Hanson, Sandia National Labs.
   2623 *     Jeremy Du Croz, NAG Central Office.
   2624 *
   2625 *     .. Scalar Arguments ..
   2626       INTEGER            LDA, M, N
   2627       CHARACTER*1        UPLO
   2628       CHARACTER*2        TYPE
   2629 *     .. Array Arguments ..
   2630       COMPLEX            AA( LDA, * ), AS( LDA, * )
   2631 *     .. Local Scalars ..
   2632       INTEGER            I, IBEG, IEND, J
   2633       LOGICAL            UPPER
   2634 *     .. Executable Statements ..
   2635       UPPER = UPLO.EQ.'U'
   2636       IF( TYPE.EQ.'ge' )THEN
   2637          DO 20 J = 1, N
   2638             DO 10 I = M + 1, LDA
   2639                IF( AA( I, J ).NE.AS( I, J ) )
   2640      $            GO TO 70
   2641    10       CONTINUE
   2642    20    CONTINUE
   2643       ELSE IF( TYPE.EQ.'he' )THEN
   2644          DO 50 J = 1, N
   2645             IF( UPPER )THEN
   2646                IBEG = 1
   2647                IEND = J
   2648             ELSE
   2649                IBEG = J
   2650                IEND = N
   2651             END IF
   2652             DO 30 I = 1, IBEG - 1
   2653                IF( AA( I, J ).NE.AS( I, J ) )
   2654      $            GO TO 70
   2655    30       CONTINUE
   2656             DO 40 I = IEND + 1, LDA
   2657                IF( AA( I, J ).NE.AS( I, J ) )
   2658      $            GO TO 70
   2659    40       CONTINUE
   2660    50    CONTINUE
   2661       END IF
   2662 *
   2663    60 CONTINUE
   2664       LCERES = .TRUE.
   2665       GO TO 80
   2666    70 CONTINUE
   2667       LCERES = .FALSE.
   2668    80 RETURN
   2669 *
   2670 *     End of LCERES.
   2671 *
   2672       END
   2673       COMPLEX FUNCTION CBEG( RESET )
   2674 *
   2675 *  Generates complex numbers as pairs of random numbers uniformly
   2676 *  distributed between -0.5 and 0.5.
   2677 *
   2678 *  Auxiliary routine for test program for Level 2 Blas.
   2679 *
   2680 *  -- Written on 10-August-1987.
   2681 *     Richard Hanson, Sandia National Labs.
   2682 *     Jeremy Du Croz, NAG Central Office.
   2683 *
   2684 *     .. Scalar Arguments ..
   2685       LOGICAL            RESET
   2686 *     .. Local Scalars ..
   2687       INTEGER            I, IC, J, MI, MJ
   2688 *     .. Save statement ..
   2689       SAVE               I, IC, J, MI, MJ
   2690 *     .. Intrinsic Functions ..
   2691       INTRINSIC          CMPLX
   2692 *     .. Executable Statements ..
   2693       IF( RESET )THEN
   2694 *        Initialize local variables.
   2695          MI = 891
   2696          MJ = 457
   2697          I = 7
   2698          J = 7
   2699          IC = 0
   2700          RESET = .FALSE.
   2701       END IF
   2702 *
   2703 *     The sequence of values of I or J is bounded between 1 and 999.
   2704 *     If initial I or J = 1,2,3,6,7 or 9, the period will be 50.
   2705 *     If initial I or J = 4 or 8, the period will be 25.
   2706 *     If initial I or J = 5, the period will be 10.
   2707 *     IC is used to break up the period by skipping 1 value of I or J
   2708 *     in 6.
   2709 *
   2710       IC = IC + 1
   2711    10 I = I*MI
   2712       J = J*MJ
   2713       I = I - 1000*( I/1000 )
   2714       J = J - 1000*( J/1000 )
   2715       IF( IC.GE.5 )THEN
   2716          IC = 0
   2717          GO TO 10
   2718       END IF
   2719       CBEG = CMPLX( ( I - 500 )/1001.0, ( J - 500 )/1001.0 )
   2720       RETURN
   2721 *
   2722 *     End of CBEG.
   2723 *
   2724       END
   2725       REAL FUNCTION SDIFF( X, Y )
   2726 *
   2727 *  Auxiliary routine for test program for Level 2 Blas.
   2728 *
   2729 *  -- Written on 10-August-1987.
   2730 *     Richard Hanson, Sandia National Labs.
   2731 *
   2732 *     .. Scalar Arguments ..
   2733       REAL               X, Y
   2734 *     .. Executable Statements ..
   2735       SDIFF = X - Y
   2736       RETURN
   2737 *
   2738 *     End of SDIFF.
   2739 *
   2740       END
   2741       SUBROUTINE CMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL,
   2742      $                  KU, RESET, TRANSL )
   2743 *
   2744 *  Generates values for an M by N matrix A within the bandwidth
   2745 *  defined by KL and KU.
   2746 *  Stores the values in the array AA in the data structure required
   2747 *  by the routine, with unwanted elements set to rogue value.
   2748 *
   2749 *  TYPE is 'ge', 'gb', 'he', 'hb', 'hp', 'tr', 'tb' OR 'tp'.
   2750 *
   2751 *  Auxiliary routine for test program for Level 2 Blas.
   2752 *
   2753 *  -- Written on 10-August-1987.
   2754 *     Richard Hanson, Sandia National Labs.
   2755 *     Jeremy Du Croz, NAG Central Office.
   2756 *
   2757 *     .. Parameters ..
   2758       COMPLEX            ZERO, ONE
   2759       PARAMETER          ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )
   2760       COMPLEX            ROGUE
   2761       PARAMETER          ( ROGUE = ( -1.0E10, 1.0E10 ) )
   2762       REAL               RZERO
   2763       PARAMETER          ( RZERO = 0.0 )
   2764       REAL               RROGUE
   2765       PARAMETER          ( RROGUE = -1.0E10 )
   2766 *     .. Scalar Arguments ..
   2767       COMPLEX            TRANSL
   2768       INTEGER            KL, KU, LDA, M, N, NMAX
   2769       LOGICAL            RESET
   2770       CHARACTER*1        DIAG, UPLO
   2771       CHARACTER*2        TYPE
   2772 *     .. Array Arguments ..
   2773       COMPLEX            A( NMAX, * ), AA( * )
   2774 *     .. Local Scalars ..
   2775       INTEGER            I, I1, I2, I3, IBEG, IEND, IOFF, J, JJ, KK
   2776       LOGICAL            GEN, LOWER, SYM, TRI, UNIT, UPPER
   2777 *     .. External Functions ..
   2778       COMPLEX            CBEG
   2779       EXTERNAL           CBEG
   2780 *     .. Intrinsic Functions ..
   2781       INTRINSIC          CMPLX, CONJG, MAX, MIN, REAL
   2782 *     .. Executable Statements ..
   2783       GEN = TYPE( 1: 1 ).EQ.'g'
   2784       SYM = TYPE( 1: 1 ).EQ.'h'
   2785       TRI = TYPE( 1: 1 ).EQ.'t'
   2786       UPPER = ( SYM.OR.TRI ).AND.UPLO.EQ.'U'
   2787       LOWER = ( SYM.OR.TRI ).AND.UPLO.EQ.'L'
   2788       UNIT = TRI.AND.DIAG.EQ.'U'
   2789 *
   2790 *     Generate data in array A.
   2791 *
   2792       DO 20 J = 1, N
   2793          DO 10 I = 1, M
   2794             IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )
   2795      $          THEN
   2796                IF( ( I.LE.J.AND.J - I.LE.KU ).OR.
   2797      $             ( I.GE.J.AND.I - J.LE.KL ) )THEN
   2798                   A( I, J ) = CBEG( RESET ) + TRANSL
   2799                ELSE
   2800                   A( I, J ) = ZERO
   2801                END IF
   2802                IF( I.NE.J )THEN
   2803                   IF( SYM )THEN
   2804                      A( J, I ) = CONJG( A( I, J ) )
   2805                   ELSE IF( TRI )THEN
   2806                      A( J, I ) = ZERO
   2807                   END IF
   2808                END IF
   2809             END IF
   2810    10    CONTINUE
   2811          IF( SYM )
   2812      $      A( J, J ) = CMPLX( REAL( A( J, J ) ), RZERO )
   2813          IF( TRI )
   2814      $      A( J, J ) = A( J, J ) + ONE
   2815          IF( UNIT )
   2816      $      A( J, J ) = ONE
   2817    20 CONTINUE
   2818 *
   2819 *     Store elements in array AS in data structure required by routine.
   2820 *
   2821       IF( TYPE.EQ.'ge' )THEN
   2822          DO 50 J = 1, N
   2823             DO 30 I = 1, M
   2824                AA( I + ( J - 1 )*LDA ) = A( I, J )
   2825    30       CONTINUE
   2826             DO 40 I = M + 1, LDA
   2827                AA( I + ( J - 1 )*LDA ) = ROGUE
   2828    40       CONTINUE
   2829    50    CONTINUE
   2830       ELSE IF( TYPE.EQ.'gb' )THEN
   2831          DO 90 J = 1, N
   2832             DO 60 I1 = 1, KU + 1 - J
   2833                AA( I1 + ( J - 1 )*LDA ) = ROGUE
   2834    60       CONTINUE
   2835             DO 70 I2 = I1, MIN( KL + KU + 1, KU + 1 + M - J )
   2836                AA( I2 + ( J - 1 )*LDA ) = A( I2 + J - KU - 1, J )
   2837    70       CONTINUE
   2838             DO 80 I3 = I2, LDA
   2839                AA( I3 + ( J - 1 )*LDA ) = ROGUE
   2840    80       CONTINUE
   2841    90    CONTINUE
   2842       ELSE IF( TYPE.EQ.'he'.OR.TYPE.EQ.'tr' )THEN
   2843          DO 130 J = 1, N
   2844             IF( UPPER )THEN
   2845                IBEG = 1
   2846                IF( UNIT )THEN
   2847                   IEND = J - 1
   2848                ELSE
   2849                   IEND = J
   2850                END IF
   2851             ELSE
   2852                IF( UNIT )THEN
   2853                   IBEG = J + 1
   2854                ELSE
   2855                   IBEG = J
   2856                END IF
   2857                IEND = N
   2858             END IF
   2859             DO 100 I = 1, IBEG - 1
   2860                AA( I + ( J - 1 )*LDA ) = ROGUE
   2861   100       CONTINUE
   2862             DO 110 I = IBEG, IEND
   2863                AA( I + ( J - 1 )*LDA ) = A( I, J )
   2864   110       CONTINUE
   2865             DO 120 I = IEND + 1, LDA
   2866                AA( I + ( J - 1 )*LDA ) = ROGUE
   2867   120       CONTINUE
   2868             IF( SYM )THEN
   2869                JJ = J + ( J - 1 )*LDA
   2870                AA( JJ ) = CMPLX( REAL( AA( JJ ) ), RROGUE )
   2871             END IF
   2872   130    CONTINUE
   2873       ELSE IF( TYPE.EQ.'hb'.OR.TYPE.EQ.'tb' )THEN
   2874          DO 170 J = 1, N
   2875             IF( UPPER )THEN
   2876                KK = KL + 1
   2877                IBEG = MAX( 1, KL + 2 - J )
   2878                IF( UNIT )THEN
   2879                   IEND = KL
   2880                ELSE
   2881                   IEND = KL + 1
   2882                END IF
   2883             ELSE
   2884                KK = 1
   2885                IF( UNIT )THEN
   2886                   IBEG = 2
   2887                ELSE
   2888                   IBEG = 1
   2889                END IF
   2890                IEND = MIN( KL + 1, 1 + M - J )
   2891             END IF
   2892             DO 140 I = 1, IBEG - 1
   2893                AA( I + ( J - 1 )*LDA ) = ROGUE
   2894   140       CONTINUE
   2895             DO 150 I = IBEG, IEND
   2896                AA( I + ( J - 1 )*LDA ) = A( I + J - KK, J )
   2897   150       CONTINUE
   2898             DO 160 I = IEND + 1, LDA
   2899                AA( I + ( J - 1 )*LDA ) = ROGUE
   2900   160       CONTINUE
   2901             IF( SYM )THEN
   2902                JJ = KK + ( J - 1 )*LDA
   2903                AA( JJ ) = CMPLX( REAL( AA( JJ ) ), RROGUE )
   2904             END IF
   2905   170    CONTINUE
   2906       ELSE IF( TYPE.EQ.'hp'.OR.TYPE.EQ.'tp' )THEN
   2907          IOFF = 0
   2908          DO 190 J = 1, N
   2909             IF( UPPER )THEN
   2910                IBEG = 1
   2911                IEND = J
   2912             ELSE
   2913                IBEG = J
   2914                IEND = N
   2915             END IF
   2916             DO 180 I = IBEG, IEND
   2917                IOFF = IOFF + 1
   2918                AA( IOFF ) = A( I, J )
   2919                IF( I.EQ.J )THEN
   2920                   IF( UNIT )
   2921      $               AA( IOFF ) = ROGUE
   2922                   IF( SYM )
   2923      $               AA( IOFF ) = CMPLX( REAL( AA( IOFF ) ), RROGUE )
   2924                END IF
   2925   180       CONTINUE
   2926   190    CONTINUE
   2927       END IF
   2928       RETURN
   2929 *
   2930 *     End of CMAKE.
   2931 *
   2932       END
   2933