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
3242