• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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