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