LAPACK 3.3.1
Linear Algebra PACKage
|
00001 PROGRAM ZBLAT3 00002 * 00003 * Test program for the COMPLEX*16 Level 3 Blas. 00004 * 00005 * The program must be driven by a short data file. The first 14 records 00006 * of the file are read using list-directed input, the last 9 records 00007 * are read using the format ( A6, L2 ). An annotated example of a data 00008 * file can be obtained by deleting the first 3 characters from the 00009 * following 23 lines: 00010 * 'zblat3.out' NAME OF SUMMARY OUTPUT FILE 00011 * 6 UNIT NUMBER OF SUMMARY FILE 00012 * 'ZBLAT3.SNAP' NAME OF SNAPSHOT OUTPUT FILE 00013 * -1 UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0) 00014 * F LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD. 00015 * F LOGICAL FLAG, T TO STOP ON FAILURES. 00016 * T LOGICAL FLAG, T TO TEST ERROR EXITS. 00017 * 16.0 THRESHOLD VALUE OF TEST RATIO 00018 * 6 NUMBER OF VALUES OF N 00019 * 0 1 2 3 5 9 VALUES OF N 00020 * 3 NUMBER OF VALUES OF ALPHA 00021 * (0.0,0.0) (1.0,0.0) (0.7,-0.9) VALUES OF ALPHA 00022 * 3 NUMBER OF VALUES OF BETA 00023 * (0.0,0.0) (1.0,0.0) (1.3,-1.1) VALUES OF BETA 00024 * ZGEMM T PUT F FOR NO TEST. SAME COLUMNS. 00025 * ZHEMM T PUT F FOR NO TEST. SAME COLUMNS. 00026 * ZSYMM T PUT F FOR NO TEST. SAME COLUMNS. 00027 * ZTRMM T PUT F FOR NO TEST. SAME COLUMNS. 00028 * ZTRSM T PUT F FOR NO TEST. SAME COLUMNS. 00029 * ZHERK T PUT F FOR NO TEST. SAME COLUMNS. 00030 * ZSYRK T PUT F FOR NO TEST. SAME COLUMNS. 00031 * ZHER2K T PUT F FOR NO TEST. SAME COLUMNS. 00032 * ZSYR2K T PUT F FOR NO TEST. SAME COLUMNS. 00033 * 00034 * See: 00035 * 00036 * Dongarra J. J., Du Croz J. J., Duff I. S. and Hammarling S. 00037 * A Set of Level 3 Basic Linear Algebra Subprograms. 00038 * 00039 * Technical Memorandum No.88 (Revision 1), Mathematics and 00040 * Computer Science Division, Argonne National Laboratory, 9700 00041 * South Cass Avenue, Argonne, Illinois 60439, US. 00042 * 00043 * -- Written on 8-February-1989. 00044 * Jack Dongarra, Argonne National Laboratory. 00045 * Iain Duff, AERE Harwell. 00046 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 00047 * Sven Hammarling, Numerical Algorithms Group Ltd. 00048 * 00049 * 10-9-00: Change STATUS='NEW' to 'UNKNOWN' so that the testers 00050 * can be run multiple times without deleting generated 00051 * output files (susan) 00052 * 00053 * .. Parameters .. 00054 INTEGER NIN 00055 PARAMETER ( NIN = 5 ) 00056 INTEGER NSUBS 00057 PARAMETER ( NSUBS = 9 ) 00058 COMPLEX*16 ZERO, ONE 00059 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ), 00060 $ ONE = ( 1.0D0, 0.0D0 ) ) 00061 DOUBLE PRECISION RZERO, RHALF, RONE 00062 PARAMETER ( RZERO = 0.0D0, RHALF = 0.5D0, RONE = 1.0D0 ) 00063 INTEGER NMAX 00064 PARAMETER ( NMAX = 65 ) 00065 INTEGER NIDMAX, NALMAX, NBEMAX 00066 PARAMETER ( NIDMAX = 9, NALMAX = 7, NBEMAX = 7 ) 00067 * .. Local Scalars .. 00068 DOUBLE PRECISION EPS, ERR, THRESH 00069 INTEGER I, ISNUM, J, N, NALF, NBET, NIDIM, NOUT, NTRA 00070 LOGICAL FATAL, LTESTT, REWI, SAME, SFATAL, TRACE, 00071 $ TSTERR 00072 CHARACTER*1 TRANSA, TRANSB 00073 CHARACTER*6 SNAMET 00074 CHARACTER*32 SNAPS, SUMMRY 00075 * .. Local Arrays .. 00076 COMPLEX*16 AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ), 00077 $ ALF( NALMAX ), AS( NMAX*NMAX ), 00078 $ BB( NMAX*NMAX ), BET( NBEMAX ), 00079 $ BS( NMAX*NMAX ), C( NMAX, NMAX ), 00080 $ CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ), 00081 $ W( 2*NMAX ) 00082 DOUBLE PRECISION G( NMAX ) 00083 INTEGER IDIM( NIDMAX ) 00084 LOGICAL LTEST( NSUBS ) 00085 CHARACTER*6 SNAMES( NSUBS ) 00086 * .. External Functions .. 00087 DOUBLE PRECISION DDIFF 00088 LOGICAL LZE 00089 EXTERNAL DDIFF, LZE 00090 * .. External Subroutines .. 00091 EXTERNAL ZCHK1, ZCHK2, ZCHK3, ZCHK4, ZCHK5, ZCHKE, ZMMCH 00092 * .. Intrinsic Functions .. 00093 INTRINSIC MAX, MIN 00094 * .. Scalars in Common .. 00095 INTEGER INFOT, NOUTC 00096 LOGICAL LERR, OK 00097 CHARACTER*6 SRNAMT 00098 * .. Common blocks .. 00099 COMMON /INFOC/INFOT, NOUTC, OK, LERR 00100 COMMON /SRNAMC/SRNAMT 00101 * .. Data statements .. 00102 DATA SNAMES/'ZGEMM ', 'ZHEMM ', 'ZSYMM ', 'ZTRMM ', 00103 $ 'ZTRSM ', 'ZHERK ', 'ZSYRK ', 'ZHER2K', 00104 $ 'ZSYR2K'/ 00105 * .. Executable Statements .. 00106 * 00107 * Read name and unit number for summary output file and open file. 00108 * 00109 READ( NIN, FMT = * )SUMMRY 00110 READ( NIN, FMT = * )NOUT 00111 OPEN( NOUT, FILE = SUMMRY, STATUS = 'UNKNOWN' ) 00112 NOUTC = NOUT 00113 * 00114 * Read name and unit number for snapshot output file and open file. 00115 * 00116 READ( NIN, FMT = * )SNAPS 00117 READ( NIN, FMT = * )NTRA 00118 TRACE = NTRA.GE.0 00119 IF( TRACE )THEN 00120 OPEN( NTRA, FILE = SNAPS, STATUS = 'UNKNOWN' ) 00121 END IF 00122 * Read the flag that directs rewinding of the snapshot file. 00123 READ( NIN, FMT = * )REWI 00124 REWI = REWI.AND.TRACE 00125 * Read the flag that directs stopping on any failure. 00126 READ( NIN, FMT = * )SFATAL 00127 * Read the flag that indicates whether error exits are to be tested. 00128 READ( NIN, FMT = * )TSTERR 00129 * Read the threshold value of the test ratio 00130 READ( NIN, FMT = * )THRESH 00131 * 00132 * Read and check the parameter values for the tests. 00133 * 00134 * Values of N 00135 READ( NIN, FMT = * )NIDIM 00136 IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN 00137 WRITE( NOUT, FMT = 9997 )'N', NIDMAX 00138 GO TO 220 00139 END IF 00140 READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM ) 00141 DO 10 I = 1, NIDIM 00142 IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN 00143 WRITE( NOUT, FMT = 9996 )NMAX 00144 GO TO 220 00145 END IF 00146 10 CONTINUE 00147 * Values of ALPHA 00148 READ( NIN, FMT = * )NALF 00149 IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN 00150 WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX 00151 GO TO 220 00152 END IF 00153 READ( NIN, FMT = * )( ALF( I ), I = 1, NALF ) 00154 * Values of BETA 00155 READ( NIN, FMT = * )NBET 00156 IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN 00157 WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX 00158 GO TO 220 00159 END IF 00160 READ( NIN, FMT = * )( BET( I ), I = 1, NBET ) 00161 * 00162 * Report values of parameters. 00163 * 00164 WRITE( NOUT, FMT = 9995 ) 00165 WRITE( NOUT, FMT = 9994 )( IDIM( I ), I = 1, NIDIM ) 00166 WRITE( NOUT, FMT = 9993 )( ALF( I ), I = 1, NALF ) 00167 WRITE( NOUT, FMT = 9992 )( BET( I ), I = 1, NBET ) 00168 IF( .NOT.TSTERR )THEN 00169 WRITE( NOUT, FMT = * ) 00170 WRITE( NOUT, FMT = 9984 ) 00171 END IF 00172 WRITE( NOUT, FMT = * ) 00173 WRITE( NOUT, FMT = 9999 )THRESH 00174 WRITE( NOUT, FMT = * ) 00175 * 00176 * Read names of subroutines and flags which indicate 00177 * whether they are to be tested. 00178 * 00179 DO 20 I = 1, NSUBS 00180 LTEST( I ) = .FALSE. 00181 20 CONTINUE 00182 30 READ( NIN, FMT = 9988, END = 60 )SNAMET, LTESTT 00183 DO 40 I = 1, NSUBS 00184 IF( SNAMET.EQ.SNAMES( I ) ) 00185 $ GO TO 50 00186 40 CONTINUE 00187 WRITE( NOUT, FMT = 9990 )SNAMET 00188 STOP 00189 50 LTEST( I ) = LTESTT 00190 GO TO 30 00191 * 00192 60 CONTINUE 00193 CLOSE ( NIN ) 00194 * 00195 * Compute EPS (the machine precision). 00196 * 00197 EPS = RONE 00198 70 CONTINUE 00199 IF( DDIFF( RONE + EPS, RONE ).EQ.RZERO ) 00200 $ GO TO 80 00201 EPS = RHALF*EPS 00202 GO TO 70 00203 80 CONTINUE 00204 EPS = EPS + EPS 00205 WRITE( NOUT, FMT = 9998 )EPS 00206 * 00207 * Check the reliability of ZMMCH using exact data. 00208 * 00209 N = MIN( 32, NMAX ) 00210 DO 100 J = 1, N 00211 DO 90 I = 1, N 00212 AB( I, J ) = MAX( I - J + 1, 0 ) 00213 90 CONTINUE 00214 AB( J, NMAX + 1 ) = J 00215 AB( 1, NMAX + J ) = J 00216 C( J, 1 ) = ZERO 00217 100 CONTINUE 00218 DO 110 J = 1, N 00219 CC( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3 00220 110 CONTINUE 00221 * CC holds the exact result. On exit from ZMMCH CT holds 00222 * the result computed by ZMMCH. 00223 TRANSA = 'N' 00224 TRANSB = 'N' 00225 CALL ZMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX, 00226 $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC, 00227 $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. ) 00228 SAME = LZE( CC, CT, N ) 00229 IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN 00230 WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR 00231 STOP 00232 END IF 00233 TRANSB = 'C' 00234 CALL ZMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX, 00235 $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC, 00236 $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. ) 00237 SAME = LZE( CC, CT, N ) 00238 IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN 00239 WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR 00240 STOP 00241 END IF 00242 DO 120 J = 1, N 00243 AB( J, NMAX + 1 ) = N - J + 1 00244 AB( 1, NMAX + J ) = N - J + 1 00245 120 CONTINUE 00246 DO 130 J = 1, N 00247 CC( N - J + 1 ) = J*( ( J + 1 )*J )/2 - 00248 $ ( ( J + 1 )*J*( J - 1 ) )/3 00249 130 CONTINUE 00250 TRANSA = 'C' 00251 TRANSB = 'N' 00252 CALL ZMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX, 00253 $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC, 00254 $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. ) 00255 SAME = LZE( CC, CT, N ) 00256 IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN 00257 WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR 00258 STOP 00259 END IF 00260 TRANSB = 'C' 00261 CALL ZMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX, 00262 $ AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC, 00263 $ NMAX, EPS, ERR, FATAL, NOUT, .TRUE. ) 00264 SAME = LZE( CC, CT, N ) 00265 IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN 00266 WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR 00267 STOP 00268 END IF 00269 * 00270 * Test each subroutine in turn. 00271 * 00272 DO 200 ISNUM = 1, NSUBS 00273 WRITE( NOUT, FMT = * ) 00274 IF( .NOT.LTEST( ISNUM ) )THEN 00275 * Subprogram is not to be tested. 00276 WRITE( NOUT, FMT = 9987 )SNAMES( ISNUM ) 00277 ELSE 00278 SRNAMT = SNAMES( ISNUM ) 00279 * Test error exits. 00280 IF( TSTERR )THEN 00281 CALL ZCHKE( ISNUM, SNAMES( ISNUM ), NOUT ) 00282 WRITE( NOUT, FMT = * ) 00283 END IF 00284 * Test computations. 00285 INFOT = 0 00286 OK = .TRUE. 00287 FATAL = .FALSE. 00288 GO TO ( 140, 150, 150, 160, 160, 170, 170, 00289 $ 180, 180 )ISNUM 00290 * Test ZGEMM, 01. 00291 140 CALL ZCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, 00292 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, 00293 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, 00294 $ CC, CS, CT, G ) 00295 GO TO 190 00296 * Test ZHEMM, 02, ZSYMM, 03. 00297 150 CALL ZCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, 00298 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, 00299 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, 00300 $ CC, CS, CT, G ) 00301 GO TO 190 00302 * Test ZTRMM, 04, ZTRSM, 05. 00303 160 CALL ZCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, 00304 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB, 00305 $ AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C ) 00306 GO TO 190 00307 * Test ZHERK, 06, ZSYRK, 07. 00308 170 CALL ZCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, 00309 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, 00310 $ NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C, 00311 $ CC, CS, CT, G ) 00312 GO TO 190 00313 * Test ZHER2K, 08, ZSYR2K, 09. 00314 180 CALL ZCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE, 00315 $ REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, 00316 $ NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W ) 00317 GO TO 190 00318 * 00319 190 IF( FATAL.AND.SFATAL ) 00320 $ GO TO 210 00321 END IF 00322 200 CONTINUE 00323 WRITE( NOUT, FMT = 9986 ) 00324 GO TO 230 00325 * 00326 210 CONTINUE 00327 WRITE( NOUT, FMT = 9985 ) 00328 GO TO 230 00329 * 00330 220 CONTINUE 00331 WRITE( NOUT, FMT = 9991 ) 00332 * 00333 230 CONTINUE 00334 IF( TRACE ) 00335 $ CLOSE ( NTRA ) 00336 CLOSE ( NOUT ) 00337 STOP 00338 * 00339 9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES', 00340 $ 'S THAN', F8.2 ) 00341 9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, D9.1 ) 00342 9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ', 00343 $ 'THAN ', I2 ) 00344 9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 ) 00345 9995 FORMAT( ' TESTS OF THE COMPLEX*16 LEVEL 3 BLAS', //' THE F', 00346 $ 'OLLOWING PARAMETER VALUES WILL BE USED:' ) 00347 9994 FORMAT( ' FOR N ', 9I6 ) 00348 9993 FORMAT( ' FOR ALPHA ', 00349 $ 7( '(', F4.1, ',', F4.1, ') ', : ) ) 00350 9992 FORMAT( ' FOR BETA ', 00351 $ 7( '(', F4.1, ',', F4.1, ') ', : ) ) 00352 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM', 00353 $ /' ******* TESTS ABANDONED *******' ) 00354 9990 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T', 00355 $ 'ESTS ABANDONED *******' ) 00356 9989 FORMAT( ' ERROR IN ZMMCH - IN-LINE DOT PRODUCTS ARE BEING EVALU', 00357 $ 'ATED WRONGLY.', /' ZMMCH WAS CALLED WITH TRANSA = ', A1, 00358 $ ' AND TRANSB = ', A1, /' AND RETURNED SAME = ', L1, ' AND ', 00359 $ 'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ', 00360 $ 'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ', 00361 $ '*******' ) 00362 9988 FORMAT( A6, L2 ) 00363 9987 FORMAT( 1X, A6, ' WAS NOT TESTED' ) 00364 9986 FORMAT( /' END OF TESTS' ) 00365 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' ) 00366 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' ) 00367 * 00368 * End of ZBLAT3. 00369 * 00370 END 00371 SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 00372 $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, 00373 $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G ) 00374 * 00375 * Tests ZGEMM. 00376 * 00377 * Auxiliary routine for test program for Level 3 Blas. 00378 * 00379 * -- Written on 8-February-1989. 00380 * Jack Dongarra, Argonne National Laboratory. 00381 * Iain Duff, AERE Harwell. 00382 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 00383 * Sven Hammarling, Numerical Algorithms Group Ltd. 00384 * 00385 * .. Parameters .. 00386 COMPLEX*16 ZERO 00387 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ) ) 00388 DOUBLE PRECISION RZERO 00389 PARAMETER ( RZERO = 0.0D0 ) 00390 * .. Scalar Arguments .. 00391 DOUBLE PRECISION EPS, THRESH 00392 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA 00393 LOGICAL FATAL, REWI, TRACE 00394 CHARACTER*6 SNAME 00395 * .. Array Arguments .. 00396 COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), 00397 $ AS( NMAX*NMAX ), B( NMAX, NMAX ), 00398 $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ), 00399 $ C( NMAX, NMAX ), CC( NMAX*NMAX ), 00400 $ CS( NMAX*NMAX ), CT( NMAX ) 00401 DOUBLE PRECISION G( NMAX ) 00402 INTEGER IDIM( NIDIM ) 00403 * .. Local Scalars .. 00404 COMPLEX*16 ALPHA, ALS, BETA, BLS 00405 DOUBLE PRECISION ERR, ERRMAX 00406 INTEGER I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA, 00407 $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, M, 00408 $ MA, MB, MS, N, NA, NARGS, NB, NC, NS 00409 LOGICAL NULL, RESET, SAME, TRANA, TRANB 00410 CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB 00411 CHARACTER*3 ICH 00412 * .. Local Arrays .. 00413 LOGICAL ISAME( 13 ) 00414 * .. External Functions .. 00415 LOGICAL LZE, LZERES 00416 EXTERNAL LZE, LZERES 00417 * .. External Subroutines .. 00418 EXTERNAL ZGEMM, ZMAKE, ZMMCH 00419 * .. Intrinsic Functions .. 00420 INTRINSIC MAX 00421 * .. Scalars in Common .. 00422 INTEGER INFOT, NOUTC 00423 LOGICAL LERR, OK 00424 * .. Common blocks .. 00425 COMMON /INFOC/INFOT, NOUTC, OK, LERR 00426 * .. Data statements .. 00427 DATA ICH/'NTC'/ 00428 * .. Executable Statements .. 00429 * 00430 NARGS = 13 00431 NC = 0 00432 RESET = .TRUE. 00433 ERRMAX = RZERO 00434 * 00435 DO 110 IM = 1, NIDIM 00436 M = IDIM( IM ) 00437 * 00438 DO 100 IN = 1, NIDIM 00439 N = IDIM( IN ) 00440 * Set LDC to 1 more than minimum value if room. 00441 LDC = M 00442 IF( LDC.LT.NMAX ) 00443 $ LDC = LDC + 1 00444 * Skip tests if not enough room. 00445 IF( LDC.GT.NMAX ) 00446 $ GO TO 100 00447 LCC = LDC*N 00448 NULL = N.LE.0.OR.M.LE.0 00449 * 00450 DO 90 IK = 1, NIDIM 00451 K = IDIM( IK ) 00452 * 00453 DO 80 ICA = 1, 3 00454 TRANSA = ICH( ICA: ICA ) 00455 TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' 00456 * 00457 IF( TRANA )THEN 00458 MA = K 00459 NA = M 00460 ELSE 00461 MA = M 00462 NA = K 00463 END IF 00464 * Set LDA to 1 more than minimum value if room. 00465 LDA = MA 00466 IF( LDA.LT.NMAX ) 00467 $ LDA = LDA + 1 00468 * Skip tests if not enough room. 00469 IF( LDA.GT.NMAX ) 00470 $ GO TO 80 00471 LAA = LDA*NA 00472 * 00473 * Generate the matrix A. 00474 * 00475 CALL ZMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA, 00476 $ RESET, ZERO ) 00477 * 00478 DO 70 ICB = 1, 3 00479 TRANSB = ICH( ICB: ICB ) 00480 TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' 00481 * 00482 IF( TRANB )THEN 00483 MB = N 00484 NB = K 00485 ELSE 00486 MB = K 00487 NB = N 00488 END IF 00489 * Set LDB to 1 more than minimum value if room. 00490 LDB = MB 00491 IF( LDB.LT.NMAX ) 00492 $ LDB = LDB + 1 00493 * Skip tests if not enough room. 00494 IF( LDB.GT.NMAX ) 00495 $ GO TO 70 00496 LBB = LDB*NB 00497 * 00498 * Generate the matrix B. 00499 * 00500 CALL ZMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB, 00501 $ LDB, RESET, ZERO ) 00502 * 00503 DO 60 IA = 1, NALF 00504 ALPHA = ALF( IA ) 00505 * 00506 DO 50 IB = 1, NBET 00507 BETA = BET( IB ) 00508 * 00509 * Generate the matrix C. 00510 * 00511 CALL ZMAKE( 'GE', ' ', ' ', M, N, C, NMAX, 00512 $ CC, LDC, RESET, ZERO ) 00513 * 00514 NC = NC + 1 00515 * 00516 * Save every datum before calling the 00517 * subroutine. 00518 * 00519 TRANAS = TRANSA 00520 TRANBS = TRANSB 00521 MS = M 00522 NS = N 00523 KS = K 00524 ALS = ALPHA 00525 DO 10 I = 1, LAA 00526 AS( I ) = AA( I ) 00527 10 CONTINUE 00528 LDAS = LDA 00529 DO 20 I = 1, LBB 00530 BS( I ) = BB( I ) 00531 20 CONTINUE 00532 LDBS = LDB 00533 BLS = BETA 00534 DO 30 I = 1, LCC 00535 CS( I ) = CC( I ) 00536 30 CONTINUE 00537 LDCS = LDC 00538 * 00539 * Call the subroutine. 00540 * 00541 IF( TRACE ) 00542 $ WRITE( NTRA, FMT = 9995 )NC, SNAME, 00543 $ TRANSA, TRANSB, M, N, K, ALPHA, LDA, LDB, 00544 $ BETA, LDC 00545 IF( REWI ) 00546 $ REWIND NTRA 00547 CALL ZGEMM( TRANSA, TRANSB, M, N, K, ALPHA, 00548 $ AA, LDA, BB, LDB, BETA, CC, LDC ) 00549 * 00550 * Check if error-exit was taken incorrectly. 00551 * 00552 IF( .NOT.OK )THEN 00553 WRITE( NOUT, FMT = 9994 ) 00554 FATAL = .TRUE. 00555 GO TO 120 00556 END IF 00557 * 00558 * See what data changed inside subroutines. 00559 * 00560 ISAME( 1 ) = TRANSA.EQ.TRANAS 00561 ISAME( 2 ) = TRANSB.EQ.TRANBS 00562 ISAME( 3 ) = MS.EQ.M 00563 ISAME( 4 ) = NS.EQ.N 00564 ISAME( 5 ) = KS.EQ.K 00565 ISAME( 6 ) = ALS.EQ.ALPHA 00566 ISAME( 7 ) = LZE( AS, AA, LAA ) 00567 ISAME( 8 ) = LDAS.EQ.LDA 00568 ISAME( 9 ) = LZE( BS, BB, LBB ) 00569 ISAME( 10 ) = LDBS.EQ.LDB 00570 ISAME( 11 ) = BLS.EQ.BETA 00571 IF( NULL )THEN 00572 ISAME( 12 ) = LZE( CS, CC, LCC ) 00573 ELSE 00574 ISAME( 12 ) = LZERES( 'GE', ' ', M, N, CS, 00575 $ CC, LDC ) 00576 END IF 00577 ISAME( 13 ) = LDCS.EQ.LDC 00578 * 00579 * If data was incorrectly changed, report 00580 * and return. 00581 * 00582 SAME = .TRUE. 00583 DO 40 I = 1, NARGS 00584 SAME = SAME.AND.ISAME( I ) 00585 IF( .NOT.ISAME( I ) ) 00586 $ WRITE( NOUT, FMT = 9998 )I 00587 40 CONTINUE 00588 IF( .NOT.SAME )THEN 00589 FATAL = .TRUE. 00590 GO TO 120 00591 END IF 00592 * 00593 IF( .NOT.NULL )THEN 00594 * 00595 * Check the result. 00596 * 00597 CALL ZMMCH( TRANSA, TRANSB, M, N, K, 00598 $ ALPHA, A, NMAX, B, NMAX, BETA, 00599 $ C, NMAX, CT, G, CC, LDC, EPS, 00600 $ ERR, FATAL, NOUT, .TRUE. ) 00601 ERRMAX = MAX( ERRMAX, ERR ) 00602 * If got really bad answer, report and 00603 * return. 00604 IF( FATAL ) 00605 $ GO TO 120 00606 END IF 00607 * 00608 50 CONTINUE 00609 * 00610 60 CONTINUE 00611 * 00612 70 CONTINUE 00613 * 00614 80 CONTINUE 00615 * 00616 90 CONTINUE 00617 * 00618 100 CONTINUE 00619 * 00620 110 CONTINUE 00621 * 00622 * Report result. 00623 * 00624 IF( ERRMAX.LT.THRESH )THEN 00625 WRITE( NOUT, FMT = 9999 )SNAME, NC 00626 ELSE 00627 WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX 00628 END IF 00629 GO TO 130 00630 * 00631 120 CONTINUE 00632 WRITE( NOUT, FMT = 9996 )SNAME 00633 WRITE( NOUT, FMT = 9995 )NC, SNAME, TRANSA, TRANSB, M, N, K, 00634 $ ALPHA, LDA, LDB, BETA, LDC 00635 * 00636 130 CONTINUE 00637 RETURN 00638 * 00639 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', 00640 $ 'S)' ) 00641 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', 00642 $ 'ANGED INCORRECTLY *******' ) 00643 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', 00644 $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, 00645 $ ' - SUSPECT *******' ) 00646 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) 00647 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',''', A1, ''',', 00648 $ 3( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, 00649 $ ',(', F4.1, ',', F4.1, '), C,', I3, ').' ) 00650 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', 00651 $ '******' ) 00652 * 00653 * End of ZCHK1. 00654 * 00655 END 00656 SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 00657 $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, 00658 $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G ) 00659 * 00660 * Tests ZHEMM and ZSYMM. 00661 * 00662 * Auxiliary routine for test program for Level 3 Blas. 00663 * 00664 * -- Written on 8-February-1989. 00665 * Jack Dongarra, Argonne National Laboratory. 00666 * Iain Duff, AERE Harwell. 00667 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 00668 * Sven Hammarling, Numerical Algorithms Group Ltd. 00669 * 00670 * .. Parameters .. 00671 COMPLEX*16 ZERO 00672 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ) ) 00673 DOUBLE PRECISION RZERO 00674 PARAMETER ( RZERO = 0.0D0 ) 00675 * .. Scalar Arguments .. 00676 DOUBLE PRECISION EPS, THRESH 00677 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA 00678 LOGICAL FATAL, REWI, TRACE 00679 CHARACTER*6 SNAME 00680 * .. Array Arguments .. 00681 COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), 00682 $ AS( NMAX*NMAX ), B( NMAX, NMAX ), 00683 $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ), 00684 $ C( NMAX, NMAX ), CC( NMAX*NMAX ), 00685 $ CS( NMAX*NMAX ), CT( NMAX ) 00686 DOUBLE PRECISION G( NMAX ) 00687 INTEGER IDIM( NIDIM ) 00688 * .. Local Scalars .. 00689 COMPLEX*16 ALPHA, ALS, BETA, BLS 00690 DOUBLE PRECISION ERR, ERRMAX 00691 INTEGER I, IA, IB, ICS, ICU, IM, IN, LAA, LBB, LCC, 00692 $ LDA, LDAS, LDB, LDBS, LDC, LDCS, M, MS, N, NA, 00693 $ NARGS, NC, NS 00694 LOGICAL CONJ, LEFT, NULL, RESET, SAME 00695 CHARACTER*1 SIDE, SIDES, UPLO, UPLOS 00696 CHARACTER*2 ICHS, ICHU 00697 * .. Local Arrays .. 00698 LOGICAL ISAME( 13 ) 00699 * .. External Functions .. 00700 LOGICAL LZE, LZERES 00701 EXTERNAL LZE, LZERES 00702 * .. External Subroutines .. 00703 EXTERNAL ZHEMM, ZMAKE, ZMMCH, ZSYMM 00704 * .. Intrinsic Functions .. 00705 INTRINSIC MAX 00706 * .. Scalars in Common .. 00707 INTEGER INFOT, NOUTC 00708 LOGICAL LERR, OK 00709 * .. Common blocks .. 00710 COMMON /INFOC/INFOT, NOUTC, OK, LERR 00711 * .. Data statements .. 00712 DATA ICHS/'LR'/, ICHU/'UL'/ 00713 * .. Executable Statements .. 00714 CONJ = SNAME( 2: 3 ).EQ.'HE' 00715 * 00716 NARGS = 12 00717 NC = 0 00718 RESET = .TRUE. 00719 ERRMAX = RZERO 00720 * 00721 DO 100 IM = 1, NIDIM 00722 M = IDIM( IM ) 00723 * 00724 DO 90 IN = 1, NIDIM 00725 N = IDIM( IN ) 00726 * Set LDC to 1 more than minimum value if room. 00727 LDC = M 00728 IF( LDC.LT.NMAX ) 00729 $ LDC = LDC + 1 00730 * Skip tests if not enough room. 00731 IF( LDC.GT.NMAX ) 00732 $ GO TO 90 00733 LCC = LDC*N 00734 NULL = N.LE.0.OR.M.LE.0 00735 * Set LDB to 1 more than minimum value if room. 00736 LDB = M 00737 IF( LDB.LT.NMAX ) 00738 $ LDB = LDB + 1 00739 * Skip tests if not enough room. 00740 IF( LDB.GT.NMAX ) 00741 $ GO TO 90 00742 LBB = LDB*N 00743 * 00744 * Generate the matrix B. 00745 * 00746 CALL ZMAKE( 'GE', ' ', ' ', M, N, B, NMAX, BB, LDB, RESET, 00747 $ ZERO ) 00748 * 00749 DO 80 ICS = 1, 2 00750 SIDE = ICHS( ICS: ICS ) 00751 LEFT = SIDE.EQ.'L' 00752 * 00753 IF( LEFT )THEN 00754 NA = M 00755 ELSE 00756 NA = N 00757 END IF 00758 * Set LDA to 1 more than minimum value if room. 00759 LDA = NA 00760 IF( LDA.LT.NMAX ) 00761 $ LDA = LDA + 1 00762 * Skip tests if not enough room. 00763 IF( LDA.GT.NMAX ) 00764 $ GO TO 80 00765 LAA = LDA*NA 00766 * 00767 DO 70 ICU = 1, 2 00768 UPLO = ICHU( ICU: ICU ) 00769 * 00770 * Generate the hermitian or symmetric matrix A. 00771 * 00772 CALL ZMAKE( SNAME( 2: 3 ), UPLO, ' ', NA, NA, A, NMAX, 00773 $ AA, LDA, RESET, ZERO ) 00774 * 00775 DO 60 IA = 1, NALF 00776 ALPHA = ALF( IA ) 00777 * 00778 DO 50 IB = 1, NBET 00779 BETA = BET( IB ) 00780 * 00781 * Generate the matrix C. 00782 * 00783 CALL ZMAKE( 'GE', ' ', ' ', M, N, C, NMAX, CC, 00784 $ LDC, RESET, ZERO ) 00785 * 00786 NC = NC + 1 00787 * 00788 * Save every datum before calling the 00789 * subroutine. 00790 * 00791 SIDES = SIDE 00792 UPLOS = UPLO 00793 MS = M 00794 NS = N 00795 ALS = ALPHA 00796 DO 10 I = 1, LAA 00797 AS( I ) = AA( I ) 00798 10 CONTINUE 00799 LDAS = LDA 00800 DO 20 I = 1, LBB 00801 BS( I ) = BB( I ) 00802 20 CONTINUE 00803 LDBS = LDB 00804 BLS = BETA 00805 DO 30 I = 1, LCC 00806 CS( I ) = CC( I ) 00807 30 CONTINUE 00808 LDCS = LDC 00809 * 00810 * Call the subroutine. 00811 * 00812 IF( TRACE ) 00813 $ WRITE( NTRA, FMT = 9995 )NC, SNAME, SIDE, 00814 $ UPLO, M, N, ALPHA, LDA, LDB, BETA, LDC 00815 IF( REWI ) 00816 $ REWIND NTRA 00817 IF( CONJ )THEN 00818 CALL ZHEMM( SIDE, UPLO, M, N, ALPHA, AA, LDA, 00819 $ BB, LDB, BETA, CC, LDC ) 00820 ELSE 00821 CALL ZSYMM( SIDE, UPLO, M, N, ALPHA, AA, LDA, 00822 $ BB, LDB, BETA, CC, LDC ) 00823 END IF 00824 * 00825 * Check if error-exit was taken incorrectly. 00826 * 00827 IF( .NOT.OK )THEN 00828 WRITE( NOUT, FMT = 9994 ) 00829 FATAL = .TRUE. 00830 GO TO 110 00831 END IF 00832 * 00833 * See what data changed inside subroutines. 00834 * 00835 ISAME( 1 ) = SIDES.EQ.SIDE 00836 ISAME( 2 ) = UPLOS.EQ.UPLO 00837 ISAME( 3 ) = MS.EQ.M 00838 ISAME( 4 ) = NS.EQ.N 00839 ISAME( 5 ) = ALS.EQ.ALPHA 00840 ISAME( 6 ) = LZE( AS, AA, LAA ) 00841 ISAME( 7 ) = LDAS.EQ.LDA 00842 ISAME( 8 ) = LZE( BS, BB, LBB ) 00843 ISAME( 9 ) = LDBS.EQ.LDB 00844 ISAME( 10 ) = BLS.EQ.BETA 00845 IF( NULL )THEN 00846 ISAME( 11 ) = LZE( CS, CC, LCC ) 00847 ELSE 00848 ISAME( 11 ) = LZERES( 'GE', ' ', M, N, CS, 00849 $ CC, LDC ) 00850 END IF 00851 ISAME( 12 ) = LDCS.EQ.LDC 00852 * 00853 * If data was incorrectly changed, report and 00854 * return. 00855 * 00856 SAME = .TRUE. 00857 DO 40 I = 1, NARGS 00858 SAME = SAME.AND.ISAME( I ) 00859 IF( .NOT.ISAME( I ) ) 00860 $ WRITE( NOUT, FMT = 9998 )I 00861 40 CONTINUE 00862 IF( .NOT.SAME )THEN 00863 FATAL = .TRUE. 00864 GO TO 110 00865 END IF 00866 * 00867 IF( .NOT.NULL )THEN 00868 * 00869 * Check the result. 00870 * 00871 IF( LEFT )THEN 00872 CALL ZMMCH( 'N', 'N', M, N, M, ALPHA, A, 00873 $ NMAX, B, NMAX, BETA, C, NMAX, 00874 $ CT, G, CC, LDC, EPS, ERR, 00875 $ FATAL, NOUT, .TRUE. ) 00876 ELSE 00877 CALL ZMMCH( 'N', 'N', M, N, N, ALPHA, B, 00878 $ NMAX, A, NMAX, BETA, C, NMAX, 00879 $ CT, G, CC, LDC, EPS, ERR, 00880 $ FATAL, NOUT, .TRUE. ) 00881 END IF 00882 ERRMAX = MAX( ERRMAX, ERR ) 00883 * If got really bad answer, report and 00884 * return. 00885 IF( FATAL ) 00886 $ GO TO 110 00887 END IF 00888 * 00889 50 CONTINUE 00890 * 00891 60 CONTINUE 00892 * 00893 70 CONTINUE 00894 * 00895 80 CONTINUE 00896 * 00897 90 CONTINUE 00898 * 00899 100 CONTINUE 00900 * 00901 * Report result. 00902 * 00903 IF( ERRMAX.LT.THRESH )THEN 00904 WRITE( NOUT, FMT = 9999 )SNAME, NC 00905 ELSE 00906 WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX 00907 END IF 00908 GO TO 120 00909 * 00910 110 CONTINUE 00911 WRITE( NOUT, FMT = 9996 )SNAME 00912 WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, M, N, ALPHA, LDA, 00913 $ LDB, BETA, LDC 00914 * 00915 120 CONTINUE 00916 RETURN 00917 * 00918 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', 00919 $ 'S)' ) 00920 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', 00921 $ 'ANGED INCORRECTLY *******' ) 00922 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', 00923 $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, 00924 $ ' - SUSPECT *******' ) 00925 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) 00926 9995 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), 00927 $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1, 00928 $ ',', F4.1, '), C,', I3, ') .' ) 00929 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', 00930 $ '******' ) 00931 * 00932 * End of ZCHK2. 00933 * 00934 END 00935 SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 00936 $ FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS, 00937 $ B, BB, BS, CT, G, C ) 00938 * 00939 * Tests ZTRMM and ZTRSM. 00940 * 00941 * Auxiliary routine for test program for Level 3 Blas. 00942 * 00943 * -- Written on 8-February-1989. 00944 * Jack Dongarra, Argonne National Laboratory. 00945 * Iain Duff, AERE Harwell. 00946 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 00947 * Sven Hammarling, Numerical Algorithms Group Ltd. 00948 * 00949 * .. Parameters .. 00950 COMPLEX*16 ZERO, ONE 00951 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ), 00952 $ ONE = ( 1.0D0, 0.0D0 ) ) 00953 DOUBLE PRECISION RZERO 00954 PARAMETER ( RZERO = 0.0D0 ) 00955 * .. Scalar Arguments .. 00956 DOUBLE PRECISION EPS, THRESH 00957 INTEGER NALF, NIDIM, NMAX, NOUT, NTRA 00958 LOGICAL FATAL, REWI, TRACE 00959 CHARACTER*6 SNAME 00960 * .. Array Arguments .. 00961 COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), 00962 $ AS( NMAX*NMAX ), B( NMAX, NMAX ), 00963 $ BB( NMAX*NMAX ), BS( NMAX*NMAX ), 00964 $ C( NMAX, NMAX ), CT( NMAX ) 00965 DOUBLE PRECISION G( NMAX ) 00966 INTEGER IDIM( NIDIM ) 00967 * .. Local Scalars .. 00968 COMPLEX*16 ALPHA, ALS 00969 DOUBLE PRECISION ERR, ERRMAX 00970 INTEGER I, IA, ICD, ICS, ICT, ICU, IM, IN, J, LAA, LBB, 00971 $ LDA, LDAS, LDB, LDBS, M, MS, N, NA, NARGS, NC, 00972 $ NS 00973 LOGICAL LEFT, NULL, RESET, SAME 00974 CHARACTER*1 DIAG, DIAGS, SIDE, SIDES, TRANAS, TRANSA, UPLO, 00975 $ UPLOS 00976 CHARACTER*2 ICHD, ICHS, ICHU 00977 CHARACTER*3 ICHT 00978 * .. Local Arrays .. 00979 LOGICAL ISAME( 13 ) 00980 * .. External Functions .. 00981 LOGICAL LZE, LZERES 00982 EXTERNAL LZE, LZERES 00983 * .. External Subroutines .. 00984 EXTERNAL ZMAKE, ZMMCH, ZTRMM, ZTRSM 00985 * .. Intrinsic Functions .. 00986 INTRINSIC MAX 00987 * .. Scalars in Common .. 00988 INTEGER INFOT, NOUTC 00989 LOGICAL LERR, OK 00990 * .. Common blocks .. 00991 COMMON /INFOC/INFOT, NOUTC, OK, LERR 00992 * .. Data statements .. 00993 DATA ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/, ICHS/'LR'/ 00994 * .. Executable Statements .. 00995 * 00996 NARGS = 11 00997 NC = 0 00998 RESET = .TRUE. 00999 ERRMAX = RZERO 01000 * Set up zero matrix for ZMMCH. 01001 DO 20 J = 1, NMAX 01002 DO 10 I = 1, NMAX 01003 C( I, J ) = ZERO 01004 10 CONTINUE 01005 20 CONTINUE 01006 * 01007 DO 140 IM = 1, NIDIM 01008 M = IDIM( IM ) 01009 * 01010 DO 130 IN = 1, NIDIM 01011 N = IDIM( IN ) 01012 * Set LDB to 1 more than minimum value if room. 01013 LDB = M 01014 IF( LDB.LT.NMAX ) 01015 $ LDB = LDB + 1 01016 * Skip tests if not enough room. 01017 IF( LDB.GT.NMAX ) 01018 $ GO TO 130 01019 LBB = LDB*N 01020 NULL = M.LE.0.OR.N.LE.0 01021 * 01022 DO 120 ICS = 1, 2 01023 SIDE = ICHS( ICS: ICS ) 01024 LEFT = SIDE.EQ.'L' 01025 IF( LEFT )THEN 01026 NA = M 01027 ELSE 01028 NA = N 01029 END IF 01030 * Set LDA to 1 more than minimum value if room. 01031 LDA = NA 01032 IF( LDA.LT.NMAX ) 01033 $ LDA = LDA + 1 01034 * Skip tests if not enough room. 01035 IF( LDA.GT.NMAX ) 01036 $ GO TO 130 01037 LAA = LDA*NA 01038 * 01039 DO 110 ICU = 1, 2 01040 UPLO = ICHU( ICU: ICU ) 01041 * 01042 DO 100 ICT = 1, 3 01043 TRANSA = ICHT( ICT: ICT ) 01044 * 01045 DO 90 ICD = 1, 2 01046 DIAG = ICHD( ICD: ICD ) 01047 * 01048 DO 80 IA = 1, NALF 01049 ALPHA = ALF( IA ) 01050 * 01051 * Generate the matrix A. 01052 * 01053 CALL ZMAKE( 'TR', UPLO, DIAG, NA, NA, A, 01054 $ NMAX, AA, LDA, RESET, ZERO ) 01055 * 01056 * Generate the matrix B. 01057 * 01058 CALL ZMAKE( 'GE', ' ', ' ', M, N, B, NMAX, 01059 $ BB, LDB, RESET, ZERO ) 01060 * 01061 NC = NC + 1 01062 * 01063 * Save every datum before calling the 01064 * subroutine. 01065 * 01066 SIDES = SIDE 01067 UPLOS = UPLO 01068 TRANAS = TRANSA 01069 DIAGS = DIAG 01070 MS = M 01071 NS = N 01072 ALS = ALPHA 01073 DO 30 I = 1, LAA 01074 AS( I ) = AA( I ) 01075 30 CONTINUE 01076 LDAS = LDA 01077 DO 40 I = 1, LBB 01078 BS( I ) = BB( I ) 01079 40 CONTINUE 01080 LDBS = LDB 01081 * 01082 * Call the subroutine. 01083 * 01084 IF( SNAME( 4: 5 ).EQ.'MM' )THEN 01085 IF( TRACE ) 01086 $ WRITE( NTRA, FMT = 9995 )NC, SNAME, 01087 $ SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, 01088 $ LDA, LDB 01089 IF( REWI ) 01090 $ REWIND NTRA 01091 CALL ZTRMM( SIDE, UPLO, TRANSA, DIAG, M, 01092 $ N, ALPHA, AA, LDA, BB, LDB ) 01093 ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN 01094 IF( TRACE ) 01095 $ WRITE( NTRA, FMT = 9995 )NC, SNAME, 01096 $ SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, 01097 $ LDA, LDB 01098 IF( REWI ) 01099 $ REWIND NTRA 01100 CALL ZTRSM( SIDE, UPLO, TRANSA, DIAG, M, 01101 $ N, ALPHA, AA, LDA, BB, LDB ) 01102 END IF 01103 * 01104 * Check if error-exit was taken incorrectly. 01105 * 01106 IF( .NOT.OK )THEN 01107 WRITE( NOUT, FMT = 9994 ) 01108 FATAL = .TRUE. 01109 GO TO 150 01110 END IF 01111 * 01112 * See what data changed inside subroutines. 01113 * 01114 ISAME( 1 ) = SIDES.EQ.SIDE 01115 ISAME( 2 ) = UPLOS.EQ.UPLO 01116 ISAME( 3 ) = TRANAS.EQ.TRANSA 01117 ISAME( 4 ) = DIAGS.EQ.DIAG 01118 ISAME( 5 ) = MS.EQ.M 01119 ISAME( 6 ) = NS.EQ.N 01120 ISAME( 7 ) = ALS.EQ.ALPHA 01121 ISAME( 8 ) = LZE( AS, AA, LAA ) 01122 ISAME( 9 ) = LDAS.EQ.LDA 01123 IF( NULL )THEN 01124 ISAME( 10 ) = LZE( BS, BB, LBB ) 01125 ELSE 01126 ISAME( 10 ) = LZERES( 'GE', ' ', M, N, BS, 01127 $ BB, LDB ) 01128 END IF 01129 ISAME( 11 ) = LDBS.EQ.LDB 01130 * 01131 * If data was incorrectly changed, report and 01132 * return. 01133 * 01134 SAME = .TRUE. 01135 DO 50 I = 1, NARGS 01136 SAME = SAME.AND.ISAME( I ) 01137 IF( .NOT.ISAME( I ) ) 01138 $ WRITE( NOUT, FMT = 9998 )I 01139 50 CONTINUE 01140 IF( .NOT.SAME )THEN 01141 FATAL = .TRUE. 01142 GO TO 150 01143 END IF 01144 * 01145 IF( .NOT.NULL )THEN 01146 IF( SNAME( 4: 5 ).EQ.'MM' )THEN 01147 * 01148 * Check the result. 01149 * 01150 IF( LEFT )THEN 01151 CALL ZMMCH( TRANSA, 'N', M, N, M, 01152 $ ALPHA, A, NMAX, B, NMAX, 01153 $ ZERO, C, NMAX, CT, G, 01154 $ BB, LDB, EPS, ERR, 01155 $ FATAL, NOUT, .TRUE. ) 01156 ELSE 01157 CALL ZMMCH( 'N', TRANSA, M, N, N, 01158 $ ALPHA, B, NMAX, A, NMAX, 01159 $ ZERO, C, NMAX, CT, G, 01160 $ BB, LDB, EPS, ERR, 01161 $ FATAL, NOUT, .TRUE. ) 01162 END IF 01163 ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN 01164 * 01165 * Compute approximation to original 01166 * matrix. 01167 * 01168 DO 70 J = 1, N 01169 DO 60 I = 1, M 01170 C( I, J ) = BB( I + ( J - 1 )* 01171 $ LDB ) 01172 BB( I + ( J - 1 )*LDB ) = ALPHA* 01173 $ B( I, J ) 01174 60 CONTINUE 01175 70 CONTINUE 01176 * 01177 IF( LEFT )THEN 01178 CALL ZMMCH( TRANSA, 'N', M, N, M, 01179 $ ONE, A, NMAX, C, NMAX, 01180 $ ZERO, B, NMAX, CT, G, 01181 $ BB, LDB, EPS, ERR, 01182 $ FATAL, NOUT, .FALSE. ) 01183 ELSE 01184 CALL ZMMCH( 'N', TRANSA, M, N, N, 01185 $ ONE, C, NMAX, A, NMAX, 01186 $ ZERO, B, NMAX, CT, G, 01187 $ BB, LDB, EPS, ERR, 01188 $ FATAL, NOUT, .FALSE. ) 01189 END IF 01190 END IF 01191 ERRMAX = MAX( ERRMAX, ERR ) 01192 * If got really bad answer, report and 01193 * return. 01194 IF( FATAL ) 01195 $ GO TO 150 01196 END IF 01197 * 01198 80 CONTINUE 01199 * 01200 90 CONTINUE 01201 * 01202 100 CONTINUE 01203 * 01204 110 CONTINUE 01205 * 01206 120 CONTINUE 01207 * 01208 130 CONTINUE 01209 * 01210 140 CONTINUE 01211 * 01212 * Report result. 01213 * 01214 IF( ERRMAX.LT.THRESH )THEN 01215 WRITE( NOUT, FMT = 9999 )SNAME, NC 01216 ELSE 01217 WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX 01218 END IF 01219 GO TO 160 01220 * 01221 150 CONTINUE 01222 WRITE( NOUT, FMT = 9996 )SNAME 01223 WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, TRANSA, DIAG, M, 01224 $ N, ALPHA, LDA, LDB 01225 * 01226 160 CONTINUE 01227 RETURN 01228 * 01229 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', 01230 $ 'S)' ) 01231 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', 01232 $ 'ANGED INCORRECTLY *******' ) 01233 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', 01234 $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, 01235 $ ' - SUSPECT *******' ) 01236 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) 01237 9995 FORMAT( 1X, I6, ': ', A6, '(', 4( '''', A1, ''',' ), 2( I3, ',' ), 01238 $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ') ', 01239 $ ' .' ) 01240 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', 01241 $ '******' ) 01242 * 01243 * End of ZCHK3. 01244 * 01245 END 01246 SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 01247 $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, 01248 $ A, AA, AS, B, BB, BS, C, CC, CS, CT, G ) 01249 * 01250 * Tests ZHERK and ZSYRK. 01251 * 01252 * Auxiliary routine for test program for Level 3 Blas. 01253 * 01254 * -- Written on 8-February-1989. 01255 * Jack Dongarra, Argonne National Laboratory. 01256 * Iain Duff, AERE Harwell. 01257 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 01258 * Sven Hammarling, Numerical Algorithms Group Ltd. 01259 * 01260 * .. Parameters .. 01261 COMPLEX*16 ZERO 01262 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ) ) 01263 DOUBLE PRECISION RONE, RZERO 01264 PARAMETER ( RONE = 1.0D0, RZERO = 0.0D0 ) 01265 * .. Scalar Arguments .. 01266 DOUBLE PRECISION EPS, THRESH 01267 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA 01268 LOGICAL FATAL, REWI, TRACE 01269 CHARACTER*6 SNAME 01270 * .. Array Arguments .. 01271 COMPLEX*16 A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ), 01272 $ AS( NMAX*NMAX ), B( NMAX, NMAX ), 01273 $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ), 01274 $ C( NMAX, NMAX ), CC( NMAX*NMAX ), 01275 $ CS( NMAX*NMAX ), CT( NMAX ) 01276 DOUBLE PRECISION G( NMAX ) 01277 INTEGER IDIM( NIDIM ) 01278 * .. Local Scalars .. 01279 COMPLEX*16 ALPHA, ALS, BETA, BETS 01280 DOUBLE PRECISION ERR, ERRMAX, RALPHA, RALS, RBETA, RBETS 01281 INTEGER I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, K, KS, 01282 $ LAA, LCC, LDA, LDAS, LDC, LDCS, LJ, MA, N, NA, 01283 $ NARGS, NC, NS 01284 LOGICAL CONJ, NULL, RESET, SAME, TRAN, UPPER 01285 CHARACTER*1 TRANS, TRANSS, TRANST, UPLO, UPLOS 01286 CHARACTER*2 ICHT, ICHU 01287 * .. Local Arrays .. 01288 LOGICAL ISAME( 13 ) 01289 * .. External Functions .. 01290 LOGICAL LZE, LZERES 01291 EXTERNAL LZE, LZERES 01292 * .. External Subroutines .. 01293 EXTERNAL ZHERK, ZMAKE, ZMMCH, ZSYRK 01294 * .. Intrinsic Functions .. 01295 INTRINSIC DCMPLX, MAX, DBLE 01296 * .. Scalars in Common .. 01297 INTEGER INFOT, NOUTC 01298 LOGICAL LERR, OK 01299 * .. Common blocks .. 01300 COMMON /INFOC/INFOT, NOUTC, OK, LERR 01301 * .. Data statements .. 01302 DATA ICHT/'NC'/, ICHU/'UL'/ 01303 * .. Executable Statements .. 01304 CONJ = SNAME( 2: 3 ).EQ.'HE' 01305 * 01306 NARGS = 10 01307 NC = 0 01308 RESET = .TRUE. 01309 ERRMAX = RZERO 01310 * 01311 DO 100 IN = 1, NIDIM 01312 N = IDIM( IN ) 01313 * Set LDC to 1 more than minimum value if room. 01314 LDC = N 01315 IF( LDC.LT.NMAX ) 01316 $ LDC = LDC + 1 01317 * Skip tests if not enough room. 01318 IF( LDC.GT.NMAX ) 01319 $ GO TO 100 01320 LCC = LDC*N 01321 * 01322 DO 90 IK = 1, NIDIM 01323 K = IDIM( IK ) 01324 * 01325 DO 80 ICT = 1, 2 01326 TRANS = ICHT( ICT: ICT ) 01327 TRAN = TRANS.EQ.'C' 01328 IF( TRAN.AND..NOT.CONJ ) 01329 $ TRANS = 'T' 01330 IF( TRAN )THEN 01331 MA = K 01332 NA = N 01333 ELSE 01334 MA = N 01335 NA = K 01336 END IF 01337 * Set LDA to 1 more than minimum value if room. 01338 LDA = MA 01339 IF( LDA.LT.NMAX ) 01340 $ LDA = LDA + 1 01341 * Skip tests if not enough room. 01342 IF( LDA.GT.NMAX ) 01343 $ GO TO 80 01344 LAA = LDA*NA 01345 * 01346 * Generate the matrix A. 01347 * 01348 CALL ZMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA, 01349 $ RESET, ZERO ) 01350 * 01351 DO 70 ICU = 1, 2 01352 UPLO = ICHU( ICU: ICU ) 01353 UPPER = UPLO.EQ.'U' 01354 * 01355 DO 60 IA = 1, NALF 01356 ALPHA = ALF( IA ) 01357 IF( CONJ )THEN 01358 RALPHA = DBLE( ALPHA ) 01359 ALPHA = DCMPLX( RALPHA, RZERO ) 01360 END IF 01361 * 01362 DO 50 IB = 1, NBET 01363 BETA = BET( IB ) 01364 IF( CONJ )THEN 01365 RBETA = DBLE( BETA ) 01366 BETA = DCMPLX( RBETA, RZERO ) 01367 END IF 01368 NULL = N.LE.0 01369 IF( CONJ ) 01370 $ NULL = NULL.OR.( ( K.LE.0.OR.RALPHA.EQ. 01371 $ RZERO ).AND.RBETA.EQ.RONE ) 01372 * 01373 * Generate the matrix C. 01374 * 01375 CALL ZMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, C, 01376 $ NMAX, CC, LDC, RESET, ZERO ) 01377 * 01378 NC = NC + 1 01379 * 01380 * Save every datum before calling the subroutine. 01381 * 01382 UPLOS = UPLO 01383 TRANSS = TRANS 01384 NS = N 01385 KS = K 01386 IF( CONJ )THEN 01387 RALS = RALPHA 01388 ELSE 01389 ALS = ALPHA 01390 END IF 01391 DO 10 I = 1, LAA 01392 AS( I ) = AA( I ) 01393 10 CONTINUE 01394 LDAS = LDA 01395 IF( CONJ )THEN 01396 RBETS = RBETA 01397 ELSE 01398 BETS = BETA 01399 END IF 01400 DO 20 I = 1, LCC 01401 CS( I ) = CC( I ) 01402 20 CONTINUE 01403 LDCS = LDC 01404 * 01405 * Call the subroutine. 01406 * 01407 IF( CONJ )THEN 01408 IF( TRACE ) 01409 $ WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, 01410 $ TRANS, N, K, RALPHA, LDA, RBETA, LDC 01411 IF( REWI ) 01412 $ REWIND NTRA 01413 CALL ZHERK( UPLO, TRANS, N, K, RALPHA, AA, 01414 $ LDA, RBETA, CC, LDC ) 01415 ELSE 01416 IF( TRACE ) 01417 $ WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, 01418 $ TRANS, N, K, ALPHA, LDA, BETA, LDC 01419 IF( REWI ) 01420 $ REWIND NTRA 01421 CALL ZSYRK( UPLO, TRANS, N, K, ALPHA, AA, 01422 $ LDA, BETA, CC, LDC ) 01423 END IF 01424 * 01425 * Check if error-exit was taken incorrectly. 01426 * 01427 IF( .NOT.OK )THEN 01428 WRITE( NOUT, FMT = 9992 ) 01429 FATAL = .TRUE. 01430 GO TO 120 01431 END IF 01432 * 01433 * See what data changed inside subroutines. 01434 * 01435 ISAME( 1 ) = UPLOS.EQ.UPLO 01436 ISAME( 2 ) = TRANSS.EQ.TRANS 01437 ISAME( 3 ) = NS.EQ.N 01438 ISAME( 4 ) = KS.EQ.K 01439 IF( CONJ )THEN 01440 ISAME( 5 ) = RALS.EQ.RALPHA 01441 ELSE 01442 ISAME( 5 ) = ALS.EQ.ALPHA 01443 END IF 01444 ISAME( 6 ) = LZE( AS, AA, LAA ) 01445 ISAME( 7 ) = LDAS.EQ.LDA 01446 IF( CONJ )THEN 01447 ISAME( 8 ) = RBETS.EQ.RBETA 01448 ELSE 01449 ISAME( 8 ) = BETS.EQ.BETA 01450 END IF 01451 IF( NULL )THEN 01452 ISAME( 9 ) = LZE( CS, CC, LCC ) 01453 ELSE 01454 ISAME( 9 ) = LZERES( SNAME( 2: 3 ), UPLO, N, 01455 $ N, CS, CC, LDC ) 01456 END IF 01457 ISAME( 10 ) = LDCS.EQ.LDC 01458 * 01459 * If data was incorrectly changed, report and 01460 * return. 01461 * 01462 SAME = .TRUE. 01463 DO 30 I = 1, NARGS 01464 SAME = SAME.AND.ISAME( I ) 01465 IF( .NOT.ISAME( I ) ) 01466 $ WRITE( NOUT, FMT = 9998 )I 01467 30 CONTINUE 01468 IF( .NOT.SAME )THEN 01469 FATAL = .TRUE. 01470 GO TO 120 01471 END IF 01472 * 01473 IF( .NOT.NULL )THEN 01474 * 01475 * Check the result column by column. 01476 * 01477 IF( CONJ )THEN 01478 TRANST = 'C' 01479 ELSE 01480 TRANST = 'T' 01481 END IF 01482 JC = 1 01483 DO 40 J = 1, N 01484 IF( UPPER )THEN 01485 JJ = 1 01486 LJ = J 01487 ELSE 01488 JJ = J 01489 LJ = N - J + 1 01490 END IF 01491 IF( TRAN )THEN 01492 CALL ZMMCH( TRANST, 'N', LJ, 1, K, 01493 $ ALPHA, A( 1, JJ ), NMAX, 01494 $ A( 1, J ), NMAX, BETA, 01495 $ C( JJ, J ), NMAX, CT, G, 01496 $ CC( JC ), LDC, EPS, ERR, 01497 $ FATAL, NOUT, .TRUE. ) 01498 ELSE 01499 CALL ZMMCH( 'N', TRANST, LJ, 1, K, 01500 $ ALPHA, A( JJ, 1 ), NMAX, 01501 $ A( J, 1 ), NMAX, BETA, 01502 $ C( JJ, J ), NMAX, CT, G, 01503 $ CC( JC ), LDC, EPS, ERR, 01504 $ FATAL, NOUT, .TRUE. ) 01505 END IF 01506 IF( UPPER )THEN 01507 JC = JC + LDC 01508 ELSE 01509 JC = JC + LDC + 1 01510 END IF 01511 ERRMAX = MAX( ERRMAX, ERR ) 01512 * If got really bad answer, report and 01513 * return. 01514 IF( FATAL ) 01515 $ GO TO 110 01516 40 CONTINUE 01517 END IF 01518 * 01519 50 CONTINUE 01520 * 01521 60 CONTINUE 01522 * 01523 70 CONTINUE 01524 * 01525 80 CONTINUE 01526 * 01527 90 CONTINUE 01528 * 01529 100 CONTINUE 01530 * 01531 * Report result. 01532 * 01533 IF( ERRMAX.LT.THRESH )THEN 01534 WRITE( NOUT, FMT = 9999 )SNAME, NC 01535 ELSE 01536 WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX 01537 END IF 01538 GO TO 130 01539 * 01540 110 CONTINUE 01541 IF( N.GT.1 ) 01542 $ WRITE( NOUT, FMT = 9995 )J 01543 * 01544 120 CONTINUE 01545 WRITE( NOUT, FMT = 9996 )SNAME 01546 IF( CONJ )THEN 01547 WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, RALPHA, 01548 $ LDA, RBETA, LDC 01549 ELSE 01550 WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, N, K, ALPHA, 01551 $ LDA, BETA, LDC 01552 END IF 01553 * 01554 130 CONTINUE 01555 RETURN 01556 * 01557 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', 01558 $ 'S)' ) 01559 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', 01560 $ 'ANGED INCORRECTLY *******' ) 01561 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', 01562 $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, 01563 $ ' - SUSPECT *******' ) 01564 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) 01565 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) 01566 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), 01567 $ F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ') ', 01568 $ ' .' ) 01569 9993 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), 01570 $ '(', F4.1, ',', F4.1, ') , A,', I3, ',(', F4.1, ',', F4.1, 01571 $ '), C,', I3, ') .' ) 01572 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', 01573 $ '******' ) 01574 * 01575 * End of ZCHK4. 01576 * 01577 END 01578 SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI, 01579 $ FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX, 01580 $ AB, AA, AS, BB, BS, C, CC, CS, CT, G, W ) 01581 * 01582 * Tests ZHER2K and ZSYR2K. 01583 * 01584 * Auxiliary routine for test program for Level 3 Blas. 01585 * 01586 * -- Written on 8-February-1989. 01587 * Jack Dongarra, Argonne National Laboratory. 01588 * Iain Duff, AERE Harwell. 01589 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 01590 * Sven Hammarling, Numerical Algorithms Group Ltd. 01591 * 01592 * .. Parameters .. 01593 COMPLEX*16 ZERO, ONE 01594 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ), 01595 $ ONE = ( 1.0D0, 0.0D0 ) ) 01596 DOUBLE PRECISION RONE, RZERO 01597 PARAMETER ( RONE = 1.0D0, RZERO = 0.0D0 ) 01598 * .. Scalar Arguments .. 01599 DOUBLE PRECISION EPS, THRESH 01600 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA 01601 LOGICAL FATAL, REWI, TRACE 01602 CHARACTER*6 SNAME 01603 * .. Array Arguments .. 01604 COMPLEX*16 AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ), 01605 $ ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ), 01606 $ BET( NBET ), BS( NMAX*NMAX ), C( NMAX, NMAX ), 01607 $ CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ), 01608 $ W( 2*NMAX ) 01609 DOUBLE PRECISION G( NMAX ) 01610 INTEGER IDIM( NIDIM ) 01611 * .. Local Scalars .. 01612 COMPLEX*16 ALPHA, ALS, BETA, BETS 01613 DOUBLE PRECISION ERR, ERRMAX, RBETA, RBETS 01614 INTEGER I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, JJAB, 01615 $ K, KS, LAA, LBB, LCC, LDA, LDAS, LDB, LDBS, 01616 $ LDC, LDCS, LJ, MA, N, NA, NARGS, NC, NS 01617 LOGICAL CONJ, NULL, RESET, SAME, TRAN, UPPER 01618 CHARACTER*1 TRANS, TRANSS, TRANST, UPLO, UPLOS 01619 CHARACTER*2 ICHT, ICHU 01620 * .. Local Arrays .. 01621 LOGICAL ISAME( 13 ) 01622 * .. External Functions .. 01623 LOGICAL LZE, LZERES 01624 EXTERNAL LZE, LZERES 01625 * .. External Subroutines .. 01626 EXTERNAL ZHER2K, ZMAKE, ZMMCH, ZSYR2K 01627 * .. Intrinsic Functions .. 01628 INTRINSIC DCMPLX, DCONJG, MAX, DBLE 01629 * .. Scalars in Common .. 01630 INTEGER INFOT, NOUTC 01631 LOGICAL LERR, OK 01632 * .. Common blocks .. 01633 COMMON /INFOC/INFOT, NOUTC, OK, LERR 01634 * .. Data statements .. 01635 DATA ICHT/'NC'/, ICHU/'UL'/ 01636 * .. Executable Statements .. 01637 CONJ = SNAME( 2: 3 ).EQ.'HE' 01638 * 01639 NARGS = 12 01640 NC = 0 01641 RESET = .TRUE. 01642 ERRMAX = RZERO 01643 * 01644 DO 130 IN = 1, NIDIM 01645 N = IDIM( IN ) 01646 * Set LDC to 1 more than minimum value if room. 01647 LDC = N 01648 IF( LDC.LT.NMAX ) 01649 $ LDC = LDC + 1 01650 * Skip tests if not enough room. 01651 IF( LDC.GT.NMAX ) 01652 $ GO TO 130 01653 LCC = LDC*N 01654 * 01655 DO 120 IK = 1, NIDIM 01656 K = IDIM( IK ) 01657 * 01658 DO 110 ICT = 1, 2 01659 TRANS = ICHT( ICT: ICT ) 01660 TRAN = TRANS.EQ.'C' 01661 IF( TRAN.AND..NOT.CONJ ) 01662 $ TRANS = 'T' 01663 IF( TRAN )THEN 01664 MA = K 01665 NA = N 01666 ELSE 01667 MA = N 01668 NA = K 01669 END IF 01670 * Set LDA to 1 more than minimum value if room. 01671 LDA = MA 01672 IF( LDA.LT.NMAX ) 01673 $ LDA = LDA + 1 01674 * Skip tests if not enough room. 01675 IF( LDA.GT.NMAX ) 01676 $ GO TO 110 01677 LAA = LDA*NA 01678 * 01679 * Generate the matrix A. 01680 * 01681 IF( TRAN )THEN 01682 CALL ZMAKE( 'GE', ' ', ' ', MA, NA, AB, 2*NMAX, AA, 01683 $ LDA, RESET, ZERO ) 01684 ELSE 01685 CALL ZMAKE( 'GE', ' ', ' ', MA, NA, AB, NMAX, AA, LDA, 01686 $ RESET, ZERO ) 01687 END IF 01688 * 01689 * Generate the matrix B. 01690 * 01691 LDB = LDA 01692 LBB = LAA 01693 IF( TRAN )THEN 01694 CALL ZMAKE( 'GE', ' ', ' ', MA, NA, AB( K + 1 ), 01695 $ 2*NMAX, BB, LDB, RESET, ZERO ) 01696 ELSE 01697 CALL ZMAKE( 'GE', ' ', ' ', MA, NA, AB( K*NMAX + 1 ), 01698 $ NMAX, BB, LDB, RESET, ZERO ) 01699 END IF 01700 * 01701 DO 100 ICU = 1, 2 01702 UPLO = ICHU( ICU: ICU ) 01703 UPPER = UPLO.EQ.'U' 01704 * 01705 DO 90 IA = 1, NALF 01706 ALPHA = ALF( IA ) 01707 * 01708 DO 80 IB = 1, NBET 01709 BETA = BET( IB ) 01710 IF( CONJ )THEN 01711 RBETA = DBLE( BETA ) 01712 BETA = DCMPLX( RBETA, RZERO ) 01713 END IF 01714 NULL = N.LE.0 01715 IF( CONJ ) 01716 $ NULL = NULL.OR.( ( K.LE.0.OR.ALPHA.EQ. 01717 $ ZERO ).AND.RBETA.EQ.RONE ) 01718 * 01719 * Generate the matrix C. 01720 * 01721 CALL ZMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, C, 01722 $ NMAX, CC, LDC, RESET, ZERO ) 01723 * 01724 NC = NC + 1 01725 * 01726 * Save every datum before calling the subroutine. 01727 * 01728 UPLOS = UPLO 01729 TRANSS = TRANS 01730 NS = N 01731 KS = K 01732 ALS = ALPHA 01733 DO 10 I = 1, LAA 01734 AS( I ) = AA( I ) 01735 10 CONTINUE 01736 LDAS = LDA 01737 DO 20 I = 1, LBB 01738 BS( I ) = BB( I ) 01739 20 CONTINUE 01740 LDBS = LDB 01741 IF( CONJ )THEN 01742 RBETS = RBETA 01743 ELSE 01744 BETS = BETA 01745 END IF 01746 DO 30 I = 1, LCC 01747 CS( I ) = CC( I ) 01748 30 CONTINUE 01749 LDCS = LDC 01750 * 01751 * Call the subroutine. 01752 * 01753 IF( CONJ )THEN 01754 IF( TRACE ) 01755 $ WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, 01756 $ TRANS, N, K, ALPHA, LDA, LDB, RBETA, LDC 01757 IF( REWI ) 01758 $ REWIND NTRA 01759 CALL ZHER2K( UPLO, TRANS, N, K, ALPHA, AA, 01760 $ LDA, BB, LDB, RBETA, CC, LDC ) 01761 ELSE 01762 IF( TRACE ) 01763 $ WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, 01764 $ TRANS, N, K, ALPHA, LDA, LDB, BETA, LDC 01765 IF( REWI ) 01766 $ REWIND NTRA 01767 CALL ZSYR2K( UPLO, TRANS, N, K, ALPHA, AA, 01768 $ LDA, BB, LDB, BETA, CC, LDC ) 01769 END IF 01770 * 01771 * Check if error-exit was taken incorrectly. 01772 * 01773 IF( .NOT.OK )THEN 01774 WRITE( NOUT, FMT = 9992 ) 01775 FATAL = .TRUE. 01776 GO TO 150 01777 END IF 01778 * 01779 * See what data changed inside subroutines. 01780 * 01781 ISAME( 1 ) = UPLOS.EQ.UPLO 01782 ISAME( 2 ) = TRANSS.EQ.TRANS 01783 ISAME( 3 ) = NS.EQ.N 01784 ISAME( 4 ) = KS.EQ.K 01785 ISAME( 5 ) = ALS.EQ.ALPHA 01786 ISAME( 6 ) = LZE( AS, AA, LAA ) 01787 ISAME( 7 ) = LDAS.EQ.LDA 01788 ISAME( 8 ) = LZE( BS, BB, LBB ) 01789 ISAME( 9 ) = LDBS.EQ.LDB 01790 IF( CONJ )THEN 01791 ISAME( 10 ) = RBETS.EQ.RBETA 01792 ELSE 01793 ISAME( 10 ) = BETS.EQ.BETA 01794 END IF 01795 IF( NULL )THEN 01796 ISAME( 11 ) = LZE( CS, CC, LCC ) 01797 ELSE 01798 ISAME( 11 ) = LZERES( 'HE', UPLO, N, N, CS, 01799 $ CC, LDC ) 01800 END IF 01801 ISAME( 12 ) = LDCS.EQ.LDC 01802 * 01803 * If data was incorrectly changed, report and 01804 * return. 01805 * 01806 SAME = .TRUE. 01807 DO 40 I = 1, NARGS 01808 SAME = SAME.AND.ISAME( I ) 01809 IF( .NOT.ISAME( I ) ) 01810 $ WRITE( NOUT, FMT = 9998 )I 01811 40 CONTINUE 01812 IF( .NOT.SAME )THEN 01813 FATAL = .TRUE. 01814 GO TO 150 01815 END IF 01816 * 01817 IF( .NOT.NULL )THEN 01818 * 01819 * Check the result column by column. 01820 * 01821 IF( CONJ )THEN 01822 TRANST = 'C' 01823 ELSE 01824 TRANST = 'T' 01825 END IF 01826 JJAB = 1 01827 JC = 1 01828 DO 70 J = 1, N 01829 IF( UPPER )THEN 01830 JJ = 1 01831 LJ = J 01832 ELSE 01833 JJ = J 01834 LJ = N - J + 1 01835 END IF 01836 IF( TRAN )THEN 01837 DO 50 I = 1, K 01838 W( I ) = ALPHA*AB( ( J - 1 )*2* 01839 $ NMAX + K + I ) 01840 IF( CONJ )THEN 01841 W( K + I ) = DCONJG( ALPHA )* 01842 $ AB( ( J - 1 )*2* 01843 $ NMAX + I ) 01844 ELSE 01845 W( K + I ) = ALPHA* 01846 $ AB( ( J - 1 )*2* 01847 $ NMAX + I ) 01848 END IF 01849 50 CONTINUE 01850 CALL ZMMCH( TRANST, 'N', LJ, 1, 2*K, 01851 $ ONE, AB( JJAB ), 2*NMAX, W, 01852 $ 2*NMAX, BETA, C( JJ, J ), 01853 $ NMAX, CT, G, CC( JC ), LDC, 01854 $ EPS, ERR, FATAL, NOUT, 01855 $ .TRUE. ) 01856 ELSE 01857 DO 60 I = 1, K 01858 IF( CONJ )THEN 01859 W( I ) = ALPHA*DCONJG( AB( ( K + 01860 $ I - 1 )*NMAX + J ) ) 01861 W( K + I ) = DCONJG( ALPHA* 01862 $ AB( ( I - 1 )*NMAX + 01863 $ J ) ) 01864 ELSE 01865 W( I ) = ALPHA*AB( ( K + I - 1 )* 01866 $ NMAX + J ) 01867 W( K + I ) = ALPHA* 01868 $ AB( ( I - 1 )*NMAX + 01869 $ J ) 01870 END IF 01871 60 CONTINUE 01872 CALL ZMMCH( 'N', 'N', LJ, 1, 2*K, ONE, 01873 $ AB( JJ ), NMAX, W, 2*NMAX, 01874 $ BETA, C( JJ, J ), NMAX, CT, 01875 $ G, CC( JC ), LDC, EPS, ERR, 01876 $ FATAL, NOUT, .TRUE. ) 01877 END IF 01878 IF( UPPER )THEN 01879 JC = JC + LDC 01880 ELSE 01881 JC = JC + LDC + 1 01882 IF( TRAN ) 01883 $ JJAB = JJAB + 2*NMAX 01884 END IF 01885 ERRMAX = MAX( ERRMAX, ERR ) 01886 * If got really bad answer, report and 01887 * return. 01888 IF( FATAL ) 01889 $ GO TO 140 01890 70 CONTINUE 01891 END IF 01892 * 01893 80 CONTINUE 01894 * 01895 90 CONTINUE 01896 * 01897 100 CONTINUE 01898 * 01899 110 CONTINUE 01900 * 01901 120 CONTINUE 01902 * 01903 130 CONTINUE 01904 * 01905 * Report result. 01906 * 01907 IF( ERRMAX.LT.THRESH )THEN 01908 WRITE( NOUT, FMT = 9999 )SNAME, NC 01909 ELSE 01910 WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX 01911 END IF 01912 GO TO 160 01913 * 01914 140 CONTINUE 01915 IF( N.GT.1 ) 01916 $ WRITE( NOUT, FMT = 9995 )J 01917 * 01918 150 CONTINUE 01919 WRITE( NOUT, FMT = 9996 )SNAME 01920 IF( CONJ )THEN 01921 WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, ALPHA, 01922 $ LDA, LDB, RBETA, LDC 01923 ELSE 01924 WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, N, K, ALPHA, 01925 $ LDA, LDB, BETA, LDC 01926 END IF 01927 * 01928 160 CONTINUE 01929 RETURN 01930 * 01931 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL', 01932 $ 'S)' ) 01933 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH', 01934 $ 'ANGED INCORRECTLY *******' ) 01935 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C', 01936 $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2, 01937 $ ' - SUSPECT *******' ) 01938 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) 01939 9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) 01940 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), 01941 $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',', F4.1, 01942 $ ', C,', I3, ') .' ) 01943 9993 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ), 01944 $ '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1, 01945 $ ',', F4.1, '), C,', I3, ') .' ) 01946 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *', 01947 $ '******' ) 01948 * 01949 * End of ZCHK5. 01950 * 01951 END 01952 SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT ) 01953 * 01954 * Tests the error exits from the Level 3 Blas. 01955 * Requires a special version of the error-handling routine XERBLA. 01956 * A, B and C should not need to be defined. 01957 * 01958 * Auxiliary routine for test program for Level 3 Blas. 01959 * 01960 * -- Written on 8-February-1989. 01961 * Jack Dongarra, Argonne National Laboratory. 01962 * Iain Duff, AERE Harwell. 01963 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 01964 * Sven Hammarling, Numerical Algorithms Group Ltd. 01965 * 01966 * 3-19-92: Initialize ALPHA, BETA, RALPHA, and RBETA (eca) 01967 * 3-19-92: Fix argument 12 in calls to ZSYMM and ZHEMM 01968 * with INFOT = 9 (eca) 01969 * 10-9-00: Declared INTRINSIC DCMPLX (susan) 01970 * 01971 * .. Scalar Arguments .. 01972 INTEGER ISNUM, NOUT 01973 CHARACTER*6 SRNAMT 01974 * .. Scalars in Common .. 01975 INTEGER INFOT, NOUTC 01976 LOGICAL LERR, OK 01977 * .. Parameters .. 01978 REAL ONE, TWO 01979 PARAMETER ( ONE = 1.0D0, TWO = 2.0D0 ) 01980 * .. Local Scalars .. 01981 COMPLEX*16 ALPHA, BETA 01982 DOUBLE PRECISION RALPHA, RBETA 01983 * .. Local Arrays .. 01984 COMPLEX*16 A( 2, 1 ), B( 2, 1 ), C( 2, 1 ) 01985 * .. External Subroutines .. 01986 EXTERNAL ZGEMM, ZHEMM, ZHER2K, ZHERK, CHKXER, ZSYMM, 01987 $ ZSYR2K, ZSYRK, ZTRMM, ZTRSM 01988 * .. Intrinsic Functions .. 01989 INTRINSIC DCMPLX 01990 * .. Common blocks .. 01991 COMMON /INFOC/INFOT, NOUTC, OK, LERR 01992 * .. Executable Statements .. 01993 * OK is set to .FALSE. by the special version of XERBLA or by CHKXER 01994 * if anything is wrong. 01995 OK = .TRUE. 01996 * LERR is set to .TRUE. by the special version of XERBLA each time 01997 * it is called, and is then tested and re-set by CHKXER. 01998 LERR = .FALSE. 01999 * 02000 * Initialize ALPHA, BETA, RALPHA, and RBETA. 02001 * 02002 ALPHA = DCMPLX( ONE, -ONE ) 02003 BETA = DCMPLX( TWO, -TWO ) 02004 RALPHA = ONE 02005 RBETA = TWO 02006 * 02007 GO TO ( 10, 20, 30, 40, 50, 60, 70, 80, 02008 $ 90 )ISNUM 02009 10 INFOT = 1 02010 CALL ZGEMM( '/', 'N', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02011 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02012 INFOT = 1 02013 CALL ZGEMM( '/', 'C', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02014 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02015 INFOT = 1 02016 CALL ZGEMM( '/', 'T', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02017 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02018 INFOT = 2 02019 CALL ZGEMM( 'N', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02020 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02021 INFOT = 2 02022 CALL ZGEMM( 'C', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02023 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02024 INFOT = 2 02025 CALL ZGEMM( 'T', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02026 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02027 INFOT = 3 02028 CALL ZGEMM( 'N', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02029 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02030 INFOT = 3 02031 CALL ZGEMM( 'N', 'C', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02032 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02033 INFOT = 3 02034 CALL ZGEMM( 'N', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02035 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02036 INFOT = 3 02037 CALL ZGEMM( 'C', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02038 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02039 INFOT = 3 02040 CALL ZGEMM( 'C', 'C', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02041 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02042 INFOT = 3 02043 CALL ZGEMM( 'C', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02044 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02045 INFOT = 3 02046 CALL ZGEMM( 'T', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02047 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02048 INFOT = 3 02049 CALL ZGEMM( 'T', 'C', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02050 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02051 INFOT = 3 02052 CALL ZGEMM( 'T', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02053 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02054 INFOT = 4 02055 CALL ZGEMM( 'N', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02056 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02057 INFOT = 4 02058 CALL ZGEMM( 'N', 'C', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02059 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02060 INFOT = 4 02061 CALL ZGEMM( 'N', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02062 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02063 INFOT = 4 02064 CALL ZGEMM( 'C', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02065 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02066 INFOT = 4 02067 CALL ZGEMM( 'C', 'C', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02068 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02069 INFOT = 4 02070 CALL ZGEMM( 'C', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02071 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02072 INFOT = 4 02073 CALL ZGEMM( 'T', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02074 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02075 INFOT = 4 02076 CALL ZGEMM( 'T', 'C', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02077 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02078 INFOT = 4 02079 CALL ZGEMM( 'T', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02080 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02081 INFOT = 5 02082 CALL ZGEMM( 'N', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02083 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02084 INFOT = 5 02085 CALL ZGEMM( 'N', 'C', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02086 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02087 INFOT = 5 02088 CALL ZGEMM( 'N', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02089 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02090 INFOT = 5 02091 CALL ZGEMM( 'C', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02092 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02093 INFOT = 5 02094 CALL ZGEMM( 'C', 'C', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02095 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02096 INFOT = 5 02097 CALL ZGEMM( 'C', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02098 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02099 INFOT = 5 02100 CALL ZGEMM( 'T', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02101 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02102 INFOT = 5 02103 CALL ZGEMM( 'T', 'C', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02104 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02105 INFOT = 5 02106 CALL ZGEMM( 'T', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02107 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02108 INFOT = 8 02109 CALL ZGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) 02110 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02111 INFOT = 8 02112 CALL ZGEMM( 'N', 'C', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) 02113 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02114 INFOT = 8 02115 CALL ZGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) 02116 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02117 INFOT = 8 02118 CALL ZGEMM( 'C', 'N', 0, 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 ) 02119 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02120 INFOT = 8 02121 CALL ZGEMM( 'C', 'C', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02122 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02123 INFOT = 8 02124 CALL ZGEMM( 'C', 'T', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02125 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02126 INFOT = 8 02127 CALL ZGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 ) 02128 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02129 INFOT = 8 02130 CALL ZGEMM( 'T', 'C', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02131 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02132 INFOT = 8 02133 CALL ZGEMM( 'T', 'T', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02134 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02135 INFOT = 10 02136 CALL ZGEMM( 'N', 'N', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02137 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02138 INFOT = 10 02139 CALL ZGEMM( 'C', 'N', 0, 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 ) 02140 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02141 INFOT = 10 02142 CALL ZGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 ) 02143 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02144 INFOT = 10 02145 CALL ZGEMM( 'N', 'C', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02146 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02147 INFOT = 10 02148 CALL ZGEMM( 'C', 'C', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02149 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02150 INFOT = 10 02151 CALL ZGEMM( 'T', 'C', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02152 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02153 INFOT = 10 02154 CALL ZGEMM( 'N', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02155 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02156 INFOT = 10 02157 CALL ZGEMM( 'C', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02158 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02159 INFOT = 10 02160 CALL ZGEMM( 'T', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02161 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02162 INFOT = 13 02163 CALL ZGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 ) 02164 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02165 INFOT = 13 02166 CALL ZGEMM( 'N', 'C', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 ) 02167 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02168 INFOT = 13 02169 CALL ZGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 ) 02170 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02171 INFOT = 13 02172 CALL ZGEMM( 'C', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02173 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02174 INFOT = 13 02175 CALL ZGEMM( 'C', 'C', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02176 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02177 INFOT = 13 02178 CALL ZGEMM( 'C', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02179 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02180 INFOT = 13 02181 CALL ZGEMM( 'T', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02182 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02183 INFOT = 13 02184 CALL ZGEMM( 'T', 'C', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02185 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02186 INFOT = 13 02187 CALL ZGEMM( 'T', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02188 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02189 GO TO 100 02190 20 INFOT = 1 02191 CALL ZHEMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02192 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02193 INFOT = 2 02194 CALL ZHEMM( 'L', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02195 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02196 INFOT = 3 02197 CALL ZHEMM( 'L', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02198 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02199 INFOT = 3 02200 CALL ZHEMM( 'R', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02201 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02202 INFOT = 3 02203 CALL ZHEMM( 'L', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02204 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02205 INFOT = 3 02206 CALL ZHEMM( 'R', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02207 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02208 INFOT = 4 02209 CALL ZHEMM( 'L', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02210 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02211 INFOT = 4 02212 CALL ZHEMM( 'R', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02213 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02214 INFOT = 4 02215 CALL ZHEMM( 'L', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02216 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02217 INFOT = 4 02218 CALL ZHEMM( 'R', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02219 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02220 INFOT = 7 02221 CALL ZHEMM( 'L', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 ) 02222 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02223 INFOT = 7 02224 CALL ZHEMM( 'R', 'U', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02225 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02226 INFOT = 7 02227 CALL ZHEMM( 'L', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 ) 02228 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02229 INFOT = 7 02230 CALL ZHEMM( 'R', 'L', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02231 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02232 INFOT = 9 02233 CALL ZHEMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 ) 02234 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02235 INFOT = 9 02236 CALL ZHEMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) 02237 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02238 INFOT = 9 02239 CALL ZHEMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 ) 02240 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02241 INFOT = 9 02242 CALL ZHEMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) 02243 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02244 INFOT = 12 02245 CALL ZHEMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) 02246 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02247 INFOT = 12 02248 CALL ZHEMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) 02249 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02250 INFOT = 12 02251 CALL ZHEMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) 02252 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02253 INFOT = 12 02254 CALL ZHEMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) 02255 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02256 GO TO 100 02257 30 INFOT = 1 02258 CALL ZSYMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02259 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02260 INFOT = 2 02261 CALL ZSYMM( 'L', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02262 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02263 INFOT = 3 02264 CALL ZSYMM( 'L', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02265 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02266 INFOT = 3 02267 CALL ZSYMM( 'R', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02268 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02269 INFOT = 3 02270 CALL ZSYMM( 'L', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02271 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02272 INFOT = 3 02273 CALL ZSYMM( 'R', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02274 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02275 INFOT = 4 02276 CALL ZSYMM( 'L', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02277 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02278 INFOT = 4 02279 CALL ZSYMM( 'R', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02280 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02281 INFOT = 4 02282 CALL ZSYMM( 'L', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02283 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02284 INFOT = 4 02285 CALL ZSYMM( 'R', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02286 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02287 INFOT = 7 02288 CALL ZSYMM( 'L', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 ) 02289 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02290 INFOT = 7 02291 CALL ZSYMM( 'R', 'U', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02292 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02293 INFOT = 7 02294 CALL ZSYMM( 'L', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 ) 02295 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02296 INFOT = 7 02297 CALL ZSYMM( 'R', 'L', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02298 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02299 INFOT = 9 02300 CALL ZSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 ) 02301 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02302 INFOT = 9 02303 CALL ZSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) 02304 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02305 INFOT = 9 02306 CALL ZSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 ) 02307 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02308 INFOT = 9 02309 CALL ZSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) 02310 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02311 INFOT = 12 02312 CALL ZSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) 02313 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02314 INFOT = 12 02315 CALL ZSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) 02316 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02317 INFOT = 12 02318 CALL ZSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) 02319 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02320 INFOT = 12 02321 CALL ZSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 ) 02322 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02323 GO TO 100 02324 40 INFOT = 1 02325 CALL ZTRMM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 ) 02326 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02327 INFOT = 2 02328 CALL ZTRMM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 ) 02329 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02330 INFOT = 3 02331 CALL ZTRMM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 ) 02332 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02333 INFOT = 4 02334 CALL ZTRMM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 ) 02335 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02336 INFOT = 5 02337 CALL ZTRMM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02338 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02339 INFOT = 5 02340 CALL ZTRMM( 'L', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02341 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02342 INFOT = 5 02343 CALL ZTRMM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02344 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02345 INFOT = 5 02346 CALL ZTRMM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02347 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02348 INFOT = 5 02349 CALL ZTRMM( 'R', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02350 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02351 INFOT = 5 02352 CALL ZTRMM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02353 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02354 INFOT = 5 02355 CALL ZTRMM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02356 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02357 INFOT = 5 02358 CALL ZTRMM( 'L', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02359 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02360 INFOT = 5 02361 CALL ZTRMM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02362 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02363 INFOT = 5 02364 CALL ZTRMM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02365 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02366 INFOT = 5 02367 CALL ZTRMM( 'R', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02368 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02369 INFOT = 5 02370 CALL ZTRMM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02371 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02372 INFOT = 6 02373 CALL ZTRMM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02374 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02375 INFOT = 6 02376 CALL ZTRMM( 'L', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02377 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02378 INFOT = 6 02379 CALL ZTRMM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02380 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02381 INFOT = 6 02382 CALL ZTRMM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02383 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02384 INFOT = 6 02385 CALL ZTRMM( 'R', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02386 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02387 INFOT = 6 02388 CALL ZTRMM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02389 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02390 INFOT = 6 02391 CALL ZTRMM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02392 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02393 INFOT = 6 02394 CALL ZTRMM( 'L', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02395 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02396 INFOT = 6 02397 CALL ZTRMM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02398 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02399 INFOT = 6 02400 CALL ZTRMM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02401 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02402 INFOT = 6 02403 CALL ZTRMM( 'R', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02404 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02405 INFOT = 6 02406 CALL ZTRMM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02407 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02408 INFOT = 9 02409 CALL ZTRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 ) 02410 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02411 INFOT = 9 02412 CALL ZTRMM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 ) 02413 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02414 INFOT = 9 02415 CALL ZTRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 ) 02416 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02417 INFOT = 9 02418 CALL ZTRMM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 ) 02419 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02420 INFOT = 9 02421 CALL ZTRMM( 'R', 'U', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 ) 02422 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02423 INFOT = 9 02424 CALL ZTRMM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 ) 02425 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02426 INFOT = 9 02427 CALL ZTRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 ) 02428 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02429 INFOT = 9 02430 CALL ZTRMM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 ) 02431 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02432 INFOT = 9 02433 CALL ZTRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 ) 02434 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02435 INFOT = 9 02436 CALL ZTRMM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 ) 02437 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02438 INFOT = 9 02439 CALL ZTRMM( 'R', 'L', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 ) 02440 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02441 INFOT = 9 02442 CALL ZTRMM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 ) 02443 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02444 INFOT = 11 02445 CALL ZTRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 ) 02446 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02447 INFOT = 11 02448 CALL ZTRMM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 ) 02449 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02450 INFOT = 11 02451 CALL ZTRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 ) 02452 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02453 INFOT = 11 02454 CALL ZTRMM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 ) 02455 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02456 INFOT = 11 02457 CALL ZTRMM( 'R', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 ) 02458 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02459 INFOT = 11 02460 CALL ZTRMM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 ) 02461 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02462 INFOT = 11 02463 CALL ZTRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 ) 02464 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02465 INFOT = 11 02466 CALL ZTRMM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 ) 02467 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02468 INFOT = 11 02469 CALL ZTRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 ) 02470 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02471 INFOT = 11 02472 CALL ZTRMM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 ) 02473 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02474 INFOT = 11 02475 CALL ZTRMM( 'R', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 ) 02476 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02477 INFOT = 11 02478 CALL ZTRMM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 ) 02479 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02480 GO TO 100 02481 50 INFOT = 1 02482 CALL ZTRSM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 ) 02483 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02484 INFOT = 2 02485 CALL ZTRSM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 ) 02486 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02487 INFOT = 3 02488 CALL ZTRSM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 ) 02489 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02490 INFOT = 4 02491 CALL ZTRSM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 ) 02492 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02493 INFOT = 5 02494 CALL ZTRSM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02495 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02496 INFOT = 5 02497 CALL ZTRSM( 'L', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02498 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02499 INFOT = 5 02500 CALL ZTRSM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02501 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02502 INFOT = 5 02503 CALL ZTRSM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02504 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02505 INFOT = 5 02506 CALL ZTRSM( 'R', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02507 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02508 INFOT = 5 02509 CALL ZTRSM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02510 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02511 INFOT = 5 02512 CALL ZTRSM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02513 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02514 INFOT = 5 02515 CALL ZTRSM( 'L', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02516 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02517 INFOT = 5 02518 CALL ZTRSM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02519 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02520 INFOT = 5 02521 CALL ZTRSM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02522 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02523 INFOT = 5 02524 CALL ZTRSM( 'R', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02525 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02526 INFOT = 5 02527 CALL ZTRSM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 ) 02528 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02529 INFOT = 6 02530 CALL ZTRSM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02531 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02532 INFOT = 6 02533 CALL ZTRSM( 'L', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02534 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02535 INFOT = 6 02536 CALL ZTRSM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02537 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02538 INFOT = 6 02539 CALL ZTRSM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02540 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02541 INFOT = 6 02542 CALL ZTRSM( 'R', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02543 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02544 INFOT = 6 02545 CALL ZTRSM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02546 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02547 INFOT = 6 02548 CALL ZTRSM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02549 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02550 INFOT = 6 02551 CALL ZTRSM( 'L', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02552 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02553 INFOT = 6 02554 CALL ZTRSM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02555 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02556 INFOT = 6 02557 CALL ZTRSM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02558 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02559 INFOT = 6 02560 CALL ZTRSM( 'R', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02561 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02562 INFOT = 6 02563 CALL ZTRSM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 ) 02564 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02565 INFOT = 9 02566 CALL ZTRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 ) 02567 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02568 INFOT = 9 02569 CALL ZTRSM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 ) 02570 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02571 INFOT = 9 02572 CALL ZTRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 ) 02573 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02574 INFOT = 9 02575 CALL ZTRSM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 ) 02576 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02577 INFOT = 9 02578 CALL ZTRSM( 'R', 'U', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 ) 02579 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02580 INFOT = 9 02581 CALL ZTRSM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 ) 02582 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02583 INFOT = 9 02584 CALL ZTRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 ) 02585 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02586 INFOT = 9 02587 CALL ZTRSM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 ) 02588 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02589 INFOT = 9 02590 CALL ZTRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 ) 02591 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02592 INFOT = 9 02593 CALL ZTRSM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 ) 02594 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02595 INFOT = 9 02596 CALL ZTRSM( 'R', 'L', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 ) 02597 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02598 INFOT = 9 02599 CALL ZTRSM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 ) 02600 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02601 INFOT = 11 02602 CALL ZTRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 ) 02603 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02604 INFOT = 11 02605 CALL ZTRSM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 ) 02606 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02607 INFOT = 11 02608 CALL ZTRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 ) 02609 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02610 INFOT = 11 02611 CALL ZTRSM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 ) 02612 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02613 INFOT = 11 02614 CALL ZTRSM( 'R', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 ) 02615 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02616 INFOT = 11 02617 CALL ZTRSM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 ) 02618 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02619 INFOT = 11 02620 CALL ZTRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 ) 02621 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02622 INFOT = 11 02623 CALL ZTRSM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 ) 02624 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02625 INFOT = 11 02626 CALL ZTRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 ) 02627 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02628 INFOT = 11 02629 CALL ZTRSM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 ) 02630 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02631 INFOT = 11 02632 CALL ZTRSM( 'R', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 ) 02633 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02634 INFOT = 11 02635 CALL ZTRSM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 ) 02636 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02637 GO TO 100 02638 60 INFOT = 1 02639 CALL ZHERK( '/', 'N', 0, 0, RALPHA, A, 1, RBETA, C, 1 ) 02640 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02641 INFOT = 2 02642 CALL ZHERK( 'U', 'T', 0, 0, RALPHA, A, 1, RBETA, C, 1 ) 02643 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02644 INFOT = 3 02645 CALL ZHERK( 'U', 'N', -1, 0, RALPHA, A, 1, RBETA, C, 1 ) 02646 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02647 INFOT = 3 02648 CALL ZHERK( 'U', 'C', -1, 0, RALPHA, A, 1, RBETA, C, 1 ) 02649 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02650 INFOT = 3 02651 CALL ZHERK( 'L', 'N', -1, 0, RALPHA, A, 1, RBETA, C, 1 ) 02652 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02653 INFOT = 3 02654 CALL ZHERK( 'L', 'C', -1, 0, RALPHA, A, 1, RBETA, C, 1 ) 02655 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02656 INFOT = 4 02657 CALL ZHERK( 'U', 'N', 0, -1, RALPHA, A, 1, RBETA, C, 1 ) 02658 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02659 INFOT = 4 02660 CALL ZHERK( 'U', 'C', 0, -1, RALPHA, A, 1, RBETA, C, 1 ) 02661 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02662 INFOT = 4 02663 CALL ZHERK( 'L', 'N', 0, -1, RALPHA, A, 1, RBETA, C, 1 ) 02664 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02665 INFOT = 4 02666 CALL ZHERK( 'L', 'C', 0, -1, RALPHA, A, 1, RBETA, C, 1 ) 02667 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02668 INFOT = 7 02669 CALL ZHERK( 'U', 'N', 2, 0, RALPHA, A, 1, RBETA, C, 2 ) 02670 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02671 INFOT = 7 02672 CALL ZHERK( 'U', 'C', 0, 2, RALPHA, A, 1, RBETA, C, 1 ) 02673 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02674 INFOT = 7 02675 CALL ZHERK( 'L', 'N', 2, 0, RALPHA, A, 1, RBETA, C, 2 ) 02676 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02677 INFOT = 7 02678 CALL ZHERK( 'L', 'C', 0, 2, RALPHA, A, 1, RBETA, C, 1 ) 02679 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02680 INFOT = 10 02681 CALL ZHERK( 'U', 'N', 2, 0, RALPHA, A, 2, RBETA, C, 1 ) 02682 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02683 INFOT = 10 02684 CALL ZHERK( 'U', 'C', 2, 0, RALPHA, A, 1, RBETA, C, 1 ) 02685 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02686 INFOT = 10 02687 CALL ZHERK( 'L', 'N', 2, 0, RALPHA, A, 2, RBETA, C, 1 ) 02688 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02689 INFOT = 10 02690 CALL ZHERK( 'L', 'C', 2, 0, RALPHA, A, 1, RBETA, C, 1 ) 02691 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02692 GO TO 100 02693 70 INFOT = 1 02694 CALL ZSYRK( '/', 'N', 0, 0, ALPHA, A, 1, BETA, C, 1 ) 02695 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02696 INFOT = 2 02697 CALL ZSYRK( 'U', 'C', 0, 0, ALPHA, A, 1, BETA, C, 1 ) 02698 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02699 INFOT = 3 02700 CALL ZSYRK( 'U', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 ) 02701 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02702 INFOT = 3 02703 CALL ZSYRK( 'U', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 ) 02704 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02705 INFOT = 3 02706 CALL ZSYRK( 'L', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 ) 02707 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02708 INFOT = 3 02709 CALL ZSYRK( 'L', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 ) 02710 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02711 INFOT = 4 02712 CALL ZSYRK( 'U', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 ) 02713 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02714 INFOT = 4 02715 CALL ZSYRK( 'U', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 ) 02716 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02717 INFOT = 4 02718 CALL ZSYRK( 'L', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 ) 02719 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02720 INFOT = 4 02721 CALL ZSYRK( 'L', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 ) 02722 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02723 INFOT = 7 02724 CALL ZSYRK( 'U', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 ) 02725 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02726 INFOT = 7 02727 CALL ZSYRK( 'U', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 ) 02728 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02729 INFOT = 7 02730 CALL ZSYRK( 'L', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 ) 02731 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02732 INFOT = 7 02733 CALL ZSYRK( 'L', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 ) 02734 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02735 INFOT = 10 02736 CALL ZSYRK( 'U', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 ) 02737 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02738 INFOT = 10 02739 CALL ZSYRK( 'U', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 ) 02740 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02741 INFOT = 10 02742 CALL ZSYRK( 'L', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 ) 02743 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02744 INFOT = 10 02745 CALL ZSYRK( 'L', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 ) 02746 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02747 GO TO 100 02748 80 INFOT = 1 02749 CALL ZHER2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02750 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02751 INFOT = 2 02752 CALL ZHER2K( 'U', 'T', 0, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02753 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02754 INFOT = 3 02755 CALL ZHER2K( 'U', 'N', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02756 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02757 INFOT = 3 02758 CALL ZHER2K( 'U', 'C', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02759 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02760 INFOT = 3 02761 CALL ZHER2K( 'L', 'N', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02762 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02763 INFOT = 3 02764 CALL ZHER2K( 'L', 'C', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02765 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02766 INFOT = 4 02767 CALL ZHER2K( 'U', 'N', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02768 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02769 INFOT = 4 02770 CALL ZHER2K( 'U', 'C', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02771 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02772 INFOT = 4 02773 CALL ZHER2K( 'L', 'N', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02774 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02775 INFOT = 4 02776 CALL ZHER2K( 'L', 'C', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02777 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02778 INFOT = 7 02779 CALL ZHER2K( 'U', 'N', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 2 ) 02780 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02781 INFOT = 7 02782 CALL ZHER2K( 'U', 'C', 0, 2, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02783 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02784 INFOT = 7 02785 CALL ZHER2K( 'L', 'N', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 2 ) 02786 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02787 INFOT = 7 02788 CALL ZHER2K( 'L', 'C', 0, 2, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02789 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02790 INFOT = 9 02791 CALL ZHER2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 1, RBETA, C, 2 ) 02792 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02793 INFOT = 9 02794 CALL ZHER2K( 'U', 'C', 0, 2, ALPHA, A, 2, B, 1, RBETA, C, 1 ) 02795 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02796 INFOT = 9 02797 CALL ZHER2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 1, RBETA, C, 2 ) 02798 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02799 INFOT = 9 02800 CALL ZHER2K( 'L', 'C', 0, 2, ALPHA, A, 2, B, 1, RBETA, C, 1 ) 02801 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02802 INFOT = 12 02803 CALL ZHER2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 2, RBETA, C, 1 ) 02804 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02805 INFOT = 12 02806 CALL ZHER2K( 'U', 'C', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02807 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02808 INFOT = 12 02809 CALL ZHER2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 2, RBETA, C, 1 ) 02810 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02811 INFOT = 12 02812 CALL ZHER2K( 'L', 'C', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 ) 02813 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02814 GO TO 100 02815 90 INFOT = 1 02816 CALL ZSYR2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02817 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02818 INFOT = 2 02819 CALL ZSYR2K( 'U', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02820 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02821 INFOT = 3 02822 CALL ZSYR2K( 'U', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02823 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02824 INFOT = 3 02825 CALL ZSYR2K( 'U', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02826 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02827 INFOT = 3 02828 CALL ZSYR2K( 'L', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02829 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02830 INFOT = 3 02831 CALL ZSYR2K( 'L', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02832 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02833 INFOT = 4 02834 CALL ZSYR2K( 'U', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02835 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02836 INFOT = 4 02837 CALL ZSYR2K( 'U', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02838 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02839 INFOT = 4 02840 CALL ZSYR2K( 'L', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02841 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02842 INFOT = 4 02843 CALL ZSYR2K( 'L', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02844 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02845 INFOT = 7 02846 CALL ZSYR2K( 'U', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) 02847 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02848 INFOT = 7 02849 CALL ZSYR2K( 'U', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02850 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02851 INFOT = 7 02852 CALL ZSYR2K( 'L', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 ) 02853 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02854 INFOT = 7 02855 CALL ZSYR2K( 'L', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02856 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02857 INFOT = 9 02858 CALL ZSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 ) 02859 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02860 INFOT = 9 02861 CALL ZSYR2K( 'U', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 ) 02862 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02863 INFOT = 9 02864 CALL ZSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 ) 02865 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02866 INFOT = 9 02867 CALL ZSYR2K( 'L', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 ) 02868 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02869 INFOT = 12 02870 CALL ZSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) 02871 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02872 INFOT = 12 02873 CALL ZSYR2K( 'U', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02874 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02875 INFOT = 12 02876 CALL ZSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 ) 02877 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02878 INFOT = 12 02879 CALL ZSYR2K( 'L', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 ) 02880 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 02881 * 02882 100 IF( OK )THEN 02883 WRITE( NOUT, FMT = 9999 )SRNAMT 02884 ELSE 02885 WRITE( NOUT, FMT = 9998 )SRNAMT 02886 END IF 02887 RETURN 02888 * 02889 9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' ) 02890 9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****', 02891 $ '**' ) 02892 * 02893 * End of ZCHKE. 02894 * 02895 END 02896 SUBROUTINE ZMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET, 02897 $ TRANSL ) 02898 * 02899 * Generates values for an M by N matrix A. 02900 * Stores the values in the array AA in the data structure required 02901 * by the routine, with unwanted elements set to rogue value. 02902 * 02903 * TYPE is 'GE', 'HE', 'SY' or 'TR'. 02904 * 02905 * Auxiliary routine for test program for Level 3 Blas. 02906 * 02907 * -- Written on 8-February-1989. 02908 * Jack Dongarra, Argonne National Laboratory. 02909 * Iain Duff, AERE Harwell. 02910 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 02911 * Sven Hammarling, Numerical Algorithms Group Ltd. 02912 * 02913 * .. Parameters .. 02914 COMPLEX*16 ZERO, ONE 02915 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ), 02916 $ ONE = ( 1.0D0, 0.0D0 ) ) 02917 COMPLEX*16 ROGUE 02918 PARAMETER ( ROGUE = ( -1.0D10, 1.0D10 ) ) 02919 DOUBLE PRECISION RZERO 02920 PARAMETER ( RZERO = 0.0D0 ) 02921 DOUBLE PRECISION RROGUE 02922 PARAMETER ( RROGUE = -1.0D10 ) 02923 * .. Scalar Arguments .. 02924 COMPLEX*16 TRANSL 02925 INTEGER LDA, M, N, NMAX 02926 LOGICAL RESET 02927 CHARACTER*1 DIAG, UPLO 02928 CHARACTER*2 TYPE 02929 * .. Array Arguments .. 02930 COMPLEX*16 A( NMAX, * ), AA( * ) 02931 * .. Local Scalars .. 02932 INTEGER I, IBEG, IEND, J, JJ 02933 LOGICAL GEN, HER, LOWER, SYM, TRI, UNIT, UPPER 02934 * .. External Functions .. 02935 COMPLEX*16 ZBEG 02936 EXTERNAL ZBEG 02937 * .. Intrinsic Functions .. 02938 INTRINSIC DCMPLX, DCONJG, DBLE 02939 * .. Executable Statements .. 02940 GEN = TYPE.EQ.'GE' 02941 HER = TYPE.EQ.'HE' 02942 SYM = TYPE.EQ.'SY' 02943 TRI = TYPE.EQ.'TR' 02944 UPPER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'U' 02945 LOWER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'L' 02946 UNIT = TRI.AND.DIAG.EQ.'U' 02947 * 02948 * Generate data in array A. 02949 * 02950 DO 20 J = 1, N 02951 DO 10 I = 1, M 02952 IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) ) 02953 $ THEN 02954 A( I, J ) = ZBEG( RESET ) + TRANSL 02955 IF( I.NE.J )THEN 02956 * Set some elements to zero 02957 IF( N.GT.3.AND.J.EQ.N/2 ) 02958 $ A( I, J ) = ZERO 02959 IF( HER )THEN 02960 A( J, I ) = DCONJG( A( I, J ) ) 02961 ELSE IF( SYM )THEN 02962 A( J, I ) = A( I, J ) 02963 ELSE IF( TRI )THEN 02964 A( J, I ) = ZERO 02965 END IF 02966 END IF 02967 END IF 02968 10 CONTINUE 02969 IF( HER ) 02970 $ A( J, J ) = DCMPLX( DBLE( A( J, J ) ), RZERO ) 02971 IF( TRI ) 02972 $ A( J, J ) = A( J, J ) + ONE 02973 IF( UNIT ) 02974 $ A( J, J ) = ONE 02975 20 CONTINUE 02976 * 02977 * Store elements in array AS in data structure required by routine. 02978 * 02979 IF( TYPE.EQ.'GE' )THEN 02980 DO 50 J = 1, N 02981 DO 30 I = 1, M 02982 AA( I + ( J - 1 )*LDA ) = A( I, J ) 02983 30 CONTINUE 02984 DO 40 I = M + 1, LDA 02985 AA( I + ( J - 1 )*LDA ) = ROGUE 02986 40 CONTINUE 02987 50 CONTINUE 02988 ELSE IF( TYPE.EQ.'HE'.OR.TYPE.EQ.'SY'.OR.TYPE.EQ.'TR' )THEN 02989 DO 90 J = 1, N 02990 IF( UPPER )THEN 02991 IBEG = 1 02992 IF( UNIT )THEN 02993 IEND = J - 1 02994 ELSE 02995 IEND = J 02996 END IF 02997 ELSE 02998 IF( UNIT )THEN 02999 IBEG = J + 1 03000 ELSE 03001 IBEG = J 03002 END IF 03003 IEND = N 03004 END IF 03005 DO 60 I = 1, IBEG - 1 03006 AA( I + ( J - 1 )*LDA ) = ROGUE 03007 60 CONTINUE 03008 DO 70 I = IBEG, IEND 03009 AA( I + ( J - 1 )*LDA ) = A( I, J ) 03010 70 CONTINUE 03011 DO 80 I = IEND + 1, LDA 03012 AA( I + ( J - 1 )*LDA ) = ROGUE 03013 80 CONTINUE 03014 IF( HER )THEN 03015 JJ = J + ( J - 1 )*LDA 03016 AA( JJ ) = DCMPLX( DBLE( AA( JJ ) ), RROGUE ) 03017 END IF 03018 90 CONTINUE 03019 END IF 03020 RETURN 03021 * 03022 * End of ZMAKE. 03023 * 03024 END 03025 SUBROUTINE ZMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB, 03026 $ BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL, 03027 $ NOUT, MV ) 03028 * 03029 * Checks the results of the computational tests. 03030 * 03031 * Auxiliary routine for test program for Level 3 Blas. 03032 * 03033 * -- Written on 8-February-1989. 03034 * Jack Dongarra, Argonne National Laboratory. 03035 * Iain Duff, AERE Harwell. 03036 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 03037 * Sven Hammarling, Numerical Algorithms Group Ltd. 03038 * 03039 * .. Parameters .. 03040 COMPLEX*16 ZERO 03041 PARAMETER ( ZERO = ( 0.0D0, 0.0D0 ) ) 03042 DOUBLE PRECISION RZERO, RONE 03043 PARAMETER ( RZERO = 0.0D0, RONE = 1.0D0 ) 03044 * .. Scalar Arguments .. 03045 COMPLEX*16 ALPHA, BETA 03046 DOUBLE PRECISION EPS, ERR 03047 INTEGER KK, LDA, LDB, LDC, LDCC, M, N, NOUT 03048 LOGICAL FATAL, MV 03049 CHARACTER*1 TRANSA, TRANSB 03050 * .. Array Arguments .. 03051 COMPLEX*16 A( LDA, * ), B( LDB, * ), C( LDC, * ), 03052 $ CC( LDCC, * ), CT( * ) 03053 DOUBLE PRECISION G( * ) 03054 * .. Local Scalars .. 03055 COMPLEX*16 CL 03056 DOUBLE PRECISION ERRI 03057 INTEGER I, J, K 03058 LOGICAL CTRANA, CTRANB, TRANA, TRANB 03059 * .. Intrinsic Functions .. 03060 INTRINSIC ABS, DIMAG, DCONJG, MAX, DBLE, SQRT 03061 * .. Statement Functions .. 03062 DOUBLE PRECISION ABS1 03063 * .. Statement Function definitions .. 03064 ABS1( CL ) = ABS( DBLE( CL ) ) + ABS( DIMAG( CL ) ) 03065 * .. Executable Statements .. 03066 TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C' 03067 TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C' 03068 CTRANA = TRANSA.EQ.'C' 03069 CTRANB = TRANSB.EQ.'C' 03070 * 03071 * Compute expected result, one column at a time, in CT using data 03072 * in A, B and C. 03073 * Compute gauges in G. 03074 * 03075 DO 220 J = 1, N 03076 * 03077 DO 10 I = 1, M 03078 CT( I ) = ZERO 03079 G( I ) = RZERO 03080 10 CONTINUE 03081 IF( .NOT.TRANA.AND..NOT.TRANB )THEN 03082 DO 30 K = 1, KK 03083 DO 20 I = 1, M 03084 CT( I ) = CT( I ) + A( I, K )*B( K, J ) 03085 G( I ) = G( I ) + ABS1( A( I, K ) )*ABS1( B( K, J ) ) 03086 20 CONTINUE 03087 30 CONTINUE 03088 ELSE IF( TRANA.AND..NOT.TRANB )THEN 03089 IF( CTRANA )THEN 03090 DO 50 K = 1, KK 03091 DO 40 I = 1, M 03092 CT( I ) = CT( I ) + DCONJG( A( K, I ) )*B( K, J ) 03093 G( I ) = G( I ) + ABS1( A( K, I ) )* 03094 $ ABS1( B( K, J ) ) 03095 40 CONTINUE 03096 50 CONTINUE 03097 ELSE 03098 DO 70 K = 1, KK 03099 DO 60 I = 1, M 03100 CT( I ) = CT( I ) + A( K, I )*B( K, J ) 03101 G( I ) = G( I ) + ABS1( A( K, I ) )* 03102 $ ABS1( B( K, J ) ) 03103 60 CONTINUE 03104 70 CONTINUE 03105 END IF 03106 ELSE IF( .NOT.TRANA.AND.TRANB )THEN 03107 IF( CTRANB )THEN 03108 DO 90 K = 1, KK 03109 DO 80 I = 1, M 03110 CT( I ) = CT( I ) + A( I, K )*DCONJG( B( J, K ) ) 03111 G( I ) = G( I ) + ABS1( A( I, K ) )* 03112 $ ABS1( B( J, K ) ) 03113 80 CONTINUE 03114 90 CONTINUE 03115 ELSE 03116 DO 110 K = 1, KK 03117 DO 100 I = 1, M 03118 CT( I ) = CT( I ) + A( I, K )*B( J, K ) 03119 G( I ) = G( I ) + ABS1( A( I, K ) )* 03120 $ ABS1( B( J, K ) ) 03121 100 CONTINUE 03122 110 CONTINUE 03123 END IF 03124 ELSE IF( TRANA.AND.TRANB )THEN 03125 IF( CTRANA )THEN 03126 IF( CTRANB )THEN 03127 DO 130 K = 1, KK 03128 DO 120 I = 1, M 03129 CT( I ) = CT( I ) + DCONJG( A( K, I ) )* 03130 $ DCONJG( B( J, K ) ) 03131 G( I ) = G( I ) + ABS1( A( K, I ) )* 03132 $ ABS1( B( J, K ) ) 03133 120 CONTINUE 03134 130 CONTINUE 03135 ELSE 03136 DO 150 K = 1, KK 03137 DO 140 I = 1, M 03138 CT( I ) = CT( I ) + DCONJG( A( K, I ) )* 03139 $ B( J, K ) 03140 G( I ) = G( I ) + ABS1( A( K, I ) )* 03141 $ ABS1( B( J, K ) ) 03142 140 CONTINUE 03143 150 CONTINUE 03144 END IF 03145 ELSE 03146 IF( CTRANB )THEN 03147 DO 170 K = 1, KK 03148 DO 160 I = 1, M 03149 CT( I ) = CT( I ) + A( K, I )* 03150 $ DCONJG( B( J, K ) ) 03151 G( I ) = G( I ) + ABS1( A( K, I ) )* 03152 $ ABS1( B( J, K ) ) 03153 160 CONTINUE 03154 170 CONTINUE 03155 ELSE 03156 DO 190 K = 1, KK 03157 DO 180 I = 1, M 03158 CT( I ) = CT( I ) + A( K, I )*B( J, K ) 03159 G( I ) = G( I ) + ABS1( A( K, I ) )* 03160 $ ABS1( B( J, K ) ) 03161 180 CONTINUE 03162 190 CONTINUE 03163 END IF 03164 END IF 03165 END IF 03166 DO 200 I = 1, M 03167 CT( I ) = ALPHA*CT( I ) + BETA*C( I, J ) 03168 G( I ) = ABS1( ALPHA )*G( I ) + 03169 $ ABS1( BETA )*ABS1( C( I, J ) ) 03170 200 CONTINUE 03171 * 03172 * Compute the error ratio for this result. 03173 * 03174 ERR = ZERO 03175 DO 210 I = 1, M 03176 ERRI = ABS1( CT( I ) - CC( I, J ) )/EPS 03177 IF( G( I ).NE.RZERO ) 03178 $ ERRI = ERRI/G( I ) 03179 ERR = MAX( ERR, ERRI ) 03180 IF( ERR*SQRT( EPS ).GE.RONE ) 03181 $ GO TO 230 03182 210 CONTINUE 03183 * 03184 220 CONTINUE 03185 * 03186 * If the loop completes, all results are at least half accurate. 03187 GO TO 250 03188 * 03189 * Report fatal error. 03190 * 03191 230 FATAL = .TRUE. 03192 WRITE( NOUT, FMT = 9999 ) 03193 DO 240 I = 1, M 03194 IF( MV )THEN 03195 WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J ) 03196 ELSE 03197 WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I ) 03198 END IF 03199 240 CONTINUE 03200 IF( N.GT.1 ) 03201 $ WRITE( NOUT, FMT = 9997 )J 03202 * 03203 250 CONTINUE 03204 RETURN 03205 * 03206 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL', 03207 $ 'F ACCURATE *******', /' EXPECTED RE', 03208 $ 'SULT COMPUTED RESULT' ) 03209 9998 FORMAT( 1X, I7, 2( ' (', G15.6, ',', G15.6, ')' ) ) 03210 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 ) 03211 * 03212 * End of ZMMCH. 03213 * 03214 END 03215 LOGICAL FUNCTION LZE( RI, RJ, LR ) 03216 * 03217 * Tests if two arrays are identical. 03218 * 03219 * Auxiliary routine for test program for Level 3 Blas. 03220 * 03221 * -- Written on 8-February-1989. 03222 * Jack Dongarra, Argonne National Laboratory. 03223 * Iain Duff, AERE Harwell. 03224 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 03225 * Sven Hammarling, Numerical Algorithms Group Ltd. 03226 * 03227 * .. Scalar Arguments .. 03228 INTEGER LR 03229 * .. Array Arguments .. 03230 COMPLEX*16 RI( * ), RJ( * ) 03231 * .. Local Scalars .. 03232 INTEGER I 03233 * .. Executable Statements .. 03234 DO 10 I = 1, LR 03235 IF( RI( I ).NE.RJ( I ) ) 03236 $ GO TO 20 03237 10 CONTINUE 03238 LZE = .TRUE. 03239 GO TO 30 03240 20 CONTINUE 03241 LZE = .FALSE. 03242 30 RETURN 03243 * 03244 * End of LZE. 03245 * 03246 END 03247 LOGICAL FUNCTION LZERES( TYPE, UPLO, M, N, AA, AS, LDA ) 03248 * 03249 * Tests if selected elements in two arrays are equal. 03250 * 03251 * TYPE is 'GE' or 'HE' or 'SY'. 03252 * 03253 * Auxiliary routine for test program for Level 3 Blas. 03254 * 03255 * -- Written on 8-February-1989. 03256 * Jack Dongarra, Argonne National Laboratory. 03257 * Iain Duff, AERE Harwell. 03258 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 03259 * Sven Hammarling, Numerical Algorithms Group Ltd. 03260 * 03261 * .. Scalar Arguments .. 03262 INTEGER LDA, M, N 03263 CHARACTER*1 UPLO 03264 CHARACTER*2 TYPE 03265 * .. Array Arguments .. 03266 COMPLEX*16 AA( LDA, * ), AS( LDA, * ) 03267 * .. Local Scalars .. 03268 INTEGER I, IBEG, IEND, J 03269 LOGICAL UPPER 03270 * .. Executable Statements .. 03271 UPPER = UPLO.EQ.'U' 03272 IF( TYPE.EQ.'GE' )THEN 03273 DO 20 J = 1, N 03274 DO 10 I = M + 1, LDA 03275 IF( AA( I, J ).NE.AS( I, J ) ) 03276 $ GO TO 70 03277 10 CONTINUE 03278 20 CONTINUE 03279 ELSE IF( TYPE.EQ.'HE'.OR.TYPE.EQ.'SY' )THEN 03280 DO 50 J = 1, N 03281 IF( UPPER )THEN 03282 IBEG = 1 03283 IEND = J 03284 ELSE 03285 IBEG = J 03286 IEND = N 03287 END IF 03288 DO 30 I = 1, IBEG - 1 03289 IF( AA( I, J ).NE.AS( I, J ) ) 03290 $ GO TO 70 03291 30 CONTINUE 03292 DO 40 I = IEND + 1, LDA 03293 IF( AA( I, J ).NE.AS( I, J ) ) 03294 $ GO TO 70 03295 40 CONTINUE 03296 50 CONTINUE 03297 END IF 03298 * 03299 60 CONTINUE 03300 LZERES = .TRUE. 03301 GO TO 80 03302 70 CONTINUE 03303 LZERES = .FALSE. 03304 80 RETURN 03305 * 03306 * End of LZERES. 03307 * 03308 END 03309 DOUBLE COMPLEX FUNCTION ZBEG( RESET ) 03310 * 03311 * Generates complex numbers as pairs of random numbers uniformly 03312 * distributed between -0.5 and 0.5. 03313 * 03314 * Auxiliary routine for test program for Level 3 Blas. 03315 * 03316 * -- Written on 8-February-1989. 03317 * Jack Dongarra, Argonne National Laboratory. 03318 * Iain Duff, AERE Harwell. 03319 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 03320 * Sven Hammarling, Numerical Algorithms Group Ltd. 03321 * 03322 * .. Scalar Arguments .. 03323 LOGICAL RESET 03324 * .. Local Scalars .. 03325 INTEGER I, IC, J, MI, MJ 03326 * .. Save statement .. 03327 SAVE I, IC, J, MI, MJ 03328 * .. Intrinsic Functions .. 03329 INTRINSIC DCMPLX 03330 * .. Executable Statements .. 03331 IF( RESET )THEN 03332 * Initialize local variables. 03333 MI = 891 03334 MJ = 457 03335 I = 7 03336 J = 7 03337 IC = 0 03338 RESET = .FALSE. 03339 END IF 03340 * 03341 * The sequence of values of I or J is bounded between 1 and 999. 03342 * If initial I or J = 1,2,3,6,7 or 9, the period will be 50. 03343 * If initial I or J = 4 or 8, the period will be 25. 03344 * If initial I or J = 5, the period will be 10. 03345 * IC is used to break up the period by skipping 1 value of I or J 03346 * in 6. 03347 * 03348 IC = IC + 1 03349 10 I = I*MI 03350 J = J*MJ 03351 I = I - 1000*( I/1000 ) 03352 J = J - 1000*( J/1000 ) 03353 IF( IC.GE.5 )THEN 03354 IC = 0 03355 GO TO 10 03356 END IF 03357 ZBEG = DCMPLX( ( I - 500 )/1001.0D0, ( J - 500 )/1001.0D0 ) 03358 RETURN 03359 * 03360 * End of ZBEG. 03361 * 03362 END 03363 DOUBLE PRECISION FUNCTION DDIFF( X, Y ) 03364 * 03365 * Auxiliary routine for test program for Level 3 Blas. 03366 * 03367 * -- Written on 8-February-1989. 03368 * Jack Dongarra, Argonne National Laboratory. 03369 * Iain Duff, AERE Harwell. 03370 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 03371 * Sven Hammarling, Numerical Algorithms Group Ltd. 03372 * 03373 * .. Scalar Arguments .. 03374 DOUBLE PRECISION X, Y 03375 * .. Executable Statements .. 03376 DDIFF = X - Y 03377 RETURN 03378 * 03379 * End of DDIFF. 03380 * 03381 END 03382 SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 03383 * 03384 * Tests whether XERBLA has detected an error when it should. 03385 * 03386 * Auxiliary routine for test program for Level 3 Blas. 03387 * 03388 * -- Written on 8-February-1989. 03389 * Jack Dongarra, Argonne National Laboratory. 03390 * Iain Duff, AERE Harwell. 03391 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 03392 * Sven Hammarling, Numerical Algorithms Group Ltd. 03393 * 03394 * .. Scalar Arguments .. 03395 INTEGER INFOT, NOUT 03396 LOGICAL LERR, OK 03397 CHARACTER*6 SRNAMT 03398 * .. Executable Statements .. 03399 IF( .NOT.LERR )THEN 03400 WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT 03401 OK = .FALSE. 03402 END IF 03403 LERR = .FALSE. 03404 RETURN 03405 * 03406 9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D', 03407 $ 'ETECTED BY ', A6, ' *****' ) 03408 * 03409 * End of CHKXER. 03410 * 03411 END 03412 SUBROUTINE XERBLA( SRNAME, INFO ) 03413 * 03414 * This is a special version of XERBLA to be used only as part of 03415 * the test program for testing error exits from the Level 3 BLAS 03416 * routines. 03417 * 03418 * XERBLA is an error handler for the Level 3 BLAS routines. 03419 * 03420 * It is called by the Level 3 BLAS routines if an input parameter is 03421 * invalid. 03422 * 03423 * Auxiliary routine for test program for Level 3 Blas. 03424 * 03425 * -- Written on 8-February-1989. 03426 * Jack Dongarra, Argonne National Laboratory. 03427 * Iain Duff, AERE Harwell. 03428 * Jeremy Du Croz, Numerical Algorithms Group Ltd. 03429 * Sven Hammarling, Numerical Algorithms Group Ltd. 03430 * 03431 * .. Scalar Arguments .. 03432 INTEGER INFO 03433 CHARACTER*6 SRNAME 03434 * .. Scalars in Common .. 03435 INTEGER INFOT, NOUT 03436 LOGICAL LERR, OK 03437 CHARACTER*6 SRNAMT 03438 * .. Common blocks .. 03439 COMMON /INFOC/INFOT, NOUT, OK, LERR 03440 COMMON /SRNAMC/SRNAMT 03441 * .. Executable Statements .. 03442 LERR = .TRUE. 03443 IF( INFO.NE.INFOT )THEN 03444 IF( INFOT.NE.0 )THEN 03445 WRITE( NOUT, FMT = 9999 )INFO, INFOT 03446 ELSE 03447 WRITE( NOUT, FMT = 9997 )INFO 03448 END IF 03449 OK = .FALSE. 03450 END IF 03451 IF( SRNAME.NE.SRNAMT )THEN 03452 WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT 03453 OK = .FALSE. 03454 END IF 03455 RETURN 03456 * 03457 9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD', 03458 $ ' OF ', I2, ' *******' ) 03459 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE', 03460 $ 'AD OF ', A6, ' *******' ) 03461 9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, 03462 $ ' *******' ) 03463 * 03464 * End of XERBLA 03465 * 03466 END 03467