Home | History | Annotate | Download | only in f2c
      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