00001 SUBROUTINE DSBMV(UPLO,N,K,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
00002
00003 DOUBLE PRECISION ALPHA,BETA
00004 INTEGER INCX,INCY,K,LDA,N
00005 CHARACTER UPLO
00006
00007
00008 DOUBLE PRECISION A(LDA,*),X(*),Y(*)
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 DOUBLE PRECISION ONE,ZERO
00134 PARAMETER (ONE=1.0D+0,ZERO=0.0D+0)
00135
00136
00137 DOUBLE PRECISION TEMP1,TEMP2
00138 INTEGER I,INFO,IX,IY,J,JX,JY,KPLUS1,KX,KY,L
00139
00140
00141 LOGICAL LSAME
00142 EXTERNAL LSAME
00143
00144
00145 EXTERNAL XERBLA
00146
00147
00148 INTRINSIC MAX,MIN
00149
00150
00151
00152
00153 INFO = 0
00154 IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
00155 INFO = 1
00156 ELSE IF (N.LT.0) THEN
00157 INFO = 2
00158 ELSE IF (K.LT.0) THEN
00159 INFO = 3
00160 ELSE IF (LDA.LT. (K+1)) THEN
00161 INFO = 6
00162 ELSE IF (INCX.EQ.0) THEN
00163 INFO = 8
00164 ELSE IF (INCY.EQ.0) THEN
00165 INFO = 11
00166 END IF
00167 IF (INFO.NE.0) THEN
00168 CALL XERBLA('DSBMV ',INFO)
00169 RETURN
00170 END IF
00171
00172
00173
00174 IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
00175
00176
00177
00178 IF (INCX.GT.0) THEN
00179 KX = 1
00180 ELSE
00181 KX = 1 - (N-1)*INCX
00182 END IF
00183 IF (INCY.GT.0) THEN
00184 KY = 1
00185 ELSE
00186 KY = 1 - (N-1)*INCY
00187 END IF
00188
00189
00190
00191
00192
00193
00194 IF (BETA.NE.ONE) THEN
00195 IF (INCY.EQ.1) THEN
00196 IF (BETA.EQ.ZERO) THEN
00197 DO 10 I = 1,N
00198 Y(I) = ZERO
00199 10 CONTINUE
00200 ELSE
00201 DO 20 I = 1,N
00202 Y(I) = BETA*Y(I)
00203 20 CONTINUE
00204 END IF
00205 ELSE
00206 IY = KY
00207 IF (BETA.EQ.ZERO) THEN
00208 DO 30 I = 1,N
00209 Y(IY) = ZERO
00210 IY = IY + INCY
00211 30 CONTINUE
00212 ELSE
00213 DO 40 I = 1,N
00214 Y(IY) = BETA*Y(IY)
00215 IY = IY + INCY
00216 40 CONTINUE
00217 END IF
00218 END IF
00219 END IF
00220 IF (ALPHA.EQ.ZERO) RETURN
00221 IF (LSAME(UPLO,'U')) THEN
00222
00223
00224
00225 KPLUS1 = K + 1
00226 IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN
00227 DO 60 J = 1,N
00228 TEMP1 = ALPHA*X(J)
00229 TEMP2 = ZERO
00230 L = KPLUS1 - J
00231 DO 50 I = MAX(1,J-K),J - 1
00232 Y(I) = Y(I) + TEMP1*A(L+I,J)
00233 TEMP2 = TEMP2 + A(L+I,J)*X(I)
00234 50 CONTINUE
00235 Y(J) = Y(J) + TEMP1*A(KPLUS1,J) + ALPHA*TEMP2
00236 60 CONTINUE
00237 ELSE
00238 JX = KX
00239 JY = KY
00240 DO 80 J = 1,N
00241 TEMP1 = ALPHA*X(JX)
00242 TEMP2 = ZERO
00243 IX = KX
00244 IY = KY
00245 L = KPLUS1 - J
00246 DO 70 I = MAX(1,J-K),J - 1
00247 Y(IY) = Y(IY) + TEMP1*A(L+I,J)
00248 TEMP2 = TEMP2 + A(L+I,J)*X(IX)
00249 IX = IX + INCX
00250 IY = IY + INCY
00251 70 CONTINUE
00252 Y(JY) = Y(JY) + TEMP1*A(KPLUS1,J) + ALPHA*TEMP2
00253 JX = JX + INCX
00254 JY = JY + INCY
00255 IF (J.GT.K) THEN
00256 KX = KX + INCX
00257 KY = KY + INCY
00258 END IF
00259 80 CONTINUE
00260 END IF
00261 ELSE
00262
00263
00264
00265 IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN
00266 DO 100 J = 1,N
00267 TEMP1 = ALPHA*X(J)
00268 TEMP2 = ZERO
00269 Y(J) = Y(J) + TEMP1*A(1,J)
00270 L = 1 - J
00271 DO 90 I = J + 1,MIN(N,J+K)
00272 Y(I) = Y(I) + TEMP1*A(L+I,J)
00273 TEMP2 = TEMP2 + A(L+I,J)*X(I)
00274 90 CONTINUE
00275 Y(J) = Y(J) + ALPHA*TEMP2
00276 100 CONTINUE
00277 ELSE
00278 JX = KX
00279 JY = KY
00280 DO 120 J = 1,N
00281 TEMP1 = ALPHA*X(JX)
00282 TEMP2 = ZERO
00283 Y(JY) = Y(JY) + TEMP1*A(1,J)
00284 L = 1 - J
00285 IX = JX
00286 IY = JY
00287 DO 110 I = J + 1,MIN(N,J+K)
00288 IX = IX + INCX
00289 IY = IY + INCY
00290 Y(IY) = Y(IY) + TEMP1*A(L+I,J)
00291 TEMP2 = TEMP2 + A(L+I,J)*X(IX)
00292 110 CONTINUE
00293 Y(JY) = Y(JY) + ALPHA*TEMP2
00294 JX = JX + INCX
00295 JY = JY + INCY
00296 120 CONTINUE
00297 END IF
00298 END IF
00299
00300 RETURN
00301
00302
00303
00304 END