1! Bug reported by Brian Helinski <bjh@absoft.com> on 4 Feb 2003
2      DOUBLE PRECISION FUNCTION DOPBL2( SUBNAM, M, N, KKL, KKU )
3*
4*  -- LAPACK timing routine (version 3.0) --
5*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
6*     Courant Institute, Argonne National Lab, and Rice University
7*     June 30, 1999
8*
9*     .. Scalar Arguments ..
10      CHARACTER*6        SUBNAM
11      INTEGER            KKL, KKU, M, N
12*     ..
13*
14*  Purpose
15*  =======
16*
17*  DOPBL2 computes an approximation of the number of floating point
18*  operations used by a subroutine SUBNAM with the given values
19*  of the parameters M, N, KL, and KU.
20*
21*  This version counts operations for the Level 2 BLAS.
22*
23*  Arguments
24*  =========
25*
26*  SUBNAM  (input) CHARACTER*6
27*          The name of the subroutine.
28*
29*  M       (input) INTEGER
30*          The number of rows of the coefficient matrix.  M >= 0.
31*
32*  N       (input) INTEGER
33*          The number of columns of the coefficient matrix.
34*          If the matrix is square (such as in a solve routine) then
35*          N is the number of right hand sides.  N >= 0.
36*
37*  KKL     (input) INTEGER
38*          The lower band width of the coefficient matrix.
39*          KL is set to max( 0, min( M-1, KKL ) ).
40*
41*  KKU     (input) INTEGER
42*          The upper band width of the coefficient matrix.
43*          KU is set to max( 0, min( N-1, KKU ) ).
44*
45*  =====================================================================
46*
47*     .. Local Scalars ..
48      CHARACTER          C1
49      CHARACTER*2        C2
50      CHARACTER*3        C3
51      DOUBLE PRECISION   ADDS, EK, EM, EN, KL, KU, MULTS
52*     ..
53*     .. External Functions ..
54      LOGICAL            LSAME, LSAMEN
55      EXTERNAL           LSAME, LSAMEN
56*     ..
57*     .. Intrinsic Functions ..
58      INTRINSIC          MAX, MIN
59*     ..
60*     .. Executable Statements ..
61*
62*     Quick return if possible
63*
64      IF( M.LE.0 .OR. .NOT.( LSAME( SUBNAM, 'S' ) .OR. LSAME( SUBNAM,
65     $    'D' ) .OR. LSAME( SUBNAM, 'C' ) .OR. LSAME( SUBNAM, 'Z' ) ) )
66     $     THEN
67         DOPBL2 = 0
68         RETURN
69      END IF
70*
71      C1 = SUBNAM( 1: 1 )
72      C2 = SUBNAM( 2: 3 )
73      C3 = SUBNAM( 4: 6 )
74      MULTS = 0
75      ADDS = 0
76      KL = MAX( 0, MIN( M-1, KKL ) )
77      KU = MAX( 0, MIN( N-1, KKU ) )
78      EM = M
79      EN = N
80      EK = KL
81*
82*     -------------------------------
83*     Matrix-vector multiply routines
84*     -------------------------------
85*
86      IF( LSAMEN( 3, C3, 'MV ' ) ) THEN
87*
88         IF( LSAMEN( 2, C2, 'GE' ) ) THEN
89*
90            MULTS = EM*( EN+1.D0 )
91            ADDS = EM*EN
92*
93*        Assume M <= N + KL and KL < M
94*               N <= M + KU and KU < N
95*        so that the zero sections are triangles.
96*
97         ELSE IF( LSAMEN( 2, C2, 'GB' ) ) THEN
98*
99            MULTS = EM*( EN+1.D0 ) - ( EM-1.D0-KL )*( EM-KL ) / 2.D0 -
100     $              ( EN-1.D0-KU )*( EN-KU ) / 2.D0
101            ADDS = EM*( EN+1.D0 ) - ( EM-1.D0-KL )*( EM-KL ) / 2.D0 -
102     $             ( EN-1.D0-KU )*( EN-KU ) / 2.D0
103*
104         ELSE IF( LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) .OR.
105     $            LSAMEN( 3, SUBNAM, 'CHE' ) .OR.
106     $            LSAMEN( 3, SUBNAM, 'ZHE' ) .OR.
107     $            LSAMEN( 3, SUBNAM, 'CHP' ) .OR.
108     $            LSAMEN( 3, SUBNAM, 'ZHP' ) ) THEN
109*
110            MULTS = EM*( EM+1.D0 )
111            ADDS = EM*EM
112*
113         ELSE IF( LSAMEN( 2, C2, 'SB' ) .OR.
114     $            LSAMEN( 3, SUBNAM, 'CHB' ) .OR.
115     $            LSAMEN( 3, SUBNAM, 'ZHB' ) ) THEN
116*
117            MULTS = EM*( EM+1.D0 ) - ( EM-1.D0-EK )*( EM-EK )
118            ADDS = EM*EM - ( EM-1.D0-EK )*( EM-EK )
119*
120         ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) )
121     $             THEN
122*
123            MULTS = EM*( EM+1.D0 ) / 2.D0
124            ADDS = ( EM-1.D0 )*EM / 2.D0
125*
126         ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN
127*
128            MULTS = EM*( EM+1.D0 ) / 2.D0 -
129     $              ( EM-EK-1.D0 )*( EM-EK ) / 2.D0
130            ADDS = ( EM-1.D0 )*EM / 2.D0 -
131     $             ( EM-EK-1.D0 )*( EM-EK ) / 2.D0
132*
133         END IF
134*
135*     ---------------------
136*     Matrix solve routines
137*     ---------------------
138*
139      ELSE IF( LSAMEN( 3, C3, 'SV ' ) ) THEN
140*
141         IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN
142*
143            MULTS = EM*( EM+1.D0 ) / 2.D0
144            ADDS = ( EM-1.D0 )*EM / 2.D0
145*
146         ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN
147*
148            MULTS = EM*( EM+1.D0 ) / 2.D0 -
149     $              ( EM-EK-1.D0 )*( EM-EK ) / 2.D0
150            ADDS = ( EM-1.D0 )*EM / 2.D0 -
151     $             ( EM-EK-1.D0 )*( EM-EK ) / 2.D0
152*
153         END IF
154*
155*     ----------------
156*     Rank-one updates
157*     ----------------
158*
159      ELSE IF( LSAMEN( 3, C3, 'R  ' ) ) THEN
160*
161         IF( LSAMEN( 3, SUBNAM, 'SGE' ) .OR.
162     $       LSAMEN( 3, SUBNAM, 'DGE' ) ) THEN
163*
164            MULTS = EM*EN + MIN( EM, EN )
165            ADDS = EM*EN
166*
167         ELSE IF( LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) .OR.
168     $            LSAMEN( 3, SUBNAM, 'CHE' ) .OR.
169     $            LSAMEN( 3, SUBNAM, 'CHP' ) .OR.
170     $            LSAMEN( 3, SUBNAM, 'ZHE' ) .OR.
171     $            LSAMEN( 3, SUBNAM, 'ZHP' ) ) THEN
172*
173            MULTS = EM*( EM+1.D0 ) / 2.D0 + EM
174            ADDS = EM*( EM+1.D0 ) / 2.D0
175*
176         END IF
177*
178      ELSE IF( LSAMEN( 3, C3, 'RC ' ) .OR. LSAMEN( 3, C3, 'RU ' ) ) THEN
179*
180         IF( LSAMEN( 3, SUBNAM, 'CGE' ) .OR.
181     $       LSAMEN( 3, SUBNAM, 'ZGE' ) ) THEN
182*
183            MULTS = EM*EN + MIN( EM, EN )
184            ADDS = EM*EN
185*
186         END IF
187*
188*     ----------------
189*     Rank-two updates
190*     ----------------
191*
192      ELSE IF( LSAMEN( 3, C3, 'R2 ' ) ) THEN
193         IF( LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) .OR.
194     $       LSAMEN( 3, SUBNAM, 'CHE' ) .OR.
195     $       LSAMEN( 3, SUBNAM, 'CHP' ) .OR.
196     $       LSAMEN( 3, SUBNAM, 'ZHE' ) .OR.
197     $       LSAMEN( 3, SUBNAM, 'ZHP' ) ) THEN
198*
199            MULTS = EM*( EM+1.D0 ) + 2.D0*EM
200            ADDS = EM*( EM+1.D0 )
201*
202         END IF
203      END IF
204*
205*     ------------------------------------------------
206*     Compute the total number of operations.
207*     For real and double precision routines, count
208*        1 for each multiply and 1 for each add.
209*     For complex and complex*16 routines, count
210*        6 for each multiply and 2 for each add.
211*     ------------------------------------------------
212*
213      IF( LSAME( C1, 'S' ) .OR. LSAME( C1, 'D' ) ) THEN
214*
215         DOPBL2 = MULTS + ADDS
216*
217      ELSE
218*
219         DOPBL2 = 6*MULTS + 2*ADDS
220*
221      END IF
222*
223      RETURN
224*
225*     End of DOPBL2
226*
227      END
228