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