00001 SUBROUTINE ZGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
00002
00003 DOUBLE COMPLEX ALPHA,BETA
00004 INTEGER INCX,INCY,LDA,M,N
00005 CHARACTER TRANS
00006
00007
00008 DOUBLE 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 DOUBLE COMPLEX ONE
00109 PARAMETER (ONE= (1.0D+0,0.0D+0))
00110 DOUBLE COMPLEX ZERO
00111 PARAMETER (ZERO= (0.0D+0,0.0D+0))
00112
00113
00114 DOUBLE COMPLEX TEMP
00115 INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY
00116 LOGICAL NOCONJ
00117
00118
00119 LOGICAL LSAME
00120 EXTERNAL LSAME
00121
00122
00123 EXTERNAL XERBLA
00124
00125
00126 INTRINSIC DCONJG,MAX
00127
00128
00129
00130
00131 INFO = 0
00132 IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
00133 + .NOT.LSAME(TRANS,'C')) THEN
00134 INFO = 1
00135 ELSE IF (M.LT.0) THEN
00136 INFO = 2
00137 ELSE IF (N.LT.0) THEN
00138 INFO = 3
00139 ELSE IF (LDA.LT.MAX(1,M)) THEN
00140 INFO = 6
00141 ELSE IF (INCX.EQ.0) THEN
00142 INFO = 8
00143 ELSE IF (INCY.EQ.0) THEN
00144 INFO = 11
00145 END IF
00146 IF (INFO.NE.0) THEN
00147 CALL XERBLA('ZGEMV ',INFO)
00148 RETURN
00149 END IF
00150
00151
00152
00153 IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
00154 + ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
00155
00156 NOCONJ = LSAME(TRANS,'T')
00157
00158
00159
00160
00161 IF (LSAME(TRANS,'N')) THEN
00162 LENX = N
00163 LENY = M
00164 ELSE
00165 LENX = M
00166 LENY = N
00167 END IF
00168 IF (INCX.GT.0) THEN
00169 KX = 1
00170 ELSE
00171 KX = 1 - (LENX-1)*INCX
00172 END IF
00173 IF (INCY.GT.0) THEN
00174 KY = 1
00175 ELSE
00176 KY = 1 - (LENY-1)*INCY
00177 END IF
00178
00179
00180
00181
00182
00183
00184 IF (BETA.NE.ONE) THEN
00185 IF (INCY.EQ.1) THEN
00186 IF (BETA.EQ.ZERO) THEN
00187 DO 10 I = 1,LENY
00188 Y(I) = ZERO
00189 10 CONTINUE
00190 ELSE
00191 DO 20 I = 1,LENY
00192 Y(I) = BETA*Y(I)
00193 20 CONTINUE
00194 END IF
00195 ELSE
00196 IY = KY
00197 IF (BETA.EQ.ZERO) THEN
00198 DO 30 I = 1,LENY
00199 Y(IY) = ZERO
00200 IY = IY + INCY
00201 30 CONTINUE
00202 ELSE
00203 DO 40 I = 1,LENY
00204 Y(IY) = BETA*Y(IY)
00205 IY = IY + INCY
00206 40 CONTINUE
00207 END IF
00208 END IF
00209 END IF
00210 IF (ALPHA.EQ.ZERO) RETURN
00211 IF (LSAME(TRANS,'N')) THEN
00212
00213
00214
00215 JX = KX
00216 IF (INCY.EQ.1) THEN
00217 DO 60 J = 1,N
00218 IF (X(JX).NE.ZERO) THEN
00219 TEMP = ALPHA*X(JX)
00220 DO 50 I = 1,M
00221 Y(I) = Y(I) + TEMP*A(I,J)
00222 50 CONTINUE
00223 END IF
00224 JX = JX + INCX
00225 60 CONTINUE
00226 ELSE
00227 DO 80 J = 1,N
00228 IF (X(JX).NE.ZERO) THEN
00229 TEMP = ALPHA*X(JX)
00230 IY = KY
00231 DO 70 I = 1,M
00232 Y(IY) = Y(IY) + TEMP*A(I,J)
00233 IY = IY + INCY
00234 70 CONTINUE
00235 END IF
00236 JX = JX + INCX
00237 80 CONTINUE
00238 END IF
00239 ELSE
00240
00241
00242
00243 JY = KY
00244 IF (INCX.EQ.1) THEN
00245 DO 110 J = 1,N
00246 TEMP = ZERO
00247 IF (NOCONJ) THEN
00248 DO 90 I = 1,M
00249 TEMP = TEMP + A(I,J)*X(I)
00250 90 CONTINUE
00251 ELSE
00252 DO 100 I = 1,M
00253 TEMP = TEMP + DCONJG(A(I,J))*X(I)
00254 100 CONTINUE
00255 END IF
00256 Y(JY) = Y(JY) + ALPHA*TEMP
00257 JY = JY + INCY
00258 110 CONTINUE
00259 ELSE
00260 DO 140 J = 1,N
00261 TEMP = ZERO
00262 IX = KX
00263 IF (NOCONJ) THEN
00264 DO 120 I = 1,M
00265 TEMP = TEMP + A(I,J)*X(IX)
00266 IX = IX + INCX
00267 120 CONTINUE
00268 ELSE
00269 DO 130 I = 1,M
00270 TEMP = TEMP + DCONJG(A(I,J))*X(IX)
00271 IX = IX + INCX
00272 130 CONTINUE
00273 END IF
00274 Y(JY) = Y(JY) + ALPHA*TEMP
00275 JY = JY + INCY
00276 140 CONTINUE
00277 END IF
00278 END IF
00279
00280 RETURN
00281
00282
00283
00284 END