Annotation of rpl/lapack/blas/zgemv.f, revision 1.6
1.1 bertrand 1: SUBROUTINE ZGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
2: * .. Scalar Arguments ..
3: DOUBLE COMPLEX ALPHA,BETA
4: INTEGER INCX,INCY,LDA,M,N
5: CHARACTER TRANS
6: * ..
7: * .. Array Arguments ..
8: DOUBLE COMPLEX A(LDA,*),X(*),Y(*)
9: * ..
10: *
11: * Purpose
12: * =======
13: *
14: * ZGEMV performs one of the matrix-vector operations
15: *
16: * y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, or
17: *
18: * y := alpha*conjg( A' )*x + beta*y,
19: *
20: * where alpha and beta are scalars, x and y are vectors and A is an
21: * m by n matrix.
22: *
23: * Arguments
24: * ==========
25: *
26: * TRANS - CHARACTER*1.
27: * On entry, TRANS specifies the operation to be performed as
28: * follows:
29: *
30: * TRANS = 'N' or 'n' y := alpha*A*x + beta*y.
31: *
32: * TRANS = 'T' or 't' y := alpha*A'*x + beta*y.
33: *
34: * TRANS = 'C' or 'c' y := alpha*conjg( A' )*x + beta*y.
35: *
36: * Unchanged on exit.
37: *
38: * M - INTEGER.
39: * On entry, M specifies the number of rows of the matrix A.
40: * M must be at least zero.
41: * Unchanged on exit.
42: *
43: * N - INTEGER.
44: * On entry, N specifies the number of columns of the matrix A.
45: * N must be at least zero.
46: * Unchanged on exit.
47: *
48: * ALPHA - COMPLEX*16 .
49: * On entry, ALPHA specifies the scalar alpha.
50: * Unchanged on exit.
51: *
52: * A - COMPLEX*16 array of DIMENSION ( LDA, n ).
53: * Before entry, the leading m by n part of the array A must
54: * contain the matrix of coefficients.
55: * Unchanged on exit.
56: *
57: * LDA - INTEGER.
58: * On entry, LDA specifies the first dimension of A as declared
59: * in the calling (sub) program. LDA must be at least
60: * max( 1, m ).
61: * Unchanged on exit.
62: *
63: * X - COMPLEX*16 array of DIMENSION at least
64: * ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
65: * and at least
66: * ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
67: * Before entry, the incremented array X must contain the
68: * vector x.
69: * Unchanged on exit.
70: *
71: * INCX - INTEGER.
72: * On entry, INCX specifies the increment for the elements of
73: * X. INCX must not be zero.
74: * Unchanged on exit.
75: *
76: * BETA - COMPLEX*16 .
77: * On entry, BETA specifies the scalar beta. When BETA is
78: * supplied as zero then Y need not be set on input.
79: * Unchanged on exit.
80: *
81: * Y - COMPLEX*16 array of DIMENSION at least
82: * ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
83: * and at least
84: * ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
85: * Before entry with BETA non-zero, the incremented array Y
86: * must contain the vector y. On exit, Y is overwritten by the
87: * updated vector y.
88: *
89: * INCY - INTEGER.
90: * On entry, INCY specifies the increment for the elements of
91: * Y. INCY must not be zero.
92: * Unchanged on exit.
93: *
94: * Further Details
95: * ===============
96: *
97: * Level 2 Blas routine.
98: *
99: * -- Written on 22-October-1986.
100: * Jack Dongarra, Argonne National Lab.
101: * Jeremy Du Croz, Nag Central Office.
102: * Sven Hammarling, Nag Central Office.
103: * Richard Hanson, Sandia National Labs.
104: *
105: * =====================================================================
106: *
107: * .. Parameters ..
108: DOUBLE COMPLEX ONE
109: PARAMETER (ONE= (1.0D+0,0.0D+0))
110: DOUBLE COMPLEX ZERO
111: PARAMETER (ZERO= (0.0D+0,0.0D+0))
112: * ..
113: * .. Local Scalars ..
114: DOUBLE COMPLEX TEMP
115: INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY
116: LOGICAL NOCONJ
117: * ..
118: * .. External Functions ..
119: LOGICAL LSAME
120: EXTERNAL LSAME
121: * ..
122: * .. External Subroutines ..
123: EXTERNAL XERBLA
124: * ..
125: * .. Intrinsic Functions ..
126: INTRINSIC DCONJG,MAX
127: * ..
128: *
129: * Test the input parameters.
130: *
131: INFO = 0
132: IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
133: + .NOT.LSAME(TRANS,'C')) THEN
134: INFO = 1
135: ELSE IF (M.LT.0) THEN
136: INFO = 2
137: ELSE IF (N.LT.0) THEN
138: INFO = 3
139: ELSE IF (LDA.LT.MAX(1,M)) THEN
140: INFO = 6
141: ELSE IF (INCX.EQ.0) THEN
142: INFO = 8
143: ELSE IF (INCY.EQ.0) THEN
144: INFO = 11
145: END IF
146: IF (INFO.NE.0) THEN
147: CALL XERBLA('ZGEMV ',INFO)
148: RETURN
149: END IF
150: *
151: * Quick return if possible.
152: *
153: IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
154: + ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
155: *
156: NOCONJ = LSAME(TRANS,'T')
157: *
158: * Set LENX and LENY, the lengths of the vectors x and y, and set
159: * up the start points in X and Y.
160: *
161: IF (LSAME(TRANS,'N')) THEN
162: LENX = N
163: LENY = M
164: ELSE
165: LENX = M
166: LENY = N
167: END IF
168: IF (INCX.GT.0) THEN
169: KX = 1
170: ELSE
171: KX = 1 - (LENX-1)*INCX
172: END IF
173: IF (INCY.GT.0) THEN
174: KY = 1
175: ELSE
176: KY = 1 - (LENY-1)*INCY
177: END IF
178: *
179: * Start the operations. In this version the elements of A are
180: * accessed sequentially with one pass through A.
181: *
182: * First form y := beta*y.
183: *
184: IF (BETA.NE.ONE) THEN
185: IF (INCY.EQ.1) THEN
186: IF (BETA.EQ.ZERO) THEN
187: DO 10 I = 1,LENY
188: Y(I) = ZERO
189: 10 CONTINUE
190: ELSE
191: DO 20 I = 1,LENY
192: Y(I) = BETA*Y(I)
193: 20 CONTINUE
194: END IF
195: ELSE
196: IY = KY
197: IF (BETA.EQ.ZERO) THEN
198: DO 30 I = 1,LENY
199: Y(IY) = ZERO
200: IY = IY + INCY
201: 30 CONTINUE
202: ELSE
203: DO 40 I = 1,LENY
204: Y(IY) = BETA*Y(IY)
205: IY = IY + INCY
206: 40 CONTINUE
207: END IF
208: END IF
209: END IF
210: IF (ALPHA.EQ.ZERO) RETURN
211: IF (LSAME(TRANS,'N')) THEN
212: *
213: * Form y := alpha*A*x + y.
214: *
215: JX = KX
216: IF (INCY.EQ.1) THEN
217: DO 60 J = 1,N
218: IF (X(JX).NE.ZERO) THEN
219: TEMP = ALPHA*X(JX)
220: DO 50 I = 1,M
221: Y(I) = Y(I) + TEMP*A(I,J)
222: 50 CONTINUE
223: END IF
224: JX = JX + INCX
225: 60 CONTINUE
226: ELSE
227: DO 80 J = 1,N
228: IF (X(JX).NE.ZERO) THEN
229: TEMP = ALPHA*X(JX)
230: IY = KY
231: DO 70 I = 1,M
232: Y(IY) = Y(IY) + TEMP*A(I,J)
233: IY = IY + INCY
234: 70 CONTINUE
235: END IF
236: JX = JX + INCX
237: 80 CONTINUE
238: END IF
239: ELSE
240: *
241: * Form y := alpha*A'*x + y or y := alpha*conjg( A' )*x + y.
242: *
243: JY = KY
244: IF (INCX.EQ.1) THEN
245: DO 110 J = 1,N
246: TEMP = ZERO
247: IF (NOCONJ) THEN
248: DO 90 I = 1,M
249: TEMP = TEMP + A(I,J)*X(I)
250: 90 CONTINUE
251: ELSE
252: DO 100 I = 1,M
253: TEMP = TEMP + DCONJG(A(I,J))*X(I)
254: 100 CONTINUE
255: END IF
256: Y(JY) = Y(JY) + ALPHA*TEMP
257: JY = JY + INCY
258: 110 CONTINUE
259: ELSE
260: DO 140 J = 1,N
261: TEMP = ZERO
262: IX = KX
263: IF (NOCONJ) THEN
264: DO 120 I = 1,M
265: TEMP = TEMP + A(I,J)*X(IX)
266: IX = IX + INCX
267: 120 CONTINUE
268: ELSE
269: DO 130 I = 1,M
270: TEMP = TEMP + DCONJG(A(I,J))*X(IX)
271: IX = IX + INCX
272: 130 CONTINUE
273: END IF
274: Y(JY) = Y(JY) + ALPHA*TEMP
275: JY = JY + INCY
276: 140 CONTINUE
277: END IF
278: END IF
279: *
280: RETURN
281: *
282: * End of ZGEMV .
283: *
284: END
CVSweb interface <joel.bertrand@systella.fr>