blob: c6b4b21d65d66a27f3ff0322df46746070a41269 [file] [log] [blame]
Austin Schuh189376f2018-12-20 22:11:15 +11001/* dsbmv.f -- translated by f2c (version 20100827).
2 You must link the resulting object file with libf2c:
3 on Microsoft Windows system, link with libf2c.lib;
4 on Linux or Unix systems, link with .../path/to/libf2c.a -lm
5 or, if you install libf2c.a in a standard place, with -lf2c -lm
6 -- in that order, at the end of the command line, as in
7 cc *.o -lf2c -lm
8 Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
9
10 http://www.netlib.org/f2c/libf2c.zip
11*/
12
13#include "datatypes.h"
14
15/* Subroutine */ int dsbmv_(char *uplo, integer *n, integer *k, doublereal *
16 alpha, doublereal *a, integer *lda, doublereal *x, integer *incx,
17 doublereal *beta, doublereal *y, integer *incy, ftnlen uplo_len)
18{
19 /* System generated locals */
20 integer a_dim1, a_offset, i__1, i__2, i__3, i__4;
21
22 /* Local variables */
23 integer i__, j, l, ix, iy, jx, jy, kx, ky, info;
24 doublereal temp1, temp2;
25 extern logical lsame_(char *, char *, ftnlen, ftnlen);
26 integer kplus1;
27 extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen);
28
29/* .. Scalar Arguments .. */
30/* .. */
31/* .. Array Arguments .. */
32/* .. */
33
34/* Purpose */
35/* ======= */
36
37/* DSBMV performs the matrix-vector operation */
38
39/* y := alpha*A*x + beta*y, */
40
41/* where alpha and beta are scalars, x and y are n element vectors and */
42/* A is an n by n symmetric band matrix, with k super-diagonals. */
43
44/* Arguments */
45/* ========== */
46
47/* UPLO - CHARACTER*1. */
48/* On entry, UPLO specifies whether the upper or lower */
49/* triangular part of the band matrix A is being supplied as */
50/* follows: */
51
52/* UPLO = 'U' or 'u' The upper triangular part of A is */
53/* being supplied. */
54
55/* UPLO = 'L' or 'l' The lower triangular part of A is */
56/* being supplied. */
57
58/* Unchanged on exit. */
59
60/* N - INTEGER. */
61/* On entry, N specifies the order of the matrix A. */
62/* N must be at least zero. */
63/* Unchanged on exit. */
64
65/* K - INTEGER. */
66/* On entry, K specifies the number of super-diagonals of the */
67/* matrix A. K must satisfy 0 .le. K. */
68/* Unchanged on exit. */
69
70/* ALPHA - DOUBLE PRECISION. */
71/* On entry, ALPHA specifies the scalar alpha. */
72/* Unchanged on exit. */
73
74/* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */
75/* Before entry with UPLO = 'U' or 'u', the leading ( k + 1 ) */
76/* by n part of the array A must contain the upper triangular */
77/* band part of the symmetric matrix, supplied column by */
78/* column, with the leading diagonal of the matrix in row */
79/* ( k + 1 ) of the array, the first super-diagonal starting at */
80/* position 2 in row k, and so on. The top left k by k triangle */
81/* of the array A is not referenced. */
82/* The following program segment will transfer the upper */
83/* triangular part of a symmetric band matrix from conventional */
84/* full matrix storage to band storage: */
85
86/* DO 20, J = 1, N */
87/* M = K + 1 - J */
88/* DO 10, I = MAX( 1, J - K ), J */
89/* A( M + I, J ) = matrix( I, J ) */
90/* 10 CONTINUE */
91/* 20 CONTINUE */
92
93/* Before entry with UPLO = 'L' or 'l', the leading ( k + 1 ) */
94/* by n part of the array A must contain the lower triangular */
95/* band part of the symmetric matrix, supplied column by */
96/* column, with the leading diagonal of the matrix in row 1 of */
97/* the array, the first sub-diagonal starting at position 1 in */
98/* row 2, and so on. The bottom right k by k triangle of the */
99/* array A is not referenced. */
100/* The following program segment will transfer the lower */
101/* triangular part of a symmetric band matrix from conventional */
102/* full matrix storage to band storage: */
103
104/* DO 20, J = 1, N */
105/* M = 1 - J */
106/* DO 10, I = J, MIN( N, J + K ) */
107/* A( M + I, J ) = matrix( I, J ) */
108/* 10 CONTINUE */
109/* 20 CONTINUE */
110
111/* Unchanged on exit. */
112
113/* LDA - INTEGER. */
114/* On entry, LDA specifies the first dimension of A as declared */
115/* in the calling (sub) program. LDA must be at least */
116/* ( k + 1 ). */
117/* Unchanged on exit. */
118
119/* X - DOUBLE PRECISION array of DIMENSION at least */
120/* ( 1 + ( n - 1 )*abs( INCX ) ). */
121/* Before entry, the incremented array X must contain the */
122/* vector x. */
123/* Unchanged on exit. */
124
125/* INCX - INTEGER. */
126/* On entry, INCX specifies the increment for the elements of */
127/* X. INCX must not be zero. */
128/* Unchanged on exit. */
129
130/* BETA - DOUBLE PRECISION. */
131/* On entry, BETA specifies the scalar beta. */
132/* Unchanged on exit. */
133
134/* Y - DOUBLE PRECISION array of DIMENSION at least */
135/* ( 1 + ( n - 1 )*abs( INCY ) ). */
136/* Before entry, the incremented array Y must contain the */
137/* vector y. On exit, Y is overwritten by the updated vector y. */
138
139/* INCY - INTEGER. */
140/* On entry, INCY specifies the increment for the elements of */
141/* Y. INCY must not be zero. */
142/* Unchanged on exit. */
143
144
145/* Level 2 Blas routine. */
146
147/* -- Written on 22-October-1986. */
148/* Jack Dongarra, Argonne National Lab. */
149/* Jeremy Du Croz, Nag Central Office. */
150/* Sven Hammarling, Nag Central Office. */
151/* Richard Hanson, Sandia National Labs. */
152
153/* ===================================================================== */
154
155/* .. Parameters .. */
156/* .. */
157/* .. Local Scalars .. */
158/* .. */
159/* .. External Functions .. */
160/* .. */
161/* .. External Subroutines .. */
162/* .. */
163/* .. Intrinsic Functions .. */
164/* .. */
165
166/* Test the input parameters. */
167
168 /* Parameter adjustments */
169 a_dim1 = *lda;
170 a_offset = 1 + a_dim1;
171 a -= a_offset;
172 --x;
173 --y;
174
175 /* Function Body */
176 info = 0;
177 if (! lsame_(uplo, "U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, "L", (
178 ftnlen)1, (ftnlen)1)) {
179 info = 1;
180 } else if (*n < 0) {
181 info = 2;
182 } else if (*k < 0) {
183 info = 3;
184 } else if (*lda < *k + 1) {
185 info = 6;
186 } else if (*incx == 0) {
187 info = 8;
188 } else if (*incy == 0) {
189 info = 11;
190 }
191 if (info != 0) {
192 xerbla_("DSBMV ", &info, (ftnlen)6);
193 return 0;
194 }
195
196/* Quick return if possible. */
197
198 if (*n == 0 || (*alpha == 0. && *beta == 1.)) {
199 return 0;
200 }
201
202/* Set up the start points in X and Y. */
203
204 if (*incx > 0) {
205 kx = 1;
206 } else {
207 kx = 1 - (*n - 1) * *incx;
208 }
209 if (*incy > 0) {
210 ky = 1;
211 } else {
212 ky = 1 - (*n - 1) * *incy;
213 }
214
215/* Start the operations. In this version the elements of the array A */
216/* are accessed sequentially with one pass through A. */
217
218/* First form y := beta*y. */
219
220 if (*beta != 1.) {
221 if (*incy == 1) {
222 if (*beta == 0.) {
223 i__1 = *n;
224 for (i__ = 1; i__ <= i__1; ++i__) {
225 y[i__] = 0.;
226/* L10: */
227 }
228 } else {
229 i__1 = *n;
230 for (i__ = 1; i__ <= i__1; ++i__) {
231 y[i__] = *beta * y[i__];
232/* L20: */
233 }
234 }
235 } else {
236 iy = ky;
237 if (*beta == 0.) {
238 i__1 = *n;
239 for (i__ = 1; i__ <= i__1; ++i__) {
240 y[iy] = 0.;
241 iy += *incy;
242/* L30: */
243 }
244 } else {
245 i__1 = *n;
246 for (i__ = 1; i__ <= i__1; ++i__) {
247 y[iy] = *beta * y[iy];
248 iy += *incy;
249/* L40: */
250 }
251 }
252 }
253 }
254 if (*alpha == 0.) {
255 return 0;
256 }
257 if (lsame_(uplo, "U", (ftnlen)1, (ftnlen)1)) {
258
259/* Form y when upper triangle of A is stored. */
260
261 kplus1 = *k + 1;
262 if (*incx == 1 && *incy == 1) {
263 i__1 = *n;
264 for (j = 1; j <= i__1; ++j) {
265 temp1 = *alpha * x[j];
266 temp2 = 0.;
267 l = kplus1 - j;
268/* Computing MAX */
269 i__2 = 1, i__3 = j - *k;
270 i__4 = j - 1;
271 for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) {
272 y[i__] += temp1 * a[l + i__ + j * a_dim1];
273 temp2 += a[l + i__ + j * a_dim1] * x[i__];
274/* L50: */
275 }
276 y[j] = y[j] + temp1 * a[kplus1 + j * a_dim1] + *alpha * temp2;
277/* L60: */
278 }
279 } else {
280 jx = kx;
281 jy = ky;
282 i__1 = *n;
283 for (j = 1; j <= i__1; ++j) {
284 temp1 = *alpha * x[jx];
285 temp2 = 0.;
286 ix = kx;
287 iy = ky;
288 l = kplus1 - j;
289/* Computing MAX */
290 i__4 = 1, i__2 = j - *k;
291 i__3 = j - 1;
292 for (i__ = max(i__4,i__2); i__ <= i__3; ++i__) {
293 y[iy] += temp1 * a[l + i__ + j * a_dim1];
294 temp2 += a[l + i__ + j * a_dim1] * x[ix];
295 ix += *incx;
296 iy += *incy;
297/* L70: */
298 }
299 y[jy] = y[jy] + temp1 * a[kplus1 + j * a_dim1] + *alpha *
300 temp2;
301 jx += *incx;
302 jy += *incy;
303 if (j > *k) {
304 kx += *incx;
305 ky += *incy;
306 }
307/* L80: */
308 }
309 }
310 } else {
311
312/* Form y when lower triangle of A is stored. */
313
314 if (*incx == 1 && *incy == 1) {
315 i__1 = *n;
316 for (j = 1; j <= i__1; ++j) {
317 temp1 = *alpha * x[j];
318 temp2 = 0.;
319 y[j] += temp1 * a[j * a_dim1 + 1];
320 l = 1 - j;
321/* Computing MIN */
322 i__4 = *n, i__2 = j + *k;
323 i__3 = min(i__4,i__2);
324 for (i__ = j + 1; i__ <= i__3; ++i__) {
325 y[i__] += temp1 * a[l + i__ + j * a_dim1];
326 temp2 += a[l + i__ + j * a_dim1] * x[i__];
327/* L90: */
328 }
329 y[j] += *alpha * temp2;
330/* L100: */
331 }
332 } else {
333 jx = kx;
334 jy = ky;
335 i__1 = *n;
336 for (j = 1; j <= i__1; ++j) {
337 temp1 = *alpha * x[jx];
338 temp2 = 0.;
339 y[jy] += temp1 * a[j * a_dim1 + 1];
340 l = 1 - j;
341 ix = jx;
342 iy = jy;
343/* Computing MIN */
344 i__4 = *n, i__2 = j + *k;
345 i__3 = min(i__4,i__2);
346 for (i__ = j + 1; i__ <= i__3; ++i__) {
347 ix += *incx;
348 iy += *incy;
349 y[iy] += temp1 * a[l + i__ + j * a_dim1];
350 temp2 += a[l + i__ + j * a_dim1] * x[ix];
351/* L110: */
352 }
353 y[jy] += *alpha * temp2;
354 jx += *incx;
355 jy += *incy;
356/* L120: */
357 }
358 }
359 }
360
361 return 0;
362
363/* End of DSBMV . */
364
365} /* dsbmv_ */
366