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