/* chpmv.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"

static inline void r_cnjg(complex *r, complex *z) {
  r->r = z->r;
  r->i = -(z->i);
}

/* Subroutine */ void chpmv_(char *uplo, integer *n, complex *alpha, complex *ap, complex *x, integer *incx,
                             complex *beta, complex *y, integer *incy) {
  /* System generated locals */
  integer i__1, i__2, i__3, i__4, i__5;
  real r__1;
  complex q__1, q__2, q__3, q__4;

  /* Local variables */
  integer i__, j, k, kk, ix, iy, jx, jy, kx, ky, info;
  complex temp1, temp2;
  extern logical lsame_(char *, char *);
  extern /* Subroutine */ void xerbla_(const char *, integer *);

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

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

  /*  CHPMV  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 hermitian matrix, supplied in packed form. */

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

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

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

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

  /*           Unchanged on exit. */

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

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

  /*  AP     - COMPLEX          array of DIMENSION at least */
  /*           ( ( n*( n + 1 ) )/2 ). */
  /*           Before entry with UPLO = 'U' or 'u', the array AP must */
  /*           contain the upper triangular part of the hermitian matrix */
  /*           packed sequentially, column by column, so that AP( 1 ) */
  /*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 ) */
  /*           and a( 2, 2 ) respectively, and so on. */
  /*           Before entry with UPLO = 'L' or 'l', the array AP must */
  /*           contain the lower triangular part of the hermitian matrix */
  /*           packed sequentially, column by column, so that AP( 1 ) */
  /*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 ) */
  /*           and a( 3, 1 ) respectively, and so on. */
  /*           Note that the imaginary parts of the diagonal elements need */
  /*           not be set and are assumed to be zero. */
  /*           Unchanged on exit. */

  /*  X      - COMPLEX          array of dimension at least */
  /*           ( 1 + ( n - 1 )*abs( INCX ) ). */
  /*           Before entry, the incremented array X must contain the n */
  /*           element 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   - COMPLEX         . */
  /*           On entry, BETA specifies the scalar beta. When BETA is */
  /*           supplied as zero then Y need not be set on input. */
  /*           Unchanged on exit. */

  /*  Y      - COMPLEX          array of dimension at least */
  /*           ( 1 + ( n - 1 )*abs( INCY ) ). */
  /*           Before entry, the incremented array Y must contain the n */
  /*           element 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 */
  --y;
  --x;
  --ap;

  /* Function Body */
  info = 0;
  if (!lsame_(uplo, "U") && !lsame_(uplo, "L")) {
    info = 1;
  } else if (*n < 0) {
    info = 2;
  } else if (*incx == 0) {
    info = 6;
  } else if (*incy == 0) {
    info = 9;
  }
  if (info != 0) {
    xerbla_("CHPMV ", &info);
    return;
  }

  /*     Quick return if possible. */

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

  /*     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 AP */
  /*     are accessed sequentially with one pass through AP. */

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

  if (beta->r != 1.f || beta->i != 0.f) {
    if (*incy == 1) {
      if (beta->r == 0.f && beta->i == 0.f) {
        i__1 = *n;
        for (i__ = 1; i__ <= i__1; ++i__) {
          i__2 = i__;
          y[i__2].r = 0.f, y[i__2].i = 0.f;
          /* L10: */
        }
      } else {
        i__1 = *n;
        for (i__ = 1; i__ <= i__1; ++i__) {
          i__2 = i__;
          i__3 = i__;
          q__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, q__1.i = beta->r * y[i__3].i + beta->i * y[i__3].r;
          y[i__2].r = q__1.r, y[i__2].i = q__1.i;
          /* L20: */
        }
      }
    } else {
      iy = ky;
      if (beta->r == 0.f && beta->i == 0.f) {
        i__1 = *n;
        for (i__ = 1; i__ <= i__1; ++i__) {
          i__2 = iy;
          y[i__2].r = 0.f, y[i__2].i = 0.f;
          iy += *incy;
          /* L30: */
        }
      } else {
        i__1 = *n;
        for (i__ = 1; i__ <= i__1; ++i__) {
          i__2 = iy;
          i__3 = iy;
          q__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, q__1.i = beta->r * y[i__3].i + beta->i * y[i__3].r;
          y[i__2].r = q__1.r, y[i__2].i = q__1.i;
          iy += *incy;
          /* L40: */
        }
      }
    }
  }
  if (alpha->r == 0.f && alpha->i == 0.f) {
    return;
  }
  kk = 1;
  if (lsame_(uplo, "U")) {
    /*        Form  y  when AP contains the upper triangle. */

    if (*incx == 1 && *incy == 1) {
      i__1 = *n;
      for (j = 1; j <= i__1; ++j) {
        i__2 = j;
        q__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, q__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r;
        temp1.r = q__1.r, temp1.i = q__1.i;
        temp2.r = 0.f, temp2.i = 0.f;
        k = kk;
        i__2 = j - 1;
        for (i__ = 1; i__ <= i__2; ++i__) {
          i__3 = i__;
          i__4 = i__;
          i__5 = k;
          q__2.r = temp1.r * ap[i__5].r - temp1.i * ap[i__5].i, q__2.i = temp1.r * ap[i__5].i + temp1.i * ap[i__5].r;
          q__1.r = y[i__4].r + q__2.r, q__1.i = y[i__4].i + q__2.i;
          y[i__3].r = q__1.r, y[i__3].i = q__1.i;
          r_cnjg(&q__3, &ap[k]);
          i__3 = i__;
          q__2.r = q__3.r * x[i__3].r - q__3.i * x[i__3].i, q__2.i = q__3.r * x[i__3].i + q__3.i * x[i__3].r;
          q__1.r = temp2.r + q__2.r, q__1.i = temp2.i + q__2.i;
          temp2.r = q__1.r, temp2.i = q__1.i;
          ++k;
          /* L50: */
        }
        i__2 = j;
        i__3 = j;
        i__4 = kk + j - 1;
        r__1 = ap[i__4].r;
        q__3.r = r__1 * temp1.r, q__3.i = r__1 * temp1.i;
        q__2.r = y[i__3].r + q__3.r, q__2.i = y[i__3].i + q__3.i;
        q__4.r = alpha->r * temp2.r - alpha->i * temp2.i, q__4.i = alpha->r * temp2.i + alpha->i * temp2.r;
        q__1.r = q__2.r + q__4.r, q__1.i = q__2.i + q__4.i;
        y[i__2].r = q__1.r, y[i__2].i = q__1.i;
        kk += j;
        /* L60: */
      }
    } else {
      jx = kx;
      jy = ky;
      i__1 = *n;
      for (j = 1; j <= i__1; ++j) {
        i__2 = jx;
        q__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, q__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r;
        temp1.r = q__1.r, temp1.i = q__1.i;
        temp2.r = 0.f, temp2.i = 0.f;
        ix = kx;
        iy = ky;
        i__2 = kk + j - 2;
        for (k = kk; k <= i__2; ++k) {
          i__3 = iy;
          i__4 = iy;
          i__5 = k;
          q__2.r = temp1.r * ap[i__5].r - temp1.i * ap[i__5].i, q__2.i = temp1.r * ap[i__5].i + temp1.i * ap[i__5].r;
          q__1.r = y[i__4].r + q__2.r, q__1.i = y[i__4].i + q__2.i;
          y[i__3].r = q__1.r, y[i__3].i = q__1.i;
          r_cnjg(&q__3, &ap[k]);
          i__3 = ix;
          q__2.r = q__3.r * x[i__3].r - q__3.i * x[i__3].i, q__2.i = q__3.r * x[i__3].i + q__3.i * x[i__3].r;
          q__1.r = temp2.r + q__2.r, q__1.i = temp2.i + q__2.i;
          temp2.r = q__1.r, temp2.i = q__1.i;
          ix += *incx;
          iy += *incy;
          /* L70: */
        }
        i__2 = jy;
        i__3 = jy;
        i__4 = kk + j - 1;
        r__1 = ap[i__4].r;
        q__3.r = r__1 * temp1.r, q__3.i = r__1 * temp1.i;
        q__2.r = y[i__3].r + q__3.r, q__2.i = y[i__3].i + q__3.i;
        q__4.r = alpha->r * temp2.r - alpha->i * temp2.i, q__4.i = alpha->r * temp2.i + alpha->i * temp2.r;
        q__1.r = q__2.r + q__4.r, q__1.i = q__2.i + q__4.i;
        y[i__2].r = q__1.r, y[i__2].i = q__1.i;
        jx += *incx;
        jy += *incy;
        kk += j;
        /* L80: */
      }
    }
  } else {
    /*        Form  y  when AP contains the lower triangle. */

    if (*incx == 1 && *incy == 1) {
      i__1 = *n;
      for (j = 1; j <= i__1; ++j) {
        i__2 = j;
        q__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, q__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r;
        temp1.r = q__1.r, temp1.i = q__1.i;
        temp2.r = 0.f, temp2.i = 0.f;
        i__2 = j;
        i__3 = j;
        i__4 = kk;
        r__1 = ap[i__4].r;
        q__2.r = r__1 * temp1.r, q__2.i = r__1 * temp1.i;
        q__1.r = y[i__3].r + q__2.r, q__1.i = y[i__3].i + q__2.i;
        y[i__2].r = q__1.r, y[i__2].i = q__1.i;
        k = kk + 1;
        i__2 = *n;
        for (i__ = j + 1; i__ <= i__2; ++i__) {
          i__3 = i__;
          i__4 = i__;
          i__5 = k;
          q__2.r = temp1.r * ap[i__5].r - temp1.i * ap[i__5].i, q__2.i = temp1.r * ap[i__5].i + temp1.i * ap[i__5].r;
          q__1.r = y[i__4].r + q__2.r, q__1.i = y[i__4].i + q__2.i;
          y[i__3].r = q__1.r, y[i__3].i = q__1.i;
          r_cnjg(&q__3, &ap[k]);
          i__3 = i__;
          q__2.r = q__3.r * x[i__3].r - q__3.i * x[i__3].i, q__2.i = q__3.r * x[i__3].i + q__3.i * x[i__3].r;
          q__1.r = temp2.r + q__2.r, q__1.i = temp2.i + q__2.i;
          temp2.r = q__1.r, temp2.i = q__1.i;
          ++k;
          /* L90: */
        }
        i__2 = j;
        i__3 = j;
        q__2.r = alpha->r * temp2.r - alpha->i * temp2.i, q__2.i = alpha->r * temp2.i + alpha->i * temp2.r;
        q__1.r = y[i__3].r + q__2.r, q__1.i = y[i__3].i + q__2.i;
        y[i__2].r = q__1.r, y[i__2].i = q__1.i;
        kk += *n - j + 1;
        /* L100: */
      }
    } else {
      jx = kx;
      jy = ky;
      i__1 = *n;
      for (j = 1; j <= i__1; ++j) {
        i__2 = jx;
        q__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, q__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r;
        temp1.r = q__1.r, temp1.i = q__1.i;
        temp2.r = 0.f, temp2.i = 0.f;
        i__2 = jy;
        i__3 = jy;
        i__4 = kk;
        r__1 = ap[i__4].r;
        q__2.r = r__1 * temp1.r, q__2.i = r__1 * temp1.i;
        q__1.r = y[i__3].r + q__2.r, q__1.i = y[i__3].i + q__2.i;
        y[i__2].r = q__1.r, y[i__2].i = q__1.i;
        ix = jx;
        iy = jy;
        i__2 = kk + *n - j;
        for (k = kk + 1; k <= i__2; ++k) {
          ix += *incx;
          iy += *incy;
          i__3 = iy;
          i__4 = iy;
          i__5 = k;
          q__2.r = temp1.r * ap[i__5].r - temp1.i * ap[i__5].i, q__2.i = temp1.r * ap[i__5].i + temp1.i * ap[i__5].r;
          q__1.r = y[i__4].r + q__2.r, q__1.i = y[i__4].i + q__2.i;
          y[i__3].r = q__1.r, y[i__3].i = q__1.i;
          r_cnjg(&q__3, &ap[k]);
          i__3 = ix;
          q__2.r = q__3.r * x[i__3].r - q__3.i * x[i__3].i, q__2.i = q__3.r * x[i__3].i + q__3.i * x[i__3].r;
          q__1.r = temp2.r + q__2.r, q__1.i = temp2.i + q__2.i;
          temp2.r = q__1.r, temp2.i = q__1.i;
          /* L110: */
        }
        i__2 = jy;
        i__3 = jy;
        q__2.r = alpha->r * temp2.r - alpha->i * temp2.i, q__2.i = alpha->r * temp2.i + alpha->i * temp2.r;
        q__1.r = y[i__3].r + q__2.r, q__1.i = y[i__3].i + q__2.i;
        y[i__2].r = q__1.r, y[i__2].i = q__1.i;
        jx += *incx;
        jy += *incy;
        kk += *n - j + 1;
        /* L120: */
      }
    }
  }

  /*     End of CHPMV . */

} /* chpmv_ */
