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