~ubuntu-branches/ubuntu/vivid/atlas/vivid

« back to all changes in this revision

Viewing changes to interfaces/blas/C/testing/c_zblat2.f

  • Committer: Bazaar Package Importer
  • Author(s): Camm Maguire
  • Date: 2002-04-13 10:07:52 UTC
  • Revision ID: james.westby@ubuntu.com-20020413100752-va9zm0rd4gpurdkq
Tags: upstream-3.2.1ln
ImportĀ upstreamĀ versionĀ 3.2.1ln

Show diffs side-by-side

added added

removed removed

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