kusano 7d535a
/*  -- translated by f2c (version 19940927).
kusano 7d535a
   You must link the resulting object file with the libraries:
kusano 7d535a
	-lf2c -lm   (in that order)
kusano 7d535a
*/
kusano 7d535a
kusano 7d535a
#include "f2c.h"
kusano 7d535a
kusano 7d535a
/* Table of constant values */
kusano 7d535a
kusano 7d535a
static doublecomplex c_b1 = {0.,0.};
kusano 7d535a
static doublecomplex c_b2 = {1.,0.};
kusano 7d535a
static integer c__3 = 3;
kusano 7d535a
static integer c__1 = 1;
kusano 7d535a
kusano 7d535a
/* Subroutine */ int zlaghe_(integer *n, integer *k, doublereal *d, 
kusano 7d535a
	doublecomplex *a, integer *lda, integer *iseed, doublecomplex *work, 
kusano 7d535a
	integer *info)
kusano 7d535a
{
kusano 7d535a
    /* System generated locals */
kusano 7d535a
    integer a_dim1, a_offset, i__1, i__2, i__3;
kusano 7d535a
    doublereal d__1;
kusano 7d535a
    doublecomplex z__1, z__2, z__3, z__4;
kusano 7d535a
kusano 7d535a
    /* Builtin functions */
kusano 7d535a
    double z_abs(doublecomplex *);
kusano 7d535a
    void z_div(doublecomplex *, doublecomplex *, doublecomplex *), d_cnjg(
kusano 7d535a
	    doublecomplex *, doublecomplex *);
kusano 7d535a
kusano 7d535a
    /* Local variables */
kusano 7d535a
    extern /* Subroutine */ int zher2_(char *, integer *, doublecomplex *, 
kusano 7d535a
	    doublecomplex *, integer *, doublecomplex *, integer *, 
kusano 7d535a
	    doublecomplex *, integer *);
kusano 7d535a
    static integer i, j;
kusano 7d535a
    static doublecomplex alpha;
kusano 7d535a
    extern /* Subroutine */ int zgerc_(integer *, integer *, doublecomplex *, 
kusano 7d535a
	    doublecomplex *, integer *, doublecomplex *, integer *, 
kusano 7d535a
	    doublecomplex *, integer *), zscal_(integer *, doublecomplex *, 
kusano 7d535a
	    doublecomplex *, integer *);
kusano 7d535a
    extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, 
kusano 7d535a
	    doublecomplex *, integer *, doublecomplex *, integer *);
kusano 7d535a
    extern /* Subroutine */ int zgemv_(char *, integer *, integer *, 
kusano 7d535a
	    doublecomplex *, doublecomplex *, integer *, doublecomplex *, 
kusano 7d535a
	    integer *, doublecomplex *, doublecomplex *, integer *), 
kusano 7d535a
	    zhemv_(char *, integer *, doublecomplex *, doublecomplex *, 
kusano 7d535a
	    integer *, doublecomplex *, integer *, doublecomplex *, 
kusano 7d535a
	    doublecomplex *, integer *), zaxpy_(integer *, 
kusano 7d535a
	    doublecomplex *, doublecomplex *, integer *, doublecomplex *, 
kusano 7d535a
	    integer *);
kusano 7d535a
    extern doublereal dznrm2_(integer *, doublecomplex *, integer *);
kusano 7d535a
    static doublecomplex wa, wb;
kusano 7d535a
    static doublereal wn;
kusano 7d535a
    extern /* Subroutine */ int xerbla_(char *, integer *), zlarnv_(
kusano 7d535a
	    integer *, integer *, integer *, doublecomplex *);
kusano 7d535a
    static doublecomplex tau;
