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