/* ssbmv.f -- translated by f2c (version 20100827).
   You must link the resulting object file with libf2c:
        on Microsoft Windows system, link with libf2c.lib;
        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
        or, if you install libf2c.a in a standard place, with -lf2c -lm
        -- in that order, at the end of the command line, as in
                cc *.o -lf2c -lm
        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,

                http://www.netlib.org/f2c/libf2c.zip
*/

#include "datatypes.h"

/* Subroutine */ int ssbmv_(char *uplo, integer *n, integer *k, real *alpha, real *a, integer *lda, real *x,
                            integer *incx, real *beta, real *y, integer *incy, ftnlen uplo_len) {
  /* System generated locals */
  integer a_dim1, a_offset, i__1, i__2, i__3, i__4;

  /* Local variables */
  integer i__, j, l, ix, iy, jx, jy, kx, ky, info;
  real temp1, temp2;
  extern logical lsame_(char *, char *, ftnlen, ftnlen);
  integer kplus1;
  extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen);

  /*     .. Scalar Arguments .. */
  /*     .. */
  /*     .. Array Arguments .. */
  /*     .. */

  /*  Purpose */
  /*  ======= */

  /*  SSBMV  performs the matrix-vector  operation */

  /*     y := alpha*A*x + beta*y, */

  /*  where alpha and beta are scalars, x and y are n element vectors and */
  /*  A is an n by n symmetric band matrix, with k super-diagonals. */

  /*  Arguments */
  /*  ========== */

  /*  UPLO   - CHARACTER*1. */
  /*           On entry, UPLO specifies whether the upper or lower */
  /*           triangular part of the band matrix A is being supplied as */
  /*           follows: */

  /*              UPLO = 'U' or 'u'   The upper triangular part of A is */
  /*                                  being supplied. */

  /*              UPLO = 'L' or 'l'   The lower triangular part of A is */
  /*                                  being supplied. */

  /*           Unchanged on exit. */

  /*  N      - INTEGER. */
  /*           On entry, N specifies the order of the matrix A. */
  /*           N must be at least zero. */
  /*           Unchanged on exit. */

  /*  K      - INTEGER. */
  /*           On entry, K specifies the number of super-diagonals of the */
  /*           matrix A. K must satisfy  0 .le. K. */
  /*           Unchanged on exit. */

  /*  ALPHA  - REAL            . */
  /*           On entry, ALPHA specifies the scalar alpha. */
  /*           Unchanged on exit. */

  /*  A      - REAL             array of DIMENSION ( LDA, n ). */
  /*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 ) */
  /*           by n part of the array A must contain the upper triangular */
  /*           band part of the symmetric matrix, supplied column by */
  /*           column, with the leading diagonal of the matrix in row */
  /*           ( k + 1 ) of the array, the first super-diagonal starting at */
  /*           position 2 in row k, and so on. The top left k by k triangle */
  /*           of the array A is not referenced. */
  /*           The following program segment will transfer the upper */
  /*           triangular part of a symmetric band matrix from conventional */
  /*           full matrix storage to band storage: */

  /*                 DO 20, J = 1, N */
  /*                    M = K + 1 - J */
  /*                    DO 10, I = MAX( 1, J - K ), J */
  /*                       A( M + I, J ) = matrix( I, J ) */
  /*              10    CONTINUE */
  /*              20 CONTINUE */

  /*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 ) */
  /*           by n part of the array A must contain the lower triangular */
  /*           band part of the symmetric matrix, supplied column by */
  /*           column, with the leading diagonal of the matrix in row 1 of */
  /*           the array, the first sub-diagonal starting at position 1 in */
  /*           row 2, and so on. The bottom right k by k triangle of the */
  /*           array A is not referenced. */
  /*           The following program segment will transfer the lower */
  /*           triangular part of a symmetric band matrix from conventional */
  /*           full matrix storage to band storage: */

  /*                 DO 20, J = 1, N */
  /*                    M = 1 - J */
  /*                    DO 10, I = J, MIN( N, J + K ) */
  /*                       A( M + I, J ) = matrix( I, J ) */
  /*              10    CONTINUE */
  /*              20 CONTINUE */

  /*           Unchanged on exit. */

  /*  LDA    - INTEGER. */
  /*           On entry, LDA specifies the first dimension of A as declared */
  /*           in the calling (sub) program. LDA must be at least */
  /*           ( k + 1 ). */
  /*           Unchanged on exit. */

  /*  X      - REAL             array of DIMENSION at least */
  /*           ( 1 + ( n - 1 )*abs( INCX ) ). */
  /*           Before entry, the incremented array X must contain the */
  /*           vector x. */
  /*           Unchanged on exit. */

  /*  INCX   - INTEGER. */
  /*           On entry, INCX specifies the increment for the elements of */
  /*           X. INCX must not be zero. */
  /*           Unchanged on exit. */

  /*  BETA   - REAL            . */
  /*           On entry, BETA specifies the scalar beta. */
  /*           Unchanged on exit. */

  /*  Y      - REAL             array of DIMENSION at least */
  /*           ( 1 + ( n - 1 )*abs( INCY ) ). */
  /*           Before entry, the incremented array Y must contain the */
  /*           vector y. On exit, Y is overwritten by the updated vector y. */

  /*  INCY   - INTEGER. */
  /*           On entry, INCY specifies the increment for the elements of */
  /*           Y. INCY must not be zero. */
  /*           Unchanged on exit. */

  /*  Further Details */
  /*  =============== */

  /*  Level 2 Blas routine. */

  /*  -- Written on 22-October-1986. */
  /*     Jack Dongarra, Argonne National Lab. */
  /*     Jeremy Du Croz, Nag Central Office. */
  /*     Sven Hammarling, Nag Central Office. */
  /*     Richard Hanson, Sandia National Labs. */

  /*  ===================================================================== */

  /*     .. Parameters .. */
  /*     .. */
  /*     .. Local Scalars .. */
  /*     .. */
  /*     .. External Functions .. */
  /*     .. */
  /*     .. External Subroutines .. */
  /*     .. */
  /*     .. Intrinsic Functions .. */
  /*     .. */

  /*     Test the input parameters. */

  /* Parameter adjustments */
  a_dim1 = *lda;
  a_offset = 1 + a_dim1;
  a -= a_offset;
  --x;
  --y;

  /* Function Body */
  info = 0;
  if (!lsame_(uplo, "U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, "L", (ftnlen)1, (ftnlen)1)) {
    info = 1;
  } else if (*n < 0) {
    info = 2;
  } else if (*k < 0) {
    info = 3;
  } else if (*lda < *k + 1) {
    info = 6;
  } else if (*incx == 0) {
    info = 8;
  } else if (*incy == 0) {
    info = 11;
  }
  if (info != 0) {
    xerbla_("SSBMV ", &info, (ftnlen)6);
    return 0;
  }

  /*     Quick return if possible. */

  if (*n == 0 || (*alpha == 0.f && *beta == 1.f)) {
    return 0;
  }

  /*     Set up the start points in  X  and  Y. */

  if (*incx > 0) {
    kx = 1;
  } else {
    kx = 1 - (*n - 1) * *incx;
  }
  if (*incy > 0) {
    ky = 1;
  } else {
    ky = 1 - (*n - 1) * *incy;
  }

  /*     Start the operations. In this version the elements of the array A */
  /*     are accessed sequentially with one pass through A. */

  /*     First form  y := beta*y. */

  if (*beta != 1.f) {
    if (*incy == 1) {
      if (*beta == 0.f) {
        i__1 = *n;
        for (i__ = 1; i__ <= i__1; ++i__) {
          y[i__] = 0.f;
          /* L10: */
        }
      } else {
        i__1 = *n;
        for (i__ = 1; i__ <= i__1; ++i__) {
          y[i__] = *beta * y[i__];
          /* L20: */
        }
      }
    } else {
      iy = ky;
      if (*beta == 0.f) {
        i__1 = *n;
        for (i__ = 1; i__ <= i__1; ++i__) {
          y[iy] = 0.f;
          iy += *incy;
          /* L30: */
        }
      } else {
        i__1 = *n;
        for (i__ = 1; i__ <= i__1; ++i__) {
          y[iy] = *beta * y[iy];
          iy += *incy;
          /* L40: */
        }
      }
    }
  }
  if (*alpha == 0.f) {
    return 0;
  }
  if (lsame_(uplo, "U", (ftnlen)1, (ftnlen)1)) {
    /*        Form  y  when upper triangle of A is stored. */

    kplus1 = *k + 1;
    if (*incx == 1 && *incy == 1) {
      i__1 = *n;
      for (j = 1; j <= i__1; ++j) {
        temp1 = *alpha * x[j];
        temp2 = 0.f;
        l = kplus1 - j;
        /* Computing MAX */
        i__2 = 1, i__3 = j - *k;
        i__4 = j - 1;
        for (i__ = max(i__2, i__3); i__ <= i__4; ++i__) {
          y[i__] += temp1 * a[l + i__ + j * a_dim1];
          temp2 += a[l + i__ + j * a_dim1] * x[i__];
          /* L50: */
        }
        y[j] = y[j] + temp1 * a[kplus1 + j * a_dim1] + *alpha * temp2;
        /* L60: */
      }
    } else {
      jx = kx;
      jy = ky;
      i__1 = *n;
      for (j = 1; j <= i__1; ++j) {
        temp1 = *alpha * x[jx];
        temp2 = 0.f;
        ix = kx;
        iy = ky;
        l = kplus1 - j;
        /* Computing MAX */
        i__4 = 1, i__2 = j - *k;
        i__3 = j - 1;
        for (i__ = max(i__4, i__2); i__ <= i__3; ++i__) {
          y[iy] += temp1 * a[l + i__ + j * a_dim1];
          temp2 += a[l + i__ + j * a_dim1] * x[ix];
          ix += *incx;
          iy += *incy;
          /* L70: */
        }
        y[jy] = y[jy] + temp1 * a[kplus1 + j * a_dim1] + *alpha * temp2;
        jx += *incx;
        jy += *incy;
        if (j > *k) {
          kx += *incx;
          ky += *incy;
        }
        /* L80: */
      }
    }
  } else {
    /*        Form  y  when lower triangle of A is stored. */

    if (*incx == 1 && *incy == 1) {
      i__1 = *n;
      for (j = 1; j <= i__1; ++j) {
        temp1 = *alpha * x[j];
        temp2 = 0.f;
        y[j] += temp1 * a[j * a_dim1 + 1];
        l = 1 - j;
        /* Computing MIN */
        i__4 = *n, i__2 = j + *k;
        i__3 = min(i__4, i__2);
        for (i__ = j + 1; i__ <= i__3; ++i__) {
          y[i__] += temp1 * a[l + i__ + j * a_dim1];
          temp2 += a[l + i__ + j * a_dim1] * x[i__];
          /* L90: */
        }
        y[j] += *alpha * temp2;
        /* L100: */
      }
    } else {
      jx = kx;
      jy = ky;
      i__1 = *n;
      for (j = 1; j <= i__1; ++j) {
        temp1 = *alpha * x[jx];
        temp2 = 0.f;
        y[jy] += temp1 * a[j * a_dim1 + 1];
        l = 1 - j;
        ix = jx;
        iy = jy;
        /* Computing MIN */
        i__4 = *n, i__2 = j + *k;
        i__3 = min(i__4, i__2);
        for (i__ = j + 1; i__ <= i__3; ++i__) {
          ix += *incx;
          iy += *incy;
          y[iy] += temp1 * a[l + i__ + j * a_dim1];
          temp2 += a[l + i__ + j * a_dim1] * x[ix];
          /* L110: */
        }
        y[jy] += *alpha * temp2;
        jx += *incx;
        jy += *incy;
        /* L120: */
      }
    }
  }

  return 0;

  /*     End of SSBMV . */

} /* ssbmv_ */
