LAPACK 3.12.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
dgbmv.f
Go to the documentation of this file.
1*> \brief \b DGBMV
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 DGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
12*
13* .. Scalar Arguments ..
14* DOUBLE PRECISION ALPHA,BETA
15* INTEGER INCX,INCY,KL,KU,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*> DGBMV 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 band matrix, with kl sub-diagonals and ku super-diagonals.
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] KL
67*> \verbatim
68*> KL is INTEGER
69*> On entry, KL specifies the number of sub-diagonals of the
70*> matrix A. KL must satisfy 0 .le. KL.
71*> \endverbatim
72*>
73*> \param[in] KU
74*> \verbatim
75*> KU is INTEGER
76*> On entry, KU specifies the number of super-diagonals of the
77*> matrix A. KU must satisfy 0 .le. KU.
78*> \endverbatim
79*>
80*> \param[in] ALPHA
81*> \verbatim
82*> ALPHA is DOUBLE PRECISION.
83*> On entry, ALPHA specifies the scalar alpha.
84*> \endverbatim
85*>
86*> \param[in] A
87*> \verbatim
88*> A is DOUBLE PRECISION array, dimension ( LDA, N )
89*> Before entry, the leading ( kl + ku + 1 ) by n part of the
90*> array A must contain the matrix of coefficients, supplied
91*> column by column, with the leading diagonal of the matrix in
92*> row ( ku + 1 ) of the array, the first super-diagonal
93*> starting at position 2 in row ku, the first sub-diagonal
94*> starting at position 1 in row ( ku + 2 ), and so on.
95*> Elements in the array A that do not correspond to elements
96*> in the band matrix (such as the top left ku by ku triangle)
97*> are not referenced.
98*> The following program segment will transfer a band matrix
99*> from conventional full matrix storage to band storage:
100*>
101*> DO 20, J = 1, N
102*> K = KU + 1 - J
103*> DO 10, I = MAX( 1, J - KU ), MIN( M, J + KL )
104*> A( K + I, J ) = matrix( I, J )
105*> 10 CONTINUE
106*> 20 CONTINUE
107*> \endverbatim
108*>
109*> \param[in] LDA
110*> \verbatim
111*> LDA is INTEGER
112*> On entry, LDA specifies the first dimension of A as declared
113*> in the calling (sub) program. LDA must be at least
114*> ( kl + ku + 1 ).
115*> \endverbatim
116*>
117*> \param[in] X
118*> \verbatim
119*> X is DOUBLE PRECISION array, dimension at least
120*> ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
121*> and at least
122*> ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
123*> Before entry, the incremented array X must contain the
124*> vector x.
125*> \endverbatim
126*>
127*> \param[in] INCX
128*> \verbatim
129*> INCX is INTEGER
130*> On entry, INCX specifies the increment for the elements of
131*> X. INCX must not be zero.
132*> \endverbatim
133*>
134*> \param[in] BETA
135*> \verbatim
136*> BETA is DOUBLE PRECISION.
137*> On entry, BETA specifies the scalar beta. When BETA is
138*> supplied as zero then Y need not be set on input.
139*> \endverbatim
140*>
141*> \param[in,out] Y
142*> \verbatim
143*> Y is DOUBLE PRECISION array, dimension at least
144*> ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
145*> and at least
146*> ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
147*> Before entry, the incremented array Y must contain the
148*> vector y. On exit, Y is overwritten by the updated vector y.
149*> If either m or n is zero, then Y not referenced and the function
150*> performs a quick return.
151*> \endverbatim
152*>
153*> \param[in] INCY
154*> \verbatim
155*> INCY is INTEGER
156*> On entry, INCY specifies the increment for the elements of
157*> Y. INCY must not be zero.
158*> \endverbatim
159*
160* Authors:
161* ========
162*
163*> \author Univ. of Tennessee
164*> \author Univ. of California Berkeley
165*> \author Univ. of Colorado Denver
166*> \author NAG Ltd.
167*
168*> \ingroup gbmv
169*
170*> \par Further Details:
171* =====================
172*>
173*> \verbatim
174*>
175*> Level 2 Blas routine.
176*> The vector and matrix arguments are not referenced when N = 0, or M = 0
177*>
178*> -- Written on 22-October-1986.
179*> Jack Dongarra, Argonne National Lab.
180*> Jeremy Du Croz, Nag Central Office.
181*> Sven Hammarling, Nag Central Office.
182*> Richard Hanson, Sandia National Labs.
183*> \endverbatim
184*>
185* =====================================================================
186 SUBROUTINE dgbmv(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX,
187 + BETA,Y,INCY)
188*
189* -- Reference BLAS level2 routine --
190* -- Reference BLAS is a software package provided by Univ. of Tennessee, --
191* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
192*
193* .. Scalar Arguments ..
194 DOUBLE PRECISION ALPHA,BETA
195 INTEGER INCX,INCY,KL,KU,LDA,M,N
196 CHARACTER TRANS
197* ..
198* .. Array Arguments ..
199 DOUBLE PRECISION A(LDA,*),X(*),Y(*)
200* ..
201*
202* =====================================================================
203*
204* .. Parameters ..
205 DOUBLE PRECISION ONE,ZERO
206 parameter(one=1.0d+0,zero=0.0d+0)
207* ..
208* .. Local Scalars ..
209 DOUBLE PRECISION TEMP
210 INTEGER I,INFO,IX,IY,J,JX,JY,K,KUP1,KX,KY,LENX,LENY
211* ..
212* .. External Functions ..
213 LOGICAL LSAME
214 EXTERNAL lsame
215* ..
216* .. External Subroutines ..
217 EXTERNAL xerbla
218* ..
219* .. Intrinsic Functions ..
220 INTRINSIC max,min
221* ..
222*
223* Test the input parameters.
224*
225 info = 0
226 IF (.NOT.lsame(trans,'N') .AND. .NOT.lsame(trans,'T') .AND.
227 + .NOT.lsame(trans,'C')) THEN
228 info = 1
229 ELSE IF (m.LT.0) THEN
230 info = 2
231 ELSE IF (n.LT.0) THEN
232 info = 3
233 ELSE IF (kl.LT.0) THEN
234 info = 4
235 ELSE IF (ku.LT.0) THEN
236 info = 5
237 ELSE IF (lda.LT. (kl+ku+1)) THEN
238 info = 8
239 ELSE IF (incx.EQ.0) THEN
240 info = 10
241 ELSE IF (incy.EQ.0) THEN
242 info = 13
243 END IF
244 IF (info.NE.0) THEN
245 CALL xerbla('DGBMV ',info)
246 RETURN
247 END IF
248*
249* Quick return if possible.
250*
251 IF ((m.EQ.0) .OR. (n.EQ.0) .OR.
252 + ((alpha.EQ.zero).AND. (beta.EQ.one))) RETURN
253*
254* Set LENX and LENY, the lengths of the vectors x and y, and set
255* up the start points in X and Y.
256*
257 IF (lsame(trans,'N')) THEN
258 lenx = n
259 leny = m
260 ELSE
261 lenx = m
262 leny = n
263 END IF
264 IF (incx.GT.0) THEN
265 kx = 1
266 ELSE
267 kx = 1 - (lenx-1)*incx
268 END IF
269 IF (incy.GT.0) THEN
270 ky = 1
271 ELSE
272 ky = 1 - (leny-1)*incy
273 END IF
274*
275* Start the operations. In this version the elements of A are
276* accessed sequentially with one pass through the band part of A.
277*
278* First form y := beta*y.
279*
280 IF (beta.NE.one) THEN
281 IF (incy.EQ.1) THEN
282 IF (beta.EQ.zero) THEN
283 DO 10 i = 1,leny
284 y(i) = zero
285 10 CONTINUE
286 ELSE
287 DO 20 i = 1,leny
288 y(i) = beta*y(i)
289 20 CONTINUE
290 END IF
291 ELSE
292 iy = ky
293 IF (beta.EQ.zero) THEN
294 DO 30 i = 1,leny
295 y(iy) = zero
296 iy = iy + incy
297 30 CONTINUE
298 ELSE
299 DO 40 i = 1,leny
300 y(iy) = beta*y(iy)
301 iy = iy + incy
302 40 CONTINUE
303 END IF
304 END IF
305 END IF
306 IF (alpha.EQ.zero) RETURN
307 kup1 = ku + 1
308 IF (lsame(trans,'N')) THEN
309*
310* Form y := alpha*A*x + y.
311*
312 jx = kx
313 IF (incy.EQ.1) THEN
314 DO 60 j = 1,n
315 temp = alpha*x(jx)
316 k = kup1 - j
317 DO 50 i = max(1,j-ku),min(m,j+kl)
318 y(i) = y(i) + temp*a(k+i,j)
319 50 CONTINUE
320 jx = jx + incx
321 60 CONTINUE
322 ELSE
323 DO 80 j = 1,n
324 temp = alpha*x(jx)
325 iy = ky
326 k = kup1 - j
327 DO 70 i = max(1,j-ku),min(m,j+kl)
328 y(iy) = y(iy) + temp*a(k+i,j)
329 iy = iy + incy
330 70 CONTINUE
331 jx = jx + incx
332 IF (j.GT.ku) ky = ky + incy
333 80 CONTINUE
334 END IF
335 ELSE
336*
337* Form y := alpha*A**T*x + y.
338*
339 jy = ky
340 IF (incx.EQ.1) THEN
341 DO 100 j = 1,n
342 temp = zero
343 k = kup1 - j
344 DO 90 i = max(1,j-ku),min(m,j+kl)
345 temp = temp + a(k+i,j)*x(i)
346 90 CONTINUE
347 y(jy) = y(jy) + alpha*temp
348 jy = jy + incy
349 100 CONTINUE
350 ELSE
351 DO 120 j = 1,n
352 temp = zero
353 ix = kx
354 k = kup1 - j
355 DO 110 i = max(1,j-ku),min(m,j+kl)
356 temp = temp + a(k+i,j)*x(ix)
357 ix = ix + incx
358 110 CONTINUE
359 y(jy) = y(jy) + alpha*temp
360 jy = jy + incy
361 IF (j.GT.ku) kx = kx + incx
362 120 CONTINUE
363 END IF
364 END IF
365*
366 RETURN
367*
368* End of DGBMV
369*
370 END
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine dgbmv(trans, m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy)
DGBMV
Definition dgbmv.f:188