blob: 8599325f2748908dda9851d43398a465667a3e4d [file] [log] [blame]
Austin Schuh189376f2018-12-20 22:11:15 +11001/* ssbmv.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 ssbmv_(char *uplo, integer *n, integer *k, real *alpha,
16 real *a, integer *lda, real *x, integer *incx, real *beta, real *y,
17 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 real 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/* SSBMV 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 - REAL . */
71/* On entry, ALPHA specifies the scalar alpha. */
72/* Unchanged on exit. */
73
74/* A - REAL 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 - REAL 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 - REAL . */
131/* On entry, BETA specifies the scalar beta. */
132/* Unchanged on exit. */
133
134/* Y - REAL 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/* Further Details */
145/* =============== */
146
147/* Level 2 Blas routine. */
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
155/* ===================================================================== */
156
157/* .. Parameters .. */
158/* .. */
159/* .. Local Scalars .. */
160/* .. */
161/* .. External Functions .. */
162/* .. */
163/* .. External Subroutines .. */
164/* .. */
165/* .. Intrinsic Functions .. */
166/* .. */
167
168/* Test the input parameters. */
169
170 /* Parameter adjustments */
171 a_dim1 = *lda;
172 a_offset = 1 + a_dim1;
173 a -= a_offset;
174 --x;
175 --y;
176
177 /* Function Body */
178 info = 0;
179 if (! lsame_(uplo, "U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, "L", (
180 ftnlen)1, (ftnlen)1)) {
181 info = 1;
182 } else if (*n < 0) {
183 info = 2;
184 } else if (*k < 0) {
185 info = 3;
186 } else if (*lda < *k + 1) {
187 info = 6;
188 } else if (*incx == 0) {
189 info = 8;
190 } else if (*incy == 0) {
191 info = 11;
192 }
193 if (info != 0) {
194 xerbla_("SSBMV ", &info, (ftnlen)6);
195 return 0;
196 }
197
198/* Quick return if possible. */
199
200 if (*n == 0 || (*alpha == 0.f && *beta == 1.f)) {
201 return 0;
202 }
203
204/* Set up the start points in X and Y. */
205
206 if (*incx > 0) {
207 kx = 1;
208 } else {
209 kx = 1 - (*n - 1) * *incx;
210 }
211 if (*incy > 0) {
212 ky = 1;
213 } else {
214 ky = 1 - (*n - 1) * *incy;
215 }
216
217/* Start the operations. In this version the elements of the array A */
218/* are accessed sequentially with one pass through A. */
219
220/* First form y := beta*y. */
221
222 if (*beta != 1.f) {
223 if (*incy == 1) {
224 if (*beta == 0.f) {
225 i__1 = *n;
226 for (i__ = 1; i__ <= i__1; ++i__) {
227 y[i__] = 0.f;
228/* L10: */
229 }
230 } else {
231 i__1 = *n;
232 for (i__ = 1; i__ <= i__1; ++i__) {
233 y[i__] = *beta * y[i__];
234/* L20: */
235 }
236 }
237 } else {
238 iy = ky;
239 if (*beta == 0.f) {
240 i__1 = *n;
241 for (i__ = 1; i__ <= i__1; ++i__) {
242 y[iy] = 0.f;
243 iy += *incy;
244/* L30: */
245 }
246 } else {
247 i__1 = *n;
248 for (i__ = 1; i__ <= i__1; ++i__) {
249 y[iy] = *beta * y[iy];
250 iy += *incy;
251/* L40: */
252 }
253 }
254 }
255 }
256 if (*alpha == 0.f) {
257 return 0;
258 }
259 if (lsame_(uplo, "U", (ftnlen)1, (ftnlen)1)) {
260
261/* Form y when upper triangle of A is stored. */
262
263 kplus1 = *k + 1;
264 if (*incx == 1 && *incy == 1) {
265 i__1 = *n;
266 for (j = 1; j <= i__1; ++j) {
267 temp1 = *alpha * x[j];
268 temp2 = 0.f;
269 l = kplus1 - j;
270/* Computing MAX */
271 i__2 = 1, i__3 = j - *k;
272 i__4 = j - 1;
273 for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) {
274 y[i__] += temp1 * a[l + i__ + j * a_dim1];
275 temp2 += a[l + i__ + j * a_dim1] * x[i__];
276/* L50: */
277 }
278 y[j] = y[j] + temp1 * a[kplus1 + j * a_dim1] + *alpha * temp2;
279/* L60: */
280 }
281 } else {
282 jx = kx;
283 jy = ky;
284 i__1 = *n;
285 for (j = 1; j <= i__1; ++j) {
286 temp1 = *alpha * x[jx];
287 temp2 = 0.f;
288 ix = kx;
289 iy = ky;
290 l = kplus1 - j;
291/* Computing MAX */
292 i__4 = 1, i__2 = j - *k;
293 i__3 = j - 1;
294 for (i__ = max(i__4,i__2); i__ <= i__3; ++i__) {
295 y[iy] += temp1 * a[l + i__ + j * a_dim1];
296 temp2 += a[l + i__ + j * a_dim1] * x[ix];
297 ix += *incx;
298 iy += *incy;
299/* L70: */
300 }
301 y[jy] = y[jy] + temp1 * a[kplus1 + j * a_dim1] + *alpha *
302 temp2;
303 jx += *incx;
304 jy += *incy;
305 if (j > *k) {
306 kx += *incx;
307 ky += *incy;
308 }
309/* L80: */
310 }
311 }
312 } else {
313
314/* Form y when lower triangle of A is stored. */
315
316 if (*incx == 1 && *incy == 1) {
317 i__1 = *n;
318 for (j = 1; j <= i__1; ++j) {
319 temp1 = *alpha * x[j];
320 temp2 = 0.f;
321 y[j] += temp1 * a[j * a_dim1 + 1];
322 l = 1 - j;
323/* Computing MIN */
324 i__4 = *n, i__2 = j + *k;
325 i__3 = min(i__4,i__2);
326 for (i__ = j + 1; i__ <= i__3; ++i__) {
327 y[i__] += temp1 * a[l + i__ + j * a_dim1];
328 temp2 += a[l + i__ + j * a_dim1] * x[i__];
329/* L90: */
330 }
331 y[j] += *alpha * temp2;
332/* L100: */
333 }
334 } else {
335 jx = kx;
336 jy = ky;
337 i__1 = *n;
338 for (j = 1; j <= i__1; ++j) {
339 temp1 = *alpha * x[jx];
340 temp2 = 0.f;
341 y[jy] += temp1 * a[j * a_dim1 + 1];
342 l = 1 - j;
343 ix = jx;
344 iy = jy;
345/* Computing MIN */
346 i__4 = *n, i__2 = j + *k;
347 i__3 = min(i__4,i__2);
348 for (i__ = j + 1; i__ <= i__3; ++i__) {
349 ix += *incx;
350 iy += *incy;
351 y[iy] += temp1 * a[l + i__ + j * a_dim1];
352 temp2 += a[l + i__ + j * a_dim1] * x[ix];
353/* L110: */
354 }
355 y[jy] += *alpha * temp2;
356 jx += *incx;
357 jy += *incy;
358/* L120: */
359 }
360 }
361 }
362
363 return 0;
364
365/* End of SSBMV . */
366
367} /* ssbmv_ */
368