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