3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * SUBROUTINE DGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
13 * .. Scalar Arguments ..
14 * DOUBLE PRECISION ALPHA,BETA
15 * INTEGER INCX,INCY,LDA,M,N
18 * .. Array Arguments ..
19 * DOUBLE PRECISION A(LDA,*),X(*),Y(*)
28 *> DGEMV performs one of the matrix-vector operations
30 *> y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y,
32 *> where alpha and beta are scalars, x and y are vectors and A is an
41 *> TRANS is CHARACTER*1
42 *> On entry, TRANS specifies the operation to be performed as
45 *> TRANS = 'N' or 'n' y := alpha*A*x + beta*y.
47 *> TRANS = 'T' or 't' y := alpha*A**T*x + beta*y.
49 *> TRANS = 'C' or 'c' y := alpha*A**T*x + beta*y.
55 *> On entry, M specifies the number of rows of the matrix A.
56 *> M must be at least zero.
62 *> On entry, N specifies the number of columns of the matrix A.
63 *> N must be at least zero.
68 *> ALPHA is DOUBLE PRECISION.
69 *> On entry, ALPHA specifies the scalar alpha.
74 *> A is DOUBLE PRECISION array of DIMENSION ( LDA, n ).
75 *> Before entry, the leading m by n part of the array A must
76 *> contain the matrix of coefficients.
82 *> On entry, LDA specifies the first dimension of A as declared
83 *> in the calling (sub) program. LDA must be at least
89 *> X is DOUBLE PRECISION array of DIMENSION at least
90 *> ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
92 *> ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
93 *> Before entry, the incremented array X must contain the
100 *> On entry, INCX specifies the increment for the elements of
101 *> X. INCX must not be zero.
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.
113 *> Y is DOUBLE PRECISION array of DIMENSION at least
114 *> ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
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
125 *> On entry, INCY specifies the increment for the elements of
126 *> Y. INCY must not be zero.
132 *> \author Univ. of Tennessee
133 *> \author Univ. of California Berkeley
134 *> \author Univ. of Colorado Denver
137 *> \date November 2015
139 *> \ingroup double_blas_level2
141 *> \par Further Details:
142 * =====================
146 *> Level 2 Blas routine.
147 *> The vector and matrix arguments are not referenced when N = 0, or M = 0
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.
156 * =====================================================================
157 SUBROUTINE DGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
159 * -- Reference BLAS level2 routine (version 3.6.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..--
164 * .. Scalar Arguments ..
165 DOUBLE PRECISION ALPHA,BETA
166 INTEGER INCX,INCY,LDA,M,N
169 * .. Array Arguments ..
170 DOUBLE PRECISION A(LDA,*),X(*),Y(*)
173 * =====================================================================
176 DOUBLE PRECISION ONE,ZERO
177 PARAMETER (ONE=1.0D+0,ZERO=0.0D+0)
179 * .. Local Scalars ..
180 DOUBLE PRECISION TEMP
181 INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY
183 * .. External Functions ..
187 * .. External Subroutines ..
190 * .. Intrinsic Functions ..
194 * Test the input parameters.
197 IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
198 + .NOT.LSAME(TRANS,'C')) THEN
200 ELSE IF (M.LT.0) THEN
202 ELSE IF (N.LT.0) THEN
204 ELSE IF (LDA.LT.MAX(1,M)) THEN
206 ELSE IF (INCX.EQ.0) THEN
208 ELSE IF (INCY.EQ.0) THEN
212 CALL XERBLA('DGEMV ',INFO)
216 * Quick return if possible.
218 IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
219 + ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
221 * Set LENX and LENY, the lengths of the vectors x and y, and set
222 * up the start points in X and Y.
224 IF (LSAME(TRANS,'N')) THEN
234 KX = 1 - (LENX-1)*INCX
239 KY = 1 - (LENY-1)*INCY
242 * Start the operations. In this version the elements of A are
243 * accessed sequentially with one pass through A.
245 * First form y := beta*y.
247 IF (BETA.NE.ONE) THEN
249 IF (BETA.EQ.ZERO) THEN
260 IF (BETA.EQ.ZERO) THEN
273 IF (ALPHA.EQ.ZERO) RETURN
274 IF (LSAME(TRANS,'N')) THEN
276 * Form y := alpha*A*x + y.
283 Y(I) = Y(I) + TEMP*A(I,J)
292 Y(IY) = Y(IY) + TEMP*A(I,J)
300 * Form y := alpha*A**T*x + y.
307 TEMP = TEMP + A(I,J)*X(I)
309 Y(JY) = Y(JY) + ALPHA*TEMP
317 TEMP = TEMP + A(I,J)*X(IX)
320 Y(JY) = Y(JY) + ALPHA*TEMP