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