/* zhpmv.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 d_cnjg(doublecomplex *r, doublecomplex *z) {
  r->r = z->r;
  r->i = -(z->i);
}

/* Subroutine */ void zhpmv_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *ap, doublecomplex *x,
                             integer *incx, doublecomplex *beta, doublecomplex *y, integer *incy) {
  /* System generated locals */
  integer i__1, i__2, i__3, i__4, i__5;
  doublereal d__1;
  doublecomplex z__1, z__2, z__3, z__4;

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

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

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

  /*  ZHPMV  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*16      . */
  /*           On entry, ALPHA specifies the scalar alpha. */
  /*           Unchanged on exit. */

  /*  AP     - COMPLEX*16       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*16       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*16      . */
  /*           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*16       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_("ZHPMV ", &info);
    return;
  }

  /*     Quick return if possible. */

  if (*n == 0 || (alpha->r == 0. && alpha->i == 0. && (beta->r == 1. && beta->i == 0.))) {
    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. || beta->i != 0.) {
    if (*incy == 1) {
      if (beta->r == 0. && beta->i == 0.) {
        i__1 = *n;
        for (i__ = 1; i__ <= i__1; ++i__) {
          i__2 = i__;
          y[i__2].r = 0., y[i__2].i = 0.;
          /* L10: */
        }
      } else {
        i__1 = *n;
        for (i__ = 1; i__ <= i__1; ++i__) {
          i__2 = i__;
          i__3 = i__;
          z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, z__1.i = beta->r * y[i__3].i + beta->i * y[i__3].r;
          y[i__2].r = z__1.r, y[i__2].i = z__1.i;
          /* L20: */
        }
      }
    } else {
      iy = ky;
      if (beta->r == 0. && beta->i == 0.) {
        i__1 = *n;
        for (i__ = 1; i__ <= i__1; ++i__) {
          i__2 = iy;
          y[i__2].r = 0., y[i__2].i = 0.;
          iy += *incy;
          /* L30: */
        }
      } else {
        i__1 = *n;
        for (i__ = 1; i__ <= i__1; ++i__) {
          i__2 = iy;
          i__3 = iy;
          z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, z__1.i = beta->r * y[i__3].i + beta->i * y[i__3].r;
          y[i__2].r = z__1.r, y[i__2].i = z__1.i;
          iy += *incy;
          /* L40: */
        }
      }
    }
  }
  if (alpha->r == 0. && alpha->i == 0.) {
    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;
        z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r;
        temp1.r = z__1.r, temp1.i = z__1.i;
        temp2.r = 0., temp2.i = 0.;
        k = kk;
        i__2 = j - 1;
        for (i__ = 1; i__ <= i__2; ++i__) {
          i__3 = i__;
          i__4 = i__;
          i__5 = k;
          z__2.r = temp1.r * ap[i__5].r - temp1.i * ap[i__5].i, z__2.i = temp1.r * ap[i__5].i + temp1.i * ap[i__5].r;
          z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i;
          y[i__3].r = z__1.r, y[i__3].i = z__1.i;
          d_cnjg(&z__3, &ap[k]);
          i__3 = i__;
          z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r;
          z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i;
          temp2.r = z__1.r, temp2.i = z__1.i;
          ++k;
          /* L50: */
        }
        i__2 = j;
        i__3 = j;
        i__4 = kk + j - 1;
        d__1 = ap[i__4].r;
        z__3.r = d__1 * temp1.r, z__3.i = d__1 * temp1.i;
        z__2.r = y[i__3].r + z__3.r, z__2.i = y[i__3].i + z__3.i;
        z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, z__4.i = alpha->r * temp2.i + alpha->i * temp2.r;
        z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i;
        y[i__2].r = z__1.r, y[i__2].i = z__1.i;
        kk += j;
        /* L60: */
      }
    } else {
      jx = kx;
      jy = ky;
      i__1 = *n;
      for (j = 1; j <= i__1; ++j) {
        i__2 = jx;
        z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r;
        temp1.r = z__1.r, temp1.i = z__1.i;
        temp2.r = 0., temp2.i = 0.;
        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;
          z__2.r = temp1.r * ap[i__5].r - temp1.i * ap[i__5].i, z__2.i = temp1.r * ap[i__5].i + temp1.i * ap[i__5].r;
          z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i;
          y[i__3].r = z__1.r, y[i__3].i = z__1.i;
          d_cnjg(&z__3, &ap[k]);
          i__3 = ix;
          z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r;
          z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i;
          temp2.r = z__1.r, temp2.i = z__1.i;
          ix += *incx;
          iy += *incy;
          /* L70: */
        }
        i__2 = jy;
        i__3 = jy;
        i__4 = kk + j - 1;
        d__1 = ap[i__4].r;
        z__3.r = d__1 * temp1.r, z__3.i = d__1 * temp1.i;
        z__2.r = y[i__3].r + z__3.r, z__2.i = y[i__3].i + z__3.i;
        z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, z__4.i = alpha->r * temp2.i + alpha->i * temp2.r;
        z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i;
        y[i__2].r = z__1.r, y[i__2].i = z__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;
        z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r;
        temp1.r = z__1.r, temp1.i = z__1.i;
        temp2.r = 0., temp2.i = 0.;
        i__2 = j;
        i__3 = j;
        i__4 = kk;
        d__1 = ap[i__4].r;
        z__2.r = d__1 * temp1.r, z__2.i = d__1 * temp1.i;
        z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i;
        y[i__2].r = z__1.r, y[i__2].i = z__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;
          z__2.r = temp1.r * ap[i__5].r - temp1.i * ap[i__5].i, z__2.i = temp1.r * ap[i__5].i + temp1.i * ap[i__5].r;
          z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i;
          y[i__3].r = z__1.r, y[i__3].i = z__1.i;
          d_cnjg(&z__3, &ap[k]);
          i__3 = i__;
          z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r;
          z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i;
          temp2.r = z__1.r, temp2.i = z__1.i;
          ++k;
          /* L90: */
        }
        i__2 = j;
        i__3 = j;
        z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, z__2.i = alpha->r * temp2.i + alpha->i * temp2.r;
        z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i;
        y[i__2].r = z__1.r, y[i__2].i = z__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;
        z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r;
        temp1.r = z__1.r, temp1.i = z__1.i;
        temp2.r = 0., temp2.i = 0.;
        i__2 = jy;
        i__3 = jy;
        i__4 = kk;
        d__1 = ap[i__4].r;
        z__2.r = d__1 * temp1.r, z__2.i = d__1 * temp1.i;
        z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i;
        y[i__2].r = z__1.r, y[i__2].i = z__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;
          z__2.r = temp1.r * ap[i__5].r - temp1.i * ap[i__5].i, z__2.i = temp1.r * ap[i__5].i + temp1.i * ap[i__5].r;
          z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i;
          y[i__3].r = z__1.r, y[i__3].i = z__1.i;
          d_cnjg(&z__3, &ap[k]);
          i__3 = ix;
          z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r;
          z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i;
          temp2.r = z__1.r, temp2.i = z__1.i;
          /* L110: */
        }
        i__2 = jy;
        i__3 = jy;
        z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, z__2.i = alpha->r * temp2.i + alpha->i * temp2.r;
        z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i;
        y[i__2].r = z__1.r, y[i__2].i = z__1.i;
        jx += *incx;
        jy += *incy;
        kk += *n - j + 1;
        /* L120: */
      }
    }
  }

  /*     End of ZHPMV . */

} /* zhpmv_ */
