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