1/* stbmv.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 stbmv_(char *uplo, char *trans, char *diag, integer *n, 16 integer *k, real *a, integer *lda, real *x, integer *incx, ftnlen 17 uplo_len, ftnlen trans_len, ftnlen diag_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, jx, kx, info; 24 real temp; 25 extern logical lsame_(char *, char *, ftnlen, ftnlen); 26 integer kplus1; 27 extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); 28 logical nounit; 29 30/* .. Scalar Arguments .. */ 31/* .. */ 32/* .. Array Arguments .. */ 33/* .. */ 34 35/* Purpose */ 36/* ======= */ 37 38/* STBMV performs one of the matrix-vector operations */ 39 40/* x := A*x, or x := A'*x, */ 41 42/* where x is an n element vector and A is an n by n unit, or non-unit, */ 43/* upper or lower triangular band matrix, with ( k + 1 ) diagonals. */ 44 45/* Arguments */ 46/* ========== */ 47 48/* UPLO - CHARACTER*1. */ 49/* On entry, UPLO specifies whether the matrix is an upper or */ 50/* lower triangular matrix as follows: */ 51 52/* UPLO = 'U' or 'u' A is an upper triangular matrix. */ 53 54/* UPLO = 'L' or 'l' A is a lower triangular matrix. */ 55 56/* Unchanged on exit. */ 57 58/* TRANS - CHARACTER*1. */ 59/* On entry, TRANS specifies the operation to be performed as */ 60/* follows: */ 61 62/* TRANS = 'N' or 'n' x := A*x. */ 63 64/* TRANS = 'T' or 't' x := A'*x. */ 65 66/* TRANS = 'C' or 'c' x := A'*x. */ 67 68/* Unchanged on exit. */ 69 70/* DIAG - CHARACTER*1. */ 71/* On entry, DIAG specifies whether or not A is unit */ 72/* triangular as follows: */ 73 74/* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ 75 76/* DIAG = 'N' or 'n' A is not assumed to be unit */ 77/* triangular. */ 78 79/* Unchanged on exit. */ 80 81/* N - INTEGER. */ 82/* On entry, N specifies the order of the matrix A. */ 83/* N must be at least zero. */ 84/* Unchanged on exit. */ 85 86/* K - INTEGER. */ 87/* On entry with UPLO = 'U' or 'u', K specifies the number of */ 88/* super-diagonals of the matrix A. */ 89/* On entry with UPLO = 'L' or 'l', K specifies the number of */ 90/* sub-diagonals of the matrix A. */ 91/* K must satisfy 0 .le. K. */ 92/* Unchanged on exit. */ 93 94/* A - REAL array of DIMENSION ( LDA, n ). */ 95/* Before entry with UPLO = 'U' or 'u', the leading ( k + 1 ) */ 96/* by n part of the array A must contain the upper triangular */ 97/* band part of the matrix of coefficients, supplied column by */ 98/* column, with the leading diagonal of the matrix in row */ 99/* ( k + 1 ) of the array, the first super-diagonal starting at */ 100/* position 2 in row k, and so on. The top left k by k triangle */ 101/* of the array A is not referenced. */ 102/* The following program segment will transfer an upper */ 103/* triangular band matrix from conventional full matrix storage */ 104/* to band storage: */ 105 106/* DO 20, J = 1, N */ 107/* M = K + 1 - J */ 108/* DO 10, I = MAX( 1, J - K ), J */ 109/* A( M + I, J ) = matrix( I, J ) */ 110/* 10 CONTINUE */ 111/* 20 CONTINUE */ 112 113/* Before entry with UPLO = 'L' or 'l', the leading ( k + 1 ) */ 114/* by n part of the array A must contain the lower triangular */ 115/* band part of the matrix of coefficients, supplied column by */ 116/* column, with the leading diagonal of the matrix in row 1 of */ 117/* the array, the first sub-diagonal starting at position 1 in */ 118/* row 2, and so on. The bottom right k by k triangle of the */ 119/* array A is not referenced. */ 120/* The following program segment will transfer a lower */ 121/* triangular band matrix from conventional full matrix storage */ 122/* to band storage: */ 123 124/* DO 20, J = 1, N */ 125/* M = 1 - J */ 126/* DO 10, I = J, MIN( N, J + K ) */ 127/* A( M + I, J ) = matrix( I, J ) */ 128/* 10 CONTINUE */ 129/* 20 CONTINUE */ 130 131/* Note that when DIAG = 'U' or 'u' the elements of the array A */ 132/* corresponding to the diagonal elements of the matrix are not */ 133/* referenced, but are assumed to be unity. */ 134/* Unchanged on exit. */ 135 136/* LDA - INTEGER. */ 137/* On entry, LDA specifies the first dimension of A as declared */ 138/* in the calling (sub) program. LDA must be at least */ 139/* ( k + 1 ). */ 140/* Unchanged on exit. */ 141 142/* X - REAL array of dimension at least */ 143/* ( 1 + ( n - 1 )*abs( INCX ) ). */ 144/* Before entry, the incremented array X must contain the n */ 145/* element vector x. On exit, X is overwritten with the */ 146/* tranformed vector x. */ 147 148/* INCX - INTEGER. */ 149/* On entry, INCX specifies the increment for the elements of */ 150/* X. INCX must not be zero. */ 151/* Unchanged on exit. */ 152 153/* Further Details */ 154/* =============== */ 155 156/* Level 2 Blas routine. */ 157 158/* -- Written on 22-October-1986. */ 159/* Jack Dongarra, Argonne National Lab. */ 160/* Jeremy Du Croz, Nag Central Office. */ 161/* Sven Hammarling, Nag Central Office. */ 162/* Richard Hanson, Sandia National Labs. */ 163 164/* ===================================================================== */ 165 166/* .. Parameters .. */ 167/* .. */ 168/* .. Local Scalars .. */ 169/* .. */ 170/* .. External Functions .. */ 171/* .. */ 172/* .. External Subroutines .. */ 173/* .. */ 174/* .. Intrinsic Functions .. */ 175/* .. */ 176 177/* Test the input parameters. */ 178 179 /* Parameter adjustments */ 180 a_dim1 = *lda; 181 a_offset = 1 + a_dim1; 182 a -= a_offset; 183 --x; 184 185 /* Function Body */ 186 info = 0; 187 if (! lsame_(uplo, "U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, "L", ( 188 ftnlen)1, (ftnlen)1)) { 189 info = 1; 190 } else if (! lsame_(trans, "N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, 191 "T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, "C", (ftnlen)1, ( 192 ftnlen)1)) { 193 info = 2; 194 } else if (! lsame_(diag, "U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, 195 "N", (ftnlen)1, (ftnlen)1)) { 196 info = 3; 197 } else if (*n < 0) { 198 info = 4; 199 } else if (*k < 0) { 200 info = 5; 201 } else if (*lda < *k + 1) { 202 info = 7; 203 } else if (*incx == 0) { 204 info = 9; 205 } 206 if (info != 0) { 207 xerbla_("STBMV ", &info, (ftnlen)6); 208 return 0; 209 } 210 211/* Quick return if possible. */ 212 213 if (*n == 0) { 214 return 0; 215 } 216 217 nounit = lsame_(diag, "N", (ftnlen)1, (ftnlen)1); 218 219/* Set up the start point in X if the increment is not unity. This */ 220/* will be ( N - 1 )*INCX too small for descending loops. */ 221 222 if (*incx <= 0) { 223 kx = 1 - (*n - 1) * *incx; 224 } else if (*incx != 1) { 225 kx = 1; 226 } 227 228/* Start the operations. In this version the elements of A are */ 229/* accessed sequentially with one pass through A. */ 230 231 if (lsame_(trans, "N", (ftnlen)1, (ftnlen)1)) { 232 233/* Form x := A*x. */ 234 235 if (lsame_(uplo, "U", (ftnlen)1, (ftnlen)1)) { 236 kplus1 = *k + 1; 237 if (*incx == 1) { 238 i__1 = *n; 239 for (j = 1; j <= i__1; ++j) { 240 if (x[j] != 0.f) { 241 temp = x[j]; 242 l = kplus1 - j; 243/* Computing MAX */ 244 i__2 = 1, i__3 = j - *k; 245 i__4 = j - 1; 246 for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) { 247 x[i__] += temp * a[l + i__ + j * a_dim1]; 248/* L10: */ 249 } 250 if (nounit) { 251 x[j] *= a[kplus1 + j * a_dim1]; 252 } 253 } 254/* L20: */ 255 } 256 } else { 257 jx = kx; 258 i__1 = *n; 259 for (j = 1; j <= i__1; ++j) { 260 if (x[jx] != 0.f) { 261 temp = x[jx]; 262 ix = kx; 263 l = kplus1 - j; 264/* Computing MAX */ 265 i__4 = 1, i__2 = j - *k; 266 i__3 = j - 1; 267 for (i__ = max(i__4,i__2); i__ <= i__3; ++i__) { 268 x[ix] += temp * a[l + i__ + j * a_dim1]; 269 ix += *incx; 270/* L30: */ 271 } 272 if (nounit) { 273 x[jx] *= a[kplus1 + j * a_dim1]; 274 } 275 } 276 jx += *incx; 277 if (j > *k) { 278 kx += *incx; 279 } 280/* L40: */ 281 } 282 } 283 } else { 284 if (*incx == 1) { 285 for (j = *n; j >= 1; --j) { 286 if (x[j] != 0.f) { 287 temp = x[j]; 288 l = 1 - j; 289/* Computing MIN */ 290 i__1 = *n, i__3 = j + *k; 291 i__4 = j + 1; 292 for (i__ = min(i__1,i__3); i__ >= i__4; --i__) { 293 x[i__] += temp * a[l + i__ + j * a_dim1]; 294/* L50: */ 295 } 296 if (nounit) { 297 x[j] *= a[j * a_dim1 + 1]; 298 } 299 } 300/* L60: */ 301 } 302 } else { 303 kx += (*n - 1) * *incx; 304 jx = kx; 305 for (j = *n; j >= 1; --j) { 306 if (x[jx] != 0.f) { 307 temp = x[jx]; 308 ix = kx; 309 l = 1 - j; 310/* Computing MIN */ 311 i__4 = *n, i__1 = j + *k; 312 i__3 = j + 1; 313 for (i__ = min(i__4,i__1); i__ >= i__3; --i__) { 314 x[ix] += temp * a[l + i__ + j * a_dim1]; 315 ix -= *incx; 316/* L70: */ 317 } 318 if (nounit) { 319 x[jx] *= a[j * a_dim1 + 1]; 320 } 321 } 322 jx -= *incx; 323 if (*n - j >= *k) { 324 kx -= *incx; 325 } 326/* L80: */ 327 } 328 } 329 } 330 } else { 331 332/* Form x := A'*x. */ 333 334 if (lsame_(uplo, "U", (ftnlen)1, (ftnlen)1)) { 335 kplus1 = *k + 1; 336 if (*incx == 1) { 337 for (j = *n; j >= 1; --j) { 338 temp = x[j]; 339 l = kplus1 - j; 340 if (nounit) { 341 temp *= a[kplus1 + j * a_dim1]; 342 } 343/* Computing MAX */ 344 i__4 = 1, i__1 = j - *k; 345 i__3 = max(i__4,i__1); 346 for (i__ = j - 1; i__ >= i__3; --i__) { 347 temp += a[l + i__ + j * a_dim1] * x[i__]; 348/* L90: */ 349 } 350 x[j] = temp; 351/* L100: */ 352 } 353 } else { 354 kx += (*n - 1) * *incx; 355 jx = kx; 356 for (j = *n; j >= 1; --j) { 357 temp = x[jx]; 358 kx -= *incx; 359 ix = kx; 360 l = kplus1 - j; 361 if (nounit) { 362 temp *= a[kplus1 + j * a_dim1]; 363 } 364/* Computing MAX */ 365 i__4 = 1, i__1 = j - *k; 366 i__3 = max(i__4,i__1); 367 for (i__ = j - 1; i__ >= i__3; --i__) { 368 temp += a[l + i__ + j * a_dim1] * x[ix]; 369 ix -= *incx; 370/* L110: */ 371 } 372 x[jx] = temp; 373 jx -= *incx; 374/* L120: */ 375 } 376 } 377 } else { 378 if (*incx == 1) { 379 i__3 = *n; 380 for (j = 1; j <= i__3; ++j) { 381 temp = x[j]; 382 l = 1 - j; 383 if (nounit) { 384 temp *= a[j * a_dim1 + 1]; 385 } 386/* Computing MIN */ 387 i__1 = *n, i__2 = j + *k; 388 i__4 = min(i__1,i__2); 389 for (i__ = j + 1; i__ <= i__4; ++i__) { 390 temp += a[l + i__ + j * a_dim1] * x[i__]; 391/* L130: */ 392 } 393 x[j] = temp; 394/* L140: */ 395 } 396 } else { 397 jx = kx; 398 i__3 = *n; 399 for (j = 1; j <= i__3; ++j) { 400 temp = x[jx]; 401 kx += *incx; 402 ix = kx; 403 l = 1 - j; 404 if (nounit) { 405 temp *= a[j * a_dim1 + 1]; 406 } 407/* Computing MIN */ 408 i__1 = *n, i__2 = j + *k; 409 i__4 = min(i__1,i__2); 410 for (i__ = j + 1; i__ <= i__4; ++i__) { 411 temp += a[l + i__ + j * a_dim1] * x[ix]; 412 ix += *incx; 413/* L150: */ 414 } 415 x[jx] = temp; 416 jx += *incx; 417/* L160: */ 418 } 419 } 420 } 421 } 422 423 return 0; 424 425/* End of STBMV . */ 426 427} /* stbmv_ */ 428 429