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