1 SUBROUTINE DSBMV
( UPLO
, N
, K
, ALPHA
, A
, LDA
, X
, INCX
,
3 * .. Scalar Arguments
..
4 DOUBLE PRECISION ALPHA
, BETA
5 INTEGER INCX
, INCY
, K
, LDA
, N
7 * .. Array Arguments
..
8 DOUBLE PRECISION A
( LDA
, * ), X
( * ), Y
( * )
14 * DSBMV performs the matrix
-vector operation
16 * y
:= alpha*A*x
+ beta*y
,
18 * where alpha and beta are scalars
, x and y are n element vectors and
19 * A is an n by n symmetric band matrix
, with k super
-diagonals
.
25 * On entry
, UPLO specifies whether the upper or lower
26 * triangular part of the band matrix A is being supplied as
29 * UPLO
= 'U' or
'u' The upper triangular part of A is
32 * UPLO
= 'L' or
'l' The lower triangular part of A is
38 * On entry
, N specifies the order of the matrix A
.
39 * N must be at least zero
.
43 * On entry
, K specifies the number of super
-diagonals of the
44 * matrix A
. K must satisfy
0 .le
. K
.
47 * ALPHA
- DOUBLE PRECISION.
48 * On entry
, ALPHA specifies the scalar alpha
.
51 * A
- DOUBLE PRECISION array of
DIMENSION ( LDA
, n
).
52 * Before entry with UPLO
= 'U' or
'u', the leading
( k
+ 1 )
53 * by n part of the array A must contain the upper triangular
54 * band part of the symmetric matrix
, supplied column by
55 * column
, with the leading diagonal of the matrix in row
56 * ( k
+ 1 ) of the array
, the first super
-diagonal starting at
57 * position
2 in row k
, and so on
. The top left k by k triangle
58 * of the array A is not referenced
.
59 * The following
program segment will transfer the upper
60 * triangular part of a symmetric band matrix from conventional
61 * full matrix storage
to band storage
:
65 * DO 10, I
= MAX
( 1, J
- K
), J
66 * A
( M
+ I
, J
) = matrix
( I
, J
)
70 * Before entry with UPLO
= 'L' or
'l', the leading
( k
+ 1 )
71 * by n part of the array A must contain the lower triangular
72 * band part of the symmetric matrix
, supplied column by
73 * column
, with the leading diagonal of the matrix in row
1 of
74 * the array
, the first sub
-diagonal starting at position
1 in
75 * row
2, and so on
. The bottom right k by k triangle of the
76 * array A is not referenced
.
77 * The following
program segment will transfer the lower
78 * triangular part of a symmetric band matrix from conventional
79 * full matrix storage
to band storage
:
83 * DO 10, I
= J
, MIN
( N
, J
+ K
)
84 * A
( M
+ I
, J
) = matrix
( I
, J
)
91 * On entry
, LDA specifies the first
dimension of A as declared
92 * in the calling
(sub
) program. LDA must be at least
96 * X
- DOUBLE PRECISION array of
DIMENSION at least
97 * ( 1 + ( n
- 1 )*abs
( INCX
) ).
98 * Before entry
, the incremented array X must contain the
103 * On entry
, INCX specifies the increment
for the elements of
104 * X
. INCX must not be zero
.
107 * BETA
- DOUBLE PRECISION.
108 * On entry
, BETA specifies the scalar beta
.
111 * Y
- DOUBLE PRECISION array of
DIMENSION at least
112 * ( 1 + ( n
- 1 )*abs
( INCY
) ).
113 * Before entry
, the incremented array Y must contain the
114 * vector y
. On exit
, Y is overwritten by the updated vector y
.
117 * On entry
, INCY specifies the increment
for the elements of
118 * Y
. INCY must not be zero
.
122 * Level
2 Blas routine
.
124 * -- Written on
22-October
-1986.
125 * Jack Dongarra
, Argonne National Lab
.
126 * Jeremy Du Croz
, Nag Central Office
.
127 * Sven Hammarling
, Nag Central Office
.
128 * Richard Hanson
, Sandia National Labs
.
132 DOUBLE PRECISION ONE
, ZERO
133 PARAMETER ( ONE
= 1.0D
+0, ZERO
= 0.0D
+0 )
134 * .. Local Scalars
..
135 DOUBLE PRECISION TEMP1
, TEMP2
136 INTEGER I
, INFO
, IX
, IY
, J
, JX
, JY
, KPLUS1
, KX
, KY
, L
137 * .. External Functions
..
140 * .. External Subroutines
..
142 * .. Intrinsic Functions
..
145 * .. Executable Statements
..
147 * Test the input parameters
.
150 IF ( .NOT
.LSAME
( UPLO
, 'U' ).AND
.
151 $
.NOT
.LSAME
( UPLO
, 'L' ) )THEN
153 ELSE IF( N
.LT
.0 )THEN
155 ELSE IF( K
.LT
.0 )THEN
157 ELSE IF( LDA
.LT
.( K
+ 1 ) )THEN
159 ELSE IF( INCX
.EQ
.0 )THEN
161 ELSE IF( INCY
.EQ
.0 )THEN
165 CALL XERBLA
( 'DSBMV ', INFO
)
169 * Quick
return if possible
.
171 IF( ( N
.EQ
.0 ).OR
.( ( ALPHA
.EQ
.ZERO
).AND
.( BETA
.EQ
.ONE
) ) )
174 * Set up the start points in X and Y
.
179 KX
= 1 - ( N
- 1 )*INCX
184 KY
= 1 - ( N
- 1 )*INCY
187 * Start the operations
. In this version the elements of the array A
188 * are accessed sequentially with one pass through A
.
190 * First form y
:= beta*y
.
192 IF( BETA
.NE
.ONE
)THEN
194 IF( BETA
.EQ
.ZERO
)THEN
205 IF( BETA
.EQ
.ZERO
)THEN
212 Y
( IY
) = BETA*Y
( IY
)
220 IF( LSAME
( UPLO
, 'U' ) )THEN
222 * Form y when upper triangle of A is stored
.
225 IF( ( INCX
.EQ
.1 ).AND
.( INCY
.EQ
.1 ) )THEN
230 DO 50, I
= MAX
( 1, J
- K
), J
- 1
231 Y
( I
) = Y
( I
) + TEMP1*A
( L
+ I
, J
)
232 TEMP2
= TEMP2
+ A
( L
+ I
, J
)*X
( I
)
234 Y
( J
) = Y
( J
) + TEMP1*A
( KPLUS1
, J
) + ALPHA*TEMP2
240 TEMP1
= ALPHA*X
( JX
)
245 DO 70, I
= MAX
( 1, J
- K
), J
- 1
246 Y
( IY
) = Y
( IY
) + TEMP1*A
( L
+ I
, J
)
247 TEMP2
= TEMP2
+ A
( L
+ I
, J
)*X
( IX
)
251 Y
( JY
) = Y
( JY
) + TEMP1*A
( KPLUS1
, J
) + ALPHA*TEMP2
262 * Form y when lower triangle of A is stored
.
264 IF( ( INCX
.EQ
.1 ).AND
.( INCY
.EQ
.1 ) )THEN
268 Y
( J
) = Y
( J
) + TEMP1*A
( 1, J
)
270 DO 90, I
= J
+ 1, MIN
( N
, J
+ K
)
271 Y
( I
) = Y
( I
) + TEMP1*A
( L
+ I
, J
)
272 TEMP2
= TEMP2
+ A
( L
+ I
, J
)*X
( I
)
274 Y
( J
) = Y
( J
) + ALPHA*TEMP2
280 TEMP1
= ALPHA*X
( JX
)
282 Y
( JY
) = Y
( JY
) + TEMP1*A
( 1, J
)
286 DO 110, I
= J
+ 1, MIN
( N
, J
+ K
)
289 Y
( IY
) = Y
( IY
) + TEMP1*A
( L
+ I
, J
)
290 TEMP2
= TEMP2
+ A
( L
+ I
, J
)*X
( IX
)
292 Y
( JY
) = Y
( JY
) + ALPHA*TEMP2