kusano 7d535a
kusano 7d535a
kusano 7d535a
/*  -- LAPACK auxiliary test routine (version 2.0) --   
kusano 7d535a
       Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,   
kusano 7d535a
       Courant Institute, Argonne National Lab, and Rice University   
kusano 7d535a
       September 30, 1994   
kusano 7d535a
kusano 7d535a
kusano 7d535a
    Purpose   
kusano 7d535a
    =======   
kusano 7d535a
kusano 7d535a
    ZLAGHE generates a complex hermitian matrix A, by pre- and post-   
kusano 7d535a
    multiplying a real diagonal matrix D with a random unitary matrix:   
kusano 7d535a
    A = U*D*U'. The semi-bandwidth may then be reduced to k by additional 
kusano 7d535a
  
kusano 7d535a
    unitary transformations.   
kusano 7d535a
kusano 7d535a
    Arguments   
kusano 7d535a
    =========   
kusano 7d535a
kusano 7d535a
    N       (input) INTEGER   
kusano 7d535a
            The order of the matrix A.  N >= 0.   
kusano 7d535a
kusano 7d535a
    K       (input) INTEGER   
kusano 7d535a
            The number of nonzero subdiagonals within the band of A.   
kusano 7d535a
            0 <= K <= N-1.   
kusano 7d535a
kusano 7d535a
    D       (input) DOUBLE PRECISION array, dimension (N)   
kusano 7d535a
            The diagonal elements of the diagonal matrix D.   
kusano 7d535a
kusano 7d535a
    A       (output) COMPLEX*16 array, dimension (LDA,N)   
kusano 7d535a
            The generated n by n hermitian matrix A (the full matrix is   
kusano 7d535a
            stored).   
kusano 7d535a
kusano 7d535a
    LDA     (input) INTEGER   
kusano 7d535a
            The leading dimension of the array A.  LDA >= N.   
kusano 7d535a
kusano 7d535a
    ISEED   (input/output) INTEGER array, dimension (4)   
kusano 7d535a
            On entry, the seed of the random number generator; the array 
kusano 7d535a
  
kusano 7d535a
            elements must be between 0 and 4095, and ISEED(4) must be   
kusano 7d535a
            odd.   
kusano 7d535a
            On exit, the seed is updated.   
kusano 7d535a
kusano 7d535a
    WORK    (workspace) COMPLEX*16 array, dimension (2*N)   
kusano 7d535a
kusano 7d535a
    INFO    (output) INTEGER   
kusano 7d535a
            = 0: successful exit   
kusano 7d535a
            < 0: if INFO = -i, the i-th argument had an illegal value   
kusano 7d535a
kusano 7d535a
    ===================================================================== 
kusano 7d535a
  
kusano 7d535a
kusano 7d535a
kusano 7d535a
       Test the input arguments   
kusano 7d535a
kusano 7d535a
       Parameter adjustments */
kusano 7d535a
    --d;
kusano 7d535a
    a_dim1 = *lda;
kusano 7d535a
    a_offset = a_dim1 + 1;
kusano 7d535a
    a -= a_offset;
kusano 7d535a
    --iseed;
kusano 7d535a
    --work;
kusano 7d535a
kusano 7d535a
    /* Function Body */
kusano 7d535a
    *info = 0;
kusano 7d535a
    if (*n < 0) {
kusano 7d535a
	*info = -1;
kusano 7d535a
    } else if (*k < 0 || *k > *n - 1) {
kusano 7d535a
	*info = -2;
kusano 7d535a
    } else if (*lda < max(1,*n)) {
kusano 7d535a
	*info = -5;
kusano 7d535a
    }
kusano 7d535a
    if (*info < 0) {
kusano 7d535a
	i__1 = -(*info);
kusano 7d535a
	xerbla_("ZLAGHE", &i__1);
kusano 7d535a
	return 0;
kusano 7d535a
    }
kusano 7d535a
kusano 7d535a
/*     initialize lower triangle of A to diagonal matrix */
kusano 7d535a
kusano 7d535a
    i__1 = *n;
