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 integer c__3 = 3;
kusano 7d535a
static integer c__1 = 1;
kusano 7d535a
static real c_b8 = 1.f;
kusano 7d535a
static real c_b10 = 0.f;
kusano 7d535a
kusano 7d535a
/* Subroutine */ int slarge_(integer *n, real *a, integer *lda, integer *
kusano 7d535a
	iseed, real *work, integer *info)
kusano 7d535a
{
kusano 7d535a
    /* System generated locals */
kusano 7d535a
    integer a_dim1, a_offset, i__1;
kusano 7d535a
    real r__1;
kusano 7d535a
kusano 7d535a
    /* Builtin functions */
kusano 7d535a
    double r_sign(real *, real *);
kusano 7d535a
kusano 7d535a
    /* Local variables */
kusano 7d535a
    extern /* Subroutine */ int sger_(integer *, integer *, real *, real *, 
kusano 7d535a
	    integer *, real *, integer *, real *, integer *);
kusano 7d535a
    extern real snrm2_(integer *, real *, integer *);
kusano 7d535a
    static integer i;
kusano 7d535a
    extern /* Subroutine */ int sscal_(integer *, real *, real *, integer *), 
kusano 7d535a
	    sgemv_(char *, integer *, integer *, real *, real *, integer *, 
kusano 7d535a
	    real *, integer *, real *, real *, integer *);
kusano 7d535a
    static real wa, wb, wn;
kusano 7d535a
    extern /* Subroutine */ int xerbla_(char *, integer *), slarnv_(
kusano 7d535a
	    integer *, integer *, integer *, real *);
kusano 7d535a
    static real 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
       February 29, 1992   
kusano 7d535a
kusano 7d535a
kusano 7d535a
    Purpose   
kusano 7d535a
    =======   
kusano 7d535a
kusano 7d535a
    SLARGE pre- and post-multiplies a real general n by n matrix A   
kusano 7d535a
    with a random orthogonal matrix: A = U*D*U'.   
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
    A       (input/output) REAL array, dimension (LDA,N)   
kusano 7d535a
            On entry, the original n by n matrix A.   
kusano 7d535a
            On exit, A is overwritten by U*A*U' for some random   
kusano 7d535a
            orthogonal matrix U.   
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) REAL 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
    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 (*lda < max(1,*n)) {
kusano 7d535a
	*info = -3;
kusano 7d535a
    }
kusano 7d535a
    if (*info < 0) {
kusano 7d535a
	i__1 = -(*info);
kusano 7d535a
	xerbla_("SLARGE", &i__1);
kusano 7d535a
	return 0;
kusano 7d535a
    }
kusano 7d535a
kusano 7d535a
/*     pre- and post-multiply A by random orthogonal matrix */
kusano 7d535a
kusano 7d535a
    for (i = *n; i >= 1; --i) {
kusano 7d535a
kusano 7d535a
/*        generate random reflection */
kusano 7d535a
kusano 7d535a
	i__1 = *n - i + 1;
kusano 7d535a
	slarnv_(&c__3, &iseed[1], &i__1, &work[1]);
kusano 7d535a
	i__1 = *n - i + 1;
kusano 7d535a
	wn = snrm2_(&i__1, &work[1], &c__1);
kusano 7d535a
	wa = r_sign(&wn, &work[1]);
kusano 7d535a
	if (wn == 0.f) {
kusano 7d535a
	    tau = 0.f;
kusano 7d535a
	} else {
kusano 7d535a
	    wb = work[1] + wa;
kusano 7d535a
	    i__1 = *n - i;
kusano 7d535a
	    r__1 = 1.f / wb;
kusano 7d535a
	    sscal_(&i__1, &r__1, &work[2], &c__1);
kusano 7d535a
	    work[1] = 1.f;
kusano 7d535a
	    tau = wb / wa;
kusano 7d535a
	}
kusano 7d535a
kusano 7d535a
/*        multiply A(i:n,1:n) by random reflection from the left */
kusano 7d535a
kusano 7d535a
	i__1 = *n - i + 1;
kusano 7d535a
	sgemv_("Transpose", &i__1, n, &c_b8, &a[i + a_dim1], lda, &work[1], &
kusano 7d535a
		c__1, &c_b10, &work[*n + 1], &c__1);
kusano 7d535a
	i__1 = *n - i + 1;
kusano 7d535a
	r__1 = -(doublereal)tau;
kusano 7d535a
	sger_(&i__1, n, &r__1, &work[1], &c__1, &work[*n + 1], &c__1, &a[i + 
kusano 7d535a
		a_dim1], lda);
kusano 7d535a
kusano 7d535a
/*        multiply A(1:n,i:n) by random reflection from the right */
kusano 7d535a
kusano 7d535a
	i__1 = *n - i + 1;
kusano 7d535a
	sgemv_("No transpose", n, &i__1, &c_b8, &a[i * a_dim1 + 1], lda, &
kusano 7d535a
		work[1], &c__1, &c_b10, &work[*n + 1], &c__1);
kusano 7d535a
	i__1 = *n - i + 1;
kusano 7d535a
	r__1 = -(doublereal)tau;
kusano 7d535a
	sger_(n, &i__1, &r__1, &work[*n + 1], &c__1, &work[1], &c__1, &a[i * 
kusano 7d535a
		a_dim1 + 1], lda);
kusano 7d535a
/* L10: */
kusano 7d535a
    }
kusano 7d535a
    return 0;
kusano 7d535a
kusano 7d535a
/*     End of SLARGE */
kusano 7d535a
kusano 7d535a
} /* slarge_ */
kusano 7d535a