00001 SUBROUTINE CGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
00002
00003 COMPLEX ALPHA,BETA
00004 INTEGER INCX,INCY,KL,KU,LDA,M,N
00005 CHARACTER TRANS
00006
00007
00008 COMPLEX 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
00134
00135 COMPLEX ONE
00136 PARAMETER (ONE= (1.0E+0,0.0E+0))
00137 COMPLEX ZERO
00138 PARAMETER (ZERO= (0.0E+0,0.0E+0))
00139
00140
00141 COMPLEX TEMP
00142 INTEGER I,INFO,IX,IY,J,JX,JY,K,KUP1,KX,KY,LENX,LENY
00143 LOGICAL NOCONJ
00144
00145
00146 LOGICAL LSAME
00147 EXTERNAL LSAME
00148
00149
00150 EXTERNAL XERBLA
00151
00152
00153 INTRINSIC CONJG,MAX,MIN
00154
00155
00156
00157
00158 INFO = 0
00159 IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
00160 + .NOT.LSAME(TRANS,'C')) THEN
00161 INFO = 1
00162 ELSE IF (M.LT.0) THEN
00163 INFO = 2
00164 ELSE IF (N.LT.0) THEN
00165 INFO = 3
00166 ELSE IF (KL.LT.0) THEN
00167 INFO = 4
00168 ELSE IF (KU.LT.0) THEN
00169 INFO = 5
00170 ELSE IF (LDA.LT. (KL+KU+1)) THEN
00171 INFO = 8
00172 ELSE IF (INCX.EQ.0) THEN
00173 INFO = 10
00174 ELSE IF (INCY.EQ.0) THEN
00175 INFO = 13
00176 END IF
00177 IF (INFO.NE.0) THEN
00178 CALL XERBLA('CGBMV ',INFO)
00179 RETURN
00180 END IF
00181
00182
00183
00184 IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
00185 + ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
00186
00187 NOCONJ = LSAME(TRANS,'T')
00188
00189
00190
00191
00192 IF (LSAME(TRANS,'N')) THEN
00193 LENX = N
00194 LENY = M
00195 ELSE
00196 LENX = M
00197 LENY = N
00198 END IF
00199 IF (INCX.GT.0) THEN
00200 KX = 1
00201 ELSE
00202 KX = 1 - (LENX-1)*INCX
00203 END IF
00204 IF (INCY.GT.0) THEN
00205 KY = 1
00206 ELSE
00207 KY = 1 - (LENY-1)*INCY
00208 END IF
00209
00210
00211
00212
00213
00214
00215 IF (BETA.NE.ONE) THEN
00216 IF (INCY.EQ.1) THEN
00217 IF (BETA.EQ.ZERO) THEN
00218 DO 10 I = 1,LENY
00219 Y(I) = ZERO
00220 10 CONTINUE
00221 ELSE
00222 DO 20 I = 1,LENY
00223 Y(I) = BETA*Y(I)
00224 20 CONTINUE
00225 END IF
00226 ELSE
00227 IY = KY
00228 IF (BETA.EQ.ZERO) THEN
00229 DO 30 I = 1,LENY
00230 Y(IY) = ZERO
00231 IY = IY + INCY
00232 30 CONTINUE
00233 ELSE
00234 DO 40 I = 1,LENY
00235 Y(IY) = BETA*Y(IY)
00236 IY = IY + INCY
00237 40 CONTINUE
00238 END IF
00239 END IF
00240 END IF
00241 IF (ALPHA.EQ.ZERO) RETURN
00242 KUP1 = KU + 1
00243 IF (LSAME(TRANS,'N')) THEN
00244
00245
00246
00247 JX = KX
00248 IF (INCY.EQ.1) THEN
00249 DO 60 J = 1,N
00250 IF (X(JX).NE.ZERO) THEN
00251 TEMP = ALPHA*X(JX)
00252 K = KUP1 - J
00253 DO 50 I = MAX(1,J-KU),MIN(M,J+KL)
00254 Y(I) = Y(I) + TEMP*A(K+I,J)
00255 50 CONTINUE
00256 END IF
00257 JX = JX + INCX
00258 60 CONTINUE
00259 ELSE
00260 DO 80 J = 1,N
00261 IF (X(JX).NE.ZERO) THEN
00262 TEMP = ALPHA*X(JX)
00263 IY = KY
00264 K = KUP1 - J
00265 DO 70 I = MAX(1,J-KU),MIN(M,J+KL)
00266 Y(IY) = Y(IY) + TEMP*A(K+I,J)
00267 IY = IY + INCY
00268 70 CONTINUE
00269 END IF
00270 JX = JX + INCX
00271 IF (J.GT.KU) KY = KY + INCY
00272 80 CONTINUE
00273 END IF
00274 ELSE
00275
00276
00277
00278 JY = KY
00279 IF (INCX.EQ.1) THEN
00280 DO 110 J = 1,N
00281 TEMP = ZERO
00282 K = KUP1 - J
00283 IF (NOCONJ) THEN
00284 DO 90 I = MAX(1,J-KU),MIN(M,J+KL)
00285 TEMP = TEMP + A(K+I,J)*X(I)
00286 90 CONTINUE
00287 ELSE
00288 DO 100 I = MAX(1,J-KU),MIN(M,J+KL)
00289 TEMP = TEMP + CONJG(A(K+I,J))*X(I)
00290 100 CONTINUE
00291 END IF
00292 Y(JY) = Y(JY) + ALPHA*TEMP
00293 JY = JY + INCY
00294 110 CONTINUE
00295 ELSE
00296 DO 140 J = 1,N
00297 TEMP = ZERO
00298 IX = KX
00299 K = KUP1 - J
00300 IF (NOCONJ) THEN
00301 DO 120 I = MAX(1,J-KU),MIN(M,J+KL)
00302 TEMP = TEMP + A(K+I,J)*X(IX)
00303 IX = IX + INCX
00304 120 CONTINUE
00305 ELSE
00306 DO 130 I = MAX(1,J-KU),MIN(M,J+KL)
00307 TEMP = TEMP + CONJG(A(K+I,J))*X(IX)
00308 IX = IX + INCX
00309 130 CONTINUE
00310 END IF
00311 Y(JY) = Y(JY) + ALPHA*TEMP
00312 JY = JY + INCY
00313 IF (J.GT.KU) KX = KX + INCX
00314 140 CONTINUE
00315 END IF
00316 END IF
00317
00318 RETURN
00319
00320
00321
00322 END