kusano 7d535a
    for (j = 1; j <= i__1; ++j) {
kusano 7d535a
	i__2 = *n;
kusano 7d535a
	for (i = j + 1; i <= i__2; ++i) {
kusano 7d535a
	    i__3 = i + j * a_dim1;
kusano 7d535a
	    a[i__3].r = 0., a[i__3].i = 0.;
kusano 7d535a
/* L10: */
kusano 7d535a
	}
kusano 7d535a
/* L20: */
kusano 7d535a
    }
kusano 7d535a
    i__1 = *n;
kusano 7d535a
    for (i = 1; i <= i__1; ++i) {
kusano 7d535a
	i__2 = i + i * a_dim1;
kusano 7d535a
	i__3 = i;
kusano 7d535a
	a[i__2].r = d[i__3], a[i__2].i = 0.;
kusano 7d535a
/* L30: */
kusano 7d535a
    }
kusano 7d535a
kusano 7d535a
/*     Generate lower triangle of hermitian matrix */
kusano 7d535a
kusano 7d535a
    for (i = *n - 1; i >= 1; --i) {
kusano 7d535a
kusano 7d535a
/*        generate random reflection */
kusano 7d535a
kusano 7d535a
	i__1 = *n - i + 1;
kusano 7d535a
	zlarnv_(&c__3, &iseed[1], &i__1, &work[1]);
kusano 7d535a
	i__1 = *n - i + 1;
kusano 7d535a
	wn = dznrm2_(&i__1, &work[1], &c__1);
kusano 7d535a
	d__1 = wn / z_abs(&work[1]);
kusano 7d535a
	z__1.r = d__1 * work[1].r, z__1.i = d__1 * work[1].i;
kusano 7d535a
	wa.r = z__1.r, wa.i = z__1.i;
kusano 7d535a
	if (wn == 0.) {
kusano 7d535a
	    tau.r = 0., tau.i = 0.;
kusano 7d535a
	} else {
kusano 7d535a
	    z__1.r = work[1].r + wa.r, z__1.i = work[1].i + wa.i;
kusano 7d535a
	    wb.r = z__1.r, wb.i = z__1.i;
kusano 7d535a
	    i__1 = *n - i;
kusano 7d535a
	    z_div(&z__1, &c_b2, &wb);
kusano 7d535a
	    zscal_(&i__1, &z__1, &work[2], &c__1);
kusano 7d535a
	    work[1].r = 1., work[1].i = 0.;
kusano 7d535a
	    z_div(&z__1, &wb, &wa);
kusano 7d535a
	    d__1 = z__1.r;
kusano 7d535a
	    tau.r = d__1, tau.i = 0.;
kusano 7d535a
	}
kusano 7d535a
kusano 7d535a
/*        apply random reflection to A(i:n,i:n) from the left   
kusano 7d535a
          and the right   
kusano 7d535a
kusano 7d535a
          compute  y := tau * A * u */
kusano 7d535a
kusano 7d535a
	i__1 = *n - i + 1;
kusano 7d535a
	zhemv_("Lower", &i__1, &tau, &a[i + i * a_dim1], lda, &work[1], &c__1,
kusano 7d535a
		 &c_b1, &work[*n + 1], &c__1);
kusano 7d535a
kusano 7d535a
/*        compute  v := y - 1/2 * tau * ( y, u ) * u */
kusano 7d535a
kusano 7d535a
	z__3.r = -.5, z__3.i = 0.;
kusano 7d535a
	z__2.r = z__3.r * tau.r - z__3.i * tau.i, z__2.i = z__3.r * tau.i + 
kusano 7d535a
		z__3.i * tau.r;
kusano 7d535a
	i__1 = *n - i + 1;
kusano 7d535a
	zdotc_(&z__4, &i__1, &work[*n + 1], &c__1, &work[1], &c__1);
kusano 7d535a
	z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * z__4.i 
kusano 7d535a
		+ z__2.i * z__4.r;
kusano 7d535a
	alpha.r = z__1.r, alpha.i = z__1.i;
kusano 7d535a
	i__1 = *n - i + 1;
kusano 7d535a
	zaxpy_(&i__1, &alpha, &work[1], &c__1, &work[*n + 1], &c__1);
kusano 7d535a
kusano 7d535a
/*        apply the transformation as a rank-2 update to A(i:n,i:n) */
kusano 7d535a
kusano 7d535a
	i__1 = *n - i + 1;
kusano 7d535a
	z__1.r = -1., z__1.i = 0.;
kusano 7d535a
	zher2_("Lower", &i__1, &z__1, &work[1], &c__1, &work[*n + 1], &c__1, &
kusano 7d535a
		a[i + i * a_dim1], lda);
kusano 7d535a
/* L40: */
kusano 7d535a
    }
