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