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