kusano 7d535a
kusano 7d535a
/*     Reduce number of subdiagonals to K */
kusano 7d535a
kusano 7d535a
    i__1 = *n - 1 - *k;
kusano 7d535a
    for (i = 1; i <= i__1; ++i) {
kusano 7d535a
kusano 7d535a
/*        generate reflection to annihilate A(k+i+1:n,i) */
kusano 7d535a
kusano 7d535a
	i__2 = *n - *k - i + 1;
kusano 7d535a
	wn = dznrm2_(&i__2, &a[*k + i + i * a_dim1], &c__1);
kusano 7d535a
	d__1 = wn / z_abs(&a[*k + i + i * a_dim1]);
kusano 7d535a
	i__2 = *k + i + i * a_dim1;
kusano 7d535a
	z__1.r = d__1 * a[i__2].r, z__1.i = d__1 * a[i__2].i;
kusano 7d535a
	wa.r = z__1.r, wa.i = z__1.i;
kusano 7d535a
	if (wn == 0.) {
kusano 7d535a
	    tau.r = 0., tau.i = 0.;
kusano 7d535a
	} else {
kusano 7d535a
	    i__2 = *k + i + i * a_dim1;
kusano 7d535a
	    z__1.r = a[i__2].r + wa.r, z__1.i = a[i__2].i + wa.i;
kusano 7d535a
	    wb.r = z__1.r, wb.i = z__1.i;
kusano 7d535a
	    i__2 = *n - *k - i;
kusano 7d535a
	    z_div(&z__1, &c_b2, &wb);
kusano 7d535a
	    zscal_(&i__2, &z__1, &a[*k + i + 1 + i * a_dim1], &c__1);
kusano 7d535a
	    i__2 = *k + i + i * a_dim1;
kusano 7d535a
	    a[i__2].r = 1., a[i__2].i = 0.;
kusano 7d535a
	    z_div(&z__1, &wb, &wa);
kusano 7d535a
	    d__1 = z__1.r;
kusano 7d535a
	    tau.r = d__1, tau.i = 0.;
kusano 7d535a
	}
kusano 7d535a
kusano 7d535a
/*        apply reflection to A(k+i:n,i+1:k+i-1) from the left */
kusano 7d535a
kusano 7d535a
	i__2 = *n - *k - i + 1;
kusano 7d535a
	i__3 = *k - 1;
kusano 7d535a
	zgemv_("Conjugate transpose", &i__2, &i__3, &c_b2, &a[*k + i + (i + 1)
kusano 7d535a
		 * a_dim1], lda, &a[*k + i + i * a_dim1], &c__1, &c_b1, &work[
kusano 7d535a
		1], &c__1);
kusano 7d535a
	i__2 = *n - *k - i + 1;
kusano 7d535a
	i__3 = *k - 1;
kusano 7d535a
	z__1.r = -tau.r, z__1.i = -tau.i;
kusano 7d535a
	zgerc_(&i__2, &i__3, &z__1, &a[*k + i + i * a_dim1], &c__1, &work[1], 
kusano 7d535a
		&c__1, &a[*k + i + (i + 1) * a_dim1], lda);
kusano 7d535a
kusano 7d535a
/*        apply reflection to A(k+i:n,k+i:n) from the left and the rig
kusano 7d535a
ht   
kusano 7d535a
kusano 7d535a
          compute  y := tau * A * u */
kusano 7d535a
kusano 7d535a
	i__2 = *n - *k - i + 1;
kusano 7d535a
	zhemv_("Lower", &i__2, &tau, &a[*k + i + (*k + i) * a_dim1], lda, &a[*
kusano 7d535a
		k + i + i * a_dim1], &c__1, &c_b1, &work[1], &c__1);
kusano 7d535a
kusano 7d535a
/*        compute  v := y - 1/2 * tau * ( y, u ) * u */
kusano 7d535a
kusano 7d535a
	z__3.r = -.5, z__3.i = 0.;
kusano 7d535a
	z__2.r = z__3.r * tau.r - z__3.i * tau.i, z__2.i = z__3.r * tau.i + 
kusano 7d535a
		z__3.i * tau.r;
kusano 7d535a
	i__2 = *n - *k - i + 1;
kusano 7d535a
	zdotc_(&z__4, &i__2, &work[1], &c__1, &a[*k + i + i * a_dim1], &c__1);
kusano 7d535a
	z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * z__4.i 
kusano 7d535a
		+ z__2.i * z__4.r;
kusano 7d535a
	alpha.r = z__1.r, alpha.i = z__1.i;
kusano 7d535a
	i__2 = *n - *k - i + 1;
kusano 7d535a
	zaxpy_(&i__2, &alpha, &a[*k + i + i * a_dim1], &c__1, &work[1], &c__1)
kusano 7d535a
		;
kusano 7d535a
kusano 7d535a
/*        apply hermitian rank-2 update to A(k+i:n,k+i:n) */
kusano 7d535a
kusano 7d535a
	i__2 = *n - *k - i + 1;
kusano 7d535a
	z__1.r = -1., z__1.i = 0.;
kusano 7d535a
	zher2_("Lower", &i__2, &z__1, &a[*k + i + i * a_dim1], &c__1, &work[1]
kusano 7d535a
		, &c__1, &a[*k + i + (*k + i) * a_dim1], lda);
kusano 7d535a
kusano 7d535a
	i__2 = *k + i + i * a_dim1;
kusano 7d535a
	z__1.r = -wa.r, z__1.i = -wa.i;
kusano 7d535a
	a[i__2].r = z__1.r, a[i__2].i = z__1.i;
kusano 7d535a
	i__2 = *n;
kusano 7d535a
	for (j = *k + i + 1; j <= i__2; ++j) {
kusano 7d535a
	    i__3 = j + i * a_dim1;
kusano 7d535a
	    a[i__3].r = 0., a[i__3].i = 0.;
kusano 7d535a
/* L50: */
kusano 7d535a
	}
kusano 7d535a
/* L60: */
kusano 7d535a
    }
kusano 7d535a
kusano 7d535a
/*     Store full hermitian matrix */
kusano 7d535a
kusano 7d535a
    i__1 = *n;
kusano 7d535a
    for (j = 1; j <= i__1; ++j) {
kusano 7d535a
	i__2 = *n;
kusano 7d535a
	for (i = j + 1; i <= i__2; ++i) {
kusano 7d535a
	    i__3 = j + i * a_dim1;
kusano 7d535a
	    d_cnjg(&z__1, &a[i + j * a_dim1]);
kusano 7d535a
	    a[i__3].r = z__1.r, a[i__3].i = z__1.i;
kusano 7d535a
/* L70: */
kusano 7d535a
	}
kusano 7d535a
/* L80: */
kusano 7d535a
    }
kusano 7d535a
    return 0;
kusano 7d535a
kusano 7d535a
/*     End of ZLAGHE */
kusano 7d535a
kusano 7d535a
} /* zlaghe_ */
kusano 7d535a