1/* 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
369