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