3 * Test program for the COMPLEX*16 Level 3 Blas.
5 * The program must be driven by a short data file. The first 13 records
6 * of the file are read using list-directed input, the last 9 records
7 * are read using the format ( A12,L2 ). An annotated example of a data
8 * file can be obtained by deleting the first 3 characters from the
10 * 'CBLAT3.SNAP' NAME OF SNAPSHOT OUTPUT FILE
11 * -1 UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)
12 * F LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.
13 * F LOGICAL FLAG, T TO STOP ON FAILURES.
14 * T LOGICAL FLAG, T TO TEST ERROR EXITS.
15 * 2 0 TO TEST COLUMN-MAJOR, 1 TO TEST ROW-MAJOR, 2 TO TEST BOTH
16 * 16.0 THRESHOLD VALUE OF TEST RATIO
17 * 6 NUMBER OF VALUES OF N
18 * 0 1 2 3 5 9 VALUES OF N
19 * 3 NUMBER OF VALUES OF ALPHA
20 * (0.0,0.0) (1.0,0.0) (0.7,-0.9) VALUES OF ALPHA
21 * 3 NUMBER OF VALUES OF BETA
22 * (0.0,0.0) (1.0,0.0) (1.3,-1.1) VALUES OF BETA
23 * ZGEMM T PUT F FOR NO TEST. SAME COLUMNS.
24 * ZHEMM T PUT F FOR NO TEST. SAME COLUMNS.
25 * ZSYMM T PUT F FOR NO TEST. SAME COLUMNS.
26 * ZTRMM T PUT F FOR NO TEST. SAME COLUMNS.
27 * ZTRSM T PUT F FOR NO TEST. SAME COLUMNS.
28 * ZHERK T PUT F FOR NO TEST. SAME COLUMNS.
29 * ZSYRK T PUT F FOR NO TEST. SAME COLUMNS.
30 * ZHER2K T PUT F FOR NO TEST. SAME COLUMNS.
31 * ZSYR2K T PUT F FOR NO TEST. SAME COLUMNS.
35 * Dongarra J. J., Du Croz J. J., Duff I. S. and Hammarling S.
36 * A Set of Level 3 Basic Linear Algebra Subprograms.
38 * Technical Memorandum No.88 (Revision 1), Mathematics and
39 * Computer Science Division, Argonne National Laboratory, 9700
40 * South Cass Avenue, Argonne, Illinois 60439, US.
42 * -- Written on 8-February-1989.
43 * Jack Dongarra, Argonne National Laboratory.
44 * Iain Duff, AERE Harwell.
45 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
46 * Sven Hammarling, Numerical Algorithms Group Ltd.
50 PARAMETER ( NIN = 5, NOUT = 6 )
52 PARAMETER ( NSUBS = 9 )
54 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ),
55 $ ONE = ( 1.0D0, 0.0D0 ) )
56 DOUBLE PRECISION RZERO, RHALF, RONE
57 PARAMETER ( RZERO = 0.0D0, RHALF = 0.5D0, RONE = 1.0D0 )
59 PARAMETER ( NMAX = 65 )
60 INTEGER NIDMAX, NALMAX, NBEMAX
61 PARAMETER ( NIDMAX = 9, NALMAX = 7, NBEMAX = 7 )
63 DOUBLE PRECISION EPS, ERR, THRESH
64 INTEGER I, ISNUM, J, N, NALF, NBET, NIDIM, NTRA,
66 LOGICAL FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,
67 $ TSTERR, CORDER, RORDER
68 CHARACTER*1 TRANSA, TRANSB
72 COMPLEX*16 AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ),
73 $ ALF( NALMAX ), AS( NMAX*NMAX ),
74 $ BB( NMAX*NMAX ), BET( NBEMAX ),
75 $ BS( NMAX*NMAX ), C( NMAX, NMAX ),
76 $ CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),
78 DOUBLE PRECISION G( NMAX )
79 INTEGER IDIM( NIDMAX )
80 LOGICAL LTEST( NSUBS )
81 CHARACTER*12 SNAMES( NSUBS )
82 * .. External Functions ..
83 DOUBLE PRECISION DDIFF
86 * .. External Subroutines ..
87 EXTERNAL ZCHK1, ZCHK2, ZCHK3, ZCHK4, ZCHK5,ZMMCH
88 * .. Intrinsic Functions ..
90 * .. Scalars in Common ..
95 COMMON /INFOC/INFOT, NOUTC, OK, LERR
97 * .. Data statements ..
98 DATA SNAMES/'cblas_zgemm ', 'cblas_zhemm ',
99 $ 'cblas_zsymm ', 'cblas_ztrmm ', 'cblas_ztrsm ',
100 $ 'cblas_zherk ', 'cblas_zsyrk ', 'cblas_zher2k',
102 * .. Executable Statements ..
106 * Read name and unit number for snapshot output file and open file.
108 READ( NIN, FMT = * )SNAPS
109 READ( NIN, FMT = * )NTRA
112 OPEN( NTRA, FILE = SNAPS, STATUS = 'NEW' )
114 * Read the flag that directs rewinding of the snapshot file.
115 READ( NIN, FMT = * )REWI
116 REWI = REWI.AND.TRACE
117 * Read the flag that directs stopping on any failure.
118 READ( NIN, FMT = * )SFATAL
119 * Read the flag that indicates whether error exits are to be tested.
120 READ( NIN, FMT = * )TSTERR
121 * Read the flag that indicates whether row-major data layout to be tested.
122 READ( NIN, FMT = * )LAYOUT
123 * Read the threshold value of the test ratio
124 READ( NIN, FMT = * )THRESH
126 * Read and check the parameter values for the tests.
129 READ( NIN, FMT = * )NIDIM
130 IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN
131 WRITE( NOUT, FMT = 9997 )'N', NIDMAX
134 READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )
136 IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN
137 WRITE( NOUT, FMT = 9996 )NMAX
142 READ( NIN, FMT = * )NALF
143 IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN
144 WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX
147 READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )
149 READ( NIN, FMT = * )NBET
150 IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN
151 WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX
154 READ( NIN, FMT = * )( BET( I ), I = 1, NBET )
156 * Report values of parameters.
158 WRITE( NOUT, FMT = 9995 )
159 WRITE( NOUT, FMT = 9994 )( IDIM( I ), I = 1, NIDIM )
160 WRITE( NOUT, FMT = 9993 )( ALF( I ), I = 1, NALF )
161 WRITE( NOUT, FMT = 9992 )( BET( I ), I = 1, NBET )
162 IF( .NOT.TSTERR )THEN
163 WRITE( NOUT, FMT = * )
164 WRITE( NOUT, FMT = 9984 )
166 WRITE( NOUT, FMT = * )
167 WRITE( NOUT, FMT = 9999 )THRESH
168 WRITE( NOUT, FMT = * )
172 IF (LAYOUT.EQ.2) THEN
175 WRITE( *, FMT = 10002 )
176 ELSE IF (LAYOUT.EQ.1) THEN
178 WRITE( *, FMT = 10001 )
179 ELSE IF (LAYOUT.EQ.0) THEN
181 WRITE( *, FMT = 10000 )
186 * Read names of subroutines and flags which indicate
187 * whether they are to be tested.
192 30 READ( NIN, FMT = 9988, END = 60 )SNAMET, LTESTT
194 IF( SNAMET.EQ.SNAMES( I ) )
197 WRITE( NOUT, FMT = 9990 )SNAMET
199 50 LTEST( I ) = LTESTT
205 * Compute EPS (the machine precision).
209 IF( DDIFF( RONE + EPS, RONE ).EQ.RZERO )
215 WRITE( NOUT, FMT = 9998 )EPS
217 * Check the reliability of ZMMCH using exact data.
222 AB( I, J ) = MAX( I - J + 1, 0 )
224 AB( J, NMAX + 1 ) = J
225 AB( 1, NMAX + J ) = J
229 CC( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3
231 * CC holds the exact result. On exit from ZMMCH CT holds
232 * the result computed by ZMMCH.
235 CALL ZMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
236 $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
237 $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
238 SAME = LZE( CC, CT, N )
239 IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
240 WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
244 CALL ZMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
245 $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
246 $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
247 SAME = LZE( CC, CT, N )
248 IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
249 WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
253 AB( J, NMAX + 1 ) = N - J + 1
254 AB( 1, NMAX + J ) = N - J + 1
257 CC( N - J + 1 ) = J*( ( J + 1 )*J )/2 -
258 $ ( ( J + 1 )*J*( J - 1 ) )/3
262 CALL ZMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
263 $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
264 $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
265 SAME = LZE( CC, CT, N )
266 IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
267 WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
271 CALL ZMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
272 $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
273 $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
274 SAME = LZE( CC, CT, N )
275 IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
276 WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
280 * Test each subroutine in turn.
282 DO 200 ISNUM = 1, NSUBS
283 WRITE( NOUT, FMT = * )
284 IF( .NOT.LTEST( ISNUM ) )THEN
285 * Subprogram is not to be tested.
286 WRITE( NOUT, FMT = 9987 )SNAMES( ISNUM )
288 SRNAMT = SNAMES( ISNUM )
291 CALL CZ3CHKE( SNAMES( ISNUM ) )
292 WRITE( NOUT, FMT = * )
298 GO TO ( 140, 150, 150, 160, 160, 170, 170,
302 CALL ZCHK1(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
303 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
304 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
308 CALL ZCHK1(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
309 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
310 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
314 * Test ZHEMM, 02, ZSYMM, 03.
316 CALL ZCHK2(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
317 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
318 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
322 CALL ZCHK2(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
323 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
324 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
328 * Test ZTRMM, 04, ZTRSM, 05.
330 CALL ZCHK3(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
331 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB,
332 $ AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C,
336 CALL ZCHK3(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
337 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB,
338 $ AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C,
342 * Test ZHERK, 06, ZSYRK, 07.
344 CALL ZCHK4(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
345 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
346 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
350 CALL ZCHK4(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
351 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
352 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
356 * Test ZHER2K, 08, ZSYR2K, 09.
358 CALL ZCHK5(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
359 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
360 $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W,
364 CALL ZCHK5(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
365 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
366 $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W,
371 190 IF( FATAL.AND.SFATAL )
375 WRITE( NOUT, FMT = 9986 )
379 WRITE( NOUT, FMT = 9985 )
383 WRITE( NOUT, FMT = 9991 )
391 10002 FORMAT( ' COLUMN-MAJOR AND ROW-MAJOR DATA LAYOUTS ARE TESTED' )
392 10001 FORMAT(' ROW-MAJOR DATA LAYOUT IS TESTED' )
393 10000 FORMAT(' COLUMN-MAJOR DATA LAYOUT IS TESTED' )
394 9999 FORMAT(' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',
396 9998 FORMAT(' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, E9.1 )
397 9997 FORMAT(' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',
399 9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )
400 9995 FORMAT('TESTS OF THE COMPLEX*16 LEVEL 3 BLAS', //' THE F',
401 $ 'OLLOWING PARAMETER VALUES WILL BE USED:' )
402 9994 FORMAT( ' FOR N ', 9I6 )
403 9993 FORMAT( ' FOR ALPHA ',
404 $ 7( '(', F4.1, ',', F4.1, ') ', : ) )
405 9992 FORMAT( ' FOR BETA ',
406 $ 7( '(', F4.1, ',', F4.1, ') ', : ) )
407 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',
408 $ /' ******* TESTS ABANDONED *******' )
409 9990 FORMAT(' SUBPROGRAM NAME ', A12,' NOT RECOGNIZED', /' ******* T',
410 $ 'ESTS ABANDONED *******' )
411 9989 FORMAT(' ERROR IN ZMMCH - IN-LINE DOT PRODUCTS ARE BEING EVALU',
412 $ 'ATED WRONGLY.', /' ZMMCH WAS CALLED WITH TRANSA = ', A1,
413 $ 'AND TRANSB = ', A1, /' AND RETURNED SAME = ', L1, ' AND ',
414 $ ' ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ',
415 $ 'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ',
417 9988 FORMAT( A12,L2 )
418 9987 FORMAT( 1X, A12,' WAS NOT TESTED' )
419 9986 FORMAT( /' END OF TESTS' )
420 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )
421 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )
426 SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
427 $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
428 $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G,
433 * Auxiliary routine for test program for Level 3 Blas.
435 * -- Written on 8-February-1989.
436 * Jack Dongarra, Argonne National Laboratory.
437 * Iain Duff, AERE Harwell.
438 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
439 * Sven Hammarling, Numerical Algorithms Group Ltd.
443 PARAMETER ( ZERO = ( 0.0, 0.0 ) )
444 DOUBLE PRECISION RZERO
445 PARAMETER ( RZERO = 0.0 )
446 * .. Scalar Arguments ..
447 DOUBLE PRECISION EPS, THRESH
448 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
449 LOGICAL FATAL, REWI, TRACE
451 * .. Array Arguments ..
452 COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
453 $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
454 $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
455 $ C( NMAX, NMAX ), CC( NMAX*NMAX ),
456 $ CS( NMAX*NMAX ), CT( NMAX )
457 DOUBLE PRECISION G( NMAX )
458 INTEGER IDIM( NIDIM )
459 * .. Local Scalars ..
460 COMPLEX*16 ALPHA, ALS, BETA, BLS
461 DOUBLE PRECISION ERR, ERRMAX
462 INTEGER I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA,
463 $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, M,
464 $ MA, MB, MS, N, NA, NARGS, NB, NC, NS
465 LOGICAL NULL, RESET, SAME, TRANA, TRANB
466 CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB
470 * .. External Functions ..
473 * .. External Subroutines ..
474 EXTERNAL CZGEMM, ZMAKE, ZMMCH
475 * .. Intrinsic Functions ..
477 * .. Scalars in Common ..
480 * .. Common blocks ..
481 COMMON /INFOC/INFOT, NOUTC, OK, LERR
482 * .. Data statements ..
484 * .. Executable Statements ..
496 * Set LDC to 1 more than minimum value if room.
500 * Skip tests if not enough room.
504 NULL = N.LE.0.OR.M.LE.0
510 TRANSA = ICH( ICA: ICA )
511 TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'
520 * Set LDA to 1 more than minimum value if room.
524 * Skip tests if not enough room.
529 * Generate the matrix A.
531 CALL ZMAKE( 'ge', ' ', ' ', MA, NA, A, NMAX, AA, LDA,
535 TRANSB = ICH( ICB: ICB )
536 TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'
545 * Set LDB to 1 more than minimum value if room.
549 * Skip tests if not enough room.
554 * Generate the matrix B.
556 CALL ZMAKE( 'ge', ' ', ' ', MB, NB, B, NMAX, BB,
565 * Generate the matrix C.
567 CALL ZMAKE( 'ge', ' ', ' ', M, N, C, NMAX,
568 $ CC, LDC, RESET, ZERO )
572 * Save every datum before calling the
595 * Call the subroutine.
598 $ CALL ZPRCN1(NTRA, NC, SNAME, IORDER,
599 $ TRANSA, TRANSB, M, N, K, ALPHA, LDA,
603 CALL CZGEMM( IORDER, TRANSA, TRANSB, M, N,
604 $ K, ALPHA, AA, LDA, BB, LDB,
607 * Check if error-exit was taken incorrectly.
610 WRITE( NOUT, FMT = 9994 )
615 * See what data changed inside subroutines.
617 ISAME( 1 ) = TRANSA.EQ.TRANAS
618 ISAME( 2 ) = TRANSB.EQ.TRANBS
622 ISAME( 6 ) = ALS.EQ.ALPHA
623 ISAME( 7 ) = LZE( AS, AA, LAA )
624 ISAME( 8 ) = LDAS.EQ.LDA
625 ISAME( 9 ) = LZE( BS, BB, LBB )
626 ISAME( 10 ) = LDBS.EQ.LDB
627 ISAME( 11 ) = BLS.EQ.BETA
629 ISAME( 12 ) = LZE( CS, CC, LCC )
631 ISAME( 12 ) = LZERES( 'ge', ' ', M, N, CS,
634 ISAME( 13 ) = LDCS.EQ.LDC
636 * If data was incorrectly changed, report
641 SAME = SAME.AND.ISAME( I )
642 IF( .NOT.ISAME( I ) )
643 $ WRITE( NOUT, FMT = 9998 )I
654 CALL ZMMCH( TRANSA, TRANSB, M, N, K,
655 $ ALPHA, A, NMAX, B, NMAX, BETA,
656 $ C, NMAX, CT, G, CC, LDC, EPS,
657 $ ERR, FATAL, NOUT, .TRUE. )
658 ERRMAX = MAX( ERRMAX, ERR )
659 * If got really bad answer, report and
681 IF( ERRMAX.LT.THRESH )THEN
682 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
683 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
685 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
686 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
691 WRITE( NOUT, FMT = 9996 )SNAME
692 CALL ZPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB,
693 $ M, N, K, ALPHA, LDA, LDB, BETA, LDC)
698 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
699 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
700 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
701 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
702 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
703 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
704 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
705 $ ' (', I6, ' CALL', 'S)' )
706 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
707 $ ' (', I6, ' CALL', 'S)' )
708 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
709 $ 'ANGED INCORRECTLY *******' )
710 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
711 9995 FORMAT( 1X, I6, ': ', A12,'(''', A1, ''',''', A1, ''',',
712 $ 3( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3,
713 $ ',(', F4.1, ',', F4.1, '), C,', I3, ').' )
714 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
721 SUBROUTINE ZPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB, M, N,
722 $ K, ALPHA, LDA, LDB, BETA, LDC)
723 INTEGER NOUT, NC, IORDER, M, N, K, LDA, LDB, LDC
724 DOUBLE COMPLEX ALPHA, BETA
725 CHARACTER*1 TRANSA, TRANSB
727 CHARACTER*14 CRC, CTA,CTB
729 IF (TRANSA.EQ.'N')THEN
730 CTA = ' CblasNoTrans'
731 ELSE IF (TRANSA.EQ.'T')THEN
734 CTA = 'CblasConjTrans'
736 IF (TRANSB.EQ.'N')THEN
737 CTB = ' CblasNoTrans'
738 ELSE IF (TRANSB.EQ.'T')THEN
741 CTB = 'CblasConjTrans'
744 CRC = ' CblasRowMajor'
746 CRC = ' CblasColMajor'
748 WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CTA,CTB
749 WRITE(NOUT, FMT = 9994)M, N, K, ALPHA, LDA, LDB, BETA, LDC
751 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',')
752 9994 FORMAT( 10X, 3( I3, ',' ) ,' (', F4.1,',',F4.1,') , A,',
753 $ I3, ', B,', I3, ', (', F4.1,',',F4.1,') , C,', I3, ').' )
756 SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
757 $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
758 $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G,
761 * Tests ZHEMM and ZSYMM.
763 * Auxiliary routine for test program for Level 3 Blas.
765 * -- Written on 8-February-1989.
766 * Jack Dongarra, Argonne National Laboratory.
767 * Iain Duff, AERE Harwell.
768 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
769 * Sven Hammarling, Numerical Algorithms Group Ltd.
773 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ) )
774 DOUBLE PRECISION RZERO
775 PARAMETER ( RZERO = 0.0D0 )
776 * .. Scalar Arguments ..
777 DOUBLE PRECISION EPS, THRESH
778 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
779 LOGICAL FATAL, REWI, TRACE
781 * .. Array Arguments ..
782 COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
783 $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
784 $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
785 $ C( NMAX, NMAX ), CC( NMAX*NMAX ),
786 $ CS( NMAX*NMAX ), CT( NMAX )
787 DOUBLE PRECISION G( NMAX )
788 INTEGER IDIM( NIDIM )
789 * .. Local Scalars ..
790 COMPLEX*16 ALPHA, ALS, BETA, BLS
791 DOUBLE PRECISION ERR, ERRMAX
792 INTEGER I, IA, IB, ICS, ICU, IM, IN, LAA, LBB, LCC,
793 $ LDA, LDAS, LDB, LDBS, LDC, LDCS, M, MS, N, NA,
795 LOGICAL CONJ, LEFT, NULL, RESET, SAME
796 CHARACTER*1 SIDE, SIDES, UPLO, UPLOS
797 CHARACTER*2 ICHS, ICHU
800 * .. External Functions ..
803 * .. External Subroutines ..
804 EXTERNAL CZHEMM, ZMAKE, ZMMCH, CZSYMM
805 * .. Intrinsic Functions ..
807 * .. Scalars in Common ..
810 * .. Common blocks ..
811 COMMON /INFOC/INFOT, NOUTC, OK, LERR
812 * .. Data statements ..
813 DATA ICHS/'LR'/, ICHU/'UL'/
814 * .. Executable Statements ..
815 CONJ = SNAME( 8: 9 ).EQ.'he'
827 * Set LDC to 1 more than minimum value if room.
831 * Skip tests if not enough room.
835 NULL = N.LE.0.OR.M.LE.0
836 * Set LDB to 1 more than minimum value if room.
840 * Skip tests if not enough room.
845 * Generate the matrix B.
847 CALL ZMAKE( 'ge', ' ', ' ', M, N, B, NMAX, BB, LDB, RESET,
851 SIDE = ICHS( ICS: ICS )
859 * Set LDA to 1 more than minimum value if room.
863 * Skip tests if not enough room.
869 UPLO = ICHU( ICU: ICU )
871 * Generate the hermitian or symmetric matrix A.
873 CALL ZMAKE(SNAME( 8: 9 ), UPLO, ' ', NA, NA, A, NMAX,
874 $ AA, LDA, RESET, ZERO )
882 * Generate the matrix C.
884 CALL ZMAKE( 'ge', ' ', ' ', M, N, C, NMAX, CC,
889 * Save every datum before calling the
911 * Call the subroutine.
914 $ CALL ZPRCN2(NTRA, NC, SNAME, IORDER,
915 $ SIDE, UPLO, M, N, ALPHA, LDA, LDB,
920 CALL CZHEMM( IORDER, SIDE, UPLO, M, N,
921 $ ALPHA, AA, LDA, BB, LDB, BETA,
924 CALL CZSYMM( IORDER, SIDE, UPLO, M, N,
925 $ ALPHA, AA, LDA, BB, LDB, BETA,
929 * Check if error-exit was taken incorrectly.
932 WRITE( NOUT, FMT = 9994 )
937 * See what data changed inside subroutines.
939 ISAME( 1 ) = SIDES.EQ.SIDE
940 ISAME( 2 ) = UPLOS.EQ.UPLO
943 ISAME( 5 ) = ALS.EQ.ALPHA
944 ISAME( 6 ) = LZE( AS, AA, LAA )
945 ISAME( 7 ) = LDAS.EQ.LDA
946 ISAME( 8 ) = LZE( BS, BB, LBB )
947 ISAME( 9 ) = LDBS.EQ.LDB
948 ISAME( 10 ) = BLS.EQ.BETA
950 ISAME( 11 ) = LZE( CS, CC, LCC )
952 ISAME( 11 ) = LZERES( 'ge', ' ', M, N, CS,
955 ISAME( 12 ) = LDCS.EQ.LDC
957 * If data was incorrectly changed, report and
962 SAME = SAME.AND.ISAME( I )
963 IF( .NOT.ISAME( I ) )
964 $ WRITE( NOUT, FMT = 9998 )I
976 CALL ZMMCH( 'N', 'N', M, N, M, ALPHA, A,
977 $ NMAX, B, NMAX, BETA, C, NMAX,
978 $ CT, G, CC, LDC, EPS, ERR,
979 $ FATAL, NOUT, .TRUE. )
981 CALL ZMMCH( 'N', 'N', M, N, N, ALPHA, B,
982 $ NMAX, A, NMAX, BETA, C, NMAX,
983 $ CT, G, CC, LDC, EPS, ERR,
984 $ FATAL, NOUT, .TRUE. )
986 ERRMAX = MAX( ERRMAX, ERR )
987 * If got really bad answer, report and
1007 IF( ERRMAX.LT.THRESH )THEN
1008 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
1009 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
1011 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
1012 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
1017 WRITE( NOUT, FMT = 9996 )SNAME
1018 CALL ZPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N, ALPHA, LDA,
1024 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
1025 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1026 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
1027 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
1028 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1029 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
1030 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
1031 $ ' (', I6, ' CALL', 'S)' )
1032 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
1033 $ ' (', I6, ' CALL', 'S)' )
1034 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
1035 $ 'ANGED INCORRECTLY *******' )
1036 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
1037 9995 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
1038 $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1,
1039 $ ',', F4.1, '), C,', I3, ') .' )
1040 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
1047 SUBROUTINE ZPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N,
1048 $ ALPHA, LDA, LDB, BETA, LDC)
1049 INTEGER NOUT, NC, IORDER, M, N, LDA, LDB, LDC
1050 DOUBLE COMPLEX ALPHA, BETA
1051 CHARACTER*1 SIDE, UPLO
1053 CHARACTER*14 CRC, CS,CU
1055 IF (SIDE.EQ.'L')THEN
1060 IF (UPLO.EQ.'U')THEN
1065 IF (IORDER.EQ.1)THEN
1066 CRC = ' CblasRowMajor'
1068 CRC = ' CblasColMajor'
1070 WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU
1071 WRITE(NOUT, FMT = 9994)M, N, ALPHA, LDA, LDB, BETA, LDC
1073 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',')
1074 9994 FORMAT( 10X, 2( I3, ',' ),' (',F4.1,',',F4.1, '), A,', I3,
1075 $ ', B,', I3, ', (',F4.1,',',F4.1, '), ', 'C,', I3, ').' )
1078 SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
1079 $ FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS,
1080 $ B, BB, BS, CT, G, C, IORDER )
1082 * Tests ZTRMM and ZTRSM.
1084 * Auxiliary routine for test program for Level 3 Blas.
1086 * -- Written on 8-February-1989.
1087 * Jack Dongarra, Argonne National Laboratory.
1088 * Iain Duff, AERE Harwell.
1089 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
1090 * Sven Hammarling, Numerical Algorithms Group Ltd.
1093 COMPLEX*16 ZERO, ONE
1094 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ), ONE = ( 1.0D0, 0.0D0 ) )
1095 DOUBLE PRECISION RZERO
1096 PARAMETER ( RZERO = 0.0D0 )
1097 * .. Scalar Arguments ..
1098 DOUBLE PRECISION EPS, THRESH
1099 INTEGER NALF, NIDIM, NMAX, NOUT, NTRA, IORDER
1100 LOGICAL FATAL, REWI, TRACE
1102 * .. Array Arguments ..
1103 COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
1104 $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
1105 $ BB( NMAX*NMAX ), BS( NMAX*NMAX ),
1106 $ C( NMAX, NMAX ), CT( NMAX )
1107 DOUBLE PRECISION G( NMAX )
1108 INTEGER IDIM( NIDIM )
1109 * .. Local Scalars ..
1110 COMPLEX*16 ALPHA, ALS
1111 DOUBLE PRECISION ERR, ERRMAX
1112 INTEGER I, IA, ICD, ICS, ICT, ICU, IM, IN, J, LAA, LBB,
1113 $ LDA, LDAS, LDB, LDBS, M, MS, N, NA, NARGS, NC,
1115 LOGICAL LEFT, NULL, RESET, SAME
1116 CHARACTER*1 DIAG, DIAGS, SIDE, SIDES, TRANAS, TRANSA, UPLO,
1118 CHARACTER*2 ICHD, ICHS, ICHU
1120 * .. Local Arrays ..
1122 * .. External Functions ..
1124 EXTERNAL LZE, LZERES
1125 * .. External Subroutines ..
1126 EXTERNAL ZMAKE, ZMMCH, CZTRMM, CZTRSM
1127 * .. Intrinsic Functions ..
1129 * .. Scalars in Common ..
1130 INTEGER INFOT, NOUTC
1132 * .. Common blocks ..
1133 COMMON /INFOC/INFOT, NOUTC, OK, LERR
1134 * .. Data statements ..
1135 DATA ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/, ICHS/'LR'/
1136 * .. Executable Statements ..
1142 * Set up zero matrix for ZMMCH.
1149 DO 140 IM = 1, NIDIM
1152 DO 130 IN = 1, NIDIM
1154 * Set LDB to 1 more than minimum value if room.
1158 * Skip tests if not enough room.
1162 NULL = M.LE.0.OR.N.LE.0
1165 SIDE = ICHS( ICS: ICS )
1172 * Set LDA to 1 more than minimum value if room.
1176 * Skip tests if not enough room.
1182 UPLO = ICHU( ICU: ICU )
1185 TRANSA = ICHT( ICT: ICT )
1188 DIAG = ICHD( ICD: ICD )
1193 * Generate the matrix A.
1195 CALL ZMAKE( 'tr', UPLO, DIAG, NA, NA, A,
1196 $ NMAX, AA, LDA, RESET, ZERO )
1198 * Generate the matrix B.
1200 CALL ZMAKE( 'ge', ' ', ' ', M, N, B, NMAX,
1201 $ BB, LDB, RESET, ZERO )
1205 * Save every datum before calling the
1224 * Call the subroutine.
1226 IF( SNAME( 10: 11 ).EQ.'mm' )THEN
1228 $ CALL ZPRCN3( NTRA, NC, SNAME, IORDER,
1229 $ SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,
1233 CALL CZTRMM(IORDER, SIDE, UPLO, TRANSA,
1234 $ DIAG, M, N, ALPHA, AA, LDA,
1236 ELSE IF( SNAME( 10: 11 ).EQ.'sm' )THEN
1238 $ CALL ZPRCN3( NTRA, NC, SNAME, IORDER,
1239 $ SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,
1243 CALL CZTRSM(IORDER, SIDE, UPLO, TRANSA,
1244 $ DIAG, M, N, ALPHA, AA, LDA,
1248 * Check if error-exit was taken incorrectly.
1251 WRITE( NOUT, FMT = 9994 )
1256 * See what data changed inside subroutines.
1258 ISAME( 1 ) = SIDES.EQ.SIDE
1259 ISAME( 2 ) = UPLOS.EQ.UPLO
1260 ISAME( 3 ) = TRANAS.EQ.TRANSA
1261 ISAME( 4 ) = DIAGS.EQ.DIAG
1262 ISAME( 5 ) = MS.EQ.M
1263 ISAME( 6 ) = NS.EQ.N
1264 ISAME( 7 ) = ALS.EQ.ALPHA
1265 ISAME( 8 ) = LZE( AS, AA, LAA )
1266 ISAME( 9 ) = LDAS.EQ.LDA
1268 ISAME( 10 ) = LZE( BS, BB, LBB )
1270 ISAME( 10 ) = LZERES( 'ge', ' ', M, N, BS,
1273 ISAME( 11 ) = LDBS.EQ.LDB
1275 * If data was incorrectly changed, report and
1280 SAME = SAME.AND.ISAME( I )
1281 IF( .NOT.ISAME( I ) )
1282 $ WRITE( NOUT, FMT = 9998 )I
1290 IF( SNAME( 10: 11 ).EQ.'mm' )THEN
1295 CALL ZMMCH( TRANSA, 'N', M, N, M,
1296 $ ALPHA, A, NMAX, B, NMAX,
1297 $ ZERO, C, NMAX, CT, G,
1298 $ BB, LDB, EPS, ERR,
1299 $ FATAL, NOUT, .TRUE. )
1301 CALL ZMMCH( 'N', TRANSA, M, N, N,
1302 $ ALPHA, B, NMAX, A, NMAX,
1303 $ ZERO, C, NMAX, CT, G,
1304 $ BB, LDB, EPS, ERR,
1305 $ FATAL, NOUT, .TRUE. )
1307 ELSE IF( SNAME( 10: 11 ).EQ.'sm' )THEN
1309 * Compute approximation to original
1314 C( I, J ) = BB( I + ( J - 1 )*
1316 BB( I + ( J - 1 )*LDB ) = ALPHA*
1322 CALL ZMMCH( TRANSA, 'N', M, N, M,
1323 $ ONE, A, NMAX, C, NMAX,
1324 $ ZERO, B, NMAX, CT, G,
1325 $ BB, LDB, EPS, ERR,
1326 $ FATAL, NOUT, .FALSE. )
1328 CALL ZMMCH( 'N', TRANSA, M, N, N,
1329 $ ONE, C, NMAX, A, NMAX,
1330 $ ZERO, B, NMAX, CT, G,
1331 $ BB, LDB, EPS, ERR,
1332 $ FATAL, NOUT, .FALSE. )
1335 ERRMAX = MAX( ERRMAX, ERR )
1336 * If got really bad answer, report and
1358 IF( ERRMAX.LT.THRESH )THEN
1359 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
1360 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
1362 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
1363 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
1368 WRITE( NOUT, FMT = 9996 )SNAME
1369 CALL ZPRCN3( NTRA, NC, SNAME, IORDER, SIDE, UPLO, TRANSA, DIAG,
1370 $ M, N, ALPHA, LDA, LDB)
1375 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
1376 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1377 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
1378 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
1379 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1380 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
1381 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
1382 $ ' (', I6, ' CALL', 'S)' )
1383 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
1384 $ ' (', I6, ' CALL', 'S)' )
1385 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
1386 $ 'ANGED INCORRECTLY *******' )
1387 9996 FORMAT(' ******* ', A12,' FAILED ON CALL NUMBER:' )
1388 9995 FORMAT(1X, I6, ': ', A12,'(', 4( '''', A1, ''',' ), 2( I3, ',' ),
1389 $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ') ',
1391 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
1398 SUBROUTINE ZPRCN3(NOUT, NC, SNAME, IORDER, SIDE, UPLO, TRANSA,
1399 $ DIAG, M, N, ALPHA, LDA, LDB)
1400 INTEGER NOUT, NC, IORDER, M, N, LDA, LDB
1401 DOUBLE COMPLEX ALPHA
1402 CHARACTER*1 SIDE, UPLO, TRANSA, DIAG
1404 CHARACTER*14 CRC, CS, CU, CA, CD
1406 IF (SIDE.EQ.'L')THEN
1411 IF (UPLO.EQ.'U')THEN
1416 IF (TRANSA.EQ.'N')THEN
1417 CA = ' CblasNoTrans'
1418 ELSE IF (TRANSA.EQ.'T')THEN
1421 CA = 'CblasConjTrans'
1423 IF (DIAG.EQ.'N')THEN
1424 CD = ' CblasNonUnit'
1428 IF (IORDER.EQ.1)THEN
1429 CRC = ' CblasRowMajor'
1431 CRC = ' CblasColMajor'
1433 WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU
1434 WRITE(NOUT, FMT = 9994)CA, CD, M, N, ALPHA, LDA, LDB
1436 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',')
1437 9994 FORMAT( 10X, 2( A14, ',') , 2( I3, ',' ), ' (', F4.1, ',',
1438 $ F4.1, '), A,', I3, ', B,', I3, ').' )
1441 SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
1442 $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
1443 $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G,
1446 * Tests ZHERK and ZSYRK.
1448 * Auxiliary routine for test program for Level 3 Blas.
1450 * -- Written on 8-February-1989.
1451 * Jack Dongarra, Argonne National Laboratory.
1452 * Iain Duff, AERE Harwell.
1453 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
1454 * Sven Hammarling, Numerical Algorithms Group Ltd.
1458 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ) )
1459 DOUBLE PRECISION RONE, RZERO
1460 PARAMETER ( RONE = 1.0D0, RZERO = 0.0D0 )
1461 * .. Scalar Arguments ..
1462 DOUBLE PRECISION EPS, THRESH
1463 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
1464 LOGICAL FATAL, REWI, TRACE
1466 * .. Array Arguments ..
1467 COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
1468 $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
1469 $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
1470 $ C( NMAX, NMAX ), CC( NMAX*NMAX ),
1471 $ CS( NMAX*NMAX ), CT( NMAX )
1472 DOUBLE PRECISION G( NMAX )
1473 INTEGER IDIM( NIDIM )
1474 * .. Local Scalars ..
1475 COMPLEX*16 ALPHA, ALS, BETA, BETS
1476 DOUBLE PRECISION ERR, ERRMAX, RALPHA, RALS, RBETA, RBETS
1477 INTEGER I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, K, KS,
1478 $ LAA, LCC, LDA, LDAS, LDC, LDCS, LJ, MA, N, NA,
1480 LOGICAL CONJ, NULL, RESET, SAME, TRAN, UPPER
1481 CHARACTER*1 TRANS, TRANSS, TRANST, UPLO, UPLOS
1482 CHARACTER*2 ICHT, ICHU
1483 * .. Local Arrays ..
1485 * .. External Functions ..
1487 EXTERNAL LZE, LZERES
1488 * .. External Subroutines ..
1489 EXTERNAL CZHERK, ZMAKE, ZMMCH, CZSYRK
1490 * .. Intrinsic Functions ..
1491 INTRINSIC DCMPLX, MAX, DBLE
1492 * .. Scalars in Common ..
1493 INTEGER INFOT, NOUTC
1495 * .. Common blocks ..
1496 COMMON /INFOC/INFOT, NOUTC, OK, LERR
1497 * .. Data statements ..
1498 DATA ICHT/'NC'/, ICHU/'UL'/
1499 * .. Executable Statements ..
1500 CONJ = SNAME( 8: 9 ).EQ.'he'
1507 DO 100 IN = 1, NIDIM
1509 * Set LDC to 1 more than minimum value if room.
1513 * Skip tests if not enough room.
1522 TRANS = ICHT( ICT: ICT )
1524 IF( TRAN.AND..NOT.CONJ )
1533 * Set LDA to 1 more than minimum value if room.
1537 * Skip tests if not enough room.
1542 * Generate the matrix A.
1544 CALL ZMAKE( 'ge', ' ', ' ', MA, NA, A, NMAX, AA, LDA,
1548 UPLO = ICHU( ICU: ICU )
1554 RALPHA = DBLE( ALPHA )
1555 ALPHA = DCMPLX( RALPHA, RZERO )
1561 RBETA = DBLE( BETA )
1562 BETA = DCMPLX( RBETA, RZERO )
1566 $ NULL = NULL.OR.( ( K.LE.0.OR.RALPHA.EQ.
1567 $ RZERO ).AND.RBETA.EQ.RONE )
1569 * Generate the matrix C.
1571 CALL ZMAKE( SNAME( 8: 9 ), UPLO, ' ', N, N, C,
1572 $ NMAX, CC, LDC, RESET, ZERO )
1576 * Save every datum before calling the subroutine.
1601 * Call the subroutine.
1605 $ CALL ZPRCN6( NTRA, NC, SNAME, IORDER,
1606 $ UPLO, TRANS, N, K, RALPHA, LDA, RBETA,
1610 CALL CZHERK( IORDER, UPLO, TRANS, N, K,
1611 $ RALPHA, AA, LDA, RBETA, CC,
1615 $ CALL ZPRCN4( NTRA, NC, SNAME, IORDER,
1616 $ UPLO, TRANS, N, K, ALPHA, LDA, BETA, LDC)
1619 CALL CZSYRK( IORDER, UPLO, TRANS, N, K,
1620 $ ALPHA, AA, LDA, BETA, CC, LDC )
1623 * Check if error-exit was taken incorrectly.
1626 WRITE( NOUT, FMT = 9992 )
1631 * See what data changed inside subroutines.
1633 ISAME( 1 ) = UPLOS.EQ.UPLO
1634 ISAME( 2 ) = TRANSS.EQ.TRANS
1635 ISAME( 3 ) = NS.EQ.N
1636 ISAME( 4 ) = KS.EQ.K
1638 ISAME( 5 ) = RALS.EQ.RALPHA
1640 ISAME( 5 ) = ALS.EQ.ALPHA
1642 ISAME( 6 ) = LZE( AS, AA, LAA )
1643 ISAME( 7 ) = LDAS.EQ.LDA
1645 ISAME( 8 ) = RBETS.EQ.RBETA
1647 ISAME( 8 ) = BETS.EQ.BETA
1650 ISAME( 9 ) = LZE( CS, CC, LCC )
1652 ISAME( 9 ) = LZERES( SNAME( 8: 9 ), UPLO, N,
1655 ISAME( 10 ) = LDCS.EQ.LDC
1657 * If data was incorrectly changed, report and
1662 SAME = SAME.AND.ISAME( I )
1663 IF( .NOT.ISAME( I ) )
1664 $ WRITE( NOUT, FMT = 9998 )I
1673 * Check the result column by column.
1690 CALL ZMMCH( TRANST, 'N', LJ, 1, K,
1691 $ ALPHA, A( 1, JJ ), NMAX,
1692 $ A( 1, J ), NMAX, BETA,
1693 $ C( JJ, J ), NMAX, CT, G,
1694 $ CC( JC ), LDC, EPS, ERR,
1695 $ FATAL, NOUT, .TRUE. )
1697 CALL ZMMCH( 'N', TRANST, LJ, 1, K,
1698 $ ALPHA, A( JJ, 1 ), NMAX,
1699 $ A( J, 1 ), NMAX, BETA,
1700 $ C( JJ, J ), NMAX, CT, G,
1701 $ CC( JC ), LDC, EPS, ERR,
1702 $ FATAL, NOUT, .TRUE. )
1709 ERRMAX = MAX( ERRMAX, ERR )
1710 * If got really bad answer, report and
1731 IF( ERRMAX.LT.THRESH )THEN
1732 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
1733 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
1735 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
1736 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
1742 $ WRITE( NOUT, FMT = 9995 )J
1745 WRITE( NOUT, FMT = 9996 )SNAME
1747 CALL ZPRCN6( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K, RALPHA,
1750 CALL ZPRCN4( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K, ALPHA,
1757 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
1758 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1759 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
1760 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
1761 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1762 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
1763 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
1764 $ ' (', I6, ' CALL', 'S)' )
1765 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
1766 $ ' (', I6, ' CALL', 'S)' )
1767 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
1768 $ 'ANGED INCORRECTLY *******' )
1769 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
1770 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 )
1771 9994 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
1772 $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ') ',
1774 9993 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
1775 $ '(', F4.1, ',', F4.1, ') , A,', I3, ',(', F4.1, ',', F4.1,
1776 $ '), C,', I3, ') .' )
1777 9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
1784 SUBROUTINE ZPRCN4(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
1785 $ N, K, ALPHA, LDA, BETA, LDC)
1786 INTEGER NOUT, NC, IORDER, N, K, LDA, LDC
1787 DOUBLE COMPLEX ALPHA, BETA
1788 CHARACTER*1 UPLO, TRANSA
1790 CHARACTER*14 CRC, CU, CA
1792 IF (UPLO.EQ.'U')THEN
1797 IF (TRANSA.EQ.'N')THEN
1798 CA = ' CblasNoTrans'
1799 ELSE IF (TRANSA.EQ.'T')THEN
1802 CA = 'CblasConjTrans'
1804 IF (IORDER.EQ.1)THEN
1805 CRC = ' CblasRowMajor'
1807 CRC = ' CblasColMajor'
1809 WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
1810 WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, BETA, LDC
1812 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
1813 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1 ,'), A,',
1814 $ I3, ', (', F4.1,',', F4.1, '), C,', I3, ').' )
1818 SUBROUTINE ZPRCN6(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
1819 $ N, K, ALPHA, LDA, BETA, LDC)
1820 INTEGER NOUT, NC, IORDER, N, K, LDA, LDC
1821 DOUBLE PRECISION ALPHA, BETA
1822 CHARACTER*1 UPLO, TRANSA
1824 CHARACTER*14 CRC, CU, CA
1826 IF (UPLO.EQ.'U')THEN
1831 IF (TRANSA.EQ.'N')THEN
1832 CA = ' CblasNoTrans'
1833 ELSE IF (TRANSA.EQ.'T')THEN
1836 CA = 'CblasConjTrans'
1838 IF (IORDER.EQ.1)THEN
1839 CRC = ' CblasRowMajor'
1841 CRC = ' CblasColMajor'
1843 WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
1844 WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, BETA, LDC
1846 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
1847 9994 FORMAT( 10X, 2( I3, ',' ),
1848 $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ').' )
1851 SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
1852 $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
1853 $ AB, AA, AS, BB, BS, C, CC, CS, CT, G, W,
1856 * Tests ZHER2K and ZSYR2K.
1858 * Auxiliary routine for test program for Level 3 Blas.
1860 * -- Written on 8-February-1989.
1861 * Jack Dongarra, Argonne National Laboratory.
1862 * Iain Duff, AERE Harwell.
1863 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
1864 * Sven Hammarling, Numerical Algorithms Group Ltd.
1867 COMPLEX*16 ZERO, ONE
1868 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ), ONE = ( 1.0D0, 0.0D0 ) )
1869 DOUBLE PRECISION RONE, RZERO
1870 PARAMETER ( RONE = 1.0D0, RZERO = 0.0D0 )
1871 * .. Scalar Arguments ..
1872 DOUBLE PRECISION EPS, THRESH
1873 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
1874 LOGICAL FATAL, REWI, TRACE
1876 * .. Array Arguments ..
1877 COMPLEX*16 AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ),
1878 $ ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ),
1879 $ BET( NBET ), BS( NMAX*NMAX ), C( NMAX, NMAX ),
1880 $ CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),
1882 DOUBLE PRECISION G( NMAX )
1883 INTEGER IDIM( NIDIM )
1884 * .. Local Scalars ..
1885 COMPLEX*16 ALPHA, ALS, BETA, BETS
1886 DOUBLE PRECISION ERR, ERRMAX, RBETA, RBETS
1887 INTEGER I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, JJAB,
1888 $ K, KS, LAA, LBB, LCC, LDA, LDAS, LDB, LDBS,
1889 $ LDC, LDCS, LJ, MA, N, NA, NARGS, NC, NS
1890 LOGICAL CONJ, NULL, RESET, SAME, TRAN, UPPER
1891 CHARACTER*1 TRANS, TRANSS, TRANST, UPLO, UPLOS
1892 CHARACTER*2 ICHT, ICHU
1893 * .. Local Arrays ..
1895 * .. External Functions ..
1897 EXTERNAL LZE, LZERES
1898 * .. External Subroutines ..
1899 EXTERNAL CZHER2K, ZMAKE, ZMMCH, CZSYR2K
1900 * .. Intrinsic Functions ..
1901 INTRINSIC DCMPLX, DCONJG, MAX, DBLE
1902 * .. Scalars in Common ..
1903 INTEGER INFOT, NOUTC
1905 * .. Common blocks ..
1906 COMMON /INFOC/INFOT, NOUTC, OK, LERR
1907 * .. Data statements ..
1908 DATA ICHT/'NC'/, ICHU/'UL'/
1909 * .. Executable Statements ..
1910 CONJ = SNAME( 8: 9 ).EQ.'he'
1917 DO 130 IN = 1, NIDIM
1919 * Set LDC to 1 more than minimum value if room.
1923 * Skip tests if not enough room.
1928 DO 120 IK = 1, NIDIM
1932 TRANS = ICHT( ICT: ICT )
1934 IF( TRAN.AND..NOT.CONJ )
1943 * Set LDA to 1 more than minimum value if room.
1947 * Skip tests if not enough room.
1952 * Generate the matrix A.
1955 CALL ZMAKE( 'ge', ' ', ' ', MA, NA, AB, 2*NMAX, AA,
1956 $ LDA, RESET, ZERO )
1958 CALL ZMAKE( 'ge', ' ', ' ', MA, NA, AB, NMAX, AA, LDA,
1962 * Generate the matrix B.
1967 CALL ZMAKE( 'ge', ' ', ' ', MA, NA, AB( K + 1 ),
1968 $ 2*NMAX, BB, LDB, RESET, ZERO )
1970 CALL ZMAKE( 'ge', ' ', ' ', MA, NA, AB( K*NMAX + 1 ),
1971 $ NMAX, BB, LDB, RESET, ZERO )
1975 UPLO = ICHU( ICU: ICU )
1984 RBETA = DBLE( BETA )
1985 BETA = DCMPLX( RBETA, RZERO )
1989 $ NULL = NULL.OR.( ( K.LE.0.OR.ALPHA.EQ.
1990 $ ZERO ).AND.RBETA.EQ.RONE )
1992 * Generate the matrix C.
1994 CALL ZMAKE( SNAME( 8: 9 ), UPLO, ' ', N, N, C,
1995 $ NMAX, CC, LDC, RESET, ZERO )
1999 * Save every datum before calling the subroutine.
2024 * Call the subroutine.
2028 $ CALL ZPRCN7( NTRA, NC, SNAME, IORDER,
2029 $ UPLO, TRANS, N, K, ALPHA, LDA, LDB,
2033 CALL CZHER2K( IORDER, UPLO, TRANS, N, K,
2034 $ ALPHA, AA, LDA, BB, LDB, RBETA,
2038 $ CALL ZPRCN5( NTRA, NC, SNAME, IORDER,
2039 $ UPLO, TRANS, N, K, ALPHA, LDA, LDB,
2043 CALL CZSYR2K( IORDER, UPLO, TRANS, N, K,
2044 $ ALPHA, AA, LDA, BB, LDB, BETA,
2048 * Check if error-exit was taken incorrectly.
2051 WRITE( NOUT, FMT = 9992 )
2056 * See what data changed inside subroutines.
2058 ISAME( 1 ) = UPLOS.EQ.UPLO
2059 ISAME( 2 ) = TRANSS.EQ.TRANS
2060 ISAME( 3 ) = NS.EQ.N
2061 ISAME( 4 ) = KS.EQ.K
2062 ISAME( 5 ) = ALS.EQ.ALPHA
2063 ISAME( 6 ) = LZE( AS, AA, LAA )
2064 ISAME( 7 ) = LDAS.EQ.LDA
2065 ISAME( 8 ) = LZE( BS, BB, LBB )
2066 ISAME( 9 ) = LDBS.EQ.LDB
2068 ISAME( 10 ) = RBETS.EQ.RBETA
2070 ISAME( 10 ) = BETS.EQ.BETA
2073 ISAME( 11 ) = LZE( CS, CC, LCC )
2075 ISAME( 11 ) = LZERES( 'he', UPLO, N, N, CS,
2078 ISAME( 12 ) = LDCS.EQ.LDC
2080 * If data was incorrectly changed, report and
2085 SAME = SAME.AND.ISAME( I )
2086 IF( .NOT.ISAME( I ) )
2087 $ WRITE( NOUT, FMT = 9998 )I
2096 * Check the result column by column.
2115 W( I ) = ALPHA*AB( ( J - 1 )*2*
2118 W( K + I ) = DCONJG( ALPHA )*
2127 CALL ZMMCH( TRANST, 'N', LJ, 1, 2*K,
2128 $ ONE, AB( JJAB ), 2*NMAX, W,
2129 $ 2*NMAX, BETA, C( JJ, J ),
2130 $ NMAX, CT, G, CC( JC ), LDC,
2131 $ EPS, ERR, FATAL, NOUT,
2136 W( I ) = ALPHA*DCONJG( AB( ( K +
2137 $ I - 1 )*NMAX + J ) )
2138 W( K + I ) = DCONJG( ALPHA*
2139 $ AB( ( I - 1 )*NMAX +
2142 W( I ) = ALPHA*AB( ( K + I - 1 )*
2145 $ AB( ( I - 1 )*NMAX +
2149 CALL ZMMCH( 'N', 'N', LJ, 1, 2*K, ONE,
2150 $ AB( JJ ), NMAX, W, 2*NMAX,
2151 $ BETA, C( JJ, J ), NMAX, CT,
2152 $ G, CC( JC ), LDC, EPS, ERR,
2153 $ FATAL, NOUT, .TRUE. )
2160 $ JJAB = JJAB + 2*NMAX
2162 ERRMAX = MAX( ERRMAX, ERR )
2163 * If got really bad answer, report and
2184 IF( ERRMAX.LT.THRESH )THEN
2185 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
2186 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
2188 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
2189 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
2195 $ WRITE( NOUT, FMT = 9995 )J
2198 WRITE( NOUT, FMT = 9996 )SNAME
2200 CALL ZPRCN7( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K,
2201 $ ALPHA, LDA, LDB, RBETA, LDC)
2203 CALL ZPRCN5( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K,
2204 $ ALPHA, LDA, LDB, BETA, LDC)
2210 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
2211 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
2212 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
2213 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
2214 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
2215 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
2216 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
2217 $ ' (', I6, ' CALL', 'S)' )
2218 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
2219 $ ' (', I6, ' CALL', 'S)' )
2220 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
2221 $ 'ANGED INCORRECTLY *******' )
2222 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
2223 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 )
2224 9994 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
2225 $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',', F4.1,
2226 $ ', C,', I3, ') .' )
2227 9993 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
2228 $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1,
2229 $ ',', F4.1, '), C,', I3, ') .' )
2230 9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
2237 SUBROUTINE ZPRCN5(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
2238 $ N, K, ALPHA, LDA, LDB, BETA, LDC)
2239 INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC
2240 DOUBLE COMPLEX ALPHA, BETA
2241 CHARACTER*1 UPLO, TRANSA
2243 CHARACTER*14 CRC, CU, CA
2245 IF (UPLO.EQ.'U')THEN
2250 IF (TRANSA.EQ.'N')THEN
2251 CA = ' CblasNoTrans'
2252 ELSE IF (TRANSA.EQ.'T')THEN
2255 CA = 'CblasConjTrans'
2257 IF (IORDER.EQ.1)THEN
2258 CRC = ' CblasRowMajor'
2260 CRC = ' CblasColMajor'
2262 WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
2263 WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC
2265 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
2266 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1, '), A,',
2267 $ I3, ', B', I3, ', (', F4.1, ',', F4.1, '), C,', I3, ').' )
2271 SUBROUTINE ZPRCN7(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
2272 $ N, K, ALPHA, LDA, LDB, BETA, LDC)
2273 INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC
2274 DOUBLE COMPLEX ALPHA
2275 DOUBLE PRECISION BETA
2276 CHARACTER*1 UPLO, TRANSA
2278 CHARACTER*14 CRC, CU, CA
2280 IF (UPLO.EQ.'U')THEN
2285 IF (TRANSA.EQ.'N')THEN
2286 CA = ' CblasNoTrans'
2287 ELSE IF (TRANSA.EQ.'T')THEN
2290 CA = 'CblasConjTrans'
2292 IF (IORDER.EQ.1)THEN
2293 CRC = ' CblasRowMajor'
2295 CRC = ' CblasColMajor'
2297 WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
2298 WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC
2300 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
2301 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1, '), A,',
2302 $ I3, ', B', I3, ',', F4.1, ', C,', I3, ').' )
2305 SUBROUTINE ZMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET,
2308 * Generates values for an M by N matrix A.
2309 * Stores the values in the array AA in the data structure required
2310 * by the routine, with unwanted elements set to rogue value.
2312 * TYPE is 'ge', 'he', 'sy' or 'tr'.
2314 * Auxiliary routine for test program for Level 3 Blas.
2316 * -- Written on 8-February-1989.
2317 * Jack Dongarra, Argonne National Laboratory.
2318 * Iain Duff, AERE Harwell.
2319 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
2320 * Sven Hammarling, Numerical Algorithms Group Ltd.
2323 COMPLEX*16 ZERO, ONE
2324 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ),
2325 $ ONE = ( 1.0D0, 0.0D0 ) )
2327 PARAMETER ( ROGUE = ( -1.0D10, 1.0D10 ) )
2328 DOUBLE PRECISION RZERO
2329 PARAMETER ( RZERO = 0.0D0 )
2330 DOUBLE PRECISION RROGUE
2331 PARAMETER ( RROGUE = -1.0D10 )
2332 * .. Scalar Arguments ..
2334 INTEGER LDA, M, N, NMAX
2336 CHARACTER*1 DIAG, UPLO
2338 * .. Array Arguments ..
2339 COMPLEX*16 A( NMAX, * ), AA( * )
2340 * .. Local Scalars ..
2341 INTEGER I, IBEG, IEND, J, JJ
2342 LOGICAL GEN, HER, LOWER, SYM, TRI, UNIT, UPPER
2343 * .. External Functions ..
2346 * .. Intrinsic Functions ..
2347 INTRINSIC DCMPLX, DCONJG, DBLE
2348 * .. Executable Statements ..
2353 UPPER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'U'
2354 LOWER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'L'
2355 UNIT = TRI.AND.DIAG.EQ.'U'
2357 * Generate data in array A.
2361 IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )
2363 A( I, J ) = ZBEG( RESET ) + TRANSL
2365 * Set some elements to zero
2366 IF( N.GT.3.AND.J.EQ.N/2 )
2369 A( J, I ) = DCONJG( A( I, J ) )
2371 A( J, I ) = A( I, J )
2379 $ A( J, J ) = DCMPLX( DBLE( A( J, J ) ), RZERO )
2381 $ A( J, J ) = A( J, J ) + ONE
2386 * Store elements in array AS in data structure required by routine.
2388 IF( TYPE.EQ.'ge' )THEN
2391 AA( I + ( J - 1 )*LDA ) = A( I, J )
2393 DO 40 I = M + 1, LDA
2394 AA( I + ( J - 1 )*LDA ) = ROGUE
2397 ELSE IF( TYPE.EQ.'he'.OR.TYPE.EQ.'sy'.OR.TYPE.EQ.'tr' )THEN
2414 DO 60 I = 1, IBEG - 1
2415 AA( I + ( J - 1 )*LDA ) = ROGUE
2417 DO 70 I = IBEG, IEND
2418 AA( I + ( J - 1 )*LDA ) = A( I, J )
2420 DO 80 I = IEND + 1, LDA
2421 AA( I + ( J - 1 )*LDA ) = ROGUE
2424 JJ = J + ( J - 1 )*LDA
2425 AA( JJ ) = DCMPLX( DBLE( AA( JJ ) ), RROGUE )
2434 SUBROUTINE ZMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB,
2435 $ BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL,
2438 * Checks the results of the computational tests.
2440 * Auxiliary routine for test program for Level 3 Blas.
2442 * -- Written on 8-February-1989.
2443 * Jack Dongarra, Argonne National Laboratory.
2444 * Iain Duff, AERE Harwell.
2445 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
2446 * Sven Hammarling, Numerical Algorithms Group Ltd.
2450 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ) )
2451 DOUBLE PRECISION RZERO, RONE
2452 PARAMETER ( RZERO = 0.0D0, RONE = 1.0D0 )
2453 * .. Scalar Arguments ..
2454 COMPLEX*16 ALPHA, BETA
2455 DOUBLE PRECISION EPS, ERR
2456 INTEGER KK, LDA, LDB, LDC, LDCC, M, N, NOUT
2458 CHARACTER*1 TRANSA, TRANSB
2459 * .. Array Arguments ..
2460 COMPLEX*16 A( LDA, * ), B( LDB, * ), C( LDC, * ),
2461 $ CC( LDCC, * ), CT( * )
2462 DOUBLE PRECISION G( * )
2463 * .. Local Scalars ..
2465 DOUBLE PRECISION ERRI
2467 LOGICAL CTRANA, CTRANB, TRANA, TRANB
2468 * .. Intrinsic Functions ..
2469 INTRINSIC ABS, DIMAG, DCONJG, MAX, DBLE, SQRT
2470 * .. Statement Functions ..
2471 DOUBLE PRECISION ABS1
2472 * .. Statement Function definitions ..
2473 ABS1( CL ) = ABS( DBLE( CL ) ) + ABS( DIMAG( CL ) )
2474 * .. Executable Statements ..
2475 TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'
2476 TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'
2477 CTRANA = TRANSA.EQ.'C'
2478 CTRANB = TRANSB.EQ.'C'
2480 * Compute expected result, one column at a time, in CT using data
2482 * Compute gauges in G.
2490 IF( .NOT.TRANA.AND..NOT.TRANB )THEN
2493 CT( I ) = CT( I ) + A( I, K )*B( K, J )
2494 G( I ) = G( I ) + ABS1( A( I, K ) )*ABS1( B( K, J ) )
2497 ELSE IF( TRANA.AND..NOT.TRANB )THEN
2501 CT( I ) = CT( I ) + DCONJG( A( K, I ) )*B( K, J )
2502 G( I ) = G( I ) + ABS1( A( K, I ) )*
2509 CT( I ) = CT( I ) + A( K, I )*B( K, J )
2510 G( I ) = G( I ) + ABS1( A( K, I ) )*
2515 ELSE IF( .NOT.TRANA.AND.TRANB )THEN
2519 CT( I ) = CT( I ) + A( I, K )*DCONJG( B( J, K ) )
2520 G( I ) = G( I ) + ABS1( A( I, K ) )*
2527 CT( I ) = CT( I ) + A( I, K )*B( J, K )
2528 G( I ) = G( I ) + ABS1( A( I, K ) )*
2533 ELSE IF( TRANA.AND.TRANB )THEN
2538 CT( I ) = CT( I ) + DCONJG( A( K, I ) )*
2539 $ DCONJG( B( J, K ) )
2540 G( I ) = G( I ) + ABS1( A( K, I ) )*
2547 CT( I ) = CT( I ) + DCONJG( A( K, I ) )*
2549 G( I ) = G( I ) + ABS1( A( K, I ) )*
2558 CT( I ) = CT( I ) + A( K, I )*
2559 $ DCONJG( B( J, K ) )
2560 G( I ) = G( I ) + ABS1( A( K, I ) )*
2567 CT( I ) = CT( I ) + A( K, I )*B( J, K )
2568 G( I ) = G( I ) + ABS1( A( K, I ) )*
2576 CT( I ) = ALPHA*CT( I ) + BETA*C( I, J )
2577 G( I ) = ABS1( ALPHA )*G( I ) +
2578 $ ABS1( BETA )*ABS1( C( I, J ) )
2581 * Compute the error ratio for this result.
2585 ERRI = ABS1( CT( I ) - CC( I, J ) )/EPS
2586 IF( G( I ).NE.RZERO )
2587 $ ERRI = ERRI/G( I )
2588 ERR = MAX( ERR, ERRI )
2589 IF( ERR*SQRT( EPS ).GE.RONE )
2595 * If the loop completes, all results are at least half accurate.
2598 * Report fatal error.
2601 WRITE( NOUT, FMT = 9999 )
2604 WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J )
2606 WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I )
2610 $ WRITE( NOUT, FMT = 9997 )J
2615 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
2616 $ 'F ACCURATE *******', /' EXPECTED RE',
2617 $ 'SULT COMPUTED RESULT' )
2618 9998 FORMAT( 1X, I7, 2( ' (', G15.6, ',', G15.6, ')' ) )
2619 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 )
2624 LOGICAL FUNCTION LZE( RI, RJ, LR )
2626 * Tests if two arrays are identical.
2628 * Auxiliary routine for test program for Level 3 Blas.
2630 * -- Written on 8-February-1989.
2631 * Jack Dongarra, Argonne National Laboratory.
2632 * Iain Duff, AERE Harwell.
2633 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
2634 * Sven Hammarling, Numerical Algorithms Group Ltd.
2636 * .. Scalar Arguments ..
2638 * .. Array Arguments ..
2639 COMPLEX*16 RI( * ), RJ( * )
2640 * .. Local Scalars ..
2642 * .. Executable Statements ..
2644 IF( RI( I ).NE.RJ( I ) )
2656 LOGICAL FUNCTION LZERES( TYPE, UPLO, M, N, AA, AS, LDA )
2658 * Tests if selected elements in two arrays are equal.
2660 * TYPE is 'ge' or 'he' or 'sy'.
2662 * Auxiliary routine for test program for Level 3 Blas.
2664 * -- Written on 8-February-1989.
2665 * Jack Dongarra, Argonne National Laboratory.
2666 * Iain Duff, AERE Harwell.
2667 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
2668 * Sven Hammarling, Numerical Algorithms Group Ltd.
2670 * .. Scalar Arguments ..
2674 * .. Array Arguments ..
2675 COMPLEX*16 AA( LDA, * ), AS( LDA, * )
2676 * .. Local Scalars ..
2677 INTEGER I, IBEG, IEND, J
2679 * .. Executable Statements ..
2681 IF( TYPE.EQ.'ge' )THEN
2683 DO 10 I = M + 1, LDA
2684 IF( AA( I, J ).NE.AS( I, J ) )
2688 ELSE IF( TYPE.EQ.'he'.OR.TYPE.EQ.'sy' )THEN
2697 DO 30 I = 1, IBEG - 1
2698 IF( AA( I, J ).NE.AS( I, J ) )
2701 DO 40 I = IEND + 1, LDA
2702 IF( AA( I, J ).NE.AS( I, J ) )
2718 COMPLEX*16 FUNCTION ZBEG( RESET )
2720 * Generates complex numbers as pairs of random numbers uniformly
2721 * distributed between -0.5 and 0.5.
2723 * Auxiliary routine for test program for Level 3 Blas.
2725 * -- Written on 8-February-1989.
2726 * Jack Dongarra, Argonne National Laboratory.
2727 * Iain Duff, AERE Harwell.
2728 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
2729 * Sven Hammarling, Numerical Algorithms Group Ltd.
2731 * .. Scalar Arguments ..
2733 * .. Local Scalars ..
2734 INTEGER I, IC, J, MI, MJ
2735 * .. Save statement ..
2736 SAVE I, IC, J, MI, MJ
2737 * .. Intrinsic Functions ..
2739 * .. Executable Statements ..
2741 * Initialize local variables.
2750 * The sequence of values of I or J is bounded between 1 and 999.
2751 * If initial I or J = 1,2,3,6,7 or 9, the period will be 50.
2752 * If initial I or J = 4 or 8, the period will be 25.
2753 * If initial I or J = 5, the period will be 10.
2754 * IC is used to break up the period by skipping 1 value of I or J
2760 I = I - 1000*( I/1000 )
2761 J = J - 1000*( J/1000 )
2766 ZBEG = DCMPLX( ( I - 500 )/1001.0D0, ( J - 500 )/1001.0D0 )
2772 DOUBLE PRECISION FUNCTION DDIFF( X, Y )
2774 * Auxiliary routine for test program for Level 3 Blas.
2776 * -- Written on 8-February-1989.
2777 * Jack Dongarra, Argonne National Laboratory.
2778 * Iain Duff, AERE Harwell.
2779 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
2780 * Sven Hammarling, Numerical Algorithms Group Ltd.
2782 * .. Scalar Arguments ..
2783 DOUBLE PRECISION X, Y
2784 * .. Executable Statements ..