1 PROGRAM DTIMAA 2* 3* -- LAPACK timing routine (version 3.0) -- 4* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., 5* Courant Institute, Argonne National Lab, and Rice University 6* June 30, 1999 7* 8* Purpose 9* ======= 10* 11* DTIMAA is the timing program for the DOUBLE PRECISION LAPACK 12* routines. This program collects performance data for the factor, 13* solve, and inverse routines used in solving systems of linear 14* equations, and also for the orthogonal factorization and reduction 15* routines used in solving least squares problems and matrix eigenvalue 16* problems. 17* 18* The subprograms call a DOUBLE PRECISION function DSECND with no 19* arguments which is assumed to return the central-processor time in 20* seconds from some fixed starting time. 21* 22* The program is driven by a short data file, which specifies values 23* for the matrix dimensions M, N and K, for the blocking parameters 24* NB and NX, and for the leading array dimension LDA. A minimum time 25* for each subroutine is included for timing small problems or for 26* obtaining results on a machine with an inaccurate DSECND function. 27* 28* The matrix dimensions M, N, and K correspond to the three dimensions 29* m, n, and k in the Level 3 BLAS. When timing the LAPACK routines for 30* square matrices, M and N correspond to the matrix dimensions m and n, 31* and K is the number of right-hand sides (nrhs) for the solves. When 32* timing the LAPACK routines for band matrices, M is the matrix order 33* m, N is the half-bandwidth (kl, ku, or kd in the LAPACK notation), 34* and K is again the number of right-hand sides. 35* 36* The first 13 records of the data file are read using list-directed 37* input. The first line of input is printed as the first line of 38* output and can be used to identify different sets of results. To 39* assist with debugging an input file, the values are printed out as 40* they are read in. 41* 42* The following records are read using the format (A). For these 43* records, the first 6 characters are reserved for the path or 44* subroutine name. If a path name is used, the characters after the 45* path name indicate the routines in the path to be timed, where 46* 'T' or 't' means 'Time this routine'. If the line is blank after the 47* path name, all routines in the path are timed. If fewer characters 48* appear than routines in a path, the remaining characters are assumed 49* to be 'F'. For example, the following 3 lines are equivalent ways of 50* requesting timing of DGETRF: 51* DGE T F F 52* DGE T 53* DGETRF 54* 55* An annotated example of a data file can be obtained by deleting the 56* first 3 characters from the following 30 lines: 57* LAPACK timing, DOUBLE PRECISION square matrices 58* 5 Number of values of M 59* 100 200 300 400 500 Values of M (row dimension) 60* 5 Number of values of N 61* 100 200 300 400 500 Values of N (column dimension) 62* 2 Number of values of K 63* 100 400 Values of K 64* 5 Number of values of NB 65* 1 16 32 48 64 Values of NB (blocksize) 66* 0 48 128 128 128 Values of NX (crossover point) 67* 2 Number of values of LDA 68* 512 513 Values of LDA (leading dimension) 69* 0.0 Minimum time in seconds 70* DGE T T T 71* DPO T T T 72* DPP T T T 73* DSY T T T 74* DSP T T T 75* DTR T T 76* DTP T T 77* DQR T T F 78* DLQ T T F 79* DQL T T F 80* DRQ T T F 81* DQP T 82* DHR T T F F 83* DTD T T F F 84* DBR T F F 85* DLS T T T T T T 86* 87* The routines are timed for all combinations of applicable values of 88* M, N, K, NB, NX, and LDA, and for all combinations of options such as 89* UPLO and TRANS. For Level 2 BLAS timings, values of NB are used for 90* INCX. Certain subroutines, such as the QR factorization, treat the 91* values of M and N as ordered pairs and operate on M x N matrices. 92* 93* Internal Parameters 94* =================== 95* 96* NMAX INTEGER 97* The maximum value of M or N for square matrices. 98* 99* LDAMAX INTEGER 100* The maximum value of LDA. 101* 102* NMAXB INTEGER 103* The maximum value of N for band matrices. 104* 105* MAXVAL INTEGER 106* The maximum number of values that can be read in for M, N, 107* K, NB, or NX. 108* 109* MXNLDA INTEGER 110* The maximum number of values that can be read in for LDA. 111* 112* NIN INTEGER 113* The unit number for input. Currently set to 5 (std input). 114* 115* NOUT INTEGER 116* The unit number for output. Currently set to 6 (std output). 117* 118* ===================================================================== 119* 120* .. Parameters .. 121 INTEGER NMAX, LDAMAX, NMAXB 122 PARAMETER ( NMAX = 512, LDAMAX = NMAX+20, NMAXB = 5000 ) 123 INTEGER LA 124 PARAMETER ( LA = NMAX*LDAMAX ) 125 INTEGER MAXVAL, MXNLDA 126 PARAMETER ( MAXVAL = 12, MXNLDA = 4 ) 127 INTEGER MAXPRM 128 PARAMETER ( MAXPRM = MXNLDA*(MAXVAL+1) ) 129 INTEGER MAXSZS 130 PARAMETER ( MAXSZS = MAXVAL*MAXVAL*MAXVAL ) 131 INTEGER NIN, NOUT 132 PARAMETER ( NIN = 5, NOUT = 6 ) 133* .. 134* .. Local Scalars .. 135 LOGICAL BLAS, LDAMOK, LDANOK, LDAOK, MOK, NOK, NXNBOK 136 CHARACTER C1 137 CHARACTER*2 C2 138 CHARACTER*3 C3 139 CHARACTER*80 LINE 140 INTEGER I, I2, J2, L, LDR1, LDR2, LDR3, MAXK, MAXLDA, 141 $ MAXM, MAXN, MAXNB, MKMAX, NEED, NK, NLDA, NM, 142 $ NN, NNB 143 DOUBLE PRECISION S1, S2, TIMMIN 144* .. 145* .. Local Arrays .. 146 INTEGER IWORK( 2*NMAXB ), KVAL( MAXVAL ), 147 $ LDAVAL( MXNLDA ), MVAL( MAXVAL ), 148 $ NBVAL( MAXVAL ), NVAL( MAXVAL ), 149 $ NXVAL( MAXVAL ) 150 DOUBLE PRECISION A( LA, 4 ), D( 2*NMAX, 2 ), 151 $ FLPTBL( 6*6*MAXSZS*MAXPRM*5 ), 152 $ OPCTBL( 6*6*MAXSZS*MAXPRM*5 ), 153 $ RESLTS( MAXVAL, MAXVAL, 2*MXNLDA, 4*MAXVAL ), 154 $ S( NMAX*2 ), TIMTBL( 6*6*MAXSZS*MAXPRM*5 ), 155 $ WORK( NMAX, NMAX+MAXVAL+30 ) 156* .. 157* .. External Functions .. 158 LOGICAL LSAME, LSAMEN 159 DOUBLE PRECISION DSECND 160 EXTERNAL LSAME, LSAMEN, DSECND 161* .. 162* .. External Subroutines .. 163 EXTERNAL DTIMB2, DTIMB3, DTIMBR, DTIMGB, DTIMGE, DTIMGT, 164 $ DTIMHR, DTIMLQ, DTIMLS, DTIMMM, DTIMMV, DTIMPB, 165 $ DTIMPO, DTIMPP, DTIMPT, DTIMQ3, DTIMQL, DTIMQP, 166 $ DTIMQR, DTIMRQ, DTIMSP, DTIMSY, DTIMTB, DTIMTD, 167 $ DTIMTP, DTIMTR 168* .. 169* .. Scalars in Common .. 170 INTEGER NB, NEISPK, NPROC, NSHIFT 171* .. 172* .. Common blocks .. 173 COMMON / CENVIR / NB, NPROC, NSHIFT, NEISPK 174* .. 175* .. Intrinsic Functions .. 176 INTRINSIC MAX 177* .. 178* .. Executable Statements .. 179* 180 S1 = DSECND( ) 181 LDR1 = MAXVAL 182 LDR2 = MAXVAL 183 LDR3 = 2*MXNLDA 184 WRITE( NOUT, FMT = 9983 ) 185* 186* Read the first line. The first four characters must be 'BLAS' 187* for the BLAS data file format to be used. Otherwise, the LAPACK 188* data file format is assumed. 189* 190 READ( NIN, FMT = '( A80 )' )LINE 191 BLAS = LSAMEN( 4, LINE, 'BLAS' ) 192* 193* Find the last non-blank and print the first line of input as the 194* first line of output. 195* 196 DO 10 L = 80, 1, -1 197 IF( LINE( L: L ).NE.' ' ) 198 $ GO TO 20 199 10 CONTINUE 200 L = 1 201 20 CONTINUE 202 WRITE( NOUT, FMT = '( 1X, A, / )' )LINE( 1: L ) 203 WRITE( NOUT, FMT = 9992 ) 204* 205* Read in NM and the values for M. 206* 207 READ( NIN, FMT = * )NM 208 IF( NM.GT.MAXVAL ) THEN 209 WRITE( NOUT, FMT = 9999 )'M', 'NM', MAXVAL 210 NM = MAXVAL 211 END IF 212 READ( NIN, FMT = * )( MVAL( I ), I = 1, NM ) 213 WRITE( NOUT, FMT = 9991 )'M: ', ( MVAL( I ), I = 1, NM ) 214* 215* Check that M <= NMAXB for all values of M. 216* 217 MOK = .TRUE. 218 MAXM = 0 219 DO 30 I = 1, NM 220 MAXM = MAX( MVAL( I ), MAXM ) 221 IF( MVAL( I ).GT.NMAXB ) THEN 222 WRITE( NOUT, FMT = 9997 )'M', MVAL( I ), NMAXB 223 MOK = .FALSE. 224 END IF 225 30 CONTINUE 226 IF( .NOT.MOK ) 227 $ WRITE( NOUT, FMT = * ) 228* 229* Read in NN and the values for N. 230* 231 READ( NIN, FMT = * )NN 232 IF( NN.GT.MAXVAL ) THEN 233 WRITE( NOUT, FMT = 9999 )'N', 'NN', MAXVAL 234 NN = MAXVAL 235 END IF 236 READ( NIN, FMT = * )( NVAL( I ), I = 1, NN ) 237 WRITE( NOUT, FMT = 9991 )'N: ', ( NVAL( I ), I = 1, NN ) 238* 239* Check that N <= NMAXB for all values of N. 240* 241 NOK = .TRUE. 242 MAXN = 0 243 DO 40 I = 1, NN 244 MAXN = MAX( NVAL( I ), MAXN ) 245 IF( NVAL( I ).GT.NMAXB ) THEN 246 WRITE( NOUT, FMT = 9997 )'N', NVAL( I ), NMAXB 247 NOK = .FALSE. 248 END IF 249 40 CONTINUE 250 IF( .NOT.NOK ) 251 $ WRITE( NOUT, FMT = * ) 252* 253* Read in NK and the values for K. 254* 255 READ( NIN, FMT = * )NK 256 IF( NK.GT.MAXVAL ) THEN 257 WRITE( NOUT, FMT = 9999 )'K', 'NK', MAXVAL 258 NK = MAXVAL 259 END IF 260 READ( NIN, FMT = * )( KVAL( I ), I = 1, NK ) 261 WRITE( NOUT, FMT = 9991 )'K: ', ( KVAL( I ), I = 1, NK ) 262* 263* Find the maximum value of K (= NRHS). 264* 265 MAXK = 0 266 DO 50 I = 1, NK 267 MAXK = MAX( KVAL( I ), MAXK ) 268 50 CONTINUE 269 MKMAX = MAXM*MAX( 2, MAXK ) 270* 271* Read in NNB and the values for NB. For the BLAS input files, 272* NBVAL is used to store values for INCX and INCY. 273* 274 READ( NIN, FMT = * )NNB 275 IF( NNB.GT.MAXVAL ) THEN 276 WRITE( NOUT, FMT = 9999 )'NB', 'NNB', MAXVAL 277 NNB = MAXVAL 278 END IF 279 READ( NIN, FMT = * )( NBVAL( I ), I = 1, NNB ) 280* 281* Find the maximum value of NB. 282* 283 MAXNB = 0 284 DO 60 I = 1, NNB 285 MAXNB = MAX( NBVAL( I ), MAXNB ) 286 60 CONTINUE 287* 288 IF( BLAS ) THEN 289 WRITE( NOUT, FMT = 9991 )'INCX: ', ( NBVAL( I ), I = 1, NNB ) 290 DO 70 I = 1, NNB 291 NXVAL( I ) = 0 292 70 CONTINUE 293 ELSE 294* 295* LAPACK data files: Read in the values for NX. 296* 297 READ( NIN, FMT = * )( NXVAL( I ), I = 1, NNB ) 298* 299 WRITE( NOUT, FMT = 9991 )'NB: ', ( NBVAL( I ), I = 1, NNB ) 300 WRITE( NOUT, FMT = 9991 )'NX: ', ( NXVAL( I ), I = 1, NNB ) 301 END IF 302* 303* Read in NLDA and the values for LDA. 304* 305 READ( NIN, FMT = * )NLDA 306 IF( NLDA.GT.MXNLDA ) THEN 307 WRITE( NOUT, FMT = 9999 )'LDA', 'NLDA', MXNLDA 308 NLDA = MXNLDA 309 END IF 310 READ( NIN, FMT = * )( LDAVAL( I ), I = 1, NLDA ) 311 WRITE( NOUT, FMT = 9991 )'LDA: ', ( LDAVAL( I ), I = 1, NLDA ) 312* 313* Check that LDA >= 1 for all values of LDA. 314* 315 LDAOK = .TRUE. 316 MAXLDA = 0 317 DO 80 I = 1, NLDA 318 MAXLDA = MAX( LDAVAL( I ), MAXLDA ) 319 IF( LDAVAL( I ).LE.0 ) THEN 320 WRITE( NOUT, FMT = 9998 )LDAVAL( I ) 321 LDAOK = .FALSE. 322 END IF 323 80 CONTINUE 324 IF( .NOT.LDAOK ) 325 $ WRITE( NOUT, FMT = * ) 326* 327* Check that MAXLDA*MAXN <= LA (for the dense routines). 328* 329 LDANOK = .TRUE. 330 NEED = MAXLDA*MAXN 331 IF( NEED.GT.LA ) THEN 332 WRITE( NOUT, FMT = 9995 )MAXLDA, MAXN, NEED 333 LDANOK = .FALSE. 334 END IF 335* 336* Check that MAXLDA*MAXM + MAXM*MAXK <= 3*LA (for band routines). 337* 338 LDAMOK = .TRUE. 339 NEED = MAXLDA*MAXM + MAXM*MAXK 340 IF( NEED.GT.3*LA ) THEN 341 NEED = ( NEED+2 ) / 3 342 WRITE( NOUT, FMT = 9994 )MAXLDA, MAXM, MAXK, NEED 343 LDAMOK = .FALSE. 344 END IF 345* 346* Check that MAXN*MAXNB (or MAXN*INCX) <= LA. 347* 348 NXNBOK = .TRUE. 349 NEED = MAXN*MAXNB 350 IF( NEED.GT.LA ) THEN 351 WRITE( NOUT, FMT = 9996 )MAXN, MAXNB, NEED 352 NXNBOK = .FALSE. 353 END IF 354* 355 IF( .NOT.( MOK .AND. NOK .AND. LDAOK .AND. LDANOK .AND. NXNBOK ) ) 356 $ THEN 357 WRITE( NOUT, FMT = 9984 ) 358 GO TO 110 359 END IF 360 IF( .NOT.LDAMOK ) 361 $ WRITE( NOUT, FMT = * ) 362* 363* Read the minimum time to time a subroutine. 364* 365 WRITE( NOUT, FMT = * ) 366 READ( NIN, FMT = * )TIMMIN 367 WRITE( NOUT, FMT = 9993 )TIMMIN 368 WRITE( NOUT, FMT = * ) 369* 370* Read the first input line. 371* 372 READ( NIN, FMT = '(A)', END = 100 )LINE 373* 374* If the first record is the special signal 'NONE', then get the 375* next line but don't time DGEMV and SGEMM. 376* 377 IF( LSAMEN( 4, LINE, 'NONE' ) ) THEN 378 READ( NIN, FMT = '(A)', END = 100 )LINE 379 ELSE 380 WRITE( NOUT, FMT = 9990 ) 381* 382* If the first record is the special signal 'BAND', then time 383* the band routine DGBMV and DGEMM with N = K. 384* 385 IF( LSAMEN( 4, LINE, 'BAND' ) ) THEN 386 IF( LDAMOK ) THEN 387 IF( MKMAX.GT.LA ) THEN 388 I2 = 2*LA - MKMAX + 1 389 J2 = 2 390 ELSE 391 I2 = LA - MKMAX + 1 392 J2 = 3 393 END IF 394 CALL DTIMMV( 'DGBMV ', NM, MVAL, NN, NVAL, NLDA, LDAVAL, 395 $ TIMMIN, A( 1, 1 ), MKMAX / 2, A( I2, J2 ), 396 $ A( LA-MKMAX / 2+1, 3 ), RESLTS, LDR1, LDR2, 397 $ NOUT ) 398 ELSE 399 WRITE( NOUT, FMT = 9989 )'DGBMV ' 400 END IF 401 CALL DTIMMM( 'DGEMM ', 'K', NN, NVAL, NLDA, LDAVAL, TIMMIN, 402 $ A( 1, 1 ), A( 1, 2 ), A( 1, 3 ), RESLTS, LDR1, 403 $ LDR2, NOUT ) 404 READ( NIN, FMT = '(A)', END = 100 )LINE 405* 406 ELSE 407* 408* Otherwise time DGEMV and SGEMM. 409* 410 CALL DTIMMV( 'DGEMV ', NN, NVAL, NNB, NBVAL, NLDA, LDAVAL, 411 $ TIMMIN, A( 1, 1 ), LA, A( 1, 2 ), A( 1, 3 ), 412 $ RESLTS, LDR1, LDR2, NOUT ) 413 CALL DTIMMM( 'DGEMM ', 'N', NN, NVAL, NLDA, LDAVAL, TIMMIN, 414 $ A( 1, 1 ), A( 1, 2 ), A( 1, 3 ), RESLTS, LDR1, 415 $ LDR2, NOUT ) 416 END IF 417 END IF 418* 419* Call the appropriate timing routine for each input line. 420* 421 WRITE( NOUT, FMT = 9988 ) 422 90 CONTINUE 423 C1 = LINE( 1: 1 ) 424 C2 = LINE( 2: 3 ) 425 C3 = LINE( 4: 6 ) 426* 427* Check first character for correct precision. 428* 429 IF( .NOT.LSAME( C1, 'Double precision' ) ) THEN 430 WRITE( NOUT, FMT = 9987 )LINE( 1: 6 ) 431* 432 ELSE IF( LSAMEN( 2, C2, 'B2' ) .OR. LSAMEN( 3, C3, 'MV ' ) .OR. 433 $ LSAMEN( 3, C3, 'SV ' ) .OR. LSAMEN( 3, C3, 'R ' ) .OR. 434 $ LSAMEN( 3, C3, 'RC ' ) .OR. LSAMEN( 3, C3, 'RU ' ) .OR. 435 $ LSAMEN( 3, C3, 'R2 ' ) ) THEN 436* 437* Level 2 BLAS 438* 439 CALL DTIMB2( LINE, NM, MVAL, NN, NVAL, NK, KVAL, NNB, NBVAL, 440 $ NLDA, LDAVAL, LA, TIMMIN, A( 1, 1 ), A( 1, 2 ), 441 $ A( 1, 3 ), RESLTS, LDR1, LDR2, NOUT ) 442* 443 ELSE IF( LSAMEN( 2, C2, 'B3' ) .OR. LSAMEN( 3, C3, 'MM ' ) .OR. 444 $ LSAMEN( 3, C3, 'SM ' ) .OR. LSAMEN( 3, C3, 'RK ' ) .OR. 445 $ LSAMEN( 3, C3, 'R2K' ) ) THEN 446* 447* Level 3 BLAS 448* 449 CALL DTIMB3( LINE, NM, MVAL, NN, NVAL, NK, KVAL, NLDA, LDAVAL, 450 $ TIMMIN, A( 1, 1 ), A( 1, 2 ), A( 1, 3 ), RESLTS, 451 $ LDR1, LDR2, NOUT ) 452* 453 ELSE IF( LSAMEN( 2, C2, 'QR' ) .OR. LSAMEN( 2, C3, 'QR' ) .OR. 454 $ LSAMEN( 2, C3( 2: 3 ), 'QR' ) ) THEN 455* 456* QR routines 457* 458 CALL DTIMQR( LINE, NN, MVAL, NVAL, NK, KVAL, NNB, NBVAL, NXVAL, 459 $ NLDA, LDAVAL, TIMMIN, A( 1, 1 ), D, A( 1, 2 ), 460 $ A( 1, 3 ), RESLTS, LDR1, LDR2, LDR3, NOUT ) 461* 462 ELSE IF( LSAMEN( 2, C2, 'LQ' ) .OR. LSAMEN( 2, C3, 'LQ' ) .OR. 463 $ LSAMEN( 2, C3( 2: 3 ), 'LQ' ) ) THEN 464* 465* LQ routines 466* 467 CALL DTIMLQ( LINE, NN, MVAL, NVAL, NK, KVAL, NNB, NBVAL, NXVAL, 468 $ NLDA, LDAVAL, TIMMIN, A( 1, 1 ), D, A( 1, 2 ), 469 $ A( 1, 3 ), RESLTS, LDR1, LDR2, LDR3, NOUT ) 470* 471 ELSE IF( LSAMEN( 2, C2, 'QL' ) .OR. LSAMEN( 2, C3, 'QL' ) .OR. 472 $ LSAMEN( 2, C3( 2: 3 ), 'QL' ) ) THEN 473* 474* QL routines 475* 476 CALL DTIMQL( LINE, NN, MVAL, NVAL, NK, KVAL, NNB, NBVAL, NXVAL, 477 $ NLDA, LDAVAL, TIMMIN, A( 1, 1 ), D, A( 1, 2 ), 478 $ A( 1, 3 ), RESLTS, LDR1, LDR2, LDR3, NOUT ) 479* 480 ELSE IF( LSAMEN( 2, C2, 'RQ' ) .OR. LSAMEN( 2, C3, 'RQ' ) .OR. 481 $ LSAMEN( 2, C3( 2: 3 ), 'RQ' ) ) THEN 482* 483* RQ routines 484* 485 CALL DTIMRQ( LINE, NN, MVAL, NVAL, NK, KVAL, NNB, NBVAL, NXVAL, 486 $ NLDA, LDAVAL, TIMMIN, A( 1, 1 ), D, A( 1, 2 ), 487 $ A( 1, 3 ), RESLTS, LDR1, LDR2, LDR3, NOUT ) 488* 489 ELSE IF( LSAMEN( 2, C2, 'QP' ) .OR. LSAMEN( 3, C3, 'QPF' ) ) THEN 490* 491* QR with column pivoting 492* 493 CALL DTIMQP( LINE, NM, MVAL, NVAL, NLDA, LDAVAL, TIMMIN, 494 $ A( 1, 1 ), A( 1, 2 ), D( 1, 1 ), A( 1, 3 ), IWORK, 495 $ RESLTS, LDR1, LDR2, NOUT ) 496* 497* Blas-3 QR with column pivoting 498* 499 CALL DTIMQ3( LINE, NM, MVAL, NVAL, NNB, NBVAL, NXVAL, NLDA, 500 $ LDAVAL, TIMMIN, A( 1, 1 ), A( 1, 2 ), D( 1, 1 ), 501 $ A( 1, 3 ), IWORK, RESLTS, LDR1, LDR2, NOUT ) 502* 503 ELSE IF( LSAMEN( 2, C2, 'HR' ) .OR. LSAMEN( 3, C3, 'HRD' ) .OR. 504 $ LSAMEN( 2, C3( 2: 3 ), 'HR' ) ) THEN 505* 506* Reduction to Hessenberg form 507* 508 CALL DTIMHR( LINE, NN, NVAL, NK, KVAL, NNB, NBVAL, NXVAL, NLDA, 509 $ LDAVAL, TIMMIN, A( 1, 1 ), D, A( 1, 2 ), 510 $ A( 1, 3 ), RESLTS, LDR1, LDR2, LDR3, NOUT ) 511* 512 ELSE IF( LSAMEN( 2, C2, 'TD' ) .OR. LSAMEN( 3, C3, 'TRD' ) .OR. 513 $ LSAMEN( 2, C3( 2: 3 ), 'TR' ) ) THEN 514* 515* Reduction to tridiagonal form 516* 517 CALL DTIMTD( LINE, NN, NVAL, NK, KVAL, NNB, NBVAL, NXVAL, NLDA, 518 $ LDAVAL, TIMMIN, A( 1, 1 ), A( 1, 2 ), D( 1, 1 ), 519 $ D( 1, 2 ), A( 1, 3 ), RESLTS, LDR1, LDR2, LDR3, 520 $ NOUT ) 521* 522 ELSE IF( LSAMEN( 2, C2, 'BR' ) .OR. LSAMEN( 3, C3, 'BRD' ) .OR. 523 $ LSAMEN( 2, C3( 2: 3 ), 'BR' ) ) THEN 524* 525* Reduction to bidiagonal form 526* 527 CALL DTIMBR( LINE, NN, MVAL, NVAL, NK, KVAL, NNB, NBVAL, NXVAL, 528 $ NLDA, LDAVAL, TIMMIN, A( 1, 1 ), A( 1, 2 ), 529 $ D( 1, 1 ), D( 1, 2 ), A( 1, 3 ), RESLTS, LDR1, 530 $ LDR2, LDR3, NOUT ) 531* 532 ELSE IF( LSAMEN( 2, C2, 'GE' ) ) THEN 533* 534* Routines for general matrices 535* 536 CALL DTIMGE( LINE, NN, NVAL, NK, KVAL, NNB, NBVAL, NLDA, 537 $ LDAVAL, TIMMIN, A( 1, 1 ), A( 1, 2 ), A( 1, 3 ), 538 $ IWORK, RESLTS, LDR1, LDR2, LDR3, NOUT ) 539* 540 ELSE IF( LSAMEN( 2, C2, 'GB' ) ) THEN 541* 542* General band matrices 543* 544 IF( LDAMOK ) THEN 545 CALL DTIMGB( LINE, NM, MVAL, NN, NVAL, NK, KVAL, NNB, NBVAL, 546 $ NLDA, LDAVAL, TIMMIN, A( 1, 1 ), 547 $ A( LA-MKMAX+1, 3 ), IWORK, RESLTS, LDR1, LDR2, 548 $ LDR3, NOUT ) 549 ELSE 550 WRITE( NOUT, FMT = 9989 )LINE( 1: 6 ) 551 END IF 552* 553 ELSE IF( LSAMEN( 2, C2, 'GT' ) ) THEN 554* 555* Routines for general tridiagonal matrices 556* 557 CALL DTIMGT( LINE, NN, NVAL, NK, KVAL, NLDA, LDAVAL, TIMMIN, 558 $ A( 1, 1 ), A( 1, 2 ), IWORK, RESLTS, LDR1, LDR2, 559 $ LDR3, NOUT ) 560* 561 ELSE IF( LSAMEN( 2, C2, 'PO' ) ) THEN 562* 563* Positive definite matrices 564* 565 CALL DTIMPO( LINE, NN, NVAL, NK, KVAL, NNB, NBVAL, NLDA, 566 $ LDAVAL, TIMMIN, A( 1, 1 ), A( 1, 2 ), IWORK, 567 $ RESLTS, LDR1, LDR2, LDR3, NOUT ) 568* 569 ELSE IF( LSAMEN( 2, C2, 'PP' ) ) THEN 570* 571* Positive definite packed matrices 572* 573 CALL DTIMPP( LINE, NN, NVAL, NK, KVAL, LA, TIMMIN, A( 1, 1 ), 574 $ A( 1, 2 ), IWORK, RESLTS, LDR1, LDR2, LDR3, NOUT ) 575* 576 ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN 577* 578* Positive definite banded matrices 579* 580 IF( LDAMOK ) THEN 581 IF( MKMAX.GT.LA ) THEN 582 J2 = 2 583 I2 = 2*LA - MKMAX + 1 584 ELSE 585 J2 = 3 586 I2 = LA - MKMAX + 1 587 END IF 588 CALL DTIMPB( LINE, NM, MVAL, NN, NVAL, NK, KVAL, NNB, NBVAL, 589 $ NLDA, LDAVAL, TIMMIN, A( 1, 1 ), A( I2, J2 ), 590 $ IWORK, RESLTS, LDR1, LDR2, LDR3, NOUT ) 591 ELSE 592 WRITE( NOUT, FMT = 9989 )LINE( 1: 6 ) 593 END IF 594* 595 ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN 596* 597* Routines for positive definite tridiagonal matrices 598* 599 CALL DTIMPT( LINE, NN, NVAL, NK, KVAL, NLDA, LDAVAL, TIMMIN, 600 $ A( 1, 1 ), A( 1, 2 ), RESLTS, LDR1, LDR2, LDR3, 601 $ NOUT ) 602* 603 ELSE IF( LSAMEN( 2, C2, 'SY' ) ) THEN 604* 605* Symmetric indefinite matrices 606* 607 CALL DTIMSY( LINE, NN, NVAL, NK, KVAL, NNB, NBVAL, NLDA, 608 $ LDAVAL, TIMMIN, A( 1, 1 ), A( 1, 2 ), A( 1, 3 ), 609 $ IWORK, RESLTS, LDR1, LDR2, LDR3, NOUT ) 610* 611 ELSE IF( LSAMEN( 2, C2, 'SP' ) ) THEN 612* 613* Symmetric indefinite packed matrices 614* 615 CALL DTIMSP( LINE, NN, NVAL, NK, KVAL, LA, TIMMIN, A( 1, 1 ), 616 $ A( 1, 2 ), A( 1, 3 ), IWORK, RESLTS, LDR1, LDR2, 617 $ LDR3, NOUT ) 618* 619 ELSE IF( LSAMEN( 2, C2, 'TR' ) ) THEN 620* 621* Triangular matrices 622* 623 CALL DTIMTR( LINE, NN, NVAL, NK, KVAL, NNB, NBVAL, NLDA, 624 $ LDAVAL, TIMMIN, A( 1, 1 ), A( 1, 2 ), RESLTS, 625 $ LDR1, LDR2, LDR3, NOUT ) 626* 627 ELSE IF( LSAMEN( 2, C2, 'TP' ) ) THEN 628* 629* Triangular packed matrices 630* 631 CALL DTIMTP( LINE, NN, NVAL, NK, KVAL, LA, TIMMIN, A( 1, 1 ), 632 $ A( 1, 2 ), RESLTS, LDR1, LDR2, LDR3, NOUT ) 633* 634 ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN 635* 636* Triangular band matrices 637* 638 IF( LDAMOK ) THEN 639 IF( MKMAX.GT.LA ) THEN 640 J2 = 2 641 I2 = 2*LA - MKMAX + 1 642 ELSE 643 J2 = 3 644 I2 = LA - MKMAX + 1 645 END IF 646 CALL DTIMTB( LINE, NM, MVAL, NN, NVAL, NK, KVAL, NLDA, 647 $ LDAVAL, TIMMIN, A( 1, 1 ), A( I2, J2 ), RESLTS, 648 $ LDR1, LDR2, LDR3, NOUT ) 649 ELSE 650 WRITE( NOUT, FMT = 9989 )LINE( 1: 6 ) 651 END IF 652* 653 ELSE IF( LSAMEN( 2, C2, 'LS' ) ) THEN 654* 655* Least squares drivers 656* 657 CALL DTIMLS( LINE, NM, MVAL, NN, NVAL, NK, KVAL, NNB, NBVAL, 658 $ NXVAL, NLDA, LDAVAL, TIMMIN, A( 1, 1 ), A( 1, 2 ), 659 $ A( 1, 3 ), A( 1, 4 ), S, S( NMAX+1 ), OPCTBL, 660 $ TIMTBL, FLPTBL, WORK, IWORK, NOUT ) 661* 662 ELSE 663* 664 WRITE( NOUT, FMT = 9987 )LINE( 1: 6 ) 665 END IF 666* 667* Read the next line of the input file. 668* 669 READ( NIN, FMT = '(A)', END = 100 )LINE 670 GO TO 90 671* 672* Branch to this line when the last record is read. 673* 674 100 CONTINUE 675 S2 = DSECND( ) 676 WRITE( NOUT, FMT = 9986 ) 677 WRITE( NOUT, FMT = 9985 )S2 - S1 678 110 CONTINUE 679* 680 9999 FORMAT( ' Too many values of ', A, ' using ', A, ' = ', I2 ) 681 9998 FORMAT( ' *** LDA = ', I7, ' is too small, must have ', 682 $ 'LDA > 0.' ) 683 9997 FORMAT( ' *** ', A1, ' = ', I7, ' is too big: ', 684 $ 'maximum allowed is', I7 ) 685 9996 FORMAT( ' *** N*NB is too big for N =', I6, ', NB =', I6, 686 $ / ' --> Increase LA to at least ', I8 ) 687 9995 FORMAT( ' *** LDA*N is too big for the dense routines ', '(LDA =', 688 $ I6, ', N =', I6, ')', / ' --> Increase LA to at least ', 689 $ I8 ) 690 9994 FORMAT( ' *** (LDA+K)*M is too big for the band routines ', 691 $ '(LDA=', I6, ', M=', I6, ', K=', I6, ')', 692 $ / ' --> Increase LA to at least ', I8 ) 693 9993 FORMAT( ' The minimum time a subroutine will be timed = ', F6.3, 694 $ ' seconds' ) 695 9992 FORMAT( ' The following parameter values will be used:' ) 696 9991 FORMAT( 4X, A7, 1X, 10I6, / 12X, 10I6 ) 697 9990 FORMAT( / ' ------------------------------', 698 $ / ' >>>>> Sample BLAS <<<<<', 699 $ / ' ------------------------------' ) 700 9989 FORMAT( 1X, A6, ' not timed due to input errors', / ) 701 9988 FORMAT( / ' ------------------------------', 702 $ / ' >>>>> Timing data <<<<<', 703 $ / ' ------------------------------' ) 704 9987 FORMAT( 1X, A6, ': Unrecognized path or subroutine name', / ) 705 9986 FORMAT( ' End of tests' ) 706 9985 FORMAT( ' Total time used = ', F12.2, ' seconds' ) 707 9984 FORMAT( / ' Tests not done due to input errors' ) 708 9983 FORMAT( ' LAPACK VERSION 3.0, released June 30, 1999 ', / ) 709* 710* End of DTIMAA 711* 712 END 713