3 * Test program for the COMPLEX 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 * cblas_cgemm T PUT F FOR NO TEST. SAME COLUMNS.
24 * cblas_chemm T PUT F FOR NO TEST. SAME COLUMNS.
25 * cblas_csymm T PUT F FOR NO TEST. SAME COLUMNS.
26 * cblas_ctrmm T PUT F FOR NO TEST. SAME COLUMNS.
27 * cblas_ctrsm T PUT F FOR NO TEST. SAME COLUMNS.
28 * cblas_cherk T PUT F FOR NO TEST. SAME COLUMNS.
29 * cblas_csyrk T PUT F FOR NO TEST. SAME COLUMNS.
30 * cblas_cher2k T PUT F FOR NO TEST. SAME COLUMNS.
31 * cblas_csyr2k 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.0, 0.0 ), ONE = ( 1.0, 0.0 ) )
55 REAL RZERO, RHALF, RONE
56 PARAMETER ( RZERO = 0.0, RHALF = 0.5, RONE = 1.0 )
58 PARAMETER ( NMAX = 65 )
59 INTEGER NIDMAX, NALMAX, NBEMAX
60 PARAMETER ( NIDMAX = 9, NALMAX = 7, NBEMAX = 7 )
63 INTEGER I, ISNUM, J, N, NALF, NBET, NIDIM, NTRA,
65 LOGICAL FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,
66 $ TSTERR, CORDER, RORDER
67 CHARACTER*1 TRANSA, TRANSB
71 COMPLEX AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ),
72 $ ALF( NALMAX ), AS( NMAX*NMAX ),
73 $ BB( NMAX*NMAX ), BET( NBEMAX ),
74 $ BS( NMAX*NMAX ), C( NMAX, NMAX ),
75 $ CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),
78 INTEGER IDIM( NIDMAX )
79 LOGICAL LTEST( NSUBS )
80 CHARACTER*12 SNAMES( NSUBS )
81 * .. External Functions ..
85 * .. External Subroutines ..
86 EXTERNAL CCHK1, CCHK2, CCHK3, CCHK4, CCHK5, CMMCH
87 * .. Intrinsic Functions ..
89 * .. Scalars in Common ..
94 COMMON /INFOC/INFOT, NOUTC, OK, LERR
96 * .. Data statements ..
97 DATA SNAMES/'cblas_cgemm ', 'cblas_chemm ',
98 $ 'cblas_csymm ', 'cblas_ctrmm ', 'cblas_ctrsm ',
99 $ 'cblas_cherk ', 'cblas_csyrk ', 'cblas_cher2k',
101 * .. Executable Statements ..
105 * Read name and unit number for snapshot output file and open file.
107 READ( NIN, FMT = * )SNAPS
108 READ( NIN, FMT = * )NTRA
111 OPEN( NTRA, FILE = SNAPS )
113 * Read the flag that directs rewinding of the snapshot file.
114 READ( NIN, FMT = * )REWI
115 REWI = REWI.AND.TRACE
116 * Read the flag that directs stopping on any failure.
117 READ( NIN, FMT = * )SFATAL
118 * Read the flag that indicates whether error exits are to be tested.
119 READ( NIN, FMT = * )TSTERR
120 * Read the flag that indicates whether row-major data layout to be tested.
121 READ( NIN, FMT = * )LAYOUT
122 * Read the threshold value of the test ratio
123 READ( NIN, FMT = * )THRESH
125 * Read and check the parameter values for the tests.
128 READ( NIN, FMT = * )NIDIM
129 IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN
130 WRITE( NOUT, FMT = 9997 )'N', NIDMAX
133 READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )
135 IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN
136 WRITE( NOUT, FMT = 9996 )NMAX
141 READ( NIN, FMT = * )NALF
142 IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN
143 WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX
146 READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )
148 READ( NIN, FMT = * )NBET
149 IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN
150 WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX
153 READ( NIN, FMT = * )( BET( I ), I = 1, NBET )
155 * Report values of parameters.
157 WRITE( NOUT, FMT = 9995 )
158 WRITE( NOUT, FMT = 9994 )( IDIM( I ), I = 1, NIDIM )
159 WRITE( NOUT, FMT = 9993 )( ALF( I ), I = 1, NALF )
160 WRITE( NOUT, FMT = 9992 )( BET( I ), I = 1, NBET )
161 IF( .NOT.TSTERR )THEN
162 WRITE( NOUT, FMT = * )
163 WRITE( NOUT, FMT = 9984 )
165 WRITE( NOUT, FMT = * )
166 WRITE( NOUT, FMT = 9999 )THRESH
167 WRITE( NOUT, FMT = * )
171 IF (LAYOUT.EQ.2) THEN
174 WRITE( *, FMT = 10002 )
175 ELSE IF (LAYOUT.EQ.1) THEN
177 WRITE( *, FMT = 10001 )
178 ELSE IF (LAYOUT.EQ.0) THEN
180 WRITE( *, FMT = 10000 )
185 * Read names of subroutines and flags which indicate
186 * whether they are to be tested.
191 30 READ( NIN, FMT = 9988, END = 60 )SNAMET, LTESTT
193 IF( SNAMET.EQ.SNAMES( I ) )
196 WRITE( NOUT, FMT = 9990 )SNAMET
198 50 LTEST( I ) = LTESTT
204 * Compute EPS (the machine precision).
208 IF( SDIFF( RONE + EPS, RONE ).EQ.RZERO )
214 WRITE( NOUT, FMT = 9998 )EPS
216 * Check the reliability of CMMCH using exact data.
221 AB( I, J ) = MAX( I - J + 1, 0 )
223 AB( J, NMAX + 1 ) = J
224 AB( 1, NMAX + J ) = J
228 CC( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3
230 * CC holds the exact result. On exit from CMMCH CT holds
231 * the result computed by CMMCH.
234 CALL CMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
235 $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
236 $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
237 SAME = LCE( CC, CT, N )
238 IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
239 WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
243 CALL CMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
244 $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
245 $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
246 SAME = LCE( CC, CT, N )
247 IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
248 WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
252 AB( J, NMAX + 1 ) = N - J + 1
253 AB( 1, NMAX + J ) = N - J + 1
256 CC( N - J + 1 ) = J*( ( J + 1 )*J )/2 -
257 $ ( ( J + 1 )*J*( J - 1 ) )/3
261 CALL CMMCH( 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 = LCE( CC, CT, N )
265 IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
266 WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
270 CALL CMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,
271 $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,
272 $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )
273 SAME = LCE( CC, CT, N )
274 IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
275 WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR
279 * Test each subroutine in turn.
281 DO 200 ISNUM = 1, NSUBS
282 WRITE( NOUT, FMT = * )
283 IF( .NOT.LTEST( ISNUM ) )THEN
284 * Subprogram is not to be tested.
285 WRITE( NOUT, FMT = 9987 )SNAMES( ISNUM )
287 SRNAMT = SNAMES( ISNUM )
290 CALL CC3CHKE( SNAMES( ISNUM ) )
291 WRITE( NOUT, FMT = * )
297 GO TO ( 140, 150, 150, 160, 160, 170, 170,
301 CALL CCHK1(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
302 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
303 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
307 CALL CCHK1(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
308 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
309 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
313 * Test CHEMM, 02, CSYMM, 03.
315 CALL CCHK2(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
316 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
317 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
321 CALL CCHK2(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
322 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
323 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
327 * Test CTRMM, 04, CTRSM, 05.
329 CALL CCHK3(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,
335 CALL CCHK3(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
336 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB,
337 $ AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C,
341 * Test CHERK, 06, CSYRK, 07.
343 CALL CCHK4(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
344 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
345 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
349 CALL CCHK4(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
350 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
351 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,
355 * Test CHER2K, 08, CSYR2K, 09.
357 CALL CCHK5(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
358 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
359 $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W,
363 CALL CCHK5(SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
364 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,
365 $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W,
370 190 IF( FATAL.AND.SFATAL )
374 WRITE( NOUT, FMT = 9986 )
378 WRITE( NOUT, FMT = 9985 )
382 WRITE( NOUT, FMT = 9991 )
390 10002 FORMAT( ' COLUMN-MAJOR AND ROW-MAJOR DATA LAYOUTS ARE TESTED' )
391 10001 FORMAT(' ROW-MAJOR DATA LAYOUT IS TESTED' )
392 10000 FORMAT(' COLUMN-MAJOR DATA LAYOUT IS TESTED' )
393 9999 FORMAT(' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',
395 9998 FORMAT(' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, E9.1 )
396 9997 FORMAT(' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',
398 9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )
399 9995 FORMAT(' TESTS OF THE COMPLEX LEVEL 3 BLAS', //' THE F',
400 $ 'OLLOWING PARAMETER VALUES WILL BE USED:' )
401 9994 FORMAT( ' FOR N ', 9I6 )
402 9993 FORMAT( ' FOR ALPHA ',
403 $ 7( '(', F4.1, ',', F4.1, ') ', : ) )
404 9992 FORMAT( ' FOR BETA ',
405 $ 7( '(', F4.1, ',', F4.1, ') ', : ) )
406 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',
407 $ /' ******* TESTS ABANDONED *******' )
408 9990 FORMAT(' SUBPROGRAM NAME ', A12,' NOT RECOGNIZED', /' ******* T',
409 $ 'ESTS ABANDONED *******' )
410 9989 FORMAT(' ERROR IN CMMCH - IN-LINE DOT PRODUCTS ARE BEING EVALU',
411 $ 'ATED WRONGLY.', /' CMMCH WAS CALLED WITH TRANSA = ', A1,
412 $ 'AND TRANSB = ', A1, /' AND RETURNED SAME = ', L1, ' AND ',
413 $ ' ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ',
414 $ 'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ',
416 9988 FORMAT( A12,L2 )
417 9987 FORMAT( 1X, A12,' WAS NOT TESTED' )
418 9986 FORMAT( /' END OF TESTS' )
419 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )
420 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )
425 SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
426 $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
427 $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G,
432 * Auxiliary routine for test program for Level 3 Blas.
434 * -- Written on 8-February-1989.
435 * Jack Dongarra, Argonne National Laboratory.
436 * Iain Duff, AERE Harwell.
437 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
438 * Sven Hammarling, Numerical Algorithms Group Ltd.
442 PARAMETER ( ZERO = ( 0.0, 0.0 ) )
444 PARAMETER ( RZERO = 0.0 )
445 * .. Scalar Arguments ..
447 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
448 LOGICAL FATAL, REWI, TRACE
450 * .. Array Arguments ..
451 COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
452 $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
453 $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
454 $ C( NMAX, NMAX ), CC( NMAX*NMAX ),
455 $ CS( NMAX*NMAX ), CT( NMAX )
457 INTEGER IDIM( NIDIM )
458 * .. Local Scalars ..
459 COMPLEX ALPHA, ALS, BETA, BLS
461 INTEGER I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA,
462 $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, M,
463 $ MA, MB, MS, N, NA, NARGS, NB, NC, NS
464 LOGICAL NULL, RESET, SAME, TRANA, TRANB
465 CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB
469 * .. External Functions ..
472 * .. External Subroutines ..
473 EXTERNAL CCGEMM, CMAKE, CMMCH
474 * .. Intrinsic Functions ..
476 * .. Scalars in Common ..
479 * .. Common blocks ..
480 COMMON /INFOC/INFOT, NOUTC, OK, LERR
481 * .. Data statements ..
483 * .. Executable Statements ..
495 * Set LDC to 1 more than minimum value if room.
499 * Skip tests if not enough room.
503 NULL = N.LE.0.OR.M.LE.0
509 TRANSA = ICH( ICA: ICA )
510 TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'
519 * Set LDA to 1 more than minimum value if room.
523 * Skip tests if not enough room.
528 * Generate the matrix A.
530 CALL CMAKE( 'ge', ' ', ' ', MA, NA, A, NMAX, AA, LDA,
534 TRANSB = ICH( ICB: ICB )
535 TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'
544 * Set LDB to 1 more than minimum value if room.
548 * Skip tests if not enough room.
553 * Generate the matrix B.
555 CALL CMAKE( 'ge', ' ', ' ', MB, NB, B, NMAX, BB,
564 * Generate the matrix C.
566 CALL CMAKE( 'ge', ' ', ' ', M, N, C, NMAX,
567 $ CC, LDC, RESET, ZERO )
571 * Save every datum before calling the
594 * Call the subroutine.
597 $ CALL CPRCN1(NTRA, NC, SNAME, IORDER,
598 $ TRANSA, TRANSB, M, N, K, ALPHA, LDA,
602 CALL CCGEMM( IORDER, TRANSA, TRANSB, M, N,
603 $ K, ALPHA, AA, LDA, BB, LDB,
606 * Check if error-exit was taken incorrectly.
609 WRITE( NOUT, FMT = 9994 )
614 * See what data changed inside subroutines.
616 ISAME( 1 ) = TRANSA.EQ.TRANAS
617 ISAME( 2 ) = TRANSB.EQ.TRANBS
621 ISAME( 6 ) = ALS.EQ.ALPHA
622 ISAME( 7 ) = LCE( AS, AA, LAA )
623 ISAME( 8 ) = LDAS.EQ.LDA
624 ISAME( 9 ) = LCE( BS, BB, LBB )
625 ISAME( 10 ) = LDBS.EQ.LDB
626 ISAME( 11 ) = BLS.EQ.BETA
628 ISAME( 12 ) = LCE( CS, CC, LCC )
630 ISAME( 12 ) = LCERES( 'ge', ' ', M, N, CS,
633 ISAME( 13 ) = LDCS.EQ.LDC
635 * If data was incorrectly changed, report
640 SAME = SAME.AND.ISAME( I )
641 IF( .NOT.ISAME( I ) )
642 $ WRITE( NOUT, FMT = 9998 )I
653 CALL CMMCH( TRANSA, TRANSB, M, N, K,
654 $ ALPHA, A, NMAX, B, NMAX, BETA,
655 $ C, NMAX, CT, G, CC, LDC, EPS,
656 $ ERR, FATAL, NOUT, .TRUE. )
657 ERRMAX = MAX( ERRMAX, ERR )
658 * If got really bad answer, report and
680 IF( ERRMAX.LT.THRESH )THEN
681 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
682 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
684 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
685 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
690 WRITE( NOUT, FMT = 9996 )SNAME
691 CALL CPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB,
692 $ M, N, K, ALPHA, LDA, LDB, BETA, LDC)
697 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
698 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
699 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
700 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
701 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
702 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
703 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
704 $ ' (', I6, ' CALL', 'S)' )
705 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
706 $ ' (', I6, ' CALL', 'S)' )
707 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
708 $ 'ANGED INCORRECTLY *******' )
709 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
710 9995 FORMAT( 1X, I6, ': ', A12,'(''', A1, ''',''', A1, ''',',
711 $ 3( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3,
712 $ ',(', F4.1, ',', F4.1, '), C,', I3, ').' )
713 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
720 SUBROUTINE CPRCN1(NOUT, NC, SNAME, IORDER, TRANSA, TRANSB, M, N,
721 $ K, ALPHA, LDA, LDB, BETA, LDC)
722 INTEGER NOUT, NC, IORDER, M, N, K, LDA, LDB, LDC
724 CHARACTER*1 TRANSA, TRANSB
726 CHARACTER*14 CRC, CTA,CTB
728 IF (TRANSA.EQ.'N')THEN
729 CTA = ' CblasNoTrans'
730 ELSE IF (TRANSA.EQ.'T')THEN
733 CTA = 'CblasConjTrans'
735 IF (TRANSB.EQ.'N')THEN
736 CTB = ' CblasNoTrans'
737 ELSE IF (TRANSB.EQ.'T')THEN
740 CTB = 'CblasConjTrans'
743 CRC = ' CblasRowMajor'
745 CRC = ' CblasColMajor'
747 WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CTA,CTB
748 WRITE(NOUT, FMT = 9994)M, N, K, ALPHA, LDA, LDB, BETA, LDC
750 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',')
751 9994 FORMAT( 10X, 3( I3, ',' ) ,' (', F4.1,',',F4.1,') , A,',
752 $ I3, ', B,', I3, ', (', F4.1,',',F4.1,') , C,', I3, ').' )
755 SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
756 $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
757 $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G,
760 * Tests CHEMM and CSYMM.
762 * Auxiliary routine for test program for Level 3 Blas.
764 * -- Written on 8-February-1989.
765 * Jack Dongarra, Argonne National Laboratory.
766 * Iain Duff, AERE Harwell.
767 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
768 * Sven Hammarling, Numerical Algorithms Group Ltd.
772 PARAMETER ( ZERO = ( 0.0, 0.0 ) )
774 PARAMETER ( RZERO = 0.0 )
775 * .. Scalar Arguments ..
777 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
778 LOGICAL FATAL, REWI, TRACE
780 * .. Array Arguments ..
781 COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
782 $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
783 $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
784 $ C( NMAX, NMAX ), CC( NMAX*NMAX ),
785 $ CS( NMAX*NMAX ), CT( NMAX )
787 INTEGER IDIM( NIDIM )
788 * .. Local Scalars ..
789 COMPLEX ALPHA, ALS, BETA, BLS
791 INTEGER I, IA, IB, ICS, ICU, IM, IN, LAA, LBB, LCC,
792 $ LDA, LDAS, LDB, LDBS, LDC, LDCS, M, MS, N, NA,
794 LOGICAL CONJ, LEFT, NULL, RESET, SAME
795 CHARACTER*1 SIDE, SIDES, UPLO, UPLOS
796 CHARACTER*2 ICHS, ICHU
799 * .. External Functions ..
802 * .. External Subroutines ..
803 EXTERNAL CCHEMM, CMAKE, CMMCH, CCSYMM
804 * .. Intrinsic Functions ..
806 * .. Scalars in Common ..
809 * .. Common blocks ..
810 COMMON /INFOC/INFOT, NOUTC, OK, LERR
811 * .. Data statements ..
812 DATA ICHS/'LR'/, ICHU/'UL'/
813 * .. Executable Statements ..
814 CONJ = SNAME( 8: 9 ).EQ.'he'
826 * Set LDC to 1 more than minimum value if room.
830 * Skip tests if not enough room.
834 NULL = N.LE.0.OR.M.LE.0
835 * Set LDB to 1 more than minimum value if room.
839 * Skip tests if not enough room.
844 * Generate the matrix B.
846 CALL CMAKE( 'ge', ' ', ' ', M, N, B, NMAX, BB, LDB, RESET,
850 SIDE = ICHS( ICS: ICS )
858 * Set LDA to 1 more than minimum value if room.
862 * Skip tests if not enough room.
868 UPLO = ICHU( ICU: ICU )
870 * Generate the hermitian or symmetric matrix A.
872 CALL CMAKE(SNAME( 8: 9 ), UPLO, ' ', NA, NA, A, NMAX,
873 $ AA, LDA, RESET, ZERO )
881 * Generate the matrix C.
883 CALL CMAKE( 'ge', ' ', ' ', M, N, C, NMAX, CC,
888 * Save every datum before calling the
910 * Call the subroutine.
913 $ CALL CPRCN2(NTRA, NC, SNAME, IORDER,
914 $ SIDE, UPLO, M, N, ALPHA, LDA, LDB,
919 CALL CCHEMM( IORDER, SIDE, UPLO, M, N,
920 $ ALPHA, AA, LDA, BB, LDB, BETA,
923 CALL CCSYMM( IORDER, SIDE, UPLO, M, N,
924 $ ALPHA, AA, LDA, BB, LDB, BETA,
928 * Check if error-exit was taken incorrectly.
931 WRITE( NOUT, FMT = 9994 )
936 * See what data changed inside subroutines.
938 ISAME( 1 ) = SIDES.EQ.SIDE
939 ISAME( 2 ) = UPLOS.EQ.UPLO
942 ISAME( 5 ) = ALS.EQ.ALPHA
943 ISAME( 6 ) = LCE( AS, AA, LAA )
944 ISAME( 7 ) = LDAS.EQ.LDA
945 ISAME( 8 ) = LCE( BS, BB, LBB )
946 ISAME( 9 ) = LDBS.EQ.LDB
947 ISAME( 10 ) = BLS.EQ.BETA
949 ISAME( 11 ) = LCE( CS, CC, LCC )
951 ISAME( 11 ) = LCERES( 'ge', ' ', M, N, CS,
954 ISAME( 12 ) = LDCS.EQ.LDC
956 * If data was incorrectly changed, report and
961 SAME = SAME.AND.ISAME( I )
962 IF( .NOT.ISAME( I ) )
963 $ WRITE( NOUT, FMT = 9998 )I
975 CALL CMMCH( 'N', 'N', M, N, M, ALPHA, A,
976 $ NMAX, B, NMAX, BETA, C, NMAX,
977 $ CT, G, CC, LDC, EPS, ERR,
978 $ FATAL, NOUT, .TRUE. )
980 CALL CMMCH( 'N', 'N', M, N, N, ALPHA, B,
981 $ NMAX, A, NMAX, BETA, C, NMAX,
982 $ CT, G, CC, LDC, EPS, ERR,
983 $ FATAL, NOUT, .TRUE. )
985 ERRMAX = MAX( ERRMAX, ERR )
986 * If got really bad answer, report and
1006 IF( ERRMAX.LT.THRESH )THEN
1007 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
1008 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
1010 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
1011 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
1016 WRITE( NOUT, FMT = 9996 )SNAME
1017 CALL CPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N, ALPHA, LDA,
1023 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
1024 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1025 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
1026 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
1027 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1028 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
1029 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
1030 $ ' (', I6, ' CALL', 'S)' )
1031 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
1032 $ ' (', I6, ' CALL', 'S)' )
1033 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
1034 $ 'ANGED INCORRECTLY *******' )
1035 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
1036 9995 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
1037 $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1,
1038 $ ',', F4.1, '), C,', I3, ') .' )
1039 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
1046 SUBROUTINE CPRCN2(NOUT, NC, SNAME, IORDER, SIDE, UPLO, M, N,
1047 $ ALPHA, LDA, LDB, BETA, LDC)
1048 INTEGER NOUT, NC, IORDER, M, N, LDA, LDB, LDC
1050 CHARACTER*1 SIDE, UPLO
1052 CHARACTER*14 CRC, CS,CU
1054 IF (SIDE.EQ.'L')THEN
1059 IF (UPLO.EQ.'U')THEN
1064 IF (IORDER.EQ.1)THEN
1065 CRC = ' CblasRowMajor'
1067 CRC = ' CblasColMajor'
1069 WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU
1070 WRITE(NOUT, FMT = 9994)M, N, ALPHA, LDA, LDB, BETA, LDC
1072 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',')
1073 9994 FORMAT( 10X, 2( I3, ',' ),' (',F4.1,',',F4.1, '), A,', I3,
1074 $ ', B,', I3, ', (',F4.1,',',F4.1, '), ', 'C,', I3, ').' )
1077 SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
1078 $ FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS,
1079 $ B, BB, BS, CT, G, C, IORDER )
1081 * Tests CTRMM and CTRSM.
1083 * Auxiliary routine for test program for Level 3 Blas.
1085 * -- Written on 8-February-1989.
1086 * Jack Dongarra, Argonne National Laboratory.
1087 * Iain Duff, AERE Harwell.
1088 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
1089 * Sven Hammarling, Numerical Algorithms Group Ltd.
1093 PARAMETER ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )
1095 PARAMETER ( RZERO = 0.0 )
1096 * .. Scalar Arguments ..
1098 INTEGER NALF, NIDIM, NMAX, NOUT, NTRA, IORDER
1099 LOGICAL FATAL, REWI, TRACE
1101 * .. Array Arguments ..
1102 COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
1103 $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
1104 $ BB( NMAX*NMAX ), BS( NMAX*NMAX ),
1105 $ C( NMAX, NMAX ), CT( NMAX )
1107 INTEGER IDIM( NIDIM )
1108 * .. Local Scalars ..
1111 INTEGER I, IA, ICD, ICS, ICT, ICU, IM, IN, J, LAA, LBB,
1112 $ LDA, LDAS, LDB, LDBS, M, MS, N, NA, NARGS, NC,
1114 LOGICAL LEFT, NULL, RESET, SAME
1115 CHARACTER*1 DIAG, DIAGS, SIDE, SIDES, TRANAS, TRANSA, UPLO,
1117 CHARACTER*2 ICHD, ICHS, ICHU
1119 * .. Local Arrays ..
1121 * .. External Functions ..
1123 EXTERNAL LCE, LCERES
1124 * .. External Subroutines ..
1125 EXTERNAL CMAKE, CMMCH, CCTRMM, CCTRSM
1126 * .. Intrinsic Functions ..
1128 * .. Scalars in Common ..
1129 INTEGER INFOT, NOUTC
1131 * .. Common blocks ..
1132 COMMON /INFOC/INFOT, NOUTC, OK, LERR
1133 * .. Data statements ..
1134 DATA ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/, ICHS/'LR'/
1135 * .. Executable Statements ..
1141 * Set up zero matrix for CMMCH.
1148 DO 140 IM = 1, NIDIM
1151 DO 130 IN = 1, NIDIM
1153 * Set LDB to 1 more than minimum value if room.
1157 * Skip tests if not enough room.
1161 NULL = M.LE.0.OR.N.LE.0
1164 SIDE = ICHS( ICS: ICS )
1171 * Set LDA to 1 more than minimum value if room.
1175 * Skip tests if not enough room.
1181 UPLO = ICHU( ICU: ICU )
1184 TRANSA = ICHT( ICT: ICT )
1187 DIAG = ICHD( ICD: ICD )
1192 * Generate the matrix A.
1194 CALL CMAKE( 'tr', UPLO, DIAG, NA, NA, A,
1195 $ NMAX, AA, LDA, RESET, ZERO )
1197 * Generate the matrix B.
1199 CALL CMAKE( 'ge', ' ', ' ', M, N, B, NMAX,
1200 $ BB, LDB, RESET, ZERO )
1204 * Save every datum before calling the
1223 * Call the subroutine.
1225 IF( SNAME( 10: 11 ).EQ.'mm' )THEN
1227 $ CALL CPRCN3( NTRA, NC, SNAME, IORDER,
1228 $ SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,
1232 CALL CCTRMM(IORDER, SIDE, UPLO, TRANSA,
1233 $ DIAG, M, N, ALPHA, AA, LDA,
1235 ELSE IF( SNAME( 10: 11 ).EQ.'sm' )THEN
1237 $ CALL CPRCN3( NTRA, NC, SNAME, IORDER,
1238 $ SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,
1242 CALL CCTRSM(IORDER, SIDE, UPLO, TRANSA,
1243 $ DIAG, M, N, ALPHA, AA, LDA,
1247 * Check if error-exit was taken incorrectly.
1250 WRITE( NOUT, FMT = 9994 )
1255 * See what data changed inside subroutines.
1257 ISAME( 1 ) = SIDES.EQ.SIDE
1258 ISAME( 2 ) = UPLOS.EQ.UPLO
1259 ISAME( 3 ) = TRANAS.EQ.TRANSA
1260 ISAME( 4 ) = DIAGS.EQ.DIAG
1261 ISAME( 5 ) = MS.EQ.M
1262 ISAME( 6 ) = NS.EQ.N
1263 ISAME( 7 ) = ALS.EQ.ALPHA
1264 ISAME( 8 ) = LCE( AS, AA, LAA )
1265 ISAME( 9 ) = LDAS.EQ.LDA
1267 ISAME( 10 ) = LCE( BS, BB, LBB )
1269 ISAME( 10 ) = LCERES( 'ge', ' ', M, N, BS,
1272 ISAME( 11 ) = LDBS.EQ.LDB
1274 * If data was incorrectly changed, report and
1279 SAME = SAME.AND.ISAME( I )
1280 IF( .NOT.ISAME( I ) )
1281 $ WRITE( NOUT, FMT = 9998 )I
1289 IF( SNAME( 10: 11 ).EQ.'mm' )THEN
1294 CALL CMMCH( TRANSA, 'N', M, N, M,
1295 $ ALPHA, A, NMAX, B, NMAX,
1296 $ ZERO, C, NMAX, CT, G,
1297 $ BB, LDB, EPS, ERR,
1298 $ FATAL, NOUT, .TRUE. )
1300 CALL CMMCH( 'N', TRANSA, M, N, N,
1301 $ ALPHA, B, NMAX, A, NMAX,
1302 $ ZERO, C, NMAX, CT, G,
1303 $ BB, LDB, EPS, ERR,
1304 $ FATAL, NOUT, .TRUE. )
1306 ELSE IF( SNAME( 10: 11 ).EQ.'sm' )THEN
1308 * Compute approximation to original
1313 C( I, J ) = BB( I + ( J - 1 )*
1315 BB( I + ( J - 1 )*LDB ) = ALPHA*
1321 CALL CMMCH( TRANSA, 'N', M, N, M,
1322 $ ONE, A, NMAX, C, NMAX,
1323 $ ZERO, B, NMAX, CT, G,
1324 $ BB, LDB, EPS, ERR,
1325 $ FATAL, NOUT, .FALSE. )
1327 CALL CMMCH( 'N', TRANSA, M, N, N,
1328 $ ONE, C, NMAX, A, NMAX,
1329 $ ZERO, B, NMAX, CT, G,
1330 $ BB, LDB, EPS, ERR,
1331 $ FATAL, NOUT, .FALSE. )
1334 ERRMAX = MAX( ERRMAX, ERR )
1335 * If got really bad answer, report and
1357 IF( ERRMAX.LT.THRESH )THEN
1358 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
1359 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
1361 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
1362 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
1367 WRITE( NOUT, FMT = 9996 )SNAME
1368 CALL CPRCN3( NTRA, NC, SNAME, IORDER, SIDE, UPLO, TRANSA, DIAG,
1369 $ M, N, ALPHA, LDA, LDB)
1374 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
1375 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1376 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
1377 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
1378 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1379 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
1380 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
1381 $ ' (', I6, ' CALL', 'S)' )
1382 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
1383 $ ' (', I6, ' CALL', 'S)' )
1384 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
1385 $ 'ANGED INCORRECTLY *******' )
1386 9996 FORMAT(' ******* ', A12,' FAILED ON CALL NUMBER:' )
1387 9995 FORMAT(1X, I6, ': ', A12,'(', 4( '''', A1, ''',' ), 2( I3, ',' ),
1388 $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ') ',
1390 9994 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
1397 SUBROUTINE CPRCN3(NOUT, NC, SNAME, IORDER, SIDE, UPLO, TRANSA,
1398 $ DIAG, M, N, ALPHA, LDA, LDB)
1399 INTEGER NOUT, NC, IORDER, M, N, LDA, LDB
1401 CHARACTER*1 SIDE, UPLO, TRANSA, DIAG
1403 CHARACTER*14 CRC, CS, CU, CA, CD
1405 IF (SIDE.EQ.'L')THEN
1410 IF (UPLO.EQ.'U')THEN
1415 IF (TRANSA.EQ.'N')THEN
1416 CA = ' CblasNoTrans'
1417 ELSE IF (TRANSA.EQ.'T')THEN
1420 CA = 'CblasConjTrans'
1422 IF (DIAG.EQ.'N')THEN
1423 CD = ' CblasNonUnit'
1427 IF (IORDER.EQ.1)THEN
1428 CRC = ' CblasRowMajor'
1430 CRC = ' CblasColMajor'
1432 WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU
1433 WRITE(NOUT, FMT = 9994)CA, CD, M, N, ALPHA, LDA, LDB
1435 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',')
1436 9994 FORMAT( 10X, 2( A14, ',') , 2( I3, ',' ), ' (', F4.1, ',',
1437 $ F4.1, '), A,', I3, ', B,', I3, ').' )
1440 SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
1441 $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
1442 $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G,
1445 * Tests CHERK and CSYRK.
1447 * Auxiliary routine for test program for Level 3 Blas.
1449 * -- Written on 8-February-1989.
1450 * Jack Dongarra, Argonne National Laboratory.
1451 * Iain Duff, AERE Harwell.
1452 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
1453 * Sven Hammarling, Numerical Algorithms Group Ltd.
1457 PARAMETER ( ZERO = ( 0.0, 0.0 ) )
1459 PARAMETER ( RONE = 1.0, RZERO = 0.0 )
1460 * .. Scalar Arguments ..
1462 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
1463 LOGICAL FATAL, REWI, TRACE
1465 * .. Array Arguments ..
1466 COMPLEX A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
1467 $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
1468 $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
1469 $ C( NMAX, NMAX ), CC( NMAX*NMAX ),
1470 $ CS( NMAX*NMAX ), CT( NMAX )
1472 INTEGER IDIM( NIDIM )
1473 * .. Local Scalars ..
1474 COMPLEX ALPHA, ALS, BETA, BETS
1475 REAL ERR, ERRMAX, RALPHA, RALS, RBETA, RBETS
1476 INTEGER I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, K, KS,
1477 $ LAA, LCC, LDA, LDAS, LDC, LDCS, LJ, MA, N, NA,
1479 LOGICAL CONJ, NULL, RESET, SAME, TRAN, UPPER
1480 CHARACTER*1 TRANS, TRANSS, TRANST, UPLO, UPLOS
1481 CHARACTER*2 ICHT, ICHU
1482 * .. Local Arrays ..
1484 * .. External Functions ..
1486 EXTERNAL LCE, LCERES
1487 * .. External Subroutines ..
1488 EXTERNAL CCHERK, CMAKE, CMMCH, CCSYRK
1489 * .. Intrinsic Functions ..
1490 INTRINSIC CMPLX, MAX, REAL
1491 * .. Scalars in Common ..
1492 INTEGER INFOT, NOUTC
1494 * .. Common blocks ..
1495 COMMON /INFOC/INFOT, NOUTC, OK, LERR
1496 * .. Data statements ..
1497 DATA ICHT/'NC'/, ICHU/'UL'/
1498 * .. Executable Statements ..
1499 CONJ = SNAME( 8: 9 ).EQ.'he'
1506 DO 100 IN = 1, NIDIM
1508 * Set LDC to 1 more than minimum value if room.
1512 * Skip tests if not enough room.
1521 TRANS = ICHT( ICT: ICT )
1523 IF( TRAN.AND..NOT.CONJ )
1532 * Set LDA to 1 more than minimum value if room.
1536 * Skip tests if not enough room.
1541 * Generate the matrix A.
1543 CALL CMAKE( 'ge', ' ', ' ', MA, NA, A, NMAX, AA, LDA,
1547 UPLO = ICHU( ICU: ICU )
1553 RALPHA = REAL( ALPHA )
1554 ALPHA = CMPLX( RALPHA, RZERO )
1560 RBETA = REAL( BETA )
1561 BETA = CMPLX( RBETA, RZERO )
1565 $ NULL = NULL.OR.( ( K.LE.0.OR.RALPHA.EQ.
1566 $ RZERO ).AND.RBETA.EQ.RONE )
1568 * Generate the matrix C.
1570 CALL CMAKE( SNAME( 8: 9 ), UPLO, ' ', N, N, C,
1571 $ NMAX, CC, LDC, RESET, ZERO )
1575 * Save every datum before calling the subroutine.
1600 * Call the subroutine.
1604 $ CALL CPRCN6( NTRA, NC, SNAME, IORDER,
1605 $ UPLO, TRANS, N, K, RALPHA, LDA, RBETA,
1609 CALL CCHERK( IORDER, UPLO, TRANS, N, K,
1610 $ RALPHA, AA, LDA, RBETA, CC,
1614 $ CALL CPRCN4( NTRA, NC, SNAME, IORDER,
1615 $ UPLO, TRANS, N, K, ALPHA, LDA, BETA, LDC)
1618 CALL CCSYRK( IORDER, UPLO, TRANS, N, K,
1619 $ ALPHA, AA, LDA, BETA, CC, LDC )
1622 * Check if error-exit was taken incorrectly.
1625 WRITE( NOUT, FMT = 9992 )
1630 * See what data changed inside subroutines.
1632 ISAME( 1 ) = UPLOS.EQ.UPLO
1633 ISAME( 2 ) = TRANSS.EQ.TRANS
1634 ISAME( 3 ) = NS.EQ.N
1635 ISAME( 4 ) = KS.EQ.K
1637 ISAME( 5 ) = RALS.EQ.RALPHA
1639 ISAME( 5 ) = ALS.EQ.ALPHA
1641 ISAME( 6 ) = LCE( AS, AA, LAA )
1642 ISAME( 7 ) = LDAS.EQ.LDA
1644 ISAME( 8 ) = RBETS.EQ.RBETA
1646 ISAME( 8 ) = BETS.EQ.BETA
1649 ISAME( 9 ) = LCE( CS, CC, LCC )
1651 ISAME( 9 ) = LCERES( SNAME( 8: 9 ), UPLO, N,
1654 ISAME( 10 ) = LDCS.EQ.LDC
1656 * If data was incorrectly changed, report and
1661 SAME = SAME.AND.ISAME( I )
1662 IF( .NOT.ISAME( I ) )
1663 $ WRITE( NOUT, FMT = 9998 )I
1672 * Check the result column by column.
1689 CALL CMMCH( TRANST, 'N', LJ, 1, K,
1690 $ ALPHA, A( 1, JJ ), NMAX,
1691 $ A( 1, J ), NMAX, BETA,
1692 $ C( JJ, J ), NMAX, CT, G,
1693 $ CC( JC ), LDC, EPS, ERR,
1694 $ FATAL, NOUT, .TRUE. )
1696 CALL CMMCH( 'N', TRANST, LJ, 1, K,
1697 $ ALPHA, A( JJ, 1 ), NMAX,
1698 $ A( J, 1 ), NMAX, BETA,
1699 $ C( JJ, J ), NMAX, CT, G,
1700 $ CC( JC ), LDC, EPS, ERR,
1701 $ FATAL, NOUT, .TRUE. )
1708 ERRMAX = MAX( ERRMAX, ERR )
1709 * If got really bad answer, report and
1730 IF( ERRMAX.LT.THRESH )THEN
1731 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
1732 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
1734 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
1735 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
1741 $ WRITE( NOUT, FMT = 9995 )J
1744 WRITE( NOUT, FMT = 9996 )SNAME
1746 CALL CPRCN6( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K, RALPHA,
1749 CALL CPRCN4( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K, ALPHA,
1756 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
1757 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1758 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
1759 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
1760 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
1761 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
1762 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
1763 $ ' (', I6, ' CALL', 'S)' )
1764 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
1765 $ ' (', I6, ' CALL', 'S)' )
1766 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
1767 $ 'ANGED INCORRECTLY *******' )
1768 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
1769 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 )
1770 9994 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
1771 $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ') ',
1773 9993 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
1774 $ '(', F4.1, ',', F4.1, ') , A,', I3, ',(', F4.1, ',', F4.1,
1775 $ '), C,', I3, ') .' )
1776 9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
1783 SUBROUTINE CPRCN4(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
1784 $ N, K, ALPHA, LDA, BETA, LDC)
1785 INTEGER NOUT, NC, IORDER, N, K, LDA, LDC
1787 CHARACTER*1 UPLO, TRANSA
1789 CHARACTER*14 CRC, CU, CA
1791 IF (UPLO.EQ.'U')THEN
1796 IF (TRANSA.EQ.'N')THEN
1797 CA = ' CblasNoTrans'
1798 ELSE IF (TRANSA.EQ.'T')THEN
1801 CA = 'CblasConjTrans'
1803 IF (IORDER.EQ.1)THEN
1804 CRC = ' CblasRowMajor'
1806 CRC = ' CblasColMajor'
1808 WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
1809 WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, BETA, LDC
1811 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
1812 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1 ,'), A,',
1813 $ I3, ', (', F4.1,',', F4.1, '), C,', I3, ').' )
1817 SUBROUTINE CPRCN6(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
1818 $ N, K, ALPHA, LDA, BETA, LDC)
1819 INTEGER NOUT, NC, IORDER, N, K, LDA, LDC
1821 CHARACTER*1 UPLO, TRANSA
1823 CHARACTER*14 CRC, CU, CA
1825 IF (UPLO.EQ.'U')THEN
1830 IF (TRANSA.EQ.'N')THEN
1831 CA = ' CblasNoTrans'
1832 ELSE IF (TRANSA.EQ.'T')THEN
1835 CA = 'CblasConjTrans'
1837 IF (IORDER.EQ.1)THEN
1838 CRC = ' CblasRowMajor'
1840 CRC = ' CblasColMajor'
1842 WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
1843 WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, BETA, LDC
1845 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
1846 9994 FORMAT( 10X, 2( I3, ',' ),
1847 $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ').' )
1850 SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
1851 $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,
1852 $ AB, AA, AS, BB, BS, C, CC, CS, CT, G, W,
1855 * Tests CHER2K and CSYR2K.
1857 * Auxiliary routine for test program for Level 3 Blas.
1859 * -- Written on 8-February-1989.
1860 * Jack Dongarra, Argonne National Laboratory.
1861 * Iain Duff, AERE Harwell.
1862 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
1863 * Sven Hammarling, Numerical Algorithms Group Ltd.
1867 PARAMETER ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )
1869 PARAMETER ( RONE = 1.0, RZERO = 0.0 )
1870 * .. Scalar Arguments ..
1872 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
1873 LOGICAL FATAL, REWI, TRACE
1875 * .. Array Arguments ..
1876 COMPLEX AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ),
1877 $ ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ),
1878 $ BET( NBET ), BS( NMAX*NMAX ), C( NMAX, NMAX ),
1879 $ CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),
1882 INTEGER IDIM( NIDIM )
1883 * .. Local Scalars ..
1884 COMPLEX ALPHA, ALS, BETA, BETS
1885 REAL ERR, ERRMAX, RBETA, RBETS
1886 INTEGER I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, JJAB,
1887 $ K, KS, LAA, LBB, LCC, LDA, LDAS, LDB, LDBS,
1888 $ LDC, LDCS, LJ, MA, N, NA, NARGS, NC, NS
1889 LOGICAL CONJ, NULL, RESET, SAME, TRAN, UPPER
1890 CHARACTER*1 TRANS, TRANSS, TRANST, UPLO, UPLOS
1891 CHARACTER*2 ICHT, ICHU
1892 * .. Local Arrays ..
1894 * .. External Functions ..
1896 EXTERNAL LCE, LCERES
1897 * .. External Subroutines ..
1898 EXTERNAL CCHER2K, CMAKE, CMMCH, CCSYR2K
1899 * .. Intrinsic Functions ..
1900 INTRINSIC CMPLX, CONJG, MAX, REAL
1901 * .. Scalars in Common ..
1902 INTEGER INFOT, NOUTC
1904 * .. Common blocks ..
1905 COMMON /INFOC/INFOT, NOUTC, OK, LERR
1906 * .. Data statements ..
1907 DATA ICHT/'NC'/, ICHU/'UL'/
1908 * .. Executable Statements ..
1909 CONJ = SNAME( 8: 9 ).EQ.'he'
1916 DO 130 IN = 1, NIDIM
1918 * Set LDC to 1 more than minimum value if room.
1922 * Skip tests if not enough room.
1927 DO 120 IK = 1, NIDIM
1931 TRANS = ICHT( ICT: ICT )
1933 IF( TRAN.AND..NOT.CONJ )
1942 * Set LDA to 1 more than minimum value if room.
1946 * Skip tests if not enough room.
1951 * Generate the matrix A.
1954 CALL CMAKE( 'ge', ' ', ' ', MA, NA, AB, 2*NMAX, AA,
1955 $ LDA, RESET, ZERO )
1957 CALL CMAKE( 'ge', ' ', ' ', MA, NA, AB, NMAX, AA, LDA,
1961 * Generate the matrix B.
1966 CALL CMAKE( 'ge', ' ', ' ', MA, NA, AB( K + 1 ),
1967 $ 2*NMAX, BB, LDB, RESET, ZERO )
1969 CALL CMAKE( 'ge', ' ', ' ', MA, NA, AB( K*NMAX + 1 ),
1970 $ NMAX, BB, LDB, RESET, ZERO )
1974 UPLO = ICHU( ICU: ICU )
1983 RBETA = REAL( BETA )
1984 BETA = CMPLX( RBETA, RZERO )
1988 $ NULL = NULL.OR.( ( K.LE.0.OR.ALPHA.EQ.
1989 $ ZERO ).AND.RBETA.EQ.RONE )
1991 * Generate the matrix C.
1993 CALL CMAKE( SNAME( 8: 9 ), UPLO, ' ', N, N, C,
1994 $ NMAX, CC, LDC, RESET, ZERO )
1998 * Save every datum before calling the subroutine.
2023 * Call the subroutine.
2027 $ CALL CPRCN7( NTRA, NC, SNAME, IORDER,
2028 $ UPLO, TRANS, N, K, ALPHA, LDA, LDB,
2032 CALL CCHER2K( IORDER, UPLO, TRANS, N, K,
2033 $ ALPHA, AA, LDA, BB, LDB, RBETA,
2037 $ CALL CPRCN5( NTRA, NC, SNAME, IORDER,
2038 $ UPLO, TRANS, N, K, ALPHA, LDA, LDB,
2042 CALL CCSYR2K( IORDER, UPLO, TRANS, N, K,
2043 $ ALPHA, AA, LDA, BB, LDB, BETA,
2047 * Check if error-exit was taken incorrectly.
2050 WRITE( NOUT, FMT = 9992 )
2055 * See what data changed inside subroutines.
2057 ISAME( 1 ) = UPLOS.EQ.UPLO
2058 ISAME( 2 ) = TRANSS.EQ.TRANS
2059 ISAME( 3 ) = NS.EQ.N
2060 ISAME( 4 ) = KS.EQ.K
2061 ISAME( 5 ) = ALS.EQ.ALPHA
2062 ISAME( 6 ) = LCE( AS, AA, LAA )
2063 ISAME( 7 ) = LDAS.EQ.LDA
2064 ISAME( 8 ) = LCE( BS, BB, LBB )
2065 ISAME( 9 ) = LDBS.EQ.LDB
2067 ISAME( 10 ) = RBETS.EQ.RBETA
2069 ISAME( 10 ) = BETS.EQ.BETA
2072 ISAME( 11 ) = LCE( CS, CC, LCC )
2074 ISAME( 11 ) = LCERES( 'he', UPLO, N, N, CS,
2077 ISAME( 12 ) = LDCS.EQ.LDC
2079 * If data was incorrectly changed, report and
2084 SAME = SAME.AND.ISAME( I )
2085 IF( .NOT.ISAME( I ) )
2086 $ WRITE( NOUT, FMT = 9998 )I
2095 * Check the result column by column.
2114 W( I ) = ALPHA*AB( ( J - 1 )*2*
2117 W( K + I ) = CONJG( ALPHA )*
2126 CALL CMMCH( TRANST, 'N', LJ, 1, 2*K,
2127 $ ONE, AB( JJAB ), 2*NMAX, W,
2128 $ 2*NMAX, BETA, C( JJ, J ),
2129 $ NMAX, CT, G, CC( JC ), LDC,
2130 $ EPS, ERR, FATAL, NOUT,
2135 W( I ) = ALPHA*CONJG( AB( ( K +
2136 $ I - 1 )*NMAX + J ) )
2137 W( K + I ) = CONJG( ALPHA*
2138 $ AB( ( I - 1 )*NMAX +
2141 W( I ) = ALPHA*AB( ( K + I - 1 )*
2144 $ AB( ( I - 1 )*NMAX +
2148 CALL CMMCH( 'N', 'N', LJ, 1, 2*K, ONE,
2149 $ AB( JJ ), NMAX, W, 2*NMAX,
2150 $ BETA, C( JJ, J ), NMAX, CT,
2151 $ G, CC( JC ), LDC, EPS, ERR,
2152 $ FATAL, NOUT, .TRUE. )
2159 $ JJAB = JJAB + 2*NMAX
2161 ERRMAX = MAX( ERRMAX, ERR )
2162 * If got really bad answer, report and
2183 IF( ERRMAX.LT.THRESH )THEN
2184 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC
2185 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC
2187 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX
2188 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX
2194 $ WRITE( NOUT, FMT = 9995 )J
2197 WRITE( NOUT, FMT = 9996 )SNAME
2199 CALL CPRCN7( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K,
2200 $ ALPHA, LDA, LDB, RBETA, LDC)
2202 CALL CPRCN5( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K,
2203 $ ALPHA, LDA, LDB, BETA, LDC)
2209 10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
2210 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
2211 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
2212 10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
2213 $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
2214 $ 'RATIO ', F8.2, ' - SUSPECT *******' )
2215 10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
2216 $ ' (', I6, ' CALL', 'S)' )
2217 10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
2218 $ ' (', I6, ' CALL', 'S)' )
2219 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
2220 $ 'ANGED INCORRECTLY *******' )
2221 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' )
2222 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 )
2223 9994 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
2224 $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',', F4.1,
2225 $ ', C,', I3, ') .' )
2226 9993 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A1, ''',' ), 2( I3, ',' ),
2227 $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1,
2228 $ ',', F4.1, '), C,', I3, ') .' )
2229 9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
2236 SUBROUTINE CPRCN5(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
2237 $ N, K, ALPHA, LDA, LDB, BETA, LDC)
2238 INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC
2240 CHARACTER*1 UPLO, TRANSA
2242 CHARACTER*14 CRC, CU, CA
2244 IF (UPLO.EQ.'U')THEN
2249 IF (TRANSA.EQ.'N')THEN
2250 CA = ' CblasNoTrans'
2251 ELSE IF (TRANSA.EQ.'T')THEN
2254 CA = 'CblasConjTrans'
2256 IF (IORDER.EQ.1)THEN
2257 CRC = ' CblasRowMajor'
2259 CRC = ' CblasColMajor'
2261 WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
2262 WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC
2264 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
2265 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1, '), A,',
2266 $ I3, ', B', I3, ', (', F4.1, ',', F4.1, '), C,', I3, ').' )
2270 SUBROUTINE CPRCN7(NOUT, NC, SNAME, IORDER, UPLO, TRANSA,
2271 $ N, K, ALPHA, LDA, LDB, BETA, LDC)
2272 INTEGER NOUT, NC, IORDER, N, K, LDA, LDB, LDC
2275 CHARACTER*1 UPLO, TRANSA
2277 CHARACTER*14 CRC, CU, CA
2279 IF (UPLO.EQ.'U')THEN
2284 IF (TRANSA.EQ.'N')THEN
2285 CA = ' CblasNoTrans'
2286 ELSE IF (TRANSA.EQ.'T')THEN
2289 CA = 'CblasConjTrans'
2291 IF (IORDER.EQ.1)THEN
2292 CRC = ' CblasRowMajor'
2294 CRC = ' CblasColMajor'
2296 WRITE(NOUT, FMT = 9995)NC, SNAME, CRC, CU, CA
2297 WRITE(NOUT, FMT = 9994)N, K, ALPHA, LDA, LDB, BETA, LDC
2299 9995 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') )
2300 9994 FORMAT( 10X, 2( I3, ',' ), ' (', F4.1, ',', F4.1, '), A,',
2301 $ I3, ', B', I3, ',', F4.1, ', C,', I3, ').' )
2304 SUBROUTINE CMAKE(TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET,
2307 * Generates values for an M by N matrix A.
2308 * Stores the values in the array AA in the data structure required
2309 * by the routine, with unwanted elements set to rogue value.
2311 * TYPE is 'ge', 'he', 'sy' or 'tr'.
2313 * Auxiliary routine for test program for Level 3 Blas.
2315 * -- Written on 8-February-1989.
2316 * Jack Dongarra, Argonne National Laboratory.
2317 * Iain Duff, AERE Harwell.
2318 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
2319 * Sven Hammarling, Numerical Algorithms Group Ltd.
2323 PARAMETER ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )
2325 PARAMETER ( ROGUE = ( -1.0E10, 1.0E10 ) )
2327 PARAMETER ( RZERO = 0.0 )
2329 PARAMETER ( RROGUE = -1.0E10 )
2330 * .. Scalar Arguments ..
2332 INTEGER LDA, M, N, NMAX
2334 CHARACTER*1 DIAG, UPLO
2336 * .. Array Arguments ..
2337 COMPLEX A( NMAX, * ), AA( * )
2338 * .. Local Scalars ..
2339 INTEGER I, IBEG, IEND, J, JJ
2340 LOGICAL GEN, HER, LOWER, SYM, TRI, UNIT, UPPER
2341 * .. External Functions ..
2344 * .. Intrinsic Functions ..
2345 INTRINSIC CMPLX, CONJG, REAL
2346 * .. Executable Statements ..
2351 UPPER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'U'
2352 LOWER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'L'
2353 UNIT = TRI.AND.DIAG.EQ.'U'
2355 * Generate data in array A.
2359 IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )
2361 A( I, J ) = CBEG( RESET ) + TRANSL
2363 * Set some elements to zero
2364 IF( N.GT.3.AND.J.EQ.N/2 )
2367 A( J, I ) = CONJG( A( I, J ) )
2369 A( J, I ) = A( I, J )
2377 $ A( J, J ) = CMPLX( REAL( A( J, J ) ), RZERO )
2379 $ A( J, J ) = A( J, J ) + ONE
2384 * Store elements in array AS in data structure required by routine.
2386 IF( TYPE.EQ.'ge' )THEN
2389 AA( I + ( J - 1 )*LDA ) = A( I, J )
2391 DO 40 I = M + 1, LDA
2392 AA( I + ( J - 1 )*LDA ) = ROGUE
2395 ELSE IF( TYPE.EQ.'he'.OR.TYPE.EQ.'sy'.OR.TYPE.EQ.'tr' )THEN
2412 DO 60 I = 1, IBEG - 1
2413 AA( I + ( J - 1 )*LDA ) = ROGUE
2415 DO 70 I = IBEG, IEND
2416 AA( I + ( J - 1 )*LDA ) = A( I, J )
2418 DO 80 I = IEND + 1, LDA
2419 AA( I + ( J - 1 )*LDA ) = ROGUE
2422 JJ = J + ( J - 1 )*LDA
2423 AA( JJ ) = CMPLX( REAL( AA( JJ ) ), RROGUE )
2432 SUBROUTINE CMMCH(TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB,
2433 $ BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL,
2436 * Checks the results of the computational tests.
2438 * Auxiliary routine for test program for Level 3 Blas.
2440 * -- Written on 8-February-1989.
2441 * Jack Dongarra, Argonne National Laboratory.
2442 * Iain Duff, AERE Harwell.
2443 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
2444 * Sven Hammarling, Numerical Algorithms Group Ltd.
2448 PARAMETER ( ZERO = ( 0.0, 0.0 ) )
2450 PARAMETER ( RZERO = 0.0, RONE = 1.0 )
2451 * .. Scalar Arguments ..
2454 INTEGER KK, LDA, LDB, LDC, LDCC, M, N, NOUT
2456 CHARACTER*1 TRANSA, TRANSB
2457 * .. Array Arguments ..
2458 COMPLEX A( LDA, * ), B( LDB, * ), C( LDC, * ),
2459 $ CC( LDCC, * ), CT( * )
2461 * .. Local Scalars ..
2465 LOGICAL CTRANA, CTRANB, TRANA, TRANB
2466 * .. Intrinsic Functions ..
2467 INTRINSIC ABS, AIMAG, CONJG, MAX, REAL, SQRT
2468 * .. Statement Functions ..
2470 * .. Statement Function definitions ..
2471 ABS1( CL ) = ABS( REAL( CL ) ) + ABS( AIMAG( CL ) )
2472 * .. Executable Statements ..
2473 TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'
2474 TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'
2475 CTRANA = TRANSA.EQ.'C'
2476 CTRANB = TRANSB.EQ.'C'
2478 * Compute expected result, one column at a time, in CT using data
2480 * Compute gauges in G.
2488 IF( .NOT.TRANA.AND..NOT.TRANB )THEN
2491 CT( I ) = CT( I ) + A( I, K )*B( K, J )
2492 G( I ) = G( I ) + ABS1( A( I, K ) )*ABS1( B( K, J ) )
2495 ELSE IF( TRANA.AND..NOT.TRANB )THEN
2499 CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( K, J )
2500 G( I ) = G( I ) + ABS1( A( K, I ) )*
2507 CT( I ) = CT( I ) + A( K, I )*B( K, J )
2508 G( I ) = G( I ) + ABS1( A( K, I ) )*
2513 ELSE IF( .NOT.TRANA.AND.TRANB )THEN
2517 CT( I ) = CT( I ) + A( I, K )*CONJG( B( J, K ) )
2518 G( I ) = G( I ) + ABS1( A( I, K ) )*
2525 CT( I ) = CT( I ) + A( I, K )*B( J, K )
2526 G( I ) = G( I ) + ABS1( A( I, K ) )*
2531 ELSE IF( TRANA.AND.TRANB )THEN
2536 CT( I ) = CT( I ) + CONJG( A( K, I ) )*
2537 $ CONJG( B( J, K ) )
2538 G( I ) = G( I ) + ABS1( A( K, I ) )*
2545 CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( J, K )
2546 G( I ) = G( I ) + ABS1( A( K, I ) )*
2555 CT( I ) = CT( I ) + A( K, I )*CONJG( B( J, K ) )
2556 G( I ) = G( I ) + ABS1( A( K, I ) )*
2563 CT( I ) = CT( I ) + A( K, I )*B( J, K )
2564 G( I ) = G( I ) + ABS1( A( K, I ) )*
2572 CT( I ) = ALPHA*CT( I ) + BETA*C( I, J )
2573 G( I ) = ABS1( ALPHA )*G( I ) +
2574 $ ABS1( BETA )*ABS1( C( I, J ) )
2577 * Compute the error ratio for this result.
2581 ERRI = ABS1( CT( I ) - CC( I, J ) )/EPS
2582 IF( G( I ).NE.RZERO )
2583 $ ERRI = ERRI/G( I )
2584 ERR = MAX( ERR, ERRI )
2585 IF( ERR*SQRT( EPS ).GE.RONE )
2591 * If the loop completes, all results are at least half accurate.
2594 * Report fatal error.
2597 WRITE( NOUT, FMT = 9999 )
2600 WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J )
2602 WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I )
2606 $ WRITE( NOUT, FMT = 9997 )J
2611 9999 FORMAT(' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
2612 $ 'F ACCURATE *******', /' EXPECTED RE',
2613 $ 'SULT COMPUTED RESULT' )
2614 9998 FORMAT( 1X, I7, 2( ' (', G15.6, ',', G15.6, ')' ) )
2615 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 )
2620 LOGICAL FUNCTION LCE( RI, RJ, LR )
2622 * Tests if two arrays are identical.
2624 * Auxiliary routine for test program for Level 3 Blas.
2626 * -- Written on 8-February-1989.
2627 * Jack Dongarra, Argonne National Laboratory.
2628 * Iain Duff, AERE Harwell.
2629 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
2630 * Sven Hammarling, Numerical Algorithms Group Ltd.
2632 * .. Scalar Arguments ..
2634 * .. Array Arguments ..
2635 COMPLEX RI( * ), RJ( * )
2636 * .. Local Scalars ..
2638 * .. Executable Statements ..
2640 IF( RI( I ).NE.RJ( I ) )
2652 LOGICAL FUNCTION LCERES( TYPE, UPLO, M, N, AA, AS, LDA )
2654 * Tests if selected elements in two arrays are equal.
2656 * TYPE is 'ge' or 'he' or 'sy'.
2658 * Auxiliary routine for test program for Level 3 Blas.
2660 * -- Written on 8-February-1989.
2661 * Jack Dongarra, Argonne National Laboratory.
2662 * Iain Duff, AERE Harwell.
2663 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
2664 * Sven Hammarling, Numerical Algorithms Group Ltd.
2666 * .. Scalar Arguments ..
2670 * .. Array Arguments ..
2671 COMPLEX AA( LDA, * ), AS( LDA, * )
2672 * .. Local Scalars ..
2673 INTEGER I, IBEG, IEND, J
2675 * .. Executable Statements ..
2677 IF( TYPE.EQ.'ge' )THEN
2679 DO 10 I = M + 1, LDA
2680 IF( AA( I, J ).NE.AS( I, J ) )
2684 ELSE IF( TYPE.EQ.'he'.OR.TYPE.EQ.'sy' )THEN
2693 DO 30 I = 1, IBEG - 1
2694 IF( AA( I, J ).NE.AS( I, J ) )
2697 DO 40 I = IEND + 1, LDA
2698 IF( AA( I, J ).NE.AS( I, J ) )
2714 COMPLEX FUNCTION CBEG( RESET )
2716 * Generates complex numbers as pairs of random numbers uniformly
2717 * distributed between -0.5 and 0.5.
2719 * Auxiliary routine for test program for Level 3 Blas.
2721 * -- Written on 8-February-1989.
2722 * Jack Dongarra, Argonne National Laboratory.
2723 * Iain Duff, AERE Harwell.
2724 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
2725 * Sven Hammarling, Numerical Algorithms Group Ltd.
2727 * .. Scalar Arguments ..
2729 * .. Local Scalars ..
2730 INTEGER I, IC, J, MI, MJ
2731 * .. Save statement ..
2732 SAVE I, IC, J, MI, MJ
2733 * .. Intrinsic Functions ..
2735 * .. Executable Statements ..
2737 * Initialize local variables.
2746 * The sequence of values of I or J is bounded between 1 and 999.
2747 * If initial I or J = 1,2,3,6,7 or 9, the period will be 50.
2748 * If initial I or J = 4 or 8, the period will be 25.
2749 * If initial I or J = 5, the period will be 10.
2750 * IC is used to break up the period by skipping 1 value of I or J
2756 I = I - 1000*( I/1000 )
2757 J = J - 1000*( J/1000 )
2762 CBEG = CMPLX( ( I - 500 )/1001.0, ( J - 500 )/1001.0 )
2768 REAL FUNCTION SDIFF( X, Y )
2770 * Auxiliary routine for test program for Level 3 Blas.
2772 * -- Written on 8-February-1989.
2773 * Jack Dongarra, Argonne National Laboratory.
2774 * Iain Duff, AERE Harwell.
2775 * Jeremy Du Croz, Numerical Algorithms Group Ltd.
2776 * Sven Hammarling, Numerical Algorithms Group Ltd.
2778 * .. Scalar Arguments ..
2780 * .. Executable Statements ..