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